@@ -908,9 +908,8 @@ int set_up_connection(struct pingpong_context *ctx,
908908int rdma_client_connect (struct pingpong_context * ctx ,struct perftest_parameters * user_param )
909909{
910910 char * service ;
911- int temp ,num_of_retry = NUM_OF_RETRIES ;
912- struct sockaddr_storage source_sin ;
913- struct sockaddr * sin ;
911+ int temp , num_of_retry = NUM_OF_RETRIES ;
912+ struct sockaddr_storage sin , source_sin ;
914913 struct sockaddr * source_ptr = NULL ;
915914 struct addrinfo * res ;
916915 struct rdma_cm_event * event ;
@@ -931,8 +930,14 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
931930 return FAILURE ;
932931 }
933932
934- sin = res -> ai_addr ;
935- sockaddr_set_port (sin , (unsigned short )user_param -> port );
933+ if (res -> ai_addr -> sa_family == AF_INET ) {
934+ memcpy (& sin , res -> ai_addr , sizeof (struct sockaddr_in ));
935+ }
936+ else {
937+ memcpy (& sin , res -> ai_addr , sizeof (struct sockaddr_in6 ));
938+ }
939+ sockaddr_set_port ((struct sockaddr * )& sin , (unsigned short )user_param -> port );
940+ freeaddrinfo (res );
936941
937942 if (user_param -> has_source_ip ) {
938943 if (check_add_port (& service , 0x0 , user_param -> source_ip , & hints , & res ))
@@ -942,8 +947,14 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
942947 }
943948 memset (& source_sin , 0x0 , sizeof (source_sin ));
944949 //coverity[deref_after_free]
945- memcpy (& source_sin , res -> ai_addr , sizeof (source_sin ));
950+ if (res -> ai_addr -> sa_family == AF_INET ) {
951+ memcpy (& source_sin , res -> ai_addr , sizeof (struct sockaddr_in ));
952+ }
953+ else {
954+ memcpy (& source_sin , res -> ai_addr , sizeof (struct sockaddr_in6 ));
955+ }
946956 source_ptr = (struct sockaddr * )& source_sin ;
957+ freeaddrinfo (res );
947958 }
948959 while (1 )
949960 {
@@ -953,14 +964,12 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
953964 return FAILURE ;
954965 }
955966
956- if (rdma_resolve_addr (ctx -> cm_id , source_ptr , sin , 2000 )) {
957- freeaddrinfo (res );
967+ if (rdma_resolve_addr (ctx -> cm_id , source_ptr , (struct sockaddr * )& sin , 2000 )) {
958968 fprintf (stderr , "rdma_resolve_addr failed\n" );
959969 return FAILURE ;
960970 }
961971
962972 if (rdma_get_cm_event (ctx -> cm_channel ,& event )) {
963- freeaddrinfo (res );
964973 fprintf (stderr , "rdma_get_cm_events failed\n" );
965974 return FAILURE ;
966975 }
@@ -974,7 +983,6 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
974983
975984 if (event -> event != RDMA_CM_EVENT_ADDR_RESOLVED ) {
976985 fprintf (stderr , "unexpected CM event %d\n" ,event -> event );
977- freeaddrinfo (res );
978986 rdma_ack_cm_event (event );
979987 return FAILURE ;
980988 }
@@ -983,8 +991,6 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
983991 break ;
984992 }
985993
986- freeaddrinfo (res );
987-
988994 if (user_param -> tos != DEF_TOS ) {
989995
990996 if (rdma_set_option (ctx -> cm_id ,RDMA_OPTION_ID ,RDMA_OPTION_ID_TOS ,& user_param -> tos ,sizeof (uint8_t ))) {
@@ -1132,7 +1138,7 @@ int rdma_server_connect(struct pingpong_context *ctx,
11321138 struct rdma_conn_param conn_param ;
11331139 struct addrinfo hints ;
11341140 char * service ;
1135- struct sockaddr * sin ;
1141+ struct sockaddr_storage sin ;
11361142 char * src_ip = user_param -> has_source_ip ? user_param -> source_ip : NULL ;
11371143
11381144 memset (& hints , 0 , sizeof hints );
@@ -1151,17 +1157,21 @@ int rdma_server_connect(struct pingpong_context *ctx,
11511157 return FAILURE ;
11521158 }
11531159
1154- sin = res -> ai_addr ;
1155- sockaddr_set_port (sin , (unsigned short )user_param -> port );
1160+ if (res -> ai_addr -> sa_family == AF_INET ) {
1161+ memcpy (& sin , res -> ai_addr , sizeof (struct sockaddr_in ));
1162+ }
1163+ else {
1164+ memcpy (& sin , res -> ai_addr , sizeof (struct sockaddr_in6 ));
1165+ }
11561166
1157- if (rdma_bind_addr (ctx -> cm_id_control , sin )) {
1158- freeaddrinfo (res );
1167+ sockaddr_set_port ((struct sockaddr * )& sin , (unsigned short )user_param -> port );
1168+ freeaddrinfo (res );
1169+
1170+ if (rdma_bind_addr (ctx -> cm_id_control , (struct sockaddr * )& sin )) {
11591171 fprintf (stderr ," rdma_bind_addr failed\n" );
11601172 return 1 ;
11611173 }
11621174
1163- freeaddrinfo (res );
1164-
11651175 if (rdma_listen (ctx -> cm_id_control , user_param -> num_of_qps )) {
11661176 fprintf (stderr , "rdma_listen failed\n" );
11671177 return 1 ;
0 commit comments