This source file includes following definitions.
- if_bsdx_ipv6_open
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 #include "pmix_config.h"
  13 #include "pmix_common.h"
  14 
  15 #include <string.h>
  16 #ifdef HAVE_UNISTD_H
  17 #include <unistd.h>
  18 #endif
  19 #include <errno.h>
  20 #ifdef HAVE_SYS_TYPES_H
  21 #include <sys/types.h>
  22 #endif
  23 #ifdef HAVE_SYS_SOCKET_H
  24 #include <sys/socket.h>
  25 #endif
  26 #ifdef HAVE_SYS_SOCKIO_H
  27 #include <sys/sockio.h>
  28 #endif
  29 #ifdef HAVE_SYS_IOCTL_H
  30 #include <sys/ioctl.h>
  31 #endif
  32 #ifdef HAVE_NETINET_IN_H
  33 #include <netinet/in.h>
  34 #endif
  35 #ifdef HAVE_ARPA_INET_H
  36 #include <arpa/inet.h>
  37 #endif
  38 #ifdef HAVE_NET_IF_H
  39 #include <net/if.h>
  40 #endif
  41 #ifdef HAVE_NETDB_H
  42 #include <netdb.h>
  43 #endif
  44 #ifdef HAVE_IFADDRS_H
  45 #include <ifaddrs.h>
  46 #endif
  47 
  48 #include "src/util/output.h"
  49 #include "src/util/pif.h"
  50 #include "src/mca/pif/pif.h"
  51 #include "src/mca/pif/base/base.h"
  52 
  53 static int if_bsdx_ipv6_open(void);
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 pmix_pif_base_component_t mca_pif_bsdx_ipv6_component = {
  65     
  66 
  67     .base = {
  68         PMIX_PIF_BASE_VERSION_2_0_0,
  69 
  70         
  71         "bsdx_ipv6",
  72         PMIX_MAJOR_VERSION,
  73         PMIX_MINOR_VERSION,
  74         PMIX_RELEASE_VERSION,
  75 
  76         
  77         if_bsdx_ipv6_open,
  78         NULL
  79     },
  80     .data = {
  81         
  82         PMIX_MCA_BASE_METADATA_PARAM_CHECKPOINT
  83     },
  84 };
  85 
  86 
  87 static int if_bsdx_ipv6_open(void)
  88 {
  89     struct ifaddrs **ifadd_list;
  90     struct ifaddrs *cur_ifaddrs;
  91     struct sockaddr_in6* sin_addr;
  92 
  93     pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
  94                         "searching for IPv6 interfaces");
  95 
  96     
  97 
  98 
  99 
 100 
 101     ifadd_list = (struct ifaddrs **) malloc(sizeof(struct ifaddrs*));
 102 
 103     
 104     if (getifaddrs(ifadd_list) < 0) {
 105         pmix_output(0, "pmix_ifinit: getifaddrs() failed with error=%d\n",
 106                     errno);
 107         free(ifadd_list);
 108         return PMIX_ERROR;
 109     }
 110 
 111     for (cur_ifaddrs = *ifadd_list; NULL != cur_ifaddrs;
 112          cur_ifaddrs = cur_ifaddrs->ifa_next) {
 113         pmix_pif_t *intf;
 114         struct in6_addr a6;
 115 
 116         
 117         if (AF_INET6 != cur_ifaddrs->ifa_addr->sa_family) {
 118             pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
 119                                 "skipping non-ipv6 interface %s[%d].\n",
 120                                 cur_ifaddrs->ifa_name, (int)cur_ifaddrs->ifa_addr->sa_family);
 121             continue;
 122         }
 123 
 124         
 125         if (0 == (cur_ifaddrs->ifa_flags & IFF_UP)) {
 126             pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
 127                                 "skipping non-up interface %s.\n", cur_ifaddrs->ifa_name);
 128             continue;
 129         }
 130 
 131         
 132         if (!pmix_if_retain_loopback && 0 != (cur_ifaddrs->ifa_flags & IFF_LOOPBACK)) {
 133             pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
 134                                 "skipping loopback interface %s.\n", cur_ifaddrs->ifa_name);
 135             continue;
 136         }
 137 
 138         
 139         
 140         if (0!= (cur_ifaddrs->ifa_flags & IFF_POINTOPOINT)) {
 141             pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
 142                                 "skipping p2p interface %s.\n", cur_ifaddrs->ifa_name);
 143             continue;
 144         }
 145 
 146         sin_addr = (struct sockaddr_in6 *) cur_ifaddrs->ifa_addr;
 147 
 148         
 149 
 150 
 151 
 152 
 153 
 154 
 155 
 156 
 157 
 158 
 159         if ((IN6_IS_ADDR_LINKLOCAL (&sin_addr->sin6_addr))) {
 160             pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
 161                                 "skipping link-local ipv6 address on interface "
 162                                 "%s with scope %d.\n",
 163                                 cur_ifaddrs->ifa_name, sin_addr->sin6_scope_id);
 164             continue;
 165         }
 166 
 167         if (0 < pmix_output_get_verbosity(pmix_pif_base_framework.framework_output)) {
 168             char *addr_name = (char *) malloc(48*sizeof(char));
 169             inet_ntop(AF_INET6, &sin_addr->sin6_addr, addr_name, 48*sizeof(char));
 170             pmix_output(0, "ipv6 capable interface %s discovered, address %s.\n",
 171                         cur_ifaddrs->ifa_name, addr_name);
 172             free(addr_name);
 173         }
 174 
 175         
 176         memcpy(&a6, &(sin_addr->sin6_addr), sizeof(struct in6_addr));
 177 
 178         intf = PMIX_NEW(pmix_pif_t);
 179         if (NULL == intf) {
 180             pmix_output(0, "pmix_ifinit: unable to allocate %lu bytes\n",
 181                         sizeof(pmix_pif_t));
 182             free(ifadd_list);
 183             return PMIX_ERR_OUT_OF_RESOURCE;
 184         }
 185         intf->af_family = AF_INET6;
 186         pmix_strncpy(intf->if_name, cur_ifaddrs->ifa_name, IF_NAMESIZE-1);
 187         intf->if_index = pmix_list_get_size(&pmix_if_list) + 1;
 188         ((struct sockaddr_in6*) &intf->if_addr)->sin6_addr = a6;
 189         ((struct sockaddr_in6*) &intf->if_addr)->sin6_family = AF_INET6;
 190 
 191         
 192         ((struct sockaddr_in6*) &intf->if_addr)->sin6_scope_id = 0;
 193 
 194         
 195 
 196 
 197         intf->if_mask = 64;
 198         intf->if_flags = cur_ifaddrs->ifa_flags;
 199 
 200         
 201 
 202 
 203 
 204 
 205         intf->if_kernel_index =
 206             (uint16_t) if_nametoindex(cur_ifaddrs->ifa_name);
 207         pmix_list_append(&pmix_if_list, &(intf->super));
 208     }   
 209 
 210     free(ifadd_list);
 211 
 212     return PMIX_SUCCESS;
 213 }