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 <[email protected]> --- This isn't related to XRC support; I just got tired of seeing a bunch of warnings when compiling. This removed most of the warnings. examples/cmatose.c | 12 ++++++------ include/rdma/rdma_cma.h | 26 ++++++++++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/examples/cmatose.c b/examples/cmatose.c index 84831ec..82e0d7c 100644 --- a/examples/cmatose.c +++ b/examples/cmatose.c @@ -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++) { diff --git a/include/rdma/rdma_cma.h b/include/rdma/rdma_cma.h index 3b40060..c0f83b1 100755 --- a/include/rdma/rdma_cma.h +++ b/include/rdma/rdma_cma.h @@ -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; @@ -578,15 +584,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) -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
