@@ -908,9 +908,8 @@ int set_up_connection(struct pingpong_context *ctx,
908
908
int rdma_client_connect (struct pingpong_context * ctx ,struct perftest_parameters * user_param )
909
909
{
910
910
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 ;
914
913
struct sockaddr * source_ptr = NULL ;
915
914
struct addrinfo * res ;
916
915
struct rdma_cm_event * event ;
@@ -931,8 +930,14 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
931
930
return FAILURE ;
932
931
}
933
932
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 );
936
941
937
942
if (user_param -> has_source_ip ) {
938
943
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
942
947
}
943
948
memset (& source_sin , 0x0 , sizeof (source_sin ));
944
949
//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
+ }
946
956
source_ptr = (struct sockaddr * )& source_sin ;
957
+ freeaddrinfo (res );
947
958
}
948
959
while (1 )
949
960
{
@@ -953,14 +964,12 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
953
964
return FAILURE ;
954
965
}
955
966
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 )) {
958
968
fprintf (stderr , "rdma_resolve_addr failed\n" );
959
969
return FAILURE ;
960
970
}
961
971
962
972
if (rdma_get_cm_event (ctx -> cm_channel ,& event )) {
963
- freeaddrinfo (res );
964
973
fprintf (stderr , "rdma_get_cm_events failed\n" );
965
974
return FAILURE ;
966
975
}
@@ -974,7 +983,6 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
974
983
975
984
if (event -> event != RDMA_CM_EVENT_ADDR_RESOLVED ) {
976
985
fprintf (stderr , "unexpected CM event %d\n" ,event -> event );
977
- freeaddrinfo (res );
978
986
rdma_ack_cm_event (event );
979
987
return FAILURE ;
980
988
}
@@ -983,8 +991,6 @@ int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters
983
991
break ;
984
992
}
985
993
986
- freeaddrinfo (res );
987
-
988
994
if (user_param -> tos != DEF_TOS ) {
989
995
990
996
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,
1132
1138
struct rdma_conn_param conn_param ;
1133
1139
struct addrinfo hints ;
1134
1140
char * service ;
1135
- struct sockaddr * sin ;
1141
+ struct sockaddr_storage sin ;
1136
1142
char * src_ip = user_param -> has_source_ip ? user_param -> source_ip : NULL ;
1137
1143
1138
1144
memset (& hints , 0 , sizeof hints );
@@ -1151,17 +1157,21 @@ int rdma_server_connect(struct pingpong_context *ctx,
1151
1157
return FAILURE ;
1152
1158
}
1153
1159
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
+ }
1156
1166
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 )) {
1159
1171
fprintf (stderr ," rdma_bind_addr failed\n" );
1160
1172
return 1 ;
1161
1173
}
1162
1174
1163
- freeaddrinfo (res );
1164
-
1165
1175
if (rdma_listen (ctx -> cm_id_control , user_param -> num_of_qps )) {
1166
1176
fprintf (stderr , "rdma_listen failed\n" );
1167
1177
return 1 ;
0 commit comments