When checking incoming connections, also care about aliased interfaces.
Re #1206 This commit was SVN r17331.
Этот коммит содержится в:
родитель
7f79c68930
Коммит
3846e2a797
@ -329,31 +329,61 @@ bool mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t* btl_proc, struct sockaddr* addr
|
|||||||
OPAL_THREAD_LOCK(&btl_proc->proc_lock);
|
OPAL_THREAD_LOCK(&btl_proc->proc_lock);
|
||||||
for( i = 0; i < btl_proc->proc_endpoint_count; i++ ) {
|
for( i = 0; i < btl_proc->proc_endpoint_count; i++ ) {
|
||||||
mca_btl_base_endpoint_t* btl_endpoint = btl_proc->proc_endpoints[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. */
|
/* Check all conditions before going to try to accept the connection. */
|
||||||
if( btl_endpoint->endpoint_addr->addr_family != addr->sa_family ) {
|
if( btl_endpoint->endpoint_addr->addr_family != addr->sa_family ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
switch (addr->sa_family) {
|
switch (addr->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
if( memcmp( &btl_endpoint->endpoint_addr->addr_inet,
|
/* if (aliases) addresses match, accept it */
|
||||||
|
if(!memcmp( &exported_address->addr_inet,
|
||||||
&(((struct sockaddr_in*)addr)->sin_addr),
|
&(((struct sockaddr_in*)addr)->sin_addr),
|
||||||
sizeof(struct in_addr) ) ) {
|
sizeof(struct in_addr) ) ) {
|
||||||
continue;
|
matched = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if OPAL_WANT_IPV6
|
#if OPAL_WANT_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if( memcmp( &btl_endpoint->endpoint_addr->addr_inet,
|
if(!IN6_ARE_ADDR_EQUAL(
|
||||||
&(((struct sockaddr_in6*)addr)->sin6_addr),
|
&btl_endpoint->endpoint_addr->addr_inet,
|
||||||
sizeof(struct in6_addr) ) ) {
|
&(((struct sockaddr_in6*)addr)->sin6_addr))) {
|
||||||
continue;
|
matched = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#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)) {
|
if(mca_btl_tcp_endpoint_accept(btl_endpoint, addr, sd)) {
|
||||||
OPAL_THREAD_UNLOCK(&btl_proc->proc_lock);
|
OPAL_THREAD_UNLOCK(&btl_proc->proc_lock);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user