|
1 /* |
|
2 * Copyright (c) 1982, 1986, 1989, 1993 |
|
3 * The Regents of the University of California. All rights reserved. |
|
4 * Redistribution and use in source and binary forms, with or without |
|
5 * modification, are permitted provided that the following conditions |
|
6 * are met: |
|
7 * 1. Redistributions of source code must retain the above copyright |
|
8 * notice, this list of conditions and the following disclaimer. |
|
9 * 2. Redistributions in binary form must reproduce the above copyright |
|
10 * notice, this list of conditions and the following disclaimer in the |
|
11 * documentation and/or other materials provided with the distribution. |
|
12 * 4. Neither the name of the University nor the names of its contributors |
|
13 * may be used to endorse or promote products derived from this software |
|
14 * without specific prior written permission. |
|
15 * |
|
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
26 * SUCH DAMAGE. |
|
27 * |
|
28 * Portions Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. |
|
29 * From: @(#)if.h 8.1 (Berkeley) 6/10/93 |
|
30 * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.16 2003/04/15 18:11:19 fjoe Exp $ |
|
31 * $DragonFly: src/sys/net/if_var.h,v 1.40 2007/09/09 03:51:25 sephe Exp $ |
|
32 */ |
|
33 |
|
34 #ifndef _NET_IF_VAR_H_ |
|
35 #define _NET_IF_VAR_H_ |
|
36 |
|
37 #ifndef __SYMBIAN32__ |
|
38 #ifndef _SYS_SERIALIZE_H_ |
|
39 #include <sys/serialize.h> |
|
40 #endif |
|
41 #endif //__SYMBIAN32__ |
|
42 #ifndef _NET_IF_H_ |
|
43 #include <stdapis/net/if.h> |
|
44 #endif |
|
45 |
|
46 /* |
|
47 * Structures defining a network interface, providing a packet |
|
48 * transport mechanism (ala level 0 of the PUP protocols). |
|
49 * |
|
50 * Each interface accepts output datagrams of a specified maximum |
|
51 * length, and provides higher level routines with input datagrams |
|
52 * received from its medium. |
|
53 * |
|
54 * Output occurs when the routine if_output is called, with four parameters: |
|
55 * ifp->if_output(ifp, m, dst, rt) |
|
56 * Here m is the mbuf chain to be sent and dst is the destination address. |
|
57 * The output routine encapsulates the supplied datagram if necessary, |
|
58 * and then transmits it on its medium. |
|
59 * |
|
60 * On input, each interface unwraps the data received by it, and either |
|
61 * places it on the input queue of a internetwork datagram routine |
|
62 * and posts the associated software interrupt, or passes the datagram to |
|
63 * the routine if_input. It is called with the mbuf chain as parameter: |
|
64 * ifp->if_input(ifp, m) |
|
65 * The input routine removes the protocol dependent header if necessary. |
|
66 * |
|
67 * Routines exist for locating interfaces by their addresses |
|
68 * or for locating a interface on a certain network, as well as more general |
|
69 * routing and gateway routines maintaining information used to locate |
|
70 * interfaces. These routines live in the files if.c and route.c |
|
71 */ |
|
72 |
|
73 /* |
|
74 * Forward structure declarations for function prototypes [sic]. |
|
75 */ |
|
76 struct mbuf; |
|
77 struct proc; |
|
78 struct rtentry; |
|
79 struct rt_addrinfo; |
|
80 struct socket; |
|
81 struct ether_header; |
|
82 struct carp_if; |
|
83 struct ucred; |
|
84 struct lwkt_serialize; |
|
85 |
|
86 #include <sys/queue.h> /* get TAILQ macros */ |
|
87 |
|
88 #ifndef __SYMBIAN32__ |
|
89 #include <net/altq/if_altq.h> |
|
90 #endif //__SYMBIAN32__ |
|
91 #ifdef _KERNEL |
|
92 #include <sys/eventhandler.h> |
|
93 #include <sys/mbuf.h> |
|
94 #include <sys/systm.h> /* XXX */ |
|
95 #include <sys/thread2.h> |
|
96 #endif /* _KERNEL */ |
|
97 |
|
98 #define IF_DUNIT_NONE -1 |
|
99 |
|
100 TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */ |
|
101 TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */ |
|
102 TAILQ_HEAD(ifprefixhead, ifprefix); |
|
103 LIST_HEAD(ifmultihead, ifmultiaddr); |
|
104 |
|
105 /* |
|
106 * Structure defining a queue for a network interface. |
|
107 */ |
|
108 struct ifqueue { |
|
109 struct mbuf *ifq_head; |
|
110 struct mbuf *ifq_tail; |
|
111 int ifq_len; |
|
112 int ifq_maxlen; |
|
113 int ifq_drops; |
|
114 }; |
|
115 |
|
116 /* |
|
117 * Note of DEVICE_POLLING |
|
118 * 1) Any file(*.c) that depends on DEVICE_POLLING supports in this |
|
119 * file should include opt_polling.h at its beginning. |
|
120 * 2) When struct changes, which are conditioned by DEVICE_POLLING, |
|
121 * are to be introduced, please keep the struct's size and layout |
|
122 * same, no matter whether DEVICE_POLLING is defined or not. |
|
123 * See ifnet.if_poll and ifnet.if_poll_unused for example. |
|
124 */ |
|
125 |
|
126 #ifdef DEVICE_POLLING |
|
127 enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS, POLL_DEREGISTER, |
|
128 POLL_REGISTER }; |
|
129 #endif |
|
130 |
|
131 /* |
|
132 * Structure defining a network interface. |
|
133 * |
|
134 * (Would like to call this struct ``if'', but C isn't PL/1.) |
|
135 */ |
|
136 |
|
137 /* |
|
138 * NB: For FreeBSD, it is assumed that each NIC driver's softc starts with |
|
139 * one of these structures, typically held within an arpcom structure. |
|
140 * |
|
141 * struct <foo>_softc { |
|
142 * struct arpcom { |
|
143 * struct ifnet ac_if; |
|
144 * ... |
|
145 * } <arpcom> ; |
|
146 * ... |
|
147 * }; |
|
148 * |
|
149 * The assumption is used in a number of places, including many |
|
150 * files in sys/net, device drivers, and sys/dev/mii.c:miibus_attach(). |
|
151 * |
|
152 * Unfortunately devices' softc are opaque, so we depend on this layout |
|
153 * to locate the struct ifnet from the softc in the generic code. |
|
154 * |
|
155 * MPSAFE NOTES: |
|
156 * |
|
157 * ifnet and its related packet queues are protected by if_serializer. |
|
158 * Callers of if_output, if_ioctl, if_start, if_watchdog, if_init, |
|
159 * if_resolvemulti, and if_poll hold if_serializer. Device drivers usually |
|
160 * use the same serializer for their interrupt but this is not required. |
|
161 * However, the device driver must be holding if_serializer when it |
|
162 * calls if_input. Note that the serializer may be temporarily released |
|
163 * within if_input to avoid a deadlock (e.g. when fast-forwarding or |
|
164 * bridging packets between interfaces). |
|
165 * |
|
166 * If a device driver installs the same serializer for its interrupt |
|
167 * as for ifnet, then the driver only really needs to worry about further |
|
168 * serialization in timeout based entry points. All other entry points |
|
169 * will already be serialized. Older ISA drivers still using the old |
|
170 * interrupt infrastructure will have to obtain and release the serializer |
|
171 * in their interrupt routine themselves. |
|
172 */ |
|
173 struct ifnet { |
|
174 void *if_softc; /* pointer to driver state */ |
|
175 TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */ |
|
176 char if_xname[IFNAMSIZ]; /* external name (name + unit) */ |
|
177 const char *if_dname; /* driver name */ |
|
178 int if_dunit; /* unit or IF_DUNIT_NONE */ |
|
179 struct ifaddrhead if_addrhead; /* linked list of addresses per if */ |
|
180 int if_pcount; /* number of promiscuous listeners */ |
|
181 struct carp_if *if_carp; /* carp interface structure */ |
|
182 struct bpf_if *if_bpf; /* packet filter structure */ |
|
183 u_short if_index; /* numeric abbreviation for this if */ |
|
184 short if_timer; /* time 'til if_watchdog called */ |
|
185 int if_flags; /* up/down, broadcast, etc. */ |
|
186 int if_capabilities; /* interface capabilities */ |
|
187 int if_capenable; /* enabled features */ |
|
188 void *if_linkmib; /* link-type-specific MIB data */ |
|
189 size_t if_linkmiblen; /* length of above data */ |
|
190 struct if_data if_data; |
|
191 struct ifmultihead if_multiaddrs; /* multicast addresses configured */ |
|
192 int if_amcount; /* number of all-multicast requests */ |
|
193 /* procedure handles */ |
|
194 int (*if_output) /* output routine (enqueue) */ |
|
195 (struct ifnet *, struct mbuf *, struct sockaddr *, |
|
196 struct rtentry *); |
|
197 void (*if_input) /* input routine from hardware driver */ |
|
198 (struct ifnet *, struct mbuf *); |
|
199 void (*if_start) /* initiate output routine */ |
|
200 (struct ifnet *); |
|
201 int (*if_ioctl) /* ioctl routine */ |
|
202 (struct ifnet *, u_long, caddr_t, struct ucred *); |
|
203 void (*if_watchdog) /* timer routine */ |
|
204 (struct ifnet *); |
|
205 void (*if_init) /* Init routine */ |
|
206 (void *); |
|
207 int (*if_resolvemulti) /* validate/resolve multicast */ |
|
208 (struct ifnet *, struct sockaddr **, struct sockaddr *); |
|
209 #ifdef DEVICE_POLLING |
|
210 void (*if_poll) /* IFF_POLLING support */ |
|
211 (struct ifnet *, enum poll_cmd, int); |
|
212 #else |
|
213 void (*if_poll_unused)(void); /* placeholder */ |
|
214 #endif |
|
215 #ifndef __SYMBIAN32__ |
|
216 struct ifaltq if_snd; /* output queue (includes altq) */ |
|
217 #endif |
|
218 struct ifprefixhead if_prefixhead; /* list of prefixes per if */ |
|
219 const uint8_t *if_broadcastaddr; |
|
220 void *if_bridge; /* bridge glue */ |
|
221 void *if_afdata[AF_MAX]; |
|
222 struct ifaddr *if_lladdr; |
|
223 struct lwkt_serialize *if_serializer; /* serializer or MP lock */ |
|
224 #ifndef __SYMBIAN32__ |
|
225 struct lwkt_serialize if_default_serializer; /* if not supplied */ |
|
226 #endif |
|
227 }; |
|
228 typedef void if_init_f_t (void *); |
|
229 |
|
230 #define if_mtu if_data.ifi_mtu |
|
231 #define if_type if_data.ifi_type |
|
232 #define if_physical if_data.ifi_physical |
|
233 #define if_addrlen if_data.ifi_addrlen |
|
234 #define if_hdrlen if_data.ifi_hdrlen |
|
235 #define if_metric if_data.ifi_metric |
|
236 #define if_link_state if_data.ifi_link_state |
|
237 #define if_baudrate if_data.ifi_baudrate |
|
238 #define if_hwassist if_data.ifi_hwassist |
|
239 #define if_ipackets if_data.ifi_ipackets |
|
240 #define if_ierrors if_data.ifi_ierrors |
|
241 #define if_opackets if_data.ifi_opackets |
|
242 #define if_oerrors if_data.ifi_oerrors |
|
243 #define if_collisions if_data.ifi_collisions |
|
244 #define if_ibytes if_data.ifi_ibytes |
|
245 #define if_obytes if_data.ifi_obytes |
|
246 #define if_imcasts if_data.ifi_imcasts |
|
247 #define if_omcasts if_data.ifi_omcasts |
|
248 #define if_iqdrops if_data.ifi_iqdrops |
|
249 #define if_noproto if_data.ifi_noproto |
|
250 #define if_lastchange if_data.ifi_lastchange |
|
251 #define if_recvquota if_data.ifi_recvquota |
|
252 #define if_xmitquota if_data.ifi_xmitquota |
|
253 #define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) |
|
254 |
|
255 /* for compatibility with other BSDs */ |
|
256 #define if_addrlist if_addrhead |
|
257 #define if_list if_link |
|
258 |
|
259 /* |
|
260 * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq) |
|
261 * are queues of messages stored on ifqueue structures |
|
262 * (defined above). Entries are added to and deleted from these structures |
|
263 * by these macros, which should be called with ipl raised to splimp(). |
|
264 */ |
|
265 #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) |
|
266 #define IF_DROP(ifq) ((ifq)->ifq_drops++) |
|
267 #define IF_QLEN(ifq) ((ifq)->ifq_len) |
|
268 #define IF_QEMPTY(ifq) (IF_QLEN(ifq) == 0) |
|
269 #define IF_ENQUEUE(ifq, m) { \ |
|
270 (m)->m_nextpkt = 0; \ |
|
271 if ((ifq)->ifq_tail == 0) \ |
|
272 (ifq)->ifq_head = m; \ |
|
273 else \ |
|
274 (ifq)->ifq_tail->m_nextpkt = m; \ |
|
275 (ifq)->ifq_tail = m; \ |
|
276 (ifq)->ifq_len++; \ |
|
277 } |
|
278 #define IF_PREPEND(ifq, m) { \ |
|
279 (m)->m_nextpkt = (ifq)->ifq_head; \ |
|
280 if ((ifq)->ifq_tail == 0) \ |
|
281 (ifq)->ifq_tail = (m); \ |
|
282 (ifq)->ifq_head = (m); \ |
|
283 (ifq)->ifq_len++; \ |
|
284 } |
|
285 #define IF_DEQUEUE(ifq, m) { \ |
|
286 (m) = (ifq)->ifq_head; \ |
|
287 if (m) { \ |
|
288 if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ |
|
289 (ifq)->ifq_tail = 0; \ |
|
290 (m)->m_nextpkt = 0; \ |
|
291 (ifq)->ifq_len--; \ |
|
292 } \ |
|
293 } |
|
294 |
|
295 #define IF_POLL(ifq, m) ((m) = (ifq)->ifq_head) |
|
296 |
|
297 #define IF_DRAIN(ifq) do { \ |
|
298 struct mbuf *m; \ |
|
299 while (1) { \ |
|
300 IF_DEQUEUE(ifq, m); \ |
|
301 if (m == NULL) \ |
|
302 break; \ |
|
303 m_freem(m); \ |
|
304 } \ |
|
305 } while (0) |
|
306 |
|
307 #ifdef _KERNEL |
|
308 |
|
309 /* |
|
310 * DEPRECATED - should not be used by any new driver. This code uses the |
|
311 * old queueing interface and if_start ABI and does not use the ifp's |
|
312 * serializer. |
|
313 */ |
|
314 #define IF_HANDOFF(ifq, m, ifp) if_handoff(ifq, m, ifp, 0) |
|
315 #define IF_HANDOFF_ADJ(ifq, m, ifp, adj) if_handoff(ifq, m, ifp, adj) |
|
316 |
|
317 static __inline int |
|
318 if_handoff(struct ifqueue *_ifq, struct mbuf *_m, struct ifnet *_ifp, |
|
319 int _adjust) |
|
320 { |
|
321 int _need_if_start = 0; |
|
322 |
|
323 crit_enter(); |
|
324 |
|
325 if (IF_QFULL(_ifq)) { |
|
326 IF_DROP(_ifq); |
|
327 crit_exit(); |
|
328 m_freem(_m); |
|
329 return (0); |
|
330 } |
|
331 if (_ifp != NULL) { |
|
332 _ifp->if_obytes += _m->m_pkthdr.len + _adjust; |
|
333 if (_m->m_flags & M_MCAST) |
|
334 _ifp->if_omcasts++; |
|
335 _need_if_start = !(_ifp->if_flags & IFF_OACTIVE); |
|
336 } |
|
337 IF_ENQUEUE(_ifq, _m); |
|
338 if (_need_if_start) { |
|
339 (*_ifp->if_start)(_ifp); |
|
340 } |
|
341 crit_exit(); |
|
342 return (1); |
|
343 } |
|
344 |
|
345 /* |
|
346 * 72 was chosen below because it is the size of a TCP/IP |
|
347 * header (40) + the minimum mss (32). |
|
348 */ |
|
349 #define IF_MINMTU 72 |
|
350 #define IF_MAXMTU 65535 |
|
351 |
|
352 #endif /* _KERNEL */ |
|
353 |
|
354 /* |
|
355 * The ifaddr structure contains information about one address |
|
356 * of an interface. They are maintained by the different address families, |
|
357 * are allocated and attached when an address is set, and are linked |
|
358 * together so all addresses for an interface can be located. |
|
359 */ |
|
360 struct ifaddr { |
|
361 struct sockaddr *ifa_addr; /* address of interface */ |
|
362 struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ |
|
363 #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ |
|
364 struct sockaddr *ifa_netmask; /* used to determine subnet */ |
|
365 struct if_data if_data; /* not all members are meaningful */ |
|
366 struct ifnet *ifa_ifp; /* back-pointer to interface */ |
|
367 TAILQ_ENTRY(ifaddr) ifa_link; /* queue macro glue */ |
|
368 void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ |
|
369 (int, struct rtentry *, struct rt_addrinfo *); |
|
370 u_short ifa_flags; /* mostly rt_flags for cloning */ |
|
371 u_int ifa_refcnt; /* references to this structure */ |
|
372 int ifa_metric; /* cost of going out this interface */ |
|
373 #ifdef notdef |
|
374 struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ |
|
375 #endif |
|
376 int (*ifa_claim_addr) /* check if an addr goes to this if */ |
|
377 (struct ifaddr *, struct sockaddr *); |
|
378 |
|
379 }; |
|
380 #define IFA_ROUTE RTF_UP /* route installed */ |
|
381 |
|
382 /* for compatibility with other BSDs */ |
|
383 #define ifa_list ifa_link |
|
384 |
|
385 /* |
|
386 * The prefix structure contains information about one prefix |
|
387 * of an interface. They are maintained by the different address families, |
|
388 * are allocated and attached when an prefix or an address is set, |
|
389 * and are linked together so all prefixes for an interface can be located. |
|
390 */ |
|
391 struct ifprefix { |
|
392 struct sockaddr *ifpr_prefix; /* prefix of interface */ |
|
393 struct ifnet *ifpr_ifp; /* back-pointer to interface */ |
|
394 TAILQ_ENTRY(ifprefix) ifpr_list; /* queue macro glue */ |
|
395 u_char ifpr_plen; /* prefix length in bits */ |
|
396 u_char ifpr_type; /* protocol dependent prefix type */ |
|
397 }; |
|
398 |
|
399 /* |
|
400 * Multicast address structure. This is analogous to the ifaddr |
|
401 * structure except that it keeps track of multicast addresses. |
|
402 * Also, the reference count here is a count of requests for this |
|
403 * address, not a count of pointers to this structure. |
|
404 */ |
|
405 struct ifmultiaddr { |
|
406 LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */ |
|
407 struct sockaddr *ifma_addr; /* address this membership is for */ |
|
408 struct sockaddr *ifma_lladdr; /* link-layer translation, if any */ |
|
409 struct ifnet *ifma_ifp; /* back-pointer to interface */ |
|
410 u_int ifma_refcount; /* reference count */ |
|
411 void *ifma_protospec; /* protocol-specific state, if any */ |
|
412 }; |
|
413 |
|
414 #ifdef _KERNEL |
|
415 /* interface address change event */ |
|
416 typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *); |
|
417 EVENTHANDLER_DECLARE(ifaddr_event, ifaddr_event_handler_t); |
|
418 /* new interface attach event */ |
|
419 typedef void (*ifnet_attach_event_handler_t)(void *, struct ifnet *); |
|
420 EVENTHANDLER_DECLARE(ifnet_attach_event, ifnet_attach_event_handler_t); |
|
421 /* interface detach event */ |
|
422 typedef void (*ifnet_detach_event_handler_t)(void *, struct ifnet *); |
|
423 EVENTHANDLER_DECLARE(ifnet_detach_event, ifnet_detach_event_handler_t); |
|
424 /* interface clone event */ |
|
425 typedef void (*if_clone_event_handler_t)(void *, struct if_clone *); |
|
426 EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t); |
|
427 |
|
428 static __inline void |
|
429 IFAREF(struct ifaddr *_ifa) |
|
430 { |
|
431 ++_ifa->ifa_refcnt; |
|
432 } |
|
433 |
|
434 #include <sys/malloc.h> |
|
435 |
|
436 MALLOC_DECLARE(M_IFADDR); |
|
437 MALLOC_DECLARE(M_IFMADDR); |
|
438 |
|
439 static __inline void |
|
440 IFAFREE(struct ifaddr *_ifa) |
|
441 { |
|
442 if (_ifa->ifa_refcnt <= 0) |
|
443 kfree(_ifa, M_IFADDR); |
|
444 else |
|
445 _ifa->ifa_refcnt--; |
|
446 } |
|
447 |
|
448 extern struct ifnethead ifnet; |
|
449 extern struct ifnet **ifindex2ifnet; |
|
450 extern int ifqmaxlen; |
|
451 extern struct ifnet loif[]; |
|
452 extern int if_index; |
|
453 |
|
454 void ether_ifattach(struct ifnet *, uint8_t *, struct lwkt_serialize *); |
|
455 void ether_ifattach_bpf(struct ifnet *, uint8_t *, u_int, u_int, |
|
456 struct lwkt_serialize *); |
|
457 void ether_ifdetach(struct ifnet *); |
|
458 void ether_input(struct ifnet *, struct ether_header *, struct mbuf *); |
|
459 void ether_demux(struct ifnet *, struct ether_header *, struct mbuf *); |
|
460 int ether_output_frame(struct ifnet *, struct mbuf *); |
|
461 int ether_ioctl(struct ifnet *, int, caddr_t); |
|
462 uint32_t ether_crc32_le(const uint8_t *, size_t); |
|
463 uint32_t ether_crc32_be(const uint8_t *, size_t); |
|
464 |
|
465 int if_addmulti(struct ifnet *, struct sockaddr *, struct ifmultiaddr **); |
|
466 int if_allmulti(struct ifnet *, int); |
|
467 void if_attach(struct ifnet *, struct lwkt_serialize *); |
|
468 int if_delmulti(struct ifnet *, struct sockaddr *); |
|
469 void if_detach(struct ifnet *); |
|
470 void if_down(struct ifnet *); |
|
471 void if_link_state_change(struct ifnet *); |
|
472 void if_initname(struct ifnet *, const char *, int); |
|
473 int if_getanyethermac(uint16_t *, int); |
|
474 int if_printf(struct ifnet *, const char *, ...) __printflike(2, 3); |
|
475 void if_route(struct ifnet *, int flag, int fam); |
|
476 int if_setlladdr(struct ifnet *, const u_char *, int); |
|
477 void if_unroute(struct ifnet *, int flag, int fam); |
|
478 void if_up(struct ifnet *); |
|
479 /*void ifinit(void);*/ /* declared in systm.h for main() */ |
|
480 int ifioctl(struct socket *, u_long, caddr_t, struct ucred *); |
|
481 int ifpromisc(struct ifnet *, int); |
|
482 struct ifnet *ifunit(const char *); |
|
483 struct ifnet *if_withname(struct sockaddr *); |
|
484 |
|
485 struct ifaddr *ifa_ifwithaddr(struct sockaddr *); |
|
486 struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *); |
|
487 struct ifaddr *ifa_ifwithnet(struct sockaddr *); |
|
488 struct ifaddr *ifa_ifwithroute(int, struct sockaddr *, struct sockaddr *); |
|
489 struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *); |
|
490 |
|
491 struct ifmultiaddr *ifmaof_ifpforaddr(struct sockaddr *, struct ifnet *); |
|
492 int if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen); |
|
493 |
|
494 void if_clone_attach(struct if_clone *); |
|
495 void if_clone_detach(struct if_clone *); |
|
496 |
|
497 int if_clone_create(char *, int); |
|
498 int if_clone_destroy(const char *); |
|
499 |
|
500 #define IF_LLSOCKADDR(ifp) \ |
|
501 ((struct sockaddr_dl *)(ifp)->if_lladdr->ifa_addr) |
|
502 #define IF_LLADDR(ifp) LLADDR(IF_LLSOCKADDR(ifp)) |
|
503 |
|
504 #ifdef DEVICE_POLLING |
|
505 typedef void poll_handler_t (struct ifnet *ifp, enum poll_cmd cmd, int count); |
|
506 int ether_poll_register(struct ifnet *); |
|
507 int ether_poll_deregister(struct ifnet *); |
|
508 #endif /* DEVICE_POLLING */ |
|
509 #endif /* _KERNEL */ |
|
510 |
|
511 #endif /* !_NET_IF_VAR_H_ */ |