1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
2 /*
3  * Copyright (c) 2010-2013 Cisco Systems, Inc.  All rights reserved.
4  * Copyright (c) 2015      Los Alamos National Security, LLC. All rights
5  *                         reserved.
6  * Copyright (c) 2018      Amazon.com, Inc. or its affiliates.  All Rights
7  *                         reserved.
8  * $COPYRIGHT$
9  *
10  * Additional copyrights may follow
11  *
12  * $HEADER$
13  */
14 
15 #ifndef OPAL_MCA_IF_IF_H
16 #define OPAL_MCA_IF_IF_H
17 
18 #include "opal_config.h"
19 
20 #include <string.h>
21 #ifdef HAVE_UNISTD_H
22 #include <unistd.h>
23 #endif
24 #include <errno.h>
25 #ifdef HAVE_SYS_TYPES_H
26 #include <sys/types.h>
27 #endif
28 #ifdef HAVE_SYS_SOCKET_H
29 #include <sys/socket.h>
30 #endif
31 #ifdef HAVE_SYS_SOCKIO_H
32 #include <sys/sockio.h>
33 #endif
34 #ifdef HAVE_SYS_IOCTL_H
35 #include <sys/ioctl.h>
36 #endif
37 #ifdef HAVE_NETINET_IN_H
38 #include <netinet/in.h>
39 #endif
40 #ifdef HAVE_ARPA_INET_H
41 #include <arpa/inet.h>
42 #endif
43 #ifdef HAVE_NET_IF_H
44 #include <net/if.h>
45 #endif
46 #ifdef HAVE_NETDB_H
47 #include <netdb.h>
48 #endif
49 #ifdef HAVE_IFADDRS_H
50 #include <ifaddrs.h>
51 #endif
52 
53 #include "opal/util/if.h"
54 #include "opal/mca/mca.h"
55 #include "opal/mca/base/base.h"
56 
57 BEGIN_C_DECLS
58 
59 /*
60  * Define INADDR_NONE if we don't have it.  Solaris is the only system
61  * where I have found that it does not exist, and the man page for
62  * inet_addr() says that it returns -1 upon failure.  On Linux and
63  * other systems with INADDR_NONE, it's just a #define to -1 anyway.
64  * So just #define it to -1 here if it doesn't already exist.
65  */
66 
67 #if !defined(INADDR_NONE)
68 #define INADDR_NONE -1
69 #endif
70 
71 #define DEFAULT_NUMBER_INTERFACES 10
72 #define MAX_IFCONF_SIZE 10 * 1024 * 1024
73 
74 
75 typedef struct opal_if_t {
76     opal_list_item_t     super;
77     char                if_name[IF_NAMESIZE];
78     int                 if_index;
79     uint16_t            if_kernel_index;
80     uint16_t            af_family;
81     int                 if_flags;
82     int                 if_speed;
83     struct sockaddr_storage  if_addr;
84     uint32_t            if_mask;
85     uint32_t            if_bandwidth;
86     uint8_t             if_mac[6];
87     int                 ifmtu; /* Can't use if_mtu because of a
88                                   #define collision on some BSDs */
89 } opal_if_t;
90 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_if_t);
91 
92 
93 /* "global" list of available interfaces */
94 OPAL_DECLSPEC extern opal_list_t opal_if_list;
95 
96 /* global flags */
97 OPAL_DECLSPEC extern bool opal_if_do_not_resolve;
98 OPAL_DECLSPEC extern bool opal_if_retain_loopback;
99 
100 /**
101  * Structure for if components.
102  */
103 struct opal_if_base_component_2_0_0_t {
104     /** MCA base component */
105     mca_base_component_t component;
106     /** MCA base data */
107     mca_base_component_data_t component_data;
108 };
109 /**
110  * Convenience typedef
111  */
112 typedef struct opal_if_base_component_2_0_0_t opal_if_base_component_t;
113 
114 /*
115  * Macro for use in components that are of type if
116  */
117 #define OPAL_IF_BASE_VERSION_2_0_0 \
118     OPAL_MCA_BASE_VERSION_2_1_0("if", 2, 0, 0)
119 
120 END_C_DECLS
121 
122 #endif /* OPAL_MCA_IF_IF_H */
123