@@ -1237,8 +1237,8 @@ void mca_oob_tcp_component_failed_to_connect(int fd, short args, void *cbdata)
1237
1237
*/
1238
1238
static char * * split_and_resolve (char * * orig_str , char * name )
1239
1239
{
1240
- int i , ret , save , if_index ;
1241
- char * * argv , * str , * tmp ;
1240
+ int i , n , ret , if_index , match_count , interface_count ;
1241
+ char * * argv , * * interfaces , * str , * tmp ;
1242
1242
char if_name [IF_NAMESIZE ];
1243
1243
struct sockaddr_storage argv_inaddr , if_inaddr ;
1244
1244
uint32_t argv_prefix ;
@@ -1252,9 +1252,22 @@ static char **split_and_resolve(char **orig_str, char *name)
1252
1252
if (NULL == argv ) {
1253
1253
return NULL ;
1254
1254
}
1255
- for (save = i = 0 ; NULL != argv [i ]; ++ i ) {
1255
+ interface_count = 0 ;
1256
+ interfaces = NULL ;
1257
+ for (i = 0 ; NULL != argv [i ]; ++ i ) {
1256
1258
if (isalpha (argv [i ][0 ])) {
1257
- argv [save ++ ] = argv [i ];
1259
+ /* This is an interface name. If not already in the interfaces array, add it */
1260
+ for (n = 0 ; n < interface_count ; n ++ ) {
1261
+ if (0 == strcmp (argv [i ], interfaces [n ])) {
1262
+ break ;
1263
+ }
1264
+ }
1265
+ if (n == interface_count ) {
1266
+ opal_output_verbose (20 ,
1267
+ orte_oob_base_framework .framework_output ,
1268
+ "oob:tcp: Using interface: %s " , argv [i ]);
1269
+ opal_argv_append (& interface_count , & interfaces , argv [i ]);
1270
+ }
1258
1271
continue ;
1259
1272
}
1260
1273
@@ -1295,6 +1308,7 @@ static char **split_and_resolve(char **orig_str, char *name)
1295
1308
argv_prefix );
1296
1309
1297
1310
/* Go through all interfaces and see if we can find a match */
1311
+ match_count = 0 ;
1298
1312
for (if_index = opal_ifbegin (); if_index >= 0 ;
1299
1313
if_index = opal_ifnext (if_index )) {
1300
1314
opal_ifindextoaddr (if_index ,
@@ -1303,36 +1317,45 @@ static char **split_and_resolve(char **orig_str, char *name)
1303
1317
if (opal_net_samenetwork ((struct sockaddr * ) & argv_inaddr ,
1304
1318
(struct sockaddr * ) & if_inaddr ,
1305
1319
argv_prefix )) {
1306
- break ;
1320
+ /* We found a match. If it's not already in the interfaces array,
1321
+ add it. If it's already in the array, treat it as a match */
1322
+ match_count = match_count + 1 ;
1323
+ opal_ifindextoname (if_index , if_name , sizeof (if_name ));
1324
+ for (n = 0 ; n < interface_count ; n ++ ) {
1325
+ if (0 == strcmp (if_name , interfaces [n ])) {
1326
+ break ;
1327
+ }
1328
+ }
1329
+ if (n == interface_count ) {
1330
+ opal_output_verbose (20 ,
1331
+ orte_oob_base_framework .framework_output ,
1332
+ "oob:tcp: Found match: %s (%s)" ,
1333
+ opal_net_get_hostname ((struct sockaddr * ) & if_inaddr ),
1334
+ if_name );
1335
+ opal_argv_append (& interface_count , & interfaces , if_name );
1336
+ }
1307
1337
}
1308
1338
}
1309
1339
/* If we didn't find a match, keep trying */
1310
- if (if_index < 0 ) {
1340
+ if (0 == match_count ) {
1311
1341
orte_show_help ("help-oob-tcp.txt" , "invalid if_inexclude" ,
1312
1342
true, name , orte_process_info .nodename , tmp ,
1313
1343
"Did not find interface matching this subnet" );
1314
1344
free (tmp );
1315
1345
continue ;
1316
1346
}
1317
1347
1318
- /* We found a match; get the name and replace it in the
1319
- argv */
1320
- opal_ifindextoname (if_index , if_name , sizeof (if_name ));
1321
- opal_output_verbose (20 , orte_oob_base_framework .framework_output ,
1322
- "%s oob:tcp: Found match: %s (%s)" ,
1323
- ORTE_NAME_PRINT (ORTE_PROC_MY_NAME ),
1324
- opal_net_get_hostname ((struct sockaddr * ) & if_inaddr ),
1325
- if_name );
1326
- argv [save ++ ] = strdup (if_name );
1327
1348
free (tmp );
1328
1349
}
1329
1350
1330
- /* The list may have been compressed if there were invalid
1331
- entries, so ensure we end it with a NULL entry */
1332
- argv [save ] = NULL ;
1351
+ /* Mark the end of the interface name array with NULL */
1352
+ if (NULL != interfaces ) {
1353
+ interfaces [interface_count ] = NULL ;
1354
+ }
1355
+ free (argv );
1333
1356
free (* orig_str );
1334
- * orig_str = opal_argv_join (argv , ',' );
1335
- return argv ;
1357
+ * orig_str = opal_argv_join (interfaces , ',' );
1358
+ return interfaces ;
1336
1359
}
1337
1360
1338
1361
/* OOB TCP Class instances */
0 commit comments