1
1

A couple cleanups for the IPv6 support:

- make opal_sockaddr2str() take a sockaddr_storage instead of a sockaddr_in6
    so that it works for IPv4 and IPv6 addresses, and remove a whole bunch
    of #ifs in the OOOB code.
  - Fix a compiler warning in the TCP BTL due to run-time determined
    array size by making it a dynamicly allocated array.
  - Fix the unpacking code of IPv4 addresses when using IPv6 support, so
    that the address is in the correct location (instead of in an IPv6
    structure, use an IPv4 structure).  Refs trac:1005.

This commit was SVN r14514.

The following Trac tickets were found above:
  Ticket 1005 --> https://svn.open-mpi.org/trac/ompi/ticket/1005
Этот коммит содержится в:
Brian Barrett 2007-04-25 19:08:07 +00:00
родитель d01125f051
Коммит 4b8bb70afb
11 изменённых файлов: 73 добавлений и 114 удалений

Просмотреть файл

@ -361,21 +361,25 @@ static int mca_btl_tcp_component_create_instances(void)
const int if_count = opal_ifcount();
int if_index;
int kif_count = 0;
int kindexes[if_count]; /* this array is way too large, but never too small */
int *kindexes = NULL; /* this array is way too large, but never too small */
char **include;
char **exclude;
char **argv;
int ret = OMPI_SUCCESS;
if(if_count <= 0) {
return OMPI_ERROR;
}
kindexes = malloc(sizeof(int) * if_count);
if (NULL == kindexes) return OMPI_ERR_OUT_OF_RESOURCE;
/* calculate the number of kernel indexes (number of physical NICs) */
{
int j;
/* initialize array to 0. Assumption: 0 isn't a valid kernel index */
memset (&kindexes, 0, sizeof (kindexes));
memset (kindexes, 0, sizeof(int) * if_count);
/* assign the corresponding kernel indexes for all opal_list indexes
* (loop over all addresses)
@ -402,7 +406,8 @@ static int mca_btl_tcp_component_create_instances(void)
mca_btl_tcp_component.tcp_btls = (mca_btl_tcp_module_t**)malloc(mca_btl_tcp_component.tcp_num_links *
kif_count * sizeof(mca_btl_tcp_module_t*));
if(NULL == mca_btl_tcp_component.tcp_btls) {
return OMPI_ERR_OUT_OF_RESOURCE;
ret = OMPI_ERR_OUT_OF_RESOURCE;
goto cleanup;
}
mca_btl_tcp_component.tcp_addr_count = if_count;
@ -420,8 +425,10 @@ static int mca_btl_tcp_component_create_instances(void)
argv++;
}
opal_argv_free(include);
if(mca_btl_tcp_component.tcp_num_btls)
return OMPI_SUCCESS;
if(mca_btl_tcp_component.tcp_num_btls) {
ret = OMPI_SUCCESS;
goto cleanup;
}
/* if the interface list was not specified by the user, create
* a BTL for each interface that was not excluded.
@ -454,7 +461,10 @@ static int mca_btl_tcp_component_create_instances(void)
}
}
opal_argv_free(exclude);
return OMPI_SUCCESS;
cleanup:
if (NULL != kindexes) free(kindexes);
return ret;
}
/*

Просмотреть файл

@ -614,11 +614,7 @@ static int mca_btl_tcp_endpoint_start_connect(mca_btl_base_endpoint_t* btl_endpo
}
{
char *address;
#if OPAL_WANT_IPV6
address = (char *) opal_sockaddr2str((struct sockaddr_in6*)&endpoint_addr);
#else
address = inet_ntoa(btl_endpoint->endpoint_addr->addr_inet._union_inet._addr__inet._addr_inet);
#endif
address = opal_sockaddr2str((struct sockaddr_storage*) &endpoint_addr);
BTL_PEER_ERROR( btl_endpoint->endpoint_proc->proc_ompi,
( "Unable to connect to the peer %s on port %d: %s\n",
address,

Просмотреть файл

@ -37,7 +37,6 @@
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);
static bool is_private_ipv4(struct in_addr *in);
OBJ_CLASS_INSTANCE(
@ -76,28 +75,6 @@ void mca_btl_tcp_proc_destruct(mca_btl_tcp_proc_t* proc)
}
/*
* Check to see if an IPv4 struct in_addr is public or private. We
* can only do IPv4 here because some of the TCP BTL endpoint structs
* only hold the struct in_addr, not the upper-level sin_family that
* would indicate if the address is IPv6.
*/
static bool is_private_ipv4(struct in_addr *in)
{
/* There are definitely ways to do this more efficiently, but
since this is not performance-critical code, it seems better to
use clear code (vs. clever code) */
uint32_t addr = ntohl((uint32_t) in->s_addr);
unsigned int a = (addr & 0xff000000) >> 24;
unsigned int b = (addr & 0x00ff0000) >> 16;
return ((10 == a) ||
(192 == a && 168 == b) ||
(172 == a && 16 == b)) ? true : false;
}
/*
* Create a TCP process structure. There is a one-to-one correspondence
* between a ompi_proc_t and a mca_btl_tcp_proc_t instance. We cache
@ -191,7 +168,6 @@ int mca_btl_tcp_proc_insert(
mca_btl_tcp_proc_t* btl_proc,
mca_btl_base_endpoint_t* btl_endpoint)
{
struct mca_btl_tcp_module_t *btl_tcp = btl_endpoint->endpoint_btl;
size_t i;
struct sockaddr_storage endpoint_addr_ss;

Просмотреть файл

@ -1193,13 +1193,14 @@ int opal_ifkindextoname(int if_kindex, char* if_name, int length)
return OPAL_ERROR;
}
#if OPAL_WANT_IPV6
char*
opal_sockaddr2str(struct sockaddr_in6 *addr)
opal_sockaddr2str(struct sockaddr_storage *ss_addr)
{
#if OPAL_WANT_IPV6
char *name = (char *)malloc((NI_MAXHOST + 1) * sizeof(char));
int error;
socklen_t addrlen;
struct sockaddr_in6 *addr = (struct sockaddr_in6*) ss_addr;
OMPI_DEBUG_ZERO(*name);
if (NULL == name) {
@ -1239,8 +1240,11 @@ opal_sockaddr2str(struct sockaddr_in6 *addr)
}
return name;
}
#else
struct sockaddr_in *addr = (struct sockaddr_in*) ss_addr;
return inet_ntoa(addr->sin_addr);
#endif
}
bool
opal_ifislocalhost(struct sockaddr_storage *addr)
@ -1413,6 +1417,7 @@ bool opal_addr_isipv4public (struct sockaddr_storage *addr)
return false;
}
#else /* HAVE_STRUCT_SOCKADDR_IN */
/* if we don't have struct sockaddr_in, we don't have traditional
@ -1518,9 +1523,16 @@ opal_iffinalize(void)
return OPAL_SUCCESS;
}
char*
opal_sockaddr2str(struct sockaddr_storage *ss_addr)
{
return NULL;
}
bool
opal_addr_isipv4public (struct sockaddr_storage *addr)
{
return false;
}
#endif /* HAVE_STRUCT_SOCKADDR_IN */

Просмотреть файл

@ -32,9 +32,7 @@
#include <netinet/in.h>
#endif
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
BEGIN_C_DECLS
/**
* Calculate netmask in network byte order from CIDR notation
@ -190,24 +188,13 @@ OPAL_DECLSPEC bool opal_samenetwork(struct sockaddr_storage *addr1,
struct sockaddr_storage *addr2,
uint32_t prefixlen);
#if OPAL_WANT_IPV6
/**
* Convert sockaddr_in6 to string
* Convert sockaddr_storage to string
*
* @param addr struct sockaddr_in6 of address
* @param addr struct sockaddr_storage of address
* @return literal representation of \c addr
*/
OPAL_DECLSPEC char* opal_sockaddr2str(struct sockaddr_in6 *addr);
#endif
/**
* Finalize the functions to release malloc'd data
*
* @param none
* @return OPAL_SUCCESS if no problems encountered
* @return OPAL_ERROR if data could not be released
*/
OPAL_DECLSPEC int opal_iffinalize(void);
OPAL_DECLSPEC char* opal_sockaddr2str(struct sockaddr_storage *addr);
/**
* Is the given address a public IPv4 address?
@ -217,9 +204,16 @@ OPAL_DECLSPEC int opal_iffinalize(void);
*/
OPAL_DECLSPEC bool opal_addr_isipv4public(struct sockaddr_storage *addr);
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif
/**
* Finalize the functions to release malloc'd data
*
* @param none
* @return OPAL_SUCCESS if no problems encountered
* @return OPAL_ERROR if data could not be released
*/
OPAL_DECLSPEC int opal_iffinalize(void);
END_C_DECLS
#endif

Просмотреть файл

@ -390,11 +390,10 @@ static void mca_oob_tcp_accept(int incoming_sd)
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_CONNECT) {
opal_output(0, "[%lu,%lu,%lu] mca_oob_tcp_accept: %s:%d\n",
ORTE_NAME_ARGS(orte_process_info.my_name),
opal_sockaddr2str((struct sockaddr_storage*) &addr),
#if OPAL_WANT_IPV6
opal_sockaddr2str(&addr),
addr.sin6_port
#else
inet_ntoa(addr.sin_addr),
addr.sin_port
#endif
);
@ -1489,11 +1488,7 @@ char* mca_oob_tcp_get_addr(void)
*ptr = 0;
for(i=opal_ifbegin(); i>0; i=opal_ifnext(i)) {
#if OPAL_WANT_IPV6
struct sockaddr_in6 addr;
#else
struct sockaddr_in addr;
#endif
struct sockaddr_storage addr;
char name[32];
opal_ifindextoname(i, name, sizeof(name));
if (mca_oob_tcp_component.tcp_include != NULL &&
@ -1504,28 +1499,27 @@ char* mca_oob_tcp_get_addr(void)
strstr(mca_oob_tcp_component.tcp_exclude,name) != NULL) {
continue;
}
opal_ifindextoaddr(i, (struct sockaddr_storage*)&addr, sizeof(addr));
opal_ifindextoaddr(i, &addr, sizeof(addr));
if(opal_ifcount() > 1 &&
opal_ifislocalhost((struct sockaddr_storage*) &addr)) {
opal_ifislocalhost(&addr)) {
continue;
}
if(ptr != contact_info) {
ptr += sprintf(ptr, ";");
}
#if OPAL_WANT_IPV6
if (addr.sin6_family == AF_INET) {
if (addr.ss_family == AF_INET) {
ptr += sprintf(ptr, "tcp://%s:%d", opal_sockaddr2str(&addr),
ntohs(mca_oob_tcp_component.tcp_listen_port));
}
if (addr.sin6_family == AF_INET6) {
#if OPAL_WANT_IPV6
if (addr.ss_family == AF_INET6) {
ptr += sprintf(ptr, "tcp6://%s:%d", opal_sockaddr2str(&addr),
ntohs(mca_oob_tcp_component.tcp6_listen_port));
}
#else
ptr += sprintf(ptr, "tcp://%s:%d", inet_ntoa(addr.sin_addr),
ntohs(mca_oob_tcp_component.tcp_listen_port));
#endif
}
return contact_info;
}

Просмотреть файл

@ -110,11 +110,11 @@ int mca_oob_tcp_addr_pack(orte_buffer_t* buffer)
#if OPAL_WANT_IPV6
case AF_INET6:
type = MCA_OOB_TCP_ADDR_TYPE_AFINET6;
port =mca_oob_tcp_component.tcp6_listen_port;
port = mca_oob_tcp_component.tcp6_listen_port;
orte_dss.pack(buffer, &type, 1, ORTE_INT8);
orte_dss.pack(buffer, &port, sizeof (port), ORTE_BYTE);
orte_dss.pack(buffer, &((struct sockaddr_in6*)&inaddr)->sin6_addr,
4, ORTE_BYTE);
16, ORTE_BYTE);
break;
#endif
default:
@ -182,11 +182,7 @@ mca_oob_tcp_addr_t* mca_oob_tcp_addr_unpack(orte_buffer_t* buffer)
switch (type) {
case MCA_OOB_TCP_ADDR_TYPE_AFINET:
{
#if OPAL_WANT_IPV6
struct sockaddr_in6* target;
#else
struct sockaddr_in* target;
#endif
uint32_t ipaddr;
count = sizeof (ipaddr);
rc = orte_dss.unpack(buffer, &ipaddr, &count, ORTE_BYTE);
@ -194,25 +190,19 @@ mca_oob_tcp_addr_t* mca_oob_tcp_addr_unpack(orte_buffer_t* buffer)
OBJ_RELEASE(addr);
return NULL;
}
#if OPAL_WANT_IPV6
target = (struct sockaddr_in6*)&(addr->addr_inet[i]);
target->sin6_family = AF_INET;
target->sin6_port = port;
memcpy(&target->sin6_addr, &ipaddr, sizeof (ipaddr));
#else
target = (struct sockaddr_in*)&(addr->addr_inet[i]);
target->sin_family = AF_INET;
target->sin_port = port;
target->sin_addr.s_addr = ipaddr;
#endif
}
break;
#if OPAL_WANT_IPV6
case MCA_OOB_TCP_ADDR_TYPE_AFINET6:
{
uint32_t address[4];
uint8_t address[16];
struct sockaddr_in6* target;
count = 4;
count = 16;
rc = orte_dss.unpack(buffer, &address, &count, ORTE_BYTE);
if(rc != ORTE_SUCCESS) {
OBJ_RELEASE(addr);

Просмотреть файл

@ -33,9 +33,8 @@
#include "orte/dss/dss.h"
#include "opal/class/opal_object.h"
#include "orte/mca/ns/ns_types.h"
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
BEGIN_C_DECLS
#define MCA_OOB_TCP_ADDR_UNCLASSIFIED 0 /* we don't know anything */
#define MCA_OOB_TCP_ADDR_MATCHED 1 /* peer has IP on the same LAN */
@ -96,9 +95,7 @@ int mca_oob_tcp_addr_insert(mca_oob_tcp_addr_t*, const struct sockaddr_in*);
int mca_oob_tcp_addr_get_next(mca_oob_tcp_addr_t*, struct sockaddr_storage*);
END_C_DECLS
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif
#endif

Просмотреть файл

@ -307,8 +307,8 @@ bool mca_oob_tcp_msg_recv_handler(mca_oob_tcp_msg_t* msg, struct mca_oob_tcp_pee
msg->msg_rwiov[1].iov_len = 0;
msg->msg_rwnum = 0;
}
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_CONNECT) {
opal_output(0, "[%lu,%lu,%lu]-[%lu,%lu,%lu] mca_oob_tcp_recv_handler*: size %lu\n",
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_INFO) {
opal_output(0, "[%lu,%lu,%lu]-[%lu,%lu,%lu] mca_oob_tcp_msg_recv_handler: size %lu\n",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(&(peer->peer_name)),
(unsigned long)(msg->msg_hdr.msg_size) );

Просмотреть файл

@ -324,11 +324,10 @@ static int mca_oob_tcp_peer_try_connect(mca_oob_tcp_peer_t* peer)
ORTE_NAME_ARGS(&(peer->peer_name)),
/* Bug, FIXME: output tcp6_listen_port for AF_INET6 */
ntohs(mca_oob_tcp_component.tcp_listen_port),
opal_sockaddr2str((struct sockaddr_storage*) &inaddr),
#if OPAL_WANT_IPV6
opal_sockaddr2str(&inaddr),
ntohs(inaddr.sin6_port)
#else
inet_ntoa(inaddr.sin_addr),
ntohs(inaddr.sin_port)
#endif
);
@ -386,11 +385,10 @@ static int mca_oob_tcp_peer_try_connect(mca_oob_tcp_peer_t* peer)
"connect to %s:%d failed: %s (%d)",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(&(peer->peer_name)),
opal_sockaddr2str((struct sockaddr_storage*) &inaddr),
#if OPAL_WANT_IPV6
opal_sockaddr2str (&inaddr),
ntohs(inaddr.sin6_port),
#else
inet_ntoa(inaddr.sin_addr),
ntohs(inaddr.sin_port),
#endif
strerror(opal_socket_errno),
@ -419,11 +417,10 @@ static int mca_oob_tcp_peer_try_connect(mca_oob_tcp_peer_t* peer)
"mca_oob_tcp_peer_send_connect_ack to %s:%d failed: %s (%d)",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(&(peer->peer_name)),
opal_sockaddr2str((struct sockaddr_storage*) &inaddr),
#if OPAL_WANT_IPV6
opal_sockaddr2str (&inaddr),
ntohs(inaddr.sin6_port),
#else
inet_ntoa(inaddr.sin_addr),
/* if we didn't successfully connect, wait 1 second and then try again */
ntohs(inaddr.sin_port),
#endif
@ -437,11 +434,10 @@ static int mca_oob_tcp_peer_try_connect(mca_oob_tcp_peer_t* peer)
"connect to %s:%d failed, connecting over all interfaces failed!",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(&(peer->peer_name)),
opal_sockaddr2str((struct sockaddr_storage*) &inaddr),
#if OPAL_WANT_IPV6
opal_sockaddr2str (&inaddr),
ntohs(inaddr.sin6_port)
#else
inet_ntoa(inaddr.sin_addr),
ntohs(inaddr.sin_port)
#endif
);
@ -1137,15 +1133,9 @@ static void mca_oob_tcp_peer_dump(mca_oob_tcp_peer_t* peer, const char* msg)
opal_socklen_t optlen;
getsockname(peer->peer_sd, (struct sockaddr*)&inaddr, &addrlen);
#if OPAL_WANT_IPV6
sprintf(src, "%s", opal_sockaddr2str(&inaddr));
sprintf(src, "%s", opal_sockaddr2str((struct sockaddr_storage*) &inaddr));
getpeername(peer->peer_sd, (struct sockaddr*)&inaddr, &addrlen);
sprintf(dst, "%s", opal_sockaddr2str(&inaddr));
#else
sprintf(src, "%s", inet_ntoa(inaddr.sin_addr));
getpeername(peer->peer_sd, (struct sockaddr*)&inaddr, &addrlen);
sprintf(dst, "%s", inet_ntoa(inaddr.sin_addr));
#endif
sprintf(dst, "%s", opal_sockaddr2str((struct sockaddr_storage*) &inaddr));
if((flags = fcntl(peer->peer_sd, F_GETFL, 0)) < 0) {
opal_output(0, "mca_oob_tcp_peer_dump: fcntl(F_GETFL) failed: %s (%d)\n",

Просмотреть файл

@ -64,7 +64,7 @@ int mca_oob_tcp_recv(
return msg->msg_rc;
}
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_CONNECT) {
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_INFO) {
opal_output(0, "[%lu,%lu,%lu]-[%lu,%lu,%lu] mca_oob_tcp_recv*unexpected*: tag %d size %lu\n",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(peer),
@ -116,7 +116,7 @@ int mca_oob_tcp_recv(
size += iov[i].iov_len;
}
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_CONNECT) {
if (mca_oob_tcp_component.tcp_debug >= OOB_TCP_DEBUG_INFO) {
opal_output(0, "[%lu,%lu,%lu]-[%lu,%lu,%lu] mca_oob_tcp_recv*expected*: tag %d size %lu\n",
ORTE_NAME_ARGS(orte_process_info.my_name),
ORTE_NAME_ARGS(peer),