Fix private data format for bind to specific IP for SDP.
Further, CMA format mask for IPv6 was set incorrectly (hint -
memset(foo, 1, bar) does not set memory to all-ones) so fix that.

Signed-off-by: Ali Ayoub <[EMAIL PROTECTED]>
Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>

Index: linux-2.6.16/drivers/infiniband/core/cma.c
===================================================================
--- linux-2.6.16.orig/drivers/infiniband/core/cma.c     2006-05-18 
13:36:23.000000000 +0300
+++ linux-2.6.16/drivers/infiniband/core/cma.c  2006-05-18 13:47:59.000000000 
+0300
@@ -930,29 +930,50 @@ static __be64 cma_get_service_id(enum rd
               be16_to_cpu(((struct sockaddr_in *) addr)->sin_port));
 }
 
-static void cma_set_compare_data(struct sockaddr *addr,
+static void cma_set_compare_data(enum rdma_port_space ps, struct sockaddr 
*addr,
                                 struct ib_cm_compare_data *compare)
 {
-       struct cma_hdr *data, *mask;
+       struct cma_hdr *cma_data, *cma_mask;
+       struct sdp_hh *sdp_data, *sdp_mask;
+       __u32 ip4_addr;
+       struct in6_addr ip6_addr;
 
        memset(compare, 0, sizeof *compare);
-       data = (void *) compare->data;
-       mask = (void *) compare->mask;
+       cma_data = (void *)compare->data;
+       cma_mask = (void *)compare->mask;
+       sdp_data = (void *)compare->data;
+       sdp_mask = (void *)compare->mask;
 
        switch (addr->sa_family) {
        case AF_INET:
-               cma_set_ip_ver(data, 4);
-               cma_set_ip_ver(mask, 0xF);
-               data->dst_addr.ip4.addr = ((struct sockaddr_in *) addr)->
-                                          sin_addr.s_addr;
-               mask->dst_addr.ip4.addr = ~0;
+               ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
+               if (ps == RDMA_PS_SDP) {
+                       sdp_set_ip_ver(sdp_data, 4);
+                       sdp_set_ip_ver(sdp_mask, 0xF);
+                       sdp_data->dst_addr.ip4.addr = ip4_addr;
+                       sdp_mask->dst_addr.ip4.addr = ~0;
+               } else {
+                       cma_set_ip_ver(cma_data, 4);
+                       cma_set_ip_ver(cma_mask, 0xF);
+                       cma_data->dst_addr.ip4.addr = ip4_addr;
+                       cma_mask->dst_addr.ip4.addr = ~0;
+               }
                break;
        case AF_INET6:
-               cma_set_ip_ver(data, 6);
-               cma_set_ip_ver(mask, 0xF);
-               data->dst_addr.ip6 = ((struct sockaddr_in6 *) addr)->
-                                     sin6_addr;
-               memset(&mask->dst_addr.ip6, 1, sizeof mask->dst_addr.ip6);
+               ip6_addr = ((struct sockaddr_in6 *)addr)->sin6_addr;
+               if (ps == RDMA_PS_SDP) {
+                       sdp_set_ip_ver(sdp_data, 6);
+                       sdp_set_ip_ver(sdp_mask, 0xF);
+                       sdp_data->dst_addr.ip6 = ip6_addr;
+                       memset(&sdp_mask->dst_addr.ip6, 0xFF,
+                                       sizeof sdp_mask->dst_addr.ip6);
+               } else {
+                       cma_set_ip_ver(cma_data, 6);
+                       cma_set_ip_ver(cma_mask, 0xF);
+                       cma_data->dst_addr.ip6 = ip6_addr;
+                       memset(&cma_mask->dst_addr.ip6, 0xFF,
+                                       sizeof cma_mask->dst_addr.ip6);
+               }
                break;
        default:
                break;
@@ -976,7 +997,7 @@ static int cma_ib_listen(struct rdma_id_
        if (cma_any_addr(addr))
                ret = ib_cm_listen(id_priv->cm_id.ib, svc_id, 0, NULL);
        else {
-               cma_set_compare_data(addr, &compare_data);
+               cma_set_compare_data(id_priv->id.ps, addr, &compare_data);
                ret = ib_cm_listen(id_priv->cm_id.ib, svc_id, 0, &compare_data);
        }
 

-- 
MST
_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to