root / lab4 / .minix-src / include / net / if.h @ 14
History | View | Annotate | Download (35.1 KB)
1 |
/* $NetBSD: if.h,v 1.193 2015/10/02 03:08:26 ozaki-r Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by William Studenmund and Jason R. Thorpe.
|
9 |
*
|
10 |
* Redistribution and use in source and binary forms, with or without
|
11 |
* modification, are permitted provided that the following conditions
|
12 |
* are met:
|
13 |
* 1. Redistributions of source code must retain the above copyright
|
14 |
* notice, this list of conditions and the following disclaimer.
|
15 |
* 2. Redistributions in binary form must reproduce the above copyright
|
16 |
* notice, this list of conditions and the following disclaimer in the
|
17 |
* documentation and/or other materials provided with the distribution.
|
18 |
*
|
19 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
20 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
21 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
22 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
23 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29 |
* POSSIBILITY OF SUCH DAMAGE.
|
30 |
*/
|
31 |
|
32 |
/*
|
33 |
* Copyright (c) 1982, 1986, 1989, 1993
|
34 |
* The Regents of the University of California. All rights reserved.
|
35 |
*
|
36 |
* Redistribution and use in source and binary forms, with or without
|
37 |
* modification, are permitted provided that the following conditions
|
38 |
* are met:
|
39 |
* 1. Redistributions of source code must retain the above copyright
|
40 |
* notice, this list of conditions and the following disclaimer.
|
41 |
* 2. Redistributions in binary form must reproduce the above copyright
|
42 |
* notice, this list of conditions and the following disclaimer in the
|
43 |
* documentation and/or other materials provided with the distribution.
|
44 |
* 3. Neither the name of the University nor the names of its contributors
|
45 |
* may be used to endorse or promote products derived from this software
|
46 |
* without specific prior written permission.
|
47 |
*
|
48 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
49 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
50 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
51 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
52 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
53 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
54 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
55 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
56 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
57 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
58 |
* SUCH DAMAGE.
|
59 |
*
|
60 |
* @(#)if.h 8.3 (Berkeley) 2/9/95
|
61 |
*/
|
62 |
|
63 |
#ifndef _NET_IF_H_
|
64 |
#define _NET_IF_H_
|
65 |
|
66 |
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
67 |
#include <stdbool.h> |
68 |
#endif
|
69 |
|
70 |
#include <sys/featuretest.h> |
71 |
|
72 |
/*
|
73 |
* Length of interface external name, including terminating '\0'.
|
74 |
* Note: this is the same size as a generic device's external name.
|
75 |
*/
|
76 |
#define IF_NAMESIZE 16 |
77 |
|
78 |
#if defined(_NETBSD_SOURCE)
|
79 |
|
80 |
#include <sys/socket.h> |
81 |
#include <sys/queue.h> |
82 |
#include <sys/mutex.h> |
83 |
|
84 |
#include <net/dlt.h> |
85 |
#include <net/pfil.h> |
86 |
#ifdef _KERNEL
|
87 |
#include <net/pktqueue.h> |
88 |
#endif
|
89 |
|
90 |
/*
|
91 |
* Always include ALTQ glue here -- we use the ALTQ interface queue
|
92 |
* structure even when ALTQ is not configured into the kernel so that
|
93 |
* the size of struct ifnet does not changed based on the option. The
|
94 |
* ALTQ queue structure is API-compatible with the legacy ifqueue.
|
95 |
*/
|
96 |
#include <altq/if_altq.h> |
97 |
|
98 |
/*
|
99 |
* Structures defining a network interface, providing a packet
|
100 |
* transport mechanism (ala level 0 of the PUP protocols).
|
101 |
*
|
102 |
* Each interface accepts output datagrams of a specified maximum
|
103 |
* length, and provides higher level routines with input datagrams
|
104 |
* received from its medium.
|
105 |
*
|
106 |
* Output occurs when the routine if_output is called, with four parameters:
|
107 |
* (*ifp->if_output)(ifp, m, dst, rt)
|
108 |
* Here m is the mbuf chain to be sent and dst is the destination address.
|
109 |
* The output routine encapsulates the supplied datagram if necessary,
|
110 |
* and then transmits it on its medium.
|
111 |
*
|
112 |
* On input, each interface unwraps the data received by it, and either
|
113 |
* places it on the input queue of a internetwork datagram routine
|
114 |
* and posts the associated software interrupt, or passes the datagram to a raw
|
115 |
* packet input routine.
|
116 |
*
|
117 |
* Routines exist for locating interfaces by their addresses
|
118 |
* or for locating a interface on a certain network, as well as more general
|
119 |
* routing and gateway routines maintaining information used to locate
|
120 |
* interfaces. These routines live in the files if.c and route.c
|
121 |
*/
|
122 |
#include <sys/time.h> |
123 |
|
124 |
#if defined(_KERNEL_OPT)
|
125 |
#include "opt_compat_netbsd.h" |
126 |
#include "opt_gateway.h" |
127 |
#endif
|
128 |
|
129 |
struct mbuf;
|
130 |
struct proc;
|
131 |
struct rtentry;
|
132 |
struct socket;
|
133 |
struct ether_header;
|
134 |
struct ifaddr;
|
135 |
struct ifnet;
|
136 |
struct rt_addrinfo;
|
137 |
|
138 |
#define IFNAMSIZ IF_NAMESIZE
|
139 |
|
140 |
/*
|
141 |
* Structure describing a `cloning' interface.
|
142 |
*/
|
143 |
struct if_clone {
|
144 |
LIST_ENTRY(if_clone) ifc_list; /* on list of cloners */
|
145 |
const char *ifc_name; /* name of device, e.g. `gif' */ |
146 |
size_t ifc_namelen; /* length of name */
|
147 |
|
148 |
int (*ifc_create)(struct if_clone *, int); |
149 |
int (*ifc_destroy)(struct ifnet *); |
150 |
}; |
151 |
|
152 |
#define IF_CLONE_INITIALIZER(name, create, destroy) \
|
153 |
{ { NULL, NULL }, name, sizeof(name) - 1, create, destroy } |
154 |
|
155 |
/*
|
156 |
* Structure used to query names of interface cloners.
|
157 |
*/
|
158 |
struct if_clonereq {
|
159 |
int ifcr_total; /* total cloners (out) */ |
160 |
int ifcr_count; /* room for this many in user buffer */ |
161 |
char *ifcr_buffer; /* buffer for cloner names */ |
162 |
}; |
163 |
|
164 |
/*
|
165 |
* Structure defining statistics and other data kept regarding a network
|
166 |
* interface.
|
167 |
*/
|
168 |
struct if_data {
|
169 |
/* generic interface information */
|
170 |
u_char ifi_type; /* ethernet, tokenring, etc. */
|
171 |
u_char ifi_addrlen; /* media address length */
|
172 |
u_char ifi_hdrlen; /* media header length */
|
173 |
int ifi_link_state; /* current link state */ |
174 |
uint64_t ifi_mtu; /* maximum transmission unit */
|
175 |
uint64_t ifi_metric; /* routing metric (external only) */
|
176 |
uint64_t ifi_baudrate; /* linespeed */
|
177 |
/* volatile statistics */
|
178 |
uint64_t ifi_ipackets; /* packets received on interface */
|
179 |
uint64_t ifi_ierrors; /* input errors on interface */
|
180 |
uint64_t ifi_opackets; /* packets sent on interface */
|
181 |
uint64_t ifi_oerrors; /* output errors on interface */
|
182 |
uint64_t ifi_collisions; /* collisions on csma interfaces */
|
183 |
uint64_t ifi_ibytes; /* total number of octets received */
|
184 |
uint64_t ifi_obytes; /* total number of octets sent */
|
185 |
uint64_t ifi_imcasts; /* packets received via multicast */
|
186 |
uint64_t ifi_omcasts; /* packets sent via multicast */
|
187 |
uint64_t ifi_iqdrops; /* dropped on input, this interface */
|
188 |
uint64_t ifi_noproto; /* destined for unsupported protocol */
|
189 |
struct timespec ifi_lastchange;/* last operational state change */ |
190 |
}; |
191 |
|
192 |
/*
|
193 |
* Values for if_link_state.
|
194 |
*/
|
195 |
#define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */ |
196 |
#define LINK_STATE_DOWN 1 /* link is down */ |
197 |
#define LINK_STATE_UP 2 /* link is up */ |
198 |
|
199 |
/*
|
200 |
* Structure defining a queue for a network interface.
|
201 |
*/
|
202 |
struct ifqueue {
|
203 |
struct mbuf *ifq_head;
|
204 |
struct mbuf *ifq_tail;
|
205 |
int ifq_len;
|
206 |
int ifq_maxlen;
|
207 |
int ifq_drops;
|
208 |
kmutex_t *ifq_lock; |
209 |
}; |
210 |
|
211 |
struct ifnet_lock;
|
212 |
|
213 |
#ifdef _KERNEL
|
214 |
#include <sys/condvar.h> |
215 |
#include <sys/percpu.h> |
216 |
#include <sys/callout.h> |
217 |
#ifdef GATEWAY
|
218 |
#include <sys/mutex.h> |
219 |
#else
|
220 |
#include <sys/rwlock.h> |
221 |
#endif
|
222 |
|
223 |
struct ifnet_lock {
|
224 |
kmutex_t il_lock; /* Protects the critical section. */
|
225 |
uint64_t il_nexit; /* Counts threads across all CPUs who
|
226 |
* have exited the critical section.
|
227 |
* Access to il_nexit is synchronized
|
228 |
* by il_lock.
|
229 |
*/
|
230 |
percpu_t *il_nenter; /* Counts threads on each CPU who have
|
231 |
* entered or who wait to enter the
|
232 |
* critical section protected by il_lock.
|
233 |
* Synchronization is not required.
|
234 |
*/
|
235 |
kcondvar_t il_emptied; /* The ifnet_lock user must arrange for
|
236 |
* the last threads in the critical
|
237 |
* section to signal this condition variable
|
238 |
* before they leave.
|
239 |
*/
|
240 |
}; |
241 |
#endif /* _KERNEL */ |
242 |
|
243 |
/*
|
244 |
* Structure defining a queue for a network interface.
|
245 |
*
|
246 |
* (Would like to call this struct ``if'', but C isn't PL/1.)
|
247 |
*/
|
248 |
TAILQ_HEAD(ifnet_head, ifnet); /* the actual queue head */
|
249 |
|
250 |
struct bridge_softc;
|
251 |
struct bridge_iflist;
|
252 |
struct callout;
|
253 |
struct krwlock;
|
254 |
|
255 |
typedef struct ifnet { |
256 |
void *if_softc; /* lower-level data for this if */ |
257 |
TAILQ_ENTRY(ifnet) if_list; /* all struct ifnets are chained */
|
258 |
TAILQ_HEAD(, ifaddr) if_addrlist; /* linked list of addresses per if */
|
259 |
char if_xname[IFNAMSIZ]; /* external name (name + unit) */ |
260 |
int if_pcount; /* number of promiscuous listeners */ |
261 |
struct bpf_if *if_bpf; /* packet filter structure */ |
262 |
u_short if_index; /* numeric abbreviation for this if */
|
263 |
short if_timer; /* time 'til if_slowtimo called */ |
264 |
short if_flags; /* up/down, broadcast, etc. */ |
265 |
short if__pad1; /* be nice to m68k ports */ |
266 |
struct if_data if_data; /* statistics and other data about if */ |
267 |
/*
|
268 |
* Procedure handles. If you add more of these, don't forget the
|
269 |
* corresponding NULL stub in if.c.
|
270 |
*/
|
271 |
int (*if_output) /* output routine (enqueue) */ |
272 |
(struct ifnet *, struct mbuf *, const struct sockaddr *, |
273 |
struct rtentry *);
|
274 |
void (*if_input) /* input routine (from h/w driver) */ |
275 |
(struct ifnet *, struct mbuf *); |
276 |
void (*if_start) /* initiate output routine */ |
277 |
(struct ifnet *);
|
278 |
int (*if_ioctl) /* ioctl routine */ |
279 |
(struct ifnet *, u_long, void *); |
280 |
int (*if_init) /* init routine */ |
281 |
(struct ifnet *);
|
282 |
void (*if_stop) /* stop routine */ |
283 |
(struct ifnet *, int); |
284 |
void (*if_slowtimo) /* timer routine */ |
285 |
(struct ifnet *);
|
286 |
#define if_watchdog if_slowtimo
|
287 |
void (*if_drain) /* routine to release resources */ |
288 |
(struct ifnet *);
|
289 |
struct ifaltq if_snd; /* output queue (includes altq) */ |
290 |
struct ifaddr *if_dl; /* identity of this interface. */ |
291 |
const struct sockaddr_dl *if_sadl; /* pointer to sockaddr_dl |
292 |
* of if_dl
|
293 |
*/
|
294 |
/* if_hwdl: h/w identity
|
295 |
*
|
296 |
* May be NULL. If not NULL, it is the address assigned
|
297 |
* to the interface by the manufacturer, so it very likely
|
298 |
* to be unique. It MUST NOT be deleted. It is highly
|
299 |
* suitable for deriving the EUI64 for the interface.
|
300 |
*/
|
301 |
struct ifaddr *if_hwdl;
|
302 |
const uint8_t *if_broadcastaddr;/* linklevel broadcast bytestring */ |
303 |
struct bridge_softc *if_bridge; /* bridge glue */ |
304 |
struct bridge_iflist *if_bridgeif; /* shortcut to interface list entry */ |
305 |
int if_dlt; /* data link type (<net/dlt.h>) */ |
306 |
pfil_head_t * if_pfil; /* filtering point */
|
307 |
uint64_t if_capabilities; /* interface capabilities */
|
308 |
uint64_t if_capenable; /* capabilities enabled */
|
309 |
union {
|
310 |
void * carp_s; /* carp structure (used by !carp ifs) */ |
311 |
struct ifnet *carp_d;/* ptr to carpdev (used by carp ifs) */ |
312 |
} if_carp_ptr; |
313 |
#define if_carp if_carp_ptr.carp_s
|
314 |
#define if_carpdev if_carp_ptr.carp_d
|
315 |
/*
|
316 |
* These are pre-computed based on an interfaces enabled
|
317 |
* capabilities, for speed elsewhere.
|
318 |
*/
|
319 |
int if_csum_flags_tx; /* M_CSUM_* flags for Tx */ |
320 |
int if_csum_flags_rx; /* M_CSUM_* flags for Rx */ |
321 |
|
322 |
void *if_afdata[AF_MAX];
|
323 |
struct mowner *if_mowner; /* who owns mbufs for this interface */ |
324 |
|
325 |
void *if_agrprivate; /* used only when #if NAGR > 0 */ |
326 |
|
327 |
/*
|
328 |
* pf specific data, used only when #if NPF > 0.
|
329 |
*/
|
330 |
void *if_pf_kif; /* pf interface abstraction */ |
331 |
void *if_pf_groups; /* pf interface groups */ |
332 |
/*
|
333 |
* During an ifnet's lifetime, it has only one if_index, but
|
334 |
* and if_index is not sufficient to identify an ifnet
|
335 |
* because during the lifetime of the system, many ifnets may occupy a
|
336 |
* given if_index. Let us tell different ifnets at the same
|
337 |
* if_index apart by their if_index_gen, a unique number that each ifnet
|
338 |
* is assigned when it if_attach()s. Now, the kernel can use the
|
339 |
* pair (if_index, if_index_gen) as a weak reference to an ifnet.
|
340 |
*/
|
341 |
uint64_t if_index_gen; /* generation number for the ifnet
|
342 |
* at if_index: if two ifnets' index
|
343 |
* and generation number are both the
|
344 |
* same, they are the same ifnet.
|
345 |
*/
|
346 |
struct sysctllog *if_sysctl_log;
|
347 |
int (*if_initaddr)(struct ifnet *, struct ifaddr *, bool); |
348 |
int (*if_mcastop)(struct ifnet *, const unsigned long, |
349 |
const struct sockaddr *); |
350 |
int (*if_setflags)(struct ifnet *, const short); |
351 |
struct ifnet_lock *if_ioctl_lock;
|
352 |
#ifdef _KERNEL /* XXX kvm(3) */ |
353 |
struct callout *if_slowtimo_ch;
|
354 |
#endif
|
355 |
#ifdef GATEWAY
|
356 |
struct kmutex *if_afdata_lock;
|
357 |
#else
|
358 |
struct krwlock *if_afdata_lock;
|
359 |
#endif
|
360 |
} ifnet_t; |
361 |
|
362 |
#define if_mtu if_data.ifi_mtu
|
363 |
#define if_type if_data.ifi_type
|
364 |
#define if_addrlen if_data.ifi_addrlen
|
365 |
#define if_hdrlen if_data.ifi_hdrlen
|
366 |
#define if_metric if_data.ifi_metric
|
367 |
#define if_link_state if_data.ifi_link_state
|
368 |
#define if_baudrate if_data.ifi_baudrate
|
369 |
#define if_ipackets if_data.ifi_ipackets
|
370 |
#define if_ierrors if_data.ifi_ierrors
|
371 |
#define if_opackets if_data.ifi_opackets
|
372 |
#define if_oerrors if_data.ifi_oerrors
|
373 |
#define if_collisions if_data.ifi_collisions
|
374 |
#define if_ibytes if_data.ifi_ibytes
|
375 |
#define if_obytes if_data.ifi_obytes
|
376 |
#define if_imcasts if_data.ifi_imcasts
|
377 |
#define if_omcasts if_data.ifi_omcasts
|
378 |
#define if_iqdrops if_data.ifi_iqdrops
|
379 |
#define if_noproto if_data.ifi_noproto
|
380 |
#define if_lastchange if_data.ifi_lastchange
|
381 |
|
382 |
#define IFF_UP 0x0001 /* interface is up */ |
383 |
#define IFF_BROADCAST 0x0002 /* broadcast address valid */ |
384 |
#define IFF_DEBUG 0x0004 /* turn on debugging */ |
385 |
#define IFF_LOOPBACK 0x0008 /* is a loopback net */ |
386 |
#define IFF_POINTOPOINT 0x0010 /* interface is point-to-point link */ |
387 |
#define IFF_NOTRAILERS 0x0020 /* avoid use of trailers */ |
388 |
#define IFF_RUNNING 0x0040 /* resources allocated */ |
389 |
#define IFF_NOARP 0x0080 /* no address resolution protocol */ |
390 |
#define IFF_PROMISC 0x0100 /* receive all packets */ |
391 |
#define IFF_ALLMULTI 0x0200 /* receive all multicast packets */ |
392 |
#define IFF_OACTIVE 0x0400 /* transmission in progress */ |
393 |
#define IFF_SIMPLEX 0x0800 /* can't hear own transmissions */ |
394 |
#define IFF_LINK0 0x1000 /* per link layer defined bit */ |
395 |
#define IFF_LINK1 0x2000 /* per link layer defined bit */ |
396 |
#define IFF_LINK2 0x4000 /* per link layer defined bit */ |
397 |
#define IFF_MULTICAST 0x8000 /* supports multicast */ |
398 |
|
399 |
#define IFFBITS \
|
400 |
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS" \
|
401 |
"\7RUNNING\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX" \
|
402 |
"\15LINK0\16LINK1\17LINK2\20MULTICAST"
|
403 |
|
404 |
/* flags set internally only: */
|
405 |
#define IFF_CANTCHANGE \
|
406 |
(IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ |
407 |
IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC) |
408 |
|
409 |
/*
|
410 |
* Some convenience macros used for setting ifi_baudrate.
|
411 |
*/
|
412 |
#define IF_Kbps(x) ((x) * 1000ULL) /* kilobits/sec. */ |
413 |
#define IF_Mbps(x) (IF_Kbps((x) * 1000ULL)) /* megabits/sec. */ |
414 |
#define IF_Gbps(x) (IF_Mbps((x) * 1000ULL)) /* gigabits/sec. */ |
415 |
|
416 |
/* Capabilities that interfaces can advertise. */
|
417 |
/* 0x01 .. 0x40 were previously used */
|
418 |
#define IFCAP_TSOv4 0x00080 /* can do TCPv4 segmentation offload */ |
419 |
#define IFCAP_CSUM_IPv4_Rx 0x00100 /* can do IPv4 header checksums (Rx) */ |
420 |
#define IFCAP_CSUM_IPv4_Tx 0x00200 /* can do IPv4 header checksums (Tx) */ |
421 |
#define IFCAP_CSUM_TCPv4_Rx 0x00400 /* can do IPv4/TCP checksums (Rx) */ |
422 |
#define IFCAP_CSUM_TCPv4_Tx 0x00800 /* can do IPv4/TCP checksums (Tx) */ |
423 |
#define IFCAP_CSUM_UDPv4_Rx 0x01000 /* can do IPv4/UDP checksums (Rx) */ |
424 |
#define IFCAP_CSUM_UDPv4_Tx 0x02000 /* can do IPv4/UDP checksums (Tx) */ |
425 |
#define IFCAP_CSUM_TCPv6_Rx 0x04000 /* can do IPv6/TCP checksums (Rx) */ |
426 |
#define IFCAP_CSUM_TCPv6_Tx 0x08000 /* can do IPv6/TCP checksums (Tx) */ |
427 |
#define IFCAP_CSUM_UDPv6_Rx 0x10000 /* can do IPv6/UDP checksums (Rx) */ |
428 |
#define IFCAP_CSUM_UDPv6_Tx 0x20000 /* can do IPv6/UDP checksums (Tx) */ |
429 |
#define IFCAP_TSOv6 0x40000 /* can do TCPv6 segmentation offload */ |
430 |
#define IFCAP_LRO 0x80000 /* can do Large Receive Offload */ |
431 |
#define IFCAP_MASK 0xfff80 /* currently valid capabilities */ |
432 |
|
433 |
#define IFCAPBITS \
|
434 |
"\020" \
|
435 |
"\10TSO4" \
|
436 |
"\11IP4CSUM_Rx" \
|
437 |
"\12IP4CSUM_Tx" \
|
438 |
"\13TCP4CSUM_Rx" \
|
439 |
"\14TCP4CSUM_Tx" \
|
440 |
"\15UDP4CSUM_Rx" \
|
441 |
"\16UDP4CSUM_Tx" \
|
442 |
"\17TCP6CSUM_Rx" \
|
443 |
"\20TCP6CSUM_Tx" \
|
444 |
"\21UDP6CSUM_Rx" \
|
445 |
"\22UDP6CSUM_Tx" \
|
446 |
"\23TSO6" \
|
447 |
"\24LRO" \
|
448 |
|
449 |
#ifdef GATEWAY
|
450 |
#define IF_AFDATA_LOCK_INIT(ifp) \
|
451 |
do { \
|
452 |
(ifp)->if_afdata_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); \ |
453 |
} while (0) |
454 |
|
455 |
#define IF_AFDATA_WLOCK(ifp) mutex_enter((ifp)->if_afdata_lock)
|
456 |
#define IF_AFDATA_RLOCK(ifp) mutex_enter((ifp)->if_afdata_lock)
|
457 |
#define IF_AFDATA_WUNLOCK(ifp) mutex_exit((ifp)->if_afdata_lock)
|
458 |
#define IF_AFDATA_RUNLOCK(ifp) mutex_exit((ifp)->if_afdata_lock)
|
459 |
#define IF_AFDATA_LOCK(ifp) IF_AFDATA_WLOCK(ifp)
|
460 |
#define IF_AFDATA_UNLOCK(ifp) IF_AFDATA_WUNLOCK(ifp)
|
461 |
#define IF_AFDATA_TRYLOCK(ifp) mutex_tryenter((ifp)->if_afdata_lock)
|
462 |
#define IF_AFDATA_DESTROY(ifp) mutex_destroy((ifp)->if_afdata_lock)
|
463 |
|
464 |
#define IF_AFDATA_LOCK_ASSERT(ifp) \
|
465 |
KASSERT(mutex_owned((ifp)->if_afdata_lock)) |
466 |
#define IF_AFDATA_RLOCK_ASSERT(ifp) \
|
467 |
KASSERT(mutex_owned((ifp)->if_afdata_lock)) |
468 |
#define IF_AFDATA_WLOCK_ASSERT(ifp) \
|
469 |
KASSERT(mutex_owned((ifp)->if_afdata_lock)) |
470 |
#define IF_AFDATA_UNLOCK_ASSERT(ifp) \
|
471 |
KASSERT(!mutex_owned((ifp)->if_afdata_lock)) |
472 |
|
473 |
#else /* GATEWAY */ |
474 |
#define IF_AFDATA_LOCK_INIT(ifp) \
|
475 |
do {(ifp)->if_afdata_lock = rw_obj_alloc();} while (0) |
476 |
|
477 |
#define IF_AFDATA_WLOCK(ifp) rw_enter((ifp)->if_afdata_lock, RW_WRITER)
|
478 |
#define IF_AFDATA_RLOCK(ifp) rw_enter((ifp)->if_afdata_lock, RW_READER)
|
479 |
#define IF_AFDATA_WUNLOCK(ifp) rw_exit((ifp)->if_afdata_lock)
|
480 |
#define IF_AFDATA_RUNLOCK(ifp) rw_exit((ifp)->if_afdata_lock)
|
481 |
#define IF_AFDATA_LOCK(ifp) IF_AFDATA_WLOCK(ifp)
|
482 |
#define IF_AFDATA_UNLOCK(ifp) IF_AFDATA_WUNLOCK(ifp)
|
483 |
#define IF_AFDATA_TRYLOCK(ifp) rw_tryenter((ifp)->if_afdata_lock, RW_WRITER)
|
484 |
#define IF_AFDATA_DESTROY(ifp) rw_destroy((ifp)->if_afdata_lock)
|
485 |
|
486 |
#define IF_AFDATA_LOCK_ASSERT(ifp) \
|
487 |
KASSERT(rw_lock_held((ifp)->if_afdata_lock)) |
488 |
#define IF_AFDATA_RLOCK_ASSERT(ifp) \
|
489 |
KASSERT(rw_read_held((ifp)->if_afdata_lock)) |
490 |
#define IF_AFDATA_WLOCK_ASSERT(ifp) \
|
491 |
KASSERT(rw_write_held((ifp)->if_afdata_lock)) |
492 |
#define IF_AFDATA_UNLOCK_ASSERT(ifp) \
|
493 |
KASSERT(!rw_lock_held((ifp)->if_afdata_lock)) |
494 |
#endif /* GATEWAY */ |
495 |
|
496 |
#define IFQ_LOCK(_ifq) if ((_ifq)->ifq_lock) mutex_enter((_ifq)->ifq_lock) |
497 |
#define IFQ_UNLOCK(_ifq) if ((_ifq)->ifq_lock) mutex_exit((_ifq)->ifq_lock) |
498 |
|
499 |
/*
|
500 |
* Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
|
501 |
* input routines have queues of messages stored on ifqueue structures
|
502 |
* (defined above). Entries are added to and deleted from these structures
|
503 |
* by these macros, which should be called with ipl raised to splnet().
|
504 |
*/
|
505 |
#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
|
506 |
#define IF_DROP(ifq) ((ifq)->ifq_drops++)
|
507 |
#define IF_ENQUEUE(ifq, m) do { \ |
508 |
(m)->m_nextpkt = 0; \
|
509 |
if ((ifq)->ifq_tail == 0) \ |
510 |
(ifq)->ifq_head = m; \ |
511 |
else \
|
512 |
(ifq)->ifq_tail->m_nextpkt = m; \ |
513 |
(ifq)->ifq_tail = m; \ |
514 |
(ifq)->ifq_len++; \ |
515 |
} while (/*CONSTCOND*/0) |
516 |
#define IF_PREPEND(ifq, m) do { \ |
517 |
(m)->m_nextpkt = (ifq)->ifq_head; \ |
518 |
if ((ifq)->ifq_tail == 0) \ |
519 |
(ifq)->ifq_tail = (m); \ |
520 |
(ifq)->ifq_head = (m); \ |
521 |
(ifq)->ifq_len++; \ |
522 |
} while (/*CONSTCOND*/0) |
523 |
#define IF_DEQUEUE(ifq, m) do { \ |
524 |
(m) = (ifq)->ifq_head; \ |
525 |
if (m) { \
|
526 |
if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ |
527 |
(ifq)->ifq_tail = 0; \
|
528 |
(m)->m_nextpkt = 0; \
|
529 |
(ifq)->ifq_len--; \ |
530 |
} \ |
531 |
} while (/*CONSTCOND*/0) |
532 |
#define IF_POLL(ifq, m) ((m) = (ifq)->ifq_head)
|
533 |
#define IF_PURGE(ifq) \
|
534 |
do { \
|
535 |
struct mbuf *__m0; \
|
536 |
\ |
537 |
for (;;) { \
|
538 |
IF_DEQUEUE((ifq), __m0); \ |
539 |
if (__m0 == NULL) \ |
540 |
break; \
|
541 |
else \
|
542 |
m_freem(__m0); \ |
543 |
} \ |
544 |
} while (/*CONSTCOND*/ 0) |
545 |
#define IF_IS_EMPTY(ifq) ((ifq)->ifq_len == 0) |
546 |
|
547 |
#ifndef IFQ_MAXLEN
|
548 |
#define IFQ_MAXLEN 256 |
549 |
#endif
|
550 |
#define IFNET_SLOWHZ 1 /* granularity is 1 second */ |
551 |
|
552 |
/*
|
553 |
* Structure defining statistics and other data kept regarding an address
|
554 |
* on a network interface.
|
555 |
*/
|
556 |
struct ifaddr_data {
|
557 |
int64_t ifad_inbytes; |
558 |
int64_t ifad_outbytes; |
559 |
}; |
560 |
|
561 |
/*
|
562 |
* The ifaddr structure contains information about one address
|
563 |
* of an interface. They are maintained by the different address families,
|
564 |
* are allocated and attached when an address is set, and are linked
|
565 |
* together so all addresses for an interface can be located.
|
566 |
*/
|
567 |
struct ifaddr {
|
568 |
struct sockaddr *ifa_addr; /* address of interface */ |
569 |
struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ |
570 |
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ |
571 |
struct sockaddr *ifa_netmask; /* used to determine subnet */ |
572 |
struct ifnet *ifa_ifp; /* back-pointer to interface */ |
573 |
TAILQ_ENTRY(ifaddr) ifa_list; /* list of addresses for interface */
|
574 |
struct ifaddr_data ifa_data; /* statistics on the address */ |
575 |
void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ |
576 |
(int, struct rtentry *, const struct rt_addrinfo *); |
577 |
u_int ifa_flags; /* mostly rt_flags for cloning */
|
578 |
int ifa_refcnt; /* count of references */ |
579 |
int ifa_metric; /* cost of going out this interface */ |
580 |
struct ifaddr *(*ifa_getifa)(struct ifaddr *, |
581 |
const struct sockaddr *); |
582 |
uint32_t *ifa_seqno; |
583 |
int16_t ifa_preference; /* preference level for this address */
|
584 |
}; |
585 |
#define IFA_ROUTE RTF_UP /* (0x01) route installed */ |
586 |
|
587 |
/*
|
588 |
* Message format for use in obtaining information about interfaces from
|
589 |
* sysctl and the routing socket. We need to force 64-bit alignment if we
|
590 |
* aren't using compatiblity definitons.
|
591 |
*/
|
592 |
#if !defined(_KERNEL) || !defined(COMPAT_RTSOCK)
|
593 |
#define __align64 __aligned(sizeof(uint64_t)) |
594 |
#else
|
595 |
#define __align64
|
596 |
#endif
|
597 |
struct if_msghdr {
|
598 |
u_short ifm_msglen __align64; |
599 |
/* to skip over non-understood messages */
|
600 |
u_char ifm_version; /* future binary compatibility */
|
601 |
u_char ifm_type; /* message type */
|
602 |
int ifm_addrs; /* like rtm_addrs */ |
603 |
int ifm_flags; /* value of if_flags */ |
604 |
u_short ifm_index; /* index for associated ifp */
|
605 |
struct if_data ifm_data __align64;
|
606 |
/* statistics and other data about if */
|
607 |
}; |
608 |
|
609 |
/*
|
610 |
* Message format for use in obtaining information about interface addresses
|
611 |
* from sysctl and the routing socket.
|
612 |
*/
|
613 |
struct ifa_msghdr {
|
614 |
u_short ifam_msglen __align64; |
615 |
/* to skip over non-understood messages */
|
616 |
u_char ifam_version; /* future binary compatibility */
|
617 |
u_char ifam_type; /* message type */
|
618 |
int ifam_addrs; /* like rtm_addrs */ |
619 |
int ifam_flags; /* value of ifa_flags */ |
620 |
int ifam_metric; /* value of ifa_metric */ |
621 |
u_short ifam_index; /* index for associated ifp */
|
622 |
}; |
623 |
|
624 |
/*
|
625 |
* Message format announcing the arrival or departure of a network interface.
|
626 |
*/
|
627 |
struct if_announcemsghdr {
|
628 |
u_short ifan_msglen __align64; |
629 |
/* to skip over non-understood messages */
|
630 |
u_char ifan_version; /* future binary compatibility */
|
631 |
u_char ifan_type; /* message type */
|
632 |
u_short ifan_index; /* index for associated ifp */
|
633 |
char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
634 |
u_short ifan_what; /* what type of announcement */
|
635 |
}; |
636 |
|
637 |
#define IFAN_ARRIVAL 0 /* interface arrival */ |
638 |
#define IFAN_DEPARTURE 1 /* interface departure */ |
639 |
|
640 |
#undef __align64
|
641 |
|
642 |
/*
|
643 |
* Interface request structure used for socket
|
644 |
* ioctl's. All interface ioctl's must have parameter
|
645 |
* definitions which begin with ifr_name. The
|
646 |
* remainder may be interface specific.
|
647 |
*/
|
648 |
struct ifreq {
|
649 |
char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
650 |
union {
|
651 |
struct sockaddr ifru_addr;
|
652 |
struct sockaddr ifru_dstaddr;
|
653 |
struct sockaddr ifru_broadaddr;
|
654 |
struct sockaddr_storage ifru_space;
|
655 |
short ifru_flags;
|
656 |
int ifru_addrflags;
|
657 |
int ifru_metric;
|
658 |
int ifru_mtu;
|
659 |
int ifru_dlt;
|
660 |
u_int ifru_value; |
661 |
void * ifru_data;
|
662 |
struct {
|
663 |
uint32_t b_buflen; |
664 |
void *b_buf;
|
665 |
} ifru_b; |
666 |
} ifr_ifru; |
667 |
#define ifr_addr ifr_ifru.ifru_addr /* address */ |
668 |
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ |
669 |
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ |
670 |
#define ifr_space ifr_ifru.ifru_space /* sockaddr_storage */ |
671 |
#define ifr_flags ifr_ifru.ifru_flags /* flags */ |
672 |
#define ifr_addrflags ifr_ifru.ifru_addrflags /* addr flags */ |
673 |
#define ifr_metric ifr_ifru.ifru_metric /* metric */ |
674 |
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ |
675 |
#define ifr_dlt ifr_ifru.ifru_dlt /* data link type (DLT_*) */ |
676 |
#define ifr_value ifr_ifru.ifru_value /* generic value */ |
677 |
#define ifr_media ifr_ifru.ifru_metric /* media options (overload) */ |
678 |
#define ifr_data ifr_ifru.ifru_data /* for use by interface |
679 |
* XXX deprecated
|
680 |
*/
|
681 |
#define ifr_buf ifr_ifru.ifru_b.b_buf /* new interface ioctls */ |
682 |
#define ifr_buflen ifr_ifru.ifru_b.b_buflen
|
683 |
#define ifr_index ifr_ifru.ifru_value /* interface index, BSD */ |
684 |
#define ifr_ifindex ifr_index /* interface index, linux */ |
685 |
}; |
686 |
|
687 |
#ifdef _KERNEL
|
688 |
#define ifreq_setdstaddr ifreq_setaddr
|
689 |
#define ifreq_setbroadaddr ifreq_setaddr
|
690 |
#define ifreq_getdstaddr ifreq_getaddr
|
691 |
#define ifreq_getbroadaddr ifreq_getaddr
|
692 |
|
693 |
static inline const struct sockaddr * |
694 |
/*ARGSUSED*/
|
695 |
ifreq_getaddr(u_long cmd, const struct ifreq *ifr) |
696 |
{ |
697 |
return &ifr->ifr_addr;
|
698 |
} |
699 |
#endif /* _KERNEL */ |
700 |
|
701 |
struct ifcapreq {
|
702 |
char ifcr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
703 |
uint64_t ifcr_capabilities; /* supported capabiliites */
|
704 |
uint64_t ifcr_capenable; /* capabilities enabled */
|
705 |
}; |
706 |
|
707 |
struct ifaliasreq {
|
708 |
char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
709 |
struct sockaddr ifra_addr;
|
710 |
struct sockaddr ifra_dstaddr;
|
711 |
#define ifra_broadaddr ifra_dstaddr
|
712 |
struct sockaddr ifra_mask;
|
713 |
}; |
714 |
|
715 |
struct ifdatareq {
|
716 |
char ifdr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
717 |
struct if_data ifdr_data;
|
718 |
}; |
719 |
|
720 |
struct ifmediareq {
|
721 |
char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
722 |
int ifm_current; /* current media options */ |
723 |
int ifm_mask; /* don't care mask */ |
724 |
int ifm_status; /* media status */ |
725 |
int ifm_active; /* active options */ |
726 |
int ifm_count; /* # entries in ifm_ulist |
727 |
array */
|
728 |
int *ifm_ulist; /* media words */ |
729 |
}; |
730 |
|
731 |
|
732 |
struct ifdrv {
|
733 |
char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
734 |
unsigned long ifd_cmd; |
735 |
size_t ifd_len; |
736 |
void *ifd_data;
|
737 |
}; |
738 |
#define IFLINKSTR_QUERYLEN 0x01 |
739 |
#define IFLINKSTR_UNSET 0x02 |
740 |
|
741 |
/*
|
742 |
* Structure used in SIOCGIFCONF request.
|
743 |
* Used to retrieve interface configuration
|
744 |
* for machine (useful for programs which
|
745 |
* must know all networks accessible).
|
746 |
*/
|
747 |
struct ifconf {
|
748 |
int ifc_len; /* size of associated buffer */ |
749 |
union {
|
750 |
void * ifcu_buf;
|
751 |
struct ifreq *ifcu_req;
|
752 |
} ifc_ifcu; |
753 |
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ |
754 |
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ |
755 |
}; |
756 |
|
757 |
/*
|
758 |
* Structure for SIOC[AGD]LIFADDR
|
759 |
*/
|
760 |
struct if_laddrreq {
|
761 |
char iflr_name[IFNAMSIZ];
|
762 |
unsigned int flags; |
763 |
#define IFLR_PREFIX 0x8000 /* in: prefix given out: kernel fills id */ |
764 |
#define IFLR_ACTIVE 0x4000 /* in/out: link-layer address activation */ |
765 |
#define IFLR_FACTORY 0x2000 /* in/out: factory link-layer address */ |
766 |
unsigned int prefixlen; /* in/out */ |
767 |
struct sockaddr_storage addr; /* in/out */ |
768 |
struct sockaddr_storage dstaddr; /* out */ |
769 |
}; |
770 |
|
771 |
/*
|
772 |
* Structure for SIOC[SG]IFADDRPREF
|
773 |
*/
|
774 |
struct if_addrprefreq {
|
775 |
char ifap_name[IFNAMSIZ];
|
776 |
int16_t ifap_preference; /* in/out */
|
777 |
struct sockaddr_storage ifap_addr; /* in/out */ |
778 |
}; |
779 |
|
780 |
#include <net/if_arp.h> |
781 |
|
782 |
#endif /* _NETBSD_SOURCE */ |
783 |
|
784 |
#ifdef _KERNEL
|
785 |
#ifdef ALTQ
|
786 |
#define ALTQ_DECL(x) x
|
787 |
#define ALTQ_COMMA ,
|
788 |
|
789 |
#define IFQ_ENQUEUE(ifq, m, pattr, err) \
|
790 |
do { \
|
791 |
IFQ_LOCK((ifq)); \ |
792 |
if (ALTQ_IS_ENABLED((ifq))) \
|
793 |
ALTQ_ENQUEUE((ifq), (m), (pattr), (err)); \ |
794 |
else { \
|
795 |
if (IF_QFULL((ifq))) { \
|
796 |
m_freem((m)); \ |
797 |
(err) = ENOBUFS; \ |
798 |
} else { \
|
799 |
IF_ENQUEUE((ifq), (m)); \ |
800 |
(err) = 0; \
|
801 |
} \ |
802 |
} \ |
803 |
if ((err)) \
|
804 |
(ifq)->ifq_drops++; \ |
805 |
IFQ_UNLOCK((ifq)); \ |
806 |
} while (/*CONSTCOND*/ 0) |
807 |
|
808 |
#define IFQ_DEQUEUE(ifq, m) \
|
809 |
do { \
|
810 |
IFQ_LOCK((ifq)); \ |
811 |
if (TBR_IS_ENABLED((ifq))) \
|
812 |
(m) = tbr_dequeue((ifq), ALTDQ_REMOVE); \ |
813 |
else if (ALTQ_IS_ENABLED((ifq))) \ |
814 |
ALTQ_DEQUEUE((ifq), (m)); \ |
815 |
else \
|
816 |
IF_DEQUEUE((ifq), (m)); \ |
817 |
IFQ_UNLOCK((ifq)); \ |
818 |
} while (/*CONSTCOND*/ 0) |
819 |
|
820 |
#define IFQ_POLL(ifq, m) \
|
821 |
do { \
|
822 |
IFQ_LOCK((ifq)); \ |
823 |
if (TBR_IS_ENABLED((ifq))) \
|
824 |
(m) = tbr_dequeue((ifq), ALTDQ_POLL); \ |
825 |
else if (ALTQ_IS_ENABLED((ifq))) \ |
826 |
ALTQ_POLL((ifq), (m)); \ |
827 |
else \
|
828 |
IF_POLL((ifq), (m)); \ |
829 |
IFQ_UNLOCK((ifq)); \ |
830 |
} while (/*CONSTCOND*/ 0) |
831 |
|
832 |
#define IFQ_PURGE(ifq) \
|
833 |
do { \
|
834 |
IFQ_LOCK((ifq)); \ |
835 |
if (ALTQ_IS_ENABLED((ifq))) \
|
836 |
ALTQ_PURGE((ifq)); \ |
837 |
else \
|
838 |
IF_PURGE((ifq)); \ |
839 |
IFQ_UNLOCK((ifq)); \ |
840 |
} while (/*CONSTCOND*/ 0) |
841 |
|
842 |
#define IFQ_SET_READY(ifq) \
|
843 |
do { \
|
844 |
(ifq)->altq_flags |= ALTQF_READY; \ |
845 |
} while (/*CONSTCOND*/ 0) |
846 |
|
847 |
#define IFQ_CLASSIFY(ifq, m, af, pattr) \
|
848 |
do { \
|
849 |
IFQ_LOCK((ifq)); \ |
850 |
if (ALTQ_IS_ENABLED((ifq))) { \
|
851 |
if (ALTQ_NEEDS_CLASSIFY((ifq))) \
|
852 |
(pattr)->pattr_class = (*(ifq)->altq_classify) \ |
853 |
((ifq)->altq_clfier, (m), (af)); \ |
854 |
(pattr)->pattr_af = (af); \ |
855 |
(pattr)->pattr_hdr = mtod((m), void *); \
|
856 |
} \ |
857 |
IFQ_UNLOCK((ifq)); \ |
858 |
} while (/*CONSTCOND*/ 0) |
859 |
#else /* ! ALTQ */ |
860 |
#define ALTQ_DECL(x) /* nothing */ |
861 |
#define ALTQ_COMMA
|
862 |
|
863 |
#define IFQ_ENQUEUE(ifq, m, pattr, err) \
|
864 |
do { \
|
865 |
IFQ_LOCK((ifq)); \ |
866 |
if (IF_QFULL((ifq))) { \
|
867 |
m_freem((m)); \ |
868 |
(err) = ENOBUFS; \ |
869 |
} else { \
|
870 |
IF_ENQUEUE((ifq), (m)); \ |
871 |
(err) = 0; \
|
872 |
} \ |
873 |
if ((err)) \
|
874 |
(ifq)->ifq_drops++; \ |
875 |
IFQ_UNLOCK((ifq)); \ |
876 |
} while (/*CONSTCOND*/ 0) |
877 |
|
878 |
#define IFQ_DEQUEUE(ifq, m) \
|
879 |
do { \
|
880 |
IFQ_LOCK((ifq)); \ |
881 |
IF_DEQUEUE((ifq), (m)); \ |
882 |
IFQ_UNLOCK((ifq)); \ |
883 |
} while (/*CONSTCOND*/ 0) |
884 |
|
885 |
#define IFQ_POLL(ifq, m) \
|
886 |
do { \
|
887 |
IFQ_LOCK((ifq)); \ |
888 |
IF_POLL((ifq), (m)); \ |
889 |
IFQ_UNLOCK((ifq)); \ |
890 |
} while (/*CONSTCOND*/ 0) |
891 |
|
892 |
#define IFQ_PURGE(ifq) \
|
893 |
do { \
|
894 |
IFQ_LOCK((ifq)); \ |
895 |
IF_PURGE((ifq)); \ |
896 |
IFQ_UNLOCK((ifq)); \ |
897 |
} while (/*CONSTCOND*/ 0) |
898 |
|
899 |
#define IFQ_SET_READY(ifq) /* nothing */ |
900 |
|
901 |
#define IFQ_CLASSIFY(ifq, m, af, pattr) /* nothing */ |
902 |
|
903 |
#endif /* ALTQ */ |
904 |
|
905 |
#define IFQ_IS_EMPTY(ifq) IF_IS_EMPTY((ifq))
|
906 |
#define IFQ_INC_LEN(ifq) ((ifq)->ifq_len++)
|
907 |
#define IFQ_DEC_LEN(ifq) (--(ifq)->ifq_len)
|
908 |
#define IFQ_INC_DROPS(ifq) ((ifq)->ifq_drops++)
|
909 |
#define IFQ_SET_MAXLEN(ifq, len) ((ifq)->ifq_maxlen = (len))
|
910 |
|
911 |
#include <sys/mallocvar.h> |
912 |
MALLOC_DECLARE(M_IFADDR); |
913 |
MALLOC_DECLARE(M_IFMADDR); |
914 |
|
915 |
int ifreq_setaddr(u_long, struct ifreq *, const struct sockaddr *); |
916 |
|
917 |
struct ifnet *if_alloc(u_char);
|
918 |
void if_free(struct ifnet *); |
919 |
void if_initname(struct ifnet *, const char *, int); |
920 |
struct ifaddr *if_dl_create(const struct ifnet *, const struct sockaddr_dl **); |
921 |
void if_activate_sadl(struct ifnet *, struct ifaddr *, |
922 |
const struct sockaddr_dl *); |
923 |
void if_set_sadl(struct ifnet *, const void *, u_char, bool); |
924 |
void if_alloc_sadl(struct ifnet *); |
925 |
void if_initialize(struct ifnet *); |
926 |
void if_register(struct ifnet *); |
927 |
void if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */ |
928 |
void if_attachdomain(void); |
929 |
void if_deactivate(struct ifnet *); |
930 |
void if_purgeaddrs(struct ifnet *, int, void (*)(struct ifaddr *)); |
931 |
void if_detach(struct ifnet *); |
932 |
void if_down(struct ifnet *); |
933 |
void if_link_state_change(struct ifnet *, int); |
934 |
void if_up(struct ifnet *); |
935 |
void ifinit(void); |
936 |
void ifinit1(void); |
937 |
int ifaddrpref_ioctl(struct socket *, u_long, void *, struct ifnet *); |
938 |
extern int (*ifioctl)(struct socket *, u_long, void *, struct lwp *); |
939 |
int ifioctl_common(struct ifnet *, u_long, void *); |
940 |
int ifpromisc(struct ifnet *, int); |
941 |
struct ifnet *ifunit(const char *); |
942 |
int if_addr_init(ifnet_t *, struct ifaddr *, bool); |
943 |
int if_do_dad(struct ifnet *); |
944 |
int if_mcast_op(ifnet_t *, const unsigned long, const struct sockaddr *); |
945 |
int if_flags_set(struct ifnet *, const short); |
946 |
int if_clone_list(int, char *, int *); |
947 |
|
948 |
void ifa_insert(struct ifnet *, struct ifaddr *); |
949 |
void ifa_remove(struct ifnet *, struct ifaddr *); |
950 |
|
951 |
void ifaref(struct ifaddr *); |
952 |
void ifafree(struct ifaddr *); |
953 |
|
954 |
struct ifaddr *ifa_ifwithaddr(const struct sockaddr *); |
955 |
struct ifaddr *ifa_ifwithaf(int); |
956 |
struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *); |
957 |
struct ifaddr *ifa_ifwithnet(const struct sockaddr *); |
958 |
struct ifaddr *ifa_ifwithladdr(const struct sockaddr *); |
959 |
struct ifaddr *ifa_ifwithroute(int, const struct sockaddr *, |
960 |
const struct sockaddr *); |
961 |
struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *); |
962 |
void ifafree(struct ifaddr *); |
963 |
void link_rtrequest(int, struct rtentry *, const struct rt_addrinfo *); |
964 |
void p2p_rtrequest(int, struct rtentry *, const struct rt_addrinfo *); |
965 |
|
966 |
void if_clone_attach(struct if_clone *); |
967 |
void if_clone_detach(struct if_clone *); |
968 |
|
969 |
int ifq_enqueue(struct ifnet *, struct mbuf * ALTQ_COMMA |
970 |
ALTQ_DECL(struct altq_pktattr *));
|
971 |
int ifq_enqueue2(struct ifnet *, struct ifqueue *, struct mbuf * ALTQ_COMMA |
972 |
ALTQ_DECL(struct altq_pktattr *));
|
973 |
|
974 |
int loioctl(struct ifnet *, u_long, void *); |
975 |
void loopattach(int); |
976 |
int looutput(struct ifnet *, |
977 |
struct mbuf *, const struct sockaddr *, struct rtentry *); |
978 |
void lortrequest(int, struct rtentry *, const struct rt_addrinfo *); |
979 |
|
980 |
/*
|
981 |
* These are exported because they're an easy way to tell if
|
982 |
* an interface is going away without having to burn a flag.
|
983 |
*/
|
984 |
int if_nulloutput(struct ifnet *, struct mbuf *, |
985 |
const struct sockaddr *, struct rtentry *); |
986 |
void if_nullinput(struct ifnet *, struct mbuf *); |
987 |
void if_nullstart(struct ifnet *); |
988 |
int if_nullioctl(struct ifnet *, u_long, void *); |
989 |
int if_nullinit(struct ifnet *); |
990 |
void if_nullstop(struct ifnet *, int); |
991 |
void if_nullslowtimo(struct ifnet *); |
992 |
#define if_nullwatchdog if_nullslowtimo
|
993 |
void if_nulldrain(struct ifnet *); |
994 |
#else
|
995 |
struct if_nameindex {
|
996 |
unsigned int if_index; /* 1, 2, ... */ |
997 |
char *if_name; /* null terminated name: "le0", ... */ |
998 |
}; |
999 |
|
1000 |
#include <sys/cdefs.h> |
1001 |
__BEGIN_DECLS |
1002 |
unsigned int if_nametoindex(const char *); |
1003 |
char * if_indextoname(unsigned int, char *); |
1004 |
struct if_nameindex * if_nameindex(void); |
1005 |
void if_freenameindex(struct if_nameindex *); |
1006 |
__END_DECLS |
1007 |
#endif /* _KERNEL */ /* XXX really ALTQ? */ |
1008 |
|
1009 |
#ifdef _KERNEL
|
1010 |
|
1011 |
#define IFNET_FIRST() TAILQ_FIRST(&ifnet_list)
|
1012 |
#define IFNET_EMPTY() TAILQ_EMPTY(&ifnet_list)
|
1013 |
#define IFNET_NEXT(__ifp) TAILQ_NEXT((__ifp), if_list)
|
1014 |
#define IFNET_FOREACH(__ifp) TAILQ_FOREACH(__ifp, &ifnet_list, if_list)
|
1015 |
#define IFADDR_FIRST(__ifp) TAILQ_FIRST(&(__ifp)->if_addrlist)
|
1016 |
#define IFADDR_NEXT(__ifa) TAILQ_NEXT((__ifa), ifa_list)
|
1017 |
#define IFADDR_FOREACH(__ifa, __ifp) TAILQ_FOREACH(__ifa, \
|
1018 |
&(__ifp)->if_addrlist, ifa_list) |
1019 |
#define IFADDR_FOREACH_SAFE(__ifa, __ifp, __nifa) \
|
1020 |
TAILQ_FOREACH_SAFE(__ifa, \ |
1021 |
&(__ifp)->if_addrlist, ifa_list, __nifa) |
1022 |
#define IFADDR_EMPTY(__ifp) TAILQ_EMPTY(&(__ifp)->if_addrlist)
|
1023 |
|
1024 |
extern struct ifnet_head ifnet_list; |
1025 |
extern struct ifnet *lo0ifp; |
1026 |
|
1027 |
ifnet_t * if_byindex(u_int); |
1028 |
|
1029 |
/*
|
1030 |
* ifq sysctl support
|
1031 |
*/
|
1032 |
int sysctl_ifq(int *name, u_int namelen, void *oldp, |
1033 |
size_t *oldlenp, void *newp, size_t newlen,
|
1034 |
struct ifqueue *ifq);
|
1035 |
/* symbolic names for terminal (per-protocol) CTL_IFQ_ nodes */
|
1036 |
#define IFQCTL_LEN 1 |
1037 |
#define IFQCTL_MAXLEN 2 |
1038 |
#define IFQCTL_PEAK 3 |
1039 |
#define IFQCTL_DROPS 4 |
1040 |
#define IFQCTL_MAXID 5 |
1041 |
|
1042 |
#endif /* _KERNEL */ |
1043 |
|
1044 |
#ifdef _NETBSD_SOURCE
|
1045 |
/*
|
1046 |
* sysctl for ifq (per-protocol packet input queue variant of ifqueue)
|
1047 |
*/
|
1048 |
#define CTL_IFQ_NAMES { \
|
1049 |
{ 0, 0 }, \ |
1050 |
{ "len", CTLTYPE_INT }, \
|
1051 |
{ "maxlen", CTLTYPE_INT }, \
|
1052 |
{ "peak", CTLTYPE_INT }, \
|
1053 |
{ "drops", CTLTYPE_INT }, \
|
1054 |
} |
1055 |
#endif /* _NETBSD_SOURCE */ |
1056 |
#endif /* !_NET_IF_H_ */ |