I believe this line is incorrect: > opal_list_append(&opal_if_list, (opal_list_item_t*) intf_ptr);
It needs to be opal_list_append(&opal_if_list, &intf_ptr->super); On Dec 2, 2009, at 4:46 PM, 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. > > Note the little printf near the end. > > #if defined(__NetBSD__) > /* || defined(__OpenBSD__) || defined(__FreeBSD__) || \ > defined(__386BSD__) || defined(__bsdi__) || > defined(__APPLE__) */ > /* || defined(__linux__) */ > > { > 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; > > /* skip non- af_inet interface addresses */ > if(AF_INET != cur_ifaddrs->ifa_addr->sa_family) { > #if 0 > printf("skipping non- af_inet interface %s.\n", > cur_ifaddrs->ifa_name); > #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; > } > > 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, &in_addr->s_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; > > /* 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 > */ > intf.if_mask = 64; > 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)); > > printf("About to append interface %s.\n", cur_ifaddrs->ifa_name); > > opal_list_append(&opal_if_list, (opal_list_item_t*) intf_ptr); > OBJ_DESTRUCT(&intf); > } /* of for loop over ifaddrs list */ > > } > #endif /* netbsd */ > > What I get when I try to do an mpirun -n 4 hello_f77 is now > > About to append interface wm0. > [europa:27981] *** Process received signal *** > [europa:27981] Signal: Segmentation fault (11) > [europa:27981] Signal code: Address not mapped (1) > [europa:27981] Failing at address: 0x8 > [europa:27981] *** End of error message *** > Segmentation fault > > So I am not tripping up on the iotctls anymore ! > > Maybe that will shed some light for someone else. > > > -- > 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