diff --git a/ompi/mca/btl/tcp/btl_tcp_proc.c b/ompi/mca/btl/tcp/btl_tcp_proc.c index 2159c761c7..e0fd36ef7e 100644 --- a/ompi/mca/btl/tcp/btl_tcp_proc.c +++ b/ompi/mca/btl/tcp/btl_tcp_proc.c @@ -329,30 +329,60 @@ bool mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t* btl_proc, struct sockaddr* addr OPAL_THREAD_LOCK(&btl_proc->proc_lock); for( i = 0; i < btl_proc->proc_endpoint_count; i++ ) { mca_btl_base_endpoint_t* btl_endpoint = btl_proc->proc_endpoints[i]; + uint16_t remote_kernel_index; + bool matched = false; + uint16_t j; + /* Check all conditions before going to try to accept the connection. */ if( btl_endpoint->endpoint_addr->addr_family != addr->sa_family ) { continue; } - switch (addr->sa_family) { - case AF_INET: - if( memcmp( &btl_endpoint->endpoint_addr->addr_inet, - &(((struct sockaddr_in*)addr)->sin_addr), - sizeof(struct in_addr) ) ) { + /* Check for alias addresses: aliases share the same remote + * kernel_index, so if the addresses don't match, it can still be + * an alias of one we want to accept. + */ + remote_kernel_index = btl_endpoint->endpoint_addr->addr_ifkindex; + + for (j=0; j < btl_proc->proc_addr_count; j++) { + mca_btl_tcp_addr_t* exported_address = btl_proc->proc_addrs + j; + + if (remote_kernel_index != exported_address->addr_ifkindex) { + /* kernel_index doesn't match, so that's not a possible + * alias + */ continue; } - break; + + switch (addr->sa_family) { + case AF_INET: + /* if (aliases) addresses match, accept it */ + if(!memcmp( &exported_address->addr_inet, + &(((struct sockaddr_in*)addr)->sin_addr), + sizeof(struct in_addr) ) ) { + matched = true; + } + break; #if OPAL_WANT_IPV6 - case AF_INET6: - if( memcmp( &btl_endpoint->endpoint_addr->addr_inet, - &(((struct sockaddr_in6*)addr)->sin6_addr), - sizeof(struct in6_addr) ) ) { - continue; - } - break; + case AF_INET6: + if(!IN6_ARE_ADDR_EQUAL( + &btl_endpoint->endpoint_addr->addr_inet, + &(((struct sockaddr_in6*)addr)->sin6_addr))) { + matched = true; + } + break; #endif - default: - ; + default: + ; + } + } + + /* do we have a match for the incoming address? Read: is there a + * btl_endpoint with an address configured for the same remote + * NIC? If not, check the next btl_endpoint + */ + if (false == matched) { + continue; } if(mca_btl_tcp_endpoint_accept(btl_endpoint, addr, sd)) {