Differences between version 1

Using new code from Sean
Less complicated logic due to using getaddrinfo function
Using sockaddr_storage in rping_cb instead of sockaddr_in in order
to support IPv6
Return code of get_addr is return code of getaddrinfo function
Removed label out from get_addr function
Extended help to explaing using how to bind ANY address when using
IPv6

Signed-off-by: Aleksey Senin <[EMAIL PROTECTED]>
---
 examples/rping.c |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/examples/rping.c b/examples/rping.c
index f5dd701..17782b2 100644
--- a/examples/rping.c
+++ b/examples/rping.c
@@ -143,7 +143,7 @@ struct rping_cb {
        enum test_state state;          /* used for cond/signalling */
        sem_t sem;
 
-       struct sockaddr_in sin;
+       struct sockaddr_storage sin;
        uint16_t port;                  /* dst port in NBO */
        int verbose;                    /* verbose logging */
        int count;                      /* ping count */
@@ -728,8 +728,11 @@ static int rping_test_server(struct rping_cb *cb)
 static int rping_bind_server(struct rping_cb *cb)
 {
        int ret;
+       if (cb->sin.ss_family == AF_INET)
+               ((struct sockaddr_in *)&cb->sin)->sin_port = cb->port;
+       else
+               ((struct sockaddr_in6 *)&cb->sin)->sin6_port = cb->port;
 
-       cb->sin.sin_port = cb->port;
        ret = rdma_bind_addr(cb->cm_id, (struct sockaddr *) &cb->sin);
        if (ret) {
                fprintf(stderr, "rdma_bind_addr error %d\n", ret);
@@ -991,8 +994,11 @@ static int rping_connect_client(struct rping_cb *cb)
 static int rping_bind_client(struct rping_cb *cb)
 {
        int ret;
+       if (cb->sin.ss_family == AF_INET )
+               ((struct sockaddr_in *)&cb->sin)->sin_port = cb->port;
+       else
+               ((struct sockaddr_in6 *)&cb->sin)->sin6_port = cb->port;
 
-       cb->sin.sin_port = cb->port;
        ret = rdma_resolve_addr(cb->cm_id, NULL, (struct sockaddr *) &cb->sin, 
2000);
        if (ret) {
                fprintf(stderr, "rdma_resolve_addr error %d\n", ret);
@@ -1055,7 +1061,7 @@ err1:
        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;
@@ -1066,13 +1072,10 @@ static int get_addr(char *dst, struct sockaddr_in *addr)
                return ret;
        }
 
-       if (res->ai_family != PF_INET) {
-               ret = -1;
-               goto out;
+       if (res->ai_family == PF_INET || res->ai_family == PF_INET6 ) {
+               *(struct sockaddr_storage *)addr =
+                       *(struct sockaddr_storage *)res->ai_addr;
        }
-
-       *addr = *(struct sockaddr_in *) res->ai_addr;
-out:
        freeaddrinfo(res);
        return ret;
 }
@@ -1084,7 +1087,7 @@ static void usage(char *name)
        printf("%s -c [-vVd] [-S size] [-C count] -a addr [-p port]\n", 
               basename(name));
        printf("\t-c\t\tclient side\n");
-       printf("\t-s\t\tserver side\n");
+       printf("\t-s\t\tserver side. To bind any address with IPv6 use -a ::0 
argument\n");
        printf("\t-v\t\tdisplay ping data to stdout\n");
        printf("\t-V\t\tvalidate ping data\n");
        printf("\t-d\t\tdebug printfs\n");
@@ -1110,7 +1113,7 @@ int main(int argc, char *argv[])
        cb->server = -1;
        cb->state = IDLE;
        cb->size = 64;
-       cb->sin.sin_family = PF_INET;
+       cb->sin.ss_family = PF_INET;
        cb->port = htons(7174);
        sem_init(&cb->sem, 0, 0);
 
@@ -1118,7 +1121,7 @@ int main(int argc, char *argv[])
        while ((op=getopt(argc, argv, "a:Pp:C:S:t:scvVd")) != -1) {
                switch (op) {
                case 'a':
-                       ret = get_addr(optarg, &cb->sin);
+                       ret = get_addr(optarg, (struct sockaddr *) &cb->sin);
                        break;
                case 'P':
                        persistent_server = 1;
-- 
1.5.6.dirty


_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

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

Reply via email to