]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ib_sdp/cma: readd SDP support to cma_save_net_info
authorQing Huang <qing.huang@oracle.com>
Sat, 26 Sep 2015 00:47:19 +0000 (17:47 -0700)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 14:36:01 +0000 (07:36 -0700)
Upstream has removed SDP support from cma.c. Some applications may
not display addr/port information correctly without this change to
cma_save_net_info() function.

Signed-off-by: Qing Huang <qing.huang@oracle.com>
drivers/infiniband/core/cma.c
drivers/infiniband/core/cma_priv.h
drivers/infiniband/core/cma_sdp.c
drivers/infiniband/core/cma_sdp_priv.h

index 533a9c39188564add1bcec8a525537f0f2c352ec..910f19c8782f09abe9bab0030244c010cd8575ef 100644 (file)
@@ -822,15 +822,6 @@ static void cma_save_ib_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
        }
 }
 
-static __be16 ss_get_port(const struct sockaddr_storage *ss)
-{
-       if (ss->ss_family == AF_INET)
-               return ((struct sockaddr_in *)ss)->sin_port;
-       else if (ss->ss_family == AF_INET6)
-               return ((struct sockaddr_in6 *)ss)->sin6_port;
-       BUG();
-}
-
 static void cma_save_ip4_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
                              struct cma_hdr *hdr)
 {
@@ -867,7 +858,6 @@ static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
                             struct ib_cm_event *ib_event)
 {
        struct cma_hdr *hdr;
-       u8 ip_ver = 0;
 
        if (listen_id->route.addr.src_addr.ss_family == AF_IB) {
                if (ib_event->event == IB_CM_REQ_RECEIVED)
@@ -881,12 +871,21 @@ static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
        if (hdr->cma_version != CMA_VERSION)
                return -EINVAL;
 
-       if (listen_id->ps == RDMA_PS_SDP)
-               ip_ver = sdp_get_ip_ver((struct sdp_hh *)hdr);
-       else
-               ip_ver = cma_get_ip_ver(hdr);
+       if (listen_id->ps == RDMA_PS_SDP) {
+               switch (sdp_get_ip_ver((struct sdp_hh *)hdr)) {
+               case 4:
+                       cma_save_ip4_info_sdp(id, listen_id, hdr);
+                       break;
+               case 6:
+                       cma_save_ip6_info_sdp(id, listen_id, hdr);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               return 0;
+       }
 
-       switch (ip_ver) {
+       switch (cma_get_ip_ver(hdr)) {
        case 4:
                cma_save_ip4_info(id, listen_id, hdr);
                break;
index d8b2efc470abec4a94d56972c30459d92f0cdacb..d932ce9dabb0b592238665f417f31d9ff6301c05 100644 (file)
@@ -123,5 +123,13 @@ static inline struct sockaddr *cma_dst_addr(struct rdma_id_private *id_priv)
        return (struct sockaddr *) &id_priv->id.route.addr.dst_addr;
 }
 
+static __be16 ss_get_port(const struct sockaddr_storage *ss)
+{
+       if (ss->ss_family == AF_INET)
+               return ((struct sockaddr_in *)ss)->sin_port;
+       else if (ss->ss_family == AF_INET6)
+               return ((struct sockaddr_in6 *)ss)->sin6_port;
+       BUG();
+}
 
 #endif /* _CMA_PRIV_H */
index cd20e1df112261e25f76cb9c4b8f4bcdf58ade08..1ec4f428e4bd10fcda2a68729183c76c5e3077e9 100644 (file)
@@ -172,3 +172,38 @@ int cma_format_hdr_sdp(void *hdr, struct rdma_id_private *id_priv)
 
        return 0;
 }
+
+void cma_save_ip4_info_sdp(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
+                          struct cma_hdr *cma_hdr)
+{
+       struct sockaddr_in *ip4;
+       struct sdp_hh *hdr = (struct sdp_hh *)cma_hdr;
+
+       ip4 = (struct sockaddr_in *) &id->route.addr.src_addr;
+       ip4->sin_family = AF_INET;
+       ip4->sin_addr.s_addr = hdr->dst_addr.ip4.addr;
+       ip4->sin_port = ss_get_port(&listen_id->route.addr.src_addr);
+
+       ip4 = (struct sockaddr_in *) &id->route.addr.dst_addr;
+       ip4->sin_family = AF_INET;
+       ip4->sin_addr.s_addr = hdr->src_addr.ip4.addr;
+       ip4->sin_port = hdr->port;
+}
+
+void cma_save_ip6_info_sdp(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
+                          struct cma_hdr *cma_hdr)
+{
+       struct sockaddr_in6 *ip6;
+       struct sdp_hh *hdr = (struct sdp_hh *)cma_hdr;
+
+       ip6 = (struct sockaddr_in6 *) &id->route.addr.src_addr;
+       ip6->sin6_family = AF_INET6;
+       ip6->sin6_addr = hdr->dst_addr.ip6;
+       ip6->sin6_port = ss_get_port(&listen_id->route.addr.src_addr);
+
+       ip6 = (struct sockaddr_in6 *) &id->route.addr.dst_addr;
+       ip6->sin6_family = AF_INET6;
+       ip6->sin6_addr = hdr->src_addr.ip6;
+       ip6->sin6_port = hdr->port;
+
+}
index 26b2b09cd70c1acadfbc7f86b3cceef96fc82e16..656e2073f281ad7c072a2cd3682935676a71eaba 100644 (file)
@@ -81,4 +81,12 @@ extern void cma_set_compare_data_sdp(enum rdma_port_space ps,
 
 extern int cma_format_hdr_sdp(void *hdr, struct rdma_id_private *id_priv);
 
+extern void cma_save_ip4_info_sdp(struct rdma_cm_id *id,
+                                 struct rdma_cm_id *listen_id,
+                                 struct cma_hdr *hdr);
+
+extern void cma_save_ip6_info_sdp(struct rdma_cm_id *id,
+                                 struct rdma_cm_id *listen_id,
+                                 struct cma_hdr *hdr);
+
 #endif /* _CMA_SDP_PRIV_H */