From: David J. Wilder <[dwil...@us.ibm.com]>

Signed-off-by: David Wilder <dwil...@us.ibm.com>
Signed-off-by: Sean Hefty <sean.he...@intel.com>
---
We need to update struct cmatest to allow storing an IPv6 address,
or we can overrun the buffer.

Running with this patch, the client causes a kernel bug on 2.6.31 in
addr_resolve_local, so we'll still fixes for that.  It also meant that
I couldn't test this patch.

 examples/cmatose.c |   53 ++++++++++++++++++++++++++++------------------------
 1 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/examples/cmatose.c b/examples/cmatose.c
index 8c12347..84831ec 100644
--- a/examples/cmatose.c
+++ b/examples/cmatose.c
@@ -75,10 +75,7 @@ struct cmatest {
        int                     connects_left;
        int                     disconnects_left;
 
-       struct sockaddr_in      dst_in;
-       struct sockaddr         *dst_addr;
-       struct sockaddr_in      src_in;
-       struct sockaddr         *src_addr;
+       struct rdma_addr        addr;
 };
 
 static struct cmatest test;
@@ -505,7 +502,7 @@ static int migrate_channel(struct rdma_cm_id *listen_id)
        return ret;
 }
 
-static int get_addr(char *dst, struct sockaddr_in *addr)
+static int get_addr(char *dst, struct sockaddr *addr)
 {
        struct addrinfo *res;
        int ret;
@@ -516,15 +513,15 @@ static int get_addr(char *dst, struct sockaddr_in *addr)
                return ret;
        }
 
-       if (res->ai_family != PF_INET) {
+       if (res->ai_family == PF_INET)
+               memcpy(addr, res->ai_addr, sizeof(struct sockaddr_in));
+       else if (res->ai_family == PF_INET6)
+               memcpy(addr, res->ai_addr, sizeof(struct sockaddr_in6));
+       else
                ret = -1;
-               goto out;
-       }
 
-       *addr = *(struct sockaddr_in *) res->ai_addr;
-out:
-       freeaddrinfo(res);
-       return ret;
+        freeaddrinfo(res);
+        return ret;
 }
 
 static int run_server(void)
@@ -540,14 +537,21 @@ static int run_server(void)
        }
 
        if (src_addr) {
-               ret = get_addr(src_addr, &test.src_in);
+               ret = get_addr(src_addr, &test.addr.src_addr);
                if (ret)
                        goto out;
-       } else
-               test.src_in.sin_family = PF_INET;
+               if (test.addr.src_addr.sa_family == AF_INET)
+                       ((struct sockaddr_in *) &test.addr.src_addr)->sin_port 
= port;
+               else
+                       ((struct sockaddr_in6 *) 
&test.addr.src_addr)->sin6_port = port;
+               
+       } else {
+               test.addr.src_addr.sa_family = PF_INET;
+               ((struct sockaddr_in *) &test.addr.src_addr)->sin_port = port;
+       }
+
+       ret = rdma_bind_addr(listen_id, &test.addr.src_addr);
 
-       test.src_in.sin_port = port;
-       ret = rdma_bind_addr(listen_id, test.src_addr);
        if (ret) {
                perror("cmatose: bind address failed");
                goto out;
@@ -614,22 +618,25 @@ static int run_client(void)
 
        printf("cmatose: starting client\n");
        if (src_addr) {
-               ret = get_addr(src_addr, &test.src_in);
+               ret = get_addr(src_addr, &test.addr.src_addr);
                if (ret)
                        return ret;
        }
 
-       ret = get_addr(dst_addr, &test.dst_in);
+       ret = get_addr(dst_addr, &test.addr.dst_addr);
        if (ret)
                return ret;
 
-       test.dst_in.sin_port = port;
+       if (test.addr.dst_addr.sa_family == AF_INET)
+               ((struct sockaddr_in *) &test.addr.dst_addr)->sin_port = port;
+       else
+               ((struct sockaddr_in6 *) &test.addr.dst_addr)->sin6_port = port;
 
        printf("cmatose: connecting\n");
        for (i = 0; i < connections; i++) {
                ret = rdma_resolve_addr(test.nodes[i].cma_id,
-                                       src_addr ? test.src_addr : NULL,
-                                       test.dst_addr, 2000);
+                                       src_addr ? &test.addr.src_addr : NULL,
+                                       &test.addr.dst_addr, 2000);
                if (ret) {
                        perror("cmatose: failure getting addr");
                        connect_error();
@@ -717,8 +724,6 @@ int main(int argc, char **argv)
                }
        }
 
-       test.dst_addr = (struct sockaddr *) &test.dst_in;
-       test.src_addr = (struct sockaddr *) &test.src_in;
        test.connects_left = connections;
        test.disconnects_left = connections;
 



_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to