From: Qing Huang Date: Sat, 26 Sep 2015 00:47:19 +0000 (-0700) Subject: ib_sdp/cma: readd SDP support to cma_save_net_info X-Git-Tag: v4.1.12-92~264^2~2^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9ebaf91f129d33dd098f376d806c7f68dabb54e5;p=users%2Fjedix%2Flinux-maple.git ib_sdp/cma: readd SDP support to cma_save_net_info 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 --- diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 533a9c391885..910f19c8782f 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -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; diff --git a/drivers/infiniband/core/cma_priv.h b/drivers/infiniband/core/cma_priv.h index d8b2efc470ab..d932ce9dabb0 100644 --- a/drivers/infiniband/core/cma_priv.h +++ b/drivers/infiniband/core/cma_priv.h @@ -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 */ diff --git a/drivers/infiniband/core/cma_sdp.c b/drivers/infiniband/core/cma_sdp.c index cd20e1df1122..1ec4f428e4bd 100644 --- a/drivers/infiniband/core/cma_sdp.c +++ b/drivers/infiniband/core/cma_sdp.c @@ -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; + +} diff --git a/drivers/infiniband/core/cma_sdp_priv.h b/drivers/infiniband/core/cma_sdp_priv.h index 26b2b09cd70c..656e2073f281 100644 --- a/drivers/infiniband/core/cma_sdp_priv.h +++ b/drivers/infiniband/core/cma_sdp_priv.h @@ -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 */