Skip to content

Commit

Permalink
Re-enable support for local addresses.
Browse files Browse the repository at this point in the history
This patch is based on the "RFC: Reenabling the TCP BTL over local
interfaces (when specifically requested)". It removes the hardcoded
exception for the local devices that has been enforced by the
TCP BTL. Instead, we exclude the local interface only via the
exclude MCA (both IPv4 and IPv6 local addresses are already in the
default if_exclude), which is also the behavior currently described in
our README file.
  • Loading branch information
bosilca committed Sep 23, 2016
1 parent 362a588 commit 93fa94f
Showing 1 changed file with 17 additions and 39 deletions.
56 changes: 17 additions & 39 deletions opal/mca/btl/tcp/btl_tcp_proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,9 +541,9 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
}


for(i=0; i<proc_data->num_local_interfaces; ++i) {
for( i = 0; i < proc_data->num_local_interfaces; ++i ) {
mca_btl_tcp_interface_t* local_interface = proc_data->local_interfaces[i];
for(j=0; j<proc_data->num_peer_interfaces; ++j) {
for( j = 0; j < proc_data->num_peer_interfaces; ++j ) {

/* initially, assume no connection is possible */
proc_data->weights[i][j] = CQ_NO_CONNECTION;
Expand All @@ -552,19 +552,8 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
if(NULL != proc_data->local_interfaces[i]->ipv4_address &&
NULL != peer_interfaces[j]->ipv4_address) {

/* check for loopback */
if ((opal_net_islocalhost((struct sockaddr *)local_interface->ipv4_address) &&
!opal_net_islocalhost((struct sockaddr *)peer_interfaces[j]->ipv4_address)) ||
(opal_net_islocalhost((struct sockaddr *)peer_interfaces[j]->ipv4_address) &&
!opal_net_islocalhost((struct sockaddr *)local_interface->ipv4_address)) ||
(opal_net_islocalhost((struct sockaddr *)local_interface->ipv4_address) &&
!opal_ifislocal(proc_hostname))) {

/* No connection is possible on these interfaces */

/* check for RFC1918 */
} else if(opal_net_addr_isipv4public((struct sockaddr*) local_interface->ipv4_address) &&
opal_net_addr_isipv4public((struct sockaddr*) peer_interfaces[j]->ipv4_address)) {
if(opal_net_addr_isipv4public((struct sockaddr*) local_interface->ipv4_address) &&
opal_net_addr_isipv4public((struct sockaddr*) peer_interfaces[j]->ipv4_address)) {
if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv4_address,
(struct sockaddr*) peer_interfaces[j]->ipv4_address,
local_interface->ipv4_netmask)) {
Expand All @@ -574,17 +563,16 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
}
proc_data->best_addr[i][j] = peer_interfaces[j]->ipv4_endpoint_addr;
continue;
}
if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv4_address,
(struct sockaddr*) peer_interfaces[j]->ipv4_address,
local_interface->ipv4_netmask)) {
proc_data->weights[i][j] = CQ_PRIVATE_SAME_NETWORK;
} else {
if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv4_address,
(struct sockaddr*) peer_interfaces[j]->ipv4_address,
local_interface->ipv4_netmask)) {
proc_data->weights[i][j] = CQ_PRIVATE_SAME_NETWORK;
} else {
proc_data->weights[i][j] = CQ_PRIVATE_DIFFERENT_NETWORK;
}
proc_data->best_addr[i][j] = peer_interfaces[j]->ipv4_endpoint_addr;
continue;
proc_data->weights[i][j] = CQ_PRIVATE_DIFFERENT_NETWORK;
}
proc_data->best_addr[i][j] = peer_interfaces[j]->ipv4_endpoint_addr;
continue;
}

/* check state of ipv6 address pair - ipv6 is always public,
Expand All @@ -593,19 +581,9 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
if(NULL != local_interface->ipv6_address &&
NULL != peer_interfaces[j]->ipv6_address) {

/* check for loopback */
if ((opal_net_islocalhost((struct sockaddr *)local_interface->ipv6_address) &&
!opal_net_islocalhost((struct sockaddr *)peer_interfaces[j]->ipv6_address)) ||
(opal_net_islocalhost((struct sockaddr *)peer_interfaces[j]->ipv6_address) &&
!opal_net_islocalhost((struct sockaddr *)local_interface->ipv6_address)) ||
(opal_net_islocalhost((struct sockaddr *)local_interface->ipv6_address) &&
!opal_ifislocal(proc_hostname))) {

/* No connection is possible on these interfaces */

} else if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv6_address,
(struct sockaddr*) peer_interfaces[j]->ipv6_address,
local_interface->ipv6_netmask)) {
if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv6_address,
(struct sockaddr*) peer_interfaces[j]->ipv6_address,
local_interface->ipv6_netmask)) {
proc_data->weights[i][j] = CQ_PUBLIC_SAME_NETWORK;
} else {
proc_data->weights[i][j] = CQ_PUBLIC_DIFFERENT_NETWORK;
Expand Down Expand Up @@ -758,6 +736,7 @@ int mca_btl_tcp_proc_remove(mca_btl_tcp_proc_t* btl_proc, mca_btl_base_endpoint_
mca_btl_tcp_proc_t* mca_btl_tcp_proc_lookup(const opal_process_name_t *name)
{
mca_btl_tcp_proc_t* proc = NULL;

OPAL_THREAD_LOCK(&mca_btl_tcp_component.tcp_lock);
opal_proc_table_get_value(&mca_btl_tcp_component.tcp_procs,
*name, (void**)&proc);
Expand Down Expand Up @@ -795,9 +774,8 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_lookup(const opal_process_name_t *name)
*/
void mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t* btl_proc, struct sockaddr* addr, int sd)
{
size_t i;
OPAL_THREAD_LOCK(&btl_proc->proc_lock);
for( i = 0; i < btl_proc->proc_endpoint_count; i++ ) {
for( size_t i = 0; i < btl_proc->proc_endpoint_count; i++ ) {
mca_btl_base_endpoint_t* btl_endpoint = btl_proc->proc_endpoints[i];
/* Check all conditions before going to try to accept the connection. */
if( btl_endpoint->endpoint_addr->addr_family != addr->sa_family ) {
Expand Down

0 comments on commit 93fa94f

Please sign in to comment.