diff --git a/ompi/mca/btl/tcp/btl_tcp.c b/ompi/mca/btl/tcp/btl_tcp.c index b4699f41cc..d783179bae 100644 --- a/ompi/mca/btl/tcp/btl_tcp.c +++ b/ompi/mca/btl/tcp/btl_tcp.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -70,12 +70,11 @@ mca_btl_tcp_module_t mca_btl_tcp_module = { * */ -int mca_btl_tcp_add_procs( - struct mca_btl_base_module_t* btl, - size_t nprocs, - struct ompi_proc_t **ompi_procs, - struct mca_btl_base_endpoint_t** peers, - ompi_bitmap_t* reachable) +int mca_btl_tcp_add_procs( struct mca_btl_base_module_t* btl, + size_t nprocs, + struct ompi_proc_t **ompi_procs, + struct mca_btl_base_endpoint_t** peers, + ompi_bitmap_t* reachable ) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*)btl; ompi_proc_t* my_proc; /* pointer to caller's proc structure */ @@ -86,7 +85,6 @@ int mca_btl_tcp_add_procs( if( NULL == my_proc ) { return OMPI_ERR_OUT_OF_RESOURCE; } - for(i = 0; i < (int) nprocs; i++) { struct ompi_proc_t* ompi_proc = ompi_procs[i]; diff --git a/ompi/mca/btl/tcp/btl_tcp_addr.h b/ompi/mca/btl/tcp/btl_tcp_addr.h index 7f213843c8..424907538e 100644 --- a/ompi/mca/btl/tcp/btl_tcp_addr.h +++ b/ompi/mca/btl/tcp/btl_tcp_addr.h @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -53,9 +53,6 @@ struct mca_btl_tcp_addr_t { uint32_t _pad[3]; } _addr__inet; } _union_inet; -#if 0 -# define s_addr _union_inet._addr__inet._addr_inet.s_addr -#endif } addr_inet; #endif in_port_t addr_port; /**< listen port */ diff --git a/ompi/mca/btl/tcp/btl_tcp_component.c b/ompi/mca/btl/tcp/btl_tcp_component.c index d46a111669..a52796addc 100644 --- a/ompi/mca/btl/tcp/btl_tcp_component.c +++ b/ompi/mca/btl/tcp/btl_tcp_component.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -15,10 +15,6 @@ * * $HEADER$ * - * In windows, many of the socket functions return an EWOULDBLOCK - * instead of \ things like EAGAIN, EINPROGRESS, etc. It has been - * verified that this will \ not conflict with other error codes that - * are returned by these functions \ under UNIX/Linux environments */ #include "ompi_config.h" @@ -161,8 +157,8 @@ OBJ_CLASS_INSTANCE( /* * functions for receiving event callbacks */ - static void mca_btl_tcp_component_recv_handler(int, short, void*); +static void mca_btl_tcp_component_accept_handler(int, short, void*); /* @@ -597,31 +593,28 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family) /* register listen port */ #if OPAL_WANT_IPV6 if (AF_INET == af_family) { - opal_event_set( - &mca_btl_tcp_component.tcp_recv_event, - sd, - OPAL_EV_READ|OPAL_EV_PERSIST, - mca_btl_tcp_component_recv_handler, - 0); + opal_event_set( &mca_btl_tcp_component.tcp_recv_event, + sd, + OPAL_EV_READ|OPAL_EV_PERSIST, + mca_btl_tcp_component_accept_handler, + 0 ); opal_event_add(&mca_btl_tcp_component.tcp_recv_event, 0); } if (AF_INET6 == af_family) { - opal_event_set( - &mca_btl_tcp_component.tcp6_recv_event, - sd, - OPAL_EV_READ|OPAL_EV_PERSIST, - mca_btl_tcp_component_recv_handler, - 0); + opal_event_set( &mca_btl_tcp_component.tcp6_recv_event, + sd, + OPAL_EV_READ|OPAL_EV_PERSIST, + mca_btl_tcp_component_accept_handler, + 0 ); opal_event_add(&mca_btl_tcp_component.tcp6_recv_event, 0); } #else - opal_event_set( - &mca_btl_tcp_component.tcp_recv_event, - mca_btl_tcp_component.tcp_listen_sd, - OPAL_EV_READ|OPAL_EV_PERSIST, - mca_btl_tcp_component_recv_handler, - 0); + opal_event_set( &mca_btl_tcp_component.tcp_recv_event, + mca_btl_tcp_component.tcp_listen_sd, + OPAL_EV_READ|OPAL_EV_PERSIST, + mca_btl_tcp_component_accept_handler, + 0 ); opal_event_add(&mca_btl_tcp_component.tcp_recv_event,0); #endif return OMPI_SUCCESS; @@ -634,12 +627,10 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family) static int mca_btl_tcp_component_exchange(void) { - int rc=0; - size_t i=0; - int index; + int rc = 0, index; + size_t i = 0; size_t size = mca_btl_tcp_component.tcp_addr_count * - mca_btl_tcp_component.tcp_num_links * - sizeof(mca_btl_tcp_addr_t); + mca_btl_tcp_component.tcp_num_links * sizeof(mca_btl_tcp_addr_t); /* adi@2007-04-12: * * We'll need to explain things a bit here: @@ -652,10 +643,10 @@ static int mca_btl_tcp_component_exchange(void) if(mca_btl_tcp_component.tcp_num_btls != 0) { mca_btl_tcp_addr_t *addrs = (mca_btl_tcp_addr_t *)malloc(size); - memset (addrs, 0, size); + memset(addrs, 0, size); /* here we start populating our addresses */ - for (i=0; i < mca_btl_tcp_component.tcp_num_btls; i++) { + for( i = 0; i < mca_btl_tcp_component.tcp_num_btls; i++ ) { for (index = opal_ifbegin(); index >= 0; index = opal_ifnext(index)) { struct sockaddr_storage my_ss; @@ -798,14 +789,14 @@ int mca_btl_tcp_component_control(int param, void* value, size_t size) } -/* - * Called by mca_btl_tcp_component_recv() when the TCP listen - * socket has pending connection requests. Accept incoming - * requests and queue for completion of the connection handshake. -*/ - - -static void mca_btl_tcp_component_accept(int incoming_sd) +/** + * Called by the event engine when the listening socket has + * a connection event. Accept the incoming connection request + * and queue them for completion of the connection handshake. + */ +static void mca_btl_tcp_component_accept_handler( int incoming_sd, + short ignored, + void* unused ) { while(true) { #if OPAL_WANT_IPV6 @@ -836,34 +827,21 @@ static void mca_btl_tcp_component_accept(int incoming_sd) } -/* +/** * Event callback when there is data available on the registered - * socket to recv. + * socket to recv. This callback is triggered only once per lifetime + * for any socket, in the beginning when we setup the handshake + * protocol. */ static void mca_btl_tcp_component_recv_handler(int sd, short flags, void* user) { orte_process_name_t guid; -/* Bug, FIXME: use sockaddr_storage instead? */ -#if OPAL_WANT_IPV6 - struct sockaddr_in6 addr; -#else - struct sockaddr_in addr; -#endif + struct sockaddr_storage addr; int retval; mca_btl_tcp_proc_t* btl_proc; opal_socklen_t addr_len = sizeof(addr); mca_btl_tcp_event_t *event = (mca_btl_tcp_event_t *)user; - /* accept new connections on the listen socket */ -#if OPAL_WANT_IPV6 - if((mca_btl_tcp_component.tcp_listen_sd == sd) || - (mca_btl_tcp_component.tcp6_listen_sd == sd)) { -#else - if(mca_btl_tcp_component.tcp_listen_sd == sd) { -#endif - mca_btl_tcp_component_accept(sd); - return; - } OBJ_RELEASE(event); /* recv the process identifier */ @@ -902,7 +880,7 @@ static void mca_btl_tcp_component_recv_handler(int sd, short flags, void* user) } /* are there any existing peer instances will to accept this connection */ - if(mca_btl_tcp_proc_accept(btl_proc, (struct sockaddr_storage*)&addr, sd) == false) { + if(mca_btl_tcp_proc_accept(btl_proc, (struct sockaddr*)&addr, sd) == false) { CLOSE_THE_SOCKET(sd); return; } diff --git a/ompi/mca/btl/tcp/btl_tcp_endpoint.c b/ompi/mca/btl/tcp/btl_tcp_endpoint.c index 1a809db73f..a77ac9db5b 100644 --- a/ompi/mca/btl/tcp/btl_tcp_endpoint.c +++ b/ompi/mca/btl/tcp/btl_tcp_endpoint.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -15,10 +15,6 @@ * * $HEADER$ * - * In windows, many of the socket functions return an EWOULDBLOCK - * instead of \ things like EAGAIN, EINPROGRESS, etc. It has been - * verified that this will \ not conflict with other error codes that - * are returned by these functions \ under UNIX/Linux environments */ #include "ompi_config.h" @@ -65,7 +61,6 @@ * Initialize state of the endpoint instance. * */ - static void mca_btl_tcp_endpoint_construct(mca_btl_tcp_endpoint_t* endpoint) { endpoint->endpoint_btl = NULL; @@ -93,8 +88,6 @@ static void mca_btl_tcp_endpoint_construct(mca_btl_tcp_endpoint_t* endpoint) * Destroy a endpoint * */ - - static void mca_btl_tcp_endpoint_destruct(mca_btl_tcp_endpoint_t* endpoint) { mca_btl_tcp_proc_remove(endpoint->endpoint_proc, endpoint); @@ -236,6 +229,7 @@ static inline void mca_btl_tcp_endpoint_event_init(mca_btl_base_endpoint_t* btl_ int mca_btl_tcp_endpoint_send(mca_btl_base_endpoint_t* btl_endpoint, mca_btl_tcp_frag_t* frag) { int rc = OMPI_SUCCESS; + OPAL_THREAD_LOCK(&btl_endpoint->endpoint_send_lock); switch(btl_endpoint->endpoint_state) { case MCA_BTL_TCP_CONNECTING: @@ -326,13 +320,12 @@ static int mca_btl_tcp_endpoint_send_connect_ack(mca_btl_base_endpoint_t* btl_en */ bool mca_btl_tcp_endpoint_accept(mca_btl_base_endpoint_t* btl_endpoint, - struct sockaddr_storage* addr, int sd) + struct sockaddr* addr, int sd) { mca_btl_tcp_addr_t* btl_addr; mca_btl_tcp_proc_t* this_proc = mca_btl_tcp_proc_local(); - orte_ns_cmp_bitmask_t mask = ORTE_NS_CMP_ALL; + mca_btl_tcp_proc_t *endpoint_proc = btl_endpoint->endpoint_proc; int cmpval; - bool addrs_match = false; OPAL_THREAD_LOCK(&btl_endpoint->endpoint_recv_lock); OPAL_THREAD_LOCK(&btl_endpoint->endpoint_send_lock); @@ -343,61 +336,29 @@ bool mca_btl_tcp_endpoint_accept(mca_btl_base_endpoint_t* btl_endpoint, return false; } -#if 0 - if (btl_addr->addr_family != addr->ss_family) { - OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock); - OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock); - return false; - } - - switch (addr->ss_family) { - case AF_INET: - if (((__const uint32_t *)&btl_addr->addr_inet)[0] == - ((struct sockaddr_in*)addr)->sin_addr.s_addr) { - addrs_match = true; - } - break; -#if OPAL_WANT_IPV6 - case AF_INET6: - if (IN6_ARE_ADDR_EQUAL (&btl_addr->addr_inet, - &((struct sockaddr_in6*)addr)->sin6_addr)) { - addrs_match = true; - } - break; -#endif - default: - opal_output(0, "mca_btl_tcp_endpoint_accept: unknown af_family: %i\n", - addr->ss_family); - } -#else - addrs_match = true; -#endif - if (true == addrs_match) { - mca_btl_tcp_proc_t *endpoint_proc = btl_endpoint->endpoint_proc; - cmpval = orte_ns.compare_fields(mask, - &endpoint_proc->proc_ompi->proc_name, - &this_proc->proc_ompi->proc_name); - if((btl_endpoint->endpoint_sd < 0) || - (btl_endpoint->endpoint_state != MCA_BTL_TCP_CONNECTED && - cmpval < 0)) { + cmpval = orte_ns.compare_fields(ORTE_NS_CMP_ALL, + &endpoint_proc->proc_ompi->proc_name, + &this_proc->proc_ompi->proc_name); + if((btl_endpoint->endpoint_sd < 0) || + (btl_endpoint->endpoint_state != MCA_BTL_TCP_CONNECTED && + cmpval < 0)) { + mca_btl_tcp_endpoint_close(btl_endpoint); + btl_endpoint->endpoint_sd = sd; + if(mca_btl_tcp_endpoint_send_connect_ack(btl_endpoint) != OMPI_SUCCESS) { mca_btl_tcp_endpoint_close(btl_endpoint); - btl_endpoint->endpoint_sd = sd; - if(mca_btl_tcp_endpoint_send_connect_ack(btl_endpoint) != OMPI_SUCCESS) { - mca_btl_tcp_endpoint_close(btl_endpoint); - OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock); - OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock); - return false; - } - mca_btl_tcp_endpoint_event_init(btl_endpoint, sd); - opal_event_add(&btl_endpoint->endpoint_recv_event, 0); - mca_btl_tcp_endpoint_connected(btl_endpoint); -#if OMPI_ENABLE_DEBUG && WANT_PEER_DUMP - mca_btl_tcp_endpoint_dump(btl_endpoint, "accepted"); -#endif OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock); OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock); - return true; + return false; } + mca_btl_tcp_endpoint_event_init(btl_endpoint, sd); + opal_event_add(&btl_endpoint->endpoint_recv_event, 0); + mca_btl_tcp_endpoint_connected(btl_endpoint); +#if OMPI_ENABLE_DEBUG && WANT_PEER_DUMP + mca_btl_tcp_endpoint_dump(btl_endpoint, "accepted"); +#endif + OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock); + OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock); + return true; } OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock); OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock); @@ -410,7 +371,6 @@ bool mca_btl_tcp_endpoint_accept(mca_btl_base_endpoint_t* btl_endpoint, * and update the endpoint state to reflect the connection has * been closed. */ - void mca_btl_tcp_endpoint_close(mca_btl_base_endpoint_t* btl_endpoint) { if(btl_endpoint->endpoint_sd >= 0) { @@ -492,13 +452,11 @@ static int mca_btl_tcp_endpoint_recv_blocking(mca_btl_base_endpoint_t* btl_endpo } - /* * Receive the endpoints globally unique process identification from a newly * connected socket and verify the expected response. If so, move the * socket to a connected state. */ - static int mca_btl_tcp_endpoint_recv_connect_ack(mca_btl_base_endpoint_t* btl_endpoint) { orte_process_name_t guid; @@ -508,7 +466,6 @@ static int mca_btl_tcp_endpoint_recv_connect_ack(mca_btl_base_endpoint_t* btl_en return OMPI_ERR_UNREACH; } ORTE_PROCESS_NAME_NTOH(guid); - /* compare this to the expected values */ if(memcmp(&btl_proc->proc_name, &guid, sizeof(orte_process_name_t)) != 0) { BTL_ERROR(("received unexpected process identifier [%lu,%lu,%lu]", @@ -561,18 +518,14 @@ void mca_btl_tcp_set_socket_options(int sd) * our globally unique process identifier to the endpoint and wait for * the endpoints response. */ - static int mca_btl_tcp_endpoint_start_connect(mca_btl_base_endpoint_t* btl_endpoint) { int rc,flags; struct sockaddr_storage endpoint_addr; - uint16_t af_family; - opal_socklen_t addrlen; + /* By default consider a IPv4 connection */ + uint16_t af_family = AF_INET; + opal_socklen_t addrlen = sizeof(struct sockaddr_in); - if (AF_INET == btl_endpoint->endpoint_addr->addr_family) { - af_family = AF_INET; - addrlen = sizeof (struct sockaddr_in); - } #if OPAL_WANT_IPV6 if (AF_INET6 == btl_endpoint->endpoint_addr->addr_family) { af_family = AF_INET6; @@ -641,7 +594,6 @@ static int mca_btl_tcp_endpoint_start_connect(mca_btl_base_endpoint_t* btl_endpo * later. Otherwise, send this processes identifier to the endpoint on the * newly connected socket. */ - static void mca_btl_tcp_endpoint_complete_connect(mca_btl_base_endpoint_t* btl_endpoint) { int so_error = 0; @@ -768,7 +720,6 @@ static void mca_btl_tcp_endpoint_send_handler(int sd, short flags, void* user) mca_btl_tcp_endpoint_complete_connect(btl_endpoint); break; case MCA_BTL_TCP_CONNECTED: - { /* complete the current send */ do { mca_btl_tcp_frag_t* frag = btl_endpoint->endpoint_send_frag; @@ -791,7 +742,6 @@ static void mca_btl_tcp_endpoint_send_handler(int sd, short flags, void* user) opal_event_del(&btl_endpoint->endpoint_send_event); } break; - } default: BTL_ERROR(("invalid connection state (%d)", btl_endpoint->endpoint_state)); opal_event_del(&btl_endpoint->endpoint_send_event); diff --git a/ompi/mca/btl/tcp/btl_tcp_endpoint.h b/ompi/mca/btl/tcp/btl_tcp_endpoint.h index bb09ebc4b8..44ae91b9a2 100644 --- a/ompi/mca/btl/tcp/btl_tcp_endpoint.h +++ b/ompi/mca/btl/tcp/btl_tcp_endpoint.h @@ -2,7 +2,7 @@ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2006 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -81,7 +81,7 @@ OBJ_CLASS_DECLARATION(mca_btl_tcp_endpoint_t); void mca_btl_tcp_set_socket_options(int sd); void mca_btl_tcp_endpoint_close(mca_btl_base_endpoint_t*); int mca_btl_tcp_endpoint_send(mca_btl_base_endpoint_t*, struct mca_btl_tcp_frag_t*); -bool mca_btl_tcp_endpoint_accept(mca_btl_base_endpoint_t*, struct sockaddr_storage*, int); +bool mca_btl_tcp_endpoint_accept(mca_btl_base_endpoint_t*, struct sockaddr*, int); void mca_btl_tcp_endpoint_shutdown(mca_btl_base_endpoint_t*); #if defined(c_plusplus) || defined(__cplusplus) diff --git a/ompi/mca/btl/tcp/btl_tcp_proc.c b/ompi/mca/btl/tcp/btl_tcp_proc.c index 1b8ebe8d6c..68b4b3a00c 100644 --- a/ompi/mca/btl/tcp/btl_tcp_proc.c +++ b/ompi/mca/btl/tcp/btl_tcp_proc.c @@ -2,7 +2,7 @@ * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University + * Copyright (c) 2004-2007 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, @@ -38,13 +38,10 @@ static void mca_btl_tcp_proc_construct(mca_btl_tcp_proc_t* proc); static void mca_btl_tcp_proc_destruct(mca_btl_tcp_proc_t* proc); - -OBJ_CLASS_INSTANCE( - mca_btl_tcp_proc_t, - opal_list_item_t, - mca_btl_tcp_proc_construct, - mca_btl_tcp_proc_destruct); - +OBJ_CLASS_INSTANCE( mca_btl_tcp_proc_t, + opal_list_item_t, + mca_btl_tcp_proc_construct, + mca_btl_tcp_proc_destruct ); void mca_btl_tcp_proc_construct(mca_btl_tcp_proc_t* proc) { @@ -95,7 +92,7 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_create(ompi_proc_t* ompi_proc) if(NULL != btl_proc) { OPAL_THREAD_UNLOCK(&mca_btl_tcp_component.tcp_lock); return btl_proc; - } + } btl_proc = OBJ_NEW(mca_btl_tcp_proc_t); if(NULL == btl_proc) @@ -104,10 +101,9 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_create(ompi_proc_t* ompi_proc) btl_proc->proc_name = ompi_proc->proc_name; /* add to hash table of all proc instance */ - orte_hash_table_set_proc( - &mca_btl_tcp_component.tcp_procs, - &btl_proc->proc_name, - btl_proc); + orte_hash_table_set_proc( &mca_btl_tcp_component.tcp_procs, + &btl_proc->proc_name, + btl_proc ); OPAL_THREAD_UNLOCK(&mca_btl_tcp_component.tcp_lock); /* lookup tcp parameters exported by this proc */ @@ -164,9 +160,8 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_create(ompi_proc_t* ompi_proc) * already held. Insert a btl instance into the proc array and assign * it an address. */ -int mca_btl_tcp_proc_insert( - mca_btl_tcp_proc_t* btl_proc, - mca_btl_base_endpoint_t* btl_endpoint) +int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc, + mca_btl_base_endpoint_t* btl_endpoint ) { size_t i; struct sockaddr_storage endpoint_addr_ss; @@ -186,13 +181,12 @@ int mca_btl_tcp_proc_insert( btl_endpoint->endpoint_proc = btl_proc; btl_proc->proc_endpoints[btl_proc->proc_endpoint_count++] = btl_endpoint; - /* * Look through the proc instance for an address that is on the * directly attached network. If we don't find one, pick the first * unused address. */ - for(i=0; iproc_addr_count; i++) { + for( i = 0; i < btl_proc->proc_addr_count; i++ ) { mca_btl_tcp_addr_t* endpoint_addr = btl_proc->proc_addrs + i; if(endpoint_addr->addr_inuse != 0) { continue; @@ -221,7 +215,6 @@ int mca_btl_tcp_proc_insert( btl_endpoint->endpoint_addr->addr_inuse++; return OMPI_SUCCESS; } - #endif /* Read: * if we are on the same network, accept. @@ -271,13 +264,12 @@ int mca_btl_tcp_proc_insert( if( NULL != btl_endpoint->endpoint_addr ) { btl_endpoint->endpoint_addr->addr_inuse++; return OMPI_SUCCESS; - } else { - /* Bug, FIXME: Once upon a time, there was a lot of - * code in here. I've removed it. There might be better - * approaches. Thomas will show... - */ - return OMPI_ERR_UNREACH; } + /* Bug, FIXME: Once upon a time, there was a lot of + * code in here. I've removed it. There might be better + * approaches. Thomas will show... + */ + return OMPI_ERR_UNREACH; } /* @@ -326,15 +318,20 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_lookup(const orte_process_name_t *name) } /* - * loop through all available PTLs for one matching the source address + * loop through all available BTLs for one matching the source address * of the request. */ -bool mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t* btl_proc, struct sockaddr_storage* addr, int sd) +bool 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; iproc_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]; + /* Check all conditions before going to try to accept the connection. */ + if( btl_endpoint->endpoint_addr->addr_family != addr->sa_family ) continue; + if( memcmp( &btl_endpoint->endpoint_addr->addr_inet, + &(((struct sockaddr_in*)addr)->sin_addr), + (AF_INET == addr->sa_family ? sizeof(struct in_addr) : sizeof(struct in6_addr)) ) ) continue; if(mca_btl_tcp_endpoint_accept(btl_endpoint, addr, sd)) { OPAL_THREAD_UNLOCK(&btl_proc->proc_lock); return true; @@ -353,30 +350,30 @@ bool mca_btl_tcp_proc_tosocks(mca_btl_tcp_addr_t* proc_addr, { memset(output, 0, sizeof (*output)); switch (proc_addr->addr_family) { - case AF_INET: - output->ss_family = AF_INET; - memcpy(&((struct sockaddr_in*)output)->sin_addr, - &proc_addr->addr_inet, sizeof(struct in_addr)); - ((struct sockaddr_in*)output)->sin_port = proc_addr->addr_port; - break; + case AF_INET: + output->ss_family = AF_INET; + memcpy(&((struct sockaddr_in*)output)->sin_addr, + &proc_addr->addr_inet, sizeof(struct in_addr)); + ((struct sockaddr_in*)output)->sin_port = proc_addr->addr_port; + break; #if OPAL_WANT_IPV6 - case AF_INET6: - { - struct sockaddr_in6* inaddr = (struct sockaddr_in6*)output; - output->ss_family = AF_INET6; - memcpy(&inaddr->sin6_addr, &proc_addr->addr_inet, - sizeof (proc_addr->addr_inet)); - inaddr->sin6_port = proc_addr->addr_port; - inaddr->sin6_scope_id = 0; - inaddr->sin6_flowinfo = 0; - } - break; + case AF_INET6: + { + struct sockaddr_in6* inaddr = (struct sockaddr_in6*)output; + output->ss_family = AF_INET6; + memcpy(&inaddr->sin6_addr, &proc_addr->addr_inet, + sizeof (proc_addr->addr_inet)); + inaddr->sin6_port = proc_addr->addr_port; + inaddr->sin6_scope_id = 0; + inaddr->sin6_flowinfo = 0; + } + break; #endif - default: - opal_output (0, - "mca_btl_tcp_proc: unknown af_family received: %d\n", - proc_addr->addr_family); - return false; - } + default: + opal_output( 0, "mca_btl_tcp_proc: unknown af_family received: %d\n", + proc_addr->addr_family ); + return false; + } return true; -} +} + diff --git a/ompi/mca/btl/tcp/btl_tcp_proc.h b/ompi/mca/btl/tcp/btl_tcp_proc.h index f0a5d30a58..cf0369164d 100644 --- a/ompi/mca/btl/tcp/btl_tcp_proc.h +++ b/ompi/mca/btl/tcp/btl_tcp_proc.h @@ -68,7 +68,7 @@ mca_btl_tcp_proc_t* mca_btl_tcp_proc_create(ompi_proc_t* ompi_proc); mca_btl_tcp_proc_t* mca_btl_tcp_proc_lookup(const orte_process_name_t* name); int mca_btl_tcp_proc_insert(mca_btl_tcp_proc_t*, mca_btl_base_endpoint_t*); int mca_btl_tcp_proc_remove(mca_btl_tcp_proc_t*, mca_btl_base_endpoint_t*); -bool mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t*, struct sockaddr_storage*, int); +bool mca_btl_tcp_proc_accept(mca_btl_tcp_proc_t*, struct sockaddr*, int); bool mca_btl_tcp_proc_tosocks(mca_btl_tcp_addr_t*, struct sockaddr_storage*); /**