]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/if.c
Provide in the SCTP_SEND_FAILED and SCTP_SEND_FAILED_EVENT notifications
[FreeBSD/FreeBSD.git] / sys / net / if.c
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  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)if.c        8.5 (Berkeley) 1/9/95
30  * $FreeBSD$
31  */
32
33 #include "opt_compat.h"
34 #include "opt_inet6.h"
35 #include "opt_inet.h"
36
37 #include <sys/param.h>
38 #include <sys/types.h>
39 #include <sys/conf.h>
40 #include <sys/malloc.h>
41 #include <sys/sbuf.h>
42 #include <sys/bus.h>
43 #include <sys/mbuf.h>
44 #include <sys/systm.h>
45 #include <sys/priv.h>
46 #include <sys/proc.h>
47 #include <sys/socket.h>
48 #include <sys/socketvar.h>
49 #include <sys/protosw.h>
50 #include <sys/kernel.h>
51 #include <sys/lock.h>
52 #include <sys/refcount.h>
53 #include <sys/module.h>
54 #include <sys/rwlock.h>
55 #include <sys/sockio.h>
56 #include <sys/syslog.h>
57 #include <sys/sysctl.h>
58 #include <sys/taskqueue.h>
59 #include <sys/domain.h>
60 #include <sys/jail.h>
61 #include <sys/priv.h>
62
63 #include <machine/stdarg.h>
64 #include <vm/uma.h>
65
66 #include <net/if.h>
67 #include <net/if_arp.h>
68 #include <net/if_clone.h>
69 #include <net/if_dl.h>
70 #include <net/if_types.h>
71 #include <net/if_var.h>
72 #include <net/radix.h>
73 #include <net/route.h>
74 #include <net/vnet.h>
75
76 #if defined(INET) || defined(INET6)
77 /*XXX*/
78 #include <netinet/in.h>
79 #include <netinet/in_var.h>
80 #include <netinet/ip_carp.h>
81 #ifdef INET6
82 #include <netinet6/in6_var.h>
83 #include <netinet6/in6_ifattach.h>
84 #endif
85 #endif
86 #ifdef INET
87 #include <netinet/if_ether.h>
88 #endif
89
90 #include <security/mac/mac_framework.h>
91
92 #ifdef COMPAT_FREEBSD32
93 #include <sys/mount.h>
94 #include <compat/freebsd32/freebsd32.h>
95 #endif
96
97 struct ifindex_entry {
98         struct  ifnet *ife_ifnet;
99 };
100
101 SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW, 0, "Link layers");
102 SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW, 0, "Generic link-management");
103
104 TUNABLE_INT("net.link.ifqmaxlen", &ifqmaxlen);
105 SYSCTL_INT(_net_link, OID_AUTO, ifqmaxlen, CTLFLAG_RDTUN,
106     &ifqmaxlen, 0, "max send queue size");
107
108 /* Log link state change events */
109 static int log_link_state_change = 1;
110
111 SYSCTL_INT(_net_link, OID_AUTO, log_link_state_change, CTLFLAG_RW,
112         &log_link_state_change, 0,
113         "log interface link state change events");
114
115 /* Interface description */
116 static unsigned int ifdescr_maxlen = 1024;
117 SYSCTL_UINT(_net, OID_AUTO, ifdescr_maxlen, CTLFLAG_RW,
118         &ifdescr_maxlen, 0,
119         "administrative maximum length for interface description");
120
121 static MALLOC_DEFINE(M_IFDESCR, "ifdescr", "ifnet descriptions");
122
123 /* global sx for non-critical path ifdescr */
124 static struct sx ifdescr_sx;
125 SX_SYSINIT(ifdescr_sx, &ifdescr_sx, "ifnet descr");
126
127 void    (*bridge_linkstate_p)(struct ifnet *ifp);
128 void    (*ng_ether_link_state_p)(struct ifnet *ifp, int state);
129 void    (*lagg_linkstate_p)(struct ifnet *ifp, int state);
130 /* These are external hooks for CARP. */
131 void    (*carp_linkstate_p)(struct ifnet *ifp);
132 void    (*carp_demote_adj_p)(int, char *);
133 #if defined(INET) || defined(INET6)
134 int     (*carp_forus_p)(struct ifnet *ifp, u_char *dhost);
135 int     (*carp_output_p)(struct ifnet *ifp, struct mbuf *m,
136     struct sockaddr *sa);
137 int     (*carp_ioctl_p)(struct ifreq *, u_long, struct thread *);   
138 int     (*carp_attach_p)(struct ifaddr *, int);
139 void    (*carp_detach_p)(struct ifaddr *);
140 #endif
141 #ifdef INET
142 int     (*carp_iamatch_p)(struct ifaddr *, uint8_t **);
143 #endif
144 #ifdef INET6
145 struct ifaddr *(*carp_iamatch6_p)(struct ifnet *ifp, struct in6_addr *taddr6);
146 caddr_t (*carp_macmatch6_p)(struct ifnet *ifp, struct mbuf *m,
147     const struct in6_addr *taddr);
148 #endif
149
150 struct mbuf *(*tbr_dequeue_ptr)(struct ifaltq *, int) = NULL;
151
152 /*
153  * XXX: Style; these should be sorted alphabetically, and unprototyped
154  * static functions should be prototyped. Currently they are sorted by
155  * declaration order.
156  */
157 static void     if_attachdomain(void *);
158 static void     if_attachdomain1(struct ifnet *);
159 static int      ifconf(u_long, caddr_t);
160 static void     if_freemulti(struct ifmultiaddr *);
161 static void     if_init(void *);
162 static void     if_grow(void);
163 static void     if_route(struct ifnet *, int flag, int fam);
164 static int      if_setflag(struct ifnet *, int, int, int *, int);
165 static int      if_transmit(struct ifnet *ifp, struct mbuf *m);
166 static void     if_unroute(struct ifnet *, int flag, int fam);
167 static void     link_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
168 static int      if_rtdel(struct radix_node *, void *);
169 static int      ifhwioctl(u_long, struct ifnet *, caddr_t, struct thread *);
170 static int      if_delmulti_locked(struct ifnet *, struct ifmultiaddr *, int);
171 static void     do_link_state_change(void *, int);
172 static int      if_getgroup(struct ifgroupreq *, struct ifnet *);
173 static int      if_getgroupmembers(struct ifgroupreq *);
174 static void     if_delgroups(struct ifnet *);
175 static void     if_attach_internal(struct ifnet *, int);
176 static void     if_detach_internal(struct ifnet *, int);
177
178 #ifdef INET6
179 /*
180  * XXX: declare here to avoid to include many inet6 related files..
181  * should be more generalized?
182  */
183 extern void     nd6_setmtu(struct ifnet *);
184 #endif
185
186 VNET_DEFINE(int, if_index);
187 int     ifqmaxlen = IFQ_MAXLEN;
188 VNET_DEFINE(struct ifnethead, ifnet);   /* depend on static init XXX */
189 VNET_DEFINE(struct ifgrouphead, ifg_head);
190
191 static VNET_DEFINE(int, if_indexlim) = 8;
192
193 /* Table of ifnet by index. */
194 VNET_DEFINE(struct ifindex_entry *, ifindex_table);
195
196 #define V_if_indexlim           VNET(if_indexlim)
197 #define V_ifindex_table         VNET(ifindex_table)
198
199 /*
200  * The global network interface list (V_ifnet) and related state (such as
201  * if_index, if_indexlim, and ifindex_table) are protected by an sxlock and
202  * an rwlock.  Either may be acquired shared to stablize the list, but both
203  * must be acquired writable to modify the list.  This model allows us to
204  * both stablize the interface list during interrupt thread processing, but
205  * also to stablize it over long-running ioctls, without introducing priority
206  * inversions and deadlocks.
207  */
208 struct rwlock ifnet_rwlock;
209 struct sx ifnet_sxlock;
210
211 /*
212  * The allocation of network interfaces is a rather non-atomic affair; we
213  * need to select an index before we are ready to expose the interface for
214  * use, so will use this pointer value to indicate reservation.
215  */
216 #define IFNET_HOLD      (void *)(uintptr_t)(-1)
217
218 static  if_com_alloc_t *if_com_alloc[256];
219 static  if_com_free_t *if_com_free[256];
220
221 static MALLOC_DEFINE(M_IFNET, "ifnet", "interface internals");
222 MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
223 MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
224
225 struct ifnet *
226 ifnet_byindex_locked(u_short idx)
227 {
228
229         if (idx > V_if_index)
230                 return (NULL);
231         if (V_ifindex_table[idx].ife_ifnet == IFNET_HOLD)
232                 return (NULL);
233         return (V_ifindex_table[idx].ife_ifnet);
234 }
235
236 struct ifnet *
237 ifnet_byindex(u_short idx)
238 {
239         struct ifnet *ifp;
240
241         IFNET_RLOCK_NOSLEEP();
242         ifp = ifnet_byindex_locked(idx);
243         IFNET_RUNLOCK_NOSLEEP();
244         return (ifp);
245 }
246
247 struct ifnet *
248 ifnet_byindex_ref(u_short idx)
249 {
250         struct ifnet *ifp;
251
252         IFNET_RLOCK_NOSLEEP();
253         ifp = ifnet_byindex_locked(idx);
254         if (ifp == NULL || (ifp->if_flags & IFF_DYING)) {
255                 IFNET_RUNLOCK_NOSLEEP();
256                 return (NULL);
257         }
258         if_ref(ifp);
259         IFNET_RUNLOCK_NOSLEEP();
260         return (ifp);
261 }
262
263 /*
264  * Allocate an ifindex array entry; return 0 on success or an error on
265  * failure.
266  */
267 static int
268 ifindex_alloc_locked(u_short *idxp)
269 {
270         u_short idx;
271
272         IFNET_WLOCK_ASSERT();
273
274 retry:
275         /*
276          * Try to find an empty slot below V_if_index.  If we fail, take the
277          * next slot.
278          */
279         for (idx = 1; idx <= V_if_index; idx++) {
280                 if (V_ifindex_table[idx].ife_ifnet == NULL)
281                         break;
282         }
283
284         /* Catch if_index overflow. */
285         if (idx < 1)
286                 return (ENOSPC);
287         if (idx >= V_if_indexlim) {
288                 if_grow();
289                 goto retry;
290         }
291         if (idx > V_if_index)
292                 V_if_index = idx;
293         *idxp = idx;
294         return (0);
295 }
296
297 static void
298 ifindex_free_locked(u_short idx)
299 {
300
301         IFNET_WLOCK_ASSERT();
302
303         V_ifindex_table[idx].ife_ifnet = NULL;
304         while (V_if_index > 0 &&
305             V_ifindex_table[V_if_index].ife_ifnet == NULL)
306                 V_if_index--;
307 }
308
309 static void
310 ifindex_free(u_short idx)
311 {
312
313         IFNET_WLOCK();
314         ifindex_free_locked(idx);
315         IFNET_WUNLOCK();
316 }
317
318 static void
319 ifnet_setbyindex_locked(u_short idx, struct ifnet *ifp)
320 {
321
322         IFNET_WLOCK_ASSERT();
323
324         V_ifindex_table[idx].ife_ifnet = ifp;
325 }
326
327 static void
328 ifnet_setbyindex(u_short idx, struct ifnet *ifp)
329 {
330
331         IFNET_WLOCK();
332         ifnet_setbyindex_locked(idx, ifp);
333         IFNET_WUNLOCK();
334 }
335
336 struct ifaddr *
337 ifaddr_byindex(u_short idx)
338 {
339         struct ifaddr *ifa;
340
341         IFNET_RLOCK_NOSLEEP();
342         ifa = ifnet_byindex_locked(idx)->if_addr;
343         if (ifa != NULL)
344                 ifa_ref(ifa);
345         IFNET_RUNLOCK_NOSLEEP();
346         return (ifa);
347 }
348
349 /*
350  * Network interface utility routines.
351  *
352  * Routines with ifa_ifwith* names take sockaddr *'s as
353  * parameters.
354  */
355
356 static void
357 vnet_if_init(const void *unused __unused)
358 {
359
360         TAILQ_INIT(&V_ifnet);
361         TAILQ_INIT(&V_ifg_head);
362         IFNET_WLOCK();
363         if_grow();                              /* create initial table */
364         IFNET_WUNLOCK();
365         vnet_if_clone_init();
366 }
367 VNET_SYSINIT(vnet_if_init, SI_SUB_INIT_IF, SI_ORDER_SECOND, vnet_if_init,
368     NULL);
369
370 /* ARGSUSED*/
371 static void
372 if_init(void *dummy __unused)
373 {
374
375         IFNET_LOCK_INIT();
376         if_clone_init();
377 }
378 SYSINIT(interfaces, SI_SUB_INIT_IF, SI_ORDER_FIRST, if_init, NULL);
379
380
381 #ifdef VIMAGE
382 static void
383 vnet_if_uninit(const void *unused __unused)
384 {
385
386         VNET_ASSERT(TAILQ_EMPTY(&V_ifnet), ("%s:%d tailq &V_ifnet=%p "
387             "not empty", __func__, __LINE__, &V_ifnet));
388         VNET_ASSERT(TAILQ_EMPTY(&V_ifg_head), ("%s:%d tailq &V_ifg_head=%p "
389             "not empty", __func__, __LINE__, &V_ifg_head));
390
391         free((caddr_t)V_ifindex_table, M_IFNET);
392 }
393 VNET_SYSUNINIT(vnet_if_uninit, SI_SUB_INIT_IF, SI_ORDER_FIRST,
394     vnet_if_uninit, NULL);
395 #endif
396
397 static void
398 if_grow(void)
399 {
400         int oldlim;
401         u_int n;
402         struct ifindex_entry *e;
403
404         IFNET_WLOCK_ASSERT();
405         oldlim = V_if_indexlim;
406         IFNET_WUNLOCK();
407         n = (oldlim << 1) * sizeof(*e);
408         e = malloc(n, M_IFNET, M_WAITOK | M_ZERO);
409         IFNET_WLOCK();
410         if (V_if_indexlim != oldlim) {
411                 free(e, M_IFNET);
412                 return;
413         }
414         if (V_ifindex_table != NULL) {
415                 memcpy((caddr_t)e, (caddr_t)V_ifindex_table, n/2);
416                 free((caddr_t)V_ifindex_table, M_IFNET);
417         }
418         V_if_indexlim <<= 1;
419         V_ifindex_table = e;
420 }
421
422 /*
423  * Allocate a struct ifnet and an index for an interface.  A layer 2
424  * common structure will also be allocated if an allocation routine is
425  * registered for the passed type.
426  */
427 struct ifnet *
428 if_alloc(u_char type)
429 {
430         struct ifnet *ifp;
431         u_short idx;
432
433         ifp = malloc(sizeof(struct ifnet), M_IFNET, M_WAITOK|M_ZERO);
434         IFNET_WLOCK();
435         if (ifindex_alloc_locked(&idx) != 0) {
436                 IFNET_WUNLOCK();
437                 free(ifp, M_IFNET);
438                 return (NULL);
439         }
440         ifnet_setbyindex_locked(idx, IFNET_HOLD);
441         IFNET_WUNLOCK();
442         ifp->if_index = idx;
443         ifp->if_type = type;
444         ifp->if_alloctype = type;
445         if (if_com_alloc[type] != NULL) {
446                 ifp->if_l2com = if_com_alloc[type](type, ifp);
447                 if (ifp->if_l2com == NULL) {
448                         free(ifp, M_IFNET);
449                         ifindex_free(idx);
450                         return (NULL);
451                 }
452         }
453
454         IF_ADDR_LOCK_INIT(ifp);
455         TASK_INIT(&ifp->if_linktask, 0, do_link_state_change, ifp);
456         ifp->if_afdata_initialized = 0;
457         IF_AFDATA_LOCK_INIT(ifp);
458         TAILQ_INIT(&ifp->if_addrhead);
459         TAILQ_INIT(&ifp->if_multiaddrs);
460         TAILQ_INIT(&ifp->if_groups);
461 #ifdef MAC
462         mac_ifnet_init(ifp);
463 #endif
464         ifq_init(&ifp->if_snd, ifp);
465
466         refcount_init(&ifp->if_refcount, 1);    /* Index reference. */
467         ifnet_setbyindex(ifp->if_index, ifp);
468         return (ifp);
469 }
470
471 /*
472  * Do the actual work of freeing a struct ifnet, and layer 2 common
473  * structure.  This call is made when the last reference to an
474  * interface is released.
475  */
476 static void
477 if_free_internal(struct ifnet *ifp)
478 {
479
480         KASSERT((ifp->if_flags & IFF_DYING),
481             ("if_free_internal: interface not dying"));
482
483         if (if_com_free[ifp->if_alloctype] != NULL)
484                 if_com_free[ifp->if_alloctype](ifp->if_l2com,
485                     ifp->if_alloctype);
486
487 #ifdef MAC
488         mac_ifnet_destroy(ifp);
489 #endif /* MAC */
490         if (ifp->if_description != NULL)
491                 free(ifp->if_description, M_IFDESCR);
492         IF_AFDATA_DESTROY(ifp);
493         IF_ADDR_LOCK_DESTROY(ifp);
494         ifq_delete(&ifp->if_snd);
495         free(ifp, M_IFNET);
496 }
497
498 /*
499  * Deregister an interface and free the associated storage.
500  */
501 void
502 if_free(struct ifnet *ifp)
503 {
504
505         ifp->if_flags |= IFF_DYING;                     /* XXX: Locking */
506
507         IFNET_WLOCK();
508         KASSERT(ifp == ifnet_byindex_locked(ifp->if_index),
509             ("%s: freeing unallocated ifnet", ifp->if_xname));
510
511         ifindex_free_locked(ifp->if_index);
512         IFNET_WUNLOCK();
513
514         if (!refcount_release(&ifp->if_refcount))
515                 return;
516         if_free_internal(ifp);
517 }
518
519 /*
520  * Interfaces to keep an ifnet type-stable despite the possibility of the
521  * driver calling if_free().  If there are additional references, we defer
522  * freeing the underlying data structure.
523  */
524 void
525 if_ref(struct ifnet *ifp)
526 {
527
528         /* We don't assert the ifnet list lock here, but arguably should. */
529         refcount_acquire(&ifp->if_refcount);
530 }
531
532 void
533 if_rele(struct ifnet *ifp)
534 {
535
536         if (!refcount_release(&ifp->if_refcount))
537                 return;
538         if_free_internal(ifp);
539 }
540
541 void
542 ifq_init(struct ifaltq *ifq, struct ifnet *ifp)
543 {
544         
545         mtx_init(&ifq->ifq_mtx, ifp->if_xname, "if send queue", MTX_DEF);
546
547         if (ifq->ifq_maxlen == 0) 
548                 ifq->ifq_maxlen = ifqmaxlen;
549
550         ifq->altq_type = 0;
551         ifq->altq_disc = NULL;
552         ifq->altq_flags &= ALTQF_CANTCHANGE;
553         ifq->altq_tbr  = NULL;
554         ifq->altq_ifp  = ifp;
555 }
556
557 void
558 ifq_delete(struct ifaltq *ifq)
559 {
560         mtx_destroy(&ifq->ifq_mtx);
561 }
562
563 /*
564  * Perform generic interface initalization tasks and attach the interface
565  * to the list of "active" interfaces.  If vmove flag is set on entry
566  * to if_attach_internal(), perform only a limited subset of initialization
567  * tasks, given that we are moving from one vnet to another an ifnet which
568  * has already been fully initialized.
569  *
570  * XXX:
571  *  - The decision to return void and thus require this function to
572  *    succeed is questionable.
573  *  - We should probably do more sanity checking.  For instance we don't
574  *    do anything to insure if_xname is unique or non-empty.
575  */
576 void
577 if_attach(struct ifnet *ifp)
578 {
579
580         if_attach_internal(ifp, 0);
581 }
582
583 static void
584 if_attach_internal(struct ifnet *ifp, int vmove)
585 {
586         unsigned socksize, ifasize;
587         int namelen, masklen;
588         struct sockaddr_dl *sdl;
589         struct ifaddr *ifa;
590
591         if (ifp->if_index == 0 || ifp != ifnet_byindex(ifp->if_index))
592                 panic ("%s: BUG: if_attach called without if_alloc'd input()\n",
593                     ifp->if_xname);
594
595 #ifdef VIMAGE
596         ifp->if_vnet = curvnet;
597         if (ifp->if_home_vnet == NULL)
598                 ifp->if_home_vnet = curvnet;
599 #endif
600
601         if_addgroup(ifp, IFG_ALL);
602
603         getmicrotime(&ifp->if_lastchange);
604         ifp->if_data.ifi_epoch = time_uptime;
605         ifp->if_data.ifi_datalen = sizeof(struct if_data);
606
607         KASSERT((ifp->if_transmit == NULL && ifp->if_qflush == NULL) ||
608             (ifp->if_transmit != NULL && ifp->if_qflush != NULL),
609             ("transmit and qflush must both either be set or both be NULL"));
610         if (ifp->if_transmit == NULL) {
611                 ifp->if_transmit = if_transmit;
612                 ifp->if_qflush = if_qflush;
613         }
614         
615         if (!vmove) {
616 #ifdef MAC
617                 mac_ifnet_create(ifp);
618 #endif
619
620                 /*
621                  * Create a Link Level name for this device.
622                  */
623                 namelen = strlen(ifp->if_xname);
624                 /*
625                  * Always save enough space for any possiable name so we
626                  * can do a rename in place later.
627                  */
628                 masklen = offsetof(struct sockaddr_dl, sdl_data[0]) + IFNAMSIZ;
629                 socksize = masklen + ifp->if_addrlen;
630                 if (socksize < sizeof(*sdl))
631                         socksize = sizeof(*sdl);
632                 socksize = roundup2(socksize, sizeof(long));
633                 ifasize = sizeof(*ifa) + 2 * socksize;
634                 ifa = malloc(ifasize, M_IFADDR, M_WAITOK | M_ZERO);
635                 ifa_init(ifa);
636                 sdl = (struct sockaddr_dl *)(ifa + 1);
637                 sdl->sdl_len = socksize;
638                 sdl->sdl_family = AF_LINK;
639                 bcopy(ifp->if_xname, sdl->sdl_data, namelen);
640                 sdl->sdl_nlen = namelen;
641                 sdl->sdl_index = ifp->if_index;
642                 sdl->sdl_type = ifp->if_type;
643                 ifp->if_addr = ifa;
644                 ifa->ifa_ifp = ifp;
645                 ifa->ifa_rtrequest = link_rtrequest;
646                 ifa->ifa_addr = (struct sockaddr *)sdl;
647                 sdl = (struct sockaddr_dl *)(socksize + (caddr_t)sdl);
648                 ifa->ifa_netmask = (struct sockaddr *)sdl;
649                 sdl->sdl_len = masklen;
650                 while (namelen != 0)
651                         sdl->sdl_data[--namelen] = 0xff;
652                 TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
653                 /* Reliably crash if used uninitialized. */
654                 ifp->if_broadcastaddr = NULL;
655         }
656 #ifdef VIMAGE
657         else {
658                 /*
659                  * Update the interface index in the link layer address
660                  * of the interface.
661                  */
662                 for (ifa = ifp->if_addr; ifa != NULL;
663                     ifa = TAILQ_NEXT(ifa, ifa_link)) {
664                         if (ifa->ifa_addr->sa_family == AF_LINK) {
665                                 sdl = (struct sockaddr_dl *)ifa->ifa_addr;
666                                 sdl->sdl_index = ifp->if_index;
667                         }
668                 }
669         }
670 #endif
671
672         IFNET_WLOCK();
673         TAILQ_INSERT_TAIL(&V_ifnet, ifp, if_link);
674 #ifdef VIMAGE
675         curvnet->vnet_ifcnt++;
676 #endif
677         IFNET_WUNLOCK();
678
679         if (domain_init_status >= 2)
680                 if_attachdomain1(ifp);
681
682         EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp);
683         if (IS_DEFAULT_VNET(curvnet))
684                 devctl_notify("IFNET", ifp->if_xname, "ATTACH", NULL);
685
686         /* Announce the interface. */
687         rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
688 }
689
690 static void
691 if_attachdomain(void *dummy)
692 {
693         struct ifnet *ifp;
694         int s;
695
696         s = splnet();
697         TAILQ_FOREACH(ifp, &V_ifnet, if_link)
698                 if_attachdomain1(ifp);
699         splx(s);
700 }
701 SYSINIT(domainifattach, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_SECOND,
702     if_attachdomain, NULL);
703
704 static void
705 if_attachdomain1(struct ifnet *ifp)
706 {
707         struct domain *dp;
708         int s;
709
710         s = splnet();
711
712         /*
713          * Since dp->dom_ifattach calls malloc() with M_WAITOK, we
714          * cannot lock ifp->if_afdata initialization, entirely.
715          */
716         if (IF_AFDATA_TRYLOCK(ifp) == 0) {
717                 splx(s);
718                 return;
719         }
720         if (ifp->if_afdata_initialized >= domain_init_status) {
721                 IF_AFDATA_UNLOCK(ifp);
722                 splx(s);
723                 printf("if_attachdomain called more than once on %s\n",
724                     ifp->if_xname);
725                 return;
726         }
727         ifp->if_afdata_initialized = domain_init_status;
728         IF_AFDATA_UNLOCK(ifp);
729
730         /* address family dependent data region */
731         bzero(ifp->if_afdata, sizeof(ifp->if_afdata));
732         for (dp = domains; dp; dp = dp->dom_next) {
733                 if (dp->dom_ifattach)
734                         ifp->if_afdata[dp->dom_family] =
735                             (*dp->dom_ifattach)(ifp);
736         }
737
738         splx(s);
739 }
740
741 /*
742  * Remove any unicast or broadcast network addresses from an interface.
743  */
744 void
745 if_purgeaddrs(struct ifnet *ifp)
746 {
747         struct ifaddr *ifa, *next;
748
749         TAILQ_FOREACH_SAFE(ifa, &ifp->if_addrhead, ifa_link, next) {
750                 if (ifa->ifa_addr->sa_family == AF_LINK)
751                         continue;
752 #ifdef INET
753                 /* XXX: Ugly!! ad hoc just for INET */
754                 if (ifa->ifa_addr->sa_family == AF_INET) {
755                         struct ifaliasreq ifr;
756
757                         bzero(&ifr, sizeof(ifr));
758                         ifr.ifra_addr = *ifa->ifa_addr;
759                         if (ifa->ifa_dstaddr)
760                                 ifr.ifra_broadaddr = *ifa->ifa_dstaddr;
761                         if (in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr, ifp,
762                             NULL) == 0)
763                                 continue;
764                 }
765 #endif /* INET */
766 #ifdef INET6
767                 if (ifa->ifa_addr->sa_family == AF_INET6) {
768                         in6_purgeaddr(ifa);
769                         /* ifp_addrhead is already updated */
770                         continue;
771                 }
772 #endif /* INET6 */
773                 TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
774                 ifa_free(ifa);
775         }
776 }
777
778 /*
779  * Remove any multicast network addresses from an interface when an ifnet
780  * is going away.
781  */
782 static void
783 if_purgemaddrs(struct ifnet *ifp)
784 {
785         struct ifmultiaddr *ifma;
786         struct ifmultiaddr *next;
787
788         IF_ADDR_WLOCK(ifp);
789         TAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next)
790                 if_delmulti_locked(ifp, ifma, 1);
791         IF_ADDR_WUNLOCK(ifp);
792 }
793
794 /*
795  * Detach an interface, removing it from the list of "active" interfaces.
796  * If vmove flag is set on entry to if_detach_internal(), perform only a
797  * limited subset of cleanup tasks, given that we are moving an ifnet from
798  * one vnet to another, where it must be fully operational.
799  *
800  * XXXRW: There are some significant questions about event ordering, and
801  * how to prevent things from starting to use the interface during detach.
802  */
803 void
804 if_detach(struct ifnet *ifp)
805 {
806
807         if_detach_internal(ifp, 0);
808 }
809
810 static void
811 if_detach_internal(struct ifnet *ifp, int vmove)
812 {
813         struct ifaddr *ifa;
814         struct radix_node_head  *rnh;
815         int i, j;
816         struct domain *dp;
817         struct ifnet *iter;
818         int found = 0;
819
820         IFNET_WLOCK();
821         TAILQ_FOREACH(iter, &V_ifnet, if_link)
822                 if (iter == ifp) {
823                         TAILQ_REMOVE(&V_ifnet, ifp, if_link);
824                         found = 1;
825                         break;
826                 }
827 #ifdef VIMAGE
828         if (found)
829                 curvnet->vnet_ifcnt--;
830 #endif
831         IFNET_WUNLOCK();
832         if (!found) {
833                 if (vmove)
834                         panic("%s: ifp=%p not on the ifnet tailq %p",
835                             __func__, ifp, &V_ifnet);
836                 else
837                         return; /* XXX this should panic as well? */
838         }
839
840         /*
841          * Remove/wait for pending events.
842          */
843         taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
844
845         /*
846          * Remove routes and flush queues.
847          */
848         if_down(ifp);
849 #ifdef ALTQ
850         if (ALTQ_IS_ENABLED(&ifp->if_snd))
851                 altq_disable(&ifp->if_snd);
852         if (ALTQ_IS_ATTACHED(&ifp->if_snd))
853                 altq_detach(&ifp->if_snd);
854 #endif
855
856         if_purgeaddrs(ifp);
857
858 #ifdef INET
859         in_ifdetach(ifp);
860 #endif
861
862 #ifdef INET6
863         /*
864          * Remove all IPv6 kernel structs related to ifp.  This should be done
865          * before removing routing entries below, since IPv6 interface direct
866          * routes are expected to be removed by the IPv6-specific kernel API.
867          * Otherwise, the kernel will detect some inconsistency and bark it.
868          */
869         in6_ifdetach(ifp);
870 #endif
871         if_purgemaddrs(ifp);
872
873         if (!vmove) {
874                 /*
875                  * Prevent further calls into the device driver via ifnet.
876                  */
877                 if_dead(ifp);
878
879                 /*
880                  * Remove link ifaddr pointer and maybe decrement if_index.
881                  * Clean up all addresses.
882                  */
883                 ifp->if_addr = NULL;
884
885                 /* We can now free link ifaddr. */
886                 if (!TAILQ_EMPTY(&ifp->if_addrhead)) {
887                         ifa = TAILQ_FIRST(&ifp->if_addrhead);
888                         TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
889                         ifa_free(ifa);
890                 }
891         }
892
893         /*
894          * Delete all remaining routes using this interface
895          * Unfortuneatly the only way to do this is to slog through
896          * the entire routing table looking for routes which point
897          * to this interface...oh well...
898          */
899         for (i = 1; i <= AF_MAX; i++) {
900                 for (j = 0; j < rt_numfibs; j++) {
901                         rnh = rt_tables_get_rnh(j, i);
902                         if (rnh == NULL)
903                                 continue;
904                         RADIX_NODE_HEAD_LOCK(rnh);
905                         (void) rnh->rnh_walktree(rnh, if_rtdel, ifp);
906                         RADIX_NODE_HEAD_UNLOCK(rnh);
907                 }
908         }
909
910         /* Announce that the interface is gone. */
911         rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
912         EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
913         if (IS_DEFAULT_VNET(curvnet))
914                 devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL);
915         if_delgroups(ifp);
916
917         /*
918          * We cannot hold the lock over dom_ifdetach calls as they might
919          * sleep, for example trying to drain a callout, thus open up the
920          * theoretical race with re-attaching.
921          */
922         IF_AFDATA_LOCK(ifp);
923         i = ifp->if_afdata_initialized;
924         ifp->if_afdata_initialized = 0;
925         IF_AFDATA_UNLOCK(ifp);
926         for (dp = domains; i > 0 && dp; dp = dp->dom_next) {
927                 if (dp->dom_ifdetach && ifp->if_afdata[dp->dom_family])
928                         (*dp->dom_ifdetach)(ifp,
929                             ifp->if_afdata[dp->dom_family]);
930         }
931 }
932
933 #ifdef VIMAGE
934 /*
935  * if_vmove() performs a limited version of if_detach() in current
936  * vnet and if_attach()es the ifnet to the vnet specified as 2nd arg.
937  * An attempt is made to shrink if_index in current vnet, find an
938  * unused if_index in target vnet and calls if_grow() if necessary,
939  * and finally find an unused if_xname for the target vnet.
940  */
941 void
942 if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
943 {
944         u_short idx;
945
946         /*
947          * Detach from current vnet, but preserve LLADDR info, do not
948          * mark as dead etc. so that the ifnet can be reattached later.
949          */
950         if_detach_internal(ifp, 1);
951
952         /*
953          * Unlink the ifnet from ifindex_table[] in current vnet, and shrink
954          * the if_index for that vnet if possible.
955          *
956          * NOTE: IFNET_WLOCK/IFNET_WUNLOCK() are assumed to be unvirtualized,
957          * or we'd lock on one vnet and unlock on another.
958          */
959         IFNET_WLOCK();
960         ifindex_free_locked(ifp->if_index);
961         IFNET_WUNLOCK();
962
963         /*
964          * Perform interface-specific reassignment tasks, if provided by
965          * the driver.
966          */
967         if (ifp->if_reassign != NULL)
968                 ifp->if_reassign(ifp, new_vnet, NULL);
969
970         /*
971          * Switch to the context of the target vnet.
972          */
973         CURVNET_SET_QUIET(new_vnet);
974
975         IFNET_WLOCK();
976         if (ifindex_alloc_locked(&idx) != 0) {
977                 IFNET_WUNLOCK();
978                 panic("if_index overflow");
979         }
980         ifp->if_index = idx;
981         ifnet_setbyindex_locked(ifp->if_index, ifp);
982         IFNET_WUNLOCK();
983
984         if_attach_internal(ifp, 1);
985
986         CURVNET_RESTORE();
987 }
988
989 /*
990  * Move an ifnet to or from another child prison/vnet, specified by the jail id.
991  */
992 static int
993 if_vmove_loan(struct thread *td, struct ifnet *ifp, char *ifname, int jid)
994 {
995         struct prison *pr;
996         struct ifnet *difp;
997
998         /* Try to find the prison within our visibility. */
999         sx_slock(&allprison_lock);
1000         pr = prison_find_child(td->td_ucred->cr_prison, jid);
1001         sx_sunlock(&allprison_lock);
1002         if (pr == NULL)
1003                 return (ENXIO);
1004         prison_hold_locked(pr);
1005         mtx_unlock(&pr->pr_mtx);
1006
1007         /* Do not try to move the iface from and to the same prison. */
1008         if (pr->pr_vnet == ifp->if_vnet) {
1009                 prison_free(pr);
1010                 return (EEXIST);
1011         }
1012
1013         /* Make sure the named iface does not exists in the dst. prison/vnet. */
1014         /* XXX Lock interfaces to avoid races. */
1015         CURVNET_SET_QUIET(pr->pr_vnet);
1016         difp = ifunit(ifname);
1017         CURVNET_RESTORE();
1018         if (difp != NULL) {
1019                 prison_free(pr);
1020                 return (EEXIST);
1021         }
1022
1023         /* Move the interface into the child jail/vnet. */
1024         if_vmove(ifp, pr->pr_vnet);
1025
1026         /* Report the new if_xname back to the userland. */
1027         sprintf(ifname, "%s", ifp->if_xname);
1028
1029         prison_free(pr);
1030         return (0);
1031 }
1032
1033 static int
1034 if_vmove_reclaim(struct thread *td, char *ifname, int jid)
1035 {
1036         struct prison *pr;
1037         struct vnet *vnet_dst;
1038         struct ifnet *ifp;
1039
1040         /* Try to find the prison within our visibility. */
1041         sx_slock(&allprison_lock);
1042         pr = prison_find_child(td->td_ucred->cr_prison, jid);
1043         sx_sunlock(&allprison_lock);
1044         if (pr == NULL)
1045                 return (ENXIO);
1046         prison_hold_locked(pr);
1047         mtx_unlock(&pr->pr_mtx);
1048
1049         /* Make sure the named iface exists in the source prison/vnet. */
1050         CURVNET_SET(pr->pr_vnet);
1051         ifp = ifunit(ifname);           /* XXX Lock to avoid races. */
1052         if (ifp == NULL) {
1053                 CURVNET_RESTORE();
1054                 prison_free(pr);
1055                 return (ENXIO);
1056         }
1057
1058         /* Do not try to move the iface from and to the same prison. */
1059         vnet_dst = TD_TO_VNET(td);
1060         if (vnet_dst == ifp->if_vnet) {
1061                 CURVNET_RESTORE();
1062                 prison_free(pr);
1063                 return (EEXIST);
1064         }
1065
1066         /* Get interface back from child jail/vnet. */
1067         if_vmove(ifp, vnet_dst);
1068         CURVNET_RESTORE();
1069
1070         /* Report the new if_xname back to the userland. */
1071         sprintf(ifname, "%s", ifp->if_xname);
1072
1073         prison_free(pr);
1074         return (0);
1075 }
1076 #endif /* VIMAGE */
1077
1078 /*
1079  * Add a group to an interface
1080  */
1081 int
1082 if_addgroup(struct ifnet *ifp, const char *groupname)
1083 {
1084         struct ifg_list         *ifgl;
1085         struct ifg_group        *ifg = NULL;
1086         struct ifg_member       *ifgm;
1087
1088         if (groupname[0] && groupname[strlen(groupname) - 1] >= '0' &&
1089             groupname[strlen(groupname) - 1] <= '9')
1090                 return (EINVAL);
1091
1092         IFNET_WLOCK();
1093         TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1094                 if (!strcmp(ifgl->ifgl_group->ifg_group, groupname)) {
1095                         IFNET_WUNLOCK();
1096                         return (EEXIST);
1097                 }
1098
1099         if ((ifgl = (struct ifg_list *)malloc(sizeof(struct ifg_list), M_TEMP,
1100             M_NOWAIT)) == NULL) {
1101                 IFNET_WUNLOCK();
1102                 return (ENOMEM);
1103         }
1104
1105         if ((ifgm = (struct ifg_member *)malloc(sizeof(struct ifg_member),
1106             M_TEMP, M_NOWAIT)) == NULL) {
1107                 free(ifgl, M_TEMP);
1108                 IFNET_WUNLOCK();
1109                 return (ENOMEM);
1110         }
1111
1112         TAILQ_FOREACH(ifg, &V_ifg_head, ifg_next)
1113                 if (!strcmp(ifg->ifg_group, groupname))
1114                         break;
1115
1116         if (ifg == NULL) {
1117                 if ((ifg = (struct ifg_group *)malloc(sizeof(struct ifg_group),
1118                     M_TEMP, M_NOWAIT)) == NULL) {
1119                         free(ifgl, M_TEMP);
1120                         free(ifgm, M_TEMP);
1121                         IFNET_WUNLOCK();
1122                         return (ENOMEM);
1123                 }
1124                 strlcpy(ifg->ifg_group, groupname, sizeof(ifg->ifg_group));
1125                 ifg->ifg_refcnt = 0;
1126                 TAILQ_INIT(&ifg->ifg_members);
1127                 EVENTHANDLER_INVOKE(group_attach_event, ifg);
1128                 TAILQ_INSERT_TAIL(&V_ifg_head, ifg, ifg_next);
1129         }
1130
1131         ifg->ifg_refcnt++;
1132         ifgl->ifgl_group = ifg;
1133         ifgm->ifgm_ifp = ifp;
1134
1135         IF_ADDR_WLOCK(ifp);
1136         TAILQ_INSERT_TAIL(&ifg->ifg_members, ifgm, ifgm_next);
1137         TAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
1138         IF_ADDR_WUNLOCK(ifp);
1139
1140         IFNET_WUNLOCK();
1141
1142         EVENTHANDLER_INVOKE(group_change_event, groupname);
1143
1144         return (0);
1145 }
1146
1147 /*
1148  * Remove a group from an interface
1149  */
1150 int
1151 if_delgroup(struct ifnet *ifp, const char *groupname)
1152 {
1153         struct ifg_list         *ifgl;
1154         struct ifg_member       *ifgm;
1155
1156         IFNET_WLOCK();
1157         TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1158                 if (!strcmp(ifgl->ifgl_group->ifg_group, groupname))
1159                         break;
1160         if (ifgl == NULL) {
1161                 IFNET_WUNLOCK();
1162                 return (ENOENT);
1163         }
1164
1165         IF_ADDR_WLOCK(ifp);
1166         TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
1167         IF_ADDR_WUNLOCK(ifp);
1168
1169         TAILQ_FOREACH(ifgm, &ifgl->ifgl_group->ifg_members, ifgm_next)
1170                 if (ifgm->ifgm_ifp == ifp)
1171                         break;
1172
1173         if (ifgm != NULL) {
1174                 TAILQ_REMOVE(&ifgl->ifgl_group->ifg_members, ifgm, ifgm_next);
1175                 free(ifgm, M_TEMP);
1176         }
1177
1178         if (--ifgl->ifgl_group->ifg_refcnt == 0) {
1179                 TAILQ_REMOVE(&V_ifg_head, ifgl->ifgl_group, ifg_next);
1180                 EVENTHANDLER_INVOKE(group_detach_event, ifgl->ifgl_group);
1181                 free(ifgl->ifgl_group, M_TEMP);
1182         }
1183         IFNET_WUNLOCK();
1184
1185         free(ifgl, M_TEMP);
1186
1187         EVENTHANDLER_INVOKE(group_change_event, groupname);
1188
1189         return (0);
1190 }
1191
1192 /*
1193  * Remove an interface from all groups
1194  */
1195 static void
1196 if_delgroups(struct ifnet *ifp)
1197 {
1198         struct ifg_list         *ifgl;
1199         struct ifg_member       *ifgm;
1200         char groupname[IFNAMSIZ];
1201
1202         IFNET_WLOCK();
1203         while (!TAILQ_EMPTY(&ifp->if_groups)) {
1204                 ifgl = TAILQ_FIRST(&ifp->if_groups);
1205
1206                 strlcpy(groupname, ifgl->ifgl_group->ifg_group, IFNAMSIZ);
1207
1208                 IF_ADDR_WLOCK(ifp);
1209                 TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
1210                 IF_ADDR_WUNLOCK(ifp);
1211
1212                 TAILQ_FOREACH(ifgm, &ifgl->ifgl_group->ifg_members, ifgm_next)
1213                         if (ifgm->ifgm_ifp == ifp)
1214                                 break;
1215
1216                 if (ifgm != NULL) {
1217                         TAILQ_REMOVE(&ifgl->ifgl_group->ifg_members, ifgm,
1218                             ifgm_next);
1219                         free(ifgm, M_TEMP);
1220                 }
1221
1222                 if (--ifgl->ifgl_group->ifg_refcnt == 0) {
1223                         TAILQ_REMOVE(&V_ifg_head, ifgl->ifgl_group, ifg_next);
1224                         EVENTHANDLER_INVOKE(group_detach_event,
1225                             ifgl->ifgl_group);
1226                         free(ifgl->ifgl_group, M_TEMP);
1227                 }
1228                 IFNET_WUNLOCK();
1229
1230                 free(ifgl, M_TEMP);
1231
1232                 EVENTHANDLER_INVOKE(group_change_event, groupname);
1233
1234                 IFNET_WLOCK();
1235         }
1236         IFNET_WUNLOCK();
1237 }
1238
1239 /*
1240  * Stores all groups from an interface in memory pointed
1241  * to by data
1242  */
1243 static int
1244 if_getgroup(struct ifgroupreq *data, struct ifnet *ifp)
1245 {
1246         int                      len, error;
1247         struct ifg_list         *ifgl;
1248         struct ifg_req           ifgrq, *ifgp;
1249         struct ifgroupreq       *ifgr = data;
1250
1251         if (ifgr->ifgr_len == 0) {
1252                 IF_ADDR_RLOCK(ifp);
1253                 TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1254                         ifgr->ifgr_len += sizeof(struct ifg_req);
1255                 IF_ADDR_RUNLOCK(ifp);
1256                 return (0);
1257         }
1258
1259         len = ifgr->ifgr_len;
1260         ifgp = ifgr->ifgr_groups;
1261         /* XXX: wire */
1262         IF_ADDR_RLOCK(ifp);
1263         TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
1264                 if (len < sizeof(ifgrq)) {
1265                         IF_ADDR_RUNLOCK(ifp);
1266                         return (EINVAL);
1267                 }
1268                 bzero(&ifgrq, sizeof ifgrq);
1269                 strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group,
1270                     sizeof(ifgrq.ifgrq_group));
1271                 if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req)))) {
1272                         IF_ADDR_RUNLOCK(ifp);
1273                         return (error);
1274                 }
1275                 len -= sizeof(ifgrq);
1276                 ifgp++;
1277         }
1278         IF_ADDR_RUNLOCK(ifp);
1279
1280         return (0);
1281 }
1282
1283 /*
1284  * Stores all members of a group in memory pointed to by data
1285  */
1286 static int
1287 if_getgroupmembers(struct ifgroupreq *data)
1288 {
1289         struct ifgroupreq       *ifgr = data;
1290         struct ifg_group        *ifg;
1291         struct ifg_member       *ifgm;
1292         struct ifg_req           ifgrq, *ifgp;
1293         int                      len, error;
1294
1295         IFNET_RLOCK();
1296         TAILQ_FOREACH(ifg, &V_ifg_head, ifg_next)
1297                 if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
1298                         break;
1299         if (ifg == NULL) {
1300                 IFNET_RUNLOCK();
1301                 return (ENOENT);
1302         }
1303
1304         if (ifgr->ifgr_len == 0) {
1305                 TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
1306                         ifgr->ifgr_len += sizeof(ifgrq);
1307                 IFNET_RUNLOCK();
1308                 return (0);
1309         }
1310
1311         len = ifgr->ifgr_len;
1312         ifgp = ifgr->ifgr_groups;
1313         TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) {
1314                 if (len < sizeof(ifgrq)) {
1315                         IFNET_RUNLOCK();
1316                         return (EINVAL);
1317                 }
1318                 bzero(&ifgrq, sizeof ifgrq);
1319                 strlcpy(ifgrq.ifgrq_member, ifgm->ifgm_ifp->if_xname,
1320                     sizeof(ifgrq.ifgrq_member));
1321                 if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req)))) {
1322                         IFNET_RUNLOCK();
1323                         return (error);
1324                 }
1325                 len -= sizeof(ifgrq);
1326                 ifgp++;
1327         }
1328         IFNET_RUNLOCK();
1329
1330         return (0);
1331 }
1332
1333 /*
1334  * Delete Routes for a Network Interface
1335  *
1336  * Called for each routing entry via the rnh->rnh_walktree() call above
1337  * to delete all route entries referencing a detaching network interface.
1338  *
1339  * Arguments:
1340  *      rn      pointer to node in the routing table
1341  *      arg     argument passed to rnh->rnh_walktree() - detaching interface
1342  *
1343  * Returns:
1344  *      0       successful
1345  *      errno   failed - reason indicated
1346  *
1347  */
1348 static int
1349 if_rtdel(struct radix_node *rn, void *arg)
1350 {
1351         struct rtentry  *rt = (struct rtentry *)rn;
1352         struct ifnet    *ifp = arg;
1353         int             err;
1354
1355         if (rt->rt_ifp == ifp) {
1356
1357                 /*
1358                  * Protect (sorta) against walktree recursion problems
1359                  * with cloned routes
1360                  */
1361                 if ((rt->rt_flags & RTF_UP) == 0)
1362                         return (0);
1363
1364                 err = rtrequest_fib(RTM_DELETE, rt_key(rt), rt->rt_gateway,
1365                                 rt_mask(rt), rt->rt_flags|RTF_RNH_LOCKED,
1366                                 (struct rtentry **) NULL, rt->rt_fibnum);
1367                 if (err) {
1368                         log(LOG_WARNING, "if_rtdel: error %d\n", err);
1369                 }
1370         }
1371
1372         return (0);
1373 }
1374
1375 /*
1376  * Wrapper functions for struct ifnet address list locking macros.  These are
1377  * used by kernel modules to avoid encoding programming interface or binary
1378  * interface assumptions that may be violated when kernel-internal locking
1379  * approaches change.
1380  */
1381 void
1382 if_addr_rlock(struct ifnet *ifp)
1383 {
1384
1385         IF_ADDR_RLOCK(ifp);
1386 }
1387
1388 void
1389 if_addr_runlock(struct ifnet *ifp)
1390 {
1391
1392         IF_ADDR_RUNLOCK(ifp);
1393 }
1394
1395 void
1396 if_maddr_rlock(struct ifnet *ifp)
1397 {
1398
1399         IF_ADDR_RLOCK(ifp);
1400 }
1401
1402 void
1403 if_maddr_runlock(struct ifnet *ifp)
1404 {
1405
1406         IF_ADDR_RUNLOCK(ifp);
1407 }
1408
1409 /*
1410  * Initialization, destruction and refcounting functions for ifaddrs.
1411  */
1412 void
1413 ifa_init(struct ifaddr *ifa)
1414 {
1415
1416         mtx_init(&ifa->ifa_mtx, "ifaddr", NULL, MTX_DEF);
1417         refcount_init(&ifa->ifa_refcnt, 1);
1418         ifa->if_data.ifi_datalen = sizeof(ifa->if_data);
1419 }
1420
1421 void
1422 ifa_ref(struct ifaddr *ifa)
1423 {
1424
1425         refcount_acquire(&ifa->ifa_refcnt);
1426 }
1427
1428 void
1429 ifa_free(struct ifaddr *ifa)
1430 {
1431
1432         if (refcount_release(&ifa->ifa_refcnt)) {
1433                 mtx_destroy(&ifa->ifa_mtx);
1434                 free(ifa, M_IFADDR);
1435         }
1436 }
1437
1438 int
1439 ifa_add_loopback_route(struct ifaddr *ifa, struct sockaddr *ia)
1440 {
1441         int error = 0;
1442         struct rtentry *rt = NULL;
1443         struct rt_addrinfo info;
1444         static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK};
1445
1446         bzero(&info, sizeof(info));
1447         info.rti_ifp = V_loif;
1448         info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1449         info.rti_info[RTAX_DST] = ia;
1450         info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1451         error = rtrequest1_fib(RTM_ADD, &info, &rt, 0);
1452
1453         if (error == 0 && rt != NULL) {
1454                 RT_LOCK(rt);
1455                 ((struct sockaddr_dl *)rt->rt_gateway)->sdl_type  =
1456                         ifa->ifa_ifp->if_type;
1457                 ((struct sockaddr_dl *)rt->rt_gateway)->sdl_index =
1458                         ifa->ifa_ifp->if_index;
1459                 RT_REMREF(rt);
1460                 RT_UNLOCK(rt);
1461         } else if (error != 0)
1462                 log(LOG_DEBUG, "%s: insertion failed: %u\n", __func__, error);
1463
1464         return (error);
1465 }
1466
1467 int
1468 ifa_del_loopback_route(struct ifaddr *ifa, struct sockaddr *ia)
1469 {
1470         int error = 0;
1471         struct rt_addrinfo info;
1472         struct sockaddr_dl null_sdl;
1473
1474         bzero(&null_sdl, sizeof(null_sdl));
1475         null_sdl.sdl_len = sizeof(null_sdl);
1476         null_sdl.sdl_family = AF_LINK;
1477         null_sdl.sdl_type = ifa->ifa_ifp->if_type;
1478         null_sdl.sdl_index = ifa->ifa_ifp->if_index;
1479         bzero(&info, sizeof(info));
1480         info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1481         info.rti_info[RTAX_DST] = ia;
1482         info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1483         error = rtrequest1_fib(RTM_DELETE, &info, NULL, 0);
1484
1485         if (error != 0)
1486                 log(LOG_DEBUG, "%s: deletion failed: %u\n", __func__, error);
1487
1488         return (error);
1489 }
1490
1491 /*
1492  * XXX: Because sockaddr_dl has deeper structure than the sockaddr
1493  * structs used to represent other address families, it is necessary
1494  * to perform a different comparison.
1495  */
1496
1497 #define sa_equal(a1, a2)        \
1498         (bcmp((a1), (a2), ((a1))->sa_len) == 0)
1499
1500 #define sa_dl_equal(a1, a2)     \
1501         ((((struct sockaddr_dl *)(a1))->sdl_len ==                      \
1502          ((struct sockaddr_dl *)(a2))->sdl_len) &&                      \
1503          (bcmp(LLADDR((struct sockaddr_dl *)(a1)),                      \
1504                LLADDR((struct sockaddr_dl *)(a2)),                      \
1505                ((struct sockaddr_dl *)(a1))->sdl_alen) == 0))
1506
1507 /*
1508  * Locate an interface based on a complete address.
1509  */
1510 /*ARGSUSED*/
1511 static struct ifaddr *
1512 ifa_ifwithaddr_internal(struct sockaddr *addr, int getref)
1513 {
1514         struct ifnet *ifp;
1515         struct ifaddr *ifa;
1516
1517         IFNET_RLOCK_NOSLEEP();
1518         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1519                 IF_ADDR_RLOCK(ifp);
1520                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1521                         if (ifa->ifa_addr->sa_family != addr->sa_family)
1522                                 continue;
1523                         if (sa_equal(addr, ifa->ifa_addr)) {
1524                                 if (getref)
1525                                         ifa_ref(ifa);
1526                                 IF_ADDR_RUNLOCK(ifp);
1527                                 goto done;
1528                         }
1529                         /* IP6 doesn't have broadcast */
1530                         if ((ifp->if_flags & IFF_BROADCAST) &&
1531                             ifa->ifa_broadaddr &&
1532                             ifa->ifa_broadaddr->sa_len != 0 &&
1533                             sa_equal(ifa->ifa_broadaddr, addr)) {
1534                                 if (getref)
1535                                         ifa_ref(ifa);
1536                                 IF_ADDR_RUNLOCK(ifp);
1537                                 goto done;
1538                         }
1539                 }
1540                 IF_ADDR_RUNLOCK(ifp);
1541         }
1542         ifa = NULL;
1543 done:
1544         IFNET_RUNLOCK_NOSLEEP();
1545         return (ifa);
1546 }
1547
1548 struct ifaddr *
1549 ifa_ifwithaddr(struct sockaddr *addr)
1550 {
1551
1552         return (ifa_ifwithaddr_internal(addr, 1));
1553 }
1554
1555 int
1556 ifa_ifwithaddr_check(struct sockaddr *addr)
1557 {
1558
1559         return (ifa_ifwithaddr_internal(addr, 0) != NULL);
1560 }
1561
1562 /*
1563  * Locate an interface based on the broadcast address.
1564  */
1565 /* ARGSUSED */
1566 struct ifaddr *
1567 ifa_ifwithbroadaddr(struct sockaddr *addr)
1568 {
1569         struct ifnet *ifp;
1570         struct ifaddr *ifa;
1571
1572         IFNET_RLOCK_NOSLEEP();
1573         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1574                 IF_ADDR_RLOCK(ifp);
1575                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1576                         if (ifa->ifa_addr->sa_family != addr->sa_family)
1577                                 continue;
1578                         if ((ifp->if_flags & IFF_BROADCAST) &&
1579                             ifa->ifa_broadaddr &&
1580                             ifa->ifa_broadaddr->sa_len != 0 &&
1581                             sa_equal(ifa->ifa_broadaddr, addr)) {
1582                                 ifa_ref(ifa);
1583                                 IF_ADDR_RUNLOCK(ifp);
1584                                 goto done;
1585                         }
1586                 }
1587                 IF_ADDR_RUNLOCK(ifp);
1588         }
1589         ifa = NULL;
1590 done:
1591         IFNET_RUNLOCK_NOSLEEP();
1592         return (ifa);
1593 }
1594
1595 /*
1596  * Locate the point to point interface with a given destination address.
1597  */
1598 /*ARGSUSED*/
1599 struct ifaddr *
1600 ifa_ifwithdstaddr(struct sockaddr *addr)
1601 {
1602         struct ifnet *ifp;
1603         struct ifaddr *ifa;
1604
1605         IFNET_RLOCK_NOSLEEP();
1606         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1607                 if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
1608                         continue;
1609                 IF_ADDR_RLOCK(ifp);
1610                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1611                         if (ifa->ifa_addr->sa_family != addr->sa_family)
1612                                 continue;
1613                         if (ifa->ifa_dstaddr != NULL &&
1614                             sa_equal(addr, ifa->ifa_dstaddr)) {
1615                                 ifa_ref(ifa);
1616                                 IF_ADDR_RUNLOCK(ifp);
1617                                 goto done;
1618                         }
1619                 }
1620                 IF_ADDR_RUNLOCK(ifp);
1621         }
1622         ifa = NULL;
1623 done:
1624         IFNET_RUNLOCK_NOSLEEP();
1625         return (ifa);
1626 }
1627
1628 /*
1629  * Find an interface on a specific network.  If many, choice
1630  * is most specific found.
1631  */
1632 struct ifaddr *
1633 ifa_ifwithnet(struct sockaddr *addr, int ignore_ptp)
1634 {
1635         struct ifnet *ifp;
1636         struct ifaddr *ifa;
1637         struct ifaddr *ifa_maybe = NULL;
1638         u_int af = addr->sa_family;
1639         char *addr_data = addr->sa_data, *cplim;
1640
1641         /*
1642          * AF_LINK addresses can be looked up directly by their index number,
1643          * so do that if we can.
1644          */
1645         if (af == AF_LINK) {
1646             struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr;
1647             if (sdl->sdl_index && sdl->sdl_index <= V_if_index)
1648                 return (ifaddr_byindex(sdl->sdl_index));
1649         }
1650
1651         /*
1652          * Scan though each interface, looking for ones that have addresses
1653          * in this address family.  Maintain a reference on ifa_maybe once
1654          * we find one, as we release the IF_ADDR_RLOCK() that kept it stable
1655          * when we move onto the next interface.
1656          */
1657         IFNET_RLOCK_NOSLEEP();
1658         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1659                 IF_ADDR_RLOCK(ifp);
1660                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1661                         char *cp, *cp2, *cp3;
1662
1663                         if (ifa->ifa_addr->sa_family != af)
1664 next:                           continue;
1665                         if (af == AF_INET && 
1666                             ifp->if_flags & IFF_POINTOPOINT && !ignore_ptp) {
1667                                 /*
1668                                  * This is a bit broken as it doesn't
1669                                  * take into account that the remote end may
1670                                  * be a single node in the network we are
1671                                  * looking for.
1672                                  * The trouble is that we don't know the
1673                                  * netmask for the remote end.
1674                                  */
1675                                 if (ifa->ifa_dstaddr != NULL &&
1676                                     sa_equal(addr, ifa->ifa_dstaddr)) {
1677                                         ifa_ref(ifa);
1678                                         IF_ADDR_RUNLOCK(ifp);
1679                                         goto done;
1680                                 }
1681                         } else {
1682                                 /*
1683                                  * if we have a special address handler,
1684                                  * then use it instead of the generic one.
1685                                  */
1686                                 if (ifa->ifa_claim_addr) {
1687                                         if ((*ifa->ifa_claim_addr)(ifa, addr)) {
1688                                                 ifa_ref(ifa);
1689                                                 IF_ADDR_RUNLOCK(ifp);
1690                                                 goto done;
1691                                         }
1692                                         continue;
1693                                 }
1694
1695                                 /*
1696                                  * Scan all the bits in the ifa's address.
1697                                  * If a bit dissagrees with what we are
1698                                  * looking for, mask it with the netmask
1699                                  * to see if it really matters.
1700                                  * (A byte at a time)
1701                                  */
1702                                 if (ifa->ifa_netmask == 0)
1703                                         continue;
1704                                 cp = addr_data;
1705                                 cp2 = ifa->ifa_addr->sa_data;
1706                                 cp3 = ifa->ifa_netmask->sa_data;
1707                                 cplim = ifa->ifa_netmask->sa_len
1708                                         + (char *)ifa->ifa_netmask;
1709                                 while (cp3 < cplim)
1710                                         if ((*cp++ ^ *cp2++) & *cp3++)
1711                                                 goto next; /* next address! */
1712                                 /*
1713                                  * If the netmask of what we just found
1714                                  * is more specific than what we had before
1715                                  * (if we had one) then remember the new one
1716                                  * before continuing to search
1717                                  * for an even better one.
1718                                  */
1719                                 if (ifa_maybe == NULL ||
1720                                     rn_refines((caddr_t)ifa->ifa_netmask,
1721                                     (caddr_t)ifa_maybe->ifa_netmask)) {
1722                                         if (ifa_maybe != NULL)
1723                                                 ifa_free(ifa_maybe);
1724                                         ifa_maybe = ifa;
1725                                         ifa_ref(ifa_maybe);
1726                                 }
1727                         }
1728                 }
1729                 IF_ADDR_RUNLOCK(ifp);
1730         }
1731         ifa = ifa_maybe;
1732         ifa_maybe = NULL;
1733 done:
1734         IFNET_RUNLOCK_NOSLEEP();
1735         if (ifa_maybe != NULL)
1736                 ifa_free(ifa_maybe);
1737         return (ifa);
1738 }
1739
1740 /*
1741  * Find an interface address specific to an interface best matching
1742  * a given address.
1743  */
1744 struct ifaddr *
1745 ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
1746 {
1747         struct ifaddr *ifa;
1748         char *cp, *cp2, *cp3;
1749         char *cplim;
1750         struct ifaddr *ifa_maybe = NULL;
1751         u_int af = addr->sa_family;
1752
1753         if (af >= AF_MAX)
1754                 return (NULL);
1755         IF_ADDR_RLOCK(ifp);
1756         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1757                 if (ifa->ifa_addr->sa_family != af)
1758                         continue;
1759                 if (ifa_maybe == NULL)
1760                         ifa_maybe = ifa;
1761                 if (ifa->ifa_netmask == 0) {
1762                         if (sa_equal(addr, ifa->ifa_addr) ||
1763                             (ifa->ifa_dstaddr &&
1764                             sa_equal(addr, ifa->ifa_dstaddr)))
1765                                 goto done;
1766                         continue;
1767                 }
1768                 if (ifp->if_flags & IFF_POINTOPOINT) {
1769                         if (sa_equal(addr, ifa->ifa_dstaddr))
1770                                 goto done;
1771                 } else {
1772                         cp = addr->sa_data;
1773                         cp2 = ifa->ifa_addr->sa_data;
1774                         cp3 = ifa->ifa_netmask->sa_data;
1775                         cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask;
1776                         for (; cp3 < cplim; cp3++)
1777                                 if ((*cp++ ^ *cp2++) & *cp3)
1778                                         break;
1779                         if (cp3 == cplim)
1780                                 goto done;
1781                 }
1782         }
1783         ifa = ifa_maybe;
1784 done:
1785         if (ifa != NULL)
1786                 ifa_ref(ifa);
1787         IF_ADDR_RUNLOCK(ifp);
1788         return (ifa);
1789 }
1790
1791 #include <net/if_llatbl.h>
1792
1793 /*
1794  * Default action when installing a route with a Link Level gateway.
1795  * Lookup an appropriate real ifa to point to.
1796  * This should be moved to /sys/net/link.c eventually.
1797  */
1798 static void
1799 link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
1800 {
1801         struct ifaddr *ifa, *oifa;
1802         struct sockaddr *dst;
1803         struct ifnet *ifp;
1804
1805         RT_LOCK_ASSERT(rt);
1806
1807         if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) ||
1808             ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
1809                 return;
1810         ifa = ifaof_ifpforaddr(dst, ifp);
1811         if (ifa) {
1812                 oifa = rt->rt_ifa;
1813                 rt->rt_ifa = ifa;
1814                 ifa_free(oifa);
1815                 if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
1816                         ifa->ifa_rtrequest(cmd, rt, info);
1817         }
1818 }
1819
1820 /*
1821  * Mark an interface down and notify protocols of
1822  * the transition.
1823  * NOTE: must be called at splnet or eqivalent.
1824  */
1825 static void
1826 if_unroute(struct ifnet *ifp, int flag, int fam)
1827 {
1828         struct ifaddr *ifa;
1829
1830         KASSERT(flag == IFF_UP, ("if_unroute: flag != IFF_UP"));
1831
1832         ifp->if_flags &= ~flag;
1833         getmicrotime(&ifp->if_lastchange);
1834         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
1835                 if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family))
1836                         pfctlinput(PRC_IFDOWN, ifa->ifa_addr);
1837         ifp->if_qflush(ifp);
1838
1839         if (ifp->if_carp)
1840                 (*carp_linkstate_p)(ifp);
1841         rt_ifmsg(ifp);
1842 }
1843
1844 /*
1845  * Mark an interface up and notify protocols of
1846  * the transition.
1847  * NOTE: must be called at splnet or eqivalent.
1848  */
1849 static void
1850 if_route(struct ifnet *ifp, int flag, int fam)
1851 {
1852         struct ifaddr *ifa;
1853
1854         KASSERT(flag == IFF_UP, ("if_route: flag != IFF_UP"));
1855
1856         ifp->if_flags |= flag;
1857         getmicrotime(&ifp->if_lastchange);
1858         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
1859                 if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family))
1860                         pfctlinput(PRC_IFUP, ifa->ifa_addr);
1861         if (ifp->if_carp)
1862                 (*carp_linkstate_p)(ifp);
1863         rt_ifmsg(ifp);
1864 #ifdef INET6
1865         in6_if_up(ifp);
1866 #endif
1867 }
1868
1869 void    (*vlan_link_state_p)(struct ifnet *);   /* XXX: private from if_vlan */
1870 void    (*vlan_trunk_cap_p)(struct ifnet *);            /* XXX: private from if_vlan */
1871 struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
1872 struct  ifnet *(*vlan_devat_p)(struct ifnet *, uint16_t);
1873 int     (*vlan_tag_p)(struct ifnet *, uint16_t *);
1874 int     (*vlan_setcookie_p)(struct ifnet *, void *);
1875 void    *(*vlan_cookie_p)(struct ifnet *);
1876
1877 /*
1878  * Handle a change in the interface link state. To avoid LORs
1879  * between driver lock and upper layer locks, as well as possible
1880  * recursions, we post event to taskqueue, and all job
1881  * is done in static do_link_state_change().
1882  */
1883 void
1884 if_link_state_change(struct ifnet *ifp, int link_state)
1885 {
1886         /* Return if state hasn't changed. */
1887         if (ifp->if_link_state == link_state)
1888                 return;
1889
1890         ifp->if_link_state = link_state;
1891
1892         taskqueue_enqueue(taskqueue_swi, &ifp->if_linktask);
1893 }
1894
1895 static void
1896 do_link_state_change(void *arg, int pending)
1897 {
1898         struct ifnet *ifp = (struct ifnet *)arg;
1899         int link_state = ifp->if_link_state;
1900         CURVNET_SET(ifp->if_vnet);
1901
1902         /* Notify that the link state has changed. */
1903         rt_ifmsg(ifp);
1904         if (ifp->if_vlantrunk != NULL)
1905                 (*vlan_link_state_p)(ifp);
1906
1907         if ((ifp->if_type == IFT_ETHER || ifp->if_type == IFT_L2VLAN) &&
1908             IFP2AC(ifp)->ac_netgraph != NULL)
1909                 (*ng_ether_link_state_p)(ifp, link_state);
1910         if (ifp->if_carp)
1911                 (*carp_linkstate_p)(ifp);
1912         if (ifp->if_bridge)
1913                 (*bridge_linkstate_p)(ifp);
1914         if (ifp->if_lagg)
1915                 (*lagg_linkstate_p)(ifp, link_state);
1916
1917         if (IS_DEFAULT_VNET(curvnet))
1918                 devctl_notify("IFNET", ifp->if_xname,
1919                     (link_state == LINK_STATE_UP) ? "LINK_UP" : "LINK_DOWN",
1920                     NULL);
1921         if (pending > 1)
1922                 if_printf(ifp, "%d link states coalesced\n", pending);
1923         if (log_link_state_change)
1924                 log(LOG_NOTICE, "%s: link state changed to %s\n", ifp->if_xname,
1925                     (link_state == LINK_STATE_UP) ? "UP" : "DOWN" );
1926         EVENTHANDLER_INVOKE(ifnet_link_event, ifp, ifp->if_link_state);
1927         CURVNET_RESTORE();
1928 }
1929
1930 /*
1931  * Mark an interface down and notify protocols of
1932  * the transition.
1933  * NOTE: must be called at splnet or eqivalent.
1934  */
1935 void
1936 if_down(struct ifnet *ifp)
1937 {
1938
1939         if_unroute(ifp, IFF_UP, AF_UNSPEC);
1940 }
1941
1942 /*
1943  * Mark an interface up and notify protocols of
1944  * the transition.
1945  * NOTE: must be called at splnet or eqivalent.
1946  */
1947 void
1948 if_up(struct ifnet *ifp)
1949 {
1950
1951         if_route(ifp, IFF_UP, AF_UNSPEC);
1952 }
1953
1954 /*
1955  * Flush an interface queue.
1956  */
1957 void
1958 if_qflush(struct ifnet *ifp)
1959 {
1960         struct mbuf *m, *n;
1961         struct ifaltq *ifq;
1962         
1963         ifq = &ifp->if_snd;
1964         IFQ_LOCK(ifq);
1965 #ifdef ALTQ
1966         if (ALTQ_IS_ENABLED(ifq))
1967                 ALTQ_PURGE(ifq);
1968 #endif
1969         n = ifq->ifq_head;
1970         while ((m = n) != 0) {
1971                 n = m->m_act;
1972                 m_freem(m);
1973         }
1974         ifq->ifq_head = 0;
1975         ifq->ifq_tail = 0;
1976         ifq->ifq_len = 0;
1977         IFQ_UNLOCK(ifq);
1978 }
1979
1980 /*
1981  * Map interface name to interface structure pointer, with or without
1982  * returning a reference.
1983  */
1984 struct ifnet *
1985 ifunit_ref(const char *name)
1986 {
1987         struct ifnet *ifp;
1988
1989         IFNET_RLOCK_NOSLEEP();
1990         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1991                 if (strncmp(name, ifp->if_xname, IFNAMSIZ) == 0 &&
1992                     !(ifp->if_flags & IFF_DYING))
1993                         break;
1994         }
1995         if (ifp != NULL)
1996                 if_ref(ifp);
1997         IFNET_RUNLOCK_NOSLEEP();
1998         return (ifp);
1999 }
2000
2001 struct ifnet *
2002 ifunit(const char *name)
2003 {
2004         struct ifnet *ifp;
2005
2006         IFNET_RLOCK_NOSLEEP();
2007         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2008                 if (strncmp(name, ifp->if_xname, IFNAMSIZ) == 0)
2009                         break;
2010         }
2011         IFNET_RUNLOCK_NOSLEEP();
2012         return (ifp);
2013 }
2014
2015 /*
2016  * Hardware specific interface ioctls.
2017  */
2018 static int
2019 ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
2020 {
2021         struct ifreq *ifr;
2022         struct ifstat *ifs;
2023         int error = 0;
2024         int new_flags, temp_flags;
2025         size_t namelen, onamelen;
2026         size_t descrlen;
2027         char *descrbuf, *odescrbuf;
2028         char new_name[IFNAMSIZ];
2029         struct ifaddr *ifa;
2030         struct sockaddr_dl *sdl;
2031
2032         ifr = (struct ifreq *)data;
2033         switch (cmd) {
2034         case SIOCGIFINDEX:
2035                 ifr->ifr_index = ifp->if_index;
2036                 break;
2037
2038         case SIOCGIFFLAGS:
2039                 temp_flags = ifp->if_flags | ifp->if_drv_flags;
2040                 ifr->ifr_flags = temp_flags & 0xffff;
2041                 ifr->ifr_flagshigh = temp_flags >> 16;
2042                 break;
2043
2044         case SIOCGIFCAP:
2045                 ifr->ifr_reqcap = ifp->if_capabilities;
2046                 ifr->ifr_curcap = ifp->if_capenable;
2047                 break;
2048
2049 #ifdef MAC
2050         case SIOCGIFMAC:
2051                 error = mac_ifnet_ioctl_get(td->td_ucred, ifr, ifp);
2052                 break;
2053 #endif
2054
2055         case SIOCGIFMETRIC:
2056                 ifr->ifr_metric = ifp->if_metric;
2057                 break;
2058
2059         case SIOCGIFMTU:
2060                 ifr->ifr_mtu = ifp->if_mtu;
2061                 break;
2062
2063         case SIOCGIFPHYS:
2064                 ifr->ifr_phys = ifp->if_physical;
2065                 break;
2066
2067         case SIOCGIFDESCR:
2068                 error = 0;
2069                 sx_slock(&ifdescr_sx);
2070                 if (ifp->if_description == NULL)
2071                         error = ENOMSG;
2072                 else {
2073                         /* space for terminating nul */
2074                         descrlen = strlen(ifp->if_description) + 1;
2075                         if (ifr->ifr_buffer.length < descrlen)
2076                                 ifr->ifr_buffer.buffer = NULL;
2077                         else
2078                                 error = copyout(ifp->if_description,
2079                                     ifr->ifr_buffer.buffer, descrlen);
2080                         ifr->ifr_buffer.length = descrlen;
2081                 }
2082                 sx_sunlock(&ifdescr_sx);
2083                 break;
2084
2085         case SIOCSIFDESCR:
2086                 error = priv_check(td, PRIV_NET_SETIFDESCR);
2087                 if (error)
2088                         return (error);
2089
2090                 /*
2091                  * Copy only (length-1) bytes to make sure that
2092                  * if_description is always nul terminated.  The
2093                  * length parameter is supposed to count the
2094                  * terminating nul in.
2095                  */
2096                 if (ifr->ifr_buffer.length > ifdescr_maxlen)
2097                         return (ENAMETOOLONG);
2098                 else if (ifr->ifr_buffer.length == 0)
2099                         descrbuf = NULL;
2100                 else {
2101                         descrbuf = malloc(ifr->ifr_buffer.length, M_IFDESCR,
2102                             M_WAITOK | M_ZERO);
2103                         error = copyin(ifr->ifr_buffer.buffer, descrbuf,
2104                             ifr->ifr_buffer.length - 1);
2105                         if (error) {
2106                                 free(descrbuf, M_IFDESCR);
2107                                 break;
2108                         }
2109                 }
2110
2111                 sx_xlock(&ifdescr_sx);
2112                 odescrbuf = ifp->if_description;
2113                 ifp->if_description = descrbuf;
2114                 sx_xunlock(&ifdescr_sx);
2115
2116                 getmicrotime(&ifp->if_lastchange);
2117                 free(odescrbuf, M_IFDESCR);
2118                 break;
2119
2120         case SIOCGIFFIB:
2121                 ifr->ifr_fib = ifp->if_fib;
2122                 break;
2123
2124         case SIOCSIFFIB:
2125                 error = priv_check(td, PRIV_NET_SETIFFIB);
2126                 if (error)
2127                         return (error);
2128                 if (ifr->ifr_fib >= rt_numfibs)
2129                         return (EINVAL);
2130
2131                 ifp->if_fib = ifr->ifr_fib;
2132                 break;
2133
2134         case SIOCSIFFLAGS:
2135                 error = priv_check(td, PRIV_NET_SETIFFLAGS);
2136                 if (error)
2137                         return (error);
2138                 /*
2139                  * Currently, no driver owned flags pass the IFF_CANTCHANGE
2140                  * check, so we don't need special handling here yet.
2141                  */
2142                 new_flags = (ifr->ifr_flags & 0xffff) |
2143                     (ifr->ifr_flagshigh << 16);
2144                 if (ifp->if_flags & IFF_SMART) {
2145                         /* Smart drivers twiddle their own routes */
2146                 } else if (ifp->if_flags & IFF_UP &&
2147                     (new_flags & IFF_UP) == 0) {
2148                         int s = splimp();
2149                         if_down(ifp);
2150                         splx(s);
2151                 } else if (new_flags & IFF_UP &&
2152                     (ifp->if_flags & IFF_UP) == 0) {
2153                         int s = splimp();
2154                         if_up(ifp);
2155                         splx(s);
2156                 }
2157                 /* See if permanently promiscuous mode bit is about to flip */
2158                 if ((ifp->if_flags ^ new_flags) & IFF_PPROMISC) {
2159                         if (new_flags & IFF_PPROMISC)
2160                                 ifp->if_flags |= IFF_PROMISC;
2161                         else if (ifp->if_pcount == 0)
2162                                 ifp->if_flags &= ~IFF_PROMISC;
2163                         log(LOG_INFO, "%s: permanently promiscuous mode %s\n",
2164                             ifp->if_xname,
2165                             (new_flags & IFF_PPROMISC) ? "enabled" : "disabled");
2166                 }
2167                 ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
2168                         (new_flags &~ IFF_CANTCHANGE);
2169                 if (ifp->if_ioctl) {
2170                         (void) (*ifp->if_ioctl)(ifp, cmd, data);
2171                 }
2172                 getmicrotime(&ifp->if_lastchange);
2173                 break;
2174
2175         case SIOCSIFCAP:
2176                 error = priv_check(td, PRIV_NET_SETIFCAP);
2177                 if (error)
2178                         return (error);
2179                 if (ifp->if_ioctl == NULL)
2180                         return (EOPNOTSUPP);
2181                 if (ifr->ifr_reqcap & ~ifp->if_capabilities)
2182                         return (EINVAL);
2183                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2184                 if (error == 0)
2185                         getmicrotime(&ifp->if_lastchange);
2186                 break;
2187
2188 #ifdef MAC
2189         case SIOCSIFMAC:
2190                 error = mac_ifnet_ioctl_set(td->td_ucred, ifr, ifp);
2191                 break;
2192 #endif
2193
2194         case SIOCSIFNAME:
2195                 error = priv_check(td, PRIV_NET_SETIFNAME);
2196                 if (error)
2197                         return (error);
2198                 error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL);
2199                 if (error != 0)
2200                         return (error);
2201                 if (new_name[0] == '\0')
2202                         return (EINVAL);
2203                 if (ifunit(new_name) != NULL)
2204                         return (EEXIST);
2205
2206                 /*
2207                  * XXX: Locking.  Nothing else seems to lock if_flags,
2208                  * and there are numerous other races with the
2209                  * ifunit() checks not being atomic with namespace
2210                  * changes (renames, vmoves, if_attach, etc).
2211                  */
2212                 ifp->if_flags |= IFF_RENAMING;
2213                 
2214                 /* Announce the departure of the interface. */
2215                 rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
2216                 EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
2217
2218                 log(LOG_INFO, "%s: changing name to '%s'\n",
2219                     ifp->if_xname, new_name);
2220
2221                 strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));
2222                 ifa = ifp->if_addr;
2223                 IFA_LOCK(ifa);
2224                 sdl = (struct sockaddr_dl *)ifa->ifa_addr;
2225                 namelen = strlen(new_name);
2226                 onamelen = sdl->sdl_nlen;
2227                 /*
2228                  * Move the address if needed.  This is safe because we
2229                  * allocate space for a name of length IFNAMSIZ when we
2230                  * create this in if_attach().
2231                  */
2232                 if (namelen != onamelen) {
2233                         bcopy(sdl->sdl_data + onamelen,
2234                             sdl->sdl_data + namelen, sdl->sdl_alen);
2235                 }
2236                 bcopy(new_name, sdl->sdl_data, namelen);
2237                 sdl->sdl_nlen = namelen;
2238                 sdl = (struct sockaddr_dl *)ifa->ifa_netmask;
2239                 bzero(sdl->sdl_data, onamelen);
2240                 while (namelen != 0)
2241                         sdl->sdl_data[--namelen] = 0xff;
2242                 IFA_UNLOCK(ifa);
2243
2244                 EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp);
2245                 /* Announce the return of the interface. */
2246                 rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
2247
2248                 ifp->if_flags &= ~IFF_RENAMING;
2249                 break;
2250
2251 #ifdef VIMAGE
2252         case SIOCSIFVNET:
2253                 error = priv_check(td, PRIV_NET_SETIFVNET);
2254                 if (error)
2255                         return (error);
2256                 error = if_vmove_loan(td, ifp, ifr->ifr_name, ifr->ifr_jid);
2257                 break;
2258 #endif
2259
2260         case SIOCSIFMETRIC:
2261                 error = priv_check(td, PRIV_NET_SETIFMETRIC);
2262                 if (error)
2263                         return (error);
2264                 ifp->if_metric = ifr->ifr_metric;
2265                 getmicrotime(&ifp->if_lastchange);
2266                 break;
2267
2268         case SIOCSIFPHYS:
2269                 error = priv_check(td, PRIV_NET_SETIFPHYS);
2270                 if (error)
2271                         return (error);
2272                 if (ifp->if_ioctl == NULL)
2273                         return (EOPNOTSUPP);
2274                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2275                 if (error == 0)
2276                         getmicrotime(&ifp->if_lastchange);
2277                 break;
2278
2279         case SIOCSIFMTU:
2280         {
2281                 u_long oldmtu = ifp->if_mtu;
2282
2283                 error = priv_check(td, PRIV_NET_SETIFMTU);
2284                 if (error)
2285                         return (error);
2286                 if (ifr->ifr_mtu < IF_MINMTU || ifr->ifr_mtu > IF_MAXMTU)
2287                         return (EINVAL);
2288                 if (ifp->if_ioctl == NULL)
2289                         return (EOPNOTSUPP);
2290                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2291                 if (error == 0) {
2292                         getmicrotime(&ifp->if_lastchange);
2293                         rt_ifmsg(ifp);
2294                 }
2295                 /*
2296                  * If the link MTU changed, do network layer specific procedure.
2297                  */
2298                 if (ifp->if_mtu != oldmtu) {
2299 #ifdef INET6
2300                         nd6_setmtu(ifp);
2301 #endif
2302                 }
2303                 break;
2304         }
2305
2306         case SIOCADDMULTI:
2307         case SIOCDELMULTI:
2308                 if (cmd == SIOCADDMULTI)
2309                         error = priv_check(td, PRIV_NET_ADDMULTI);
2310                 else
2311                         error = priv_check(td, PRIV_NET_DELMULTI);
2312                 if (error)
2313                         return (error);
2314
2315                 /* Don't allow group membership on non-multicast interfaces. */
2316                 if ((ifp->if_flags & IFF_MULTICAST) == 0)
2317                         return (EOPNOTSUPP);
2318
2319                 /* Don't let users screw up protocols' entries. */
2320                 if (ifr->ifr_addr.sa_family != AF_LINK)
2321                         return (EINVAL);
2322
2323                 if (cmd == SIOCADDMULTI) {
2324                         struct ifmultiaddr *ifma;
2325
2326                         /*
2327                          * Userland is only permitted to join groups once
2328                          * via the if_addmulti() KPI, because it cannot hold
2329                          * struct ifmultiaddr * between calls. It may also
2330                          * lose a race while we check if the membership
2331                          * already exists.
2332                          */
2333                         IF_ADDR_RLOCK(ifp);
2334                         ifma = if_findmulti(ifp, &ifr->ifr_addr);
2335                         IF_ADDR_RUNLOCK(ifp);
2336                         if (ifma != NULL)
2337                                 error = EADDRINUSE;
2338                         else
2339                                 error = if_addmulti(ifp, &ifr->ifr_addr, &ifma);
2340                 } else {
2341                         error = if_delmulti(ifp, &ifr->ifr_addr);
2342                 }
2343                 if (error == 0)
2344                         getmicrotime(&ifp->if_lastchange);
2345                 break;
2346
2347         case SIOCSIFPHYADDR:
2348         case SIOCDIFPHYADDR:
2349 #ifdef INET6
2350         case SIOCSIFPHYADDR_IN6:
2351 #endif
2352         case SIOCSLIFPHYADDR:
2353         case SIOCSIFMEDIA:
2354         case SIOCSIFGENERIC:
2355                 error = priv_check(td, PRIV_NET_HWIOCTL);
2356                 if (error)
2357                         return (error);
2358                 if (ifp->if_ioctl == NULL)
2359                         return (EOPNOTSUPP);
2360                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2361                 if (error == 0)
2362                         getmicrotime(&ifp->if_lastchange);
2363                 break;
2364
2365         case SIOCGIFSTATUS:
2366                 ifs = (struct ifstat *)data;
2367                 ifs->ascii[0] = '\0';
2368
2369         case SIOCGIFPSRCADDR:
2370         case SIOCGIFPDSTADDR:
2371         case SIOCGLIFPHYADDR:
2372         case SIOCGIFMEDIA:
2373         case SIOCGIFGENERIC:
2374                 if (ifp->if_ioctl == NULL)
2375                         return (EOPNOTSUPP);
2376                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2377                 break;
2378
2379         case SIOCSIFLLADDR:
2380                 error = priv_check(td, PRIV_NET_SETLLADDR);
2381                 if (error)
2382                         return (error);
2383                 error = if_setlladdr(ifp,
2384                     ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len);
2385                 EVENTHANDLER_INVOKE(iflladdr_event, ifp);
2386                 break;
2387
2388         case SIOCAIFGROUP:
2389         {
2390                 struct ifgroupreq *ifgr = (struct ifgroupreq *)ifr;
2391
2392                 error = priv_check(td, PRIV_NET_ADDIFGROUP);
2393                 if (error)
2394                         return (error);
2395                 if ((error = if_addgroup(ifp, ifgr->ifgr_group)))
2396                         return (error);
2397                 break;
2398         }
2399
2400         case SIOCGIFGROUP:
2401                 if ((error = if_getgroup((struct ifgroupreq *)ifr, ifp)))
2402                         return (error);
2403                 break;
2404
2405         case SIOCDIFGROUP:
2406         {
2407                 struct ifgroupreq *ifgr = (struct ifgroupreq *)ifr;
2408
2409                 error = priv_check(td, PRIV_NET_DELIFGROUP);
2410                 if (error)
2411                         return (error);
2412                 if ((error = if_delgroup(ifp, ifgr->ifgr_group)))
2413                         return (error);
2414                 break;
2415         }
2416
2417         default:
2418                 error = ENOIOCTL;
2419                 break;
2420         }
2421         return (error);
2422 }
2423
2424 #ifdef COMPAT_FREEBSD32
2425 struct ifconf32 {
2426         int32_t ifc_len;
2427         union {
2428                 uint32_t        ifcu_buf;
2429                 uint32_t        ifcu_req;
2430         } ifc_ifcu;
2431 };
2432 #define SIOCGIFCONF32   _IOWR('i', 36, struct ifconf32)
2433 #endif
2434
2435 /*
2436  * Interface ioctls.
2437  */
2438 int
2439 ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
2440 {
2441         struct ifnet *ifp;
2442         struct ifreq *ifr;
2443         int error;
2444         int oif_flags;
2445
2446         CURVNET_SET(so->so_vnet);
2447         switch (cmd) {
2448         case SIOCGIFCONF:
2449         case OSIOCGIFCONF:
2450                 error = ifconf(cmd, data);
2451                 CURVNET_RESTORE();
2452                 return (error);
2453
2454 #ifdef COMPAT_FREEBSD32
2455         case SIOCGIFCONF32:
2456                 {
2457                         struct ifconf32 *ifc32;
2458                         struct ifconf ifc;
2459
2460                         ifc32 = (struct ifconf32 *)data;
2461                         ifc.ifc_len = ifc32->ifc_len;
2462                         ifc.ifc_buf = PTRIN(ifc32->ifc_buf);
2463
2464                         error = ifconf(SIOCGIFCONF, (void *)&ifc);
2465                         CURVNET_RESTORE();
2466                         if (error == 0)
2467                                 ifc32->ifc_len = ifc.ifc_len;
2468                         return (error);
2469                 }
2470 #endif
2471         }
2472         ifr = (struct ifreq *)data;
2473
2474         switch (cmd) {
2475 #ifdef VIMAGE
2476         case SIOCSIFRVNET:
2477                 error = priv_check(td, PRIV_NET_SETIFVNET);
2478                 if (error == 0)
2479                         error = if_vmove_reclaim(td, ifr->ifr_name,
2480                             ifr->ifr_jid);
2481                 CURVNET_RESTORE();
2482                 return (error);
2483 #endif
2484         case SIOCIFCREATE:
2485         case SIOCIFCREATE2:
2486                 error = priv_check(td, PRIV_NET_IFCREATE);
2487                 if (error == 0)
2488                         error = if_clone_create(ifr->ifr_name,
2489                             sizeof(ifr->ifr_name),
2490                             cmd == SIOCIFCREATE2 ? ifr->ifr_data : NULL);
2491                 CURVNET_RESTORE();
2492                 return (error);
2493         case SIOCIFDESTROY:
2494                 error = priv_check(td, PRIV_NET_IFDESTROY);
2495                 if (error == 0)
2496                         error = if_clone_destroy(ifr->ifr_name);
2497                 CURVNET_RESTORE();
2498                 return (error);
2499
2500         case SIOCIFGCLONERS:
2501                 error = if_clone_list((struct if_clonereq *)data);
2502                 CURVNET_RESTORE();
2503                 return (error);
2504         case SIOCGIFGMEMB:
2505                 error = if_getgroupmembers((struct ifgroupreq *)data);
2506                 CURVNET_RESTORE();
2507                 return (error);
2508 #if defined(INET) || defined(INET6)
2509         case SIOCSVH:
2510         case SIOCGVH:
2511                 if (carp_ioctl_p == NULL)
2512                         error = EPROTONOSUPPORT;
2513                 else
2514                         error = (*carp_ioctl_p)(ifr, cmd, td);
2515                 CURVNET_RESTORE();
2516                 return (error);
2517 #endif
2518         }
2519
2520         ifp = ifunit_ref(ifr->ifr_name);
2521         if (ifp == NULL) {
2522                 CURVNET_RESTORE();
2523                 return (ENXIO);
2524         }
2525
2526         error = ifhwioctl(cmd, ifp, data, td);
2527         if (error != ENOIOCTL) {
2528                 if_rele(ifp);
2529                 CURVNET_RESTORE();
2530                 return (error);
2531         }
2532
2533         oif_flags = ifp->if_flags;
2534         if (so->so_proto == NULL) {
2535                 if_rele(ifp);
2536                 CURVNET_RESTORE();
2537                 return (EOPNOTSUPP);
2538         }
2539 #ifndef COMPAT_43
2540         error = ((*so->so_proto->pr_usrreqs->pru_control)(so, cmd,
2541                                                                  data,
2542                                                                  ifp, td));
2543         if (error == EOPNOTSUPP && ifp != NULL && ifp->if_ioctl != NULL)
2544                 error = (*ifp->if_ioctl)(ifp, cmd, data);
2545 #else
2546         {
2547                 u_long ocmd = cmd;
2548
2549                 switch (cmd) {
2550
2551                 case SIOCSIFDSTADDR:
2552                 case SIOCSIFADDR:
2553                 case SIOCSIFBRDADDR:
2554                 case SIOCSIFNETMASK:
2555 #if BYTE_ORDER != BIG_ENDIAN
2556                         if (ifr->ifr_addr.sa_family == 0 &&
2557                             ifr->ifr_addr.sa_len < 16) {
2558                                 ifr->ifr_addr.sa_family = ifr->ifr_addr.sa_len;
2559                                 ifr->ifr_addr.sa_len = 16;
2560                         }
2561 #else
2562                         if (ifr->ifr_addr.sa_len == 0)
2563                                 ifr->ifr_addr.sa_len = 16;
2564 #endif
2565                         break;
2566
2567                 case OSIOCGIFADDR:
2568                         cmd = SIOCGIFADDR;
2569                         break;
2570
2571                 case OSIOCGIFDSTADDR:
2572                         cmd = SIOCGIFDSTADDR;
2573                         break;
2574
2575                 case OSIOCGIFBRDADDR:
2576                         cmd = SIOCGIFBRDADDR;
2577                         break;
2578
2579                 case OSIOCGIFNETMASK:
2580                         cmd = SIOCGIFNETMASK;
2581                 }
2582                 error =  ((*so->so_proto->pr_usrreqs->pru_control)(so,
2583                                                                    cmd,
2584                                                                    data,
2585                                                                    ifp, td));
2586                 if (error == EOPNOTSUPP && ifp != NULL &&
2587                     ifp->if_ioctl != NULL)
2588                         error = (*ifp->if_ioctl)(ifp, cmd, data);
2589                 switch (ocmd) {
2590
2591                 case OSIOCGIFADDR:
2592                 case OSIOCGIFDSTADDR:
2593                 case OSIOCGIFBRDADDR:
2594                 case OSIOCGIFNETMASK:
2595                         *(u_short *)&ifr->ifr_addr = ifr->ifr_addr.sa_family;
2596
2597                 }
2598         }
2599 #endif /* COMPAT_43 */
2600
2601         if ((oif_flags ^ ifp->if_flags) & IFF_UP) {
2602 #ifdef INET6
2603                 if (ifp->if_flags & IFF_UP) {
2604                         int s = splimp();
2605                         in6_if_up(ifp);
2606                         splx(s);
2607                 }
2608 #endif
2609         }
2610         if_rele(ifp);
2611         CURVNET_RESTORE();
2612         return (error);
2613 }
2614
2615 /*
2616  * The code common to handling reference counted flags,
2617  * e.g., in ifpromisc() and if_allmulti().
2618  * The "pflag" argument can specify a permanent mode flag to check,
2619  * such as IFF_PPROMISC for promiscuous mode; should be 0 if none.
2620  *
2621  * Only to be used on stack-owned flags, not driver-owned flags.
2622  */
2623 static int
2624 if_setflag(struct ifnet *ifp, int flag, int pflag, int *refcount, int onswitch)
2625 {
2626         struct ifreq ifr;
2627         int error;
2628         int oldflags, oldcount;
2629
2630         /* Sanity checks to catch programming errors */
2631         KASSERT((flag & (IFF_DRV_OACTIVE|IFF_DRV_RUNNING)) == 0,
2632             ("%s: setting driver-owned flag %d", __func__, flag));
2633
2634         if (onswitch)
2635                 KASSERT(*refcount >= 0,
2636                     ("%s: increment negative refcount %d for flag %d",
2637                     __func__, *refcount, flag));
2638         else
2639                 KASSERT(*refcount > 0,
2640                     ("%s: decrement non-positive refcount %d for flag %d",
2641                     __func__, *refcount, flag));
2642
2643         /* In case this mode is permanent, just touch refcount */
2644         if (ifp->if_flags & pflag) {
2645                 *refcount += onswitch ? 1 : -1;
2646                 return (0);
2647         }
2648
2649         /* Save ifnet parameters for if_ioctl() may fail */
2650         oldcount = *refcount;
2651         oldflags = ifp->if_flags;
2652         
2653         /*
2654          * See if we aren't the only and touching refcount is enough.
2655          * Actually toggle interface flag if we are the first or last.
2656          */
2657         if (onswitch) {
2658                 if ((*refcount)++)
2659                         return (0);
2660                 ifp->if_flags |= flag;
2661         } else {
2662                 if (--(*refcount))
2663                         return (0);
2664                 ifp->if_flags &= ~flag;
2665         }
2666
2667         /* Call down the driver since we've changed interface flags */
2668         if (ifp->if_ioctl == NULL) {
2669                 error = EOPNOTSUPP;
2670                 goto recover;
2671         }
2672         ifr.ifr_flags = ifp->if_flags & 0xffff;
2673         ifr.ifr_flagshigh = ifp->if_flags >> 16;
2674         error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
2675         if (error)
2676                 goto recover;
2677         /* Notify userland that interface flags have changed */
2678         rt_ifmsg(ifp);
2679         return (0);
2680
2681 recover:
2682         /* Recover after driver error */
2683         *refcount = oldcount;
2684         ifp->if_flags = oldflags;
2685         return (error);
2686 }
2687
2688 /*
2689  * Set/clear promiscuous mode on interface ifp based on the truth value
2690  * of pswitch.  The calls are reference counted so that only the first
2691  * "on" request actually has an effect, as does the final "off" request.
2692  * Results are undefined if the "off" and "on" requests are not matched.
2693  */
2694 int
2695 ifpromisc(struct ifnet *ifp, int pswitch)
2696 {
2697         int error;
2698         int oldflags = ifp->if_flags;
2699
2700         error = if_setflag(ifp, IFF_PROMISC, IFF_PPROMISC,
2701                            &ifp->if_pcount, pswitch);
2702         /* If promiscuous mode status has changed, log a message */
2703         if (error == 0 && ((ifp->if_flags ^ oldflags) & IFF_PROMISC))
2704                 log(LOG_INFO, "%s: promiscuous mode %s\n",
2705                     ifp->if_xname,
2706                     (ifp->if_flags & IFF_PROMISC) ? "enabled" : "disabled");
2707         return (error);
2708 }
2709
2710 /*
2711  * Return interface configuration
2712  * of system.  List may be used
2713  * in later ioctl's (above) to get
2714  * other information.
2715  */
2716 /*ARGSUSED*/
2717 static int
2718 ifconf(u_long cmd, caddr_t data)
2719 {
2720         struct ifconf *ifc = (struct ifconf *)data;
2721         struct ifnet *ifp;
2722         struct ifaddr *ifa;
2723         struct ifreq ifr;
2724         struct sbuf *sb;
2725         int error, full = 0, valid_len, max_len;
2726
2727         /* Limit initial buffer size to MAXPHYS to avoid DoS from userspace. */
2728         max_len = MAXPHYS - 1;
2729
2730         /* Prevent hostile input from being able to crash the system */
2731         if (ifc->ifc_len <= 0)
2732                 return (EINVAL);
2733
2734 again:
2735         if (ifc->ifc_len <= max_len) {
2736                 max_len = ifc->ifc_len;
2737                 full = 1;
2738         }
2739         sb = sbuf_new(NULL, NULL, max_len + 1, SBUF_FIXEDLEN);
2740         max_len = 0;
2741         valid_len = 0;
2742
2743         IFNET_RLOCK();
2744         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2745                 int addrs;
2746
2747                 /*
2748                  * Zero the ifr_name buffer to make sure we don't
2749                  * disclose the contents of the stack.
2750                  */
2751                 memset(ifr.ifr_name, 0, sizeof(ifr.ifr_name));
2752
2753                 if (strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name))
2754                     >= sizeof(ifr.ifr_name)) {
2755                         sbuf_delete(sb);
2756                         IFNET_RUNLOCK();
2757                         return (ENAMETOOLONG);
2758                 }
2759
2760                 addrs = 0;
2761                 IF_ADDR_RLOCK(ifp);
2762                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
2763                         struct sockaddr *sa = ifa->ifa_addr;
2764
2765                         if (prison_if(curthread->td_ucred, sa) != 0)
2766                                 continue;
2767                         addrs++;
2768 #ifdef COMPAT_43
2769                         if (cmd == OSIOCGIFCONF) {
2770                                 struct osockaddr *osa =
2771                                          (struct osockaddr *)&ifr.ifr_addr;
2772                                 ifr.ifr_addr = *sa;
2773                                 osa->sa_family = sa->sa_family;
2774                                 sbuf_bcat(sb, &ifr, sizeof(ifr));
2775                                 max_len += sizeof(ifr);
2776                         } else
2777 #endif
2778                         if (sa->sa_len <= sizeof(*sa)) {
2779                                 ifr.ifr_addr = *sa;
2780                                 sbuf_bcat(sb, &ifr, sizeof(ifr));
2781                                 max_len += sizeof(ifr);
2782                         } else {
2783                                 sbuf_bcat(sb, &ifr,
2784                                     offsetof(struct ifreq, ifr_addr));
2785                                 max_len += offsetof(struct ifreq, ifr_addr);
2786                                 sbuf_bcat(sb, sa, sa->sa_len);
2787                                 max_len += sa->sa_len;
2788                         }
2789
2790                         if (sbuf_error(sb) == 0)
2791                                 valid_len = sbuf_len(sb);
2792                 }
2793                 IF_ADDR_RUNLOCK(ifp);
2794                 if (addrs == 0) {
2795                         bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
2796                         sbuf_bcat(sb, &ifr, sizeof(ifr));
2797                         max_len += sizeof(ifr);
2798
2799                         if (sbuf_error(sb) == 0)
2800                                 valid_len = sbuf_len(sb);
2801                 }
2802         }
2803         IFNET_RUNLOCK();
2804
2805         /*
2806          * If we didn't allocate enough space (uncommon), try again.  If
2807          * we have already allocated as much space as we are allowed,
2808          * return what we've got.
2809          */
2810         if (valid_len != max_len && !full) {
2811                 sbuf_delete(sb);
2812                 goto again;
2813         }
2814
2815         ifc->ifc_len = valid_len;
2816         sbuf_finish(sb);
2817         error = copyout(sbuf_data(sb), ifc->ifc_req, ifc->ifc_len);
2818         sbuf_delete(sb);
2819         return (error);
2820 }
2821
2822 /*
2823  * Just like ifpromisc(), but for all-multicast-reception mode.
2824  */
2825 int
2826 if_allmulti(struct ifnet *ifp, int onswitch)
2827 {
2828
2829         return (if_setflag(ifp, IFF_ALLMULTI, 0, &ifp->if_amcount, onswitch));
2830 }
2831
2832 struct ifmultiaddr *
2833 if_findmulti(struct ifnet *ifp, struct sockaddr *sa)
2834 {
2835         struct ifmultiaddr *ifma;
2836
2837         IF_ADDR_LOCK_ASSERT(ifp);
2838
2839         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2840                 if (sa->sa_family == AF_LINK) {
2841                         if (sa_dl_equal(ifma->ifma_addr, sa))
2842                                 break;
2843                 } else {
2844                         if (sa_equal(ifma->ifma_addr, sa))
2845                                 break;
2846                 }
2847         }
2848
2849         return ifma;
2850 }
2851
2852 /*
2853  * Allocate a new ifmultiaddr and initialize based on passed arguments.  We
2854  * make copies of passed sockaddrs.  The ifmultiaddr will not be added to
2855  * the ifnet multicast address list here, so the caller must do that and
2856  * other setup work (such as notifying the device driver).  The reference
2857  * count is initialized to 1.
2858  */
2859 static struct ifmultiaddr *
2860 if_allocmulti(struct ifnet *ifp, struct sockaddr *sa, struct sockaddr *llsa,
2861     int mflags)
2862 {
2863         struct ifmultiaddr *ifma;
2864         struct sockaddr *dupsa;
2865
2866         ifma = malloc(sizeof *ifma, M_IFMADDR, mflags |
2867             M_ZERO);
2868         if (ifma == NULL)
2869                 return (NULL);
2870
2871         dupsa = malloc(sa->sa_len, M_IFMADDR, mflags);
2872         if (dupsa == NULL) {
2873                 free(ifma, M_IFMADDR);
2874                 return (NULL);
2875         }
2876         bcopy(sa, dupsa, sa->sa_len);
2877         ifma->ifma_addr = dupsa;
2878
2879         ifma->ifma_ifp = ifp;
2880         ifma->ifma_refcount = 1;
2881         ifma->ifma_protospec = NULL;
2882
2883         if (llsa == NULL) {
2884                 ifma->ifma_lladdr = NULL;
2885                 return (ifma);
2886         }
2887
2888         dupsa = malloc(llsa->sa_len, M_IFMADDR, mflags);
2889         if (dupsa == NULL) {
2890                 free(ifma->ifma_addr, M_IFMADDR);
2891                 free(ifma, M_IFMADDR);
2892                 return (NULL);
2893         }
2894         bcopy(llsa, dupsa, llsa->sa_len);
2895         ifma->ifma_lladdr = dupsa;
2896
2897         return (ifma);
2898 }
2899
2900 /*
2901  * if_freemulti: free ifmultiaddr structure and possibly attached related
2902  * addresses.  The caller is responsible for implementing reference
2903  * counting, notifying the driver, handling routing messages, and releasing
2904  * any dependent link layer state.
2905  */
2906 static void
2907 if_freemulti(struct ifmultiaddr *ifma)
2908 {
2909
2910         KASSERT(ifma->ifma_refcount == 0, ("if_freemulti: refcount %d",
2911             ifma->ifma_refcount));
2912         KASSERT(ifma->ifma_protospec == NULL,
2913             ("if_freemulti: protospec not NULL"));
2914
2915         if (ifma->ifma_lladdr != NULL)
2916                 free(ifma->ifma_lladdr, M_IFMADDR);
2917         free(ifma->ifma_addr, M_IFMADDR);
2918         free(ifma, M_IFMADDR);
2919 }
2920
2921 /*
2922  * Register an additional multicast address with a network interface.
2923  *
2924  * - If the address is already present, bump the reference count on the
2925  *   address and return.
2926  * - If the address is not link-layer, look up a link layer address.
2927  * - Allocate address structures for one or both addresses, and attach to the
2928  *   multicast address list on the interface.  If automatically adding a link
2929  *   layer address, the protocol address will own a reference to the link
2930  *   layer address, to be freed when it is freed.
2931  * - Notify the network device driver of an addition to the multicast address
2932  *   list.
2933  *
2934  * 'sa' points to caller-owned memory with the desired multicast address.
2935  *
2936  * 'retifma' will be used to return a pointer to the resulting multicast
2937  * address reference, if desired.
2938  */
2939 int
2940 if_addmulti(struct ifnet *ifp, struct sockaddr *sa,
2941     struct ifmultiaddr **retifma)
2942 {
2943         struct ifmultiaddr *ifma, *ll_ifma;
2944         struct sockaddr *llsa;
2945         int error;
2946
2947         /*
2948          * If the address is already present, return a new reference to it;
2949          * otherwise, allocate storage and set up a new address.
2950          */
2951         IF_ADDR_WLOCK(ifp);
2952         ifma = if_findmulti(ifp, sa);
2953         if (ifma != NULL) {
2954                 ifma->ifma_refcount++;
2955                 if (retifma != NULL)
2956                         *retifma = ifma;
2957                 IF_ADDR_WUNLOCK(ifp);
2958                 return (0);
2959         }
2960
2961         /*
2962          * The address isn't already present; resolve the protocol address
2963          * into a link layer address, and then look that up, bump its
2964          * refcount or allocate an ifma for that also.  If 'llsa' was
2965          * returned, we will need to free it later.
2966          */
2967         llsa = NULL;
2968         ll_ifma = NULL;
2969         if (ifp->if_resolvemulti != NULL) {
2970                 error = ifp->if_resolvemulti(ifp, &llsa, sa);
2971                 if (error)
2972                         goto unlock_out;
2973         }
2974
2975         /*
2976          * Allocate the new address.  Don't hook it up yet, as we may also
2977          * need to allocate a link layer multicast address.
2978          */
2979         ifma = if_allocmulti(ifp, sa, llsa, M_NOWAIT);
2980         if (ifma == NULL) {
2981                 error = ENOMEM;
2982                 goto free_llsa_out;
2983         }
2984
2985         /*
2986          * If a link layer address is found, we'll need to see if it's
2987          * already present in the address list, or allocate is as well.
2988          * When this block finishes, the link layer address will be on the
2989          * list.
2990          */
2991         if (llsa != NULL) {
2992                 ll_ifma = if_findmulti(ifp, llsa);
2993                 if (ll_ifma == NULL) {
2994                         ll_ifma = if_allocmulti(ifp, llsa, NULL, M_NOWAIT);
2995                         if (ll_ifma == NULL) {
2996                                 --ifma->ifma_refcount;
2997                                 if_freemulti(ifma);
2998                                 error = ENOMEM;
2999                                 goto free_llsa_out;
3000                         }
3001                         TAILQ_INSERT_HEAD(&ifp->if_multiaddrs, ll_ifma,
3002                             ifma_link);
3003                 } else
3004                         ll_ifma->ifma_refcount++;
3005                 ifma->ifma_llifma = ll_ifma;
3006         }
3007
3008         /*
3009          * We now have a new multicast address, ifma, and possibly a new or
3010          * referenced link layer address.  Add the primary address to the
3011          * ifnet address list.
3012          */
3013         TAILQ_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
3014
3015         if (retifma != NULL)
3016                 *retifma = ifma;
3017
3018         /*
3019          * Must generate the message while holding the lock so that 'ifma'
3020          * pointer is still valid.
3021          */
3022         rt_newmaddrmsg(RTM_NEWMADDR, ifma);
3023         IF_ADDR_WUNLOCK(ifp);
3024
3025         /*
3026          * We are certain we have added something, so call down to the
3027          * interface to let them know about it.
3028          */
3029         if (ifp->if_ioctl != NULL) {
3030                 (void) (*ifp->if_ioctl)(ifp, SIOCADDMULTI, 0);
3031         }
3032
3033         if (llsa != NULL)
3034                 free(llsa, M_IFMADDR);
3035
3036         return (0);
3037
3038 free_llsa_out:
3039         if (llsa != NULL)
3040                 free(llsa, M_IFMADDR);
3041
3042 unlock_out:
3043         IF_ADDR_WUNLOCK(ifp);
3044         return (error);
3045 }
3046
3047 /*
3048  * Delete a multicast group membership by network-layer group address.
3049  *
3050  * Returns ENOENT if the entry could not be found. If ifp no longer
3051  * exists, results are undefined. This entry point should only be used
3052  * from subsystems which do appropriate locking to hold ifp for the
3053  * duration of the call.
3054  * Network-layer protocol domains must use if_delmulti_ifma().
3055  */
3056 int
3057 if_delmulti(struct ifnet *ifp, struct sockaddr *sa)
3058 {
3059         struct ifmultiaddr *ifma;
3060         int lastref;
3061 #ifdef INVARIANTS
3062         struct ifnet *oifp;
3063
3064         IFNET_RLOCK_NOSLEEP();
3065         TAILQ_FOREACH(oifp, &V_ifnet, if_link)
3066                 if (ifp == oifp)
3067                         break;
3068         if (ifp != oifp)
3069                 ifp = NULL;
3070         IFNET_RUNLOCK_NOSLEEP();
3071
3072         KASSERT(ifp != NULL, ("%s: ifnet went away", __func__));
3073 #endif
3074         if (ifp == NULL)
3075                 return (ENOENT);
3076
3077         IF_ADDR_WLOCK(ifp);
3078         lastref = 0;
3079         ifma = if_findmulti(ifp, sa);
3080         if (ifma != NULL)
3081                 lastref = if_delmulti_locked(ifp, ifma, 0);
3082         IF_ADDR_WUNLOCK(ifp);
3083
3084         if (ifma == NULL)
3085                 return (ENOENT);
3086
3087         if (lastref && ifp->if_ioctl != NULL) {
3088                 (void)(*ifp->if_ioctl)(ifp, SIOCDELMULTI, 0);
3089         }
3090
3091         return (0);
3092 }
3093
3094 /*
3095  * Delete all multicast group membership for an interface.
3096  * Should be used to quickly flush all multicast filters.
3097  */
3098 void
3099 if_delallmulti(struct ifnet *ifp)
3100 {
3101         struct ifmultiaddr *ifma;
3102         struct ifmultiaddr *next;
3103
3104         IF_ADDR_WLOCK(ifp);
3105         TAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next)
3106                 if_delmulti_locked(ifp, ifma, 0);
3107         IF_ADDR_WUNLOCK(ifp);
3108 }
3109
3110 /*
3111  * Delete a multicast group membership by group membership pointer.
3112  * Network-layer protocol domains must use this routine.
3113  *
3114  * It is safe to call this routine if the ifp disappeared.
3115  */
3116 void
3117 if_delmulti_ifma(struct ifmultiaddr *ifma)
3118 {
3119         struct ifnet *ifp;
3120         int lastref;
3121
3122         ifp = ifma->ifma_ifp;
3123 #ifdef DIAGNOSTIC
3124         if (ifp == NULL) {
3125                 printf("%s: ifma_ifp seems to be detached\n", __func__);
3126         } else {
3127                 struct ifnet *oifp;
3128
3129                 IFNET_RLOCK_NOSLEEP();
3130                 TAILQ_FOREACH(oifp, &V_ifnet, if_link)
3131                         if (ifp == oifp)
3132                                 break;
3133                 if (ifp != oifp) {
3134                         printf("%s: ifnet %p disappeared\n", __func__, ifp);
3135                         ifp = NULL;
3136                 }
3137                 IFNET_RUNLOCK_NOSLEEP();
3138         }
3139 #endif
3140         /*
3141          * If and only if the ifnet instance exists: Acquire the address lock.
3142          */
3143         if (ifp != NULL)
3144                 IF_ADDR_WLOCK(ifp);
3145
3146         lastref = if_delmulti_locked(ifp, ifma, 0);
3147
3148         if (ifp != NULL) {
3149                 /*
3150                  * If and only if the ifnet instance exists:
3151                  *  Release the address lock.
3152                  *  If the group was left: update the hardware hash filter.
3153                  */
3154                 IF_ADDR_WUNLOCK(ifp);
3155                 if (lastref && ifp->if_ioctl != NULL) {
3156                         (void)(*ifp->if_ioctl)(ifp, SIOCDELMULTI, 0);
3157                 }
3158         }
3159 }
3160
3161 /*
3162  * Perform deletion of network-layer and/or link-layer multicast address.
3163  *
3164  * Return 0 if the reference count was decremented.
3165  * Return 1 if the final reference was released, indicating that the
3166  * hardware hash filter should be reprogrammed.
3167  */
3168 static int
3169 if_delmulti_locked(struct ifnet *ifp, struct ifmultiaddr *ifma, int detaching)
3170 {
3171         struct ifmultiaddr *ll_ifma;
3172
3173         if (ifp != NULL && ifma->ifma_ifp != NULL) {
3174                 KASSERT(ifma->ifma_ifp == ifp,
3175                     ("%s: inconsistent ifp %p", __func__, ifp));
3176                 IF_ADDR_WLOCK_ASSERT(ifp);
3177         }
3178
3179         ifp = ifma->ifma_ifp;
3180
3181         /*
3182          * If the ifnet is detaching, null out references to ifnet,
3183          * so that upper protocol layers will notice, and not attempt
3184          * to obtain locks for an ifnet which no longer exists. The
3185          * routing socket announcement must happen before the ifnet
3186          * instance is detached from the system.
3187          */
3188         if (detaching) {
3189 #ifdef DIAGNOSTIC
3190                 printf("%s: detaching ifnet instance %p\n", __func__, ifp);
3191 #endif
3192                 /*
3193                  * ifp may already be nulled out if we are being reentered
3194                  * to delete the ll_ifma.
3195                  */
3196                 if (ifp != NULL) {
3197                         rt_newmaddrmsg(RTM_DELMADDR, ifma);
3198                         ifma->ifma_ifp = NULL;
3199                 }
3200         }
3201
3202         if (--ifma->ifma_refcount > 0)
3203                 return 0;
3204
3205         /*
3206          * If this ifma is a network-layer ifma, a link-layer ifma may
3207          * have been associated with it. Release it first if so.
3208          */
3209         ll_ifma = ifma->ifma_llifma;
3210         if (ll_ifma != NULL) {
3211                 KASSERT(ifma->ifma_lladdr != NULL,
3212                     ("%s: llifma w/o lladdr", __func__));
3213                 if (detaching)
3214                         ll_ifma->ifma_ifp = NULL;       /* XXX */
3215                 if (--ll_ifma->ifma_refcount == 0) {
3216                         if (ifp != NULL) {
3217                                 TAILQ_REMOVE(&ifp->if_multiaddrs, ll_ifma,
3218                                     ifma_link);
3219                         }
3220                         if_freemulti(ll_ifma);
3221                 }
3222         }
3223
3224         if (ifp != NULL)
3225                 TAILQ_REMOVE(&ifp->if_multiaddrs, ifma, ifma_link);
3226
3227         if_freemulti(ifma);
3228
3229         /*
3230          * The last reference to this instance of struct ifmultiaddr
3231          * was released; the hardware should be notified of this change.
3232          */
3233         return 1;
3234 }
3235
3236 /*
3237  * Set the link layer address on an interface.
3238  *
3239  * At this time we only support certain types of interfaces,
3240  * and we don't allow the length of the address to change.
3241  */
3242 int
3243 if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
3244 {
3245         struct sockaddr_dl *sdl;
3246         struct ifaddr *ifa;
3247         struct ifreq ifr;
3248
3249         IF_ADDR_RLOCK(ifp);
3250         ifa = ifp->if_addr;
3251         if (ifa == NULL) {
3252                 IF_ADDR_RUNLOCK(ifp);
3253                 return (EINVAL);
3254         }
3255         ifa_ref(ifa);
3256         IF_ADDR_RUNLOCK(ifp);
3257         sdl = (struct sockaddr_dl *)ifa->ifa_addr;
3258         if (sdl == NULL) {
3259                 ifa_free(ifa);
3260                 return (EINVAL);
3261         }
3262         if (len != sdl->sdl_alen) {     /* don't allow length to change */
3263                 ifa_free(ifa);
3264                 return (EINVAL);
3265         }
3266         switch (ifp->if_type) {
3267         case IFT_ETHER:
3268         case IFT_FDDI:
3269         case IFT_XETHER:
3270         case IFT_ISO88025:
3271         case IFT_L2VLAN:
3272         case IFT_BRIDGE:
3273         case IFT_ARCNET:
3274         case IFT_IEEE8023ADLAG:
3275         case IFT_IEEE80211:
3276                 bcopy(lladdr, LLADDR(sdl), len);
3277                 ifa_free(ifa);
3278                 break;
3279         default:
3280                 ifa_free(ifa);
3281                 return (ENODEV);
3282         }
3283
3284         /*
3285          * If the interface is already up, we need
3286          * to re-init it in order to reprogram its
3287          * address filter.
3288          */
3289         if ((ifp->if_flags & IFF_UP) != 0) {
3290                 if (ifp->if_ioctl) {
3291                         ifp->if_flags &= ~IFF_UP;
3292                         ifr.ifr_flags = ifp->if_flags & 0xffff;
3293                         ifr.ifr_flagshigh = ifp->if_flags >> 16;
3294                         (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
3295                         ifp->if_flags |= IFF_UP;
3296                         ifr.ifr_flags = ifp->if_flags & 0xffff;
3297                         ifr.ifr_flagshigh = ifp->if_flags >> 16;
3298                         (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
3299                 }
3300 #ifdef INET
3301                 /*
3302                  * Also send gratuitous ARPs to notify other nodes about
3303                  * the address change.
3304                  */
3305                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
3306                         if (ifa->ifa_addr->sa_family == AF_INET)
3307                                 arp_ifinit(ifp, ifa);
3308                 }
3309 #endif
3310         }
3311         return (0);
3312 }
3313
3314 /*
3315  * The name argument must be a pointer to storage which will last as
3316  * long as the interface does.  For physical devices, the result of
3317  * device_get_name(dev) is a good choice and for pseudo-devices a
3318  * static string works well.
3319  */
3320 void
3321 if_initname(struct ifnet *ifp, const char *name, int unit)
3322 {
3323         ifp->if_dname = name;
3324         ifp->if_dunit = unit;
3325         if (unit != IF_DUNIT_NONE)
3326                 snprintf(ifp->if_xname, IFNAMSIZ, "%s%d", name, unit);
3327         else
3328                 strlcpy(ifp->if_xname, name, IFNAMSIZ);
3329 }
3330
3331 int
3332 if_printf(struct ifnet *ifp, const char * fmt, ...)
3333 {
3334         va_list ap;
3335         int retval;
3336
3337         retval = printf("%s: ", ifp->if_xname);
3338         va_start(ap, fmt);
3339         retval += vprintf(fmt, ap);
3340         va_end(ap);
3341         return (retval);
3342 }
3343
3344 void
3345 if_start(struct ifnet *ifp)
3346 {
3347
3348         (*(ifp)->if_start)(ifp);
3349 }
3350
3351 /*
3352  * Backwards compatibility interface for drivers 
3353  * that have not implemented it
3354  */
3355 static int
3356 if_transmit(struct ifnet *ifp, struct mbuf *m)
3357 {
3358         int error;
3359
3360         IFQ_HANDOFF(ifp, m, error);
3361         return (error);
3362 }
3363
3364 int
3365 if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp, int adjust)
3366 {
3367         int active = 0;
3368
3369         IF_LOCK(ifq);
3370         if (_IF_QFULL(ifq)) {
3371                 _IF_DROP(ifq);
3372                 IF_UNLOCK(ifq);
3373                 m_freem(m);
3374                 return (0);
3375         }
3376         if (ifp != NULL) {
3377                 ifp->if_obytes += m->m_pkthdr.len + adjust;
3378                 if (m->m_flags & (M_BCAST|M_MCAST))
3379                         ifp->if_omcasts++;
3380                 active = ifp->if_drv_flags & IFF_DRV_OACTIVE;
3381         }
3382         _IF_ENQUEUE(ifq, m);
3383         IF_UNLOCK(ifq);
3384         if (ifp != NULL && !active)
3385                 (*(ifp)->if_start)(ifp);
3386         return (1);
3387 }
3388
3389 void
3390 if_register_com_alloc(u_char type,
3391     if_com_alloc_t *a, if_com_free_t *f)
3392 {
3393         
3394         KASSERT(if_com_alloc[type] == NULL,
3395             ("if_register_com_alloc: %d already registered", type));
3396         KASSERT(if_com_free[type] == NULL,
3397             ("if_register_com_alloc: %d free already registered", type));
3398
3399         if_com_alloc[type] = a;
3400         if_com_free[type] = f;
3401 }
3402
3403 void
3404 if_deregister_com_alloc(u_char type)
3405 {
3406         
3407         KASSERT(if_com_alloc[type] != NULL,
3408             ("if_deregister_com_alloc: %d not registered", type));
3409         KASSERT(if_com_free[type] != NULL,
3410             ("if_deregister_com_alloc: %d free not registered", type));
3411         if_com_alloc[type] = NULL;
3412         if_com_free[type] = NULL;
3413 }