]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/if.h
This commit was generated by cvs2svn to compensate for changes in r67575,
[FreeBSD/FreeBSD.git] / sys / net / if.h
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. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      @(#)if.h        8.1 (Berkeley) 6/10/93
34  * $FreeBSD$
35  */
36
37 #ifndef _NET_IF_H_
38 #define _NET_IF_H_
39
40 /*
41  * <net/if.h> does not depend on <sys/time.h> on most other systems.  This
42  * helps userland compatability.  (struct timeval ifi_lastchange)
43  */
44 #ifndef _KERNEL
45 #include <sys/time.h>
46 #endif
47
48 /*
49  * Structure describing information about an interface
50  * which may be of interest to management entities.
51  */
52 struct if_data {
53         /* generic interface information */
54         u_char  ifi_type;               /* ethernet, tokenring, etc */
55         u_char  ifi_physical;           /* e.g., AUI, Thinnet, 10base-T, etc */
56         u_char  ifi_addrlen;            /* media address length */
57         u_char  ifi_hdrlen;             /* media header length */
58         u_char  ifi_recvquota;          /* polling quota for receive intrs */
59         u_char  ifi_xmitquota;          /* polling quota for xmit intrs */
60         u_long  ifi_mtu;                /* maximum transmission unit */
61         u_long  ifi_metric;             /* routing metric (external only) */
62         u_long  ifi_baudrate;           /* linespeed */
63         /* volatile statistics */
64         u_long  ifi_ipackets;           /* packets received on interface */
65         u_long  ifi_ierrors;            /* input errors on interface */
66         u_long  ifi_opackets;           /* packets sent on interface */
67         u_long  ifi_oerrors;            /* output errors on interface */
68         u_long  ifi_collisions;         /* collisions on csma interfaces */
69         u_long  ifi_ibytes;             /* total number of octets received */
70         u_long  ifi_obytes;             /* total number of octets sent */
71         u_long  ifi_imcasts;            /* packets received via multicast */
72         u_long  ifi_omcasts;            /* packets sent via multicast */
73         u_long  ifi_iqdrops;            /* dropped on input, this interface */
74         u_long  ifi_noproto;            /* destined for unsupported protocol */
75         u_long  ifi_hwassist;           /* HW offload capabilities */
76         u_long  ifi_unused;             /* XXX was ifi_xmittiming */
77         struct  timeval ifi_lastchange; /* time of last administrative change */
78 };
79
80 #define IFF_UP          0x1             /* interface is up */
81 #define IFF_BROADCAST   0x2             /* broadcast address valid */
82 #define IFF_DEBUG       0x4             /* turn on debugging */
83 #define IFF_LOOPBACK    0x8             /* is a loopback net */
84 #define IFF_POINTOPOINT 0x10            /* interface is point-to-point link */
85 #define IFF_SMART       0x20            /* interface manages own routes */
86 #define IFF_RUNNING     0x40            /* resources allocated */
87 #define IFF_NOARP       0x80            /* no address resolution protocol */
88 #define IFF_PROMISC     0x100           /* receive all packets */
89 #define IFF_ALLMULTI    0x200           /* receive all multicast packets */
90 #define IFF_OACTIVE     0x400           /* transmission in progress */
91 #define IFF_SIMPLEX     0x800           /* can't hear own transmissions */
92 #define IFF_LINK0       0x1000          /* per link layer defined bit */
93 #define IFF_LINK1       0x2000          /* per link layer defined bit */
94 #define IFF_LINK2       0x4000          /* per link layer defined bit */
95 #define IFF_ALTPHYS     IFF_LINK2       /* use alternate physical connection */
96 #define IFF_MULTICAST   0x8000          /* supports multicast */
97
98 /* flags set internally only: */
99 #define IFF_CANTCHANGE \
100         (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
101             IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART)
102
103 #define IFQ_MAXLEN      50
104 #define IFNET_SLOWHZ    1               /* granularity is 1 second */
105
106 /*
107  * Message format for use in obtaining information about interfaces
108  * from getkerninfo and the routing socket
109  */
110 struct if_msghdr {
111         u_short ifm_msglen;     /* to skip over non-understood messages */
112         u_char  ifm_version;    /* future binary compatability */
113         u_char  ifm_type;       /* message type */
114         int     ifm_addrs;      /* like rtm_addrs */
115         int     ifm_flags;      /* value of if_flags */
116         u_short ifm_index;      /* index for associated ifp */
117         struct  if_data ifm_data;/* statistics and other data about if */
118 };
119
120 /*
121  * Message format for use in obtaining information about interface addresses
122  * from getkerninfo and the routing socket
123  */
124 struct ifa_msghdr {
125         u_short ifam_msglen;    /* to skip over non-understood messages */
126         u_char  ifam_version;   /* future binary compatability */
127         u_char  ifam_type;      /* message type */
128         int     ifam_addrs;     /* like rtm_addrs */
129         int     ifam_flags;     /* value of ifa_flags */
130         u_short ifam_index;     /* index for associated ifp */
131         int     ifam_metric;    /* value of ifa_metric */
132 };
133
134 /*
135  * Message format for use in obtaining information about multicast addresses
136  * from the routing socket
137  */
138 struct ifma_msghdr {
139         u_short ifmam_msglen;   /* to skip over non-understood messages */
140         u_char  ifmam_version;  /* future binary compatability */
141         u_char  ifmam_type;     /* message type */
142         int     ifmam_addrs;    /* like rtm_addrs */
143         int     ifmam_flags;    /* value of ifa_flags */
144         u_short ifmam_index;    /* index for associated ifp */
145 };
146
147 /*
148  * Interface request structure used for socket
149  * ioctl's.  All interface ioctl's must have parameter
150  * definitions which begin with ifr_name.  The
151  * remainder may be interface specific.
152  */
153 struct  ifreq {
154 #define IFNAMSIZ        16
155 #define IF_NAMESIZE     IFNAMSIZ
156         char    ifr_name[IFNAMSIZ];             /* if name, e.g. "en0" */
157         union {
158                 struct  sockaddr ifru_addr;
159                 struct  sockaddr ifru_dstaddr;
160                 struct  sockaddr ifru_broadaddr;
161                 short   ifru_flags[2];
162                 int     ifru_metric;
163                 int     ifru_mtu;
164                 int     ifru_phys;
165                 int     ifru_media;
166                 caddr_t ifru_data;
167         } ifr_ifru;
168 #define ifr_addr        ifr_ifru.ifru_addr      /* address */
169 #define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
170 #define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
171 #define ifr_flags       ifr_ifru.ifru_flags[0]  /* flags */
172 #define ifr_prevflags   ifr_ifru.ifru_flags[1]  /* flags */
173 #define ifr_metric      ifr_ifru.ifru_metric    /* metric */
174 #define ifr_mtu         ifr_ifru.ifru_mtu       /* mtu */
175 #define ifr_phys        ifr_ifru.ifru_phys      /* physical wire */
176 #define ifr_media       ifr_ifru.ifru_media     /* physical media */
177 #define ifr_data        ifr_ifru.ifru_data      /* for use by interface */
178 };
179
180 #define _SIZEOF_ADDR_IFREQ(ifr) \
181         ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
182          (sizeof(struct ifreq) - sizeof(struct sockaddr) + \
183           (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
184
185 struct ifaliasreq {
186         char    ifra_name[IFNAMSIZ];            /* if name, e.g. "en0" */
187         struct  sockaddr ifra_addr;
188         struct  sockaddr ifra_broadaddr;
189         struct  sockaddr ifra_mask;
190 };
191
192 struct ifmediareq {
193         char    ifm_name[IFNAMSIZ];     /* if name, e.g. "en0" */
194         int     ifm_current;            /* current media options */
195         int     ifm_mask;               /* don't care mask */
196         int     ifm_status;             /* media status */
197         int     ifm_active;             /* active options */
198         int     ifm_count;              /* # entries in ifm_ulist array */
199         int     *ifm_ulist;             /* media words */
200 };
201
202 /* 
203  * Structure used to retrieve aux status data from interfaces.
204  * Kernel suppliers to this interface should respect the formatting
205  * needed by ifconfig(8): each line starts with a TAB and ends with
206  * a newline.  The canonical example to copy and paste is in if_tun.c.
207  */
208
209 #define IFSTATMAX       800             /* 10 lines of text */
210 struct ifstat {
211         char    ifs_name[IFNAMSIZ];     /* if name, e.g. "en0" */
212         char    ascii[IFSTATMAX + 1];
213 };
214
215 /*
216  * Structure used in SIOCGIFCONF request.
217  * Used to retrieve interface configuration
218  * for machine (useful for programs which
219  * must know all networks accessible).
220  */
221 struct  ifconf {
222         int     ifc_len;                /* size of associated buffer */
223         union {
224                 caddr_t ifcu_buf;
225                 struct  ifreq *ifcu_req;
226         } ifc_ifcu;
227 #define ifc_buf ifc_ifcu.ifcu_buf       /* buffer address */
228 #define ifc_req ifc_ifcu.ifcu_req       /* array of structures returned */
229 };
230
231
232 /*
233  * Structure for SIOC[AGD]LIFADDR
234  */
235 struct if_laddrreq {
236         char    iflr_name[IFNAMSIZ];
237         u_int   flags;
238 #define IFLR_PREFIX     0x8000  /* in: prefix given  out: kernel fills id */
239         u_int   prefixlen;         /* in/out */
240         struct  sockaddr_storage addr;   /* in/out */
241         struct  sockaddr_storage dstaddr; /* out */
242 };
243
244 #ifdef _KERNEL
245 #ifdef MALLOC_DECLARE
246 MALLOC_DECLARE(M_IFADDR);
247 MALLOC_DECLARE(M_IFMADDR);
248 #endif
249 #endif
250
251 #ifndef _KERNEL
252 struct if_nameindex {
253         u_int   if_index;       /* 1, 2, ... */
254         char    *if_name;       /* null terminated name: "le0", ... */
255 };
256
257 __BEGIN_DECLS
258 u_int    if_nametoindex __P((const char *));
259 char    *if_indextoname __P((u_int, char *));
260 struct   if_nameindex *if_nameindex __P((void));
261 void     if_freenameindex __P((struct if_nameindex *));
262 __END_DECLS
263 #endif
264
265 #ifdef _KERNEL
266 struct proc;
267
268 int     prison_if __P((struct proc *p, struct sockaddr *sa));
269
270 /* XXX - this should go away soon. */
271 #include <net/if_var.h>
272 #endif
273
274 #endif /* !_NET_IF_H_ */