xref: /openbsd-src/sys/net/if.c (revision 8550894424f8a4aa4aafb6cd57229dd6ed7cd9dd)
1 /*	$OpenBSD: if.c,v 1.683 2022/11/23 16:57:37 kn Exp $	*/
2 /*	$NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $	*/
3 
4 /*
5  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the project nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 /*
34  * Copyright (c) 1980, 1986, 1993
35  *	The Regents of the University of California.  All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  * 3. Neither the name of the University nor the names of its contributors
46  *    may be used to endorse or promote products derived from this software
47  *    without specific prior written permission.
48  *
49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59  * SUCH DAMAGE.
60  *
61  *	@(#)if.c	8.3 (Berkeley) 1/4/94
62  */
63 
64 #include "bpfilter.h"
65 #include "bridge.h"
66 #include "carp.h"
67 #include "ether.h"
68 #include "pf.h"
69 #include "pfsync.h"
70 #include "ppp.h"
71 #include "pppoe.h"
72 #include "if_wg.h"
73 
74 #include <sys/param.h>
75 #include <sys/systm.h>
76 #include <sys/mbuf.h>
77 #include <sys/socket.h>
78 #include <sys/socketvar.h>
79 #include <sys/timeout.h>
80 #include <sys/protosw.h>
81 #include <sys/kernel.h>
82 #include <sys/ioctl.h>
83 #include <sys/domain.h>
84 #include <sys/task.h>
85 #include <sys/atomic.h>
86 #include <sys/percpu.h>
87 #include <sys/proc.h>
88 #include <sys/stdint.h>	/* uintptr_t */
89 #include <sys/rwlock.h>
90 #include <sys/smr.h>
91 
92 #include <net/if.h>
93 #include <net/if_dl.h>
94 #include <net/if_types.h>
95 #include <net/route.h>
96 #include <net/netisr.h>
97 
98 #include <netinet/in.h>
99 #include <netinet/if_ether.h>
100 #include <netinet/igmp.h>
101 #ifdef MROUTING
102 #include <netinet/ip_mroute.h>
103 #endif
104 
105 #ifdef INET6
106 #include <netinet6/in6_var.h>
107 #include <netinet6/in6_ifattach.h>
108 #include <netinet6/nd6.h>
109 #include <netinet/ip6.h>
110 #include <netinet6/ip6_var.h>
111 #endif
112 
113 #ifdef MPLS
114 #include <netmpls/mpls.h>
115 #endif
116 
117 #if NBPFILTER > 0
118 #include <net/bpf.h>
119 #endif
120 
121 #if NBRIDGE > 0
122 #include <net/if_bridge.h>
123 #endif
124 
125 #if NCARP > 0
126 #include <netinet/ip_carp.h>
127 #endif
128 
129 #if NPF > 0
130 #include <net/pfvar.h>
131 #endif
132 
133 #include <sys/device.h>
134 
135 void	if_attachsetup(struct ifnet *);
136 void	if_attach_common(struct ifnet *);
137 void	if_remove(struct ifnet *);
138 int	if_createrdomain(int, struct ifnet *);
139 int	if_setrdomain(struct ifnet *, int);
140 void	if_slowtimo(void *);
141 
142 void	if_detached_qstart(struct ifqueue *);
143 int	if_detached_ioctl(struct ifnet *, u_long, caddr_t);
144 
145 int	ifioctl_get(u_long, caddr_t);
146 int	ifconf(caddr_t);
147 static int
148 	if_sffpage_check(const caddr_t);
149 
150 int	if_getgroup(caddr_t, struct ifnet *);
151 int	if_getgroupmembers(caddr_t);
152 int	if_getgroupattribs(caddr_t);
153 int	if_setgroupattribs(caddr_t);
154 int	if_getgrouplist(caddr_t);
155 
156 void	if_linkstate(struct ifnet *);
157 void	if_linkstate_task(void *);
158 
159 int	if_clone_list(struct if_clonereq *);
160 struct if_clone	*if_clone_lookup(const char *, int *);
161 
162 int	if_group_egress_build(void);
163 
164 void	if_watchdog_task(void *);
165 
166 void	if_netisr(void *);
167 
168 #ifdef DDB
169 void	ifa_print_all(void);
170 #endif
171 
172 void	if_qstart_compat(struct ifqueue *);
173 
174 /*
175  * interface index map
176  *
177  * the kernel maintains a mapping of interface indexes to struct ifnet
178  * pointers.
179  *
180  * the map is an array of struct ifnet pointers prefixed by an if_map
181  * structure. the if_map structure stores the length of its array.
182  *
183  * as interfaces are attached to the system, the map is grown on demand
184  * up to USHRT_MAX entries.
185  *
186  * interface index 0 is reserved and represents no interface. this
187  * supports the use of the interface index as the scope for IPv6 link
188  * local addresses, where scope 0 means no scope has been specified.
189  * it also supports the use of interface index as the unique identifier
190  * for network interfaces in SNMP applications as per RFC2863. therefore
191  * if_get(0) returns NULL.
192  */
193 
194 struct ifnet *if_ref(struct ifnet *);
195 
196 /*
197  * struct if_idxmap
198  *
199  * infrastructure to manage updates and accesses to the current if_map.
200  *
201  * interface index 0 is special and represents "no interface", so we
202  * use the 0th slot in map to store the length of the array.
203  */
204 
205 struct if_idxmap {
206 	unsigned int		  serial;
207 	unsigned int		  count;
208 	struct ifnet		**map;		/* SMR protected */
209 	struct rwlock		  lock;
210 	unsigned char		 *usedidx;	/* bitmap of indices in use */
211 };
212 
213 struct if_idxmap_dtor {
214 	struct smr_entry	  smr;
215 	struct ifnet		**map;
216 };
217 
218 void	if_idxmap_init(unsigned int);
219 void	if_idxmap_free(void *);
220 void	if_idxmap_alloc(struct ifnet *);
221 void	if_idxmap_insert(struct ifnet *);
222 void	if_idxmap_remove(struct ifnet *);
223 
224 TAILQ_HEAD(, ifg_group) ifg_head =
225     TAILQ_HEAD_INITIALIZER(ifg_head);	/* [N] list of interface groups */
226 
227 LIST_HEAD(, if_clone) if_cloners =
228     LIST_HEAD_INITIALIZER(if_cloners);	/* [I] list of clonable interfaces */
229 int if_cloners_count;	/* [I] number of clonable interfaces */
230 
231 struct rwlock if_cloners_lock = RWLOCK_INITIALIZER("clonelk");
232 
233 /* hooks should only be added, deleted, and run from a process context */
234 struct mutex if_hooks_mtx = MUTEX_INITIALIZER(IPL_NONE);
235 void	if_hooks_run(struct task_list *);
236 
237 int	ifq_congestion;
238 
239 int		 netisr;
240 
241 #define	NET_TASKQ	4
242 struct taskq	*nettqmp[NET_TASKQ];
243 
244 struct task if_input_task_locked = TASK_INITIALIZER(if_netisr, NULL);
245 
246 /*
247  * Serialize socket operations to ensure no new sleeping points
248  * are introduced in IP output paths.
249  */
250 struct rwlock netlock = RWLOCK_INITIALIZER("netlock");
251 
252 /*
253  * Network interface utility routines.
254  */
255 void
256 ifinit(void)
257 {
258 	unsigned int	i;
259 
260 	/*
261 	 * most machines boot with 4 or 5 interfaces, so size the initial map
262 	 * to accommodate this
263 	 */
264 	if_idxmap_init(8); /* 8 is a nice power of 2 for malloc */
265 
266 	for (i = 0; i < NET_TASKQ; i++) {
267 		nettqmp[i] = taskq_create("softnet", 1, IPL_NET, TASKQ_MPSAFE);
268 		if (nettqmp[i] == NULL)
269 			panic("unable to create network taskq %d", i);
270 	}
271 }
272 
273 static struct if_idxmap if_idxmap;
274 
275 struct ifnet_head ifnetlist = TAILQ_HEAD_INITIALIZER(ifnetlist);
276 
277 static inline unsigned int
278 if_idxmap_limit(struct ifnet **if_map)
279 {
280 	return ((uintptr_t)if_map[0]);
281 }
282 
283 static inline size_t
284 if_idxmap_usedidx_size(unsigned int limit)
285 {
286 	return (max(howmany(limit, NBBY), sizeof(struct if_idxmap_dtor)));
287 }
288 
289 void
290 if_idxmap_init(unsigned int limit)
291 {
292 	struct ifnet **if_map;
293 
294 	rw_init(&if_idxmap.lock, "idxmaplk");
295 	if_idxmap.serial = 1; /* skip ifidx 0 */
296 
297 	if_map = mallocarray(limit, sizeof(*if_map), M_IFADDR,
298 	    M_WAITOK | M_ZERO);
299 
300 	if_map[0] = (struct ifnet *)(uintptr_t)limit;
301 
302 	if_idxmap.usedidx = malloc(if_idxmap_usedidx_size(limit),
303 	    M_IFADDR, M_WAITOK | M_ZERO);
304 	setbit(if_idxmap.usedidx, 0); /* blacklist ifidx 0 */
305 
306 	/* this is called early so there's nothing to race with */
307 	SMR_PTR_SET_LOCKED(&if_idxmap.map, if_map);
308 }
309 
310 void
311 if_idxmap_alloc(struct ifnet *ifp)
312 {
313 	struct ifnet **if_map;
314 	unsigned int limit;
315 	unsigned int index, i;
316 
317 	refcnt_init(&ifp->if_refcnt);
318 
319 	rw_enter_write(&if_idxmap.lock);
320 
321 	if (++if_idxmap.count >= USHRT_MAX)
322 		panic("too many interfaces");
323 
324 	if_map = SMR_PTR_GET_LOCKED(&if_idxmap.map);
325 	limit = if_idxmap_limit(if_map);
326 
327 	index = if_idxmap.serial++ & USHRT_MAX;
328 
329 	if (index >= limit) {
330 		struct if_idxmap_dtor *dtor;
331 		struct ifnet **oif_map;
332 		unsigned int olimit;
333 		unsigned char *nusedidx;
334 
335 		oif_map = if_map;
336 		olimit = limit;
337 
338 		limit = olimit * 2;
339 		if_map = mallocarray(limit, sizeof(*if_map), M_IFADDR,
340 		    M_WAITOK | M_ZERO);
341 		if_map[0] = (struct ifnet *)(uintptr_t)limit;
342 
343 		for (i = 1; i < olimit; i++) {
344 			struct ifnet *oifp = SMR_PTR_GET_LOCKED(&oif_map[i]);
345 			if (oifp == NULL)
346 				continue;
347 
348 			/*
349 			 * nif_map isn't visible yet, so don't need
350 			 * SMR_PTR_SET_LOCKED and its membar.
351 			 */
352 			if_map[i] = if_ref(oifp);
353 		}
354 
355 		nusedidx = malloc(if_idxmap_usedidx_size(limit),
356 		    M_IFADDR, M_WAITOK | M_ZERO);
357 		memcpy(nusedidx, if_idxmap.usedidx, howmany(olimit, NBBY));
358 
359 		/* use the old usedidx bitmap as an smr_entry for the if_map */
360 		dtor = (struct if_idxmap_dtor *)if_idxmap.usedidx;
361 		if_idxmap.usedidx = nusedidx;
362 
363 		SMR_PTR_SET_LOCKED(&if_idxmap.map, if_map);
364 
365 		dtor->map = oif_map;
366 		smr_init(&dtor->smr);
367 		smr_call(&dtor->smr, if_idxmap_free, dtor);
368 	}
369 
370 	/* pick the next free index */
371 	for (i = 0; i < USHRT_MAX; i++) {
372 		if (index != 0 && isclr(if_idxmap.usedidx, index))
373 			break;
374 
375 		index = if_idxmap.serial++ & USHRT_MAX;
376 	}
377 	KASSERT(index != 0 && index < limit);
378 	KASSERT(isclr(if_idxmap.usedidx, index));
379 
380 	setbit(if_idxmap.usedidx, index);
381 	ifp->if_index = index;
382 
383 	rw_exit_write(&if_idxmap.lock);
384 }
385 
386 void
387 if_idxmap_free(void *arg)
388 {
389 	struct if_idxmap_dtor *dtor = arg;
390 	struct ifnet **oif_map = dtor->map;
391 	unsigned int olimit = if_idxmap_limit(oif_map);
392 	unsigned int i;
393 
394 	for (i = 1; i < olimit; i++)
395 		if_put(oif_map[i]);
396 
397 	free(oif_map, M_IFADDR, olimit * sizeof(*oif_map));
398 	free(dtor, M_IFADDR, if_idxmap_usedidx_size(olimit));
399 }
400 
401 void
402 if_idxmap_insert(struct ifnet *ifp)
403 {
404 	struct ifnet **if_map;
405 	unsigned int index = ifp->if_index;
406 
407 	rw_enter_write(&if_idxmap.lock);
408 
409 	if_map = SMR_PTR_GET_LOCKED(&if_idxmap.map);
410 
411 	KASSERTMSG(index != 0 && index < if_idxmap_limit(if_map),
412 	    "%s(%p) index %u vs limit %u", ifp->if_xname, ifp, index,
413 	    if_idxmap_limit(if_map));
414 	KASSERT(SMR_PTR_GET_LOCKED(&if_map[index]) == NULL);
415 	KASSERT(isset(if_idxmap.usedidx, index));
416 
417 	/* commit */
418 	SMR_PTR_SET_LOCKED(&if_map[index], if_ref(ifp));
419 
420 	rw_exit_write(&if_idxmap.lock);
421 }
422 
423 void
424 if_idxmap_remove(struct ifnet *ifp)
425 {
426 	struct ifnet **if_map;
427 	unsigned int index = ifp->if_index;
428 
429 	rw_enter_write(&if_idxmap.lock);
430 
431 	if_map = SMR_PTR_GET_LOCKED(&if_idxmap.map);
432 
433 	KASSERT(index != 0 && index < if_idxmap_limit(if_map));
434 	KASSERT(SMR_PTR_GET_LOCKED(&if_map[index]) == ifp);
435 	KASSERT(isset(if_idxmap.usedidx, index));
436 
437 	SMR_PTR_SET_LOCKED(&if_map[index], NULL);
438 
439 	if_idxmap.count--;
440 	clrbit(if_idxmap.usedidx, index);
441 	/* end of if_idxmap modifications */
442 
443 	rw_exit_write(&if_idxmap.lock);
444 
445 	smr_barrier();
446 	if_put(ifp);
447 }
448 
449 /*
450  * Attach an interface to the
451  * list of "active" interfaces.
452  */
453 void
454 if_attachsetup(struct ifnet *ifp)
455 {
456 	unsigned long ifidx;
457 
458 	NET_ASSERT_LOCKED();
459 
460 	if_addgroup(ifp, IFG_ALL);
461 
462 #ifdef INET6
463 	nd6_ifattach(ifp);
464 #endif
465 
466 #if NPF > 0
467 	pfi_attach_ifnet(ifp);
468 #endif
469 
470 	timeout_set(&ifp->if_slowtimo, if_slowtimo, ifp);
471 	if_slowtimo(ifp);
472 
473 	if_idxmap_insert(ifp);
474 	KASSERT(if_get(0) == NULL);
475 
476 	ifidx = ifp->if_index;
477 
478 	task_set(&ifp->if_watchdogtask, if_watchdog_task, (void *)ifidx);
479 	task_set(&ifp->if_linkstatetask, if_linkstate_task, (void *)ifidx);
480 
481 	/* Announce the interface. */
482 	rtm_ifannounce(ifp, IFAN_ARRIVAL);
483 }
484 
485 /*
486  * Allocate the link level name for the specified interface.  This
487  * is an attachment helper.  It must be called after ifp->if_addrlen
488  * is initialized, which may not be the case when if_attach() is
489  * called.
490  */
491 void
492 if_alloc_sadl(struct ifnet *ifp)
493 {
494 	unsigned int socksize;
495 	int namelen, masklen;
496 	struct sockaddr_dl *sdl;
497 
498 	/*
499 	 * If the interface already has a link name, release it
500 	 * now.  This is useful for interfaces that can change
501 	 * link types, and thus switch link names often.
502 	 */
503 	if_free_sadl(ifp);
504 
505 	namelen = strlen(ifp->if_xname);
506 	masklen = offsetof(struct sockaddr_dl, sdl_data[0]) + namelen;
507 	socksize = masklen + ifp->if_addrlen;
508 #define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1)))
509 	if (socksize < sizeof(*sdl))
510 		socksize = sizeof(*sdl);
511 	socksize = ROUNDUP(socksize);
512 	sdl = malloc(socksize, M_IFADDR, M_WAITOK|M_ZERO);
513 	sdl->sdl_len = socksize;
514 	sdl->sdl_family = AF_LINK;
515 	bcopy(ifp->if_xname, sdl->sdl_data, namelen);
516 	sdl->sdl_nlen = namelen;
517 	sdl->sdl_alen = ifp->if_addrlen;
518 	sdl->sdl_index = ifp->if_index;
519 	sdl->sdl_type = ifp->if_type;
520 	ifp->if_sadl = sdl;
521 }
522 
523 /*
524  * Free the link level name for the specified interface.  This is
525  * a detach helper.  This is called from if_detach() or from
526  * link layer type specific detach functions.
527  */
528 void
529 if_free_sadl(struct ifnet *ifp)
530 {
531 	if (ifp->if_sadl == NULL)
532 		return;
533 
534 	free(ifp->if_sadl, M_IFADDR, ifp->if_sadl->sdl_len);
535 	ifp->if_sadl = NULL;
536 }
537 
538 void
539 if_attachhead(struct ifnet *ifp)
540 {
541 	if_attach_common(ifp);
542 	NET_LOCK();
543 	TAILQ_INSERT_HEAD(&ifnetlist, ifp, if_list);
544 	if_attachsetup(ifp);
545 	NET_UNLOCK();
546 }
547 
548 void
549 if_attach(struct ifnet *ifp)
550 {
551 	if_attach_common(ifp);
552 	NET_LOCK();
553 	TAILQ_INSERT_TAIL(&ifnetlist, ifp, if_list);
554 	if_attachsetup(ifp);
555 	NET_UNLOCK();
556 }
557 
558 void
559 if_attach_queues(struct ifnet *ifp, unsigned int nqs)
560 {
561 	struct ifqueue **map;
562 	struct ifqueue *ifq;
563 	int i;
564 
565 	KASSERT(ifp->if_ifqs == ifp->if_snd.ifq_ifqs);
566 	KASSERT(nqs != 0);
567 
568 	map = mallocarray(sizeof(*map), nqs, M_DEVBUF, M_WAITOK);
569 
570 	ifp->if_snd.ifq_softc = NULL;
571 	map[0] = &ifp->if_snd;
572 
573 	for (i = 1; i < nqs; i++) {
574 		ifq = malloc(sizeof(*ifq), M_DEVBUF, M_WAITOK|M_ZERO);
575 		ifq_set_maxlen(ifq, ifp->if_snd.ifq_maxlen);
576 		ifq_init(ifq, ifp, i);
577 		map[i] = ifq;
578 	}
579 
580 	ifp->if_ifqs = map;
581 	ifp->if_nifqs = nqs;
582 }
583 
584 void
585 if_attach_iqueues(struct ifnet *ifp, unsigned int niqs)
586 {
587 	struct ifiqueue **map;
588 	struct ifiqueue *ifiq;
589 	unsigned int i;
590 
591 	KASSERT(niqs != 0);
592 
593 	map = mallocarray(niqs, sizeof(*map), M_DEVBUF, M_WAITOK);
594 
595 	ifp->if_rcv.ifiq_softc = NULL;
596 	map[0] = &ifp->if_rcv;
597 
598 	for (i = 1; i < niqs; i++) {
599 		ifiq = malloc(sizeof(*ifiq), M_DEVBUF, M_WAITOK|M_ZERO);
600 		ifiq_init(ifiq, ifp, i);
601 		map[i] = ifiq;
602 	}
603 
604 	ifp->if_iqs = map;
605 	ifp->if_niqs = niqs;
606 }
607 
608 void
609 if_attach_common(struct ifnet *ifp)
610 {
611 	KASSERT(ifp->if_ioctl != NULL);
612 
613 	TAILQ_INIT(&ifp->if_addrlist);
614 	TAILQ_INIT(&ifp->if_maddrlist);
615 	TAILQ_INIT(&ifp->if_groups);
616 
617 	if (!ISSET(ifp->if_xflags, IFXF_MPSAFE)) {
618 		KASSERTMSG(ifp->if_qstart == NULL,
619 		    "%s: if_qstart set without MPSAFE set", ifp->if_xname);
620 		ifp->if_qstart = if_qstart_compat;
621 	} else {
622 		KASSERTMSG(ifp->if_start == NULL,
623 		    "%s: if_start set with MPSAFE set", ifp->if_xname);
624 		KASSERTMSG(ifp->if_qstart != NULL,
625 		    "%s: if_qstart not set with MPSAFE set", ifp->if_xname);
626 	}
627 
628 	if_idxmap_alloc(ifp);
629 
630 	ifq_init(&ifp->if_snd, ifp, 0);
631 
632 	ifp->if_snd.ifq_ifqs[0] = &ifp->if_snd;
633 	ifp->if_ifqs = ifp->if_snd.ifq_ifqs;
634 	ifp->if_nifqs = 1;
635 	if (ifp->if_txmit == 0)
636 		ifp->if_txmit = IF_TXMIT_DEFAULT;
637 
638 	ifiq_init(&ifp->if_rcv, ifp, 0);
639 
640 	ifp->if_rcv.ifiq_ifiqs[0] = &ifp->if_rcv;
641 	ifp->if_iqs = ifp->if_rcv.ifiq_ifiqs;
642 	ifp->if_niqs = 1;
643 
644 	TAILQ_INIT(&ifp->if_addrhooks);
645 	TAILQ_INIT(&ifp->if_linkstatehooks);
646 	TAILQ_INIT(&ifp->if_detachhooks);
647 
648 	if (ifp->if_rtrequest == NULL)
649 		ifp->if_rtrequest = if_rtrequest_dummy;
650 	if (ifp->if_enqueue == NULL)
651 		ifp->if_enqueue = if_enqueue_ifq;
652 #if NBPFILTER > 0
653 	if (ifp->if_bpf_mtap == NULL)
654 		ifp->if_bpf_mtap = bpf_mtap_ether;
655 #endif
656 	ifp->if_llprio = IFQ_DEFPRIO;
657 }
658 
659 void
660 if_attach_ifq(struct ifnet *ifp, const struct ifq_ops *newops, void *args)
661 {
662 	/*
663 	 * only switch the ifq_ops on the first ifq on an interface.
664 	 *
665 	 * the only ifq_ops we provide priq and hfsc, and hfsc only
666 	 * works on a single ifq. because the code uses the ifq_ops
667 	 * on the first ifq (if_snd) to select a queue for an mbuf,
668 	 * by switching only the first one we change both the algorithm
669 	 * and force the routing of all new packets to it.
670 	 */
671 	ifq_attach(&ifp->if_snd, newops, args);
672 }
673 
674 void
675 if_start(struct ifnet *ifp)
676 {
677 	KASSERT(ifp->if_qstart == if_qstart_compat);
678 	if_qstart_compat(&ifp->if_snd);
679 }
680 void
681 if_qstart_compat(struct ifqueue *ifq)
682 {
683 	struct ifnet *ifp = ifq->ifq_if;
684 	int s;
685 
686 	/*
687 	 * the stack assumes that an interface can have multiple
688 	 * transmit rings, but a lot of drivers are still written
689 	 * so that interfaces and send rings have a 1:1 mapping.
690 	 * this provides compatibility between the stack and the older
691 	 * drivers by translating from the only queue they have
692 	 * (ifp->if_snd) back to the interface and calling if_start.
693 	 */
694 
695 	KERNEL_LOCK();
696 	s = splnet();
697 	(*ifp->if_start)(ifp);
698 	splx(s);
699 	KERNEL_UNLOCK();
700 }
701 
702 int
703 if_enqueue(struct ifnet *ifp, struct mbuf *m)
704 {
705 	CLR(m->m_pkthdr.csum_flags, M_TIMESTAMP);
706 
707 #if NPF > 0
708 	if (m->m_pkthdr.pf.delay > 0)
709 		return (pf_delay_pkt(m, ifp->if_index));
710 #endif
711 
712 #if NBRIDGE > 0
713 	if (ifp->if_bridgeidx && (m->m_flags & M_PROTO1) == 0) {
714 		int error;
715 
716 		error = bridge_enqueue(ifp, m);
717 		return (error);
718 	}
719 #endif
720 
721 #if NPF > 0
722 	pf_pkt_addr_changed(m);
723 #endif	/* NPF > 0 */
724 
725 	return ((*ifp->if_enqueue)(ifp, m));
726 }
727 
728 int
729 if_enqueue_ifq(struct ifnet *ifp, struct mbuf *m)
730 {
731 	struct ifqueue *ifq = &ifp->if_snd;
732 	int error;
733 
734 	if (ifp->if_nifqs > 1) {
735 		unsigned int idx;
736 
737 		/*
738 		 * use the operations on the first ifq to pick which of
739 		 * the array gets this mbuf.
740 		 */
741 
742 		idx = ifq_idx(&ifp->if_snd, ifp->if_nifqs, m);
743 		ifq = ifp->if_ifqs[idx];
744 	}
745 
746 	error = ifq_enqueue(ifq, m);
747 	if (error)
748 		return (error);
749 
750 	ifq_start(ifq);
751 
752 	return (0);
753 }
754 
755 void
756 if_input(struct ifnet *ifp, struct mbuf_list *ml)
757 {
758 	ifiq_input(&ifp->if_rcv, ml);
759 }
760 
761 int
762 if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
763 {
764 	int keepflags;
765 
766 #if NBPFILTER > 0
767 	/*
768 	 * Only send packets to bpf if they are destined to local
769 	 * addresses.
770 	 *
771 	 * if_input_local() is also called for SIMPLEX interfaces to
772 	 * duplicate packets for local use.  But don't dup them to bpf.
773 	 */
774 	if (ifp->if_flags & IFF_LOOPBACK) {
775 		caddr_t if_bpf = ifp->if_bpf;
776 
777 		if (if_bpf)
778 			bpf_mtap_af(if_bpf, af, m, BPF_DIRECTION_OUT);
779 	}
780 #endif
781 	keepflags = m->m_flags & (M_BCAST|M_MCAST);
782 	m_resethdr(m);
783 	m->m_flags |= M_LOOP | keepflags;
784 	m->m_pkthdr.ph_ifidx = ifp->if_index;
785 	m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
786 
787 	ifp->if_opackets++;
788 	ifp->if_obytes += m->m_pkthdr.len;
789 
790 	ifp->if_ipackets++;
791 	ifp->if_ibytes += m->m_pkthdr.len;
792 
793 	switch (af) {
794 	case AF_INET:
795 		ipv4_input(ifp, m);
796 		break;
797 #ifdef INET6
798 	case AF_INET6:
799 		ipv6_input(ifp, m);
800 		break;
801 #endif /* INET6 */
802 #ifdef MPLS
803 	case AF_MPLS:
804 		mpls_input(ifp, m);
805 		break;
806 #endif /* MPLS */
807 	default:
808 		printf("%s: can't handle af%d\n", ifp->if_xname, af);
809 		m_freem(m);
810 		return (EAFNOSUPPORT);
811 	}
812 
813 	return (0);
814 }
815 
816 int
817 if_output_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
818 {
819 	struct ifiqueue *ifiq;
820 	unsigned int flow = 0;
821 
822 	m->m_pkthdr.ph_family = af;
823 	m->m_pkthdr.ph_ifidx = ifp->if_index;
824 	m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
825 
826 	if (ISSET(m->m_pkthdr.csum_flags, M_FLOWID))
827 		flow = m->m_pkthdr.ph_flowid;
828 
829 	ifiq = ifp->if_iqs[flow % ifp->if_niqs];
830 
831 	return (ifiq_enqueue(ifiq, m) == 0 ? 0 : ENOBUFS);
832 }
833 
834 void
835 if_input_process(struct ifnet *ifp, struct mbuf_list *ml)
836 {
837 	struct mbuf *m;
838 
839 	if (ml_empty(ml))
840 		return;
841 
842 	if (!ISSET(ifp->if_xflags, IFXF_CLONED))
843 		enqueue_randomness(ml_len(ml) ^ (uintptr_t)MBUF_LIST_FIRST(ml));
844 
845 	/*
846 	 * We grab the shared netlock for packet processing in the softnet
847 	 * threads.  Packets can regrab the exclusive lock via queues.
848 	 * ioctl, sysctl, and socket syscall may use shared lock if access is
849 	 * read only or MP safe.  Usually they hold the exclusive net lock.
850 	 */
851 
852 	NET_LOCK_SHARED();
853 	while ((m = ml_dequeue(ml)) != NULL)
854 		(*ifp->if_input)(ifp, m);
855 	NET_UNLOCK_SHARED();
856 }
857 
858 void
859 if_vinput(struct ifnet *ifp, struct mbuf *m)
860 {
861 #if NBPFILTER > 0
862 	caddr_t if_bpf;
863 #endif
864 
865 	m->m_pkthdr.ph_ifidx = ifp->if_index;
866 	m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
867 
868 	counters_pkt(ifp->if_counters,
869 	    ifc_ipackets, ifc_ibytes, m->m_pkthdr.len);
870 
871 #if NPF > 0
872 	pf_pkt_addr_changed(m);
873 #endif
874 
875 #if NBPFILTER > 0
876 	if_bpf = ifp->if_bpf;
877 	if (if_bpf) {
878 		if ((*ifp->if_bpf_mtap)(if_bpf, m, BPF_DIRECTION_IN)) {
879 			m_freem(m);
880 			return;
881 		}
882 	}
883 #endif
884 
885 	if (__predict_true(!ISSET(ifp->if_xflags, IFXF_MONITOR)))
886 		(*ifp->if_input)(ifp, m);
887 	else
888 		m_freem(m);
889 }
890 
891 void
892 if_netisr(void *unused)
893 {
894 	int n, t = 0;
895 
896 	NET_LOCK();
897 
898 	while ((n = netisr) != 0) {
899 		/* Like sched_pause() but with a rwlock dance. */
900 		if (curcpu()->ci_schedstate.spc_schedflags & SPCF_SHOULDYIELD) {
901 			NET_UNLOCK();
902 			yield();
903 			NET_LOCK();
904 		}
905 
906 		atomic_clearbits_int(&netisr, n);
907 
908 #if NETHER > 0
909 		if (n & (1 << NETISR_ARP)) {
910 			KERNEL_LOCK();
911 			arpintr();
912 			KERNEL_UNLOCK();
913 		}
914 #endif
915 		if (n & (1 << NETISR_IP))
916 			ipintr();
917 #ifdef INET6
918 		if (n & (1 << NETISR_IPV6))
919 			ip6intr();
920 #endif
921 #if NPPP > 0
922 		if (n & (1 << NETISR_PPP)) {
923 			KERNEL_LOCK();
924 			pppintr();
925 			KERNEL_UNLOCK();
926 		}
927 #endif
928 #if NBRIDGE > 0
929 		if (n & (1 << NETISR_BRIDGE))
930 			bridgeintr();
931 #endif
932 #ifdef PIPEX
933 		if (n & (1 << NETISR_PIPEX))
934 			pipexintr();
935 #endif
936 #if NPPPOE > 0
937 		if (n & (1 << NETISR_PPPOE)) {
938 			KERNEL_LOCK();
939 			pppoeintr();
940 			KERNEL_UNLOCK();
941 		}
942 #endif
943 		t |= n;
944 	}
945 
946 #if NPFSYNC > 0
947 	if (t & (1 << NETISR_PFSYNC)) {
948 		KERNEL_LOCK();
949 		pfsyncintr();
950 		KERNEL_UNLOCK();
951 	}
952 #endif
953 
954 	NET_UNLOCK();
955 }
956 
957 void
958 if_hooks_run(struct task_list *hooks)
959 {
960 	struct task *t, *nt;
961 	struct task cursor = { .t_func = NULL };
962 	void (*func)(void *);
963 	void *arg;
964 
965 	mtx_enter(&if_hooks_mtx);
966 	for (t = TAILQ_FIRST(hooks); t != NULL; t = nt) {
967 		if (t->t_func == NULL) { /* skip cursors */
968 			nt = TAILQ_NEXT(t, t_entry);
969 			continue;
970 		}
971 		func = t->t_func;
972 		arg = t->t_arg;
973 
974 		TAILQ_INSERT_AFTER(hooks, t, &cursor, t_entry);
975 		mtx_leave(&if_hooks_mtx);
976 
977 		(*func)(arg);
978 
979 		mtx_enter(&if_hooks_mtx);
980 		nt = TAILQ_NEXT(&cursor, t_entry); /* avoid _Q_INVALIDATE */
981 		TAILQ_REMOVE(hooks, &cursor, t_entry);
982 	}
983 	mtx_leave(&if_hooks_mtx);
984 }
985 
986 void
987 if_remove(struct ifnet *ifp)
988 {
989 	/* Remove the interface from the list of all interfaces. */
990 	NET_LOCK();
991 	TAILQ_REMOVE(&ifnetlist, ifp, if_list);
992 	NET_UNLOCK();
993 
994 	/* Remove the interface from the interface index map. */
995 	if_idxmap_remove(ifp);
996 
997 	/* Sleep until the last reference is released. */
998 	refcnt_finalize(&ifp->if_refcnt, "ifrm");
999 }
1000 
1001 void
1002 if_deactivate(struct ifnet *ifp)
1003 {
1004 	/*
1005 	 * Call detach hooks from head to tail.  To make sure detach
1006 	 * hooks are executed in the reverse order they were added, all
1007 	 * the hooks have to be added to the head!
1008 	 */
1009 
1010 	NET_LOCK();
1011 	if_hooks_run(&ifp->if_detachhooks);
1012 	NET_UNLOCK();
1013 }
1014 
1015 void
1016 if_detachhook_add(struct ifnet *ifp, struct task *t)
1017 {
1018 	mtx_enter(&if_hooks_mtx);
1019 	TAILQ_INSERT_HEAD(&ifp->if_detachhooks, t, t_entry);
1020 	mtx_leave(&if_hooks_mtx);
1021 }
1022 
1023 void
1024 if_detachhook_del(struct ifnet *ifp, struct task *t)
1025 {
1026 	mtx_enter(&if_hooks_mtx);
1027 	TAILQ_REMOVE(&ifp->if_detachhooks, t, t_entry);
1028 	mtx_leave(&if_hooks_mtx);
1029 }
1030 
1031 /*
1032  * Detach an interface from everything in the kernel.  Also deallocate
1033  * private resources.
1034  */
1035 void
1036 if_detach(struct ifnet *ifp)
1037 {
1038 	struct ifaddr *ifa;
1039 	struct ifg_list *ifg;
1040 	int i, s;
1041 
1042 	/* Undo pseudo-driver changes. */
1043 	if_deactivate(ifp);
1044 
1045 	/* Other CPUs must not have a reference before we start destroying. */
1046 	if_remove(ifp);
1047 
1048 	ifp->if_qstart = if_detached_qstart;
1049 
1050 	/* Wait until the start routines finished. */
1051 	ifq_barrier(&ifp->if_snd);
1052 	ifq_clr_oactive(&ifp->if_snd);
1053 
1054 #if NBPFILTER > 0
1055 	bpfdetach(ifp);
1056 #endif
1057 
1058 	NET_LOCK();
1059 	s = splnet();
1060 	ifp->if_ioctl = if_detached_ioctl;
1061 	ifp->if_watchdog = NULL;
1062 
1063 	/* Remove the watchdog timeout & task */
1064 	timeout_del(&ifp->if_slowtimo);
1065 	task_del(net_tq(ifp->if_index), &ifp->if_watchdogtask);
1066 
1067 	/* Remove the link state task */
1068 	task_del(net_tq(ifp->if_index), &ifp->if_linkstatetask);
1069 
1070 	rti_delete(ifp);
1071 #if NETHER > 0 && defined(NFSCLIENT)
1072 	if (ifp->if_index == revarp_ifidx)
1073 		revarp_ifidx = 0;
1074 #endif
1075 #ifdef MROUTING
1076 	vif_delete(ifp);
1077 #endif
1078 	in_ifdetach(ifp);
1079 #ifdef INET6
1080 	in6_ifdetach(ifp);
1081 #endif
1082 #if NPF > 0
1083 	pfi_detach_ifnet(ifp);
1084 #endif
1085 
1086 	while ((ifg = TAILQ_FIRST(&ifp->if_groups)) != NULL)
1087 		if_delgroup(ifp, ifg->ifgl_group->ifg_group);
1088 
1089 	if_free_sadl(ifp);
1090 
1091 	/* We should not have any address left at this point. */
1092 	if (!TAILQ_EMPTY(&ifp->if_addrlist)) {
1093 #ifdef DIAGNOSTIC
1094 		printf("%s: address list non empty\n", ifp->if_xname);
1095 #endif
1096 		while ((ifa = TAILQ_FIRST(&ifp->if_addrlist)) != NULL) {
1097 			ifa_del(ifp, ifa);
1098 			ifa->ifa_ifp = NULL;
1099 			ifafree(ifa);
1100 		}
1101 	}
1102 
1103 	KASSERT(TAILQ_EMPTY(&ifp->if_addrhooks));
1104 	KASSERT(TAILQ_EMPTY(&ifp->if_linkstatehooks));
1105 	KASSERT(TAILQ_EMPTY(&ifp->if_detachhooks));
1106 
1107 #ifdef INET6
1108 	nd6_ifdetach(ifp);
1109 #endif
1110 
1111 	/* Announce that the interface is gone. */
1112 	rtm_ifannounce(ifp, IFAN_DEPARTURE);
1113 	splx(s);
1114 	NET_UNLOCK();
1115 
1116 	if (ifp->if_counters != NULL)
1117 		if_counters_free(ifp);
1118 
1119 	for (i = 0; i < ifp->if_nifqs; i++)
1120 		ifq_destroy(ifp->if_ifqs[i]);
1121 	if (ifp->if_ifqs != ifp->if_snd.ifq_ifqs) {
1122 		for (i = 1; i < ifp->if_nifqs; i++) {
1123 			free(ifp->if_ifqs[i], M_DEVBUF,
1124 			    sizeof(struct ifqueue));
1125 		}
1126 		free(ifp->if_ifqs, M_DEVBUF,
1127 		    sizeof(struct ifqueue *) * ifp->if_nifqs);
1128 	}
1129 
1130 	for (i = 0; i < ifp->if_niqs; i++)
1131 		ifiq_destroy(ifp->if_iqs[i]);
1132 	if (ifp->if_iqs != ifp->if_rcv.ifiq_ifiqs) {
1133 		for (i = 1; i < ifp->if_niqs; i++) {
1134 			free(ifp->if_iqs[i], M_DEVBUF,
1135 			    sizeof(struct ifiqueue));
1136 		}
1137 		free(ifp->if_iqs, M_DEVBUF,
1138 		    sizeof(struct ifiqueue *) * ifp->if_niqs);
1139 	}
1140 }
1141 
1142 /*
1143  * Returns true if ``ifp0'' is connected to the interface with index ``ifidx''.
1144  */
1145 int
1146 if_isconnected(const struct ifnet *ifp0, unsigned int ifidx)
1147 {
1148 	struct ifnet *ifp;
1149 	int connected = 0;
1150 
1151 	ifp = if_get(ifidx);
1152 	if (ifp == NULL)
1153 		return (0);
1154 
1155 	if (ifp0->if_index == ifp->if_index)
1156 		connected = 1;
1157 
1158 #if NBRIDGE > 0
1159 	if (ifp0->if_bridgeidx != 0 && ifp0->if_bridgeidx == ifp->if_bridgeidx)
1160 		connected = 1;
1161 #endif
1162 #if NCARP > 0
1163 	if ((ifp0->if_type == IFT_CARP &&
1164 	    ifp0->if_carpdevidx == ifp->if_index) ||
1165 	    (ifp->if_type == IFT_CARP && ifp->if_carpdevidx == ifp0->if_index))
1166 		connected = 1;
1167 #endif
1168 
1169 	if_put(ifp);
1170 	return (connected);
1171 }
1172 
1173 /*
1174  * Create a clone network interface.
1175  */
1176 int
1177 if_clone_create(const char *name, int rdomain)
1178 {
1179 	struct if_clone *ifc;
1180 	struct ifnet *ifp;
1181 	int unit, ret;
1182 
1183 	ifc = if_clone_lookup(name, &unit);
1184 	if (ifc == NULL)
1185 		return (EINVAL);
1186 
1187 	rw_enter_write(&if_cloners_lock);
1188 
1189 	if ((ifp = if_unit(name)) != NULL) {
1190 		ret = EEXIST;
1191 		goto unlock;
1192 	}
1193 
1194 	ret = (*ifc->ifc_create)(ifc, unit);
1195 
1196 	if (ret != 0 || (ifp = if_unit(name)) == NULL)
1197 		goto unlock;
1198 
1199 	NET_LOCK();
1200 	if_addgroup(ifp, ifc->ifc_name);
1201 	if (rdomain != 0)
1202 		if_setrdomain(ifp, rdomain);
1203 	NET_UNLOCK();
1204 unlock:
1205 	rw_exit_write(&if_cloners_lock);
1206 	if_put(ifp);
1207 
1208 	return (ret);
1209 }
1210 
1211 /*
1212  * Destroy a clone network interface.
1213  */
1214 int
1215 if_clone_destroy(const char *name)
1216 {
1217 	struct if_clone *ifc;
1218 	struct ifnet *ifp;
1219 	int ret;
1220 
1221 	ifc = if_clone_lookup(name, NULL);
1222 	if (ifc == NULL)
1223 		return (EINVAL);
1224 
1225 	if (ifc->ifc_destroy == NULL)
1226 		return (EOPNOTSUPP);
1227 
1228 	rw_enter_write(&if_cloners_lock);
1229 
1230 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
1231 		if (strcmp(ifp->if_xname, name) == 0)
1232 			break;
1233 	}
1234 	if (ifp == NULL) {
1235 		rw_exit_write(&if_cloners_lock);
1236 		return (ENXIO);
1237 	}
1238 
1239 	NET_LOCK();
1240 	if (ifp->if_flags & IFF_UP) {
1241 		int s;
1242 		s = splnet();
1243 		if_down(ifp);
1244 		splx(s);
1245 	}
1246 	NET_UNLOCK();
1247 	ret = (*ifc->ifc_destroy)(ifp);
1248 
1249 	rw_exit_write(&if_cloners_lock);
1250 
1251 	return (ret);
1252 }
1253 
1254 /*
1255  * Look up a network interface cloner.
1256  */
1257 struct if_clone *
1258 if_clone_lookup(const char *name, int *unitp)
1259 {
1260 	struct if_clone *ifc;
1261 	const char *cp;
1262 	int unit;
1263 
1264 	/* separate interface name from unit */
1265 	for (cp = name;
1266 	    cp - name < IFNAMSIZ && *cp && (*cp < '0' || *cp > '9');
1267 	    cp++)
1268 		continue;
1269 
1270 	if (cp == name || cp - name == IFNAMSIZ || !*cp)
1271 		return (NULL);	/* No name or unit number */
1272 
1273 	if (cp - name < IFNAMSIZ-1 && *cp == '0' && cp[1] != '\0')
1274 		return (NULL);	/* unit number 0 padded */
1275 
1276 	LIST_FOREACH(ifc, &if_cloners, ifc_list) {
1277 		if (strlen(ifc->ifc_name) == cp - name &&
1278 		    !strncmp(name, ifc->ifc_name, cp - name))
1279 			break;
1280 	}
1281 
1282 	if (ifc == NULL)
1283 		return (NULL);
1284 
1285 	unit = 0;
1286 	while (cp - name < IFNAMSIZ && *cp) {
1287 		if (*cp < '0' || *cp > '9' ||
1288 		    unit > (INT_MAX - (*cp - '0')) / 10) {
1289 			/* Bogus unit number. */
1290 			return (NULL);
1291 		}
1292 		unit = (unit * 10) + (*cp++ - '0');
1293 	}
1294 
1295 	if (unitp != NULL)
1296 		*unitp = unit;
1297 	return (ifc);
1298 }
1299 
1300 /*
1301  * Register a network interface cloner.
1302  */
1303 void
1304 if_clone_attach(struct if_clone *ifc)
1305 {
1306 	/*
1307 	 * we are called at kernel boot by main(), when pseudo devices are
1308 	 * being attached. The main() is the only guy which may alter the
1309 	 * if_cloners. While system is running and main() is done with
1310 	 * initialization, the if_cloners becomes immutable.
1311 	 */
1312 	KASSERT(pdevinit_done == 0);
1313 	LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);
1314 	if_cloners_count++;
1315 }
1316 
1317 /*
1318  * Provide list of interface cloners to userspace.
1319  */
1320 int
1321 if_clone_list(struct if_clonereq *ifcr)
1322 {
1323 	char outbuf[IFNAMSIZ], *dst;
1324 	struct if_clone *ifc;
1325 	int count, error = 0;
1326 
1327 	if ((dst = ifcr->ifcr_buffer) == NULL) {
1328 		/* Just asking how many there are. */
1329 		ifcr->ifcr_total = if_cloners_count;
1330 		return (0);
1331 	}
1332 
1333 	if (ifcr->ifcr_count < 0)
1334 		return (EINVAL);
1335 
1336 	ifcr->ifcr_total = if_cloners_count;
1337 	count = MIN(if_cloners_count, ifcr->ifcr_count);
1338 
1339 	LIST_FOREACH(ifc, &if_cloners, ifc_list) {
1340 		if (count == 0)
1341 			break;
1342 		bzero(outbuf, sizeof outbuf);
1343 		strlcpy(outbuf, ifc->ifc_name, IFNAMSIZ);
1344 		error = copyout(outbuf, dst, IFNAMSIZ);
1345 		if (error)
1346 			break;
1347 		count--;
1348 		dst += IFNAMSIZ;
1349 	}
1350 
1351 	return (error);
1352 }
1353 
1354 /*
1355  * set queue congestion marker
1356  */
1357 void
1358 if_congestion(void)
1359 {
1360 	extern int ticks;
1361 
1362 	ifq_congestion = ticks;
1363 }
1364 
1365 int
1366 if_congested(void)
1367 {
1368 	extern int ticks;
1369 	int diff;
1370 
1371 	diff = ticks - ifq_congestion;
1372 	if (diff < 0) {
1373 		ifq_congestion = ticks - hz;
1374 		return (0);
1375 	}
1376 
1377 	return (diff <= (hz / 100));
1378 }
1379 
1380 #define	equal(a1, a2)	\
1381 	(bcmp((caddr_t)(a1), (caddr_t)(a2),	\
1382 	(a1)->sa_len) == 0)
1383 
1384 /*
1385  * Locate an interface based on a complete address.
1386  */
1387 struct ifaddr *
1388 ifa_ifwithaddr(struct sockaddr *addr, u_int rtableid)
1389 {
1390 	struct ifnet *ifp;
1391 	struct ifaddr *ifa;
1392 	u_int rdomain;
1393 
1394 	rdomain = rtable_l2(rtableid);
1395 	KERNEL_LOCK();
1396 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
1397 		if (ifp->if_rdomain != rdomain)
1398 			continue;
1399 
1400 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1401 			if (ifa->ifa_addr->sa_family != addr->sa_family)
1402 				continue;
1403 
1404 			if (equal(addr, ifa->ifa_addr)) {
1405 				KERNEL_UNLOCK();
1406 				return (ifa);
1407 			}
1408 		}
1409 	}
1410 	KERNEL_UNLOCK();
1411 	return (NULL);
1412 }
1413 
1414 /*
1415  * Locate the point to point interface with a given destination address.
1416  */
1417 struct ifaddr *
1418 ifa_ifwithdstaddr(struct sockaddr *addr, u_int rdomain)
1419 {
1420 	struct ifnet *ifp;
1421 	struct ifaddr *ifa;
1422 
1423 	rdomain = rtable_l2(rdomain);
1424 	KERNEL_LOCK();
1425 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
1426 		if (ifp->if_rdomain != rdomain)
1427 			continue;
1428 		if (ifp->if_flags & IFF_POINTOPOINT) {
1429 			TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1430 				if (ifa->ifa_addr->sa_family !=
1431 				    addr->sa_family || ifa->ifa_dstaddr == NULL)
1432 					continue;
1433 				if (equal(addr, ifa->ifa_dstaddr)) {
1434 					KERNEL_UNLOCK();
1435 					return (ifa);
1436 				}
1437 			}
1438 		}
1439 	}
1440 	KERNEL_UNLOCK();
1441 	return (NULL);
1442 }
1443 
1444 /*
1445  * Find an interface address specific to an interface best matching
1446  * a given address.
1447  */
1448 struct ifaddr *
1449 ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
1450 {
1451 	struct ifaddr *ifa;
1452 	char *cp, *cp2, *cp3;
1453 	char *cplim;
1454 	struct ifaddr *ifa_maybe = NULL;
1455 	u_int af = addr->sa_family;
1456 
1457 	if (af >= AF_MAX)
1458 		return (NULL);
1459 	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1460 		if (ifa->ifa_addr->sa_family != af)
1461 			continue;
1462 		if (ifa_maybe == NULL)
1463 			ifa_maybe = ifa;
1464 		if (ifa->ifa_netmask == 0 || ifp->if_flags & IFF_POINTOPOINT) {
1465 			if (equal(addr, ifa->ifa_addr) ||
1466 			    (ifa->ifa_dstaddr && equal(addr, ifa->ifa_dstaddr)))
1467 				return (ifa);
1468 			continue;
1469 		}
1470 		cp = addr->sa_data;
1471 		cp2 = ifa->ifa_addr->sa_data;
1472 		cp3 = ifa->ifa_netmask->sa_data;
1473 		cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask;
1474 		for (; cp3 < cplim; cp3++)
1475 			if ((*cp++ ^ *cp2++) & *cp3)
1476 				break;
1477 		if (cp3 == cplim)
1478 			return (ifa);
1479 	}
1480 	return (ifa_maybe);
1481 }
1482 
1483 void
1484 if_rtrequest_dummy(struct ifnet *ifp, int req, struct rtentry *rt)
1485 {
1486 }
1487 
1488 /*
1489  * Default action when installing a local route on a point-to-point
1490  * interface.
1491  */
1492 void
1493 p2p_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt)
1494 {
1495 	struct ifnet *lo0ifp;
1496 	struct ifaddr *ifa, *lo0ifa;
1497 
1498 	switch (req) {
1499 	case RTM_ADD:
1500 		if (!ISSET(rt->rt_flags, RTF_LOCAL))
1501 			break;
1502 
1503 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1504 			if (memcmp(rt_key(rt), ifa->ifa_addr,
1505 			    rt_key(rt)->sa_len) == 0)
1506 				break;
1507 		}
1508 
1509 		if (ifa == NULL)
1510 			break;
1511 
1512 		KASSERT(ifa == rt->rt_ifa);
1513 
1514 		lo0ifp = if_get(rtable_loindex(ifp->if_rdomain));
1515 		KASSERT(lo0ifp != NULL);
1516 		TAILQ_FOREACH(lo0ifa, &lo0ifp->if_addrlist, ifa_list) {
1517 			if (lo0ifa->ifa_addr->sa_family ==
1518 			    ifa->ifa_addr->sa_family)
1519 				break;
1520 		}
1521 		if_put(lo0ifp);
1522 
1523 		if (lo0ifa == NULL)
1524 			break;
1525 
1526 		rt->rt_flags &= ~RTF_LLINFO;
1527 		break;
1528 	case RTM_DELETE:
1529 	case RTM_RESOLVE:
1530 	default:
1531 		break;
1532 	}
1533 }
1534 
1535 int
1536 p2p_bpf_mtap(caddr_t if_bpf, const struct mbuf *m, u_int dir)
1537 {
1538 #if NBPFILTER > 0
1539 	return (bpf_mtap_af(if_bpf, m->m_pkthdr.ph_family, m, dir));
1540 #else
1541 	return (0);
1542 #endif
1543 }
1544 
1545 void
1546 p2p_input(struct ifnet *ifp, struct mbuf *m)
1547 {
1548 	void (*input)(struct ifnet *, struct mbuf *);
1549 
1550 	switch (m->m_pkthdr.ph_family) {
1551 	case AF_INET:
1552 		input = ipv4_input;
1553 		break;
1554 #ifdef INET6
1555 	case AF_INET6:
1556 		input = ipv6_input;
1557 		break;
1558 #endif
1559 #ifdef MPLS
1560 	case AF_MPLS:
1561 		input = mpls_input;
1562 		break;
1563 #endif
1564 	default:
1565 		m_freem(m);
1566 		return;
1567 	}
1568 
1569 	(*input)(ifp, m);
1570 }
1571 
1572 /*
1573  * Bring down all interfaces
1574  */
1575 void
1576 if_downall(void)
1577 {
1578 	struct ifreq ifrq;	/* XXX only partly built */
1579 	struct ifnet *ifp;
1580 
1581 	NET_LOCK();
1582 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
1583 		if ((ifp->if_flags & IFF_UP) == 0)
1584 			continue;
1585 		if_down(ifp);
1586 		ifrq.ifr_flags = ifp->if_flags;
1587 		(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
1588 	}
1589 	NET_UNLOCK();
1590 }
1591 
1592 /*
1593  * Mark an interface down and notify protocols of
1594  * the transition.
1595  */
1596 void
1597 if_down(struct ifnet *ifp)
1598 {
1599 	NET_ASSERT_LOCKED();
1600 
1601 	ifp->if_flags &= ~IFF_UP;
1602 	getmicrotime(&ifp->if_lastchange);
1603 	ifq_purge(&ifp->if_snd);
1604 
1605 	if_linkstate(ifp);
1606 }
1607 
1608 /*
1609  * Mark an interface up and notify protocols of
1610  * the transition.
1611  */
1612 void
1613 if_up(struct ifnet *ifp)
1614 {
1615 	NET_ASSERT_LOCKED();
1616 
1617 	ifp->if_flags |= IFF_UP;
1618 	getmicrotime(&ifp->if_lastchange);
1619 
1620 #ifdef INET6
1621 	/* Userland expects the kernel to set ::1 on default lo(4). */
1622 	if (ifp->if_index == rtable_loindex(ifp->if_rdomain))
1623 		in6_ifattach(ifp);
1624 #endif
1625 
1626 	if_linkstate(ifp);
1627 }
1628 
1629 /*
1630  * Notify userland, the routing table and hooks owner of
1631  * a link-state transition.
1632  */
1633 void
1634 if_linkstate_task(void *xifidx)
1635 {
1636 	unsigned int ifidx = (unsigned long)xifidx;
1637 	struct ifnet *ifp;
1638 
1639 	KERNEL_LOCK();
1640 	NET_LOCK();
1641 
1642 	ifp = if_get(ifidx);
1643 	if (ifp != NULL)
1644 		if_linkstate(ifp);
1645 	if_put(ifp);
1646 
1647 	NET_UNLOCK();
1648 	KERNEL_UNLOCK();
1649 }
1650 
1651 void
1652 if_linkstate(struct ifnet *ifp)
1653 {
1654 	NET_ASSERT_LOCKED();
1655 
1656 	rtm_ifchg(ifp);
1657 	rt_if_track(ifp);
1658 
1659 	if_hooks_run(&ifp->if_linkstatehooks);
1660 }
1661 
1662 void
1663 if_linkstatehook_add(struct ifnet *ifp, struct task *t)
1664 {
1665 	mtx_enter(&if_hooks_mtx);
1666 	TAILQ_INSERT_HEAD(&ifp->if_linkstatehooks, t, t_entry);
1667 	mtx_leave(&if_hooks_mtx);
1668 }
1669 
1670 void
1671 if_linkstatehook_del(struct ifnet *ifp, struct task *t)
1672 {
1673 	mtx_enter(&if_hooks_mtx);
1674 	TAILQ_REMOVE(&ifp->if_linkstatehooks, t, t_entry);
1675 	mtx_leave(&if_hooks_mtx);
1676 }
1677 
1678 /*
1679  * Schedule a link state change task.
1680  */
1681 void
1682 if_link_state_change(struct ifnet *ifp)
1683 {
1684 	task_add(net_tq(ifp->if_index), &ifp->if_linkstatetask);
1685 }
1686 
1687 /*
1688  * Handle interface watchdog timer routine.  Called
1689  * from softclock, we decrement timer (if set) and
1690  * call the appropriate interface routine on expiration.
1691  */
1692 void
1693 if_slowtimo(void *arg)
1694 {
1695 	struct ifnet *ifp = arg;
1696 	int s = splnet();
1697 
1698 	if (ifp->if_watchdog) {
1699 		if (ifp->if_timer > 0 && --ifp->if_timer == 0)
1700 			task_add(net_tq(ifp->if_index), &ifp->if_watchdogtask);
1701 		timeout_add_sec(&ifp->if_slowtimo, IFNET_SLOWTIMO);
1702 	}
1703 	splx(s);
1704 }
1705 
1706 void
1707 if_watchdog_task(void *xifidx)
1708 {
1709 	unsigned int ifidx = (unsigned long)xifidx;
1710 	struct ifnet *ifp;
1711 	int s;
1712 
1713 	ifp = if_get(ifidx);
1714 	if (ifp == NULL)
1715 		return;
1716 
1717 	KERNEL_LOCK();
1718 	s = splnet();
1719 	if (ifp->if_watchdog)
1720 		(*ifp->if_watchdog)(ifp);
1721 	splx(s);
1722 	KERNEL_UNLOCK();
1723 
1724 	if_put(ifp);
1725 }
1726 
1727 /*
1728  * Map interface name to interface structure pointer.
1729  */
1730 struct ifnet *
1731 if_unit(const char *name)
1732 {
1733 	struct ifnet *ifp;
1734 
1735 	KERNEL_ASSERT_LOCKED();
1736 
1737 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
1738 		if (strcmp(ifp->if_xname, name) == 0) {
1739 			if_ref(ifp);
1740 			return (ifp);
1741 		}
1742 	}
1743 
1744 	return (NULL);
1745 }
1746 
1747 /*
1748  * Map interface index to interface structure pointer.
1749  */
1750 struct ifnet *
1751 if_get(unsigned int index)
1752 {
1753 	struct ifnet **if_map;
1754 	struct ifnet *ifp = NULL;
1755 
1756 	if (index == 0)
1757 		return (NULL);
1758 
1759 	smr_read_enter();
1760 	if_map = SMR_PTR_GET(&if_idxmap.map);
1761 	if (index < if_idxmap_limit(if_map)) {
1762 		ifp = SMR_PTR_GET(&if_map[index]);
1763 		if (ifp != NULL) {
1764 			KASSERT(ifp->if_index == index);
1765 			if_ref(ifp);
1766 		}
1767 	}
1768 	smr_read_leave();
1769 
1770 	return (ifp);
1771 }
1772 
1773 struct ifnet *
1774 if_ref(struct ifnet *ifp)
1775 {
1776 	refcnt_take(&ifp->if_refcnt);
1777 
1778 	return (ifp);
1779 }
1780 
1781 void
1782 if_put(struct ifnet *ifp)
1783 {
1784 	if (ifp == NULL)
1785 		return;
1786 
1787 	refcnt_rele_wake(&ifp->if_refcnt);
1788 }
1789 
1790 int
1791 if_setlladdr(struct ifnet *ifp, const uint8_t *lladdr)
1792 {
1793 	if (ifp->if_sadl == NULL)
1794 		return (EINVAL);
1795 
1796 	memcpy(((struct arpcom *)ifp)->ac_enaddr, lladdr, ETHER_ADDR_LEN);
1797 	memcpy(LLADDR(ifp->if_sadl), lladdr, ETHER_ADDR_LEN);
1798 
1799 	return (0);
1800 }
1801 
1802 int
1803 if_createrdomain(int rdomain, struct ifnet *ifp)
1804 {
1805 	int error;
1806 	struct ifnet *loifp;
1807 	char loifname[IFNAMSIZ];
1808 	unsigned int unit = rdomain;
1809 
1810 	if ((error = rtable_add(rdomain)) != 0)
1811 		return (error);
1812 	if (!rtable_empty(rdomain))
1813 		return (EEXIST);
1814 
1815 	/* Create rdomain including its loopback if with unit == rdomain */
1816 	snprintf(loifname, sizeof(loifname), "lo%u", unit);
1817 	error = if_clone_create(loifname, 0);
1818 	if ((loifp = if_unit(loifname)) == NULL)
1819 		return (ENXIO);
1820 	if (error && (ifp != loifp || error != EEXIST)) {
1821 		if_put(loifp);
1822 		return (error);
1823 	}
1824 
1825 	rtable_l2set(rdomain, rdomain, loifp->if_index);
1826 	loifp->if_rdomain = rdomain;
1827 	if_put(loifp);
1828 
1829 	return (0);
1830 }
1831 
1832 int
1833 if_setrdomain(struct ifnet *ifp, int rdomain)
1834 {
1835 	struct ifreq ifr;
1836 	int error, up = 0, s;
1837 
1838 	if (rdomain < 0 || rdomain > RT_TABLEID_MAX)
1839 		return (EINVAL);
1840 
1841 	if (rdomain != ifp->if_rdomain &&
1842 	    (ifp->if_flags & IFF_LOOPBACK) &&
1843 	    (ifp->if_index == rtable_loindex(ifp->if_rdomain)))
1844 		return (EPERM);
1845 
1846 	if (!rtable_exists(rdomain))
1847 		return (ESRCH);
1848 
1849 	/* make sure that the routing table is a real rdomain */
1850 	if (rdomain != rtable_l2(rdomain))
1851 		return (EINVAL);
1852 
1853 	if (rdomain != ifp->if_rdomain) {
1854 		s = splnet();
1855 		/*
1856 		 * We are tearing down the world.
1857 		 * Take down the IF so:
1858 		 * 1. everything that cares gets a message
1859 		 * 2. the automagic IPv6 bits are recreated
1860 		 */
1861 		if (ifp->if_flags & IFF_UP) {
1862 			up = 1;
1863 			if_down(ifp);
1864 		}
1865 		rti_delete(ifp);
1866 #ifdef MROUTING
1867 		vif_delete(ifp);
1868 #endif
1869 		in_ifdetach(ifp);
1870 #ifdef INET6
1871 		in6_ifdetach(ifp);
1872 #endif
1873 		splx(s);
1874 	}
1875 
1876 	/* Let devices like enc(4) or mpe(4) know about the change */
1877 	ifr.ifr_rdomainid = rdomain;
1878 	if ((error = (*ifp->if_ioctl)(ifp, SIOCSIFRDOMAIN,
1879 	    (caddr_t)&ifr)) != ENOTTY)
1880 		return (error);
1881 	error = 0;
1882 
1883 	/* Add interface to the specified rdomain */
1884 	ifp->if_rdomain = rdomain;
1885 
1886 	/* If we took down the IF, bring it back */
1887 	if (up) {
1888 		s = splnet();
1889 		if_up(ifp);
1890 		splx(s);
1891 	}
1892 
1893 	return (0);
1894 }
1895 
1896 /*
1897  * Interface ioctls.
1898  */
1899 int
1900 ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
1901 {
1902 	struct ifnet *ifp;
1903 	struct ifreq *ifr = (struct ifreq *)data;
1904 	struct ifgroupreq *ifgr = (struct ifgroupreq *)data;
1905 	struct if_afreq *ifar = (struct if_afreq *)data;
1906 	char ifdescrbuf[IFDESCRSIZE];
1907 	char ifrtlabelbuf[RTLABEL_LEN];
1908 	int s, error = 0, oif_xflags;
1909 	size_t bytesdone;
1910 	unsigned short oif_flags;
1911 
1912 	switch (cmd) {
1913 	case SIOCIFCREATE:
1914 		if ((error = suser(p)) != 0)
1915 			return (error);
1916 		KERNEL_LOCK();
1917 		error = if_clone_create(ifr->ifr_name, 0);
1918 		KERNEL_UNLOCK();
1919 		return (error);
1920 	case SIOCIFDESTROY:
1921 		if ((error = suser(p)) != 0)
1922 			return (error);
1923 		KERNEL_LOCK();
1924 		error = if_clone_destroy(ifr->ifr_name);
1925 		KERNEL_UNLOCK();
1926 		return (error);
1927 	case SIOCSIFGATTR:
1928 		if ((error = suser(p)) != 0)
1929 			return (error);
1930 		KERNEL_LOCK();
1931 		NET_LOCK();
1932 		error = if_setgroupattribs(data);
1933 		NET_UNLOCK();
1934 		KERNEL_UNLOCK();
1935 		return (error);
1936 	case SIOCGIFCONF:
1937 	case SIOCIFGCLONERS:
1938 	case SIOCGIFGMEMB:
1939 	case SIOCGIFGATTR:
1940 	case SIOCGIFGLIST:
1941 	case SIOCGIFFLAGS:
1942 	case SIOCGIFXFLAGS:
1943 	case SIOCGIFMETRIC:
1944 	case SIOCGIFMTU:
1945 	case SIOCGIFHARDMTU:
1946 	case SIOCGIFDATA:
1947 	case SIOCGIFDESCR:
1948 	case SIOCGIFRTLABEL:
1949 	case SIOCGIFPRIORITY:
1950 	case SIOCGIFRDOMAIN:
1951 	case SIOCGIFGROUP:
1952 	case SIOCGIFLLPRIO:
1953 		error = ifioctl_get(cmd, data);
1954 		return (error);
1955 	}
1956 
1957 	KERNEL_LOCK();
1958 
1959 	ifp = if_unit(ifr->ifr_name);
1960 	if (ifp == NULL) {
1961 		KERNEL_UNLOCK();
1962 		return (ENXIO);
1963 	}
1964 	oif_flags = ifp->if_flags;
1965 	oif_xflags = ifp->if_xflags;
1966 
1967 	switch (cmd) {
1968 	case SIOCIFAFATTACH:
1969 	case SIOCIFAFDETACH:
1970 		if ((error = suser(p)) != 0)
1971 			break;
1972 		NET_LOCK();
1973 		switch (ifar->ifar_af) {
1974 		case AF_INET:
1975 			/* attach is a noop for AF_INET */
1976 			if (cmd == SIOCIFAFDETACH)
1977 				in_ifdetach(ifp);
1978 			break;
1979 #ifdef INET6
1980 		case AF_INET6:
1981 			if (cmd == SIOCIFAFATTACH)
1982 				error = in6_ifattach(ifp);
1983 			else
1984 				in6_ifdetach(ifp);
1985 			break;
1986 #endif /* INET6 */
1987 		default:
1988 			error = EAFNOSUPPORT;
1989 		}
1990 		NET_UNLOCK();
1991 		break;
1992 
1993 	case SIOCSIFXFLAGS:
1994 		if ((error = suser(p)) != 0)
1995 			break;
1996 
1997 		NET_LOCK();
1998 #ifdef INET6
1999 		if ((ISSET(ifr->ifr_flags, IFXF_AUTOCONF6) ||
2000 		    ISSET(ifr->ifr_flags, IFXF_AUTOCONF6TEMP)) &&
2001 		    !ISSET(ifp->if_xflags, IFXF_AUTOCONF6) &&
2002 		    !ISSET(ifp->if_xflags, IFXF_AUTOCONF6TEMP)) {
2003 			error = in6_ifattach(ifp);
2004 			if (error != 0) {
2005 				NET_UNLOCK();
2006 				break;
2007 			}
2008 		}
2009 
2010 		if (ISSET(ifr->ifr_flags, IFXF_INET6_NOSOII) &&
2011 		    !ISSET(ifp->if_xflags, IFXF_INET6_NOSOII))
2012 			ifp->if_xflags |= IFXF_INET6_NOSOII;
2013 
2014 		if (!ISSET(ifr->ifr_flags, IFXF_INET6_NOSOII) &&
2015 		    ISSET(ifp->if_xflags, IFXF_INET6_NOSOII))
2016 			ifp->if_xflags &= ~IFXF_INET6_NOSOII;
2017 
2018 #endif	/* INET6 */
2019 
2020 #ifdef MPLS
2021 		if (ISSET(ifr->ifr_flags, IFXF_MPLS) &&
2022 		    !ISSET(ifp->if_xflags, IFXF_MPLS)) {
2023 			s = splnet();
2024 			ifp->if_xflags |= IFXF_MPLS;
2025 			ifp->if_ll_output = ifp->if_output;
2026 			ifp->if_output = mpls_output;
2027 			splx(s);
2028 		}
2029 		if (ISSET(ifp->if_xflags, IFXF_MPLS) &&
2030 		    !ISSET(ifr->ifr_flags, IFXF_MPLS)) {
2031 			s = splnet();
2032 			ifp->if_xflags &= ~IFXF_MPLS;
2033 			ifp->if_output = ifp->if_ll_output;
2034 			ifp->if_ll_output = NULL;
2035 			splx(s);
2036 		}
2037 #endif	/* MPLS */
2038 
2039 #ifndef SMALL_KERNEL
2040 		if (ifp->if_capabilities & IFCAP_WOL) {
2041 			if (ISSET(ifr->ifr_flags, IFXF_WOL) &&
2042 			    !ISSET(ifp->if_xflags, IFXF_WOL)) {
2043 				s = splnet();
2044 				ifp->if_xflags |= IFXF_WOL;
2045 				error = ifp->if_wol(ifp, 1);
2046 				splx(s);
2047 			}
2048 			if (ISSET(ifp->if_xflags, IFXF_WOL) &&
2049 			    !ISSET(ifr->ifr_flags, IFXF_WOL)) {
2050 				s = splnet();
2051 				ifp->if_xflags &= ~IFXF_WOL;
2052 				error = ifp->if_wol(ifp, 0);
2053 				splx(s);
2054 			}
2055 		} else if (ISSET(ifr->ifr_flags, IFXF_WOL)) {
2056 			ifr->ifr_flags &= ~IFXF_WOL;
2057 			error = ENOTSUP;
2058 		}
2059 
2060 		if (ISSET(ifp->if_capabilities, IFCAP_TSO) &&
2061 		    ISSET(ifr->ifr_flags, IFXF_TSO) !=
2062 		    ISSET(ifp->if_xflags, IFXF_TSO)) {
2063 			struct ifreq ifrq;
2064 
2065 			s = splnet();
2066 
2067 			if (ISSET(ifr->ifr_flags, IFXF_TSO))
2068 				ifp->if_xflags |= IFXF_TSO;
2069 			else
2070 				ifp->if_xflags &= ~IFXF_TSO;
2071 
2072 			NET_ASSERT_LOCKED();	/* for ioctl */
2073 			KERNEL_ASSERT_LOCKED();	/* for if_flags */
2074 
2075 			if (ISSET(ifp->if_flags, IFF_UP)) {
2076 				/* go down for a moment... */
2077 				ifp->if_flags &= ~IFF_UP;
2078 				ifrq.ifr_flags = ifp->if_flags;
2079 				(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS,
2080 				    (caddr_t)&ifrq);
2081 
2082 				/* ... and up again */
2083 				ifp->if_flags |= IFF_UP;
2084 				ifrq.ifr_flags = ifp->if_flags;
2085 				(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS,
2086 				    (caddr_t)&ifrq);
2087 			}
2088 
2089 			splx(s);
2090 		} else if (!ISSET(ifp->if_capabilities, IFCAP_TSO) &&
2091 		    ISSET(ifr->ifr_flags, IFXF_TSO)) {
2092 			ifr->ifr_flags &= ~IFXF_TSO;
2093 			error = ENOTSUP;
2094 		}
2095 #endif
2096 
2097 		if (error == 0)
2098 			ifp->if_xflags = (ifp->if_xflags & IFXF_CANTCHANGE) |
2099 				(ifr->ifr_flags & ~IFXF_CANTCHANGE);
2100 
2101 		if (!ISSET(ifp->if_flags, IFF_UP) &&
2102 		    ((!ISSET(oif_xflags, IFXF_AUTOCONF4) &&
2103 		    ISSET(ifp->if_xflags, IFXF_AUTOCONF4)) ||
2104 		    (!ISSET(oif_xflags, IFXF_AUTOCONF6) &&
2105 		    ISSET(ifp->if_xflags, IFXF_AUTOCONF6)) ||
2106 		    (!ISSET(oif_xflags, IFXF_AUTOCONF6TEMP) &&
2107 		    ISSET(ifp->if_xflags, IFXF_AUTOCONF6TEMP)))) {
2108 			ifr->ifr_flags = ifp->if_flags | IFF_UP;
2109 			goto forceup;
2110 		}
2111 
2112 		NET_UNLOCK();
2113 		break;
2114 
2115 	case SIOCSIFFLAGS:
2116 		if ((error = suser(p)) != 0)
2117 			break;
2118 
2119 		NET_LOCK();
2120 forceup:
2121 		ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
2122 			(ifr->ifr_flags & ~IFF_CANTCHANGE);
2123 		error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, data);
2124 		if (error != 0) {
2125 			ifp->if_flags = oif_flags;
2126 			if (cmd == SIOCSIFXFLAGS)
2127 				ifp->if_xflags = oif_xflags;
2128 		} else if (ISSET(oif_flags ^ ifp->if_flags, IFF_UP)) {
2129 			s = splnet();
2130 			if (ISSET(ifp->if_flags, IFF_UP))
2131 				if_up(ifp);
2132 			else
2133 				if_down(ifp);
2134 			splx(s);
2135 		}
2136 		NET_UNLOCK();
2137 		break;
2138 
2139 	case SIOCSIFMETRIC:
2140 		if ((error = suser(p)) != 0)
2141 			break;
2142 		NET_LOCK();
2143 		ifp->if_metric = ifr->ifr_metric;
2144 		NET_UNLOCK();
2145 		break;
2146 
2147 	case SIOCSIFMTU:
2148 		if ((error = suser(p)) != 0)
2149 			break;
2150 		NET_LOCK();
2151 		error = (*ifp->if_ioctl)(ifp, cmd, data);
2152 		NET_UNLOCK();
2153 		if (error == 0)
2154 			rtm_ifchg(ifp);
2155 		break;
2156 
2157 	case SIOCSIFDESCR:
2158 		if ((error = suser(p)) != 0)
2159 			break;
2160 		error = copyinstr(ifr->ifr_data, ifdescrbuf,
2161 		    IFDESCRSIZE, &bytesdone);
2162 		if (error == 0) {
2163 			(void)memset(ifp->if_description, 0, IFDESCRSIZE);
2164 			strlcpy(ifp->if_description, ifdescrbuf, IFDESCRSIZE);
2165 		}
2166 		break;
2167 
2168 	case SIOCSIFRTLABEL:
2169 		if ((error = suser(p)) != 0)
2170 			break;
2171 		error = copyinstr(ifr->ifr_data, ifrtlabelbuf,
2172 		    RTLABEL_LEN, &bytesdone);
2173 		if (error == 0) {
2174 			rtlabel_unref(ifp->if_rtlabelid);
2175 			ifp->if_rtlabelid = rtlabel_name2id(ifrtlabelbuf);
2176 		}
2177 		break;
2178 
2179 	case SIOCSIFPRIORITY:
2180 		if ((error = suser(p)) != 0)
2181 			break;
2182 		if (ifr->ifr_metric < 0 || ifr->ifr_metric > 15) {
2183 			error = EINVAL;
2184 			break;
2185 		}
2186 		ifp->if_priority = ifr->ifr_metric;
2187 		break;
2188 
2189 	case SIOCSIFRDOMAIN:
2190 		if ((error = suser(p)) != 0)
2191 			break;
2192 		error = if_createrdomain(ifr->ifr_rdomainid, ifp);
2193 		if (!error || error == EEXIST) {
2194 			NET_LOCK();
2195 			error = if_setrdomain(ifp, ifr->ifr_rdomainid);
2196 			NET_UNLOCK();
2197 		}
2198 		break;
2199 
2200 	case SIOCAIFGROUP:
2201 		if ((error = suser(p)))
2202 			break;
2203 		NET_LOCK();
2204 		error = if_addgroup(ifp, ifgr->ifgr_group);
2205 		if (error == 0) {
2206 			error = (*ifp->if_ioctl)(ifp, cmd, data);
2207 			if (error == ENOTTY)
2208 				error = 0;
2209 		}
2210 		NET_UNLOCK();
2211 		break;
2212 
2213 	case SIOCDIFGROUP:
2214 		if ((error = suser(p)))
2215 			break;
2216 		NET_LOCK();
2217 		error = (*ifp->if_ioctl)(ifp, cmd, data);
2218 		if (error == ENOTTY)
2219 			error = 0;
2220 		if (error == 0)
2221 			error = if_delgroup(ifp, ifgr->ifgr_group);
2222 		NET_UNLOCK();
2223 		break;
2224 
2225 	case SIOCSIFLLADDR:
2226 		if ((error = suser(p)))
2227 			break;
2228 		if ((ifp->if_sadl == NULL) ||
2229 		    (ifr->ifr_addr.sa_len != ETHER_ADDR_LEN) ||
2230 		    (ETHER_IS_MULTICAST(ifr->ifr_addr.sa_data))) {
2231 			error = EINVAL;
2232 			break;
2233 		}
2234 		NET_LOCK();
2235 		switch (ifp->if_type) {
2236 		case IFT_ETHER:
2237 		case IFT_CARP:
2238 		case IFT_XETHER:
2239 		case IFT_ISO88025:
2240 			error = (*ifp->if_ioctl)(ifp, cmd, data);
2241 			if (error == ENOTTY)
2242 				error = 0;
2243 			if (error == 0)
2244 				error = if_setlladdr(ifp,
2245 				    ifr->ifr_addr.sa_data);
2246 			break;
2247 		default:
2248 			error = ENODEV;
2249 		}
2250 
2251 		if (error == 0)
2252 			ifnewlladdr(ifp);
2253 		NET_UNLOCK();
2254 		if (error == 0)
2255 			rtm_ifchg(ifp);
2256 		break;
2257 
2258 	case SIOCSIFLLPRIO:
2259 		if ((error = suser(p)))
2260 			break;
2261 		if (ifr->ifr_llprio < IFQ_MINPRIO ||
2262 		    ifr->ifr_llprio > IFQ_MAXPRIO) {
2263 			error = EINVAL;
2264 			break;
2265 		}
2266 		NET_LOCK();
2267 		ifp->if_llprio = ifr->ifr_llprio;
2268 		NET_UNLOCK();
2269 		break;
2270 
2271 	case SIOCGIFSFFPAGE:
2272 		error = suser(p);
2273 		if (error != 0)
2274 			break;
2275 
2276 		error = if_sffpage_check(data);
2277 		if (error != 0)
2278 			break;
2279 
2280 		/* don't take NET_LOCK because i2c reads take a long time */
2281 		error = ((*ifp->if_ioctl)(ifp, cmd, data));
2282 		break;
2283 
2284 	case SIOCSIFMEDIA:
2285 		if ((error = suser(p)) != 0)
2286 			break;
2287 		/* FALLTHROUGH */
2288 	case SIOCGIFMEDIA:
2289 		/* net lock is not needed */
2290 		error = ((*ifp->if_ioctl)(ifp, cmd, data));
2291 		break;
2292 
2293 	case SIOCSETKALIVE:
2294 	case SIOCDIFPHYADDR:
2295 	case SIOCSLIFPHYADDR:
2296 	case SIOCSLIFPHYRTABLE:
2297 	case SIOCSLIFPHYTTL:
2298 	case SIOCSLIFPHYDF:
2299 	case SIOCSLIFPHYECN:
2300 	case SIOCADDMULTI:
2301 	case SIOCDELMULTI:
2302 	case SIOCSVNETID:
2303 	case SIOCDVNETID:
2304 	case SIOCSVNETFLOWID:
2305 	case SIOCSTXHPRIO:
2306 	case SIOCSRXHPRIO:
2307 	case SIOCSIFPAIR:
2308 	case SIOCSIFPARENT:
2309 	case SIOCDIFPARENT:
2310 	case SIOCSETMPWCFG:
2311 	case SIOCSETLABEL:
2312 	case SIOCDELLABEL:
2313 	case SIOCSPWE3CTRLWORD:
2314 	case SIOCSPWE3FAT:
2315 	case SIOCSPWE3NEIGHBOR:
2316 	case SIOCDPWE3NEIGHBOR:
2317 #if NBRIDGE > 0
2318 	case SIOCBRDGADD:
2319 	case SIOCBRDGDEL:
2320 	case SIOCBRDGSIFFLGS:
2321 	case SIOCBRDGSCACHE:
2322 	case SIOCBRDGADDS:
2323 	case SIOCBRDGDELS:
2324 	case SIOCBRDGSADDR:
2325 	case SIOCBRDGSTO:
2326 	case SIOCBRDGDADDR:
2327 	case SIOCBRDGFLUSH:
2328 	case SIOCBRDGADDL:
2329 	case SIOCBRDGSIFPROT:
2330 	case SIOCBRDGARL:
2331 	case SIOCBRDGFRL:
2332 	case SIOCBRDGSPRI:
2333 	case SIOCBRDGSHT:
2334 	case SIOCBRDGSFD:
2335 	case SIOCBRDGSMA:
2336 	case SIOCBRDGSIFPRIO:
2337 	case SIOCBRDGSIFCOST:
2338 	case SIOCBRDGSTXHC:
2339 	case SIOCBRDGSPROTO:
2340 #endif
2341 		if ((error = suser(p)) != 0)
2342 			break;
2343 		/* FALLTHROUGH */
2344 	default:
2345 		error = pru_control(so, cmd, data, ifp);
2346 		if (error != EOPNOTSUPP)
2347 			break;
2348 		switch (cmd) {
2349 		case SIOCAIFADDR:
2350 		case SIOCDIFADDR:
2351 		case SIOCSIFADDR:
2352 		case SIOCSIFNETMASK:
2353 		case SIOCSIFDSTADDR:
2354 		case SIOCSIFBRDADDR:
2355 #ifdef INET6
2356 		case SIOCAIFADDR_IN6:
2357 		case SIOCDIFADDR_IN6:
2358 #endif
2359 			error = suser(p);
2360 			break;
2361 		default:
2362 			error = 0;
2363 			break;
2364 		}
2365 		if (error)
2366 			break;
2367 		NET_LOCK();
2368 		error = ((*ifp->if_ioctl)(ifp, cmd, data));
2369 		NET_UNLOCK();
2370 		break;
2371 	}
2372 
2373 	if (oif_flags != ifp->if_flags || oif_xflags != ifp->if_xflags) {
2374 		/* if_up() and if_down() already sent an update, skip here */
2375 		if (((oif_flags ^ ifp->if_flags) & IFF_UP) == 0)
2376 			rtm_ifchg(ifp);
2377 	}
2378 
2379 	if (((oif_flags ^ ifp->if_flags) & IFF_UP) != 0)
2380 		getmicrotime(&ifp->if_lastchange);
2381 
2382 	KERNEL_UNLOCK();
2383 
2384 	if_put(ifp);
2385 
2386 	return (error);
2387 }
2388 
2389 int
2390 ifioctl_get(u_long cmd, caddr_t data)
2391 {
2392 	struct ifnet *ifp;
2393 	struct ifreq *ifr = (struct ifreq *)data;
2394 	char ifdescrbuf[IFDESCRSIZE];
2395 	char ifrtlabelbuf[RTLABEL_LEN];
2396 	int error = 0;
2397 	size_t bytesdone;
2398 	const char *label;
2399 
2400 	switch(cmd) {
2401 	case SIOCGIFCONF:
2402 		NET_LOCK_SHARED();
2403 		error = ifconf(data);
2404 		NET_UNLOCK_SHARED();
2405 		return (error);
2406 	case SIOCIFGCLONERS:
2407 		error = if_clone_list((struct if_clonereq *)data);
2408 		return (error);
2409 	case SIOCGIFGMEMB:
2410 		NET_LOCK_SHARED();
2411 		error = if_getgroupmembers(data);
2412 		NET_UNLOCK_SHARED();
2413 		return (error);
2414 	case SIOCGIFGATTR:
2415 		NET_LOCK_SHARED();
2416 		error = if_getgroupattribs(data);
2417 		NET_UNLOCK_SHARED();
2418 		return (error);
2419 	case SIOCGIFGLIST:
2420 		NET_LOCK_SHARED();
2421 		error = if_getgrouplist(data);
2422 		NET_UNLOCK_SHARED();
2423 		return (error);
2424 	}
2425 
2426 	KERNEL_LOCK();
2427 
2428 	ifp = if_unit(ifr->ifr_name);
2429 	if (ifp == NULL) {
2430 		KERNEL_UNLOCK();
2431 		return (ENXIO);
2432 	}
2433 
2434 	NET_LOCK_SHARED();
2435 
2436 	switch(cmd) {
2437 	case SIOCGIFFLAGS:
2438 		ifr->ifr_flags = ifp->if_flags;
2439 		if (ifq_is_oactive(&ifp->if_snd))
2440 			ifr->ifr_flags |= IFF_OACTIVE;
2441 		break;
2442 
2443 	case SIOCGIFXFLAGS:
2444 		ifr->ifr_flags = ifp->if_xflags & ~(IFXF_MPSAFE|IFXF_CLONED);
2445 		break;
2446 
2447 	case SIOCGIFMETRIC:
2448 		ifr->ifr_metric = ifp->if_metric;
2449 		break;
2450 
2451 	case SIOCGIFMTU:
2452 		ifr->ifr_mtu = ifp->if_mtu;
2453 		break;
2454 
2455 	case SIOCGIFHARDMTU:
2456 		ifr->ifr_hardmtu = ifp->if_hardmtu;
2457 		break;
2458 
2459 	case SIOCGIFDATA: {
2460 		struct if_data ifdata;
2461 		if_getdata(ifp, &ifdata);
2462 		error = copyout(&ifdata, ifr->ifr_data, sizeof(ifdata));
2463 		break;
2464 	}
2465 
2466 	case SIOCGIFDESCR:
2467 		strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
2468 		error = copyoutstr(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE,
2469 		    &bytesdone);
2470 		break;
2471 
2472 	case SIOCGIFRTLABEL:
2473 		if (ifp->if_rtlabelid &&
2474 		    (label = rtlabel_id2name(ifp->if_rtlabelid)) != NULL) {
2475 			strlcpy(ifrtlabelbuf, label, RTLABEL_LEN);
2476 			error = copyoutstr(ifrtlabelbuf, ifr->ifr_data,
2477 			    RTLABEL_LEN, &bytesdone);
2478 		} else
2479 			error = ENOENT;
2480 		break;
2481 
2482 	case SIOCGIFPRIORITY:
2483 		ifr->ifr_metric = ifp->if_priority;
2484 		break;
2485 
2486 	case SIOCGIFRDOMAIN:
2487 		ifr->ifr_rdomainid = ifp->if_rdomain;
2488 		break;
2489 
2490 	case SIOCGIFGROUP:
2491 		error = if_getgroup(data, ifp);
2492 		break;
2493 
2494 	case SIOCGIFLLPRIO:
2495 		ifr->ifr_llprio = ifp->if_llprio;
2496 		break;
2497 
2498 	default:
2499 		panic("invalid ioctl %lu", cmd);
2500 	}
2501 
2502 	NET_UNLOCK_SHARED();
2503 
2504 	KERNEL_UNLOCK();
2505 
2506 	if_put(ifp);
2507 
2508 	return (error);
2509 }
2510 
2511 static int
2512 if_sffpage_check(const caddr_t data)
2513 {
2514 	const struct if_sffpage *sff = (const struct if_sffpage *)data;
2515 
2516 	switch (sff->sff_addr) {
2517 	case IFSFF_ADDR_EEPROM:
2518 	case IFSFF_ADDR_DDM:
2519 		break;
2520 	default:
2521 		return (EINVAL);
2522 	}
2523 
2524 	return (0);
2525 }
2526 
2527 int
2528 if_txhprio_l2_check(int hdrprio)
2529 {
2530 	switch (hdrprio) {
2531 	case IF_HDRPRIO_PACKET:
2532 		return (0);
2533 	default:
2534 		if (hdrprio >= IF_HDRPRIO_MIN && hdrprio <= IF_HDRPRIO_MAX)
2535 			return (0);
2536 		break;
2537 	}
2538 
2539 	return (EINVAL);
2540 }
2541 
2542 int
2543 if_txhprio_l3_check(int hdrprio)
2544 {
2545 	switch (hdrprio) {
2546 	case IF_HDRPRIO_PACKET:
2547 	case IF_HDRPRIO_PAYLOAD:
2548 		return (0);
2549 	default:
2550 		if (hdrprio >= IF_HDRPRIO_MIN && hdrprio <= IF_HDRPRIO_MAX)
2551 			return (0);
2552 		break;
2553 	}
2554 
2555 	return (EINVAL);
2556 }
2557 
2558 int
2559 if_rxhprio_l2_check(int hdrprio)
2560 {
2561 	switch (hdrprio) {
2562 	case IF_HDRPRIO_PACKET:
2563 	case IF_HDRPRIO_OUTER:
2564 		return (0);
2565 	default:
2566 		if (hdrprio >= IF_HDRPRIO_MIN && hdrprio <= IF_HDRPRIO_MAX)
2567 			return (0);
2568 		break;
2569 	}
2570 
2571 	return (EINVAL);
2572 }
2573 
2574 int
2575 if_rxhprio_l3_check(int hdrprio)
2576 {
2577 	switch (hdrprio) {
2578 	case IF_HDRPRIO_PACKET:
2579 	case IF_HDRPRIO_PAYLOAD:
2580 	case IF_HDRPRIO_OUTER:
2581 		return (0);
2582 	default:
2583 		if (hdrprio >= IF_HDRPRIO_MIN && hdrprio <= IF_HDRPRIO_MAX)
2584 			return (0);
2585 		break;
2586 	}
2587 
2588 	return (EINVAL);
2589 }
2590 
2591 /*
2592  * Return interface configuration
2593  * of system.  List may be used
2594  * in later ioctl's (above) to get
2595  * other information.
2596  */
2597 int
2598 ifconf(caddr_t data)
2599 {
2600 	struct ifconf *ifc = (struct ifconf *)data;
2601 	struct ifnet *ifp;
2602 	struct ifaddr *ifa;
2603 	struct ifreq ifr, *ifrp;
2604 	int space = ifc->ifc_len, error = 0;
2605 
2606 	/* If ifc->ifc_len is 0, fill it in with the needed size and return. */
2607 	if (space == 0) {
2608 		TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
2609 			struct sockaddr *sa;
2610 
2611 			if (TAILQ_EMPTY(&ifp->if_addrlist))
2612 				space += sizeof (ifr);
2613 			else
2614 				TAILQ_FOREACH(ifa,
2615 				    &ifp->if_addrlist, ifa_list) {
2616 					sa = ifa->ifa_addr;
2617 					if (sa->sa_len > sizeof(*sa))
2618 						space += sa->sa_len -
2619 						    sizeof(*sa);
2620 					space += sizeof(ifr);
2621 				}
2622 		}
2623 		ifc->ifc_len = space;
2624 		return (0);
2625 	}
2626 
2627 	ifrp = ifc->ifc_req;
2628 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
2629 		if (space < sizeof(ifr))
2630 			break;
2631 		bcopy(ifp->if_xname, ifr.ifr_name, IFNAMSIZ);
2632 		if (TAILQ_EMPTY(&ifp->if_addrlist)) {
2633 			bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
2634 			error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
2635 			    sizeof(ifr));
2636 			if (error)
2637 				break;
2638 			space -= sizeof (ifr), ifrp++;
2639 		} else
2640 			TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
2641 				struct sockaddr *sa = ifa->ifa_addr;
2642 
2643 				if (space < sizeof(ifr))
2644 					break;
2645 				if (sa->sa_len <= sizeof(*sa)) {
2646 					ifr.ifr_addr = *sa;
2647 					error = copyout((caddr_t)&ifr,
2648 					    (caddr_t)ifrp, sizeof (ifr));
2649 					ifrp++;
2650 				} else {
2651 					space -= sa->sa_len - sizeof(*sa);
2652 					if (space < sizeof (ifr))
2653 						break;
2654 					error = copyout((caddr_t)&ifr,
2655 					    (caddr_t)ifrp,
2656 					    sizeof(ifr.ifr_name));
2657 					if (error == 0)
2658 						error = copyout((caddr_t)sa,
2659 						    (caddr_t)&ifrp->ifr_addr,
2660 						    sa->sa_len);
2661 					ifrp = (struct ifreq *)(sa->sa_len +
2662 					    (caddr_t)&ifrp->ifr_addr);
2663 				}
2664 				if (error)
2665 					break;
2666 				space -= sizeof (ifr);
2667 			}
2668 	}
2669 	ifc->ifc_len -= space;
2670 	return (error);
2671 }
2672 
2673 void
2674 if_counters_alloc(struct ifnet *ifp)
2675 {
2676 	KASSERT(ifp->if_counters == NULL);
2677 
2678 	ifp->if_counters = counters_alloc(ifc_ncounters);
2679 }
2680 
2681 void
2682 if_counters_free(struct ifnet *ifp)
2683 {
2684 	KASSERT(ifp->if_counters != NULL);
2685 
2686 	counters_free(ifp->if_counters, ifc_ncounters);
2687 	ifp->if_counters = NULL;
2688 }
2689 
2690 void
2691 if_getdata(struct ifnet *ifp, struct if_data *data)
2692 {
2693 	unsigned int i;
2694 
2695 	*data = ifp->if_data;
2696 
2697 	if (ifp->if_counters != NULL) {
2698 		uint64_t counters[ifc_ncounters];
2699 
2700 		counters_read(ifp->if_counters, counters, nitems(counters));
2701 
2702 		data->ifi_ipackets += counters[ifc_ipackets];
2703 		data->ifi_ierrors += counters[ifc_ierrors];
2704 		data->ifi_opackets += counters[ifc_opackets];
2705 		data->ifi_oerrors += counters[ifc_oerrors];
2706 		data->ifi_collisions += counters[ifc_collisions];
2707 		data->ifi_ibytes += counters[ifc_ibytes];
2708 		data->ifi_obytes += counters[ifc_obytes];
2709 		data->ifi_imcasts += counters[ifc_imcasts];
2710 		data->ifi_omcasts += counters[ifc_omcasts];
2711 		data->ifi_iqdrops += counters[ifc_iqdrops];
2712 		data->ifi_oqdrops += counters[ifc_oqdrops];
2713 		data->ifi_noproto += counters[ifc_noproto];
2714 	}
2715 
2716 	for (i = 0; i < ifp->if_nifqs; i++) {
2717 		struct ifqueue *ifq = ifp->if_ifqs[i];
2718 
2719 		ifq_add_data(ifq, data);
2720 	}
2721 
2722 	for (i = 0; i < ifp->if_niqs; i++) {
2723 		struct ifiqueue *ifiq = ifp->if_iqs[i];
2724 
2725 		ifiq_add_data(ifiq, data);
2726 	}
2727 }
2728 
2729 /*
2730  * Dummy functions replaced in ifnet during detach (if protocols decide to
2731  * fiddle with the if during detach.
2732  */
2733 void
2734 if_detached_qstart(struct ifqueue *ifq)
2735 {
2736 	ifq_purge(ifq);
2737 }
2738 
2739 int
2740 if_detached_ioctl(struct ifnet *ifp, u_long a, caddr_t b)
2741 {
2742 	return ENODEV;
2743 }
2744 
2745 /*
2746  * Create interface group without members
2747  */
2748 struct ifg_group *
2749 if_creategroup(const char *groupname)
2750 {
2751 	struct ifg_group	*ifg;
2752 
2753 	if ((ifg = malloc(sizeof(*ifg), M_TEMP, M_NOWAIT)) == NULL)
2754 		return (NULL);
2755 
2756 	strlcpy(ifg->ifg_group, groupname, sizeof(ifg->ifg_group));
2757 	ifg->ifg_refcnt = 1;
2758 	ifg->ifg_carp_demoted = 0;
2759 	TAILQ_INIT(&ifg->ifg_members);
2760 #if NPF > 0
2761 	pfi_attach_ifgroup(ifg);
2762 #endif
2763 	TAILQ_INSERT_TAIL(&ifg_head, ifg, ifg_next);
2764 
2765 	return (ifg);
2766 }
2767 
2768 /*
2769  * Add a group to an interface
2770  */
2771 int
2772 if_addgroup(struct ifnet *ifp, const char *groupname)
2773 {
2774 	struct ifg_list		*ifgl;
2775 	struct ifg_group	*ifg = NULL;
2776 	struct ifg_member	*ifgm;
2777 	size_t			 namelen;
2778 
2779 	namelen = strlen(groupname);
2780 	if (namelen == 0 || namelen >= IFNAMSIZ ||
2781 	    (groupname[namelen - 1] >= '0' && groupname[namelen - 1] <= '9'))
2782 		return (EINVAL);
2783 
2784 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
2785 		if (!strcmp(ifgl->ifgl_group->ifg_group, groupname))
2786 			return (EEXIST);
2787 
2788 	if ((ifgl = malloc(sizeof(*ifgl), M_TEMP, M_NOWAIT)) == NULL)
2789 		return (ENOMEM);
2790 
2791 	if ((ifgm = malloc(sizeof(*ifgm), M_TEMP, M_NOWAIT)) == NULL) {
2792 		free(ifgl, M_TEMP, sizeof(*ifgl));
2793 		return (ENOMEM);
2794 	}
2795 
2796 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
2797 		if (!strcmp(ifg->ifg_group, groupname))
2798 			break;
2799 
2800 	if (ifg == NULL) {
2801 		ifg = if_creategroup(groupname);
2802 		if (ifg == NULL) {
2803 			free(ifgl, M_TEMP, sizeof(*ifgl));
2804 			free(ifgm, M_TEMP, sizeof(*ifgm));
2805 			return (ENOMEM);
2806 		}
2807 	} else
2808 		ifg->ifg_refcnt++;
2809 	KASSERT(ifg->ifg_refcnt != 0);
2810 
2811 	ifgl->ifgl_group = ifg;
2812 	ifgm->ifgm_ifp = ifp;
2813 
2814 	TAILQ_INSERT_TAIL(&ifg->ifg_members, ifgm, ifgm_next);
2815 	TAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
2816 
2817 #if NPF > 0
2818 	pfi_group_addmember(groupname);
2819 #endif
2820 
2821 	return (0);
2822 }
2823 
2824 /*
2825  * Remove a group from an interface
2826  */
2827 int
2828 if_delgroup(struct ifnet *ifp, const char *groupname)
2829 {
2830 	struct ifg_list		*ifgl;
2831 	struct ifg_member	*ifgm;
2832 
2833 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
2834 		if (!strcmp(ifgl->ifgl_group->ifg_group, groupname))
2835 			break;
2836 	if (ifgl == NULL)
2837 		return (ENOENT);
2838 
2839 	TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
2840 
2841 	TAILQ_FOREACH(ifgm, &ifgl->ifgl_group->ifg_members, ifgm_next)
2842 		if (ifgm->ifgm_ifp == ifp)
2843 			break;
2844 
2845 	if (ifgm != NULL) {
2846 		TAILQ_REMOVE(&ifgl->ifgl_group->ifg_members, ifgm, ifgm_next);
2847 		free(ifgm, M_TEMP, sizeof(*ifgm));
2848 	}
2849 
2850 #if NPF > 0
2851 	pfi_group_delmember(groupname);
2852 #endif
2853 
2854 	KASSERT(ifgl->ifgl_group->ifg_refcnt != 0);
2855 	if (--ifgl->ifgl_group->ifg_refcnt == 0) {
2856 		TAILQ_REMOVE(&ifg_head, ifgl->ifgl_group, ifg_next);
2857 #if NPF > 0
2858 		pfi_detach_ifgroup(ifgl->ifgl_group);
2859 #endif
2860 		free(ifgl->ifgl_group, M_TEMP, sizeof(*ifgl->ifgl_group));
2861 	}
2862 
2863 	free(ifgl, M_TEMP, sizeof(*ifgl));
2864 
2865 	return (0);
2866 }
2867 
2868 /*
2869  * Stores all groups from an interface in memory pointed
2870  * to by data
2871  */
2872 int
2873 if_getgroup(caddr_t data, struct ifnet *ifp)
2874 {
2875 	int			 len, error;
2876 	struct ifg_list		*ifgl;
2877 	struct ifg_req		 ifgrq, *ifgp;
2878 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
2879 
2880 	if (ifgr->ifgr_len == 0) {
2881 		TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
2882 			ifgr->ifgr_len += sizeof(struct ifg_req);
2883 		return (0);
2884 	}
2885 
2886 	len = ifgr->ifgr_len;
2887 	ifgp = ifgr->ifgr_groups;
2888 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
2889 		if (len < sizeof(ifgrq))
2890 			return (EINVAL);
2891 		bzero(&ifgrq, sizeof ifgrq);
2892 		strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group,
2893 		    sizeof(ifgrq.ifgrq_group));
2894 		if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
2895 		    sizeof(struct ifg_req))))
2896 			return (error);
2897 		len -= sizeof(ifgrq);
2898 		ifgp++;
2899 	}
2900 
2901 	return (0);
2902 }
2903 
2904 /*
2905  * Stores all members of a group in memory pointed to by data
2906  */
2907 int
2908 if_getgroupmembers(caddr_t data)
2909 {
2910 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
2911 	struct ifg_group	*ifg;
2912 	struct ifg_member	*ifgm;
2913 	struct ifg_req		 ifgrq, *ifgp;
2914 	int			 len, error;
2915 
2916 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
2917 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
2918 			break;
2919 	if (ifg == NULL)
2920 		return (ENOENT);
2921 
2922 	if (ifgr->ifgr_len == 0) {
2923 		TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
2924 			ifgr->ifgr_len += sizeof(ifgrq);
2925 		return (0);
2926 	}
2927 
2928 	len = ifgr->ifgr_len;
2929 	ifgp = ifgr->ifgr_groups;
2930 	TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) {
2931 		if (len < sizeof(ifgrq))
2932 			return (EINVAL);
2933 		bzero(&ifgrq, sizeof ifgrq);
2934 		strlcpy(ifgrq.ifgrq_member, ifgm->ifgm_ifp->if_xname,
2935 		    sizeof(ifgrq.ifgrq_member));
2936 		if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
2937 		    sizeof(struct ifg_req))))
2938 			return (error);
2939 		len -= sizeof(ifgrq);
2940 		ifgp++;
2941 	}
2942 
2943 	return (0);
2944 }
2945 
2946 int
2947 if_getgroupattribs(caddr_t data)
2948 {
2949 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
2950 	struct ifg_group	*ifg;
2951 
2952 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
2953 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
2954 			break;
2955 	if (ifg == NULL)
2956 		return (ENOENT);
2957 
2958 	ifgr->ifgr_attrib.ifg_carp_demoted = ifg->ifg_carp_demoted;
2959 
2960 	return (0);
2961 }
2962 
2963 int
2964 if_setgroupattribs(caddr_t data)
2965 {
2966 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
2967 	struct ifg_group	*ifg;
2968 	struct ifg_member	*ifgm;
2969 	int			 demote;
2970 
2971 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
2972 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
2973 			break;
2974 	if (ifg == NULL)
2975 		return (ENOENT);
2976 
2977 	demote = ifgr->ifgr_attrib.ifg_carp_demoted;
2978 	if (demote + ifg->ifg_carp_demoted > 0xff ||
2979 	    demote + ifg->ifg_carp_demoted < 0)
2980 		return (EINVAL);
2981 
2982 	ifg->ifg_carp_demoted += demote;
2983 
2984 	TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
2985 		ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp, SIOCSIFGATTR, data);
2986 
2987 	return (0);
2988 }
2989 
2990 /*
2991  * Stores all groups in memory pointed to by data
2992  */
2993 int
2994 if_getgrouplist(caddr_t data)
2995 {
2996 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
2997 	struct ifg_group	*ifg;
2998 	struct ifg_req		 ifgrq, *ifgp;
2999 	int			 len, error;
3000 
3001 	if (ifgr->ifgr_len == 0) {
3002 		TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
3003 			ifgr->ifgr_len += sizeof(ifgrq);
3004 		return (0);
3005 	}
3006 
3007 	len = ifgr->ifgr_len;
3008 	ifgp = ifgr->ifgr_groups;
3009 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next) {
3010 		if (len < sizeof(ifgrq))
3011 			return (EINVAL);
3012 		bzero(&ifgrq, sizeof ifgrq);
3013 		strlcpy(ifgrq.ifgrq_group, ifg->ifg_group,
3014 		    sizeof(ifgrq.ifgrq_group));
3015 		if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
3016 		    sizeof(struct ifg_req))))
3017 			return (error);
3018 		len -= sizeof(ifgrq);
3019 		ifgp++;
3020 	}
3021 
3022 	return (0);
3023 }
3024 
3025 void
3026 if_group_routechange(struct sockaddr *dst, struct sockaddr *mask)
3027 {
3028 	switch (dst->sa_family) {
3029 	case AF_INET:
3030 		if (satosin(dst)->sin_addr.s_addr == INADDR_ANY &&
3031 		    mask && (mask->sa_len == 0 ||
3032 		    satosin(mask)->sin_addr.s_addr == INADDR_ANY))
3033 			if_group_egress_build();
3034 		break;
3035 #ifdef INET6
3036 	case AF_INET6:
3037 		if (IN6_ARE_ADDR_EQUAL(&(satosin6(dst))->sin6_addr,
3038 		    &in6addr_any) && mask && (mask->sa_len == 0 ||
3039 		    IN6_ARE_ADDR_EQUAL(&(satosin6(mask))->sin6_addr,
3040 		    &in6addr_any)))
3041 			if_group_egress_build();
3042 		break;
3043 #endif
3044 	}
3045 }
3046 
3047 int
3048 if_group_egress_build(void)
3049 {
3050 	struct ifnet		*ifp;
3051 	struct ifg_group	*ifg;
3052 	struct ifg_member	*ifgm, *next;
3053 	struct sockaddr_in	 sa_in;
3054 #ifdef INET6
3055 	struct sockaddr_in6	 sa_in6;
3056 #endif
3057 	struct rtentry		*rt;
3058 
3059 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
3060 		if (!strcmp(ifg->ifg_group, IFG_EGRESS))
3061 			break;
3062 
3063 	if (ifg != NULL)
3064 		TAILQ_FOREACH_SAFE(ifgm, &ifg->ifg_members, ifgm_next, next)
3065 			if_delgroup(ifgm->ifgm_ifp, IFG_EGRESS);
3066 
3067 	bzero(&sa_in, sizeof(sa_in));
3068 	sa_in.sin_len = sizeof(sa_in);
3069 	sa_in.sin_family = AF_INET;
3070 	rt = rtable_lookup(0, sintosa(&sa_in), sintosa(&sa_in), NULL, RTP_ANY);
3071 	while (rt != NULL) {
3072 		ifp = if_get(rt->rt_ifidx);
3073 		if (ifp != NULL) {
3074 			if_addgroup(ifp, IFG_EGRESS);
3075 			if_put(ifp);
3076 		}
3077 		rt = rtable_iterate(rt);
3078 	}
3079 
3080 #ifdef INET6
3081 	bcopy(&sa6_any, &sa_in6, sizeof(sa_in6));
3082 	rt = rtable_lookup(0, sin6tosa(&sa_in6), sin6tosa(&sa_in6), NULL,
3083 	    RTP_ANY);
3084 	while (rt != NULL) {
3085 		ifp = if_get(rt->rt_ifidx);
3086 		if (ifp != NULL) {
3087 			if_addgroup(ifp, IFG_EGRESS);
3088 			if_put(ifp);
3089 		}
3090 		rt = rtable_iterate(rt);
3091 	}
3092 #endif /* INET6 */
3093 
3094 	return (0);
3095 }
3096 
3097 /*
3098  * Set/clear promiscuous mode on interface ifp based on the truth value
3099  * of pswitch.  The calls are reference counted so that only the first
3100  * "on" request actually has an effect, as does the final "off" request.
3101  * Results are undefined if the "off" and "on" requests are not matched.
3102  */
3103 int
3104 ifpromisc(struct ifnet *ifp, int pswitch)
3105 {
3106 	struct ifreq ifr;
3107 	unsigned short oif_flags;
3108 	int oif_pcount, error;
3109 
3110 	NET_ASSERT_LOCKED(); /* modifying if_flags and if_pcount */
3111 
3112 	oif_flags = ifp->if_flags;
3113 	oif_pcount = ifp->if_pcount;
3114 	if (pswitch) {
3115 		if (ifp->if_pcount++ != 0)
3116 			return (0);
3117 		ifp->if_flags |= IFF_PROMISC;
3118 	} else {
3119 		if (--ifp->if_pcount > 0)
3120 			return (0);
3121 		ifp->if_flags &= ~IFF_PROMISC;
3122 	}
3123 
3124 	if ((ifp->if_flags & IFF_UP) == 0)
3125 		return (0);
3126 
3127 	memset(&ifr, 0, sizeof(ifr));
3128 	ifr.ifr_flags = ifp->if_flags;
3129 	error = ((*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr));
3130 	if (error) {
3131 		ifp->if_flags = oif_flags;
3132 		ifp->if_pcount = oif_pcount;
3133 	}
3134 
3135 	return (error);
3136 }
3137 
3138 void
3139 ifa_add(struct ifnet *ifp, struct ifaddr *ifa)
3140 {
3141 	TAILQ_INSERT_TAIL(&ifp->if_addrlist, ifa, ifa_list);
3142 }
3143 
3144 void
3145 ifa_del(struct ifnet *ifp, struct ifaddr *ifa)
3146 {
3147 	TAILQ_REMOVE(&ifp->if_addrlist, ifa, ifa_list);
3148 }
3149 
3150 void
3151 ifa_update_broadaddr(struct ifnet *ifp, struct ifaddr *ifa, struct sockaddr *sa)
3152 {
3153 	if (ifa->ifa_broadaddr->sa_len != sa->sa_len)
3154 		panic("ifa_update_broadaddr does not support dynamic length");
3155 	bcopy(sa, ifa->ifa_broadaddr, sa->sa_len);
3156 }
3157 
3158 #ifdef DDB
3159 /* debug function, can be called from ddb> */
3160 void
3161 ifa_print_all(void)
3162 {
3163 	struct ifnet *ifp;
3164 	struct ifaddr *ifa;
3165 
3166 	TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
3167 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
3168 			char addr[INET6_ADDRSTRLEN];
3169 
3170 			switch (ifa->ifa_addr->sa_family) {
3171 			case AF_INET:
3172 				printf("%s", inet_ntop(AF_INET,
3173 				    &satosin(ifa->ifa_addr)->sin_addr,
3174 				    addr, sizeof(addr)));
3175 				break;
3176 #ifdef INET6
3177 			case AF_INET6:
3178 				printf("%s", inet_ntop(AF_INET6,
3179 				    &(satosin6(ifa->ifa_addr))->sin6_addr,
3180 				    addr, sizeof(addr)));
3181 				break;
3182 #endif
3183 			}
3184 			printf(" on %s\n", ifp->if_xname);
3185 		}
3186 	}
3187 }
3188 #endif /* DDB */
3189 
3190 void
3191 ifnewlladdr(struct ifnet *ifp)
3192 {
3193 #ifdef INET6
3194 	struct ifaddr *ifa;
3195 #endif
3196 	struct ifreq ifrq;
3197 	short up;
3198 
3199 	NET_ASSERT_LOCKED();	/* for ioctl and in6 */
3200 	KERNEL_ASSERT_LOCKED();	/* for if_flags */
3201 
3202 	up = ifp->if_flags & IFF_UP;
3203 
3204 	if (up) {
3205 		/* go down for a moment... */
3206 		ifp->if_flags &= ~IFF_UP;
3207 		ifrq.ifr_flags = ifp->if_flags;
3208 		(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
3209 	}
3210 
3211 	ifp->if_flags |= IFF_UP;
3212 	ifrq.ifr_flags = ifp->if_flags;
3213 	(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
3214 
3215 #ifdef INET6
3216 	/*
3217 	 * Update the link-local address.  Don't do it if we're
3218 	 * a router to avoid confusing hosts on the network.
3219 	 */
3220 	if (!ip6_forwarding) {
3221 		ifa = &in6ifa_ifpforlinklocal(ifp, 0)->ia_ifa;
3222 		if (ifa) {
3223 			in6_purgeaddr(ifa);
3224 			if_hooks_run(&ifp->if_addrhooks);
3225 			in6_ifattach(ifp);
3226 		}
3227 	}
3228 #endif
3229 	if (!up) {
3230 		/* go back down */
3231 		ifp->if_flags &= ~IFF_UP;
3232 		ifrq.ifr_flags = ifp->if_flags;
3233 		(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
3234 	}
3235 }
3236 
3237 void
3238 if_addrhook_add(struct ifnet *ifp, struct task *t)
3239 {
3240 	mtx_enter(&if_hooks_mtx);
3241 	TAILQ_INSERT_TAIL(&ifp->if_addrhooks, t, t_entry);
3242 	mtx_leave(&if_hooks_mtx);
3243 }
3244 
3245 void
3246 if_addrhook_del(struct ifnet *ifp, struct task *t)
3247 {
3248 	mtx_enter(&if_hooks_mtx);
3249 	TAILQ_REMOVE(&ifp->if_addrhooks, t, t_entry);
3250 	mtx_leave(&if_hooks_mtx);
3251 }
3252 
3253 void
3254 if_addrhooks_run(struct ifnet *ifp)
3255 {
3256 	if_hooks_run(&ifp->if_addrhooks);
3257 }
3258 
3259 void
3260 if_rxr_init(struct if_rxring *rxr, u_int lwm, u_int hwm)
3261 {
3262 	extern int ticks;
3263 
3264 	memset(rxr, 0, sizeof(*rxr));
3265 
3266 	rxr->rxr_adjusted = ticks;
3267 	rxr->rxr_cwm = rxr->rxr_lwm = lwm;
3268 	rxr->rxr_hwm = hwm;
3269 }
3270 
3271 static inline void
3272 if_rxr_adjust_cwm(struct if_rxring *rxr)
3273 {
3274 	extern int ticks;
3275 
3276 	if (rxr->rxr_alive >= rxr->rxr_lwm)
3277 		return;
3278 	else if (rxr->rxr_cwm < rxr->rxr_hwm)
3279 		rxr->rxr_cwm++;
3280 
3281 	rxr->rxr_adjusted = ticks;
3282 }
3283 
3284 void
3285 if_rxr_livelocked(struct if_rxring *rxr)
3286 {
3287 	extern int ticks;
3288 
3289 	if (ticks - rxr->rxr_adjusted >= 1) {
3290 		if (rxr->rxr_cwm > rxr->rxr_lwm)
3291 			rxr->rxr_cwm--;
3292 
3293 		rxr->rxr_adjusted = ticks;
3294 	}
3295 }
3296 
3297 u_int
3298 if_rxr_get(struct if_rxring *rxr, u_int max)
3299 {
3300 	extern int ticks;
3301 	u_int diff;
3302 
3303 	if (ticks - rxr->rxr_adjusted >= 1) {
3304 		/* we're free to try for an adjustment */
3305 		if_rxr_adjust_cwm(rxr);
3306 	}
3307 
3308 	if (rxr->rxr_alive >= rxr->rxr_cwm)
3309 		return (0);
3310 
3311 	diff = min(rxr->rxr_cwm - rxr->rxr_alive, max);
3312 	rxr->rxr_alive += diff;
3313 
3314 	return (diff);
3315 }
3316 
3317 int
3318 if_rxr_info_ioctl(struct if_rxrinfo *uifri, u_int t, struct if_rxring_info *e)
3319 {
3320 	struct if_rxrinfo kifri;
3321 	int error;
3322 	u_int n;
3323 
3324 	error = copyin(uifri, &kifri, sizeof(kifri));
3325 	if (error)
3326 		return (error);
3327 
3328 	n = min(t, kifri.ifri_total);
3329 	kifri.ifri_total = t;
3330 
3331 	if (n > 0) {
3332 		error = copyout(e, kifri.ifri_entries, sizeof(*e) * n);
3333 		if (error)
3334 			return (error);
3335 	}
3336 
3337 	return (copyout(&kifri, uifri, sizeof(kifri)));
3338 }
3339 
3340 int
3341 if_rxr_ioctl(struct if_rxrinfo *ifri, const char *name, u_int size,
3342     struct if_rxring *rxr)
3343 {
3344 	struct if_rxring_info ifr;
3345 
3346 	memset(&ifr, 0, sizeof(ifr));
3347 
3348 	if (name != NULL)
3349 		strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
3350 
3351 	ifr.ifr_size = size;
3352 	ifr.ifr_info = *rxr;
3353 
3354 	return (if_rxr_info_ioctl(ifri, 1, &ifr));
3355 }
3356 
3357 /*
3358  * Network stack input queues.
3359  */
3360 
3361 void
3362 niq_init(struct niqueue *niq, u_int maxlen, u_int isr)
3363 {
3364 	mq_init(&niq->ni_q, maxlen, IPL_NET);
3365 	niq->ni_isr = isr;
3366 }
3367 
3368 int
3369 niq_enqueue(struct niqueue *niq, struct mbuf *m)
3370 {
3371 	int rv;
3372 
3373 	rv = mq_enqueue(&niq->ni_q, m);
3374 	if (rv == 0)
3375 		schednetisr(niq->ni_isr);
3376 	else
3377 		if_congestion();
3378 
3379 	return (rv);
3380 }
3381 
3382 int
3383 niq_enlist(struct niqueue *niq, struct mbuf_list *ml)
3384 {
3385 	int rv;
3386 
3387 	rv = mq_enlist(&niq->ni_q, ml);
3388 	if (rv == 0)
3389 		schednetisr(niq->ni_isr);
3390 	else
3391 		if_congestion();
3392 
3393 	return (rv);
3394 }
3395 
3396 __dead void
3397 unhandled_af(int af)
3398 {
3399 	panic("unhandled af %d", af);
3400 }
3401 
3402 struct taskq *
3403 net_tq(unsigned int ifindex)
3404 {
3405 	struct taskq *t = NULL;
3406 	static int nettaskqs;
3407 
3408 	if (nettaskqs == 0)
3409 		nettaskqs = min(NET_TASKQ, ncpus);
3410 
3411 	t = nettqmp[ifindex % nettaskqs];
3412 
3413 	return (t);
3414 }
3415