Restrict the port range for the OOB and the BTL. Each protocols (v4 and v6)
has his own range which is defined by a min value and a range. By default there is no limitation on the port range, which is exactly the same behavior as before. This commit was SVN r16584.
Этот коммит содержится в:
родитель
9e4387d021
Коммит
337f78a4a8
@ -70,16 +70,21 @@ struct mca_btl_tcp_component_t {
|
||||
opal_hash_table_t tcp_procs; /**< hash table of tcp proc structures */
|
||||
opal_list_t tcp_events; /**< list of pending tcp events */
|
||||
opal_mutex_t tcp_lock; /**< lock for accessing module state */
|
||||
|
||||
opal_event_t tcp_recv_event; /**< recv event for IPv4 listen socket */
|
||||
#if OPAL_WANT_IPV6
|
||||
opal_event_t tcp6_recv_event; /**< recv event for IPv6 listen socket */
|
||||
#endif
|
||||
int tcp_listen_sd; /**< IPv4 listen socket for incoming connection requests */
|
||||
unsigned short tcp_listen_port; /**< IPv4 listen port */
|
||||
int32_t tcp_port_min; /**< IPv4 minimum port */
|
||||
int32_t tcp_port_range; /**< IPv4 port range */
|
||||
#if OPAL_WANT_IPV6
|
||||
opal_event_t tcp6_recv_event; /**< recv event for IPv6 listen socket */
|
||||
int tcp6_listen_sd; /**< IPv6 listen socket for incoming connection requests */
|
||||
unsigned short tcp6_listen_port; /**< IPv6 listen port */
|
||||
int32_t tcp6_port_min; /**< IPv4 minimum port */
|
||||
int32_t tcp6_port_range; /**< IPv4 port range */
|
||||
#endif
|
||||
/* Port range restriction */
|
||||
|
||||
char* tcp_if_include; /**< comma seperated list of interface to include */
|
||||
char* tcp_if_exclude; /**< comma seperated list of interface to exclude */
|
||||
int tcp_sndbuf; /**< socket sndbuf size */
|
||||
|
@ -217,10 +217,33 @@ int mca_btl_tcp_component_open(void)
|
||||
mca_btl_tcp_component.tcp_rcvbuf =
|
||||
mca_btl_tcp_param_register_int ("rcvbuf", NULL, 128*1024);
|
||||
mca_btl_tcp_component.tcp_endpoint_cache =
|
||||
mca_btl_tcp_param_register_int ("endpoint_cache", NULL, 30*1024);
|
||||
mca_btl_tcp_param_register_int ("endpoint_cache",
|
||||
"The size of the internal cache for each TCP connection. This cache is"
|
||||
" used to reduce the number of syscalls, by replacing them with memcpy."
|
||||
" Every read will read the expected data plus the amount of the"
|
||||
" endpoint_cache", 30*1024);
|
||||
mca_btl_tcp_component.tcp_use_nodelay =
|
||||
!mca_btl_tcp_param_register_int ("use_nagle", "Whether to use Nagle's algorithm or not (using Nagle's algorithm may increase short message latency)", 0);
|
||||
|
||||
mca_btl_tcp_component.tcp_port_min =
|
||||
mca_btl_tcp_param_register_int( "port_min_v4",
|
||||
"The minimum port where the TCP BTL will try to bind (default 0)", 0 );
|
||||
mca_btl_tcp_component.tcp_port_range =
|
||||
mca_btl_tcp_param_register_int( "port_range_v4",
|
||||
"The number of ports where the TCP BTL will try to bind (default 64K)."
|
||||
" This parameter together with the port min, define a range of ports"
|
||||
" where Open MPI will open sockets.",
|
||||
64*1024 - mca_btl_tcp_component.tcp_port_min - 1);
|
||||
#if OPAL_WANT_IPV6
|
||||
mca_btl_tcp_component.tcp6_port_min =
|
||||
mca_btl_tcp_param_register_int( "port_min_v6",
|
||||
"The minimum port where the TCP BTL will try to bind (default 0)", 0 );
|
||||
mca_btl_tcp_component.tcp6_port_range =
|
||||
mca_btl_tcp_param_register_int( "port_range_v6",
|
||||
"The number of ports where the TCP BTL will try to bind (default 64K)."
|
||||
" This parameter together with the port min, define a range of ports"
|
||||
" where Open MPI will open sockets.",
|
||||
64*1024 - mca_btl_tcp_component.tcp6_port_min - 1);
|
||||
#endif
|
||||
mca_btl_tcp_module.super.btl_exclusivity = MCA_BTL_EXCLUSIVITY_LOW;
|
||||
mca_btl_tcp_module.super.btl_eager_limit = 64*1024;
|
||||
mca_btl_tcp_module.super.btl_min_send_size = 64*1024;
|
||||
@ -482,11 +505,7 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
|
||||
{
|
||||
int flags;
|
||||
int sd;
|
||||
#if OPAL_WANT_IPV6
|
||||
struct sockaddr_in6 inaddr;
|
||||
#else
|
||||
struct sockaddr_in inaddr;
|
||||
#endif
|
||||
struct sockaddr_storage inaddr;
|
||||
opal_socklen_t addrlen;
|
||||
|
||||
/* create a listen socket for incoming connections */
|
||||
@ -499,24 +518,8 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
|
||||
return OMPI_ERR_IN_ERRNO;
|
||||
}
|
||||
|
||||
/* we now have a socket. Assign it to the real mca_btl_tcp_component */
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
mca_btl_tcp_component.tcp6_listen_sd = sd;
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
} else {
|
||||
mca_btl_tcp_component.tcp_listen_sd = sd;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
}
|
||||
#else
|
||||
mca_btl_tcp_component.tcp_listen_sd = sd;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
|
||||
mca_btl_tcp_set_socket_options(sd);
|
||||
|
||||
/* bind to all addresses and dynamically assigned port */
|
||||
memset(&inaddr, 0, sizeof(inaddr));
|
||||
#if OPAL_WANT_IPV6
|
||||
{
|
||||
struct addrinfo hints, *res = NULL;
|
||||
@ -531,7 +534,8 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
|
||||
opal_output (0,
|
||||
"mca_btl_tcp_create_listen: unable to resolve. %s\n",
|
||||
gai_strerror (error));
|
||||
return ORTE_ERROR;
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
memcpy (&inaddr, res->ai_addr, res->ai_addrlen);
|
||||
@ -551,39 +555,93 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
|
||||
#endif /* IPV6_V6ONLY */
|
||||
}
|
||||
#else
|
||||
inaddr.sin_family = AF_INET;
|
||||
inaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
inaddr.sin_port = 0;
|
||||
((struct sockaddr_in*) &inaddr)->sin_family = AF_INET;
|
||||
((struct sockaddr_in*) &inaddr)->sin_addr.s_addr = INADDR_ANY;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
|
||||
if(bind(sd, (struct sockaddr*)&inaddr, addrlen) < 0) {
|
||||
BTL_ERROR(("bind() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
return OMPI_ERROR;
|
||||
{ /* Don't reuse ports */
|
||||
int flg = 0;
|
||||
if (setsockopt (sd, SOL_SOCKET, SO_REUSEPORT, &flg, sizeof (flg)) < 0) {
|
||||
BTL_ERROR((0, "mca_btl_tcp_create_listen: unable to unset the "
|
||||
"SO_REUSEADDR option (%s:%d)\n",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
int index, range, port;
|
||||
|
||||
if( AF_INET == af_family ) {
|
||||
range = mca_btl_tcp_component.tcp_port_range;
|
||||
port = mca_btl_tcp_component.tcp_port_min;
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
range = mca_btl_tcp_component.tcp6_port_range;
|
||||
port = mca_btl_tcp_component.tcp6_port_min;
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
|
||||
for( index = 0; index < range; index++ ) {
|
||||
#if OPAL_WANT_IPV6
|
||||
((struct sockaddr_in6*) &inaddr)->sin6_port = port + index;
|
||||
#else
|
||||
((struct sockaddr_in*) &inaddr)->sin_port = port + index;
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
if(bind(sd, (struct sockaddr*)&inaddr, addrlen) < 0) {
|
||||
if( (EADDRINUSE == opal_socket_errno) || (EADDRNOTAVAIL == opal_socket_errno) ) {
|
||||
continue;
|
||||
}
|
||||
BTL_ERROR(("bind() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
goto socket_binded;
|
||||
}
|
||||
if( AF_INET == af_family ) {
|
||||
BTL_ERROR(("bind() failed: no port available in the range [%d..%d]",
|
||||
mca_btl_tcp_component.tcp_port_min,
|
||||
mca_btl_tcp_component.tcp_port_min + range));
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
BTL_ERROR(("bind6() failed: no port available in the range [%d..%d]",
|
||||
mca_btl_tcp_component.tcp6_port_min,
|
||||
mca_btl_tcp_component.tcp6_port_min + range));
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
socket_binded:
|
||||
/* resolve system assignend port */
|
||||
if(getsockname(sd, (struct sockaddr*)&inaddr, &addrlen) < 0) {
|
||||
BTL_ERROR(("getsockname() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET == af_family) {
|
||||
mca_btl_tcp_component.tcp_listen_port = inaddr.sin6_port;
|
||||
mca_btl_tcp_component.tcp_listen_port = ((struct sockaddr_in*) &inaddr)->sin_port;
|
||||
mca_btl_tcp_component.tcp_listen_sd = sd;
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
mca_btl_tcp_component.tcp6_listen_port = inaddr.sin6_port;
|
||||
mca_btl_tcp_component.tcp6_listen_port = ((struct sockaddr_in6*) &inaddr)->sin6_port;
|
||||
mca_btl_tcp_component.tcp6_listen_sd = sd;
|
||||
}
|
||||
#else
|
||||
mca_btl_tcp_component.tcp_listen_port = inaddr.sin_port;
|
||||
#endif
|
||||
|
||||
/* setup listen backlog to maximum allowed by kernel */
|
||||
if(listen(sd, SOMAXCONN) < 0) {
|
||||
BTL_ERROR(("listen() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
@ -591,42 +649,36 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
|
||||
if((flags = fcntl(sd, F_GETFL, 0)) < 0) {
|
||||
BTL_ERROR(("fcntl(F_GETFL) failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
} else {
|
||||
flags |= O_NONBLOCK;
|
||||
if(fcntl(sd, F_SETFL, flags) < 0) {
|
||||
BTL_ERROR(("fcntl(F_SETFL) failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno));
|
||||
CLOSE_THE_SOCKET(sd);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/* register listen port */
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET == af_family) {
|
||||
opal_event_set( &mca_btl_tcp_component.tcp_recv_event,
|
||||
sd,
|
||||
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);
|
||||
}
|
||||
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
opal_event_set( &mca_btl_tcp_component.tcp6_recv_event,
|
||||
sd,
|
||||
mca_btl_tcp_component.tcp6_listen_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_accept_handler,
|
||||
0 );
|
||||
opal_event_add(&mca_btl_tcp_component.tcp_recv_event,0);
|
||||
#endif
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
@ -356,10 +356,33 @@ int mca_oob_tcp_component_open(void)
|
||||
10,
|
||||
&mca_oob_tcp_component.tcp_copy_spin_count);
|
||||
|
||||
mca_base_param_reg_int(&mca_oob_tcp_component.super.oob_base,
|
||||
"port_min_v4", "Starting port allowed (IPv4)",
|
||||
false, false,
|
||||
0,
|
||||
&mca_oob_tcp_component.tcp_port_min);
|
||||
mca_base_param_reg_int(&mca_oob_tcp_component.super.oob_base,
|
||||
"port_range_v4", "Range of allowed ports (IPv4)",
|
||||
false, false,
|
||||
64*1024 - 1 - mca_oob_tcp_component.tcp_port_min,
|
||||
&mca_oob_tcp_component.tcp_port_range);
|
||||
#if OPAL_WANT_IPV6
|
||||
mca_base_param_reg_int(&mca_oob_tcp_component.super.oob_base,
|
||||
"port_min_v6", "Starting port allowed (IPv6)",
|
||||
false, false,
|
||||
0,
|
||||
&mca_oob_tcp_component.tcp6_port_min);
|
||||
mca_base_param_reg_int(&mca_oob_tcp_component.super.oob_base,
|
||||
"port_range_v6", "Range of allowed ports (IPv6)",
|
||||
false, false,
|
||||
64*1024 - 1 - mca_oob_tcp_component.tcp6_port_min,
|
||||
&mca_oob_tcp_component.tcp6_port_range);
|
||||
mca_oob_tcp_component.tcp6_listen_sd = -1;
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
|
||||
/* initialize state */
|
||||
mca_oob_tcp_component.tcp_shutdown = false;
|
||||
mca_oob_tcp_component.tcp_listen_sd = -1;
|
||||
mca_oob_tcp_component.tcp6_listen_sd = -1;
|
||||
mca_oob_tcp_component.tcp_match_count = 0;
|
||||
|
||||
mca_oob_tcp_component.tcp_last_copy_time = 0;
|
||||
@ -471,14 +494,9 @@ static int mca_oob_tcp_create_listen(int *target_sd, uint16_t af_family)
|
||||
int flags;
|
||||
struct sockaddr_storage inaddr;
|
||||
opal_socklen_t addrlen;
|
||||
#if OPAL_WANT_IPV6
|
||||
struct addrinfo hints, *res = NULL;
|
||||
int error;
|
||||
#endif
|
||||
|
||||
/* create a listen socket for incoming connections */
|
||||
*target_sd = socket(af_family, SOCK_STREAM, 0);
|
||||
|
||||
if(*target_sd < 0) {
|
||||
if (EAFNOSUPPORT != opal_socket_errno) {
|
||||
opal_output(0,"mca_oob_tcp_component_init: socket() failed: %s (%d)",
|
||||
@ -490,69 +508,125 @@ static int mca_oob_tcp_create_listen(int *target_sd, uint16_t af_family)
|
||||
/* setup socket options */
|
||||
mca_oob_tcp_set_socket_options(*target_sd);
|
||||
|
||||
/* bind address */
|
||||
memset(&inaddr, 0, sizeof(inaddr));
|
||||
#if OPAL_WANT_IPV6
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = af_family;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
{
|
||||
struct addrinfo hints, *res = NULL;
|
||||
int error;
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = af_family;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
|
||||
if ((error = getaddrinfo(NULL, "0", &hints, &res))) {
|
||||
opal_output (0,
|
||||
"mca_oob_tcp_create_listen: unable to resolve. %s\n",
|
||||
gai_strerror (error));
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
if ((error = getaddrinfo(NULL, "0", &hints, &res))) {
|
||||
opal_output (0,
|
||||
"mca_oob_tcp_create_listen: unable to resolve. %s\n",
|
||||
gai_strerror (error));
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
|
||||
memcpy (&inaddr, res->ai_addr, res->ai_addrlen);
|
||||
addrlen = res->ai_addrlen;
|
||||
freeaddrinfo (res);
|
||||
memcpy (&inaddr, res->ai_addr, res->ai_addrlen);
|
||||
addrlen = res->ai_addrlen;
|
||||
freeaddrinfo (res);
|
||||
|
||||
#ifdef IPV6_V6ONLY
|
||||
/* in case of AF_INET6, disable v4-mapped addresses */
|
||||
if (AF_INET6 == af_family) {
|
||||
int flg = 0;
|
||||
if (setsockopt (*target_sd, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
&flg, sizeof (flg)) < 0) {
|
||||
opal_output(0,
|
||||
"mca_oob_tcp_create_listen: unable to disable v4-mapped addresses\n");
|
||||
/* in case of AF_INET6, disable v4-mapped addresses */
|
||||
if (AF_INET6 == af_family) {
|
||||
int flg = 0;
|
||||
if (setsockopt (*target_sd, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
&flg, sizeof (flg)) < 0) {
|
||||
opal_output(0,
|
||||
"mca_oob_tcp_create_listen: unable to disable v4-mapped addresses\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* IPV6_V6ONLY */
|
||||
#else
|
||||
if (AF_INET == af_family) {
|
||||
struct sockaddr_in * in = (struct sockaddr_in*) &inaddr;
|
||||
in->sin_family = af_family;
|
||||
in->sin_addr.s_addr = INADDR_ANY;
|
||||
in->sin_port = 0;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
} else {
|
||||
if (AF_INET != af_family) {
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
((struct sockaddr_in*) &inaddr)->sin_family = af_family;
|
||||
((struct sockaddr_in*) &inaddr)->sin_addr.s_addr = INADDR_ANY;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
|
||||
if (bind(*target_sd, (struct sockaddr*)&inaddr, addrlen) < 0) {
|
||||
opal_output(0,"mca_oob_tcp_create_listen: bind() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno);
|
||||
return ORTE_ERROR;
|
||||
{ /* Don't reuse ports */
|
||||
int flg = 0;
|
||||
if (setsockopt (*target_sd, SOL_SOCKET, SO_REUSEPORT, &flg, sizeof (flg)) < 0) {
|
||||
opal_output(0, "mca_oob_tcp_create_listen: unable to unset the "
|
||||
"SO_REUSEADDR option (%s:%d)\n",
|
||||
strerror(opal_socket_errno), opal_socket_errno);
|
||||
CLOSE_THE_SOCKET(*target_sd);
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
int index, range, port;
|
||||
|
||||
if( AF_INET == af_family ) {
|
||||
range = mca_oob_tcp_component.tcp_port_range;
|
||||
port = mca_oob_tcp_component.tcp_port_min;
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
range = mca_oob_tcp_component.tcp6_port_range;
|
||||
port = mca_oob_tcp_component.tcp6_port_min;
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
|
||||
for( index = 0; index < range; index++ ) {
|
||||
#if OPAL_WANT_IPV6
|
||||
((struct sockaddr_in6*) &inaddr)->sin6_port = port + index;
|
||||
#else
|
||||
((struct sockaddr_in*) &inaddr)->sin_port = port + index;
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
if(bind(*target_sd, (struct sockaddr*)&inaddr, addrlen) < 0) {
|
||||
if( (EADDRINUSE == opal_socket_errno) || (EADDRNOTAVAIL == opal_socket_errno) ) {
|
||||
continue;
|
||||
}
|
||||
opal_output( 0, "bind() failed: %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno );
|
||||
CLOSE_THE_SOCKET(*target_sd);
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
goto socket_binded;
|
||||
}
|
||||
if( AF_INET == af_family ) {
|
||||
opal_output( 0, "bind() failed: no port available in the range [%d..%d]",
|
||||
mca_oob_tcp_component.tcp_port_min,
|
||||
mca_oob_tcp_component.tcp_port_min + range);
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
opal_output( 0, "bind6() failed: no port available in the range [%d..%d]",
|
||||
mca_oob_tcp_component.tcp6_port_min,
|
||||
mca_oob_tcp_component.tcp6_port_min + range );
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
CLOSE_THE_SOCKET(*target_sd);
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
socket_binded:
|
||||
/* resolve system assigned port */
|
||||
if (getsockname(*target_sd, (struct sockaddr*)&inaddr, &addrlen) < 0) {
|
||||
opal_output(0, "mca_oob_tcp_create_listen: getsockname(): %s (%d)",
|
||||
strerror(opal_socket_errno), opal_socket_errno);
|
||||
CLOSE_THE_SOCKET(*target_sd);
|
||||
return ORTE_ERROR;
|
||||
}
|
||||
|
||||
if (AF_INET == af_family) {
|
||||
mca_oob_tcp_component.tcp_listen_port =
|
||||
((struct sockaddr_in*) &inaddr)->sin_port;
|
||||
} else if (AF_INET6 == af_family) {
|
||||
mca_oob_tcp_component.tcp6_listen_port =
|
||||
((struct sockaddr_in6*) &inaddr)->sin6_port;
|
||||
mca_oob_tcp_component.tcp_listen_port = ((struct sockaddr_in*) &inaddr)->sin_port;
|
||||
mca_oob_tcp_component.tcp_listen_sd = *target_sd;
|
||||
}
|
||||
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
mca_oob_tcp_component.tcp6_listen_port = ((struct sockaddr_in6*) &inaddr)->sin6_port;
|
||||
mca_oob_tcp_component.tcp6_listen_sd = *target_sd;
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
|
||||
/* setup listen backlog to maximum allowed by kernel */
|
||||
if(listen(*target_sd, SOMAXCONN) < 0) {
|
||||
opal_output(0, "mca_oob_tcp_component_init: listen(): %s (%d)",
|
||||
@ -582,7 +656,9 @@ static int mca_oob_tcp_create_listen(int *target_sd, uint16_t af_family)
|
||||
mca_oob_tcp_recv_handler,
|
||||
0);
|
||||
opal_event_add(&mca_oob_tcp_component.tcp_recv_event, 0);
|
||||
} else if (AF_INET6 == af_family) {
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (AF_INET6 == af_family) {
|
||||
opal_event_set(&mca_oob_tcp_component.tcp6_recv_event,
|
||||
*target_sd,
|
||||
OPAL_EV_READ|OPAL_EV_PERSIST,
|
||||
@ -590,7 +666,7 @@ static int mca_oob_tcp_create_listen(int *target_sd, uint16_t af_family)
|
||||
0);
|
||||
opal_event_add(&mca_oob_tcp_component.tcp6_recv_event, 0);
|
||||
}
|
||||
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
return ORTE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -909,8 +985,11 @@ static void mca_oob_tcp_recv_handler(int sd, short flags, void* user)
|
||||
int rc;
|
||||
|
||||
/* accept new connections on the listen socket */
|
||||
if((mca_oob_tcp_component.tcp_listen_sd == sd) ||
|
||||
(mca_oob_tcp_component.tcp6_listen_sd == sd)) {
|
||||
if( (mca_oob_tcp_component.tcp_listen_sd == sd)
|
||||
#if OPAL_WANT_IPV6
|
||||
|| (mca_oob_tcp_component.tcp6_listen_sd == sd)
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
) {
|
||||
mca_oob_tcp_accept(sd);
|
||||
return;
|
||||
}
|
||||
@ -1040,8 +1119,9 @@ mca_oob_t* mca_oob_tcp_component_init(int* priority)
|
||||
|
||||
/* intialize event library */
|
||||
memset(&mca_oob_tcp_component.tcp_recv_event, 0, sizeof(opal_event_t));
|
||||
#if OPAL_WANT_IPV6
|
||||
memset(&mca_oob_tcp_component.tcp6_recv_event, 0, sizeof(opal_event_t));
|
||||
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
return &mca_oob_tcp;
|
||||
}
|
||||
|
||||
@ -1161,12 +1241,14 @@ int mca_oob_tcp_fini(void)
|
||||
if (OOB_TCP_EVENT == mca_oob_tcp_component.tcp_listen_type) {
|
||||
opal_event_del(&mca_oob_tcp_component.tcp_recv_event);
|
||||
CLOSE_THE_SOCKET(mca_oob_tcp_component.tcp_listen_sd);
|
||||
|
||||
mca_oob_tcp_component.tcp_listen_sd = -1;
|
||||
#if OPAL_WANT_IPV6
|
||||
if (mca_oob_tcp_component.tcp6_listen_sd >= 0) {
|
||||
opal_event_del(&mca_oob_tcp_component.tcp6_recv_event);
|
||||
CLOSE_THE_SOCKET(mca_oob_tcp_component.tcp6_listen_sd);
|
||||
mca_oob_tcp_component.tcp6_listen_sd = -1;
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
} else if (OOB_TCP_LISTEN_THREAD == mca_oob_tcp_component.tcp_listen_type) {
|
||||
void *data;
|
||||
/* adi@2007-04-12: Bug, FIXME:
|
||||
@ -1251,10 +1333,13 @@ char* mca_oob_tcp_get_addr(void)
|
||||
if (dev->if_addr.ss_family == AF_INET) {
|
||||
ptr += sprintf(ptr, "tcp://%s:%d", opal_net_get_hostname((struct sockaddr*) &dev->if_addr),
|
||||
ntohs(mca_oob_tcp_component.tcp_listen_port));
|
||||
} else if (dev->if_addr.ss_family == AF_INET6) {
|
||||
}
|
||||
#if OPAL_WANT_IPV6
|
||||
if (dev->if_addr.ss_family == AF_INET6) {
|
||||
ptr += sprintf(ptr, "tcp6://%s:%d", opal_net_get_hostname((struct sockaddr*) &dev->if_addr),
|
||||
ntohs(mca_oob_tcp_component.tcp6_listen_port));
|
||||
}
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
}
|
||||
return contact_info;
|
||||
}
|
||||
|
@ -196,10 +196,6 @@ struct mca_oob_tcp_component_t {
|
||||
mca_oob_base_component_1_0_0_t super; /**< base OOB component */
|
||||
char* tcp_include; /**< list of ip interfaces to include */
|
||||
char* tcp_exclude; /**< list of ip interfaces to exclude */
|
||||
int tcp_listen_sd; /**< listen socket for incoming IPv4 connection requests */
|
||||
unsigned short tcp_listen_port; /**< IPv4 listen port */
|
||||
int tcp6_listen_sd; /**< listen socket for incoming IPv6 connection requests */
|
||||
unsigned short tcp6_listen_port; /**< IPv6 listen port */
|
||||
opal_list_t tcp_peer_list; /**< list of peers sorted in mru order */
|
||||
opal_hash_table_t tcp_peers; /**< peers sorted by name */
|
||||
opal_hash_table_t tcp_peer_names; /**< cache of peer contact info sorted by name */
|
||||
@ -210,7 +206,17 @@ struct mca_oob_tcp_component_t {
|
||||
int tcp_rcvbuf; /**< socket recv buffer size */
|
||||
opal_free_list_t tcp_msgs; /**< free list of messages */
|
||||
opal_event_t tcp_recv_event; /**< event structure for IPv4 recvs */
|
||||
int tcp_listen_sd; /**< listen socket for incoming IPv4 connection requests */
|
||||
unsigned short tcp_listen_port; /**< IPv4 listen port */
|
||||
int tcp_port_min; /**< Minimum allowed port for the OOB listen socket */
|
||||
int tcp_port_range; /**< Range of allowed TCP ports */
|
||||
#if OPAL_WANT_IPV6
|
||||
opal_event_t tcp6_recv_event; /**< event structure for IPv6 recvs */
|
||||
int tcp6_listen_sd; /**< listen socket for incoming IPv6 connection requests */
|
||||
unsigned short tcp6_listen_port; /**< IPv6 listen port */
|
||||
int tcp6_port_min; /**< Minimum allowed port for the OOB listen socket */
|
||||
int tcp6_port_range; /**< Range of allowed TCP ports */
|
||||
#endif /* OPAL_WANT_IPV6 */
|
||||
opal_mutex_t tcp_lock; /**< lock for accessing module state */
|
||||
opal_list_t tcp_events; /**< list of pending events (accepts) */
|
||||
opal_list_t tcp_msg_post; /**< list of recieves user has posted */
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user