hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
/*
 * INET        An implementation of the TCP/IP protocol suite for the LINUX
 *        operating system.  INET is implemented using the  BSD Socket
 *        interface as the means of communication with the user level.
 *
 *        Global definitions for the INET interface module.
 *
 * Version:    @(#)if.h    1.0.2    04/18/93
 *
 * Authors:    Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988
 *        Ross Biro
 *        Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *        This program is free software; you can redistribute it and/or
 *        modify it under the terms of the GNU General Public License
 *        as published by the Free Software Foundation; either version
 *        2 of the License, or (at your option) any later version.
 */
#ifndef _LINUX_IF_H
#define _LINUX_IF_H
 
#include <linux/libc-compat.h>          /* for compatibility with glibc */
#include <linux/types.h>        /* for "__kernel_caddr_t" et al    */
#include <linux/socket.h>        /* for "struct sockaddr" et al    */
#include <linux/compiler.h>        /* for "__user" et al           */
 
#ifndef __KERNEL__
#include <sys/socket.h>            /* for struct sockaddr.        */
#endif
 
#if __UAPI_DEF_IF_IFNAMSIZ
#define    IFNAMSIZ    16
#endif /* __UAPI_DEF_IF_IFNAMSIZ */
#define    IFALIASZ    256
#define    ALTIFNAMSIZ    128
#include <linux/hdlc/ioctl.h>
 
/* For glibc compatibility. An empty enum does not compile. */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \
    __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0
/**
 * enum net_device_flags - &struct net_device flags
 *
 * These are the &struct net_device flags, they can be set by drivers, the
 * kernel and some can be triggered by userspace. Userspace can query and
 * set these flags using userspace utilities but there is also a sysfs
 * entry available for all dev flags which can be queried and set. These flags
 * are shared for all types of net_devices. The sysfs entries are available
 * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs
 * are annotated below, note that only a few flags can be toggled and some
 * other flags are always preserved from the original net_device flags
 * even if you try to set them via sysfs. Flags which are always preserved
 * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile
 * are annotated below as such.
 *
 * You should have a pretty good reason to be extending these flags.
 *
 * @IFF_UP: interface is up. Can be toggled through sysfs.
 * @IFF_BROADCAST: broadcast address valid. Volatile.
 * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs.
 * @IFF_LOOPBACK: is a loopback net. Volatile.
 * @IFF_POINTOPOINT: interface is has p-p link. Volatile.
 * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs.
 *    Volatile.
 * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile.
 * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile.
 * @IFF_PROMISC: receive all packets. Can be toggled through sysfs.
 * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through
 *    sysfs.
 * @IFF_MASTER: master of a load balancer. Volatile.
 * @IFF_SLAVE: slave of a load balancer. Volatile.
 * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs.
 * @IFF_PORTSEL: can set media type. Can be toggled through sysfs.
 * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs.
 * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled
 *    through sysfs.
 * @IFF_LOWER_UP: driver signals L1 up. Volatile.
 * @IFF_DORMANT: driver signals dormant. Volatile.
 * @IFF_ECHO: echo sent packets. Volatile.
 */
enum net_device_flags {
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
   IFF_UP                = 1<<0,  /* sysfs */
   IFF_BROADCAST            = 1<<1,  /* volatile */
   IFF_DEBUG            = 1<<2,  /* sysfs */
   IFF_LOOPBACK            = 1<<3,  /* volatile */
   IFF_POINTOPOINT            = 1<<4,  /* volatile */
   IFF_NOTRAILERS            = 1<<5,  /* sysfs */
   IFF_RUNNING            = 1<<6,  /* volatile */
   IFF_NOARP            = 1<<7,  /* sysfs */
   IFF_PROMISC            = 1<<8,  /* sysfs */
   IFF_ALLMULTI            = 1<<9,  /* sysfs */
   IFF_MASTER            = 1<<10, /* volatile */
   IFF_SLAVE            = 1<<11, /* volatile */
   IFF_MULTICAST            = 1<<12, /* sysfs */
   IFF_PORTSEL            = 1<<13, /* sysfs */
   IFF_AUTOMEDIA            = 1<<14, /* sysfs */
   IFF_DYNAMIC            = 1<<15, /* sysfs */
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
   IFF_LOWER_UP            = 1<<16, /* volatile */
   IFF_DORMANT            = 1<<17, /* volatile */
   IFF_ECHO            = 1<<18, /* volatile */
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
};
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */
 
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
#define IFF_UP                IFF_UP
#define IFF_BROADCAST            IFF_BROADCAST
#define IFF_DEBUG            IFF_DEBUG
#define IFF_LOOPBACK            IFF_LOOPBACK
#define IFF_POINTOPOINT            IFF_POINTOPOINT
#define IFF_NOTRAILERS            IFF_NOTRAILERS
#define IFF_RUNNING            IFF_RUNNING
#define IFF_NOARP            IFF_NOARP
#define IFF_PROMISC            IFF_PROMISC
#define IFF_ALLMULTI            IFF_ALLMULTI
#define IFF_MASTER            IFF_MASTER
#define IFF_SLAVE            IFF_SLAVE
#define IFF_MULTICAST            IFF_MULTICAST
#define IFF_PORTSEL            IFF_PORTSEL
#define IFF_AUTOMEDIA            IFF_AUTOMEDIA
#define IFF_DYNAMIC            IFF_DYNAMIC
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
 
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
#define IFF_LOWER_UP            IFF_LOWER_UP
#define IFF_DORMANT            IFF_DORMANT
#define IFF_ECHO            IFF_ECHO
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
 
#define IFF_VOLATILE    (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
       IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
 
#define IF_GET_IFACE    0x0001        /* for querying only */
#define IF_GET_PROTO    0x0002
 
/* For definitions see hdlc.h */
#define IF_IFACE_V35    0x1000        /* V.35 serial interface    */
#define IF_IFACE_V24    0x1001        /* V.24 serial interface    */
#define IF_IFACE_X21    0x1002        /* X.21 serial interface    */
#define IF_IFACE_T1    0x1003        /* T1 telco serial interface    */
#define IF_IFACE_E1    0x1004        /* E1 telco serial interface    */
#define IF_IFACE_SYNC_SERIAL 0x1005    /* can't be set by software    */
#define IF_IFACE_X21D   0x1006          /* X.21 Dual Clocking (FarSite) */
 
/* For definitions see hdlc.h */
#define IF_PROTO_HDLC    0x2000        /* raw HDLC protocol        */
#define IF_PROTO_PPP    0x2001        /* PPP protocol            */
#define IF_PROTO_CISCO    0x2002        /* Cisco HDLC protocol        */
#define IF_PROTO_FR    0x2003        /* Frame Relay protocol        */
#define IF_PROTO_FR_ADD_PVC 0x2004    /*    Create FR PVC        */
#define IF_PROTO_FR_DEL_PVC 0x2005    /*    Delete FR PVC        */
#define IF_PROTO_X25    0x2006        /* X.25                */
#define IF_PROTO_HDLC_ETH 0x2007    /* raw HDLC, Ethernet emulation    */
#define IF_PROTO_FR_ADD_ETH_PVC 0x2008    /*  Create FR Ethernet-bridged PVC */
#define IF_PROTO_FR_DEL_ETH_PVC 0x2009    /*  Delete FR Ethernet-bridged PVC */
#define IF_PROTO_FR_PVC    0x200A        /* for reading PVC status    */
#define IF_PROTO_FR_ETH_PVC 0x200B
#define IF_PROTO_RAW    0x200C          /* RAW Socket                   */
 
/* RFC 2863 operational status */
enum {
   IF_OPER_UNKNOWN,
   IF_OPER_NOTPRESENT,
   IF_OPER_DOWN,
   IF_OPER_LOWERLAYERDOWN,
   IF_OPER_TESTING,
   IF_OPER_DORMANT,
   IF_OPER_UP,
};
 
/* link modes */
enum {
   IF_LINK_MODE_DEFAULT,
   IF_LINK_MODE_DORMANT,    /* limit upward transition to dormant */
   IF_LINK_MODE_TESTING,    /* limit upward transition to testing */
};
 
/*
 *    Device mapping structure. I'd just gone off and designed a 
 *    beautiful scheme using only loadable modules with arguments
 *    for driver options and along come the PCMCIA people 8)
 *
 *    Ah well. The get() side of this is good for WDSETUP, and it'll
 *    be handy for debugging things. The set side is fine for now and
 *    being very small might be worth keeping for clean configuration.
 */
 
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_IFMAP
struct ifmap {
   unsigned long mem_start;
   unsigned long mem_end;
   unsigned short base_addr; 
   unsigned char irq;
   unsigned char dma;
   unsigned char port;
   /* 3 bytes spare */
};
#endif /* __UAPI_DEF_IF_IFMAP */
 
struct if_settings {
   unsigned int type;    /* Type of physical device or protocol */
   unsigned int size;    /* Size of the data allocated by the caller */
   union {
       /* {atm/eth/dsl}_settings anyone ? */
       raw_hdlc_proto        __user *raw_hdlc;
       cisco_proto        __user *cisco;
       fr_proto        __user *fr;
       fr_proto_pvc        __user *fr_pvc;
       fr_proto_pvc_info    __user *fr_pvc_info;
       x25_hdlc_proto        __user *x25;
 
       /* interface settings */
       sync_serial_settings    __user *sync;
       te1_settings        __user *te1;
   } ifs_ifsu;
};
 
/*
 * Interface request structure used for socket
 * ioctl's.  All interface ioctl's must have parameter
 * definitions which begin with ifr_name.  The
 * remainder may be interface specific.
 */
 
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_IFREQ
struct ifreq {
#define IFHWADDRLEN    6
   union
   {
       char    ifrn_name[IFNAMSIZ];        /* if name, e.g. "en0" */
   } ifr_ifrn;
   
   union {
       struct    sockaddr ifru_addr;
       struct    sockaddr ifru_dstaddr;
       struct    sockaddr ifru_broadaddr;
       struct    sockaddr ifru_netmask;
       struct  sockaddr ifru_hwaddr;
       short    ifru_flags;
       int    ifru_ivalue;
       int    ifru_mtu;
       struct  ifmap ifru_map;
       char    ifru_slave[IFNAMSIZ];    /* Just fits the size */
       char    ifru_newname[IFNAMSIZ];
       void __user *    ifru_data;
       struct    if_settings ifru_settings;
   } ifr_ifru;
};
#endif /* __UAPI_DEF_IF_IFREQ */
 
#define ifr_name    ifr_ifrn.ifrn_name    /* interface name     */
#define ifr_hwaddr    ifr_ifru.ifru_hwaddr    /* MAC address         */
#define    ifr_addr    ifr_ifru.ifru_addr    /* address        */
#define    ifr_dstaddr    ifr_ifru.ifru_dstaddr    /* other end of p-p lnk    */
#define    ifr_broadaddr    ifr_ifru.ifru_broadaddr    /* broadcast address    */
#define    ifr_netmask    ifr_ifru.ifru_netmask    /* interface net mask    */
#define    ifr_flags    ifr_ifru.ifru_flags    /* flags        */
#define    ifr_metric    ifr_ifru.ifru_ivalue    /* metric        */
#define    ifr_mtu        ifr_ifru.ifru_mtu    /* mtu            */
#define ifr_map        ifr_ifru.ifru_map    /* device map        */
#define ifr_slave    ifr_ifru.ifru_slave    /* slave device        */
#define    ifr_data    ifr_ifru.ifru_data    /* for use by interface    */
#define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index    */
#define ifr_bandwidth    ifr_ifru.ifru_ivalue    /* link bandwidth    */
#define ifr_qlen    ifr_ifru.ifru_ivalue    /* Queue length     */
#define ifr_newname    ifr_ifru.ifru_newname    /* New name        */
#define ifr_settings    ifr_ifru.ifru_settings    /* Device/proto settings*/
 
/*
 * Structure used in SIOCGIFCONF request.
 * Used to retrieve interface configuration
 * for machine (useful for programs which
 * must know all networks accessible).
 */
 
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_IFCONF
struct ifconf  {
   int    ifc_len;            /* size of buffer    */
   union {
       char __user *ifcu_buf;
       struct ifreq __user *ifcu_req;
   } ifc_ifcu;
};
#endif /* __UAPI_DEF_IF_IFCONF */
 
#define    ifc_buf    ifc_ifcu.ifcu_buf        /* buffer address    */
#define    ifc_req    ifc_ifcu.ifcu_req        /* array of structures    */
 
#endif /* _LINUX_IF_H */