Excellent! Once you get some more definitive results, could you send this in patch form?
On Dec 3, 2009, at 7:05 PM, <kevin.buck...@ecs.vuw.ac.nz> <kevin.buck...@ecs.vuw.ac.nz> wrote: > >> I have actually already taken the IPv6 block and simply tried to > >> replace any IPv6 stuff with IPv4 "equivalents", eg: > > > > At the risk of showing a lot of ignorance, here's the block I coddled > > together based on the IPv6 block. > > > > I have tried to keep it looking as close to the original IPv6 > > block as possible. > > OK, I now have something that seems to work without generating > any error messages. > > I'll post it here for reference and try and make a PkgSrc patch > once I get access to the WIP tree for the NetBSD port of OpenMPI, > which will make more sense to Aleksej. > > The main difference between this and the IPv6 block is the > extra: > > ((struct sockaddr_in*) &intf.if_addr)->sin_len = > cur_ifaddrs->ifa_addr->sa_len; > > line just below the > > /* fill values into the opal_if_t */ > > stanza. > > The errors I posted as seeing relating to > > opal_sockaddr2str failed:Temporary failure in name resolution (return code 4) > > were arising because the sin_len was appearing as 0 after the > interface had been placed into the opal_list. > > Given that the getifaddrs code can handle both IPv4 and IPv6, there > may not be a need to have two loops, one for each protocol but I > am not going to make such a major change at present, indeed, my > code probably needs tarting up. > > But anyroad, here the block as it stands > > #if defined(__NetBSD__) > /* || defined(__OpenBSD__) || defined(__FreeBSD__) || \ > defined(__386BSD__) || defined(__bsdi__) || > defined(__APPLE__) */ > /* || defined(__linux__) */ > > { > OBJ_CONSTRUCT(&opal_if_list, opal_list_t); > > struct ifaddrs **ifadd_list; > struct ifaddrs *cur_ifaddrs; > struct sockaddr_in* sin_addr; > > /* > * the manpage claims that getifaddrs() allocates the memory, > * and freeifaddrs() is later used to release the allocated memory. > * however, without this malloc the call to getifaddrs() segfaults > */ > ifadd_list = (struct ifaddrs **) malloc(sizeof(struct ifaddrs*)); > > /* create the linked list of ifaddrs structs */ > if(getifaddrs(ifadd_list) < 0) { > opal_output(0, "opal_ifinit: getifaddrs() failed with > error=%d\n", > errno); > return OPAL_ERROR; > } > > for(cur_ifaddrs = *ifadd_list; NULL != cur_ifaddrs; > cur_ifaddrs = cur_ifaddrs->ifa_next) { > > opal_if_t intf; > opal_if_t *intf_ptr; > struct in_addr a4; > > #if 0 > printf("interface %s.\n", cur_ifaddrs->ifa_name); > #endif > /* skip non- af_inet interface addresses */ > if(AF_INET != cur_ifaddrs->ifa_addr->sa_family) { > #if 0 > printf("skipping non- af_inet interface %s, family %d.\n", > cur_ifaddrs->ifa_name, cur_ifaddrs->ifa_addr->sa_family); > #endif > continue; > } > > /* skip interface if it is down (IFF_UP not set) */ > if(0 == (cur_ifaddrs->ifa_flags & IFF_UP)) { > #if 0 > printf("skipping non-up interface %s.\n", > cur_ifaddrs->ifa_name); > #endif > continue; > } > > /* skip interface if it is a loopback device (IFF_LOOPBACK > set) */ > /* or if it is a point-to-point interface */ > /* TODO: do we really skip p2p? */ > if(0 != (cur_ifaddrs->ifa_flags & IFF_LOOPBACK) > || 0!= (cur_ifaddrs->ifa_flags & IFF_POINTOPOINT)) { > #if 0 > printf("skipping loopback interface %s.\n", > cur_ifaddrs->ifa_name); > #endif > continue; > } > > #if 0 > printf("sa_len %d.\n", cur_ifaddrs->ifa_addr->sa_len); > #endif > sin_addr = (struct sockaddr_in *) cur_ifaddrs->ifa_addr; > > /* There shouldn't be any IPv6 address starting with fe80: to > skip */ > > memset(&intf, 0, sizeof(intf)); > OBJ_CONSTRUCT(&intf, opal_list_item_t); > #if 0 > char *addr_name = (char *) malloc(48*sizeof(char)); > inet_ntop(AF_INET, &sin_addr->sin_addr, addr_name, > 48*sizeof(char)); > opal_output(0, "inet capable interface %s discovered, address > %s.\n", > cur_ifaddrs->ifa_name, addr_name); > free(addr_name); > #endif > > /* fill values into the opal_if_t */ > memcpy(&a4, &(sin_addr->sin_addr), sizeof(struct in_addr)); > > strncpy(intf.if_name, cur_ifaddrs->ifa_name, IF_NAMESIZE); > intf.if_index = opal_list_get_size(&opal_if_list) + 1; > ((struct sockaddr_in*) &intf.if_addr)->sin_addr = a4; > ((struct sockaddr_in*) &intf.if_addr)->sin_family = AF_INET; > ((struct sockaddr_in*) &intf.if_addr)->sin_len = > cur_ifaddrs->ifa_addr->sa_len; > > /* since every scope != 0 is ignored, we just set the scope to > 0 */ > /* There's no scope_id in the non-ipv6 stuff > ((struct sockaddr_in6*) &intf.if_addr)->sin6_scope_id = 0; > */ > > /* > * hardcoded netmask, adrian says that's ok > */ > /* Non-NetBSD uses intf.if_mask = prefix(((struct sockaddr_in*) > &ifr->ifr_addr)->sin_addr.s_addr); */ > /* intf.if_mask = 64; */ > intf.if_mask = prefix( sin_addr->sin_addr.s_addr); > intf.if_flags = cur_ifaddrs->ifa_flags; > > /* > * FIXME: figure out how to gain access to the kernel index > * (or create our own), getifaddrs() does not contain such > * data > */ > > intf.if_kernel_index = (uint16_t) > if_nametoindex(cur_ifaddrs->ifa_name); > > intf_ptr = (opal_if_t*) calloc(1, sizeof(opal_if_t)); > if(NULL == intf_ptr) { > opal_output(0, "opal_ifinit: unable to allocate %lu bytes\n", > sizeof(opal_if_t)); > OBJ_DESTRUCT(&intf); > return OPAL_ERR_OUT_OF_RESOURCE; > } > memcpy(intf_ptr, &intf, sizeof(intf)); > > #if 0 > printf("About to append interface %s.\n", cur_ifaddrs->ifa_name); > #endif > /* opal_list_append(&opal_if_list, &intf_ptr->super); */ > opal_list_append(&opal_if_list, (opal_list_item_t*) intf_ptr); > > OBJ_DESTRUCT(&intf); > } /* of for loop over ifaddrs list */ > > } > #endif /* netbsd */ > > > -- > Kevin M. Buckley Room: CO327 > School of Engineering and Phone: +64 4 463 5971 > Computer Science > Victoria University of Wellington > New Zealand > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users > -- Jeff Squyres jsquy...@cisco.com