xref: /dflybsd-src/sys/net/if.c (revision 17ea22213f86a5c5966c1e6bf8e95f022ebb92b9)
1 /*
2  * Copyright (c) 1980, 1986, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *	@(#)if.c	8.3 (Berkeley) 1/4/94
34  * $FreeBSD: src/sys/net/if.c,v 1.185 2004/03/13 02:35:03 brooks Exp $
35  * $DragonFly: src/sys/net/if.c,v 1.26 2005/01/26 23:09:57 hsu Exp $
36  */
37 
38 #include "opt_compat.h"
39 #include "opt_inet6.h"
40 #include "opt_inet.h"
41 
42 #include <sys/param.h>
43 #include <sys/malloc.h>
44 #include <sys/mbuf.h>
45 #include <sys/systm.h>
46 #include <sys/proc.h>
47 #include <sys/protosw.h>
48 #include <sys/socket.h>
49 #include <sys/socketvar.h>
50 #include <sys/socketops.h>
51 #include <sys/protosw.h>
52 #include <sys/kernel.h>
53 #include <sys/sockio.h>
54 #include <sys/syslog.h>
55 #include <sys/sysctl.h>
56 
57 #include <net/if.h>
58 #include <net/if_arp.h>
59 #include <net/if_dl.h>
60 #include <net/if_types.h>
61 #include <net/if_var.h>
62 #include <net/radix.h>
63 #include <net/route.h>
64 #include <machine/stdarg.h>
65 
66 #if defined(INET) || defined(INET6)
67 /*XXX*/
68 #include <netinet/in.h>
69 #include <netinet/in_var.h>
70 #include <netinet/if_ether.h>
71 #ifdef INET6
72 #include <machine/clock.h> /* XXX: temporal workaround for fxp issue */
73 #include <netinet6/in6_var.h>
74 #include <netinet6/in6_ifattach.h>
75 #endif
76 #endif
77 
78 #if defined(COMPAT_43)
79 #include <emulation/43bsd/43bsd_socket.h>
80 #endif /* COMPAT_43 */
81 
82 /*
83  * System initialization
84  */
85 
86 static int ifconf (u_long, caddr_t, struct thread *);
87 static void ifinit (void *);
88 static void if_qflush (struct ifqueue *);
89 static void if_slowtimo (void *);
90 static void link_rtrequest (int, struct rtentry *, struct rt_addrinfo *);
91 static int  if_rtdel (struct radix_node *, void *);
92 
93 SYSINIT(interfaces, SI_SUB_PROTO_IF, SI_ORDER_FIRST, ifinit, NULL)
94 
95 MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
96 MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
97 MALLOC_DEFINE(M_CLONE, "clone", "interface cloning framework");
98 
99 int	ifqmaxlen = IFQ_MAXLEN;
100 struct	ifnethead ifnet;	/* depend on static init XXX */
101 
102 #ifdef INET6
103 /*
104  * XXX: declare here to avoid to include many inet6 related files..
105  * should be more generalized?
106  */
107 extern void	nd6_setmtu (struct ifnet *);
108 #endif
109 
110 struct if_clone *if_clone_lookup (const char *, int *);
111 int if_clone_list (struct if_clonereq *);
112 
113 LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);
114 int if_cloners_count;
115 
116 struct callout if_slowtimo_timer;
117 
118 /*
119  * Network interface utility routines.
120  *
121  * Routines with ifa_ifwith* names take sockaddr *'s as
122  * parameters.
123  */
124 /* ARGSUSED*/
125 void
126 ifinit(void *dummy)
127 {
128 	struct ifnet *ifp;
129 	int s;
130 
131 	callout_init(&if_slowtimo_timer);
132 
133 	s = splimp();
134 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
135 		if (ifp->if_snd.ifq_maxlen == 0) {
136 			if_printf(ifp, "XXX: driver didn't set ifq_maxlen\n");
137 			ifp->if_snd.ifq_maxlen = ifqmaxlen;
138 		}
139 	}
140 	splx(s);
141 
142 	if_slowtimo(0);
143 }
144 
145 int if_index = 0;
146 struct ifaddr **ifnet_addrs;
147 struct ifnet **ifindex2ifnet = NULL;
148 
149 /*
150  * Attach an interface to the
151  * list of "active" interfaces.
152  */
153 void
154 if_attach(struct ifnet *ifp)
155 {
156 	unsigned socksize, ifasize;
157 	int namelen, masklen;
158 	struct sockaddr_dl *sdl;
159 	struct ifaddr *ifa;
160 
161 	static int if_indexlim = 8;
162 	static boolean_t inited;
163 
164 	if (!inited) {
165 		TAILQ_INIT(&ifnet);
166 		inited = TRUE;
167 	}
168 
169 	TAILQ_INSERT_TAIL(&ifnet, ifp, if_link);
170 	ifp->if_index = ++if_index;
171 	/*
172 	 * XXX -
173 	 * The old code would work if the interface passed a pre-existing
174 	 * chain of ifaddrs to this code.  We don't trust our callers to
175 	 * properly initialize the tailq, however, so we no longer allow
176 	 * this unlikely case.
177 	 */
178 	TAILQ_INIT(&ifp->if_addrhead);
179 	TAILQ_INIT(&ifp->if_prefixhead);
180 	LIST_INIT(&ifp->if_multiaddrs);
181 	getmicrotime(&ifp->if_lastchange);
182 	if (ifnet_addrs == NULL || if_index >= if_indexlim) {
183 		unsigned int n;
184 		caddr_t q;
185 
186 		if_indexlim <<= 1;
187 		n = if_indexlim * sizeof(struct ifaddr *);
188 		q = malloc(n, M_IFADDR, M_WAITOK | M_ZERO);
189 		if (ifnet_addrs != NULL) {
190 			bcopy(ifnet_addrs, q, n/2);
191 			free(ifnet_addrs, M_IFADDR);
192 		}
193 		ifnet_addrs = (struct ifaddr **)q;
194 
195 		/* grow ifindex2ifnet */
196 		n = if_indexlim * sizeof(struct ifnet *);
197 		q = malloc(n, M_IFADDR, M_WAITOK | M_ZERO);
198 		if (ifindex2ifnet) {
199 			bcopy(ifindex2ifnet, q, n/2);
200 			free(ifindex2ifnet, M_IFADDR);
201 		}
202 		ifindex2ifnet = (struct ifnet **)q;
203 	}
204 
205 	ifindex2ifnet[if_index] = ifp;
206 
207 	/*
208 	 * create a Link Level name for this device
209 	 */
210 	namelen = strlen(ifp->if_xname);
211 #define _offsetof(t, m) ((int)((caddr_t)&((t *)0)->m))
212 	masklen = _offsetof(struct sockaddr_dl, sdl_data[0]) + namelen;
213 	socksize = masklen + ifp->if_addrlen;
214 #define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1)))
215 	if (socksize < sizeof(*sdl))
216 		socksize = sizeof(*sdl);
217 	socksize = ROUNDUP(socksize);
218 	ifasize = sizeof(struct ifaddr) + 2 * socksize;
219 	ifa = malloc(ifasize, M_IFADDR, M_WAITOK | M_ZERO);
220 	sdl = (struct sockaddr_dl *)(ifa + 1);
221 	sdl->sdl_len = socksize;
222 	sdl->sdl_family = AF_LINK;
223 	bcopy(ifp->if_xname, sdl->sdl_data, namelen);
224 	sdl->sdl_nlen = namelen;
225 	sdl->sdl_index = ifp->if_index;
226 	sdl->sdl_type = ifp->if_type;
227 	ifnet_addrs[if_index - 1] = ifa;
228 	ifa->ifa_ifp = ifp;
229 	ifa->ifa_rtrequest = link_rtrequest;
230 	ifa->ifa_addr = (struct sockaddr *)sdl;
231 	sdl = (struct sockaddr_dl *)(socksize + (caddr_t)sdl);
232 	ifa->ifa_netmask = (struct sockaddr *)sdl;
233 	sdl->sdl_len = masklen;
234 	while (namelen != 0)
235 		sdl->sdl_data[--namelen] = 0xff;
236 	TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
237 
238 	EVENTHANDLER_INVOKE(ifnet_attach_event, ifp);
239 
240 	/* Announce the interface. */
241 	rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
242 }
243 
244 /*
245  * Detach an interface, removing it from the
246  * list of "active" interfaces.
247  */
248 void
249 if_detach(struct ifnet *ifp)
250 {
251 	struct ifaddr *ifa;
252 	struct radix_node_head	*rnh;
253 	int s;
254 	int i;
255 
256 	EVENTHANDLER_INVOKE(ifnet_detach_event, ifp);
257 
258 	/*
259 	 * Remove routes and flush queues.
260 	 */
261 	s = splnet();
262 	if_down(ifp);
263 
264 	/*
265 	 * Remove address from ifnet_addrs[] and maybe decrement if_index.
266 	 * Clean up all addresses.
267 	 */
268 	ifnet_addrs[ifp->if_index - 1] = 0;
269 	while (if_index > 0 && ifnet_addrs[if_index - 1] == 0)
270 		if_index--;
271 
272 	for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa;
273 	     ifa = TAILQ_FIRST(&ifp->if_addrhead)) {
274 #ifdef INET
275 		/* XXX: Ugly!! ad hoc just for INET */
276 		if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) {
277 			struct ifaliasreq ifr;
278 
279 			bzero(&ifr, sizeof ifr);
280 			ifr.ifra_addr = *ifa->ifa_addr;
281 			if (ifa->ifa_dstaddr)
282 				ifr.ifra_broadaddr = *ifa->ifa_dstaddr;
283 			if (in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr, ifp,
284 				       NULL) == 0)
285 				continue;
286 		}
287 #endif /* INET */
288 #ifdef INET6
289 		if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET6) {
290 			in6_purgeaddr(ifa);
291 			/* ifp_addrhead is already updated */
292 			continue;
293 		}
294 #endif /* INET6 */
295 		TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
296 		IFAFREE(ifa);
297 	}
298 
299 #ifdef INET6
300 	/*
301 	 * Remove all IPv6 kernel structs related to ifp.  This should be done
302 	 * before removing routing entries below, since IPv6 interface direct
303 	 * routes are expected to be removed by the IPv6-specific kernel API.
304 	 * Otherwise, the kernel will detect some inconsistency and bark it.
305 	 */
306 	in6_ifdetach(ifp);
307 #endif
308 
309 	/*
310 	 * Delete all remaining routes using this interface
311 	 * Unfortuneatly the only way to do this is to slog through
312 	 * the entire routing table looking for routes which point
313 	 * to this interface...oh well...
314 	 */
315 	for (i = 1; i <= AF_MAX; i++) {
316 		if ((rnh = rt_tables[i]) == NULL)
317 			continue;
318 		rnh->rnh_walktree(rnh, if_rtdel, ifp);
319 	}
320 
321 	/* Announce that the interface is gone. */
322 	rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
323 
324 	ifindex2ifnet[ifp->if_index] = NULL;
325 
326 	TAILQ_REMOVE(&ifnet, ifp, if_link);
327 	splx(s);
328 }
329 
330 /*
331  * Delete Routes for a Network Interface
332  *
333  * Called for each routing entry via the rnh->rnh_walktree() call above
334  * to delete all route entries referencing a detaching network interface.
335  *
336  * Arguments:
337  *	rn	pointer to node in the routing table
338  *	arg	argument passed to rnh->rnh_walktree() - detaching interface
339  *
340  * Returns:
341  *	0	successful
342  *	errno	failed - reason indicated
343  *
344  */
345 static int
346 if_rtdel(struct radix_node *rn, void *arg)
347 {
348 	struct rtentry	*rt = (struct rtentry *)rn;
349 	struct ifnet	*ifp = arg;
350 	int		err;
351 
352 	if (rt->rt_ifp == ifp) {
353 
354 		/*
355 		 * Protect (sorta) against walktree recursion problems
356 		 * with cloned routes
357 		 */
358 		if (!(rt->rt_flags & RTF_UP))
359 			return (0);
360 
361 		err = rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
362 				rt_mask(rt), rt->rt_flags,
363 				(struct rtentry **) NULL);
364 		if (err) {
365 			log(LOG_WARNING, "if_rtdel: error %d\n", err);
366 		}
367 	}
368 
369 	return (0);
370 }
371 
372 /*
373  * Create a clone network interface.
374  */
375 int
376 if_clone_create(char *name, int len)
377 {
378 	struct if_clone *ifc;
379 	char *dp;
380 	int wildcard, bytoff, bitoff;
381 	int unit;
382 	int err;
383 
384 	ifc = if_clone_lookup(name, &unit);
385 	if (ifc == NULL)
386 		return (EINVAL);
387 
388 	if (ifunit(name) != NULL)
389 		return (EEXIST);
390 
391 	bytoff = bitoff = 0;
392 	wildcard = (unit < 0);
393 	/*
394 	 * Find a free unit if none was given.
395 	 */
396 	if (wildcard) {
397 		while (bytoff < ifc->ifc_bmlen &&
398 		    ifc->ifc_units[bytoff] == 0xff)
399 			bytoff++;
400 		if (bytoff >= ifc->ifc_bmlen)
401 			return (ENOSPC);
402 		while ((ifc->ifc_units[bytoff] & (1 << bitoff)) != 0)
403 			bitoff++;
404 		unit = (bytoff << 3) + bitoff;
405 	}
406 
407 	if (unit > ifc->ifc_maxunit)
408 		return (ENXIO);
409 
410 	err = (*ifc->ifc_create)(ifc, unit);
411 	if (err != 0)
412 		return (err);
413 
414 	if (!wildcard) {
415 		bytoff = unit >> 3;
416 		bitoff = unit - (bytoff << 3);
417 	}
418 
419 	/*
420 	 * Allocate the unit in the bitmap.
421 	 */
422 	KASSERT((ifc->ifc_units[bytoff] & (1 << bitoff)) == 0,
423 	    ("%s: bit is already set", __func__));
424 	ifc->ifc_units[bytoff] |= (1 << bitoff);
425 
426 	/* In the wildcard case, we need to update the name. */
427 	if (wildcard) {
428 		for (dp = name; *dp != '\0'; dp++);
429 		if (snprintf(dp, len - (dp-name), "%d", unit) >
430 		    len - (dp-name) - 1) {
431 			/*
432 			 * This can only be a programmer error and
433 			 * there's no straightforward way to recover if
434 			 * it happens.
435 			 */
436 			panic("if_clone_create(): interface name too long");
437 		}
438 
439 	}
440 
441 	EVENTHANDLER_INVOKE(if_clone_event, ifc);
442 
443 	return (0);
444 }
445 
446 /*
447  * Destroy a clone network interface.
448  */
449 int
450 if_clone_destroy(const char *name)
451 {
452 	struct if_clone *ifc;
453 	struct ifnet *ifp;
454 	int bytoff, bitoff;
455 	int unit;
456 
457 	ifc = if_clone_lookup(name, &unit);
458 	if (ifc == NULL)
459 		return (EINVAL);
460 
461 	if (unit < ifc->ifc_minifs)
462 		return (EINVAL);
463 
464 	ifp = ifunit(name);
465 	if (ifp == NULL)
466 		return (ENXIO);
467 
468 	if (ifc->ifc_destroy == NULL)
469 		return (EOPNOTSUPP);
470 
471 	(*ifc->ifc_destroy)(ifp);
472 
473 	/*
474 	 * Compute offset in the bitmap and deallocate the unit.
475 	 */
476 	bytoff = unit >> 3;
477 	bitoff = unit - (bytoff << 3);
478 	KASSERT((ifc->ifc_units[bytoff] & (1 << bitoff)) != 0,
479 	    ("%s: bit is already cleared", __func__));
480 	ifc->ifc_units[bytoff] &= ~(1 << bitoff);
481 	return (0);
482 }
483 
484 /*
485  * Look up a network interface cloner.
486  */
487 struct if_clone *
488 if_clone_lookup(const char *name, int *unitp)
489 {
490 	struct if_clone *ifc;
491 	const char *cp;
492 	int i;
493 
494 	for (ifc = LIST_FIRST(&if_cloners); ifc != NULL;) {
495 		for (cp = name, i = 0; i < ifc->ifc_namelen; i++, cp++) {
496 			if (ifc->ifc_name[i] != *cp)
497 				goto next_ifc;
498 		}
499 		goto found_name;
500  next_ifc:
501 		ifc = LIST_NEXT(ifc, ifc_list);
502 	}
503 
504 	/* No match. */
505 	return ((struct if_clone *)NULL);
506 
507  found_name:
508 	if (*cp == '\0') {
509 		i = -1;
510 	} else {
511 		for (i = 0; *cp != '\0'; cp++) {
512 			if (*cp < '0' || *cp > '9') {
513 				/* Bogus unit number. */
514 				return (NULL);
515 			}
516 			i = (i * 10) + (*cp - '0');
517 		}
518 	}
519 
520 	if (unitp != NULL)
521 		*unitp = i;
522 	return (ifc);
523 }
524 
525 /*
526  * Register a network interface cloner.
527  */
528 void
529 if_clone_attach(struct if_clone *ifc)
530 {
531 	int bytoff, bitoff;
532 	int err;
533 	int len, maxclone;
534 	int unit;
535 
536 	KASSERT(ifc->ifc_minifs - 1 <= ifc->ifc_maxunit,
537 	    ("%s: %s requested more units then allowed (%d > %d)",
538 	    __func__, ifc->ifc_name, ifc->ifc_minifs,
539 	    ifc->ifc_maxunit + 1));
540 	/*
541 	 * Compute bitmap size and allocate it.
542 	 */
543 	maxclone = ifc->ifc_maxunit + 1;
544 	len = maxclone >> 3;
545 	if ((len << 3) < maxclone)
546 		len++;
547 	ifc->ifc_units = malloc(len, M_CLONE, M_WAITOK | M_ZERO);
548 	ifc->ifc_bmlen = len;
549 
550 	LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);
551 	if_cloners_count++;
552 
553 	for (unit = 0; unit < ifc->ifc_minifs; unit++) {
554 		err = (*ifc->ifc_create)(ifc, unit);
555 		KASSERT(err == 0,
556 		    ("%s: failed to create required interface %s%d",
557 		    __func__, ifc->ifc_name, unit));
558 
559 		/* Allocate the unit in the bitmap. */
560 		bytoff = unit >> 3;
561 		bitoff = unit - (bytoff << 3);
562 		ifc->ifc_units[bytoff] |= (1 << bitoff);
563 	}
564 }
565 
566 /*
567  * Unregister a network interface cloner.
568  */
569 void
570 if_clone_detach(struct if_clone *ifc)
571 {
572 
573 	LIST_REMOVE(ifc, ifc_list);
574 	free(ifc->ifc_units, M_CLONE);
575 	if_cloners_count--;
576 }
577 
578 /*
579  * Provide list of interface cloners to userspace.
580  */
581 int
582 if_clone_list(struct if_clonereq *ifcr)
583 {
584 	char outbuf[IFNAMSIZ], *dst;
585 	struct if_clone *ifc;
586 	int count, error = 0;
587 
588 	ifcr->ifcr_total = if_cloners_count;
589 	if ((dst = ifcr->ifcr_buffer) == NULL) {
590 		/* Just asking how many there are. */
591 		return (0);
592 	}
593 
594 	if (ifcr->ifcr_count < 0)
595 		return (EINVAL);
596 
597 	count = (if_cloners_count < ifcr->ifcr_count) ?
598 	    if_cloners_count : ifcr->ifcr_count;
599 
600 	for (ifc = LIST_FIRST(&if_cloners); ifc != NULL && count != 0;
601 	     ifc = LIST_NEXT(ifc, ifc_list), count--, dst += IFNAMSIZ) {
602 		strlcpy(outbuf, ifc->ifc_name, IFNAMSIZ);
603 		error = copyout(outbuf, dst, IFNAMSIZ);
604 		if (error)
605 			break;
606 	}
607 
608 	return (error);
609 }
610 
611 /*
612  * Locate an interface based on a complete address.
613  */
614 struct ifaddr *
615 ifa_ifwithaddr(struct sockaddr *addr)
616 {
617 	struct ifnet *ifp;
618 	struct ifaddr *ifa;
619 
620 	TAILQ_FOREACH(ifp, &ifnet, if_link)
621 	    TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
622 		if (ifa->ifa_addr->sa_family != addr->sa_family)
623 			continue;
624 		if (sa_equal(addr, ifa->ifa_addr))
625 			return (ifa);
626 		if ((ifp->if_flags & IFF_BROADCAST) && ifa->ifa_broadaddr &&
627 		    /* IPv6 doesn't have broadcast */
628 		    ifa->ifa_broadaddr->sa_len != 0 &&
629 		    sa_equal(ifa->ifa_broadaddr, addr))
630 			return (ifa);
631 	}
632 	return ((struct ifaddr *)NULL);
633 }
634 /*
635  * Locate the point to point interface with a given destination address.
636  */
637 struct ifaddr *
638 ifa_ifwithdstaddr(struct sockaddr *addr)
639 {
640 	struct ifnet *ifp;
641 	struct ifaddr *ifa;
642 
643 	TAILQ_FOREACH(ifp, &ifnet, if_link)
644 	    if (ifp->if_flags & IFF_POINTOPOINT)
645 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
646 			if (ifa->ifa_addr->sa_family != addr->sa_family)
647 				continue;
648 			if (ifa->ifa_dstaddr &&
649 			    sa_equal(addr, ifa->ifa_dstaddr))
650 				return (ifa);
651 	}
652 	return ((struct ifaddr *)NULL);
653 }
654 
655 /*
656  * Find an interface on a specific network.  If many, choice
657  * is most specific found.
658  */
659 struct ifaddr *
660 ifa_ifwithnet(struct sockaddr *addr)
661 {
662 	struct ifnet *ifp;
663 	struct ifaddr *ifa;
664 	struct ifaddr *ifa_maybe = (struct ifaddr *) 0;
665 	u_int af = addr->sa_family;
666 	char *addr_data = addr->sa_data, *cplim;
667 
668 	/*
669 	 * AF_LINK addresses can be looked up directly by their index number,
670 	 * so do that if we can.
671 	 */
672 	if (af == AF_LINK) {
673 	    struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr;
674 
675 	    if (sdl->sdl_index && sdl->sdl_index <= if_index)
676 		return (ifnet_addrs[sdl->sdl_index - 1]);
677 	}
678 
679 	/*
680 	 * Scan though each interface, looking for ones that have
681 	 * addresses in this address family.
682 	 */
683 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
684 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
685 			char *cp, *cp2, *cp3;
686 
687 			if (ifa->ifa_addr->sa_family != af)
688 next:				continue;
689 			if (af == AF_INET && ifp->if_flags & IFF_POINTOPOINT) {
690 				/*
691 				 * This is a bit broken as it doesn't
692 				 * take into account that the remote end may
693 				 * be a single node in the network we are
694 				 * looking for.
695 				 * The trouble is that we don't know the
696 				 * netmask for the remote end.
697 				 */
698 				if (ifa->ifa_dstaddr != NULL &&
699 				    sa_equal(addr, ifa->ifa_dstaddr))
700 					return (ifa);
701 			} else {
702 				/*
703 				 * if we have a special address handler,
704 				 * then use it instead of the generic one.
705 				 */
706 				if (ifa->ifa_claim_addr) {
707 					if ((*ifa->ifa_claim_addr)(ifa, addr)) {
708 						return (ifa);
709 					} else {
710 						continue;
711 					}
712 				}
713 
714 				/*
715 				 * Scan all the bits in the ifa's address.
716 				 * If a bit dissagrees with what we are
717 				 * looking for, mask it with the netmask
718 				 * to see if it really matters.
719 				 * (A byte at a time)
720 				 */
721 				if (ifa->ifa_netmask == 0)
722 					continue;
723 				cp = addr_data;
724 				cp2 = ifa->ifa_addr->sa_data;
725 				cp3 = ifa->ifa_netmask->sa_data;
726 				cplim = ifa->ifa_netmask->sa_len +
727 					(char *)ifa->ifa_netmask;
728 				while (cp3 < cplim)
729 					if ((*cp++ ^ *cp2++) & *cp3++)
730 						goto next; /* next address! */
731 				/*
732 				 * If the netmask of what we just found
733 				 * is more specific than what we had before
734 				 * (if we had one) then remember the new one
735 				 * before continuing to search
736 				 * for an even better one.
737 				 */
738 				if (ifa_maybe == 0 ||
739 				    rn_refines((char *)ifa->ifa_netmask,
740 					       (char *)ifa_maybe->ifa_netmask))
741 					ifa_maybe = ifa;
742 			}
743 		}
744 	}
745 	return (ifa_maybe);
746 }
747 
748 /*
749  * Find an interface address specific to an interface best matching
750  * a given address.
751  */
752 struct ifaddr *
753 ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
754 {
755 	struct ifaddr *ifa;
756 	char *cp, *cp2, *cp3;
757 	char *cplim;
758 	struct ifaddr *ifa_maybe = 0;
759 	u_int af = addr->sa_family;
760 
761 	if (af >= AF_MAX)
762 		return (0);
763 	TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
764 		if (ifa->ifa_addr->sa_family != af)
765 			continue;
766 		if (ifa_maybe == 0)
767 			ifa_maybe = ifa;
768 		if (ifa->ifa_netmask == NULL) {
769 			if (sa_equal(addr, ifa->ifa_addr) ||
770 			    (ifa->ifa_dstaddr != NULL &&
771 			     sa_equal(addr, ifa->ifa_dstaddr)))
772 				return (ifa);
773 			continue;
774 		}
775 		if (ifp->if_flags & IFF_POINTOPOINT) {
776 			if (sa_equal(addr, ifa->ifa_dstaddr))
777 				return (ifa);
778 		} else {
779 			cp = addr->sa_data;
780 			cp2 = ifa->ifa_addr->sa_data;
781 			cp3 = ifa->ifa_netmask->sa_data;
782 			cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask;
783 			for (; cp3 < cplim; cp3++)
784 				if ((*cp++ ^ *cp2++) & *cp3)
785 					break;
786 			if (cp3 == cplim)
787 				return (ifa);
788 		}
789 	}
790 	return (ifa_maybe);
791 }
792 
793 #include <net/route.h>
794 
795 /*
796  * Default action when installing a route with a Link Level gateway.
797  * Lookup an appropriate real ifa to point to.
798  * This should be moved to /sys/net/link.c eventually.
799  */
800 static void
801 link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
802 {
803 	struct ifaddr *ifa;
804 	struct sockaddr *dst;
805 	struct ifnet *ifp;
806 
807 	if (cmd != RTM_ADD || (ifa = rt->rt_ifa) == NULL ||
808 	    (ifp = ifa->ifa_ifp) == NULL || (dst = rt_key(rt)) == NULL)
809 		return;
810 	ifa = ifaof_ifpforaddr(dst, ifp);
811 	if (ifa != NULL) {
812 		IFAFREE(rt->rt_ifa);
813 		IFAREF(ifa);
814 		rt->rt_ifa = ifa;
815 		if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
816 			ifa->ifa_rtrequest(cmd, rt, info);
817 	}
818 }
819 
820 /*
821  * Mark an interface down and notify protocols of
822  * the transition.
823  * NOTE: must be called at splnet or eqivalent.
824  */
825 void
826 if_unroute(struct ifnet *ifp, int flag, int fam)
827 {
828 	struct ifaddr *ifa;
829 
830 	ifp->if_flags &= ~flag;
831 	getmicrotime(&ifp->if_lastchange);
832 	TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
833 		if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family))
834 			pfctlinput(PRC_IFDOWN, ifa->ifa_addr);
835 	if_qflush(&ifp->if_snd);
836 	rt_ifmsg(ifp);
837 }
838 
839 /*
840  * Mark an interface up and notify protocols of
841  * the transition.
842  * NOTE: must be called at splnet or eqivalent.
843  */
844 void
845 if_route(struct ifnet *ifp, int flag, int fam)
846 {
847 	struct ifaddr *ifa;
848 
849 	ifp->if_flags |= flag;
850 	getmicrotime(&ifp->if_lastchange);
851 	TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
852 		if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family))
853 			pfctlinput(PRC_IFUP, ifa->ifa_addr);
854 	rt_ifmsg(ifp);
855 #ifdef INET6
856 	in6_if_up(ifp);
857 #endif
858 }
859 
860 /*
861  * Mark an interface down and notify protocols of the transition.  An
862  * interface going down is also considered to be a synchronizing event.
863  * We must ensure that all packet processing related to the interface
864  * has completed before we return so e.g. the caller can free the ifnet
865  * structure that the mbufs may be referencing.
866  *
867  * NOTE: must be called at splnet or eqivalent.
868  */
869 void
870 if_down(struct ifnet *ifp)
871 {
872 
873 	if_unroute(ifp, IFF_UP, AF_UNSPEC);
874 	netmsg_service_sync();
875 }
876 
877 /*
878  * Mark an interface up and notify protocols of
879  * the transition.
880  * NOTE: must be called at splnet or eqivalent.
881  */
882 void
883 if_up(struct ifnet *ifp)
884 {
885 
886 	if_route(ifp, IFF_UP, AF_UNSPEC);
887 }
888 
889 /*
890  * Flush an interface queue.
891  */
892 static void
893 if_qflush(struct ifqueue *ifq)
894 {
895 	struct mbuf *m, *n;
896 
897 	n = ifq->ifq_head;
898 	while ((m = n) != 0) {
899 		n = m->m_nextpkt;
900 		m_freem(m);
901 	}
902 	ifq->ifq_head = 0;
903 	ifq->ifq_tail = 0;
904 	ifq->ifq_len = 0;
905 }
906 
907 /*
908  * Handle interface watchdog timer routines.  Called
909  * from softclock, we decrement timers (if set) and
910  * call the appropriate interface routine on expiration.
911  */
912 static void
913 if_slowtimo(void *arg)
914 {
915 	struct ifnet *ifp;
916 	int s = splimp();
917 
918 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
919 		if (ifp->if_timer == 0 || --ifp->if_timer)
920 			continue;
921 		if (ifp->if_watchdog)
922 			(*ifp->if_watchdog)(ifp);
923 	}
924 	splx(s);
925 	callout_reset(&if_slowtimo_timer, hz / IFNET_SLOWHZ, if_slowtimo, NULL);
926 }
927 
928 /*
929  * Map interface name to
930  * interface structure pointer.
931  */
932 struct ifnet *
933 ifunit(const char *name)
934 {
935 	struct ifnet *ifp;
936 
937 	/*
938 	 * Search all the interfaces for this name/number
939 	 */
940 
941 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
942 		if (strncmp(ifp->if_xname, name, IFNAMSIZ) == 0)
943 			break;
944 	}
945 	return (ifp);
946 }
947 
948 
949 /*
950  * Map interface name in a sockaddr_dl to
951  * interface structure pointer.
952  */
953 struct ifnet *
954 if_withname(struct sockaddr *sa)
955 {
956 	char ifname[IFNAMSIZ+1];
957 	struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
958 
959 	if ( (sa->sa_family != AF_LINK) || (sdl->sdl_nlen == 0) ||
960 	     (sdl->sdl_nlen > IFNAMSIZ) )
961 		return NULL;
962 
963 	/*
964 	 * ifunit wants a null-terminated name.  It may not be null-terminated
965 	 * in the sockaddr.  We don't want to change the caller's sockaddr,
966 	 * and there might not be room to put the trailing null anyway, so we
967 	 * make a local copy that we know we can null terminate safely.
968 	 */
969 
970 	bcopy(sdl->sdl_data, ifname, sdl->sdl_nlen);
971 	ifname[sdl->sdl_nlen] = '\0';
972 	return ifunit(ifname);
973 }
974 
975 
976 /*
977  * Interface ioctls.
978  */
979 int
980 ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
981 {
982 	struct ifnet *ifp;
983 	struct ifreq *ifr;
984 	struct ifstat *ifs;
985 	int error;
986 	short oif_flags;
987 	int new_flags;
988 	size_t namelen, onamelen;
989 	char new_name[IFNAMSIZ];
990 	struct ifaddr *ifa;
991 	struct sockaddr_dl *sdl;
992 
993 	switch (cmd) {
994 
995 	case SIOCGIFCONF:
996 	case OSIOCGIFCONF:
997 		return (ifconf(cmd, data, td));
998 	}
999 	ifr = (struct ifreq *)data;
1000 
1001 	switch (cmd) {
1002 	case SIOCIFCREATE:
1003 	case SIOCIFDESTROY:
1004 		if ((error = suser(td)) != 0)
1005 			return (error);
1006 		return ((cmd == SIOCIFCREATE) ?
1007 			if_clone_create(ifr->ifr_name, sizeof(ifr->ifr_name)) :
1008 			if_clone_destroy(ifr->ifr_name));
1009 
1010 	case SIOCIFGCLONERS:
1011 		return (if_clone_list((struct if_clonereq *)data));
1012 	}
1013 
1014 	ifp = ifunit(ifr->ifr_name);
1015 	if (ifp == 0)
1016 		return (ENXIO);
1017 	switch (cmd) {
1018 
1019 	case SIOCGIFFLAGS:
1020 		ifr->ifr_flags = ifp->if_flags;
1021 		ifr->ifr_flagshigh = ifp->if_flags >> 16;
1022 		break;
1023 
1024 	case SIOCGIFCAP:
1025 		ifr->ifr_reqcap = ifp->if_capabilities;
1026 		ifr->ifr_curcap = ifp->if_capenable;
1027 		break;
1028 
1029 	case SIOCGIFMETRIC:
1030 		ifr->ifr_metric = ifp->if_metric;
1031 		break;
1032 
1033 	case SIOCGIFMTU:
1034 		ifr->ifr_mtu = ifp->if_mtu;
1035 		break;
1036 
1037 	case SIOCGIFPHYS:
1038 		ifr->ifr_phys = ifp->if_physical;
1039 		break;
1040 
1041 	case SIOCSIFFLAGS:
1042 		error = suser(td);
1043 		if (error)
1044 			return (error);
1045 		new_flags = (ifr->ifr_flags & 0xffff) |
1046 		    (ifr->ifr_flagshigh << 16);
1047 		if (ifp->if_flags & IFF_SMART) {
1048 			/* Smart drivers twiddle their own routes */
1049 		} else if (ifp->if_flags & IFF_UP &&
1050 		    (new_flags & IFF_UP) == 0) {
1051 			int s = splimp();
1052 			if_down(ifp);
1053 			splx(s);
1054 		} else if (new_flags & IFF_UP &&
1055 		    (ifp->if_flags & IFF_UP) == 0) {
1056 			int s = splimp();
1057 			if_up(ifp);
1058 			splx(s);
1059 		}
1060 		ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
1061 			(new_flags &~ IFF_CANTCHANGE);
1062 		if (new_flags & IFF_PPROMISC) {
1063 			/* Permanently promiscuous mode requested */
1064 			ifp->if_flags |= IFF_PROMISC;
1065 		} else if (ifp->if_pcount == 0) {
1066 			ifp->if_flags &= ~IFF_PROMISC;
1067 		}
1068 		if (ifp->if_ioctl)
1069 			(*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
1070 		getmicrotime(&ifp->if_lastchange);
1071 		break;
1072 
1073 	case SIOCSIFCAP:
1074 		error = suser(td);
1075 		if (error)
1076 			return (error);
1077 		if (ifr->ifr_reqcap & ~ifp->if_capabilities)
1078 			return (EINVAL);
1079 		(*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
1080 		break;
1081 
1082 	case SIOCSIFNAME:
1083 		error = suser(td);
1084 		if (error != 0)
1085 			return (error);
1086 		error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL);
1087 		if (error != 0)
1088 			return (error);
1089 		if (new_name[0] == '\0')
1090 			return (EINVAL);
1091 		if (ifunit(new_name) != NULL)
1092 			return (EEXIST);
1093 
1094 		EVENTHANDLER_INVOKE(ifnet_detach_event, ifp);
1095 
1096 		/* Announce the departure of the interface. */
1097 		rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
1098 
1099 		strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));
1100 		ifa = TAILQ_FIRST(&ifp->if_addrhead);
1101 		/* XXX IFA_LOCK(ifa); */
1102 		sdl = (struct sockaddr_dl *)ifa->ifa_addr;
1103 		namelen = strlen(new_name);
1104 		onamelen = sdl->sdl_nlen;
1105 		/*
1106 		 * Move the address if needed.  This is safe because we
1107 		 * allocate space for a name of length IFNAMSIZ when we
1108 		 * create this in if_attach().
1109 		 */
1110 		if (namelen != onamelen) {
1111 			bcopy(sdl->sdl_data + onamelen,
1112 			    sdl->sdl_data + namelen, sdl->sdl_alen);
1113 		}
1114 		bcopy(new_name, sdl->sdl_data, namelen);
1115 		sdl->sdl_nlen = namelen;
1116 		sdl = (struct sockaddr_dl *)ifa->ifa_netmask;
1117 		bzero(sdl->sdl_data, onamelen);
1118 		while (namelen != 0)
1119 			sdl->sdl_data[--namelen] = 0xff;
1120 		/* XXX IFA_UNLOCK(ifa) */
1121 
1122 		EVENTHANDLER_INVOKE(ifnet_attach_event, ifp);
1123 
1124 		/* Announce the return of the interface. */
1125 		rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
1126 		break;
1127 
1128 	case SIOCSIFMETRIC:
1129 		error = suser(td);
1130 		if (error)
1131 			return (error);
1132 		ifp->if_metric = ifr->ifr_metric;
1133 		getmicrotime(&ifp->if_lastchange);
1134 		break;
1135 
1136 	case SIOCSIFPHYS:
1137 		error = suser(td);
1138 		if (error)
1139 			return error;
1140 		if (!ifp->if_ioctl)
1141 		        return EOPNOTSUPP;
1142 		error = (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
1143 		if (error == 0)
1144 			getmicrotime(&ifp->if_lastchange);
1145 		return (error);
1146 
1147 	case SIOCSIFMTU:
1148 	{
1149 		u_long oldmtu = ifp->if_mtu;
1150 
1151 		error = suser(td);
1152 		if (error)
1153 			return (error);
1154 		if (ifp->if_ioctl == NULL)
1155 			return (EOPNOTSUPP);
1156 		if (ifr->ifr_mtu < IF_MINMTU || ifr->ifr_mtu > IF_MAXMTU)
1157 			return (EINVAL);
1158 		error = (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
1159 		if (error == 0) {
1160 			getmicrotime(&ifp->if_lastchange);
1161 			rt_ifmsg(ifp);
1162 		}
1163 		/*
1164 		 * If the link MTU changed, do network layer specific procedure.
1165 		 */
1166 		if (ifp->if_mtu != oldmtu) {
1167 #ifdef INET6
1168 			nd6_setmtu(ifp);
1169 #endif
1170 		}
1171 		return (error);
1172 	}
1173 
1174 	case SIOCADDMULTI:
1175 	case SIOCDELMULTI:
1176 		error = suser(td);
1177 		if (error)
1178 			return (error);
1179 
1180 		/* Don't allow group membership on non-multicast interfaces. */
1181 		if ((ifp->if_flags & IFF_MULTICAST) == 0)
1182 			return EOPNOTSUPP;
1183 
1184 		/* Don't let users screw up protocols' entries. */
1185 		if (ifr->ifr_addr.sa_family != AF_LINK)
1186 			return EINVAL;
1187 
1188 		if (cmd == SIOCADDMULTI) {
1189 			struct ifmultiaddr *ifma;
1190 			error = if_addmulti(ifp, &ifr->ifr_addr, &ifma);
1191 		} else {
1192 			error = if_delmulti(ifp, &ifr->ifr_addr);
1193 		}
1194 		if (error == 0)
1195 			getmicrotime(&ifp->if_lastchange);
1196 		return error;
1197 
1198 	case SIOCSIFPHYADDR:
1199 	case SIOCDIFPHYADDR:
1200 #ifdef INET6
1201 	case SIOCSIFPHYADDR_IN6:
1202 #endif
1203 	case SIOCSLIFPHYADDR:
1204         case SIOCSIFMEDIA:
1205 	case SIOCSIFGENERIC:
1206 		error = suser(td);
1207 		if (error)
1208 			return (error);
1209 		if (ifp->if_ioctl == 0)
1210 			return (EOPNOTSUPP);
1211 		error = (*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred);
1212 		if (error == 0)
1213 			getmicrotime(&ifp->if_lastchange);
1214 		return error;
1215 
1216 	case SIOCGIFSTATUS:
1217 		ifs = (struct ifstat *)data;
1218 		ifs->ascii[0] = '\0';
1219 
1220 	case SIOCGIFPSRCADDR:
1221 	case SIOCGIFPDSTADDR:
1222 	case SIOCGLIFPHYADDR:
1223 	case SIOCGIFMEDIA:
1224 	case SIOCGIFGENERIC:
1225 		if (ifp->if_ioctl == 0)
1226 			return (EOPNOTSUPP);
1227 		return ((*ifp->if_ioctl)(ifp, cmd, data, td->td_proc->p_ucred));
1228 
1229 	case SIOCSIFLLADDR:
1230 		error = suser(td);
1231 		if (error)
1232 			return (error);
1233 		return if_setlladdr(ifp,
1234 		    ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len);
1235 
1236 	default:
1237 		oif_flags = ifp->if_flags;
1238 		if (so->so_proto == 0)
1239 			return (EOPNOTSUPP);
1240 #ifndef COMPAT_43
1241 		error = so_pru_control(so, cmd, data, ifp, td);
1242 #else
1243 	    {
1244 		int ocmd = cmd;
1245 
1246 		switch (cmd) {
1247 
1248 		case SIOCSIFDSTADDR:
1249 		case SIOCSIFADDR:
1250 		case SIOCSIFBRDADDR:
1251 		case SIOCSIFNETMASK:
1252 #if BYTE_ORDER != BIG_ENDIAN
1253 			if (ifr->ifr_addr.sa_family == 0 &&
1254 			    ifr->ifr_addr.sa_len < 16) {
1255 				ifr->ifr_addr.sa_family = ifr->ifr_addr.sa_len;
1256 				ifr->ifr_addr.sa_len = 16;
1257 			}
1258 #else
1259 			if (ifr->ifr_addr.sa_len == 0)
1260 				ifr->ifr_addr.sa_len = 16;
1261 #endif
1262 			break;
1263 
1264 		case OSIOCGIFADDR:
1265 			cmd = SIOCGIFADDR;
1266 			break;
1267 
1268 		case OSIOCGIFDSTADDR:
1269 			cmd = SIOCGIFDSTADDR;
1270 			break;
1271 
1272 		case OSIOCGIFBRDADDR:
1273 			cmd = SIOCGIFBRDADDR;
1274 			break;
1275 
1276 		case OSIOCGIFNETMASK:
1277 			cmd = SIOCGIFNETMASK;
1278 		}
1279 		error =  so_pru_control(so, cmd, data, ifp, td);
1280 		switch (ocmd) {
1281 
1282 		case OSIOCGIFADDR:
1283 		case OSIOCGIFDSTADDR:
1284 		case OSIOCGIFBRDADDR:
1285 		case OSIOCGIFNETMASK:
1286 			*(u_short *)&ifr->ifr_addr = ifr->ifr_addr.sa_family;
1287 
1288 		}
1289 	    }
1290 #endif /* COMPAT_43 */
1291 
1292 		if ((oif_flags ^ ifp->if_flags) & IFF_UP) {
1293 #ifdef INET6
1294 			DELAY(100);/* XXX: temporary workaround for fxp issue*/
1295 			if (ifp->if_flags & IFF_UP) {
1296 				int s = splimp();
1297 				in6_if_up(ifp);
1298 				splx(s);
1299 			}
1300 #endif
1301 		}
1302 		return (error);
1303 
1304 	}
1305 	return (0);
1306 }
1307 
1308 /*
1309  * Set/clear promiscuous mode on interface ifp based on the truth value
1310  * of pswitch.  The calls are reference counted so that only the first
1311  * "on" request actually has an effect, as does the final "off" request.
1312  * Results are undefined if the "off" and "on" requests are not matched.
1313  */
1314 int
1315 ifpromisc(struct ifnet *ifp, int pswitch)
1316 {
1317 	struct ifreq ifr;
1318 	int error;
1319 	int oldflags;
1320 
1321 	oldflags = ifp->if_flags;
1322 	if (ifp->if_flags & IFF_PPROMISC) {
1323 		/* Do nothing if device is in permanently promiscuous mode */
1324 		ifp->if_pcount += pswitch ? 1 : -1;
1325 		return (0);
1326 	}
1327 	if (pswitch) {
1328 		/*
1329 		 * If the device is not configured up, we cannot put it in
1330 		 * promiscuous mode.
1331 		 */
1332 		if ((ifp->if_flags & IFF_UP) == 0)
1333 			return (ENETDOWN);
1334 		if (ifp->if_pcount++ != 0)
1335 			return (0);
1336 		ifp->if_flags |= IFF_PROMISC;
1337 		log(LOG_INFO, "%s: promiscuous mode enabled\n",
1338 		    ifp->if_xname);
1339 	} else {
1340 		if (--ifp->if_pcount > 0)
1341 			return (0);
1342 		ifp->if_flags &= ~IFF_PROMISC;
1343 		log(LOG_INFO, "%s: promiscuous mode disabled\n",
1344 		    ifp->if_xname);
1345 	}
1346 	ifr.ifr_flags = ifp->if_flags;
1347 	ifr.ifr_flagshigh = ifp->if_flags >> 16;
1348 	error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr,
1349 				 (struct ucred *)NULL);
1350 	if (error == 0)
1351 		rt_ifmsg(ifp);
1352 	else
1353 		ifp->if_flags = oldflags;
1354 	return error;
1355 }
1356 
1357 /*
1358  * Return interface configuration
1359  * of system.  List may be used
1360  * in later ioctl's (above) to get
1361  * other information.
1362  */
1363 static int
1364 ifconf(u_long cmd, caddr_t data, struct thread *td)
1365 {
1366 	struct ifconf *ifc = (struct ifconf *)data;
1367 	struct ifnet *ifp;
1368 	struct ifaddr *ifa;
1369 	struct sockaddr *sa;
1370 	struct ifreq ifr, *ifrp;
1371 	int space = ifc->ifc_len, error = 0;
1372 
1373 	ifrp = ifc->ifc_req;
1374 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
1375 		int addrs;
1376 
1377 		if (space <= sizeof ifr)
1378 			break;
1379 		if (strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name))
1380 		    >= sizeof(ifr.ifr_name)) {
1381 			error = ENAMETOOLONG;
1382 			break;
1383 		}
1384 
1385 		addrs = 0;
1386 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1387 			if (space <= sizeof ifr)
1388 				break;
1389 			sa = ifa->ifa_addr;
1390 			if (td->td_proc->p_ucred->cr_prison &&
1391 			    prison_if(td, sa))
1392 				continue;
1393 			addrs++;
1394 #ifdef COMPAT_43
1395 			if (cmd == OSIOCGIFCONF) {
1396 				struct osockaddr *osa =
1397 					 (struct osockaddr *)&ifr.ifr_addr;
1398 				ifr.ifr_addr = *sa;
1399 				osa->sa_family = sa->sa_family;
1400 				error = copyout(&ifr, ifrp, sizeof ifr);
1401 				ifrp++;
1402 			} else
1403 #endif
1404 			if (sa->sa_len <= sizeof(*sa)) {
1405 				ifr.ifr_addr = *sa;
1406 				error = copyout(&ifr, ifrp, sizeof ifr);
1407 				ifrp++;
1408 			} else {
1409 				if (space < (sizeof ifr) + sa->sa_len -
1410 					    sizeof(*sa))
1411 					break;
1412 				space -= sa->sa_len - sizeof(*sa);
1413 				error = copyout(&ifr, ifrp,
1414 						sizeof ifr.ifr_name);
1415 				if (error == 0)
1416 					error = copyout(sa, &ifrp->ifr_addr,
1417 							sa->sa_len);
1418 				ifrp = (struct ifreq *)
1419 					(sa->sa_len + (caddr_t)&ifrp->ifr_addr);
1420 			}
1421 			if (error)
1422 				break;
1423 			space -= sizeof ifr;
1424 		}
1425 		if (error)
1426 			break;
1427 		if (!addrs) {
1428 			bzero(&ifr.ifr_addr, sizeof ifr.ifr_addr);
1429 			error = copyout(&ifr, ifrp, sizeof ifr);
1430 			if (error)
1431 				break;
1432 			space -= sizeof ifr;
1433 			ifrp++;
1434 		}
1435 	}
1436 	ifc->ifc_len -= space;
1437 	return (error);
1438 }
1439 
1440 /*
1441  * Just like if_promisc(), but for all-multicast-reception mode.
1442  */
1443 int
1444 if_allmulti(struct ifnet *ifp, int onswitch)
1445 {
1446 	int error = 0;
1447 	int s = splimp();
1448 	struct ifreq ifr;
1449 
1450 	if (onswitch) {
1451 		if (ifp->if_amcount++ == 0) {
1452 			ifp->if_flags |= IFF_ALLMULTI;
1453 			ifr.ifr_flags = ifp->if_flags;
1454 			ifr.ifr_flagshigh = ifp->if_flags >> 16;
1455 			error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr,
1456 					      (struct ucred *)NULL);
1457 		}
1458 	} else {
1459 		if (ifp->if_amcount > 1) {
1460 			ifp->if_amcount--;
1461 		} else {
1462 			ifp->if_amcount = 0;
1463 			ifp->if_flags &= ~IFF_ALLMULTI;
1464 			ifr.ifr_flags = ifp->if_flags;
1465 			ifr.ifr_flagshigh = ifp->if_flags >> 16;
1466 			error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr,
1467 					      (struct ucred *)NULL);
1468 		}
1469 	}
1470 	splx(s);
1471 
1472 	if (error == 0)
1473 		rt_ifmsg(ifp);
1474 	return error;
1475 }
1476 
1477 /*
1478  * Add a multicast listenership to the interface in question.
1479  * The link layer provides a routine which converts
1480  */
1481 int
1482 if_addmulti(
1483 	struct ifnet *ifp,	/* interface to manipulate */
1484 	struct sockaddr *sa,	/* address to add */
1485 	struct ifmultiaddr **retifma)
1486 {
1487 	struct sockaddr *llsa, *dupsa;
1488 	int error, s;
1489 	struct ifmultiaddr *ifma;
1490 
1491 	/*
1492 	 * If the matching multicast address already exists
1493 	 * then don't add a new one, just add a reference
1494 	 */
1495 	LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1496 		if (sa_equal(sa, ifma->ifma_addr)) {
1497 			ifma->ifma_refcount++;
1498 			if (retifma)
1499 				*retifma = ifma;
1500 			return 0;
1501 		}
1502 	}
1503 
1504 	/*
1505 	 * Give the link layer a chance to accept/reject it, and also
1506 	 * find out which AF_LINK address this maps to, if it isn't one
1507 	 * already.
1508 	 */
1509 	if (ifp->if_resolvemulti) {
1510 		error = ifp->if_resolvemulti(ifp, &llsa, sa);
1511 		if (error) return error;
1512 	} else {
1513 		llsa = 0;
1514 	}
1515 
1516 	MALLOC(ifma, struct ifmultiaddr *, sizeof *ifma, M_IFMADDR, M_WAITOK);
1517 	MALLOC(dupsa, struct sockaddr *, sa->sa_len, M_IFMADDR, M_WAITOK);
1518 	bcopy(sa, dupsa, sa->sa_len);
1519 
1520 	ifma->ifma_addr = dupsa;
1521 	ifma->ifma_lladdr = llsa;
1522 	ifma->ifma_ifp = ifp;
1523 	ifma->ifma_refcount = 1;
1524 	ifma->ifma_protospec = 0;
1525 	rt_newmaddrmsg(RTM_NEWMADDR, ifma);
1526 
1527 	/*
1528 	 * Some network interfaces can scan the address list at
1529 	 * interrupt time; lock them out.
1530 	 */
1531 	s = splimp();
1532 	LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
1533 	splx(s);
1534 	*retifma = ifma;
1535 
1536 	if (llsa != 0) {
1537 		LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1538 			if (sa_equal(ifma->ifma_addr, llsa))
1539 				break;
1540 		}
1541 		if (ifma) {
1542 			ifma->ifma_refcount++;
1543 		} else {
1544 			MALLOC(ifma, struct ifmultiaddr *, sizeof *ifma,
1545 			       M_IFMADDR, M_WAITOK);
1546 			MALLOC(dupsa, struct sockaddr *, llsa->sa_len,
1547 			       M_IFMADDR, M_WAITOK);
1548 			bcopy(llsa, dupsa, llsa->sa_len);
1549 			ifma->ifma_addr = dupsa;
1550 			ifma->ifma_ifp = ifp;
1551 			ifma->ifma_refcount = 1;
1552 			s = splimp();
1553 			LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
1554 			splx(s);
1555 		}
1556 	}
1557 	/*
1558 	 * We are certain we have added something, so call down to the
1559 	 * interface to let them know about it.
1560 	 */
1561 	s = splimp();
1562 	ifp->if_ioctl(ifp, SIOCADDMULTI, 0, (struct ucred *)NULL);
1563 	splx(s);
1564 
1565 	return 0;
1566 }
1567 
1568 /*
1569  * Remove a reference to a multicast address on this interface.  Yell
1570  * if the request does not match an existing membership.
1571  */
1572 int
1573 if_delmulti(struct ifnet *ifp, struct sockaddr *sa)
1574 {
1575 	struct ifmultiaddr *ifma;
1576 	int s;
1577 
1578 	LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
1579 		if (sa_equal(sa, ifma->ifma_addr))
1580 			break;
1581 	if (ifma == 0)
1582 		return ENOENT;
1583 
1584 	if (ifma->ifma_refcount > 1) {
1585 		ifma->ifma_refcount--;
1586 		return 0;
1587 	}
1588 
1589 	rt_newmaddrmsg(RTM_DELMADDR, ifma);
1590 	sa = ifma->ifma_lladdr;
1591 	s = splimp();
1592 	LIST_REMOVE(ifma, ifma_link);
1593 	/*
1594 	 * Make sure the interface driver is notified
1595 	 * in the case of a link layer mcast group being left.
1596 	 */
1597 	if (ifma->ifma_addr->sa_family == AF_LINK && sa == 0)
1598 		ifp->if_ioctl(ifp, SIOCDELMULTI, 0, (struct ucred *)NULL);
1599 	splx(s);
1600 	free(ifma->ifma_addr, M_IFMADDR);
1601 	free(ifma, M_IFMADDR);
1602 	if (sa == 0)
1603 		return 0;
1604 
1605 	/*
1606 	 * Now look for the link-layer address which corresponds to
1607 	 * this network address.  It had been squirreled away in
1608 	 * ifma->ifma_lladdr for this purpose (so we don't have
1609 	 * to call ifp->if_resolvemulti() again), and we saved that
1610 	 * value in sa above.  If some nasty deleted the
1611 	 * link-layer address out from underneath us, we can deal because
1612 	 * the address we stored was is not the same as the one which was
1613 	 * in the record for the link-layer address.  (So we don't complain
1614 	 * in that case.)
1615 	 */
1616 	LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
1617 		if (sa_equal(sa, ifma->ifma_addr))
1618 			break;
1619 	if (ifma == 0)
1620 		return 0;
1621 
1622 	if (ifma->ifma_refcount > 1) {
1623 		ifma->ifma_refcount--;
1624 		return 0;
1625 	}
1626 
1627 	s = splimp();
1628 	LIST_REMOVE(ifma, ifma_link);
1629 	ifp->if_ioctl(ifp, SIOCDELMULTI, 0, (struct ucred *)NULL);
1630 	splx(s);
1631 	free(ifma->ifma_addr, M_IFMADDR);
1632 	free(sa, M_IFMADDR);
1633 	free(ifma, M_IFMADDR);
1634 
1635 	return 0;
1636 }
1637 
1638 /*
1639  * Set the link layer address on an interface.
1640  *
1641  * At this time we only support certain types of interfaces,
1642  * and we don't allow the length of the address to change.
1643  */
1644 int
1645 if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
1646 {
1647 	struct sockaddr_dl *sdl;
1648 	struct ifaddr *ifa;
1649 	struct ifreq ifr;
1650 
1651 	ifa = ifnet_addrs[ifp->if_index - 1];
1652 	if (ifa == NULL)
1653 		return (EINVAL);
1654 	sdl = (struct sockaddr_dl *)ifa->ifa_addr;
1655 	if (sdl == NULL)
1656 		return (EINVAL);
1657 	if (len != sdl->sdl_alen)	/* don't allow length to change */
1658 		return (EINVAL);
1659 	switch (ifp->if_type) {
1660 	case IFT_ETHER:			/* these types use struct arpcom */
1661 	case IFT_FDDI:
1662 	case IFT_XETHER:
1663 	case IFT_ISO88025:
1664 	case IFT_L2VLAN:
1665 		bcopy(lladdr, ((struct arpcom *)ifp->if_softc)->ac_enaddr, len);
1666 		/* FALLTHROUGH */
1667 	case IFT_ARCNET:
1668 		bcopy(lladdr, LLADDR(sdl), len);
1669 		break;
1670 	default:
1671 		return (ENODEV);
1672 	}
1673 	/*
1674 	 * If the interface is already up, we need
1675 	 * to re-init it in order to reprogram its
1676 	 * address filter.
1677 	 */
1678 	if ((ifp->if_flags & IFF_UP) != 0) {
1679 		ifp->if_flags &= ~IFF_UP;
1680 		ifr.ifr_flags = ifp->if_flags;
1681 		ifr.ifr_flagshigh = ifp->if_flags >> 16;
1682 		(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr,
1683 				 (struct ucred *)NULL);
1684 		ifp->if_flags |= IFF_UP;
1685 		ifr.ifr_flags = ifp->if_flags;
1686 		ifr.ifr_flagshigh = ifp->if_flags >> 16;
1687 		(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr,
1688 				 (struct ucred *)NULL);
1689 #ifdef INET
1690 		/*
1691 		 * Also send gratuitous ARPs to notify other nodes about
1692 		 * the address change.
1693 		 */
1694 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1695 			if (ifa->ifa_addr != NULL &&
1696 			    ifa->ifa_addr->sa_family == AF_INET)
1697 				arp_ifinit(ifp, ifa);
1698 		}
1699 #endif
1700 	}
1701 	return (0);
1702 }
1703 
1704 struct ifmultiaddr *
1705 ifmaof_ifpforaddr(struct sockaddr *sa, struct ifnet *ifp)
1706 {
1707 	struct ifmultiaddr *ifma;
1708 
1709 	LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
1710 		if (sa_equal(ifma->ifma_addr, sa))
1711 			break;
1712 
1713 	return ifma;
1714 }
1715 
1716 /*
1717  * The name argument must be a pointer to storage which will last as
1718  * long as the interface does.  For physical devices, the result of
1719  * device_get_name(dev) is a good choice and for pseudo-devices a
1720  * static string works well.
1721  */
1722 void
1723 if_initname(struct ifnet *ifp, const char *name, int unit)
1724 {
1725 	ifp->if_dname = name;
1726 	ifp->if_dunit = unit;
1727 	if (unit != IF_DUNIT_NONE)
1728 		snprintf(ifp->if_xname, IFNAMSIZ, "%s%d", name, unit);
1729 	else
1730 		strlcpy(ifp->if_xname, name, IFNAMSIZ);
1731 }
1732 
1733 int
1734 if_printf(struct ifnet *ifp, const char *fmt, ...)
1735 {
1736 	__va_list ap;
1737 	int retval;
1738 
1739 	retval = printf("%s: ", ifp->if_xname);
1740 	__va_start(ap, fmt);
1741 	retval += vprintf(fmt, ap);
1742 	__va_end(ap);
1743 	return (retval);
1744 }
1745 
1746 SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW, 0, "Link layers");
1747 SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW, 0, "Generic link-management");
1748