]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librdmacm: Use union with sockaddr structures
authorSean Hefty <sean.hefty@intel.com>
Tue, 14 Jun 2011 17:30:51 +0000 (10:30 -0700)
committerSean Hefty <sean.hefty@intel.com>
Mon, 22 Aug 2011 20:59:34 +0000 (13:59 -0700)
To avoid strict aliasing compiler warnings, use an unamed union
to store the src and dst addresses.  This eliminates the need
for padding and sockaddr casts.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
examples/cmatose.c
include/rdma/rdma_cma.h

index 84831ec8b5bc6ef051635ea7fc586d19e1f2397d..82e0d7c52d5ea440d560d5c26d29fb2fd880d8df 100644 (file)
@@ -541,13 +541,13 @@ static int run_server(void)
                if (ret)
                        goto out;
                if (test.addr.src_addr.sa_family == AF_INET)
-                       ((struct sockaddr_in *) &test.addr.src_addr)->sin_port = port;
+                       test.addr.src_sin.sin_port = port;
                else
-                       ((struct sockaddr_in6 *) &test.addr.src_addr)->sin6_port = port;
+                       test.addr.src_sin6.sin6_port = port;
                
        } else {
-               test.addr.src_addr.sa_family = PF_INET;
-               ((struct sockaddr_in *) &test.addr.src_addr)->sin_port = port;
+               test.addr.src_addr.sa_family = AF_INET;
+               test.addr.src_sin.sin_port = port;
        }
 
        ret = rdma_bind_addr(listen_id, &test.addr.src_addr);
@@ -628,9 +628,9 @@ static int run_client(void)
                return ret;
 
        if (test.addr.dst_addr.sa_family == AF_INET)
-               ((struct sockaddr_in *) &test.addr.dst_addr)->sin_port = port;
+               test.addr.dst_sin.sin_port = port;
        else
-               ((struct sockaddr_in6 *) &test.addr.dst_addr)->sin6_port = port;
+               test.addr.dst_sin6.sin6_port = port;
 
        printf("cmatose: connecting\n");
        for (i = 0; i < connections; i++) {
index 3648c970e9a2e550f69572de7bc7be64ea6f719a..b9fd308cfd53b7c7a5e0eee18c9ecf20e8d06371 100755 (executable)
@@ -91,12 +91,18 @@ struct rdma_ib_addr {
 };
 
 struct rdma_addr {
-       struct sockaddr         src_addr;
-       uint8_t                 src_pad[sizeof(struct sockaddr_storage) -
-                                       sizeof(struct sockaddr)];
-       struct sockaddr         dst_addr;
-       uint8_t                 dst_pad[sizeof(struct sockaddr_storage) -
-                                       sizeof(struct sockaddr)];
+       union {
+               struct sockaddr         src_addr;
+               struct sockaddr_in      src_sin;
+               struct sockaddr_in6     src_sin6;
+               struct sockaddr_storage src_storage;
+       };
+       union {
+               struct sockaddr         dst_addr;
+               struct sockaddr_in      dst_sin;
+               struct sockaddr_in6     dst_sin6;
+               struct sockaddr_storage dst_storage;
+       };
        union {
                struct rdma_ib_addr     ibaddr;
        } addr;
@@ -575,15 +581,15 @@ int rdma_ack_cm_event(struct rdma_cm_event *event);
 static inline uint16_t rdma_get_src_port(struct rdma_cm_id *id)
 {
        return  id->route.addr.src_addr.sa_family == PF_INET6 ?
-               ((struct sockaddr_in6 *) &id->route.addr.src_addr)->sin6_port :
-               ((struct sockaddr_in *) &id->route.addr.src_addr)->sin_port;
+               id->route.addr.src_sin6.sin6_port :
+               id->route.addr.src_sin.sin_port;
 }
 
 static inline uint16_t rdma_get_dst_port(struct rdma_cm_id *id)
 {
        return  id->route.addr.dst_addr.sa_family == PF_INET6 ?
-               ((struct sockaddr_in6 *) &id->route.addr.dst_addr)->sin6_port :
-               ((struct sockaddr_in *) &id->route.addr.dst_addr)->sin_port;
+               id->route.addr.dst_sin6.sin6_port :
+               id->route.addr.dst_sin.sin_port;
 }
 
 static inline struct sockaddr *rdma_get_local_addr(struct rdma_cm_id *id)