1 #pragma once
2 
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 
7 #include <features.h>
8 
9 #define IF_NAMESIZE 16
10 
11 struct if_nameindex {
12     unsigned int if_index;
13     char* if_name;
14 };
15 
16 unsigned int if_nametoindex(const char*);
17 char* if_indextoname(unsigned int, char*);
18 struct if_nameindex* if_nameindex(void);
19 void if_freenameindex(struct if_nameindex*);
20 
21 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
22 
23 #include <sys/socket.h>
24 
25 #define IFF_UP 0x1
26 #define IFF_BROADCAST 0x2
27 #define IFF_DEBUG 0x4
28 #define IFF_LOOPBACK 0x8
29 #define IFF_POINTOPOINT 0x10
30 #define IFF_NOTRAILERS 0x20
31 #define IFF_RUNNING 0x40
32 #define IFF_NOARP 0x80
33 #define IFF_PROMISC 0x100
34 #define IFF_ALLMULTI 0x200
35 #define IFF_MASTER 0x400
36 #define IFF_SLAVE 0x800
37 #define IFF_MULTICAST 0x1000
38 #define IFF_PORTSEL 0x2000
39 #define IFF_AUTOMEDIA 0x4000
40 #define IFF_DYNAMIC 0x8000
41 #define IFF_LOWER_UP 0x10000
42 #define IFF_DORMANT 0x20000
43 #define IFF_ECHO 0x40000
44 #define IFF_VOLATILE                                                                      \
45     (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST | IFF_ECHO | IFF_MASTER | IFF_SLAVE | \
46      IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)
47 
48 struct ifaddr {
49     struct sockaddr ifa_addr;
50     union {
51         struct sockaddr ifu_broadaddr;
52         struct sockaddr ifu_dstaddr;
53     } ifa_ifu;
54     struct iface* ifa_ifp;
55     struct ifaddr* ifa_next;
56 };
57 
58 #define ifa_broadaddr ifa_ifu.ifu_broadaddr
59 #define ifa_dstaddr ifa_ifu.ifu_dstaddr
60 
61 struct ifmap {
62     unsigned long int mem_start;
63     unsigned long int mem_end;
64     unsigned short int base_addr;
65     unsigned char irq;
66     unsigned char dma;
67     unsigned char port;
68 };
69 
70 #define IFHWADDRLEN 6
71 #define IFNAMSIZ IF_NAMESIZE
72 
73 struct ifreq {
74     union {
75         char ifrn_name[IFNAMSIZ];
76     } ifr_ifrn;
77     union {
78         struct sockaddr ifru_addr;
79         struct sockaddr ifru_dstaddr;
80         struct sockaddr ifru_broadaddr;
81         struct sockaddr ifru_netmask;
82         struct sockaddr ifru_hwaddr;
83         short int ifru_flags;
84         int ifru_ivalue;
85         int ifru_mtu;
86         struct ifmap ifru_map;
87         char ifru_slave[IFNAMSIZ];
88         char ifru_newname[IFNAMSIZ];
89         void* ifru_data;
90     } ifr_ifru;
91 };
92 
93 #define ifr_name ifr_ifrn.ifrn_name
94 #define ifr_hwaddr ifr_ifru.ifru_hwaddr
95 #define ifr_addr ifr_ifru.ifru_addr
96 #define ifr_dstaddr ifr_ifru.ifru_dstaddr
97 #define ifr_broadaddr ifr_ifru.ifru_broadaddr
98 #define ifr_netmask ifr_ifru.ifru_netmask
99 #define ifr_flags ifr_ifru.ifru_flags
100 #define ifr_metric ifr_ifru.ifru_ivalue
101 #define ifr_mtu ifr_ifru.ifru_mtu
102 #define ifr_map ifr_ifru.ifru_map
103 #define ifr_slave ifr_ifru.ifru_slave
104 #define ifr_data ifr_ifru.ifru_data
105 #define ifr_ifindex ifr_ifru.ifru_ivalue
106 #define ifr_bandwidth ifr_ifru.ifru_ivalue
107 #define ifr_qlen ifr_ifru.ifru_ivalue
108 #define ifr_newname ifr_ifru.ifru_newname
109 #define _IOT_ifreq _IOT(_IOTS(char), IFNAMSIZ, _IOTS(char), 16, 0, 0)
110 #define _IOT_ifreq_short _IOT(_IOTS(char), IFNAMSIZ, _IOTS(short), 1, 0, 0)
111 #define _IOT_ifreq_int _IOT(_IOTS(char), IFNAMSIZ, _IOTS(int), 1, 0, 0)
112 
113 struct ifconf {
114     int ifc_len;
115     union {
116         void* ifcu_buf;
117         struct ifreq* ifcu_req;
118     } ifc_ifcu;
119 };
120 
121 #define ifc_buf ifc_ifcu.ifcu_buf
122 #define ifc_req ifc_ifcu.ifcu_req
123 #define _IOT_ifconf _IOT(_IOTS(struct ifconf), 1, 0, 0, 0, 0)
124 
125 #endif
126 
127 #ifdef __cplusplus
128 }
129 #endif
130