diff options
author | Sean Hefty <sean.hefty@intel.com> | 2013-05-29 13:09:09 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-06-20 16:08:02 -0400 |
commit | 2e2d190c5eb05d5a2615f4092e5fe821710404f9 (patch) | |
tree | e73d20c7bff06e2bc50b5982ee07fe7e2baad72e | |
parent | c8dea2f9f078395ebac7c92aeb919f02ff3fca88 (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.c | 40 |
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 | ||
680 | static inline int cma_zero_addr(struct sockaddr *addr) | 681 | static 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 | ||
694 | static inline int cma_loopback_addr(struct sockaddr *addr) | 695 | static 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 | ||
704 | static inline int cma_any_addr(struct sockaddr *addr) | 709 | static 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 | ||