summaryrefslogtreecommitdiff
path: root/parallel/openmpi/patches/patch-ah
diff options
context:
space:
mode:
Diffstat (limited to 'parallel/openmpi/patches/patch-ah')
-rw-r--r--parallel/openmpi/patches/patch-ah174
1 files changed, 174 insertions, 0 deletions
diff --git a/parallel/openmpi/patches/patch-ah b/parallel/openmpi/patches/patch-ah
new file mode 100644
index 00000000000..ff603615f22
--- /dev/null
+++ b/parallel/openmpi/patches/patch-ah
@@ -0,0 +1,174 @@
+$NetBSD: patch-ah,v 1.1.1.1 2009/12/12 23:30:01 asau Exp $
+
+Rewrite network interface configuration using getifaddrs(3) for BSD,
+this should fix OpenMPI for NetBSD. By Kevin M. Buckley.
+
+--- opal/util/if.c.orig 2009-12-08 23:36:09.000000000 +0300
++++ opal/util/if.c 2009-12-13 00:06:38.000000000 +0300
+@@ -38,6 +38,9 @@
+ #endif
+ #ifdef HAVE_NETINET_IN_H
+ #include <netinet/in.h>
++#if defined(__DragonFly__)
++#define IN_LINKLOCAL(i) (((u_int32_t)(i) & 0xffff0000) == 0xa9fe0000)
++#endif
+ #endif
+ #ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
+@@ -164,6 +167,145 @@
+ false, false, (int)false, &sd);
+ do_not_resolve = OPAL_INT_TO_BOOL(sd);
+
++#if defined(__NetBSD__) || defined(__FreeBSD__) || \
++ defined(__OpenBSD__) || defined(__DragonFly__)
++ /* configure using getifaddrs(3) */
++ {
++ 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;
++
++ /* Do we really need to skip link-local addresses? */
++#if 0
++ /* skip link local address: */
++ if(IN_LINKLOCAL (htonl(((struct sockaddr_in*)cur_ifaddrs->ifa_addr)->sin_addr.s_addr))) {
++#if 0
++ opal_output(0, "opal_ifinit: skipping link-local ip address on interface %s.\n",
++ cur_ifaddrs->ifa_name);
++#endif
++ continue;
++ }
++#endif
++
++ 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 */
++
++ }
++#else
+ /* create the internet socket to test off */
+ /*
+ Change AF_INET to AF_UNSPEC (or AF_INET6) and everything will fail.
+@@ -356,6 +498,10 @@
+ }
+ free(ifconf.ifc_req);
+ close(sd);
++
++#endif /* anything other than {Net,Open,Free}BSD and DragonFly */
++
++
+ #if OPAL_WANT_IPV6
+ #ifdef __linux__ /* Linux does not have SIOCGL*, so parse
+ /proc/net/if_inet6 instead */