xref: /dragonfly/sys/net/if.h (revision 7485684fa5c3fadb6c7a1da0d8bb6ea5da4e0f2f)
1 /*
2  * Copyright (c) 1982, 1986, 1989, 1993
3  *        The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *        @(#)if.h  8.1 (Berkeley) 6/10/93
30  * $FreeBSD: src/sys/net/if.h,v 1.58.2.9 2002/08/30 14:23:38 sobomax Exp $
31  */
32 
33 #ifndef _NET_IF_H_
34 #define   _NET_IF_H_
35 
36 #include <sys/cdefs.h>
37 
38 #if __BSD_VISIBLE
39 /*
40  * <net/if.h> does not depend on <sys/time.h> on most other systems.  This
41  * helps userland compatibility.  (struct timeval ifi_lastchange)
42  */
43 #include <sys/socket.h>
44 #ifndef _KERNEL
45 #include <sys/time.h>
46 #endif /* !_KERNEL */
47 #include <sys/types.h>
48 #endif /* __BSD_VISIBLE */
49 
50 /*
51  * Length of interface external name, including terminating '\0'.
52  * Note: this is the same size as a generic device's external name.
53  */
54 #define             IF_NAMESIZE         16
55 #if __BSD_VISIBLE
56 #define             IFNAMSIZ  IF_NAMESIZE
57 #define             IF_MAXUNIT          0x7fff              /* if_unit is 15bits */
58 
59 /*
60  * Structure describing information about an interface
61  * which may be of interest to management entities.
62  */
63 struct if_data {
64           /* generic interface information */
65           u_char    ifi_type;           /* ethernet, tokenring, etc */
66           u_char    ifi_physical;                 /* e.g., AUI, Thinnet, 10base-T, etc */
67           u_char    ifi_addrlen;                  /* media address length */
68           u_char    ifi_hdrlen;                   /* media header length */
69           u_char    ifi_recvquota;                /* polling quota for receive intrs */
70           u_char    ifi_xmitquota;                /* polling quota for xmit intrs */
71           u_long    ifi_mtu;            /* maximum transmission unit */
72           u_long    ifi_metric;                   /* routing metric (external only) */
73           u_long    ifi_link_state;               /* current link state */
74           uint64_t ifi_baudrate;                  /* linespeed */
75           /* volatile statistics */
76           u_long    ifi_ipackets;                 /* packets received on interface */
77           u_long    ifi_ierrors;                  /* input errors on interface */
78           u_long    ifi_opackets;                 /* packets sent on interface */
79           u_long    ifi_oerrors;                  /* output errors on interface */
80           u_long    ifi_collisions;               /* collisions on csma interfaces */
81           u_long    ifi_ibytes;                   /* total number of octets received */
82           u_long    ifi_obytes;                   /* total number of octets sent */
83           u_long    ifi_imcasts;                  /* packets received via multicast */
84           u_long    ifi_omcasts;                  /* packets sent via multicast */
85           u_long    ifi_iqdrops;                  /* dropped on input, this interface */
86           u_long    ifi_noproto;                  /* destined for unsupported protocol */
87           u_long    ifi_hwassist;                 /* HW offload capabilities */
88           u_long    ifi_oqdrops;                  /* dropped on input, this interface */
89           struct    timeval ifi_lastchange;       /* time of last administrative change */
90 };
91 
92 #define   IFF_UP              0x1                 /* interface is up */
93 #define   IFF_BROADCAST       0x2                 /* broadcast address valid */
94 #define   IFF_DEBUG 0x4                 /* turn on debugging */
95 #define   IFF_LOOPBACK        0x8                 /* is a loopback net */
96 #define   IFF_POINTOPOINT     0x10                /* interface is point-to-point link */
97 #define   IFF_SMART 0x20                /* interface manages own routes */
98 #define   IFF_RUNNING         0x40                /* resources allocated */
99 #define   IFF_NOARP 0x80                /* no address resolution protocol */
100 #define   IFF_PROMISC         0x100               /* receive all packets */
101 #define   IFF_ALLMULTI        0x200               /* receive all multicast packets */
102 #define   IFF_OACTIVE_COMPAT 0x400      /* was transmission in progress */
103 #define   IFF_SIMPLEX         0x800               /* can't hear own transmissions */
104 #define   IFF_LINK0 0x1000              /* per link layer defined bit */
105 #define   IFF_LINK1 0x2000              /* per link layer defined bit */
106 #define   IFF_LINK2 0x4000              /* per link layer defined bit */
107 #define   IFF_ALTPHYS         IFF_LINK2 /* use alternate physical connection */
108 #define   IFF_MULTICAST       0x8000              /* supports multicast */
109 #define   IFF_POLLING_COMPAT 0x10000    /* was interface is in polling mode */
110 #define   IFF_PPROMISC        0x20000             /* user-requested promisc mode */
111 #define   IFF_MONITOR         0x40000             /* user-requested monitor mode */
112 #define   IFF_STATICARP       0x80000             /* static ARP */
113 #define   IFF_NPOLLING        0x100000  /* interface is in polling mode */
114 #define   IFF_IDIRECT         0x200000  /* direct input */
115 #define   IFF_ISBRIDGE        0x400000  /* this is actually a bridge(4) */
116 
117 /* flags set internally only: */
118 #define   IFF_CANTCHANGE \
119           (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE_COMPAT|\
120            IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART|IFF_POLLING_COMPAT|\
121            IFF_NPOLLING|IFF_IDIRECT|IFF_ISBRIDGE)
122 
123 #ifndef _KERNEL
124 /*
125  * User space compat
126  */
127 #define   IFF_OACTIVE         IFF_OACTIVE_COMPAT
128 #define   IFF_POLLING         IFF_POLLING_COMPAT
129 #endif
130 
131 /*
132  * Values for if_link_state.
133  */
134 #define   LINK_STATE_UNKNOWN  0         /* link invalid/unknown */
135 #define   LINK_STATE_DOWN               1         /* link is down */
136 #define   LINK_STATE_UP                 2         /* link is up */
137 #define   LINK_STATE_IS_UP(_s)          ((_s) >= LINK_STATE_UP)
138 
139 /*
140  * Some convenience macros used for setting ifi_baudrate.
141  * XXX 1000 vs. 1024? --thorpej@netbsd.org
142  */
143 #define   IF_Kbps(x)          ((x) * 1000)                  /* kilobits/sec. */
144 #define   IF_Mbps(x)          (IF_Kbps((x) * 1000))         /* megabits/sec. */
145 #define   IF_Gbps(x)          (IF_Mbps((x) * 1000))         /* gigabits/sec. */
146 
147 /* Capabilities that interfaces can advertise. */
148 #define   IFCAP_RXCSUM                  0x00001 /* can offload checksum on RX */
149 #define   IFCAP_TXCSUM                  0x00002 /* can offload checksum on TX */
150 #define   IFCAP_NETCONS                 0x00004 /* can be a network console */
151 #define   IFCAP_VLAN_MTU                0x00008   /* VLAN-compatible MTU */
152 #define   IFCAP_VLAN_HWTAGGING          0x00010   /* hardware VLAN tag support */
153 #define   IFCAP_JUMBO_MTU               0x00020   /* 9000 byte MTU support */
154 #define   IFCAP_RSS           0x00040   /* Receive Side Scaling for IPv4 */
155 #define   IFCAP_VLAN_HWCSUM   0x00080   /* can do IFCAP_HWCSUM on VLANs */
156 #define   IFCAP_TSO4                    0x00100   /* can offload TCP segmentation */
157 #define   IFCAP_TSO           IFCAP_TSO4
158 #define   IFCAP_TSO6                    0x00200   /* can offload TCP6 segmentation */
159 
160 #define   IFCAP_HWCSUM        (IFCAP_RXCSUM | IFCAP_TXCSUM)
161 
162 
163 #define   IFQ_MAXLEN          250
164 #define   IFNET_SLOWHZ        1                   /* granularity is 1 second */
165 
166 /*
167  * Message format for use in obtaining information about interfaces
168  * from getkerninfo and the routing socket
169  */
170 struct if_msghdr {
171           u_short   ifm_msglen;         /* to skip over non-understood messages */
172           u_char    ifm_version;        /* future binary compatibility */
173           u_char    ifm_type; /* message type */
174           u_short   ifm_index;          /* index for associated ifp */
175           int       ifm_flags;          /* value of if_flags */
176           int       ifm_addrs;          /* like rtm_addrs */
177           struct    if_data ifm_data;/* statistics and other data about if */
178 };
179 
180 /*
181  * Message format for use in obtaining information about interface addresses
182  * from getkerninfo and the routing socket
183  */
184 struct ifa_msghdr {
185           u_short   ifam_msglen;        /* to skip over non-understood messages */
186           u_char    ifam_version;       /* future binary compatibility */
187           u_char    ifam_type;          /* message type */
188           u_short   ifam_index;         /* index for associated ifp */
189           int       ifam_flags;         /* value of ifa_flags */
190           int       ifam_addrs;         /* like rtm_addrs */
191           int       ifam_addrflags;     /* family specific address flags */
192           int       ifam_metric;        /* value of ifa_metric */
193 };
194 
195 /*
196  * Message format for use in obtaining information about multicast addresses
197  * from the routing socket
198  */
199 struct ifma_msghdr {
200           u_short   ifmam_msglen;       /* to skip over non-understood messages */
201           u_char    ifmam_version;      /* future binary compatibility */
202           u_char    ifmam_type;         /* message type */
203           u_short   ifmam_index;        /* index for associated ifp */
204           int       ifmam_flags;        /* value of ifa_flags */
205           int       ifmam_addrs;        /* like rtm_addrs */
206 };
207 
208 /*
209  * Message format announcing the arrival or departure of a network interface.
210  */
211 struct if_announcemsghdr {
212           u_short   ifan_msglen;        /* to skip over non-understood messages */
213           u_char    ifan_version;       /* future binary compatibility */
214           u_char    ifan_type;          /* message type */
215           u_short   ifan_index;         /* index for associated ifp */
216           char      ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */
217           u_short   ifan_what;          /* what type of announcement */
218 };
219 
220 #define   IFAN_ARRIVAL        0         /* interface arrival */
221 #define   IFAN_DEPARTURE      1         /* interface departure */
222 
223 /*
224  * Buffer with length to be used in SIOCGIFDESCR/SIOCSIFDESCR requests
225  */
226 struct ifreq_buffer {
227           size_t     length;
228           void      *buffer;
229 };
230 
231 /*
232  * Interface request structure used for socket
233  * ioctl's.  All interface ioctl's must have parameter
234  * definitions which begin with ifr_name.  The
235  * remainder may be interface specific.
236  */
237 struct    ifreq {
238           char      ifr_name[IFNAMSIZ];           /* if name, e.g. "en0" */
239           union {
240                     struct    sockaddr ifru_addr;
241                     struct    sockaddr ifru_dstaddr;
242                     struct    sockaddr ifru_broadaddr;
243                     struct    ifreq_buffer ifru_buffer;
244                     short     ifru_flags[2];
245                     short     ifru_index;
246                     int       ifru_metric;
247                     int       ifru_mtu;
248                     int       ifru_phys;
249                     int       ifru_media;
250                     void      *ifru_data;
251                     int       ifru_cap[2];
252                     int       ifru_pollcpu;
253                     int       ifru_tsolen;
254           } ifr_ifru;
255 #define   ifr_addr  ifr_ifru.ifru_addr  /* address */
256 #define   ifr_dstaddr         ifr_ifru.ifru_dstaddr         /* other end of p-to-p link */
257 #define   ifr_broadaddr       ifr_ifru.ifru_broadaddr       /* broadcast address */
258 #define   ifr_buffer          ifr_ifru.ifru_buffer          /* user supplied buffer with its length */
259 #define   ifr_flags ifr_ifru.ifru_flags[0]        /* flags (low 16 bits) */
260 #define   ifr_flagshigh       ifr_ifru.ifru_flags[1]        /* flags (high 16 bits) */
261 #define   ifr_metric          ifr_ifru.ifru_metric          /* metric */
262 #define   ifr_mtu             ifr_ifru.ifru_mtu   /* mtu */
263 #define   ifr_phys  ifr_ifru.ifru_phys  /* physical wire */
264 #define   ifr_media ifr_ifru.ifru_media /* physical media */
265 #define   ifr_data  ifr_ifru.ifru_data  /* for use by interface */
266 #define   ifr_reqcap          ifr_ifru.ifru_cap[0]          /* requested capabilities */
267 #define   ifr_curcap          ifr_ifru.ifru_cap[1]          /* current capabilities */
268 #define   ifr_index ifr_ifru.ifru_index /* interface index */
269 #define   ifr_pollcpu         ifr_ifru.ifru_pollcpu         /* deprecated */
270 #define   ifr_tsolen          ifr_ifru.ifru_tsolen          /* max TSO length */
271 };
272 
273 #define   _SIZEOF_ADDR_IFREQ(ifr) \
274           ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
275            (sizeof(struct ifreq) - sizeof(struct sockaddr) + \
276             (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
277 
278 struct ifaliasreq {
279           char      ifra_name[IFNAMSIZ];                    /* if name, e.g. "en0" */
280           struct    sockaddr ifra_addr;
281           struct    sockaddr ifra_broadaddr;
282           struct    sockaddr ifra_mask;
283 };
284 
285 struct ifmediareq {
286           char      ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */
287           int       ifm_current;                  /* current media options */
288           int       ifm_mask;           /* don't care mask */
289           int       ifm_status;                   /* media status */
290           int       ifm_active;                   /* active options */
291           int       ifm_count;                    /* # entries in ifm_ulist array */
292           int       *ifm_ulist;                   /* media words */
293 };
294 
295 struct  ifdrv {
296           char                 ifd_name[IFNAMSIZ];     /* if name, e.g. "en0" */
297           unsigned long        ifd_cmd;
298           size_t               ifd_len;
299           void                *ifd_data;
300 };
301 
302 /*
303  * Structure used to retrieve aux status data from interfaces.
304  * Kernel suppliers to this interface should respect the formatting
305  * needed by ifconfig(8): each line starts with a TAB and ends with
306  * a newline.  The canonical example to copy and paste is in if_tun.c.
307  */
308 
309 #define   IFSTATMAX 800                 /* 10 lines of text */
310 struct ifstat {
311           char      ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */
312           char      ascii[IFSTATMAX + 1];
313 };
314 
315 /*
316  * Structure used in SIOCGIFCONF request.
317  * Used to retrieve interface configuration
318  * for machine (useful for programs which
319  * must know all networks accessible).
320  */
321 struct    ifconf {
322           int       ifc_len;            /* size of associated buffer */
323           union {
324                     caddr_t   ifcu_buf;
325                     struct    ifreq *ifcu_req;
326           } ifc_ifcu;
327 #define   ifc_buf   ifc_ifcu.ifcu_buf   /* buffer address */
328 #define   ifc_req   ifc_ifcu.ifcu_req   /* array of structures returned */
329 };
330 
331 /*
332  * interface groups
333  */
334 
335 #define   IFG_ALL             "all"               /* group contains all interfaces */
336 /* XXX: will we implement this? */
337 #define   IFG_EGRESS          "egress"  /* if(s) default route(s) point to */
338 
339 struct ifg_req {
340           union {
341                     char      ifgrqu_group[IFNAMSIZ];
342                     char      ifgrqu_member[IFNAMSIZ];
343           } ifgrq_ifgrqu;
344 #define   ifgrq_group         ifgrq_ifgrqu.ifgrqu_group
345 #define   ifgrq_member        ifgrq_ifgrqu.ifgrqu_member
346 };
347 
348 /*
349  * Used to lookup groups for an interface
350  */
351 struct ifgroupreq {
352           char      ifgr_name[IFNAMSIZ];
353           u_int     ifgr_len;
354           union {
355                     char      ifgru_group[IFNAMSIZ];
356                     struct    ifg_req *ifgru_groups;
357           } ifgr_ifgru;
358 #define   ifgr_group          ifgr_ifgru.ifgru_group
359 #define   ifgr_groups         ifgr_ifgru.ifgru_groups
360 };
361 
362 /*
363  * Structure for SIOC[AGD]LIFADDR
364  */
365 struct if_laddrreq {
366           char      iflr_name[IFNAMSIZ];
367           u_int     flags;
368 #define   IFLR_PREFIX         0x8000  /* in: prefix given  out: kernel fills id */
369           u_int     prefixlen;         /* in/out */
370           struct    sockaddr_storage addr;   /* in/out */
371           struct    sockaddr_storage dstaddr; /* out */
372 };
373 #endif /* __BSD_VISIBLE */
374 
375 #ifndef _KERNEL
376 struct if_nameindex {
377           unsigned int         if_index;          /* 1, 2, ... */
378           char                *if_name; /* null terminated name: "lnc0", ... */
379 };
380 
381 __BEGIN_DECLS
382 unsigned int         if_nametoindex(const char *);
383 char                *if_indextoname(unsigned int, char *);
384 struct if_nameindex *if_nameindex(void);
385 void                 if_freenameindex(struct if_nameindex *);
386 __END_DECLS
387 
388 #endif /* !_KERNEL */
389 
390 #endif /* !_NET_IF_H_ */
391