aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Hefty <sean.hefty@intel.com>2013-05-29 13:09:09 -0400
committerRoland Dreier <roland@purestorage.com>2013-06-20 16:08:02 -0400
commit2e2d190c5eb05d5a2615f4092e5fe821710404f9 (patch)
treee73d20c7bff06e2bc50b5982ee07fe7e2baad72e
parentc8dea2f9f078395ebac7c92aeb919f02ff3fca88 (diff)
RDMA/cma: Include AF_IB in loopback and any address checks
Enhance checks for loopback and any address to support AF_IB in addition to AF_INET and AF_INT6. This will allow future patches to use AF_IB when binding and resolving addresses. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/core/cma.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index fde428bd2dad..22a23a73745e 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -50,6 +50,7 @@
50#include <rdma/rdma_cm.h> 50#include <rdma/rdma_cm.h>
51#include <rdma/rdma_cm_ib.h> 51#include <rdma/rdma_cm_ib.h>
52#include <rdma/rdma_netlink.h> 52#include <rdma/rdma_netlink.h>
53#include <rdma/ib.h>
53#include <rdma/ib_cache.h> 54#include <rdma/ib_cache.h>
54#include <rdma/ib_cm.h> 55#include <rdma/ib_cm.h>
55#include <rdma/ib_sa.h> 56#include <rdma/ib_sa.h>
@@ -679,26 +680,30 @@ EXPORT_SYMBOL(rdma_init_qp_attr);
679 680
680static inline int cma_zero_addr(struct sockaddr *addr) 681static inline int cma_zero_addr(struct sockaddr *addr)
681{ 682{
682 struct in6_addr *ip6; 683 switch (addr->sa_family) {
683 684 case AF_INET:
684 if (addr->sa_family == AF_INET) 685 return ipv4_is_zeronet(((struct sockaddr_in *)addr)->sin_addr.s_addr);
685 return ipv4_is_zeronet( 686 case AF_INET6:
686 ((struct sockaddr_in *)addr)->sin_addr.s_addr); 687 return ipv6_addr_any(&((struct sockaddr_in6 *) addr)->sin6_addr);
687 else { 688 case AF_IB:
688 ip6 = &((struct sockaddr_in6 *) addr)->sin6_addr; 689 return ib_addr_any(&((struct sockaddr_ib *) addr)->sib_addr);
689 return (ip6->s6_addr32[0] | ip6->s6_addr32[1] | 690 default:
690 ip6->s6_addr32[2] | ip6->s6_addr32[3]) == 0; 691 return 0;
691 } 692 }
692} 693}
693 694
694static inline int cma_loopback_addr(struct sockaddr *addr) 695static inline int cma_loopback_addr(struct sockaddr *addr)
695{ 696{
696 if (addr->sa_family == AF_INET) 697 switch (addr->sa_family) {
697 return ipv4_is_loopback( 698 case AF_INET:
698 ((struct sockaddr_in *) addr)->sin_addr.s_addr); 699 return ipv4_is_loopback(((struct sockaddr_in *) addr)->sin_addr.s_addr);
699 else 700 case AF_INET6:
700 return ipv6_addr_loopback( 701 return ipv6_addr_loopback(&((struct sockaddr_in6 *) addr)->sin6_addr);
701 &((struct sockaddr_in6 *) addr)->sin6_addr); 702 case AF_IB:
703 return ib_addr_loopback(&((struct sockaddr_ib *) addr)->sib_addr);
704 default:
705 return 0;
706 }
702} 707}
703 708
704static inline int cma_any_addr(struct sockaddr *addr) 709static inline int cma_any_addr(struct sockaddr *addr)
@@ -715,9 +720,12 @@ static int cma_addr_cmp(struct sockaddr *src, struct sockaddr *dst)
715 case AF_INET: 720 case AF_INET:
716 return ((struct sockaddr_in *) src)->sin_addr.s_addr != 721 return ((struct sockaddr_in *) src)->sin_addr.s_addr !=
717 ((struct sockaddr_in *) dst)->sin_addr.s_addr; 722 ((struct sockaddr_in *) dst)->sin_addr.s_addr;
718 default: 723 case AF_INET6:
719 return ipv6_addr_cmp(&((struct sockaddr_in6 *) src)->sin6_addr, 724 return ipv6_addr_cmp(&((struct sockaddr_in6 *) src)->sin6_addr,
720 &((struct sockaddr_in6 *) dst)->sin6_addr); 725 &((struct sockaddr_in6 *) dst)->sin6_addr);
726 default:
727 return ib_addr_cmp(&((struct sockaddr_ib *) src)->sib_addr,
728 &((struct sockaddr_ib *) dst)->sib_addr);
721 } 729 }
722} 730}
723 731