xref: /openbsd-src/sys/net/if.c (revision d874cce4b1d9fe6b41c9e4f2117a77d8a4a37b92)
1 /*	$OpenBSD: if.c,v 1.173 2008/06/12 16:15:05 claudio 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 "bluetooth.h"
65 #include "bpfilter.h"
66 #include "bridge.h"
67 #include "carp.h"
68 #include "pf.h"
69 #include "trunk.h"
70 
71 #include <sys/param.h>
72 #include <sys/systm.h>
73 #include <sys/mbuf.h>
74 #include <sys/proc.h>
75 #include <sys/socket.h>
76 #include <sys/socketvar.h>
77 #include <sys/protosw.h>
78 #include <sys/kernel.h>
79 #include <sys/ioctl.h>
80 #include <sys/domain.h>
81 #include <sys/sysctl.h>
82 
83 #include <net/if.h>
84 #include <net/if_dl.h>
85 #include <net/if_media.h>
86 #include <net/if_types.h>
87 #include <net/route.h>
88 #include <net/netisr.h>
89 
90 #ifdef INET
91 #include <netinet/in.h>
92 #include <netinet/in_var.h>
93 #include <netinet/if_ether.h>
94 #include <netinet/igmp.h>
95 #ifdef MROUTING
96 #include <netinet/ip_mroute.h>
97 #endif
98 #endif
99 
100 #ifdef INET6
101 #ifndef INET
102 #include <netinet/in.h>
103 #endif
104 #include <netinet6/in6_ifattach.h>
105 #include <netinet6/nd6.h>
106 #endif
107 
108 #if NBPFILTER > 0
109 #include <net/bpf.h>
110 #endif
111 
112 #if NTRUNK > 0
113 #include <net/if_trunk.h>
114 #endif
115 
116 #if NBRIDGE > 0
117 #include <net/if_bridge.h>
118 #endif
119 
120 #if NCARP > 0
121 #include <netinet/ip_carp.h>
122 #endif
123 
124 #if NPF > 0
125 #include <net/pfvar.h>
126 #endif
127 
128 void	if_attachsetup(struct ifnet *);
129 void	if_attachdomain1(struct ifnet *);
130 
131 int	ifqmaxlen = IFQ_MAXLEN;
132 
133 void	if_detach_queues(struct ifnet *, struct ifqueue *);
134 void	if_detached_start(struct ifnet *);
135 int	if_detached_ioctl(struct ifnet *, u_long, caddr_t);
136 int	if_detached_init(struct ifnet *);
137 void	if_detached_watchdog(struct ifnet *);
138 
139 int	if_getgroup(caddr_t, struct ifnet *);
140 int	if_getgroupmembers(caddr_t);
141 int	if_getgroupattribs(caddr_t);
142 int	if_setgroupattribs(caddr_t);
143 
144 int	if_clone_list(struct if_clonereq *);
145 struct if_clone	*if_clone_lookup(const char *, int *);
146 
147 void	if_congestion_clear(void *);
148 int	if_group_egress_build(void);
149 
150 TAILQ_HEAD(, ifg_group) ifg_head;
151 LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);
152 int if_cloners_count;
153 
154 /*
155  * Network interface utility routines.
156  *
157  * Routines with ifa_ifwith* names take sockaddr *'s as
158  * parameters.
159  */
160 void
161 ifinit()
162 {
163 	static struct timeout if_slowtim;
164 
165 	timeout_set(&if_slowtim, if_slowtimo, &if_slowtim);
166 
167 	if_slowtimo(&if_slowtim);
168 }
169 
170 static int if_index = 0;
171 int if_indexlim = 0;
172 struct ifaddr **ifnet_addrs = NULL;
173 struct ifnet **ifindex2ifnet = NULL;
174 struct ifnet_head ifnet;
175 struct ifnet_head iftxlist = TAILQ_HEAD_INITIALIZER(iftxlist);
176 struct ifnet *lo0ifp;
177 
178 /*
179  * Attach an interface to the
180  * list of "active" interfaces.
181  */
182 void
183 if_attachsetup(struct ifnet *ifp)
184 {
185 	struct ifaddr *ifa;
186 	int wrapped = 0;
187 
188 	if (ifindex2ifnet == 0)
189 		if_index = 1;
190 	else {
191 		while (if_index < if_indexlim &&
192 		    ifindex2ifnet[if_index] != NULL) {
193 			if_index++;
194 			/*
195 			 * If we hit USHRT_MAX, we skip back to 1 since
196 			 * there are a number of places where the value
197 			 * of ifp->if_index or if_index itself is compared
198 			 * to or stored in an unsigned short.  By
199 			 * jumping back, we won't botch those assignments
200 			 * or comparisons.
201 			 */
202 			if (if_index == USHRT_MAX) {
203 				if_index = 1;
204 				/*
205 				 * However, if we have to jump back to 1
206 				 * *twice* without finding an empty
207 				 * slot in ifindex2ifnet[], then there
208 				 * there are too many (>65535) interfaces.
209 				 */
210 				if (wrapped++)
211 					panic("too many interfaces");
212 			}
213 		}
214 	}
215 	ifp->if_index = if_index;
216 
217 	/*
218 	 * We have some arrays that should be indexed by if_index.
219 	 * since if_index will grow dynamically, they should grow too.
220 	 *	struct ifaddr **ifnet_addrs
221 	 *	struct ifnet **ifindex2ifnet
222 	 */
223 	if (ifnet_addrs == 0 || ifindex2ifnet == 0 || if_index >= if_indexlim) {
224 		size_t m, n, oldlim;
225 		caddr_t q;
226 
227 		oldlim = if_indexlim;
228 		if (if_indexlim == 0)
229 			if_indexlim = 8;
230 		while (if_index >= if_indexlim)
231 			if_indexlim <<= 1;
232 
233 		/* grow ifnet_addrs */
234 		m = oldlim * sizeof(ifa);
235 		n = if_indexlim * sizeof(ifa);
236 		q = (caddr_t)malloc(n, M_IFADDR, M_WAITOK|M_ZERO);
237 		if (ifnet_addrs) {
238 			bcopy((caddr_t)ifnet_addrs, q, m);
239 			free((caddr_t)ifnet_addrs, M_IFADDR);
240 		}
241 		ifnet_addrs = (struct ifaddr **)q;
242 
243 		/* grow ifindex2ifnet */
244 		m = oldlim * sizeof(struct ifnet *);
245 		n = if_indexlim * sizeof(struct ifnet *);
246 		q = (caddr_t)malloc(n, M_IFADDR, M_WAITOK|M_ZERO);
247 		if (ifindex2ifnet) {
248 			bcopy((caddr_t)ifindex2ifnet, q, m);
249 			free((caddr_t)ifindex2ifnet, M_IFADDR);
250 		}
251 		ifindex2ifnet = (struct ifnet **)q;
252 	}
253 
254 	TAILQ_INIT(&ifp->if_groups);
255 
256 	if_addgroup(ifp, IFG_ALL);
257 
258 	ifindex2ifnet[if_index] = ifp;
259 
260 	if (ifp->if_snd.ifq_maxlen == 0)
261 		ifp->if_snd.ifq_maxlen = ifqmaxlen;
262 #ifdef ALTQ
263 	ifp->if_snd.altq_type = 0;
264 	ifp->if_snd.altq_disc = NULL;
265 	ifp->if_snd.altq_flags &= ALTQF_CANTCHANGE;
266 	ifp->if_snd.altq_tbr  = NULL;
267 	ifp->if_snd.altq_ifp  = ifp;
268 #endif
269 
270 	if (domains)
271 		if_attachdomain1(ifp);
272 #if NPF > 0
273 	pfi_attach_ifnet(ifp);
274 #endif
275 
276 	/* Announce the interface. */
277 	rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
278 }
279 
280 /*
281  * Allocate the link level name for the specified interface.  This
282  * is an attachment helper.  It must be called after ifp->if_addrlen
283  * is initialized, which may not be the case when if_attach() is
284  * called.
285  */
286 void
287 if_alloc_sadl(struct ifnet *ifp)
288 {
289 	unsigned socksize, ifasize;
290 	int namelen, masklen;
291 	struct sockaddr_dl *sdl;
292 	struct ifaddr *ifa;
293 
294 	/*
295 	 * If the interface already has a link name, release it
296 	 * now.  This is useful for interfaces that can change
297 	 * link types, and thus switch link names often.
298 	 */
299 	if (ifp->if_sadl != NULL)
300 		if_free_sadl(ifp);
301 
302 	namelen = strlen(ifp->if_xname);
303 #define _offsetof(t, m) ((int)((caddr_t)&((t *)0)->m))
304 	masklen = _offsetof(struct sockaddr_dl, sdl_data[0]) + namelen;
305 	socksize = masklen + ifp->if_addrlen;
306 #define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1)))
307 	if (socksize < sizeof(*sdl))
308 		socksize = sizeof(*sdl);
309 	socksize = ROUNDUP(socksize);
310 	ifasize = sizeof(*ifa) + 2 * socksize;
311 	ifa = malloc(ifasize, M_IFADDR, M_WAITOK|M_ZERO);
312 	sdl = (struct sockaddr_dl *)(ifa + 1);
313 	sdl->sdl_len = socksize;
314 	sdl->sdl_family = AF_LINK;
315 	bcopy(ifp->if_xname, sdl->sdl_data, namelen);
316 	sdl->sdl_nlen = namelen;
317 	sdl->sdl_alen = ifp->if_addrlen;
318 	sdl->sdl_index = ifp->if_index;
319 	sdl->sdl_type = ifp->if_type;
320 	ifnet_addrs[ifp->if_index] = ifa;
321 	ifa->ifa_ifp = ifp;
322 	ifa->ifa_rtrequest = link_rtrequest;
323 	TAILQ_INSERT_HEAD(&ifp->if_addrlist, ifa, ifa_list);
324 	ifa->ifa_addr = (struct sockaddr *)sdl;
325 	ifp->if_sadl = sdl;
326 	sdl = (struct sockaddr_dl *)(socksize + (caddr_t)sdl);
327 	ifa->ifa_netmask = (struct sockaddr *)sdl;
328 	sdl->sdl_len = masklen;
329 	while (namelen != 0)
330 		sdl->sdl_data[--namelen] = 0xff;
331 }
332 
333 /*
334  * Free the link level name for the specified interface.  This is
335  * a detach helper.  This is called from if_detach() or from
336  * link layer type specific detach functions.
337  */
338 void
339 if_free_sadl(struct ifnet *ifp)
340 {
341 	struct ifaddr *ifa;
342 	int s;
343 
344 	ifa = ifnet_addrs[ifp->if_index];
345 	if (ifa == NULL)
346 		return;
347 
348 	s = splnet();
349 	rtinit(ifa, RTM_DELETE, 0);
350 #if 0
351 	TAILQ_REMOVE(&ifp->if_addrlist, ifa, ifa_list);
352 	ifnet_addrs[ifp->if_index] = NULL;
353 #endif
354 	ifp->if_sadl = NULL;
355 
356 	splx(s);
357 }
358 
359 void
360 if_attachdomain()
361 {
362 	struct ifnet *ifp;
363 	int s;
364 
365 	s = splnet();
366 	for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list))
367 		if_attachdomain1(ifp);
368 	splx(s);
369 }
370 
371 void
372 if_attachdomain1(struct ifnet *ifp)
373 {
374 	struct domain *dp;
375 	int s;
376 
377 	s = splnet();
378 
379 	/* address family dependent data region */
380 	bzero(ifp->if_afdata, sizeof(ifp->if_afdata));
381 	for (dp = domains; dp; dp = dp->dom_next) {
382 		if (dp->dom_ifattach)
383 			ifp->if_afdata[dp->dom_family] =
384 			    (*dp->dom_ifattach)(ifp);
385 	}
386 
387 	splx(s);
388 }
389 
390 void
391 if_attachhead(struct ifnet *ifp)
392 {
393 	if (if_index == 0) {
394 		TAILQ_INIT(&ifnet);
395 		TAILQ_INIT(&ifg_head);
396 	}
397 	TAILQ_INIT(&ifp->if_addrlist);
398 	ifp->if_addrhooks = malloc(sizeof(*ifp->if_addrhooks),
399 	    M_TEMP, M_NOWAIT);
400 	if (ifp->if_addrhooks == NULL)
401 		panic("if_attachhead: malloc");
402 	TAILQ_INIT(ifp->if_addrhooks);
403 	ifp->if_linkstatehooks = malloc(sizeof(*ifp->if_linkstatehooks),
404 	    M_TEMP, M_NOWAIT);
405 	if (ifp->if_linkstatehooks == NULL)
406 		panic("if_attachhead: malloc");
407 	TAILQ_INIT(ifp->if_linkstatehooks);
408 	ifp->if_detachhooks = malloc(sizeof(*ifp->if_detachhooks),
409 	    M_TEMP, M_NOWAIT);
410 	if (ifp->if_detachhooks == NULL)
411 		panic("if_attachhead: malloc");
412 	TAILQ_INIT(ifp->if_detachhooks);
413 	TAILQ_INSERT_HEAD(&ifnet, ifp, if_list);
414 	if_attachsetup(ifp);
415 }
416 
417 void
418 if_attach(struct ifnet *ifp)
419 {
420 #if NCARP > 0
421 	struct ifnet *before = NULL;
422 #endif
423 
424 	if (if_index == 0) {
425 		TAILQ_INIT(&ifnet);
426 		TAILQ_INIT(&ifg_head);
427 	}
428 	TAILQ_INIT(&ifp->if_addrlist);
429 	ifp->if_addrhooks = malloc(sizeof(*ifp->if_addrhooks),
430 	    M_TEMP, M_NOWAIT);
431 	if (ifp->if_addrhooks == NULL)
432 		panic("if_attach: malloc");
433 	TAILQ_INIT(ifp->if_addrhooks);
434 	ifp->if_linkstatehooks = malloc(sizeof(*ifp->if_linkstatehooks),
435 	    M_TEMP, M_NOWAIT);
436 	if (ifp->if_linkstatehooks == NULL)
437 		panic("if_attach: malloc");
438 	TAILQ_INIT(ifp->if_linkstatehooks);
439 	ifp->if_detachhooks = malloc(sizeof(*ifp->if_detachhooks),
440 	    M_TEMP, M_NOWAIT);
441 	if (ifp->if_detachhooks == NULL)
442 		panic("if_attach: malloc");
443 	TAILQ_INIT(ifp->if_detachhooks);
444 
445 #if NCARP > 0
446 	if (ifp->if_type != IFT_CARP)
447 		TAILQ_FOREACH(before, &ifnet, if_list)
448 			if (before->if_type == IFT_CARP)
449 				break;
450 	if (before == NULL)
451 		TAILQ_INSERT_TAIL(&ifnet, ifp, if_list);
452 	else
453 		TAILQ_INSERT_BEFORE(before, ifp, if_list);
454 #else
455 	TAILQ_INSERT_TAIL(&ifnet, ifp, if_list);
456 #endif
457 
458 	if_attachsetup(ifp);
459 }
460 
461 void
462 if_start(struct ifnet *ifp)
463 {
464 	if (IF_QFULL(&ifp->if_snd) && !ISSET(ifp->if_flags, IFF_OACTIVE)) {
465 		if (ISSET(ifp->if_xflags, IFXF_TXREADY)) {
466 			TAILQ_REMOVE(&iftxlist, ifp, if_txlist);
467 			CLR(ifp->if_xflags, IFXF_TXREADY);
468 		}
469 		ifp->if_start(ifp);
470 		return;
471 	}
472 
473 	if (!ISSET(ifp->if_xflags, IFXF_TXREADY)) {
474 		SET(ifp->if_xflags, IFXF_TXREADY);
475 		TAILQ_INSERT_TAIL(&iftxlist, ifp, if_txlist);
476 		schednetisr(NETISR_TX);
477 	}
478 }
479 
480 void
481 nettxintr(void)
482 {
483 	struct ifnet *ifp;
484 	int s;
485 
486 	s = splnet();
487 	while ((ifp = TAILQ_FIRST(&iftxlist)) != NULL) {
488 		TAILQ_REMOVE(&iftxlist, ifp, if_txlist);
489 		CLR(ifp->if_xflags, IFXF_TXREADY);
490 		ifp->if_start(ifp);
491 	}
492 	splx(s);
493 }
494 
495 /*
496  * Detach an interface from everything in the kernel.  Also deallocate
497  * private resources.
498  * XXX So far only the INET protocol family has been looked over
499  * wrt resource usage that needs to be decoupled.
500  */
501 void
502 if_detach(struct ifnet *ifp)
503 {
504 	struct ifaddr *ifa;
505 	struct ifg_list *ifg;
506 	int s = splnet();
507 	struct domain *dp;
508 
509 	ifp->if_flags &= ~IFF_OACTIVE;
510 	ifp->if_start = if_detached_start;
511 	ifp->if_ioctl = if_detached_ioctl;
512 	ifp->if_init = if_detached_init;
513 	ifp->if_watchdog = if_detached_watchdog;
514 
515 	/* Call detach hooks, ie. to remove vlan interfaces */
516 	dohooks(ifp->if_detachhooks, HOOK_REMOVE | HOOK_FREE);
517 
518 #if NTRUNK > 0
519 	if (ifp->if_type == IFT_IEEE8023ADLAG)
520 		trunk_port_ifdetach(ifp);
521 #endif
522 
523 #if NBRIDGE > 0
524 	/* Remove the interface from any bridge it is part of.  */
525 	if (ifp->if_bridge)
526 		bridge_ifdetach(ifp);
527 #endif
528 
529 #if NCARP > 0
530 	/* Remove the interface from any carp group it is a part of.  */
531 	if (ifp->if_carp && ifp->if_type != IFT_CARP)
532 		carp_ifdetach(ifp);
533 #endif
534 
535 #if NBPFILTER > 0
536 	bpfdetach(ifp);
537 #endif
538 #ifdef ALTQ
539 	if (ALTQ_IS_ENABLED(&ifp->if_snd))
540 		altq_disable(&ifp->if_snd);
541 	if (ALTQ_IS_ATTACHED(&ifp->if_snd))
542 		altq_detach(&ifp->if_snd);
543 #endif
544 	rt_if_remove(ifp);
545 #ifdef INET
546 	rti_delete(ifp);
547 #if NETHER > 0
548 	myip_ifp = NULL;
549 #endif
550 #ifdef MROUTING
551 	vif_delete(ifp);
552 #endif
553 #endif
554 #ifdef INET6
555 	in6_ifdetach(ifp);
556 #endif
557 
558 #if NPF > 0
559 	pfi_detach_ifnet(ifp);
560 #endif
561 
562 	/*
563 	 * remove packets came from ifp, from software interrupt queues.
564 	 * net/netisr_dispatch.h is not usable, as some of them use
565 	 * strange queue names.
566 	 */
567 #define IF_DETACH_QUEUES(x) \
568 do { \
569 	extern struct ifqueue x; \
570 	if_detach_queues(ifp, & x); \
571 } while (0)
572 #ifdef INET
573 	IF_DETACH_QUEUES(arpintrq);
574 	IF_DETACH_QUEUES(ipintrq);
575 #endif
576 #ifdef INET6
577 	IF_DETACH_QUEUES(ip6intrq);
578 #endif
579 #ifdef NETATALK
580 	IF_DETACH_QUEUES(atintrq1);
581 	IF_DETACH_QUEUES(atintrq2);
582 #endif
583 #ifdef NATM
584 	IF_DETACH_QUEUES(natmintrq);
585 #endif
586 #undef IF_DETACH_QUEUES
587 
588 	/*
589 	 * XXX transient ifp refs?  inpcb.ip_moptions.imo_multicast_ifp?
590 	 * Other network stacks than INET?
591 	 */
592 
593 	/* Remove the interface from the list of all interfaces.  */
594 	TAILQ_REMOVE(&ifnet, ifp, if_list);
595 	if (ISSET(ifp->if_xflags, IFXF_TXREADY))
596 		TAILQ_REMOVE(&iftxlist, ifp, if_txlist);
597 
598 	/*
599 	 * Deallocate private resources.
600 	 */
601 	while ((ifa = TAILQ_FIRST(&ifp->if_addrlist)) != NULL) {
602 		TAILQ_REMOVE(&ifp->if_addrlist, ifa, ifa_list);
603 #ifdef INET
604 		if (ifa->ifa_addr->sa_family == AF_INET)
605 			TAILQ_REMOVE(&in_ifaddr, (struct in_ifaddr *)ifa,
606 			    ia_list);
607 #endif
608 		/* XXX if_free_sadl needs this */
609 		if (ifa == ifnet_addrs[ifp->if_index])
610 			continue;
611 
612 		ifa->ifa_ifp = NULL;
613 		IFAFREE(ifa);
614 	}
615 
616 	for (ifg = TAILQ_FIRST(&ifp->if_groups); ifg;
617 	    ifg = TAILQ_FIRST(&ifp->if_groups))
618 		if_delgroup(ifp, ifg->ifgl_group->ifg_group);
619 
620 	if_free_sadl(ifp);
621 
622 	ifnet_addrs[ifp->if_index]->ifa_ifp = NULL;
623 	IFAFREE(ifnet_addrs[ifp->if_index]);
624 	ifnet_addrs[ifp->if_index] = NULL;
625 
626 	free(ifp->if_addrhooks, M_TEMP);
627 	free(ifp->if_linkstatehooks, M_TEMP);
628 	free(ifp->if_detachhooks, M_TEMP);
629 
630 	for (dp = domains; dp; dp = dp->dom_next) {
631 		if (dp->dom_ifdetach && ifp->if_afdata[dp->dom_family])
632 			(*dp->dom_ifdetach)(ifp,
633 			    ifp->if_afdata[dp->dom_family]);
634 	}
635 
636 	/* Announce that the interface is gone. */
637 	rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
638 
639 	splx(s);
640 }
641 
642 void
643 if_detach_queues(struct ifnet *ifp, struct ifqueue *q)
644 {
645 	struct mbuf *m, *prev, *next;
646 
647 	prev = NULL;
648 	for (m = q->ifq_head; m; m = next) {
649 		next = m->m_nextpkt;
650 #ifdef DIAGNOSTIC
651 		if ((m->m_flags & M_PKTHDR) == 0) {
652 			prev = m;
653 			continue;
654 		}
655 #endif
656 		if (m->m_pkthdr.rcvif != ifp) {
657 			prev = m;
658 			continue;
659 		}
660 
661 		if (prev)
662 			prev->m_nextpkt = m->m_nextpkt;
663 		else
664 			q->ifq_head = m->m_nextpkt;
665 		if (q->ifq_tail == m)
666 			q->ifq_tail = prev;
667 		q->ifq_len--;
668 
669 		m->m_nextpkt = NULL;
670 		m_freem(m);
671 		IF_DROP(q);
672 	}
673 }
674 
675 /*
676  * Create a clone network interface.
677  */
678 int
679 if_clone_create(const char *name)
680 {
681 	struct if_clone *ifc;
682 	struct ifnet *ifp;
683 	int unit, ret;
684 
685 	ifc = if_clone_lookup(name, &unit);
686 	if (ifc == NULL)
687 		return (EINVAL);
688 
689 	if (ifunit(name) != NULL)
690 		return (EEXIST);
691 
692 	if ((ret = (*ifc->ifc_create)(ifc, unit)) == 0 &&
693 	    (ifp = ifunit(name)) != NULL)
694 		if_addgroup(ifp, ifc->ifc_name);
695 
696 	return (ret);
697 }
698 
699 /*
700  * Destroy a clone network interface.
701  */
702 int
703 if_clone_destroy(const char *name)
704 {
705 	struct if_clone *ifc;
706 	struct ifnet *ifp;
707 	int s, ret;
708 
709 	ifc = if_clone_lookup(name, NULL);
710 	if (ifc == NULL)
711 		return (EINVAL);
712 
713 	ifp = ifunit(name);
714 	if (ifp == NULL)
715 		return (ENXIO);
716 
717 	if (ifc->ifc_destroy == NULL)
718 		return (EOPNOTSUPP);
719 
720 	if (ifp->if_flags & IFF_UP) {
721 		s = splnet();
722 		if_down(ifp);
723 		splx(s);
724 	}
725 
726 	if_delgroup(ifp, ifc->ifc_name);
727 
728 	if ((ret = (*ifc->ifc_destroy)(ifp)) != 0)
729 		if_addgroup(ifp, ifc->ifc_name);
730 
731 	return (ret);
732 }
733 
734 /*
735  * Look up a network interface cloner.
736  */
737 struct if_clone *
738 if_clone_lookup(const char *name, int *unitp)
739 {
740 	struct if_clone *ifc;
741 	const char *cp;
742 	int unit;
743 
744 	/* separate interface name from unit */
745 	for (cp = name;
746 	    cp - name < IFNAMSIZ && *cp && (*cp < '0' || *cp > '9');
747 	    cp++)
748 		continue;
749 
750 	if (cp == name || cp - name == IFNAMSIZ || !*cp)
751 		return (NULL);	/* No name or unit number */
752 
753 	if (cp - name < IFNAMSIZ-1 && *cp == '0' && cp[1] != '\0')
754 		return (NULL);	/* unit number 0 padded */
755 
756 	LIST_FOREACH(ifc, &if_cloners, ifc_list) {
757 		if (strlen(ifc->ifc_name) == cp - name &&
758 		    !strncmp(name, ifc->ifc_name, cp - name))
759 			break;
760 	}
761 
762 	if (ifc == NULL)
763 		return (NULL);
764 
765 	unit = 0;
766 	while (cp - name < IFNAMSIZ && *cp) {
767 		if (*cp < '0' || *cp > '9' ||
768 		    unit > (INT_MAX - (*cp - '0')) / 10) {
769 			/* Bogus unit number. */
770 			return (NULL);
771 		}
772 		unit = (unit * 10) + (*cp++ - '0');
773 	}
774 
775 	if (unitp != NULL)
776 		*unitp = unit;
777 	return (ifc);
778 }
779 
780 /*
781  * Register a network interface cloner.
782  */
783 void
784 if_clone_attach(struct if_clone *ifc)
785 {
786 	LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);
787 	if_cloners_count++;
788 }
789 
790 /*
791  * Unregister a network interface cloner.
792  */
793 void
794 if_clone_detach(struct if_clone *ifc)
795 {
796 
797 	LIST_REMOVE(ifc, ifc_list);
798 	if_cloners_count--;
799 }
800 
801 /*
802  * Provide list of interface cloners to userspace.
803  */
804 int
805 if_clone_list(struct if_clonereq *ifcr)
806 {
807 	char outbuf[IFNAMSIZ], *dst;
808 	struct if_clone *ifc;
809 	int count, error = 0;
810 
811 	ifcr->ifcr_total = if_cloners_count;
812 	if ((dst = ifcr->ifcr_buffer) == NULL) {
813 		/* Just asking how many there are. */
814 		return (0);
815 	}
816 
817 	if (ifcr->ifcr_count < 0)
818 		return (EINVAL);
819 
820 	count = (if_cloners_count < ifcr->ifcr_count) ?
821 	    if_cloners_count : ifcr->ifcr_count;
822 
823 	for (ifc = LIST_FIRST(&if_cloners); ifc != NULL && count != 0;
824 	    ifc = LIST_NEXT(ifc, ifc_list), count--, dst += IFNAMSIZ) {
825 		bzero(outbuf, sizeof outbuf);
826 		strlcpy(outbuf, ifc->ifc_name, IFNAMSIZ);
827 		error = copyout(outbuf, dst, IFNAMSIZ);
828 		if (error)
829 			break;
830 	}
831 
832 	return (error);
833 }
834 
835 /*
836  * set queue congestion marker and register timeout to clear it
837  */
838 void
839 if_congestion(struct ifqueue *ifq)
840 {
841 	/* Not currently needed, all callers check this */
842 	if (ifq->ifq_congestion)
843 		return;
844 
845 	ifq->ifq_congestion = malloc(sizeof(struct timeout), M_TEMP, M_NOWAIT);
846 	if (ifq->ifq_congestion == NULL)
847 		return;
848 	timeout_set(ifq->ifq_congestion, if_congestion_clear, ifq);
849 	timeout_add(ifq->ifq_congestion, hz / 100);
850 }
851 
852 /*
853  * clear the congestion flag
854  */
855 void
856 if_congestion_clear(void *arg)
857 {
858 	struct ifqueue *ifq = arg;
859 	struct timeout *to = ifq->ifq_congestion;
860 
861 	ifq->ifq_congestion = NULL;
862 	free(to, M_TEMP);
863 }
864 
865 /*
866  * Locate an interface based on a complete address.
867  */
868 /*ARGSUSED*/
869 struct ifaddr *
870 ifa_ifwithaddr(struct sockaddr *addr)
871 {
872 	struct ifnet *ifp;
873 	struct ifaddr *ifa;
874 
875 #define	equal(a1, a2)	\
876 	(bcmp((caddr_t)(a1), (caddr_t)(a2),	\
877 	((struct sockaddr *)(a1))->sa_len) == 0)
878 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
879 	    TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
880 		if (ifa->ifa_addr->sa_family != addr->sa_family)
881 			continue;
882 		if (equal(addr, ifa->ifa_addr))
883 			return (ifa);
884 		if ((ifp->if_flags & IFF_BROADCAST) && ifa->ifa_broadaddr &&
885 		    /* IP6 doesn't have broadcast */
886 		    ifa->ifa_broadaddr->sa_len != 0 &&
887 		    equal(ifa->ifa_broadaddr, addr))
888 			return (ifa);
889 	    }
890 	}
891 	return (NULL);
892 }
893 /*
894  * Locate the point to point interface with a given destination address.
895  */
896 /*ARGSUSED*/
897 struct ifaddr *
898 ifa_ifwithdstaddr(struct sockaddr *addr)
899 {
900 	struct ifnet *ifp;
901 	struct ifaddr *ifa;
902 
903 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
904 	    if (ifp->if_flags & IFF_POINTOPOINT)
905 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
906 			if (ifa->ifa_addr->sa_family != addr->sa_family ||
907 			    ifa->ifa_dstaddr == NULL)
908 				continue;
909 			if (equal(addr, ifa->ifa_dstaddr))
910 				return (ifa);
911 		}
912 	}
913 	return (NULL);
914 }
915 
916 /*
917  * Find an interface on a specific network.  If many, choice
918  * is most specific found.
919  */
920 struct ifaddr *
921 ifa_ifwithnet(struct sockaddr *addr)
922 {
923 	struct ifnet *ifp;
924 	struct ifaddr *ifa;
925 	struct ifaddr *ifa_maybe = 0;
926 	u_int af = addr->sa_family;
927 	char *addr_data = addr->sa_data, *cplim;
928 
929 	if (af == AF_LINK) {
930 		struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr;
931 		if (sdl->sdl_index && sdl->sdl_index < if_indexlim &&
932 		    ifindex2ifnet[sdl->sdl_index])
933 			return (ifnet_addrs[sdl->sdl_index]);
934 	}
935 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
936 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
937 			char *cp, *cp2, *cp3;
938 
939 			if (ifa->ifa_addr->sa_family != af ||
940 			    ifa->ifa_netmask == 0)
941 				next: continue;
942 			cp = addr_data;
943 			cp2 = ifa->ifa_addr->sa_data;
944 			cp3 = ifa->ifa_netmask->sa_data;
945 			cplim = (char *)ifa->ifa_netmask +
946 				ifa->ifa_netmask->sa_len;
947 			while (cp3 < cplim)
948 				if ((*cp++ ^ *cp2++) & *cp3++)
949 				    /* want to continue for() loop */
950 					goto next;
951 			if (ifa_maybe == 0 ||
952 			    rn_refines((caddr_t)ifa->ifa_netmask,
953 			    (caddr_t)ifa_maybe->ifa_netmask))
954 				ifa_maybe = ifa;
955 		}
956 	}
957 	return (ifa_maybe);
958 }
959 
960 /*
961  * Find an interface using a specific address family
962  */
963 struct ifaddr *
964 ifa_ifwithaf(int af)
965 {
966 	struct ifnet *ifp;
967 	struct ifaddr *ifa;
968 
969 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
970 		TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
971 			if (ifa->ifa_addr->sa_family == af)
972 				return (ifa);
973 		}
974 	}
975 	return (NULL);
976 }
977 
978 /*
979  * Find an interface address specific to an interface best matching
980  * a given address.
981  */
982 struct ifaddr *
983 ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
984 {
985 	struct ifaddr *ifa;
986 	char *cp, *cp2, *cp3;
987 	char *cplim;
988 	struct ifaddr *ifa_maybe = NULL;
989 	u_int af = addr->sa_family;
990 
991 	if (af >= AF_MAX)
992 		return (NULL);
993 	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
994 		if (ifa->ifa_addr->sa_family != af)
995 			continue;
996 		if (ifa_maybe == NULL)
997 			ifa_maybe = ifa;
998 		if (ifa->ifa_netmask == 0 || ifp->if_flags & IFF_POINTOPOINT) {
999 			if (equal(addr, ifa->ifa_addr) ||
1000 			    (ifa->ifa_dstaddr && equal(addr, ifa->ifa_dstaddr)))
1001 				return (ifa);
1002 			continue;
1003 		}
1004 		cp = addr->sa_data;
1005 		cp2 = ifa->ifa_addr->sa_data;
1006 		cp3 = ifa->ifa_netmask->sa_data;
1007 		cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask;
1008 		for (; cp3 < cplim; cp3++)
1009 			if ((*cp++ ^ *cp2++) & *cp3)
1010 				break;
1011 		if (cp3 == cplim)
1012 			return (ifa);
1013 	}
1014 	return (ifa_maybe);
1015 }
1016 
1017 /*
1018  * Default action when installing a route with a Link Level gateway.
1019  * Lookup an appropriate real ifa to point to.
1020  * This should be moved to /sys/net/link.c eventually.
1021  */
1022 void
1023 link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
1024 {
1025 	struct ifaddr *ifa;
1026 	struct sockaddr *dst;
1027 	struct ifnet *ifp;
1028 
1029 	if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) ||
1030 	    ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
1031 		return;
1032 	if ((ifa = ifaof_ifpforaddr(dst, ifp)) != NULL) {
1033 		ifa->ifa_refcnt++;
1034 		IFAFREE(rt->rt_ifa);
1035 		rt->rt_ifa = ifa;
1036 		if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
1037 			ifa->ifa_rtrequest(cmd, rt, info);
1038 	}
1039 }
1040 
1041 /*
1042  * Mark an interface down and notify protocols of
1043  * the transition.
1044  * NOTE: must be called at splsoftnet or equivalent.
1045  */
1046 void
1047 if_down(struct ifnet *ifp)
1048 {
1049 	struct ifaddr *ifa;
1050 
1051 	splassert(IPL_SOFTNET);
1052 
1053 	ifp->if_flags &= ~IFF_UP;
1054 	microtime(&ifp->if_lastchange);
1055 	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1056 		pfctlinput(PRC_IFDOWN, ifa->ifa_addr);
1057 	}
1058 	IFQ_PURGE(&ifp->if_snd);
1059 #if NCARP > 0
1060 	if (ifp->if_carp)
1061 		carp_carpdev_state(ifp);
1062 #endif
1063 #if NBRIDGE > 0
1064 	if (ifp->if_bridge)
1065 		bstp_ifstate(ifp);
1066 #endif
1067 	rt_ifmsg(ifp);
1068 }
1069 
1070 /*
1071  * Mark an interface up and notify protocols of
1072  * the transition.
1073  * NOTE: must be called at splsoftnet or equivalent.
1074  */
1075 void
1076 if_up(struct ifnet *ifp)
1077 {
1078 #ifdef notyet
1079 	struct ifaddr *ifa;
1080 #endif
1081 
1082 	splassert(IPL_SOFTNET);
1083 
1084 	ifp->if_flags |= IFF_UP;
1085 	microtime(&ifp->if_lastchange);
1086 #ifdef notyet
1087 	/* this has no effect on IP, and will kill all ISO connections XXX */
1088 	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1089 		pfctlinput(PRC_IFUP, ifa->ifa_addr);
1090 	}
1091 #endif
1092 #if NCARP > 0
1093 	if (ifp->if_carp)
1094 		carp_carpdev_state(ifp);
1095 #endif
1096 #if NBRIDGE > 0
1097 	if (ifp->if_bridge)
1098 		bstp_ifstate(ifp);
1099 #endif
1100 	rt_ifmsg(ifp);
1101 #ifdef INET6
1102 	in6_if_up(ifp);
1103 #endif
1104 }
1105 
1106 /*
1107  * Process a link state change.
1108  * NOTE: must be called at splsoftnet or equivalent.
1109  */
1110 void
1111 if_link_state_change(struct ifnet *ifp)
1112 {
1113 	rt_ifmsg(ifp);
1114 	dohooks(ifp->if_linkstatehooks, 0);
1115 }
1116 
1117 /*
1118  * Flush an interface queue.
1119  */
1120 void
1121 if_qflush(struct ifqueue *ifq)
1122 {
1123 	struct mbuf *m, *n;
1124 
1125 	n = ifq->ifq_head;
1126 	while ((m = n) != NULL) {
1127 		n = m->m_act;
1128 		m_freem(m);
1129 	}
1130 	ifq->ifq_head = 0;
1131 	ifq->ifq_tail = 0;
1132 	ifq->ifq_len = 0;
1133 }
1134 
1135 /*
1136  * Handle interface watchdog timer routines.  Called
1137  * from softclock, we decrement timers (if set) and
1138  * call the appropriate interface routine on expiration.
1139  */
1140 void
1141 if_slowtimo(void *arg)
1142 {
1143 	struct timeout *to = (struct timeout *)arg;
1144 	struct ifnet *ifp;
1145 	int s = splnet();
1146 
1147 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
1148 		if (ifp->if_timer == 0 || --ifp->if_timer)
1149 			continue;
1150 		if (ifp->if_watchdog)
1151 			(*ifp->if_watchdog)(ifp);
1152 	}
1153 	splx(s);
1154 	timeout_add(to, hz / IFNET_SLOWHZ);
1155 }
1156 
1157 /*
1158  * Map interface name to
1159  * interface structure pointer.
1160  */
1161 struct ifnet *
1162 ifunit(const char *name)
1163 {
1164 	struct ifnet *ifp;
1165 
1166 	TAILQ_FOREACH(ifp, &ifnet, if_list) {
1167 		if (strcmp(ifp->if_xname, name) == 0)
1168 			return (ifp);
1169 	}
1170 	return (NULL);
1171 }
1172 
1173 /*
1174  * Interface ioctls.
1175  */
1176 int
1177 ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
1178 {
1179 	struct ifnet *ifp;
1180 	struct ifreq *ifr;
1181 	struct ifaddr *ifa;
1182 	struct sockaddr_dl *sdl;
1183 	struct ifgroupreq *ifgr;
1184 	char ifdescrbuf[IFDESCRSIZE];
1185 	char ifrtlabelbuf[RTLABEL_LEN];
1186 	int error = 0;
1187 	size_t bytesdone;
1188 	short oif_flags;
1189 	const char *label;
1190 
1191 	switch (cmd) {
1192 
1193 	case SIOCGIFCONF:
1194 	case OSIOCGIFCONF:
1195 		return (ifconf(cmd, data));
1196 	}
1197 	ifr = (struct ifreq *)data;
1198 
1199 	switch (cmd) {
1200 	case SIOCIFCREATE:
1201 	case SIOCIFDESTROY:
1202 		if ((error = suser(p, 0)) != 0)
1203 			return (error);
1204 		return ((cmd == SIOCIFCREATE) ?
1205 		    if_clone_create(ifr->ifr_name) :
1206 		    if_clone_destroy(ifr->ifr_name));
1207 	case SIOCIFGCLONERS:
1208 		return (if_clone_list((struct if_clonereq *)data));
1209 	case SIOCGIFGMEMB:
1210 		return (if_getgroupmembers(data));
1211 	case SIOCGIFGATTR:
1212 		return (if_getgroupattribs(data));
1213 	case SIOCSIFGATTR:
1214 		if ((error = suser(p, 0)) != 0)
1215 			return (error);
1216 		return (if_setgroupattribs(data));
1217 	}
1218 
1219 	ifp = ifunit(ifr->ifr_name);
1220 	if (ifp == 0)
1221 		return (ENXIO);
1222 	oif_flags = ifp->if_flags;
1223 	switch (cmd) {
1224 
1225 	case SIOCGIFFLAGS:
1226 		ifr->ifr_flags = ifp->if_flags;
1227 		break;
1228 
1229 	case SIOCGIFMETRIC:
1230 		ifr->ifr_metric = ifp->if_metric;
1231 		break;
1232 
1233 	case SIOCGIFMTU:
1234 		ifr->ifr_mtu = ifp->if_mtu;
1235 		break;
1236 
1237 	case SIOCGIFDATA:
1238 		error = copyout((caddr_t)&ifp->if_data, ifr->ifr_data,
1239 		    sizeof(ifp->if_data));
1240 		break;
1241 
1242 	case SIOCSIFFLAGS:
1243 		if ((error = suser(p, 0)) != 0)
1244 			return (error);
1245 		if (ifp->if_flags & IFF_UP && (ifr->ifr_flags & IFF_UP) == 0) {
1246 			int s = splnet();
1247 			if_down(ifp);
1248 			splx(s);
1249 		}
1250 		if (ifr->ifr_flags & IFF_UP && (ifp->if_flags & IFF_UP) == 0) {
1251 			int s = splnet();
1252 			if_up(ifp);
1253 			splx(s);
1254 		}
1255 		ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
1256 			(ifr->ifr_flags &~ IFF_CANTCHANGE);
1257 		if (ifp->if_ioctl)
1258 			(void) (*ifp->if_ioctl)(ifp, cmd, data);
1259 		break;
1260 
1261 	case SIOCSIFMETRIC:
1262 		if ((error = suser(p, 0)) != 0)
1263 			return (error);
1264 		ifp->if_metric = ifr->ifr_metric;
1265 		break;
1266 
1267 	case SIOCSIFMTU:
1268 	{
1269 #ifdef INET6
1270 		int oldmtu = ifp->if_mtu;
1271 #endif
1272 
1273 		if ((error = suser(p, 0)) != 0)
1274 			return (error);
1275 		if (ifp->if_ioctl == NULL)
1276 			return (EOPNOTSUPP);
1277 		error = (*ifp->if_ioctl)(ifp, cmd, data);
1278 
1279 		/*
1280 		 * If the link MTU changed, do network layer specific procedure.
1281 		 */
1282 #ifdef INET6
1283 		if (ifp->if_mtu != oldmtu)
1284 			nd6_setmtu(ifp);
1285 #endif
1286 		break;
1287 	}
1288 
1289 	case SIOCSIFPHYADDR:
1290 	case SIOCDIFPHYADDR:
1291 #ifdef INET6
1292 	case SIOCSIFPHYADDR_IN6:
1293 #endif
1294 	case SIOCSLIFPHYADDR:
1295 	case SIOCADDMULTI:
1296 	case SIOCDELMULTI:
1297 	case SIOCSIFMEDIA:
1298 		if ((error = suser(p, 0)) != 0)
1299 			return (error);
1300 		/* FALLTHROUGH */
1301 	case SIOCGIFPSRCADDR:
1302 	case SIOCGIFPDSTADDR:
1303 	case SIOCGLIFPHYADDR:
1304 	case SIOCGIFMEDIA:
1305 		if (ifp->if_ioctl == 0)
1306 			return (EOPNOTSUPP);
1307 		error = (*ifp->if_ioctl)(ifp, cmd, data);
1308 		break;
1309 
1310 	case SIOCGIFDESCR:
1311 		strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
1312 		error = copyoutstr(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE,
1313 		    &bytesdone);
1314 		break;
1315 
1316 	case SIOCSIFDESCR:
1317 		if ((error = suser(p, 0)) != 0)
1318 			return (error);
1319 		error = copyinstr(ifr->ifr_data, ifdescrbuf,
1320 		    IFDESCRSIZE, &bytesdone);
1321 		if (error == 0) {
1322 			(void)memset(ifp->if_description, 0, IFDESCRSIZE);
1323 			strlcpy(ifp->if_description, ifdescrbuf, IFDESCRSIZE);
1324 		}
1325 		break;
1326 
1327 	case SIOCGIFRTLABEL:
1328 		if (ifp->if_rtlabelid &&
1329 		    (label = rtlabel_id2name(ifp->if_rtlabelid)) != NULL) {
1330 			strlcpy(ifrtlabelbuf, label, RTLABEL_LEN);
1331 			error = copyoutstr(ifrtlabelbuf, ifr->ifr_data,
1332 			    RTLABEL_LEN, &bytesdone);
1333 		} else
1334 			error = ENOENT;
1335 		break;
1336 
1337 	case SIOCSIFRTLABEL:
1338 		if ((error = suser(p, 0)) != 0)
1339 			return (error);
1340 		error = copyinstr(ifr->ifr_data, ifrtlabelbuf,
1341 		    RTLABEL_LEN, &bytesdone);
1342 		if (error == 0) {
1343 			rtlabel_unref(ifp->if_rtlabelid);
1344 			ifp->if_rtlabelid = rtlabel_name2id(ifrtlabelbuf);
1345 		}
1346 		break;
1347 
1348 	case SIOCAIFGROUP:
1349 		if ((error = suser(p, 0)))
1350 			return (error);
1351 		(*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
1352 		ifgr = (struct ifgroupreq *)data;
1353 		if ((error = if_addgroup(ifp, ifgr->ifgr_group)))
1354 			return (error);
1355 		break;
1356 
1357 	case SIOCGIFGROUP:
1358 		if ((error = if_getgroup(data, ifp)))
1359 			return (error);
1360 		break;
1361 
1362 	case SIOCDIFGROUP:
1363 		if ((error = suser(p, 0)))
1364 			return (error);
1365 		(*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
1366 		ifgr = (struct ifgroupreq *)data;
1367 		if ((error = if_delgroup(ifp, ifgr->ifgr_group)))
1368 			return (error);
1369 		break;
1370 
1371 	case SIOCSIFLLADDR:
1372 		if ((error = suser(p, 0)))
1373 			return (error);
1374 		ifa = ifnet_addrs[ifp->if_index];
1375 		if (ifa == NULL)
1376 			return (EINVAL);
1377 		sdl = (struct sockaddr_dl *)ifa->ifa_addr;
1378 		if (sdl == NULL)
1379 			return (EINVAL);
1380 		if (ifr->ifr_addr.sa_len != ETHER_ADDR_LEN)
1381 			return (EINVAL);
1382 		if (ETHER_IS_MULTICAST(ifr->ifr_addr.sa_data))
1383 			return (EINVAL);
1384 		switch (ifp->if_type) {
1385 		case IFT_ETHER:
1386 		case IFT_CARP:
1387 		case IFT_FDDI:
1388 		case IFT_XETHER:
1389 		case IFT_ISO88025:
1390 		case IFT_L2VLAN:
1391 			bcopy((caddr_t)ifr->ifr_addr.sa_data,
1392 			    (caddr_t)((struct arpcom *)ifp)->ac_enaddr,
1393 			    ETHER_ADDR_LEN);
1394 			bcopy((caddr_t)ifr->ifr_addr.sa_data,
1395 			    LLADDR(sdl), ETHER_ADDR_LEN);
1396 			break;
1397 		default:
1398 			return (ENODEV);
1399 		}
1400 		if (ifp->if_flags & IFF_UP) {
1401 			struct ifreq ifrq;
1402 			int s = splnet();
1403 			ifp->if_flags &= ~IFF_UP;
1404 			ifrq.ifr_flags = ifp->if_flags;
1405 			(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
1406 			ifp->if_flags |= IFF_UP;
1407 			ifrq.ifr_flags = ifp->if_flags;
1408 			(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
1409 			splx(s);
1410 			TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1411 				if (ifa->ifa_addr != NULL &&
1412 				    ifa->ifa_addr->sa_family == AF_INET)
1413 					arp_ifinit((struct arpcom *)ifp, ifa);
1414 			}
1415 		}
1416 		break;
1417 
1418 	default:
1419 		if (so->so_proto == 0)
1420 			return (EOPNOTSUPP);
1421 #if !defined(COMPAT_43) && !defined(COMPAT_LINUX) && !defined(COMPAT_SVR4)
1422 		error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
1423 			(struct mbuf *) cmd, (struct mbuf *) data,
1424 			(struct mbuf *) ifp, p));
1425 #else
1426 	    {
1427 		u_long ocmd = cmd;
1428 
1429 		switch (cmd) {
1430 
1431 		case SIOCSIFADDR:
1432 		case SIOCSIFDSTADDR:
1433 		case SIOCSIFBRDADDR:
1434 		case SIOCSIFNETMASK:
1435 #if BYTE_ORDER != BIG_ENDIAN
1436 			if (ifr->ifr_addr.sa_family == 0 &&
1437 			    ifr->ifr_addr.sa_len < 16) {
1438 				ifr->ifr_addr.sa_family = ifr->ifr_addr.sa_len;
1439 				ifr->ifr_addr.sa_len = 16;
1440 			}
1441 #else
1442 			if (ifr->ifr_addr.sa_len == 0)
1443 				ifr->ifr_addr.sa_len = 16;
1444 #endif
1445 			break;
1446 
1447 		case OSIOCGIFADDR:
1448 			cmd = SIOCGIFADDR;
1449 			break;
1450 
1451 		case OSIOCGIFDSTADDR:
1452 			cmd = SIOCGIFDSTADDR;
1453 			break;
1454 
1455 		case OSIOCGIFBRDADDR:
1456 			cmd = SIOCGIFBRDADDR;
1457 			break;
1458 
1459 		case OSIOCGIFNETMASK:
1460 			cmd = SIOCGIFNETMASK;
1461 		}
1462 		error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
1463 		    (struct mbuf *) cmd, (struct mbuf *) data,
1464 		    (struct mbuf *) ifp, p));
1465 		switch (ocmd) {
1466 
1467 		case OSIOCGIFADDR:
1468 		case OSIOCGIFDSTADDR:
1469 		case OSIOCGIFBRDADDR:
1470 		case OSIOCGIFNETMASK:
1471 			*(u_int16_t *)&ifr->ifr_addr = ifr->ifr_addr.sa_family;
1472 		}
1473 
1474 	    }
1475 #endif
1476 		break;
1477 	}
1478 
1479 	if (((oif_flags ^ ifp->if_flags) & IFF_UP) != 0) {
1480 		microtime(&ifp->if_lastchange);
1481 #ifdef INET6
1482 		if ((ifp->if_flags & IFF_UP) != 0) {
1483 			int s = splnet();
1484 			in6_if_up(ifp);
1485 			splx(s);
1486 		}
1487 #endif
1488 	}
1489 	return (error);
1490 }
1491 
1492 /*
1493  * Return interface configuration
1494  * of system.  List may be used
1495  * in later ioctl's (above) to get
1496  * other information.
1497  */
1498 /*ARGSUSED*/
1499 int
1500 ifconf(u_long cmd, caddr_t data)
1501 {
1502 	struct ifconf *ifc = (struct ifconf *)data;
1503 	struct ifnet *ifp;
1504 	struct ifaddr *ifa;
1505 	struct ifreq ifr, *ifrp;
1506 	int space = ifc->ifc_len, error = 0;
1507 
1508 	/* If ifc->ifc_len is 0, fill it in with the needed size and return. */
1509 	if (space == 0) {
1510 		TAILQ_FOREACH(ifp, &ifnet, if_list) {
1511 			struct sockaddr *sa;
1512 
1513 			if (TAILQ_EMPTY(&ifp->if_addrlist))
1514 				space += sizeof (ifr);
1515 			else
1516 				TAILQ_FOREACH(ifa,
1517 				    &ifp->if_addrlist, ifa_list) {
1518 					sa = ifa->ifa_addr;
1519 #if defined(COMPAT_43) || defined(COMPAT_LINUX) || defined(COMPAT_SVR4)
1520 					if (cmd != OSIOCGIFCONF)
1521 #endif
1522 					if (sa->sa_len > sizeof(*sa))
1523 						space += sa->sa_len -
1524 						    sizeof(*sa);
1525 					space += sizeof(ifr);
1526 				}
1527 		}
1528 		ifc->ifc_len = space;
1529 		return (0);
1530 	}
1531 
1532 	ifrp = ifc->ifc_req;
1533 	for (ifp = TAILQ_FIRST(&ifnet); space >= sizeof(ifr) &&
1534 	    ifp != TAILQ_END(&ifnet); ifp = TAILQ_NEXT(ifp, if_list)) {
1535 		bcopy(ifp->if_xname, ifr.ifr_name, IFNAMSIZ);
1536 		if (TAILQ_EMPTY(&ifp->if_addrlist)) {
1537 			bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
1538 			error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
1539 			    sizeof(ifr));
1540 			if (error)
1541 				break;
1542 			space -= sizeof (ifr), ifrp++;
1543 		} else
1544 			for (ifa = TAILQ_FIRST(&ifp->if_addrlist);
1545 			    space >= sizeof (ifr) &&
1546 			    ifa != TAILQ_END(&ifp->if_addrlist);
1547 			    ifa = TAILQ_NEXT(ifa, ifa_list)) {
1548 				struct sockaddr *sa = ifa->ifa_addr;
1549 #if defined(COMPAT_43) || defined(COMPAT_LINUX) || defined(COMPAT_SVR4)
1550 				if (cmd == OSIOCGIFCONF) {
1551 					struct osockaddr *osa =
1552 					    (struct osockaddr *)&ifr.ifr_addr;
1553 					ifr.ifr_addr = *sa;
1554 					osa->sa_family = sa->sa_family;
1555 					error = copyout((caddr_t)&ifr,
1556 					    (caddr_t)ifrp, sizeof (ifr));
1557 					ifrp++;
1558 				} else
1559 #endif
1560 				if (sa->sa_len <= sizeof(*sa)) {
1561 					ifr.ifr_addr = *sa;
1562 					error = copyout((caddr_t)&ifr,
1563 					    (caddr_t)ifrp, sizeof (ifr));
1564 					ifrp++;
1565 				} else {
1566 					space -= sa->sa_len - sizeof(*sa);
1567 					if (space < sizeof (ifr))
1568 						break;
1569 					error = copyout((caddr_t)&ifr,
1570 					    (caddr_t)ifrp,
1571 					    sizeof(ifr.ifr_name));
1572 					if (error == 0)
1573 						error = copyout((caddr_t)sa,
1574 						    (caddr_t)&ifrp->ifr_addr,
1575 						    sa->sa_len);
1576 					ifrp = (struct ifreq *)(sa->sa_len +
1577 					    (caddr_t)&ifrp->ifr_addr);
1578 				}
1579 				if (error)
1580 					break;
1581 				space -= sizeof (ifr);
1582 			}
1583 	}
1584 	ifc->ifc_len -= space;
1585 	return (error);
1586 }
1587 
1588 /*
1589  * Dummy functions replaced in ifnet during detach (if protocols decide to
1590  * fiddle with the if during detach.
1591  */
1592 void
1593 if_detached_start(struct ifnet *ifp)
1594 {
1595 	struct mbuf *m;
1596 
1597 	while (1) {
1598 		IF_DEQUEUE(&ifp->if_snd, m);
1599 
1600 		if (m == NULL)
1601 			return;
1602 		m_freem(m);
1603 	}
1604 }
1605 
1606 int
1607 if_detached_ioctl(struct ifnet *ifp, u_long a, caddr_t b)
1608 {
1609 	return ENODEV;
1610 }
1611 
1612 int
1613 if_detached_init(struct ifnet *ifp)
1614 {
1615 	return (ENXIO);
1616 }
1617 
1618 void
1619 if_detached_watchdog(struct ifnet *ifp)
1620 {
1621 	/* nothing */
1622 }
1623 
1624 /*
1625  * Create interface group without members
1626  */
1627 struct ifg_group *
1628 if_creategroup(const char *groupname)
1629 {
1630 	struct ifg_group	*ifg;
1631 
1632 	if ((ifg = malloc(sizeof(*ifg), M_TEMP, M_NOWAIT)) == NULL)
1633 		return (NULL);
1634 
1635 	strlcpy(ifg->ifg_group, groupname, sizeof(ifg->ifg_group));
1636 	ifg->ifg_refcnt = 0;
1637 	ifg->ifg_carp_demoted = 0;
1638 	TAILQ_INIT(&ifg->ifg_members);
1639 #if NPF > 0
1640 	pfi_attach_ifgroup(ifg);
1641 #endif
1642 	TAILQ_INSERT_TAIL(&ifg_head, ifg, ifg_next);
1643 
1644 	return (ifg);
1645 }
1646 
1647 /*
1648  * Add a group to an interface
1649  */
1650 int
1651 if_addgroup(struct ifnet *ifp, const char *groupname)
1652 {
1653 	struct ifg_list		*ifgl;
1654 	struct ifg_group	*ifg = NULL;
1655 	struct ifg_member	*ifgm;
1656 
1657 	if (groupname[0] && groupname[strlen(groupname) - 1] >= '0' &&
1658 	    groupname[strlen(groupname) - 1] <= '9')
1659 		return (EINVAL);
1660 
1661 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1662 		if (!strcmp(ifgl->ifgl_group->ifg_group, groupname))
1663 			return (EEXIST);
1664 
1665 	if ((ifgl = malloc(sizeof(*ifgl), M_TEMP, M_NOWAIT)) == NULL)
1666 		return (ENOMEM);
1667 
1668 	if ((ifgm = malloc(sizeof(*ifgm), M_TEMP, M_NOWAIT)) == NULL) {
1669 		free(ifgl, M_TEMP);
1670 		return (ENOMEM);
1671 	}
1672 
1673 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
1674 		if (!strcmp(ifg->ifg_group, groupname))
1675 			break;
1676 
1677 	if (ifg == NULL && (ifg = if_creategroup(groupname)) == NULL) {
1678 		free(ifgl, M_TEMP);
1679 		free(ifgm, M_TEMP);
1680 		return (ENOMEM);
1681 	}
1682 
1683 	ifg->ifg_refcnt++;
1684 	ifgl->ifgl_group = ifg;
1685 	ifgm->ifgm_ifp = ifp;
1686 
1687 	TAILQ_INSERT_TAIL(&ifg->ifg_members, ifgm, ifgm_next);
1688 	TAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
1689 
1690 #if NPF > 0
1691 	pfi_group_change(groupname);
1692 #endif
1693 
1694 	return (0);
1695 }
1696 
1697 /*
1698  * Remove a group from an interface
1699  */
1700 int
1701 if_delgroup(struct ifnet *ifp, const char *groupname)
1702 {
1703 	struct ifg_list		*ifgl;
1704 	struct ifg_member	*ifgm;
1705 
1706 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1707 		if (!strcmp(ifgl->ifgl_group->ifg_group, groupname))
1708 			break;
1709 	if (ifgl == NULL)
1710 		return (ENOENT);
1711 
1712 	TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
1713 
1714 	TAILQ_FOREACH(ifgm, &ifgl->ifgl_group->ifg_members, ifgm_next)
1715 		if (ifgm->ifgm_ifp == ifp)
1716 			break;
1717 
1718 	if (ifgm != NULL) {
1719 		TAILQ_REMOVE(&ifgl->ifgl_group->ifg_members, ifgm, ifgm_next);
1720 		free(ifgm, M_TEMP);
1721 	}
1722 
1723 	if (--ifgl->ifgl_group->ifg_refcnt == 0) {
1724 		TAILQ_REMOVE(&ifg_head, ifgl->ifgl_group, ifg_next);
1725 #if NPF > 0
1726 		pfi_detach_ifgroup(ifgl->ifgl_group);
1727 #endif
1728 		free(ifgl->ifgl_group, M_TEMP);
1729 	}
1730 
1731 	free(ifgl, M_TEMP);
1732 
1733 #if NPF > 0
1734 	pfi_group_change(groupname);
1735 #endif
1736 
1737 	return (0);
1738 }
1739 
1740 /*
1741  * Stores all groups from an interface in memory pointed
1742  * to by data
1743  */
1744 int
1745 if_getgroup(caddr_t data, struct ifnet *ifp)
1746 {
1747 	int			 len, error;
1748 	struct ifg_list		*ifgl;
1749 	struct ifg_req		 ifgrq, *ifgp;
1750 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
1751 
1752 	if (ifgr->ifgr_len == 0) {
1753 		TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1754 			ifgr->ifgr_len += sizeof(struct ifg_req);
1755 		return (0);
1756 	}
1757 
1758 	len = ifgr->ifgr_len;
1759 	ifgp = ifgr->ifgr_groups;
1760 	TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
1761 		if (len < sizeof(ifgrq))
1762 			return (EINVAL);
1763 		bzero(&ifgrq, sizeof ifgrq);
1764 		strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group,
1765 		    sizeof(ifgrq.ifgrq_group));
1766 		if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
1767 		    sizeof(struct ifg_req))))
1768 			return (error);
1769 		len -= sizeof(ifgrq);
1770 		ifgp++;
1771 	}
1772 
1773 	return (0);
1774 }
1775 
1776 /*
1777  * Stores all members of a group in memory pointed to by data
1778  */
1779 int
1780 if_getgroupmembers(caddr_t data)
1781 {
1782 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
1783 	struct ifg_group	*ifg;
1784 	struct ifg_member	*ifgm;
1785 	struct ifg_req		 ifgrq, *ifgp;
1786 	int			 len, error;
1787 
1788 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
1789 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
1790 			break;
1791 	if (ifg == NULL)
1792 		return (ENOENT);
1793 
1794 	if (ifgr->ifgr_len == 0) {
1795 		TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
1796 			ifgr->ifgr_len += sizeof(ifgrq);
1797 		return (0);
1798 	}
1799 
1800 	len = ifgr->ifgr_len;
1801 	ifgp = ifgr->ifgr_groups;
1802 	TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) {
1803 		if (len < sizeof(ifgrq))
1804 			return (EINVAL);
1805 		bzero(&ifgrq, sizeof ifgrq);
1806 		strlcpy(ifgrq.ifgrq_member, ifgm->ifgm_ifp->if_xname,
1807 		    sizeof(ifgrq.ifgrq_member));
1808 		if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
1809 		    sizeof(struct ifg_req))))
1810 			return (error);
1811 		len -= sizeof(ifgrq);
1812 		ifgp++;
1813 	}
1814 
1815 	return (0);
1816 }
1817 
1818 int
1819 if_getgroupattribs(caddr_t data)
1820 {
1821 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
1822 	struct ifg_group	*ifg;
1823 
1824 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
1825 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
1826 			break;
1827 	if (ifg == NULL)
1828 		return (ENOENT);
1829 
1830 	ifgr->ifgr_attrib.ifg_carp_demoted = ifg->ifg_carp_demoted;
1831 
1832 	return (0);
1833 }
1834 
1835 int
1836 if_setgroupattribs(caddr_t data)
1837 {
1838 	struct ifgroupreq	*ifgr = (struct ifgroupreq *)data;
1839 	struct ifg_group	*ifg;
1840 	struct ifg_member	*ifgm;
1841 	int			 demote;
1842 
1843 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
1844 		if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
1845 			break;
1846 	if (ifg == NULL)
1847 		return (ENOENT);
1848 
1849 	demote = ifgr->ifgr_attrib.ifg_carp_demoted;
1850 	if (demote + ifg->ifg_carp_demoted > 0xff ||
1851 	    demote + ifg->ifg_carp_demoted < 0)
1852 		return (ERANGE);
1853 
1854 	ifg->ifg_carp_demoted += demote;
1855 
1856 	TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
1857 		if (ifgm->ifgm_ifp->if_ioctl)
1858 			ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp,
1859 			    SIOCSIFGATTR, data);
1860 	return (0);
1861 }
1862 
1863 void
1864 if_group_routechange(struct sockaddr *dst, struct sockaddr *mask)
1865 {
1866 	switch (dst->sa_family) {
1867 	case AF_INET:
1868 		if (satosin(dst)->sin_addr.s_addr == INADDR_ANY &&
1869 		    mask && (mask->sa_len == 0 ||
1870 		    satosin(mask)->sin_addr.s_addr == INADDR_ANY))
1871 			if_group_egress_build();
1872 		break;
1873 #ifdef INET6
1874 	case AF_INET6:
1875 		if (IN6_ARE_ADDR_EQUAL(&(satosin6(dst))->sin6_addr,
1876 		    &in6addr_any) && mask &&
1877 		    IN6_ARE_ADDR_EQUAL(&(satosin6(mask))->sin6_addr,
1878 		    &in6addr_any))
1879 			if_group_egress_build();
1880 		break;
1881 #endif
1882 	}
1883 }
1884 
1885 int
1886 if_group_egress_build(void)
1887 {
1888 	struct ifg_group	*ifg;
1889 	struct ifg_member	*ifgm, *next;
1890 	struct sockaddr_in	 sa_in;
1891 #ifdef INET6
1892 	struct sockaddr_in6	 sa_in6;
1893 #endif
1894 	struct radix_node	*rn;
1895 	struct rtentry		*rt;
1896 
1897 	TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
1898 		if (!strcmp(ifg->ifg_group, IFG_EGRESS))
1899 			break;
1900 
1901 	if (ifg != NULL)
1902 		for (ifgm = TAILQ_FIRST(&ifg->ifg_members); ifgm; ifgm = next) {
1903 			next = TAILQ_NEXT(ifgm, ifgm_next);
1904 			if_delgroup(ifgm->ifgm_ifp, IFG_EGRESS);
1905 		}
1906 
1907 	bzero(&sa_in, sizeof(sa_in));
1908 	sa_in.sin_len = sizeof(sa_in);
1909 	sa_in.sin_family = AF_INET;
1910 	if ((rn = rt_lookup(sintosa(&sa_in), sintosa(&sa_in), 0)) != NULL) {
1911 		do {
1912 			rt = (struct rtentry *)rn;
1913 			if (rt->rt_ifp)
1914 				if_addgroup(rt->rt_ifp, IFG_EGRESS);
1915 #ifndef SMALL_KERNEL
1916 			rn = rn_mpath_next(rn);
1917 #else
1918 			rn = NULL;
1919 #endif
1920 		} while (rn != NULL);
1921 	}
1922 
1923 #ifdef INET6
1924 	bcopy(&sa6_any, &sa_in6, sizeof(sa_in6));
1925 	if ((rn = rt_lookup(sin6tosa(&sa_in6), sin6tosa(&sa_in6), 0)) != NULL) {
1926 		do {
1927 			rt = (struct rtentry *)rn;
1928 			if (rt->rt_ifp)
1929 				if_addgroup(rt->rt_ifp, IFG_EGRESS);
1930 #ifndef SMALL_KERNEL
1931 			rn = rn_mpath_next(rn);
1932 #else
1933 			rn = NULL;
1934 #endif
1935 		} while (rn != NULL);
1936 	}
1937 #endif
1938 
1939 	return (0);
1940 }
1941 
1942 /*
1943  * Set/clear promiscuous mode on interface ifp based on the truth value
1944  * of pswitch.  The calls are reference counted so that only the first
1945  * "on" request actually has an effect, as does the final "off" request.
1946  * Results are undefined if the "off" and "on" requests are not matched.
1947  */
1948 int
1949 ifpromisc(struct ifnet *ifp, int pswitch)
1950 {
1951 	struct ifreq ifr;
1952 
1953 	if (pswitch) {
1954 		/*
1955 		 * If the device is not configured up, we cannot put it in
1956 		 * promiscuous mode.
1957 		 */
1958 		if ((ifp->if_flags & IFF_UP) == 0)
1959 			return (ENETDOWN);
1960 		if (ifp->if_pcount++ != 0)
1961 			return (0);
1962 		ifp->if_flags |= IFF_PROMISC;
1963 	} else {
1964 		if (--ifp->if_pcount > 0)
1965 			return (0);
1966 		ifp->if_flags &= ~IFF_PROMISC;
1967 		/*
1968 		 * If the device is not configured up, we should not need to
1969 		 * turn off promiscuous mode (device should have turned it
1970 		 * off when interface went down; and will look at IFF_PROMISC
1971 		 * again next time interface comes up).
1972 		 */
1973 		if ((ifp->if_flags & IFF_UP) == 0)
1974 			return (0);
1975 	}
1976 	ifr.ifr_flags = ifp->if_flags;
1977 	return ((*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr));
1978 }
1979 
1980 int
1981 sysctl_ifq(int *name, u_int namelen, void *oldp, size_t *oldlenp,
1982     void *newp, size_t newlen, struct ifqueue *ifq)
1983 {
1984 	/* All sysctl names at this level are terminal. */
1985 	if (namelen != 1)
1986 		return (ENOTDIR);
1987 
1988 	switch (name[0]) {
1989 	case IFQCTL_LEN:
1990 		return (sysctl_rdint(oldp, oldlenp, newp, ifq->ifq_len));
1991 	case IFQCTL_MAXLEN:
1992 		return (sysctl_int(oldp, oldlenp, newp, newlen,
1993 		    &ifq->ifq_maxlen));
1994 	case IFQCTL_DROPS:
1995 		return (sysctl_rdint(oldp, oldlenp, newp, ifq->ifq_drops));
1996 	default:
1997 		return (EOPNOTSUPP);
1998 	}
1999 	/* NOTREACHED */
2000 }
2001