]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/if_vlan.c
[vlan + lagg] add IFNET_EVENT_UPDATE_BAUDRATE event
[FreeBSD/FreeBSD.git] / sys / net / if_vlan.c
1 /*-
2  * Copyright 1998 Massachusetts Institute of Technology
3  * Copyright 2012 ADARA Networks, Inc.
4  * Copyright 2017 Dell EMC Isilon
5  *
6  * Portions of this software were developed by Robert N. M. Watson under
7  * contract to ADARA Networks, Inc.
8  *
9  * Permission to use, copy, modify, and distribute this software and
10  * its documentation for any purpose and without fee is hereby
11  * granted, provided that both the above copyright notice and this
12  * permission notice appear in all copies, that both the above
13  * copyright notice and this permission notice appear in all
14  * supporting documentation, and that the name of M.I.T. not be used
15  * in advertising or publicity pertaining to distribution of the
16  * software without specific, written prior permission.  M.I.T. makes
17  * no representations about the suitability of this software for any
18  * purpose.  It is provided "as is" without express or implied
19  * warranty.
20  *
21  * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
22  * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
23  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
25  * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34
35 /*
36  * if_vlan.c - pseudo-device driver for IEEE 802.1Q virtual LANs.
37  * This is sort of sneaky in the implementation, since
38  * we need to pretend to be enough of an Ethernet implementation
39  * to make arp work.  The way we do this is by telling everyone
40  * that we are an Ethernet, and then catch the packets that
41  * ether_output() sends to us via if_transmit(), rewrite them for
42  * use by the real outgoing interface, and ask it to send them.
43  */
44
45 #include <sys/cdefs.h>
46 __FBSDID("$FreeBSD$");
47
48 #include "opt_inet.h"
49 #include "opt_inet6.h"
50 #include "opt_kern_tls.h"
51 #include "opt_vlan.h"
52 #include "opt_ratelimit.h"
53
54 #include <sys/param.h>
55 #include <sys/eventhandler.h>
56 #include <sys/kernel.h>
57 #include <sys/lock.h>
58 #include <sys/malloc.h>
59 #include <sys/mbuf.h>
60 #include <sys/module.h>
61 #include <sys/rmlock.h>
62 #include <sys/priv.h>
63 #include <sys/queue.h>
64 #include <sys/socket.h>
65 #include <sys/sockio.h>
66 #include <sys/sysctl.h>
67 #include <sys/systm.h>
68 #include <sys/sx.h>
69 #include <sys/taskqueue.h>
70
71 #include <net/bpf.h>
72 #include <net/ethernet.h>
73 #include <net/if.h>
74 #include <net/if_var.h>
75 #include <net/if_clone.h>
76 #include <net/if_dl.h>
77 #include <net/if_types.h>
78 #include <net/if_vlan_var.h>
79 #include <net/route.h>
80 #include <net/vnet.h>
81
82 #ifdef INET
83 #include <netinet/in.h>
84 #include <netinet/if_ether.h>
85 #endif
86
87 #ifdef INET6
88 /*
89  * XXX: declare here to avoid to include many inet6 related files..
90  * should be more generalized?
91  */
92 extern void     nd6_setmtu(struct ifnet *);
93 #endif
94
95 #define VLAN_DEF_HWIDTH 4
96 #define VLAN_IFFLAGS    (IFF_BROADCAST | IFF_MULTICAST)
97
98 #define UP_AND_RUNNING(ifp) \
99     ((ifp)->if_flags & IFF_UP && (ifp)->if_drv_flags & IFF_DRV_RUNNING)
100
101 CK_SLIST_HEAD(ifvlanhead, ifvlan);
102
103 struct ifvlantrunk {
104         struct  ifnet   *parent;        /* parent interface of this trunk */
105         struct  mtx     lock;
106 #ifdef VLAN_ARRAY
107 #define VLAN_ARRAY_SIZE (EVL_VLID_MASK + 1)
108         struct  ifvlan  *vlans[VLAN_ARRAY_SIZE]; /* static table */
109 #else
110         struct  ifvlanhead *hash;       /* dynamic hash-list table */
111         uint16_t        hmask;
112         uint16_t        hwidth;
113 #endif
114         int             refcnt;
115 };
116
117 #if defined(KERN_TLS) || defined(RATELIMIT)
118 struct vlan_snd_tag {
119         struct m_snd_tag com;
120         struct m_snd_tag *tag;
121 };
122
123 static inline struct vlan_snd_tag *
124 mst_to_vst(struct m_snd_tag *mst)
125 {
126
127         return (__containerof(mst, struct vlan_snd_tag, com));
128 }
129 #endif
130
131 /*
132  * This macro provides a facility to iterate over every vlan on a trunk with
133  * the assumption that none will be added/removed during iteration.
134  */
135 #ifdef VLAN_ARRAY
136 #define VLAN_FOREACH(_ifv, _trunk) \
137         size_t _i; \
138         for (_i = 0; _i < VLAN_ARRAY_SIZE; _i++) \
139                 if (((_ifv) = (_trunk)->vlans[_i]) != NULL)
140 #else /* VLAN_ARRAY */
141 #define VLAN_FOREACH(_ifv, _trunk) \
142         struct ifvlan *_next; \
143         size_t _i; \
144         for (_i = 0; _i < (1 << (_trunk)->hwidth); _i++) \
145                 CK_SLIST_FOREACH_SAFE((_ifv), &(_trunk)->hash[_i], ifv_list, _next)
146 #endif /* VLAN_ARRAY */
147
148 /*
149  * This macro provides a facility to iterate over every vlan on a trunk while
150  * also modifying the number of vlans on the trunk. The iteration continues
151  * until some condition is met or there are no more vlans on the trunk.
152  */
153 #ifdef VLAN_ARRAY
154 /* The VLAN_ARRAY case is simple -- just a for loop using the condition. */
155 #define VLAN_FOREACH_UNTIL_SAFE(_ifv, _trunk, _cond) \
156         size_t _i; \
157         for (_i = 0; !(_cond) && _i < VLAN_ARRAY_SIZE; _i++) \
158                 if (((_ifv) = (_trunk)->vlans[_i]))
159 #else /* VLAN_ARRAY */
160 /*
161  * The hash table case is more complicated. We allow for the hash table to be
162  * modified (i.e. vlans removed) while we are iterating over it. To allow for
163  * this we must restart the iteration every time we "touch" something during
164  * the iteration, since removal will resize the hash table and invalidate our
165  * current position. If acting on the touched element causes the trunk to be
166  * emptied, then iteration also stops.
167  */
168 #define VLAN_FOREACH_UNTIL_SAFE(_ifv, _trunk, _cond) \
169         size_t _i; \
170         bool _touch = false; \
171         for (_i = 0; \
172             !(_cond) && _i < (1 << (_trunk)->hwidth); \
173             _i = (_touch && ((_trunk) != NULL) ? 0 : _i + 1), _touch = false) \
174                 if (((_ifv) = CK_SLIST_FIRST(&(_trunk)->hash[_i])) != NULL && \
175                     (_touch = true))
176 #endif /* VLAN_ARRAY */
177
178 struct vlan_mc_entry {
179         struct sockaddr_dl              mc_addr;
180         CK_SLIST_ENTRY(vlan_mc_entry)   mc_entries;
181         struct epoch_context            mc_epoch_ctx;
182 };
183
184 struct ifvlan {
185         struct  ifvlantrunk *ifv_trunk;
186         struct  ifnet *ifv_ifp;
187 #define TRUNK(ifv)      ((ifv)->ifv_trunk)
188 #define PARENT(ifv)     (TRUNK(ifv)->parent)
189         void    *ifv_cookie;
190         int     ifv_pflags;     /* special flags we have set on parent */
191         int     ifv_capenable;
192         int     ifv_encaplen;   /* encapsulation length */
193         int     ifv_mtufudge;   /* MTU fudged by this much */
194         int     ifv_mintu;      /* min transmission unit */
195         struct  ether_8021q_tag ifv_qtag;
196 #define ifv_proto       ifv_qtag.proto
197 #define ifv_vid         ifv_qtag.vid
198 #define ifv_pcp         ifv_qtag.pcp
199         struct task lladdr_task;
200         CK_SLIST_HEAD(, vlan_mc_entry) vlan_mc_listhead;
201 #ifndef VLAN_ARRAY
202         CK_SLIST_ENTRY(ifvlan) ifv_list;
203 #endif
204 };
205
206 /* Special flags we should propagate to parent. */
207 static struct {
208         int flag;
209         int (*func)(struct ifnet *, int);
210 } vlan_pflags[] = {
211         {IFF_PROMISC, ifpromisc},
212         {IFF_ALLMULTI, if_allmulti},
213         {0, NULL}
214 };
215
216 VNET_DECLARE(int, vlan_mtag_pcp);
217 #define V_vlan_mtag_pcp VNET(vlan_mtag_pcp)
218
219 static const char vlanname[] = "vlan";
220 static MALLOC_DEFINE(M_VLAN, vlanname, "802.1Q Virtual LAN Interface");
221
222 static eventhandler_tag ifdetach_tag;
223 static eventhandler_tag iflladdr_tag;
224 static eventhandler_tag ifevent_tag;
225
226 /*
227  * if_vlan uses two module-level synchronizations primitives to allow concurrent
228  * modification of vlan interfaces and (mostly) allow for vlans to be destroyed
229  * while they are being used for tx/rx. To accomplish this in a way that has
230  * acceptable performance and cooperation with other parts of the network stack
231  * there is a non-sleepable epoch(9) and an sx(9).
232  *
233  * The performance-sensitive paths that warrant using the epoch(9) are
234  * vlan_transmit and vlan_input. Both have to check for the vlan interface's
235  * existence using if_vlantrunk, and being in the network tx/rx paths the use
236  * of an epoch(9) gives a measureable improvement in performance.
237  *
238  * The reason for having an sx(9) is mostly because there are still areas that
239  * must be sleepable and also have safe concurrent access to a vlan interface.
240  * Since the sx(9) exists, it is used by default in most paths unless sleeping
241  * is not permitted, or if it is not clear whether sleeping is permitted.
242  *
243  */
244 #define _VLAN_SX_ID ifv_sx
245
246 static struct sx _VLAN_SX_ID;
247
248 #define VLAN_LOCKING_INIT() \
249         sx_init_flags(&_VLAN_SX_ID, "vlan_sx", SX_RECURSE)
250
251 #define VLAN_LOCKING_DESTROY() \
252         sx_destroy(&_VLAN_SX_ID)
253
254 #define VLAN_SLOCK()                    sx_slock(&_VLAN_SX_ID)
255 #define VLAN_SUNLOCK()                  sx_sunlock(&_VLAN_SX_ID)
256 #define VLAN_XLOCK()                    sx_xlock(&_VLAN_SX_ID)
257 #define VLAN_XUNLOCK()                  sx_xunlock(&_VLAN_SX_ID)
258 #define VLAN_SLOCK_ASSERT()             sx_assert(&_VLAN_SX_ID, SA_SLOCKED)
259 #define VLAN_XLOCK_ASSERT()             sx_assert(&_VLAN_SX_ID, SA_XLOCKED)
260 #define VLAN_SXLOCK_ASSERT()            sx_assert(&_VLAN_SX_ID, SA_LOCKED)
261
262 /*
263  * We also have a per-trunk mutex that should be acquired when changing
264  * its state.
265  */
266 #define TRUNK_LOCK_INIT(trunk)          mtx_init(&(trunk)->lock, vlanname, NULL, MTX_DEF)
267 #define TRUNK_LOCK_DESTROY(trunk)       mtx_destroy(&(trunk)->lock)
268 #define TRUNK_WLOCK(trunk)              mtx_lock(&(trunk)->lock)
269 #define TRUNK_WUNLOCK(trunk)            mtx_unlock(&(trunk)->lock)
270 #define TRUNK_WLOCK_ASSERT(trunk)       mtx_assert(&(trunk)->lock, MA_OWNED);
271
272 /*
273  * The VLAN_ARRAY substitutes the dynamic hash with a static array
274  * with 4096 entries. In theory this can give a boost in processing,
275  * however in practice it does not. Probably this is because the array
276  * is too big to fit into CPU cache.
277  */
278 #ifndef VLAN_ARRAY
279 static  void vlan_inithash(struct ifvlantrunk *trunk);
280 static  void vlan_freehash(struct ifvlantrunk *trunk);
281 static  int vlan_inshash(struct ifvlantrunk *trunk, struct ifvlan *ifv);
282 static  int vlan_remhash(struct ifvlantrunk *trunk, struct ifvlan *ifv);
283 static  void vlan_growhash(struct ifvlantrunk *trunk, int howmuch);
284 static __inline struct ifvlan * vlan_gethash(struct ifvlantrunk *trunk,
285         uint16_t vid);
286 #endif
287 static  void trunk_destroy(struct ifvlantrunk *trunk);
288
289 static  void vlan_init(void *foo);
290 static  void vlan_input(struct ifnet *ifp, struct mbuf *m);
291 static  int vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr);
292 #if defined(KERN_TLS) || defined(RATELIMIT)
293 static  int vlan_snd_tag_alloc(struct ifnet *,
294     union if_snd_tag_alloc_params *, struct m_snd_tag **);
295 static  int vlan_snd_tag_modify(struct m_snd_tag *,
296     union if_snd_tag_modify_params *);
297 static  int vlan_snd_tag_query(struct m_snd_tag *,
298     union if_snd_tag_query_params *);
299 static  void vlan_snd_tag_free(struct m_snd_tag *);
300 static struct m_snd_tag *vlan_next_snd_tag(struct m_snd_tag *);
301 static void vlan_ratelimit_query(struct ifnet *,
302     struct if_ratelimit_query_results *);
303 #endif
304 static  void vlan_qflush(struct ifnet *ifp);
305 static  int vlan_setflag(struct ifnet *ifp, int flag, int status,
306     int (*func)(struct ifnet *, int));
307 static  int vlan_setflags(struct ifnet *ifp, int status);
308 static  int vlan_setmulti(struct ifnet *ifp);
309 static  int vlan_transmit(struct ifnet *ifp, struct mbuf *m);
310 #ifdef ALTQ
311 static void vlan_altq_start(struct ifnet *ifp);
312 static  int vlan_altq_transmit(struct ifnet *ifp, struct mbuf *m);
313 #endif
314 static  int vlan_output(struct ifnet *ifp, struct mbuf *m,
315     const struct sockaddr *dst, struct route *ro);
316 static  void vlan_unconfig(struct ifnet *ifp);
317 static  void vlan_unconfig_locked(struct ifnet *ifp, int departing);
318 static  int vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag,
319         uint16_t proto);
320 static  void vlan_link_state(struct ifnet *ifp);
321 static  void vlan_capabilities(struct ifvlan *ifv);
322 static  void vlan_trunk_capabilities(struct ifnet *ifp);
323
324 static  struct ifnet *vlan_clone_match_ethervid(const char *, int *);
325 static  int vlan_clone_match(struct if_clone *, const char *);
326 static  int vlan_clone_create(struct if_clone *, char *, size_t, caddr_t);
327 static  int vlan_clone_destroy(struct if_clone *, struct ifnet *);
328
329 static  void vlan_ifdetach(void *arg, struct ifnet *ifp);
330 static  void vlan_iflladdr(void *arg, struct ifnet *ifp);
331 static  void vlan_ifevent(void *arg, struct ifnet *ifp, int event);
332
333 static  void vlan_lladdr_fn(void *arg, int pending);
334
335 static struct if_clone *vlan_cloner;
336
337 #ifdef VIMAGE
338 VNET_DEFINE_STATIC(struct if_clone *, vlan_cloner);
339 #define V_vlan_cloner   VNET(vlan_cloner)
340 #endif
341
342 #ifdef RATELIMIT
343 static const struct if_snd_tag_sw vlan_snd_tag_ul_sw = {
344         .snd_tag_modify = vlan_snd_tag_modify,
345         .snd_tag_query = vlan_snd_tag_query,
346         .snd_tag_free = vlan_snd_tag_free,
347         .next_snd_tag = vlan_next_snd_tag,
348         .type = IF_SND_TAG_TYPE_UNLIMITED
349 };
350
351 static const struct if_snd_tag_sw vlan_snd_tag_rl_sw = {
352         .snd_tag_modify = vlan_snd_tag_modify,
353         .snd_tag_query = vlan_snd_tag_query,
354         .snd_tag_free = vlan_snd_tag_free,
355         .next_snd_tag = vlan_next_snd_tag,
356         .type = IF_SND_TAG_TYPE_RATE_LIMIT
357 };
358 #endif
359
360 #ifdef KERN_TLS
361 static const struct if_snd_tag_sw vlan_snd_tag_tls_sw = {
362         .snd_tag_modify = vlan_snd_tag_modify,
363         .snd_tag_query = vlan_snd_tag_query,
364         .snd_tag_free = vlan_snd_tag_free,
365         .next_snd_tag = vlan_next_snd_tag,
366         .type = IF_SND_TAG_TYPE_TLS
367 };
368
369 #ifdef RATELIMIT
370 static const struct if_snd_tag_sw vlan_snd_tag_tls_rl_sw = {
371         .snd_tag_modify = vlan_snd_tag_modify,
372         .snd_tag_query = vlan_snd_tag_query,
373         .snd_tag_free = vlan_snd_tag_free,
374         .next_snd_tag = vlan_next_snd_tag,
375         .type = IF_SND_TAG_TYPE_TLS_RATE_LIMIT
376 };
377 #endif
378 #endif
379
380 static void
381 vlan_mc_free(struct epoch_context *ctx)
382 {
383         struct vlan_mc_entry *mc = __containerof(ctx, struct vlan_mc_entry, mc_epoch_ctx);
384         free(mc, M_VLAN);
385 }
386
387 #ifndef VLAN_ARRAY
388 #define HASH(n, m)      ((((n) >> 8) ^ ((n) >> 4) ^ (n)) & (m))
389
390 static void
391 vlan_inithash(struct ifvlantrunk *trunk)
392 {
393         int i, n;
394
395         /*
396          * The trunk must not be locked here since we call malloc(M_WAITOK).
397          * It is OK in case this function is called before the trunk struct
398          * gets hooked up and becomes visible from other threads.
399          */
400
401         KASSERT(trunk->hwidth == 0 && trunk->hash == NULL,
402             ("%s: hash already initialized", __func__));
403
404         trunk->hwidth = VLAN_DEF_HWIDTH;
405         n = 1 << trunk->hwidth;
406         trunk->hmask = n - 1;
407         trunk->hash = malloc(sizeof(struct ifvlanhead) * n, M_VLAN, M_WAITOK);
408         for (i = 0; i < n; i++)
409                 CK_SLIST_INIT(&trunk->hash[i]);
410 }
411
412 static void
413 vlan_freehash(struct ifvlantrunk *trunk)
414 {
415 #ifdef INVARIANTS
416         int i;
417
418         KASSERT(trunk->hwidth > 0, ("%s: hwidth not positive", __func__));
419         for (i = 0; i < (1 << trunk->hwidth); i++)
420                 KASSERT(CK_SLIST_EMPTY(&trunk->hash[i]),
421                     ("%s: hash table not empty", __func__));
422 #endif
423         free(trunk->hash, M_VLAN);
424         trunk->hash = NULL;
425         trunk->hwidth = trunk->hmask = 0;
426 }
427
428 static int
429 vlan_inshash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
430 {
431         int i, b;
432         struct ifvlan *ifv2;
433
434         VLAN_XLOCK_ASSERT();
435         KASSERT(trunk->hwidth > 0, ("%s: hwidth not positive", __func__));
436
437         b = 1 << trunk->hwidth;
438         i = HASH(ifv->ifv_vid, trunk->hmask);
439         CK_SLIST_FOREACH(ifv2, &trunk->hash[i], ifv_list)
440                 if (ifv->ifv_vid == ifv2->ifv_vid)
441                         return (EEXIST);
442
443         /*
444          * Grow the hash when the number of vlans exceeds half of the number of
445          * hash buckets squared. This will make the average linked-list length
446          * buckets/2.
447          */
448         if (trunk->refcnt > (b * b) / 2) {
449                 vlan_growhash(trunk, 1);
450                 i = HASH(ifv->ifv_vid, trunk->hmask);
451         }
452         CK_SLIST_INSERT_HEAD(&trunk->hash[i], ifv, ifv_list);
453         trunk->refcnt++;
454
455         return (0);
456 }
457
458 static int
459 vlan_remhash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
460 {
461         int i, b;
462         struct ifvlan *ifv2;
463
464         VLAN_XLOCK_ASSERT();
465         KASSERT(trunk->hwidth > 0, ("%s: hwidth not positive", __func__));
466
467         b = 1 << trunk->hwidth;
468         i = HASH(ifv->ifv_vid, trunk->hmask);
469         CK_SLIST_FOREACH(ifv2, &trunk->hash[i], ifv_list)
470                 if (ifv2 == ifv) {
471                         trunk->refcnt--;
472                         CK_SLIST_REMOVE(&trunk->hash[i], ifv2, ifvlan, ifv_list);
473                         if (trunk->refcnt < (b * b) / 2)
474                                 vlan_growhash(trunk, -1);
475                         return (0);
476                 }
477
478         panic("%s: vlan not found\n", __func__);
479         return (ENOENT); /*NOTREACHED*/
480 }
481
482 /*
483  * Grow the hash larger or smaller if memory permits.
484  */
485 static void
486 vlan_growhash(struct ifvlantrunk *trunk, int howmuch)
487 {
488         struct ifvlan *ifv;
489         struct ifvlanhead *hash2;
490         int hwidth2, i, j, n, n2;
491
492         VLAN_XLOCK_ASSERT();
493         KASSERT(trunk->hwidth > 0, ("%s: hwidth not positive", __func__));
494
495         if (howmuch == 0) {
496                 /* Harmless yet obvious coding error */
497                 printf("%s: howmuch is 0\n", __func__);
498                 return;
499         }
500
501         hwidth2 = trunk->hwidth + howmuch;
502         n = 1 << trunk->hwidth;
503         n2 = 1 << hwidth2;
504         /* Do not shrink the table below the default */
505         if (hwidth2 < VLAN_DEF_HWIDTH)
506                 return;
507
508         hash2 = malloc(sizeof(struct ifvlanhead) * n2, M_VLAN, M_WAITOK);
509         if (hash2 == NULL) {
510                 printf("%s: out of memory -- hash size not changed\n",
511                     __func__);
512                 return;         /* We can live with the old hash table */
513         }
514         for (j = 0; j < n2; j++)
515                 CK_SLIST_INIT(&hash2[j]);
516         for (i = 0; i < n; i++)
517                 while ((ifv = CK_SLIST_FIRST(&trunk->hash[i])) != NULL) {
518                         CK_SLIST_REMOVE(&trunk->hash[i], ifv, ifvlan, ifv_list);
519                         j = HASH(ifv->ifv_vid, n2 - 1);
520                         CK_SLIST_INSERT_HEAD(&hash2[j], ifv, ifv_list);
521                 }
522         NET_EPOCH_WAIT();
523         free(trunk->hash, M_VLAN);
524         trunk->hash = hash2;
525         trunk->hwidth = hwidth2;
526         trunk->hmask = n2 - 1;
527
528         if (bootverbose)
529                 if_printf(trunk->parent,
530                     "VLAN hash table resized from %d to %d buckets\n", n, n2);
531 }
532
533 static __inline struct ifvlan *
534 vlan_gethash(struct ifvlantrunk *trunk, uint16_t vid)
535 {
536         struct ifvlan *ifv;
537
538         NET_EPOCH_ASSERT();
539
540         CK_SLIST_FOREACH(ifv, &trunk->hash[HASH(vid, trunk->hmask)], ifv_list)
541                 if (ifv->ifv_vid == vid)
542                         return (ifv);
543         return (NULL);
544 }
545
546 #if 0
547 /* Debugging code to view the hashtables. */
548 static void
549 vlan_dumphash(struct ifvlantrunk *trunk)
550 {
551         int i;
552         struct ifvlan *ifv;
553
554         for (i = 0; i < (1 << trunk->hwidth); i++) {
555                 printf("%d: ", i);
556                 CK_SLIST_FOREACH(ifv, &trunk->hash[i], ifv_list)
557                         printf("%s ", ifv->ifv_ifp->if_xname);
558                 printf("\n");
559         }
560 }
561 #endif /* 0 */
562 #else
563
564 static __inline struct ifvlan *
565 vlan_gethash(struct ifvlantrunk *trunk, uint16_t vid)
566 {
567
568         return trunk->vlans[vid];
569 }
570
571 static __inline int
572 vlan_inshash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
573 {
574
575         if (trunk->vlans[ifv->ifv_vid] != NULL)
576                 return EEXIST;
577         trunk->vlans[ifv->ifv_vid] = ifv;
578         trunk->refcnt++;
579
580         return (0);
581 }
582
583 static __inline int
584 vlan_remhash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
585 {
586
587         trunk->vlans[ifv->ifv_vid] = NULL;
588         trunk->refcnt--;
589
590         return (0);
591 }
592
593 static __inline void
594 vlan_freehash(struct ifvlantrunk *trunk)
595 {
596 }
597
598 static __inline void
599 vlan_inithash(struct ifvlantrunk *trunk)
600 {
601 }
602
603 #endif /* !VLAN_ARRAY */
604
605 static void
606 trunk_destroy(struct ifvlantrunk *trunk)
607 {
608         VLAN_XLOCK_ASSERT();
609
610         vlan_freehash(trunk);
611         trunk->parent->if_vlantrunk = NULL;
612         TRUNK_LOCK_DESTROY(trunk);
613         if_rele(trunk->parent);
614         free(trunk, M_VLAN);
615 }
616
617 /*
618  * Program our multicast filter. What we're actually doing is
619  * programming the multicast filter of the parent. This has the
620  * side effect of causing the parent interface to receive multicast
621  * traffic that it doesn't really want, which ends up being discarded
622  * later by the upper protocol layers. Unfortunately, there's no way
623  * to avoid this: there really is only one physical interface.
624  */
625 static int
626 vlan_setmulti(struct ifnet *ifp)
627 {
628         struct ifnet            *ifp_p;
629         struct ifmultiaddr      *ifma;
630         struct ifvlan           *sc;
631         struct vlan_mc_entry    *mc;
632         int                     error;
633
634         VLAN_XLOCK_ASSERT();
635
636         /* Find the parent. */
637         sc = ifp->if_softc;
638         ifp_p = PARENT(sc);
639
640         CURVNET_SET_QUIET(ifp_p->if_vnet);
641
642         /* First, remove any existing filter entries. */
643         while ((mc = CK_SLIST_FIRST(&sc->vlan_mc_listhead)) != NULL) {
644                 CK_SLIST_REMOVE_HEAD(&sc->vlan_mc_listhead, mc_entries);
645                 (void)if_delmulti(ifp_p, (struct sockaddr *)&mc->mc_addr);
646                 NET_EPOCH_CALL(vlan_mc_free, &mc->mc_epoch_ctx);
647         }
648
649         /* Now program new ones. */
650         IF_ADDR_WLOCK(ifp);
651         CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
652                 if (ifma->ifma_addr->sa_family != AF_LINK)
653                         continue;
654                 mc = malloc(sizeof(struct vlan_mc_entry), M_VLAN, M_NOWAIT);
655                 if (mc == NULL) {
656                         IF_ADDR_WUNLOCK(ifp);
657                         CURVNET_RESTORE();
658                         return (ENOMEM);
659                 }
660                 bcopy(ifma->ifma_addr, &mc->mc_addr, ifma->ifma_addr->sa_len);
661                 mc->mc_addr.sdl_index = ifp_p->if_index;
662                 CK_SLIST_INSERT_HEAD(&sc->vlan_mc_listhead, mc, mc_entries);
663         }
664         IF_ADDR_WUNLOCK(ifp);
665         CK_SLIST_FOREACH (mc, &sc->vlan_mc_listhead, mc_entries) {
666                 error = if_addmulti(ifp_p, (struct sockaddr *)&mc->mc_addr,
667                     NULL);
668                 if (error) {
669                         CURVNET_RESTORE();
670                         return (error);
671                 }
672         }
673
674         CURVNET_RESTORE();
675         return (0);
676 }
677
678 /*
679  * A handler for interface ifnet events.
680  */
681 static void
682 vlan_ifevent(void *arg __unused, struct ifnet *ifp, int event)
683 {
684         struct epoch_tracker et;
685         struct ifvlan *ifv;
686         struct ifvlantrunk *trunk;
687
688         if (event != IFNET_EVENT_UPDATE_BAUDRATE)
689                 return;
690
691         NET_EPOCH_ENTER(et);
692         trunk = ifp->if_vlantrunk;
693         if (trunk == NULL) {
694                 NET_EPOCH_EXIT(et);
695                 return;
696         }
697
698         TRUNK_WLOCK(trunk);
699         VLAN_FOREACH(ifv, trunk) {
700                 ifv->ifv_ifp->if_baudrate = ifp->if_baudrate;
701         }
702         TRUNK_WUNLOCK(trunk);
703         NET_EPOCH_EXIT(et);
704 }
705
706 /*
707  * A handler for parent interface link layer address changes.
708  * If the parent interface link layer address is changed we
709  * should also change it on all children vlans.
710  */
711 static void
712 vlan_iflladdr(void *arg __unused, struct ifnet *ifp)
713 {
714         struct epoch_tracker et;
715         struct ifvlan *ifv;
716         struct ifnet *ifv_ifp;
717         struct ifvlantrunk *trunk;
718         struct sockaddr_dl *sdl;
719
720         /* Need the epoch since this is run on taskqueue_swi. */
721         NET_EPOCH_ENTER(et);
722         trunk = ifp->if_vlantrunk;
723         if (trunk == NULL) {
724                 NET_EPOCH_EXIT(et);
725                 return;
726         }
727
728         /*
729          * OK, it's a trunk.  Loop over and change all vlan's lladdrs on it.
730          * We need an exclusive lock here to prevent concurrent SIOCSIFLLADDR
731          * ioctl calls on the parent garbling the lladdr of the child vlan.
732          */
733         TRUNK_WLOCK(trunk);
734         VLAN_FOREACH(ifv, trunk) {
735                 /*
736                  * Copy new new lladdr into the ifv_ifp, enqueue a task
737                  * to actually call if_setlladdr. if_setlladdr needs to
738                  * be deferred to a taskqueue because it will call into
739                  * the if_vlan ioctl path and try to acquire the global
740                  * lock.
741                  */
742                 ifv_ifp = ifv->ifv_ifp;
743                 bcopy(IF_LLADDR(ifp), IF_LLADDR(ifv_ifp),
744                     ifp->if_addrlen);
745                 sdl = (struct sockaddr_dl *)ifv_ifp->if_addr->ifa_addr;
746                 sdl->sdl_alen = ifp->if_addrlen;
747                 taskqueue_enqueue(taskqueue_thread, &ifv->lladdr_task);
748         }
749         TRUNK_WUNLOCK(trunk);
750         NET_EPOCH_EXIT(et);
751 }
752
753 /*
754  * A handler for network interface departure events.
755  * Track departure of trunks here so that we don't access invalid
756  * pointers or whatever if a trunk is ripped from under us, e.g.,
757  * by ejecting its hot-plug card.  However, if an ifnet is simply
758  * being renamed, then there's no need to tear down the state.
759  */
760 static void
761 vlan_ifdetach(void *arg __unused, struct ifnet *ifp)
762 {
763         struct ifvlan *ifv;
764         struct ifvlantrunk *trunk;
765
766         /* If the ifnet is just being renamed, don't do anything. */
767         if (ifp->if_flags & IFF_RENAMING)
768                 return;
769         VLAN_XLOCK();
770         trunk = ifp->if_vlantrunk;
771         if (trunk == NULL) {
772                 VLAN_XUNLOCK();
773                 return;
774         }
775
776         /*
777          * OK, it's a trunk.  Loop over and detach all vlan's on it.
778          * Check trunk pointer after each vlan_unconfig() as it will
779          * free it and set to NULL after the last vlan was detached.
780          */
781         VLAN_FOREACH_UNTIL_SAFE(ifv, ifp->if_vlantrunk,
782             ifp->if_vlantrunk == NULL)
783                 vlan_unconfig_locked(ifv->ifv_ifp, 1);
784
785         /* Trunk should have been destroyed in vlan_unconfig(). */
786         KASSERT(ifp->if_vlantrunk == NULL, ("%s: purge failed", __func__));
787         VLAN_XUNLOCK();
788 }
789
790 /*
791  * Return the trunk device for a virtual interface.
792  */
793 static struct ifnet  *
794 vlan_trunkdev(struct ifnet *ifp)
795 {
796         struct ifvlan *ifv;
797
798         NET_EPOCH_ASSERT();
799
800         if (ifp->if_type != IFT_L2VLAN)
801                 return (NULL);
802
803         ifv = ifp->if_softc;
804         ifp = NULL;
805         if (ifv->ifv_trunk)
806                 ifp = PARENT(ifv);
807         return (ifp);
808 }
809
810 /*
811  * Return the 12-bit VLAN VID for this interface, for use by external
812  * components such as Infiniband.
813  *
814  * XXXRW: Note that the function name here is historical; it should be named
815  * vlan_vid().
816  */
817 static int
818 vlan_tag(struct ifnet *ifp, uint16_t *vidp)
819 {
820         struct ifvlan *ifv;
821
822         if (ifp->if_type != IFT_L2VLAN)
823                 return (EINVAL);
824         ifv = ifp->if_softc;
825         *vidp = ifv->ifv_vid;
826         return (0);
827 }
828
829 static int
830 vlan_pcp(struct ifnet *ifp, uint16_t *pcpp)
831 {
832         struct ifvlan *ifv;
833
834         if (ifp->if_type != IFT_L2VLAN)
835                 return (EINVAL);
836         ifv = ifp->if_softc;
837         *pcpp = ifv->ifv_pcp;
838         return (0);
839 }
840
841 /*
842  * Return a driver specific cookie for this interface.  Synchronization
843  * with setcookie must be provided by the driver.
844  */
845 static void *
846 vlan_cookie(struct ifnet *ifp)
847 {
848         struct ifvlan *ifv;
849
850         if (ifp->if_type != IFT_L2VLAN)
851                 return (NULL);
852         ifv = ifp->if_softc;
853         return (ifv->ifv_cookie);
854 }
855
856 /*
857  * Store a cookie in our softc that drivers can use to store driver
858  * private per-instance data in.
859  */
860 static int
861 vlan_setcookie(struct ifnet *ifp, void *cookie)
862 {
863         struct ifvlan *ifv;
864
865         if (ifp->if_type != IFT_L2VLAN)
866                 return (EINVAL);
867         ifv = ifp->if_softc;
868         ifv->ifv_cookie = cookie;
869         return (0);
870 }
871
872 /*
873  * Return the vlan device present at the specific VID.
874  */
875 static struct ifnet *
876 vlan_devat(struct ifnet *ifp, uint16_t vid)
877 {
878         struct ifvlantrunk *trunk;
879         struct ifvlan *ifv;
880
881         NET_EPOCH_ASSERT();
882
883         trunk = ifp->if_vlantrunk;
884         if (trunk == NULL)
885                 return (NULL);
886         ifp = NULL;
887         ifv = vlan_gethash(trunk, vid);
888         if (ifv)
889                 ifp = ifv->ifv_ifp;
890         return (ifp);
891 }
892
893 /*
894  * VLAN support can be loaded as a module.  The only place in the
895  * system that's intimately aware of this is ether_input.  We hook
896  * into this code through vlan_input_p which is defined there and
897  * set here.  No one else in the system should be aware of this so
898  * we use an explicit reference here.
899  */
900 extern  void (*vlan_input_p)(struct ifnet *, struct mbuf *);
901
902 /* For if_link_state_change() eyes only... */
903 extern  void (*vlan_link_state_p)(struct ifnet *);
904
905 static int
906 vlan_modevent(module_t mod, int type, void *data)
907 {
908
909         switch (type) {
910         case MOD_LOAD:
911                 ifdetach_tag = EVENTHANDLER_REGISTER(ifnet_departure_event,
912                     vlan_ifdetach, NULL, EVENTHANDLER_PRI_ANY);
913                 if (ifdetach_tag == NULL)
914                         return (ENOMEM);
915                 iflladdr_tag = EVENTHANDLER_REGISTER(iflladdr_event,
916                     vlan_iflladdr, NULL, EVENTHANDLER_PRI_ANY);
917                 if (iflladdr_tag == NULL)
918                         return (ENOMEM);
919                 ifevent_tag = EVENTHANDLER_REGISTER(ifnet_event,
920                     vlan_ifevent, NULL, EVENTHANDLER_PRI_ANY);
921                 if (ifevent_tag == NULL)
922                         return (ENOMEM);
923                 VLAN_LOCKING_INIT();
924                 vlan_input_p = vlan_input;
925                 vlan_link_state_p = vlan_link_state;
926                 vlan_trunk_cap_p = vlan_trunk_capabilities;
927                 vlan_trunkdev_p = vlan_trunkdev;
928                 vlan_cookie_p = vlan_cookie;
929                 vlan_setcookie_p = vlan_setcookie;
930                 vlan_tag_p = vlan_tag;
931                 vlan_pcp_p = vlan_pcp;
932                 vlan_devat_p = vlan_devat;
933 #ifndef VIMAGE
934                 vlan_cloner = if_clone_advanced(vlanname, 0, vlan_clone_match,
935                     vlan_clone_create, vlan_clone_destroy);
936 #endif
937                 if (bootverbose)
938                         printf("vlan: initialized, using "
939 #ifdef VLAN_ARRAY
940                                "full-size arrays"
941 #else
942                                "hash tables with chaining"
943 #endif
944
945                                "\n");
946                 break;
947         case MOD_UNLOAD:
948 #ifndef VIMAGE
949                 if_clone_detach(vlan_cloner);
950 #endif
951                 EVENTHANDLER_DEREGISTER(ifnet_departure_event, ifdetach_tag);
952                 EVENTHANDLER_DEREGISTER(iflladdr_event, iflladdr_tag);
953                 EVENTHANDLER_DEREGISTER(ifnet_event, ifevent_tag);
954                 vlan_input_p = NULL;
955                 vlan_link_state_p = NULL;
956                 vlan_trunk_cap_p = NULL;
957                 vlan_trunkdev_p = NULL;
958                 vlan_tag_p = NULL;
959                 vlan_cookie_p = NULL;
960                 vlan_setcookie_p = NULL;
961                 vlan_devat_p = NULL;
962                 VLAN_LOCKING_DESTROY();
963                 if (bootverbose)
964                         printf("vlan: unloaded\n");
965                 break;
966         default:
967                 return (EOPNOTSUPP);
968         }
969         return (0);
970 }
971
972 static moduledata_t vlan_mod = {
973         "if_vlan",
974         vlan_modevent,
975         0
976 };
977
978 DECLARE_MODULE(if_vlan, vlan_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
979 MODULE_VERSION(if_vlan, 3);
980
981 #ifdef VIMAGE
982 static void
983 vnet_vlan_init(const void *unused __unused)
984 {
985
986         vlan_cloner = if_clone_advanced(vlanname, 0, vlan_clone_match,
987                     vlan_clone_create, vlan_clone_destroy);
988         V_vlan_cloner = vlan_cloner;
989 }
990 VNET_SYSINIT(vnet_vlan_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
991     vnet_vlan_init, NULL);
992
993 static void
994 vnet_vlan_uninit(const void *unused __unused)
995 {
996
997         if_clone_detach(V_vlan_cloner);
998 }
999 VNET_SYSUNINIT(vnet_vlan_uninit, SI_SUB_INIT_IF, SI_ORDER_ANY,
1000     vnet_vlan_uninit, NULL);
1001 #endif
1002
1003 /*
1004  * Check for <etherif>.<vlan>[.<vlan> ...] style interface names.
1005  */
1006 static struct ifnet *
1007 vlan_clone_match_ethervid(const char *name, int *vidp)
1008 {
1009         char ifname[IFNAMSIZ];
1010         char *cp;
1011         struct ifnet *ifp;
1012         int vid;
1013
1014         strlcpy(ifname, name, IFNAMSIZ);
1015         if ((cp = strrchr(ifname, '.')) == NULL)
1016                 return (NULL);
1017         *cp = '\0';
1018         if ((ifp = ifunit_ref(ifname)) == NULL)
1019                 return (NULL);
1020         /* Parse VID. */
1021         if (*++cp == '\0') {
1022                 if_rele(ifp);
1023                 return (NULL);
1024         }
1025         vid = 0;
1026         for(; *cp >= '0' && *cp <= '9'; cp++)
1027                 vid = (vid * 10) + (*cp - '0');
1028         if (*cp != '\0') {
1029                 if_rele(ifp);
1030                 return (NULL);
1031         }
1032         if (vidp != NULL)
1033                 *vidp = vid;
1034
1035         return (ifp);
1036 }
1037
1038 static int
1039 vlan_clone_match(struct if_clone *ifc, const char *name)
1040 {
1041         struct ifnet *ifp;
1042         const char *cp;
1043
1044         ifp = vlan_clone_match_ethervid(name, NULL);
1045         if (ifp != NULL) {
1046                 if_rele(ifp);
1047                 return (1);
1048         }
1049
1050         if (strncmp(vlanname, name, strlen(vlanname)) != 0)
1051                 return (0);
1052         for (cp = name + 4; *cp != '\0'; cp++) {
1053                 if (*cp < '0' || *cp > '9')
1054                         return (0);
1055         }
1056
1057         return (1);
1058 }
1059
1060 static int
1061 vlan_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params)
1062 {
1063         char *dp;
1064         bool wildcard = false;
1065         bool subinterface = false;
1066         int unit;
1067         int error;
1068         int vid = 0;
1069         uint16_t proto = ETHERTYPE_VLAN;
1070         struct ifvlan *ifv;
1071         struct ifnet *ifp;
1072         struct ifnet *p = NULL;
1073         struct ifaddr *ifa;
1074         struct sockaddr_dl *sdl;
1075         struct vlanreq vlr;
1076         static const u_char eaddr[ETHER_ADDR_LEN];      /* 00:00:00:00:00:00 */
1077
1078
1079         /*
1080          * There are three ways to specify the cloned device:
1081          * o pass a parameter block with the clone request.
1082          * o specify parameters in the text of the clone device name
1083          * o specify no parameters and get an unattached device that
1084          *   must be configured separately.
1085          * The first technique is preferred; the latter two are supported
1086          * for backwards compatibility.
1087          *
1088          * XXXRW: Note historic use of the word "tag" here.  New ioctls may be
1089          * called for.
1090          */
1091
1092         if (params) {
1093                 error = copyin(params, &vlr, sizeof(vlr));
1094                 if (error)
1095                         return error;
1096                 vid = vlr.vlr_tag;
1097                 proto = vlr.vlr_proto;
1098
1099 #ifdef COMPAT_FREEBSD12
1100                 if (proto == 0)
1101                         proto = ETHERTYPE_VLAN;
1102 #endif
1103                 p = ifunit_ref(vlr.vlr_parent);
1104                 if (p == NULL)
1105                         return (ENXIO);
1106         }
1107
1108         if ((error = ifc_name2unit(name, &unit)) == 0) {
1109
1110                 /*
1111                  * vlanX interface. Set wildcard to true if the unit number
1112                  * is not fixed (-1)
1113                  */
1114                 wildcard = (unit < 0);
1115         } else {
1116                 struct ifnet *p_tmp = vlan_clone_match_ethervid(name, &vid);
1117                 if (p_tmp != NULL) {
1118                         error = 0;
1119                         subinterface = true;
1120                         unit = IF_DUNIT_NONE;
1121                         wildcard = false;
1122                         if (p != NULL) {
1123                                 if_rele(p_tmp);
1124                                 if (p != p_tmp)
1125                                         error = EINVAL;
1126                         } else
1127                                 p = p_tmp;
1128                 } else
1129                         error = ENXIO;
1130         }
1131
1132         if (error != 0) {
1133                 if (p != NULL)
1134                         if_rele(p);
1135                 return (error);
1136         }
1137
1138         if (!subinterface) {
1139                 /* vlanX interface, mark X as busy or allocate new unit # */
1140                 error = ifc_alloc_unit(ifc, &unit);
1141                 if (error != 0) {
1142                         if (p != NULL)
1143                                 if_rele(p);
1144                         return (error);
1145                 }
1146         }
1147
1148         /* In the wildcard case, we need to update the name. */
1149         if (wildcard) {
1150                 for (dp = name; *dp != '\0'; dp++);
1151                 if (snprintf(dp, len - (dp-name), "%d", unit) >
1152                     len - (dp-name) - 1) {
1153                         panic("%s: interface name too long", __func__);
1154                 }
1155         }
1156
1157         ifv = malloc(sizeof(struct ifvlan), M_VLAN, M_WAITOK | M_ZERO);
1158         ifp = ifv->ifv_ifp = if_alloc(IFT_ETHER);
1159         if (ifp == NULL) {
1160                 if (!subinterface)
1161                         ifc_free_unit(ifc, unit);
1162                 free(ifv, M_VLAN);
1163                 if (p != NULL)
1164                         if_rele(p);
1165                 return (ENOSPC);
1166         }
1167         CK_SLIST_INIT(&ifv->vlan_mc_listhead);
1168         ifp->if_softc = ifv;
1169         /*
1170          * Set the name manually rather than using if_initname because
1171          * we don't conform to the default naming convention for interfaces.
1172          */
1173         strlcpy(ifp->if_xname, name, IFNAMSIZ);
1174         ifp->if_dname = vlanname;
1175         ifp->if_dunit = unit;
1176
1177         ifp->if_init = vlan_init;
1178 #ifdef ALTQ
1179         ifp->if_start = vlan_altq_start;
1180         ifp->if_transmit = vlan_altq_transmit;
1181         IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
1182         ifp->if_snd.ifq_drv_maxlen = 0;
1183         IFQ_SET_READY(&ifp->if_snd);
1184 #else
1185         ifp->if_transmit = vlan_transmit;
1186 #endif
1187         ifp->if_qflush = vlan_qflush;
1188         ifp->if_ioctl = vlan_ioctl;
1189 #if defined(KERN_TLS) || defined(RATELIMIT)
1190         ifp->if_snd_tag_alloc = vlan_snd_tag_alloc;
1191         ifp->if_ratelimit_query = vlan_ratelimit_query;
1192 #endif
1193         ifp->if_flags = VLAN_IFFLAGS;
1194         ether_ifattach(ifp, eaddr);
1195         /* Now undo some of the damage... */
1196         ifp->if_baudrate = 0;
1197         ifp->if_type = IFT_L2VLAN;
1198         ifp->if_hdrlen = ETHER_VLAN_ENCAP_LEN;
1199         ifa = ifp->if_addr;
1200         sdl = (struct sockaddr_dl *)ifa->ifa_addr;
1201         sdl->sdl_type = IFT_L2VLAN;
1202
1203         if (p != NULL) {
1204                 error = vlan_config(ifv, p, vid, proto);
1205                 if_rele(p);
1206                 if (error != 0) {
1207                         /*
1208                          * Since we've partially failed, we need to back
1209                          * out all the way, otherwise userland could get
1210                          * confused.  Thus, we destroy the interface.
1211                          */
1212                         ether_ifdetach(ifp);
1213                         vlan_unconfig(ifp);
1214                         if_free(ifp);
1215                         if (!subinterface)
1216                                 ifc_free_unit(ifc, unit);
1217                         free(ifv, M_VLAN);
1218
1219                         return (error);
1220                 }
1221         }
1222
1223         return (0);
1224 }
1225
1226 static int
1227 vlan_clone_destroy(struct if_clone *ifc, struct ifnet *ifp)
1228 {
1229         struct ifvlan *ifv = ifp->if_softc;
1230         int unit = ifp->if_dunit;
1231
1232         if (ifp->if_vlantrunk)
1233                 return (EBUSY);
1234
1235 #ifdef ALTQ
1236         IFQ_PURGE(&ifp->if_snd);
1237 #endif
1238         ether_ifdetach(ifp);    /* first, remove it from system-wide lists */
1239         vlan_unconfig(ifp);     /* now it can be unconfigured and freed */
1240         /*
1241          * We should have the only reference to the ifv now, so we can now
1242          * drain any remaining lladdr task before freeing the ifnet and the
1243          * ifvlan.
1244          */
1245         taskqueue_drain(taskqueue_thread, &ifv->lladdr_task);
1246         NET_EPOCH_WAIT();
1247         if_free(ifp);
1248         free(ifv, M_VLAN);
1249         if (unit != IF_DUNIT_NONE)
1250                 ifc_free_unit(ifc, unit);
1251
1252         return (0);
1253 }
1254
1255 /*
1256  * The ifp->if_init entry point for vlan(4) is a no-op.
1257  */
1258 static void
1259 vlan_init(void *foo __unused)
1260 {
1261 }
1262
1263 /*
1264  * The if_transmit method for vlan(4) interface.
1265  */
1266 static int
1267 vlan_transmit(struct ifnet *ifp, struct mbuf *m)
1268 {
1269         struct ifvlan *ifv;
1270         struct ifnet *p;
1271         int error, len, mcast;
1272
1273         NET_EPOCH_ASSERT();
1274
1275         ifv = ifp->if_softc;
1276         if (TRUNK(ifv) == NULL) {
1277                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1278                 m_freem(m);
1279                 return (ENETDOWN);
1280         }
1281         p = PARENT(ifv);
1282         len = m->m_pkthdr.len;
1283         mcast = (m->m_flags & (M_MCAST | M_BCAST)) ? 1 : 0;
1284
1285         BPF_MTAP(ifp, m);
1286
1287 #if defined(KERN_TLS) || defined(RATELIMIT)
1288         if (m->m_pkthdr.csum_flags & CSUM_SND_TAG) {
1289                 struct vlan_snd_tag *vst;
1290                 struct m_snd_tag *mst;
1291
1292                 MPASS(m->m_pkthdr.snd_tag->ifp == ifp);
1293                 mst = m->m_pkthdr.snd_tag;
1294                 vst = mst_to_vst(mst);
1295                 if (vst->tag->ifp != p) {
1296                         if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1297                         m_freem(m);
1298                         return (EAGAIN);
1299                 }
1300
1301                 m->m_pkthdr.snd_tag = m_snd_tag_ref(vst->tag);
1302                 m_snd_tag_rele(mst);
1303         }
1304 #endif
1305
1306         /*
1307          * Do not run parent's if_transmit() if the parent is not up,
1308          * or parent's driver will cause a system crash.
1309          */
1310         if (!UP_AND_RUNNING(p)) {
1311                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1312                 m_freem(m);
1313                 return (ENETDOWN);
1314         }
1315
1316         if (!ether_8021q_frame(&m, ifp, p, &ifv->ifv_qtag)) {
1317                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1318                 return (0);
1319         }
1320
1321         /*
1322          * Send it, precisely as ether_output() would have.
1323          */
1324         error = (p->if_transmit)(p, m);
1325         if (error == 0) {
1326                 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
1327                 if_inc_counter(ifp, IFCOUNTER_OBYTES, len);
1328                 if_inc_counter(ifp, IFCOUNTER_OMCASTS, mcast);
1329         } else
1330                 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1331         return (error);
1332 }
1333
1334 static int
1335 vlan_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
1336     struct route *ro)
1337 {
1338         struct ifvlan *ifv;
1339         struct ifnet *p;
1340
1341         NET_EPOCH_ASSERT();
1342
1343         /*
1344          * Find the first non-VLAN parent interface.
1345          */
1346         ifv = ifp->if_softc;
1347         do {
1348                 if (TRUNK(ifv) == NULL) {
1349                         m_freem(m);
1350                         return (ENETDOWN);
1351                 }
1352                 p = PARENT(ifv);
1353                 ifv = p->if_softc;
1354         } while (p->if_type == IFT_L2VLAN);
1355
1356         return p->if_output(ifp, m, dst, ro);
1357 }
1358
1359 #ifdef ALTQ
1360 static void
1361 vlan_altq_start(if_t ifp)
1362 {
1363         struct ifaltq *ifq = &ifp->if_snd;
1364         struct mbuf *m;
1365
1366         IFQ_LOCK(ifq);
1367         IFQ_DEQUEUE_NOLOCK(ifq, m);
1368         while (m != NULL) {
1369                 vlan_transmit(ifp, m);
1370                 IFQ_DEQUEUE_NOLOCK(ifq, m);
1371         }
1372         IFQ_UNLOCK(ifq);
1373 }
1374
1375 static int
1376 vlan_altq_transmit(if_t ifp, struct mbuf *m)
1377 {
1378         int err;
1379
1380         if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
1381                 IFQ_ENQUEUE(&ifp->if_snd, m, err);
1382                 if (err == 0)
1383                         vlan_altq_start(ifp);
1384         } else
1385                 err = vlan_transmit(ifp, m);
1386
1387         return (err);
1388 }
1389 #endif  /* ALTQ */
1390
1391 /*
1392  * The ifp->if_qflush entry point for vlan(4) is a no-op.
1393  */
1394 static void
1395 vlan_qflush(struct ifnet *ifp __unused)
1396 {
1397 }
1398
1399 static void
1400 vlan_input(struct ifnet *ifp, struct mbuf *m)
1401 {
1402         struct ifvlantrunk *trunk;
1403         struct ifvlan *ifv;
1404         struct m_tag *mtag;
1405         uint16_t vid, tag;
1406
1407         NET_EPOCH_ASSERT();
1408
1409         trunk = ifp->if_vlantrunk;
1410         if (trunk == NULL) {
1411                 m_freem(m);
1412                 return;
1413         }
1414
1415         if (m->m_flags & M_VLANTAG) {
1416                 /*
1417                  * Packet is tagged, but m contains a normal
1418                  * Ethernet frame; the tag is stored out-of-band.
1419                  */
1420                 tag = m->m_pkthdr.ether_vtag;
1421                 m->m_flags &= ~M_VLANTAG;
1422         } else {
1423                 struct ether_vlan_header *evl;
1424
1425                 /*
1426                  * Packet is tagged in-band as specified by 802.1q.
1427                  */
1428                 switch (ifp->if_type) {
1429                 case IFT_ETHER:
1430                         if (m->m_len < sizeof(*evl) &&
1431                             (m = m_pullup(m, sizeof(*evl))) == NULL) {
1432                                 if_printf(ifp, "cannot pullup VLAN header\n");
1433                                 return;
1434                         }
1435                         evl = mtod(m, struct ether_vlan_header *);
1436                         tag = ntohs(evl->evl_tag);
1437
1438                         /*
1439                          * Remove the 802.1q header by copying the Ethernet
1440                          * addresses over it and adjusting the beginning of
1441                          * the data in the mbuf.  The encapsulated Ethernet
1442                          * type field is already in place.
1443                          */
1444                         bcopy((char *)evl, (char *)evl + ETHER_VLAN_ENCAP_LEN,
1445                               ETHER_HDR_LEN - ETHER_TYPE_LEN);
1446                         m_adj(m, ETHER_VLAN_ENCAP_LEN);
1447                         break;
1448
1449                 default:
1450 #ifdef INVARIANTS
1451                         panic("%s: %s has unsupported if_type %u",
1452                               __func__, ifp->if_xname, ifp->if_type);
1453 #endif
1454                         if_inc_counter(ifp, IFCOUNTER_NOPROTO, 1);
1455                         m_freem(m);
1456                         return;
1457                 }
1458         }
1459
1460         vid = EVL_VLANOFTAG(tag);
1461
1462         ifv = vlan_gethash(trunk, vid);
1463         if (ifv == NULL || !UP_AND_RUNNING(ifv->ifv_ifp)) {
1464                 if_inc_counter(ifp, IFCOUNTER_NOPROTO, 1);
1465                 m_freem(m);
1466                 return;
1467         }
1468
1469         if (V_vlan_mtag_pcp) {
1470                 /*
1471                  * While uncommon, it is possible that we will find a 802.1q
1472                  * packet encapsulated inside another packet that also had an
1473                  * 802.1q header.  For example, ethernet tunneled over IPSEC
1474                  * arriving over ethernet.  In that case, we replace the
1475                  * existing 802.1q PCP m_tag value.
1476                  */
1477                 mtag = m_tag_locate(m, MTAG_8021Q, MTAG_8021Q_PCP_IN, NULL);
1478                 if (mtag == NULL) {
1479                         mtag = m_tag_alloc(MTAG_8021Q, MTAG_8021Q_PCP_IN,
1480                             sizeof(uint8_t), M_NOWAIT);
1481                         if (mtag == NULL) {
1482                                 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1483                                 m_freem(m);
1484                                 return;
1485                         }
1486                         m_tag_prepend(m, mtag);
1487                 }
1488                 *(uint8_t *)(mtag + 1) = EVL_PRIOFTAG(tag);
1489         }
1490
1491         m->m_pkthdr.rcvif = ifv->ifv_ifp;
1492         if_inc_counter(ifv->ifv_ifp, IFCOUNTER_IPACKETS, 1);
1493
1494         /* Pass it back through the parent's input routine. */
1495         (*ifv->ifv_ifp->if_input)(ifv->ifv_ifp, m);
1496 }
1497
1498 static void
1499 vlan_lladdr_fn(void *arg, int pending __unused)
1500 {
1501         struct ifvlan *ifv;
1502         struct ifnet *ifp;
1503
1504         ifv = (struct ifvlan *)arg;
1505         ifp = ifv->ifv_ifp;
1506
1507         CURVNET_SET(ifp->if_vnet);
1508
1509         /* The ifv_ifp already has the lladdr copied in. */
1510         if_setlladdr(ifp, IF_LLADDR(ifp), ifp->if_addrlen);
1511
1512         CURVNET_RESTORE();
1513 }
1514
1515 static int
1516 vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t vid,
1517         uint16_t proto)
1518 {
1519         struct epoch_tracker et;
1520         struct ifvlantrunk *trunk;
1521         struct ifnet *ifp;
1522         int error = 0;
1523
1524         /*
1525          * We can handle non-ethernet hardware types as long as
1526          * they handle the tagging and headers themselves.
1527          */
1528         if (p->if_type != IFT_ETHER &&
1529             p->if_type != IFT_L2VLAN &&
1530             (p->if_capenable & IFCAP_VLAN_HWTAGGING) == 0)
1531                 return (EPROTONOSUPPORT);
1532         if ((p->if_flags & VLAN_IFFLAGS) != VLAN_IFFLAGS)
1533                 return (EPROTONOSUPPORT);
1534         /*
1535          * Don't let the caller set up a VLAN VID with
1536          * anything except VLID bits.
1537          * VID numbers 0x0 and 0xFFF are reserved.
1538          */
1539         if (vid == 0 || vid == 0xFFF || (vid & ~EVL_VLID_MASK))
1540                 return (EINVAL);
1541         if (ifv->ifv_trunk)
1542                 return (EBUSY);
1543
1544         VLAN_XLOCK();
1545         if (p->if_vlantrunk == NULL) {
1546                 trunk = malloc(sizeof(struct ifvlantrunk),
1547                     M_VLAN, M_WAITOK | M_ZERO);
1548                 vlan_inithash(trunk);
1549                 TRUNK_LOCK_INIT(trunk);
1550                 TRUNK_WLOCK(trunk);
1551                 p->if_vlantrunk = trunk;
1552                 trunk->parent = p;
1553                 if_ref(trunk->parent);
1554                 TRUNK_WUNLOCK(trunk);
1555         } else {
1556                 trunk = p->if_vlantrunk;
1557         }
1558
1559         ifv->ifv_vid = vid;     /* must set this before vlan_inshash() */
1560         ifv->ifv_pcp = 0;       /* Default: best effort delivery. */
1561         error = vlan_inshash(trunk, ifv);
1562         if (error)
1563                 goto done;
1564         ifv->ifv_proto = proto;
1565         ifv->ifv_encaplen = ETHER_VLAN_ENCAP_LEN;
1566         ifv->ifv_mintu = ETHERMIN;
1567         ifv->ifv_pflags = 0;
1568         ifv->ifv_capenable = -1;
1569
1570         /*
1571          * If the parent supports the VLAN_MTU capability,
1572          * i.e. can Tx/Rx larger than ETHER_MAX_LEN frames,
1573          * use it.
1574          */
1575         if (p->if_capenable & IFCAP_VLAN_MTU) {
1576                 /*
1577                  * No need to fudge the MTU since the parent can
1578                  * handle extended frames.
1579                  */
1580                 ifv->ifv_mtufudge = 0;
1581         } else {
1582                 /*
1583                  * Fudge the MTU by the encapsulation size.  This
1584                  * makes us incompatible with strictly compliant
1585                  * 802.1Q implementations, but allows us to use
1586                  * the feature with other NetBSD implementations,
1587                  * which might still be useful.
1588                  */
1589                 ifv->ifv_mtufudge = ifv->ifv_encaplen;
1590         }
1591
1592         ifv->ifv_trunk = trunk;
1593         ifp = ifv->ifv_ifp;
1594         /*
1595          * Initialize fields from our parent.  This duplicates some
1596          * work with ether_ifattach() but allows for non-ethernet
1597          * interfaces to also work.
1598          */
1599         ifp->if_mtu = p->if_mtu - ifv->ifv_mtufudge;
1600         ifp->if_baudrate = p->if_baudrate;
1601         ifp->if_input = p->if_input;
1602         ifp->if_resolvemulti = p->if_resolvemulti;
1603         ifp->if_addrlen = p->if_addrlen;
1604         ifp->if_broadcastaddr = p->if_broadcastaddr;
1605         ifp->if_pcp = ifv->ifv_pcp;
1606
1607         /*
1608          * We wrap the parent's if_output using vlan_output to ensure that it
1609          * can't become stale.
1610          */
1611         ifp->if_output = vlan_output;
1612
1613         /*
1614          * Copy only a selected subset of flags from the parent.
1615          * Other flags are none of our business.
1616          */
1617 #define VLAN_COPY_FLAGS (IFF_SIMPLEX)
1618         ifp->if_flags &= ~VLAN_COPY_FLAGS;
1619         ifp->if_flags |= p->if_flags & VLAN_COPY_FLAGS;
1620 #undef VLAN_COPY_FLAGS
1621
1622         ifp->if_link_state = p->if_link_state;
1623
1624         NET_EPOCH_ENTER(et);
1625         vlan_capabilities(ifv);
1626         NET_EPOCH_EXIT(et);
1627
1628         /*
1629          * Set up our interface address to reflect the underlying
1630          * physical interface's.
1631          */
1632         TASK_INIT(&ifv->lladdr_task, 0, vlan_lladdr_fn, ifv);
1633         ((struct sockaddr_dl *)ifp->if_addr->ifa_addr)->sdl_alen =
1634             p->if_addrlen;
1635
1636         /*
1637          * Do not schedule link address update if it was the same
1638          * as previous parent's. This helps avoid updating for each
1639          * associated llentry.
1640          */
1641         if (memcmp(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen) != 0) {
1642                 bcopy(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen);
1643                 taskqueue_enqueue(taskqueue_thread, &ifv->lladdr_task);
1644         }
1645
1646         /* We are ready for operation now. */
1647         ifp->if_drv_flags |= IFF_DRV_RUNNING;
1648
1649         /* Update flags on the parent, if necessary. */
1650         vlan_setflags(ifp, 1);
1651
1652         /*
1653          * Configure multicast addresses that may already be
1654          * joined on the vlan device.
1655          */
1656         (void)vlan_setmulti(ifp);
1657
1658 done:
1659         if (error == 0)
1660                 EVENTHANDLER_INVOKE(vlan_config, p, ifv->ifv_vid);
1661         VLAN_XUNLOCK();
1662
1663         return (error);
1664 }
1665
1666 static void
1667 vlan_unconfig(struct ifnet *ifp)
1668 {
1669
1670         VLAN_XLOCK();
1671         vlan_unconfig_locked(ifp, 0);
1672         VLAN_XUNLOCK();
1673 }
1674
1675 static void
1676 vlan_unconfig_locked(struct ifnet *ifp, int departing)
1677 {
1678         struct ifvlantrunk *trunk;
1679         struct vlan_mc_entry *mc;
1680         struct ifvlan *ifv;
1681         struct ifnet  *parent;
1682         int error;
1683
1684         VLAN_XLOCK_ASSERT();
1685
1686         ifv = ifp->if_softc;
1687         trunk = ifv->ifv_trunk;
1688         parent = NULL;
1689
1690         if (trunk != NULL) {
1691                 parent = trunk->parent;
1692
1693                 /*
1694                  * Since the interface is being unconfigured, we need to
1695                  * empty the list of multicast groups that we may have joined
1696                  * while we were alive from the parent's list.
1697                  */
1698                 while ((mc = CK_SLIST_FIRST(&ifv->vlan_mc_listhead)) != NULL) {
1699                         /*
1700                          * If the parent interface is being detached,
1701                          * all its multicast addresses have already
1702                          * been removed.  Warn about errors if
1703                          * if_delmulti() does fail, but don't abort as
1704                          * all callers expect vlan destruction to
1705                          * succeed.
1706                          */
1707                         if (!departing) {
1708                                 error = if_delmulti(parent,
1709                                     (struct sockaddr *)&mc->mc_addr);
1710                                 if (error)
1711                                         if_printf(ifp,
1712                     "Failed to delete multicast address from parent: %d\n",
1713                                             error);
1714                         }
1715                         CK_SLIST_REMOVE_HEAD(&ifv->vlan_mc_listhead, mc_entries);
1716                         NET_EPOCH_CALL(vlan_mc_free, &mc->mc_epoch_ctx);
1717                 }
1718
1719                 vlan_setflags(ifp, 0); /* clear special flags on parent */
1720
1721                 vlan_remhash(trunk, ifv);
1722                 ifv->ifv_trunk = NULL;
1723
1724                 /*
1725                  * Check if we were the last.
1726                  */
1727                 if (trunk->refcnt == 0) {
1728                         parent->if_vlantrunk = NULL;
1729                         NET_EPOCH_WAIT();
1730                         trunk_destroy(trunk);
1731                 }
1732         }
1733
1734         /* Disconnect from parent. */
1735         if (ifv->ifv_pflags)
1736                 if_printf(ifp, "%s: ifv_pflags unclean\n", __func__);
1737         ifp->if_mtu = ETHERMTU;
1738         ifp->if_link_state = LINK_STATE_UNKNOWN;
1739         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1740
1741         /*
1742          * Only dispatch an event if vlan was
1743          * attached, otherwise there is nothing
1744          * to cleanup anyway.
1745          */
1746         if (parent != NULL)
1747                 EVENTHANDLER_INVOKE(vlan_unconfig, parent, ifv->ifv_vid);
1748 }
1749
1750 /* Handle a reference counted flag that should be set on the parent as well */
1751 static int
1752 vlan_setflag(struct ifnet *ifp, int flag, int status,
1753              int (*func)(struct ifnet *, int))
1754 {
1755         struct ifvlan *ifv;
1756         int error;
1757
1758         VLAN_SXLOCK_ASSERT();
1759
1760         ifv = ifp->if_softc;
1761         status = status ? (ifp->if_flags & flag) : 0;
1762         /* Now "status" contains the flag value or 0 */
1763
1764         /*
1765          * See if recorded parent's status is different from what
1766          * we want it to be.  If it is, flip it.  We record parent's
1767          * status in ifv_pflags so that we won't clear parent's flag
1768          * we haven't set.  In fact, we don't clear or set parent's
1769          * flags directly, but get or release references to them.
1770          * That's why we can be sure that recorded flags still are
1771          * in accord with actual parent's flags.
1772          */
1773         if (status != (ifv->ifv_pflags & flag)) {
1774                 error = (*func)(PARENT(ifv), status);
1775                 if (error)
1776                         return (error);
1777                 ifv->ifv_pflags &= ~flag;
1778                 ifv->ifv_pflags |= status;
1779         }
1780         return (0);
1781 }
1782
1783 /*
1784  * Handle IFF_* flags that require certain changes on the parent:
1785  * if "status" is true, update parent's flags respective to our if_flags;
1786  * if "status" is false, forcedly clear the flags set on parent.
1787  */
1788 static int
1789 vlan_setflags(struct ifnet *ifp, int status)
1790 {
1791         int error, i;
1792
1793         for (i = 0; vlan_pflags[i].flag; i++) {
1794                 error = vlan_setflag(ifp, vlan_pflags[i].flag,
1795                                      status, vlan_pflags[i].func);
1796                 if (error)
1797                         return (error);
1798         }
1799         return (0);
1800 }
1801
1802 /* Inform all vlans that their parent has changed link state */
1803 static void
1804 vlan_link_state(struct ifnet *ifp)
1805 {
1806         struct epoch_tracker et;
1807         struct ifvlantrunk *trunk;
1808         struct ifvlan *ifv;
1809
1810         NET_EPOCH_ENTER(et);
1811         trunk = ifp->if_vlantrunk;
1812         if (trunk == NULL) {
1813                 NET_EPOCH_EXIT(et);
1814                 return;
1815         }
1816
1817         TRUNK_WLOCK(trunk);
1818         VLAN_FOREACH(ifv, trunk) {
1819                 ifv->ifv_ifp->if_baudrate = trunk->parent->if_baudrate;
1820                 if_link_state_change(ifv->ifv_ifp,
1821                     trunk->parent->if_link_state);
1822         }
1823         TRUNK_WUNLOCK(trunk);
1824         NET_EPOCH_EXIT(et);
1825 }
1826
1827 static void
1828 vlan_capabilities(struct ifvlan *ifv)
1829 {
1830         struct ifnet *p;
1831         struct ifnet *ifp;
1832         struct ifnet_hw_tsomax hw_tsomax;
1833         int cap = 0, ena = 0, mena;
1834         u_long hwa = 0;
1835
1836         NET_EPOCH_ASSERT();
1837         VLAN_SXLOCK_ASSERT();
1838
1839         p = PARENT(ifv);
1840         ifp = ifv->ifv_ifp;
1841
1842         /* Mask parent interface enabled capabilities disabled by user. */
1843         mena = p->if_capenable & ifv->ifv_capenable;
1844
1845         /*
1846          * If the parent interface can do checksum offloading
1847          * on VLANs, then propagate its hardware-assisted
1848          * checksumming flags. Also assert that checksum
1849          * offloading requires hardware VLAN tagging.
1850          */
1851         if (p->if_capabilities & IFCAP_VLAN_HWCSUM)
1852                 cap |= p->if_capabilities & (IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6);
1853         if (p->if_capenable & IFCAP_VLAN_HWCSUM &&
1854             p->if_capenable & IFCAP_VLAN_HWTAGGING) {
1855                 ena |= mena & (IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6);
1856                 if (ena & IFCAP_TXCSUM)
1857                         hwa |= p->if_hwassist & (CSUM_IP | CSUM_TCP |
1858                             CSUM_UDP | CSUM_SCTP);
1859                 if (ena & IFCAP_TXCSUM_IPV6)
1860                         hwa |= p->if_hwassist & (CSUM_TCP_IPV6 |
1861                             CSUM_UDP_IPV6 | CSUM_SCTP_IPV6);
1862         }
1863
1864         /*
1865          * If the parent interface can do TSO on VLANs then
1866          * propagate the hardware-assisted flag. TSO on VLANs
1867          * does not necessarily require hardware VLAN tagging.
1868          */
1869         memset(&hw_tsomax, 0, sizeof(hw_tsomax));
1870         if_hw_tsomax_common(p, &hw_tsomax);
1871         if_hw_tsomax_update(ifp, &hw_tsomax);
1872         if (p->if_capabilities & IFCAP_VLAN_HWTSO)
1873                 cap |= p->if_capabilities & IFCAP_TSO;
1874         if (p->if_capenable & IFCAP_VLAN_HWTSO) {
1875                 ena |= mena & IFCAP_TSO;
1876                 if (ena & IFCAP_TSO)
1877                         hwa |= p->if_hwassist & CSUM_TSO;
1878         }
1879
1880         /*
1881          * If the parent interface can do LRO and checksum offloading on
1882          * VLANs, then guess it may do LRO on VLANs.  False positive here
1883          * cost nothing, while false negative may lead to some confusions.
1884          */
1885         if (p->if_capabilities & IFCAP_VLAN_HWCSUM)
1886                 cap |= p->if_capabilities & IFCAP_LRO;
1887         if (p->if_capenable & IFCAP_VLAN_HWCSUM)
1888                 ena |= p->if_capenable & IFCAP_LRO;
1889
1890         /*
1891          * If the parent interface can offload TCP connections over VLANs then
1892          * propagate its TOE capability to the VLAN interface.
1893          *
1894          * All TOE drivers in the tree today can deal with VLANs.  If this
1895          * changes then IFCAP_VLAN_TOE should be promoted to a full capability
1896          * with its own bit.
1897          */
1898 #define IFCAP_VLAN_TOE IFCAP_TOE
1899         if (p->if_capabilities & IFCAP_VLAN_TOE)
1900                 cap |= p->if_capabilities & IFCAP_TOE;
1901         if (p->if_capenable & IFCAP_VLAN_TOE) {
1902                 TOEDEV(ifp) = TOEDEV(p);
1903                 ena |= mena & IFCAP_TOE;
1904         }
1905
1906         /*
1907          * If the parent interface supports dynamic link state, so does the
1908          * VLAN interface.
1909          */
1910         cap |= (p->if_capabilities & IFCAP_LINKSTATE);
1911         ena |= (mena & IFCAP_LINKSTATE);
1912
1913 #ifdef RATELIMIT
1914         /*
1915          * If the parent interface supports ratelimiting, so does the
1916          * VLAN interface.
1917          */
1918         cap |= (p->if_capabilities & IFCAP_TXRTLMT);
1919         ena |= (mena & IFCAP_TXRTLMT);
1920 #endif
1921
1922         /*
1923          * If the parent interface supports unmapped mbufs, so does
1924          * the VLAN interface.  Note that this should be fine even for
1925          * interfaces that don't support hardware tagging as headers
1926          * are prepended in normal mbufs to unmapped mbufs holding
1927          * payload data.
1928          */
1929         cap |= (p->if_capabilities & IFCAP_MEXTPG);
1930         ena |= (mena & IFCAP_MEXTPG);
1931
1932         /*
1933          * If the parent interface can offload encryption and segmentation
1934          * of TLS records over TCP, propagate it's capability to the VLAN
1935          * interface.
1936          *
1937          * All TLS drivers in the tree today can deal with VLANs.  If
1938          * this ever changes, then a new IFCAP_VLAN_TXTLS can be
1939          * defined.
1940          */
1941         if (p->if_capabilities & (IFCAP_TXTLS | IFCAP_TXTLS_RTLMT))
1942                 cap |= p->if_capabilities & (IFCAP_TXTLS | IFCAP_TXTLS_RTLMT);
1943         if (p->if_capenable & (IFCAP_TXTLS | IFCAP_TXTLS_RTLMT))
1944                 ena |= mena & (IFCAP_TXTLS | IFCAP_TXTLS_RTLMT);
1945
1946         ifp->if_capabilities = cap;
1947         ifp->if_capenable = ena;
1948         ifp->if_hwassist = hwa;
1949 }
1950
1951 static void
1952 vlan_trunk_capabilities(struct ifnet *ifp)
1953 {
1954         struct epoch_tracker et;
1955         struct ifvlantrunk *trunk;
1956         struct ifvlan *ifv;
1957
1958         VLAN_SLOCK();
1959         trunk = ifp->if_vlantrunk;
1960         if (trunk == NULL) {
1961                 VLAN_SUNLOCK();
1962                 return;
1963         }
1964         NET_EPOCH_ENTER(et);
1965         VLAN_FOREACH(ifv, trunk)
1966                 vlan_capabilities(ifv);
1967         NET_EPOCH_EXIT(et);
1968         VLAN_SUNLOCK();
1969 }
1970
1971 static int
1972 vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1973 {
1974         struct ifnet *p;
1975         struct ifreq *ifr;
1976 #ifdef INET
1977         struct ifaddr *ifa;
1978 #endif
1979         struct ifvlan *ifv;
1980         struct ifvlantrunk *trunk;
1981         struct vlanreq vlr;
1982         int error = 0, oldmtu;
1983
1984         ifr = (struct ifreq *)data;
1985 #ifdef INET
1986         ifa = (struct ifaddr *) data;
1987 #endif
1988         ifv = ifp->if_softc;
1989
1990         switch (cmd) {
1991         case SIOCSIFADDR:
1992                 ifp->if_flags |= IFF_UP;
1993 #ifdef INET
1994                 if (ifa->ifa_addr->sa_family == AF_INET)
1995                         arp_ifinit(ifp, ifa);
1996 #endif
1997                 break;
1998         case SIOCGIFADDR:
1999                 bcopy(IF_LLADDR(ifp), &ifr->ifr_addr.sa_data[0],
2000                     ifp->if_addrlen);
2001                 break;
2002         case SIOCGIFMEDIA:
2003                 VLAN_SLOCK();
2004                 if (TRUNK(ifv) != NULL) {
2005                         p = PARENT(ifv);
2006                         if_ref(p);
2007                         error = (*p->if_ioctl)(p, SIOCGIFMEDIA, data);
2008                         if_rele(p);
2009                         /* Limit the result to the parent's current config. */
2010                         if (error == 0) {
2011                                 struct ifmediareq *ifmr;
2012
2013                                 ifmr = (struct ifmediareq *)data;
2014                                 if (ifmr->ifm_count >= 1 && ifmr->ifm_ulist) {
2015                                         ifmr->ifm_count = 1;
2016                                         error = copyout(&ifmr->ifm_current,
2017                                                 ifmr->ifm_ulist,
2018                                                 sizeof(int));
2019                                 }
2020                         }
2021                 } else {
2022                         error = EINVAL;
2023                 }
2024                 VLAN_SUNLOCK();
2025                 break;
2026
2027         case SIOCSIFMEDIA:
2028                 error = EINVAL;
2029                 break;
2030
2031         case SIOCSIFMTU:
2032                 /*
2033                  * Set the interface MTU.
2034                  */
2035                 VLAN_SLOCK();
2036                 trunk = TRUNK(ifv);
2037                 if (trunk != NULL) {
2038                         TRUNK_WLOCK(trunk);
2039                         if (ifr->ifr_mtu >
2040                              (PARENT(ifv)->if_mtu - ifv->ifv_mtufudge) ||
2041                             ifr->ifr_mtu <
2042                              (ifv->ifv_mintu - ifv->ifv_mtufudge))
2043                                 error = EINVAL;
2044                         else
2045                                 ifp->if_mtu = ifr->ifr_mtu;
2046                         TRUNK_WUNLOCK(trunk);
2047                 } else
2048                         error = EINVAL;
2049                 VLAN_SUNLOCK();
2050                 break;
2051
2052         case SIOCSETVLAN:
2053 #ifdef VIMAGE
2054                 /*
2055                  * XXXRW/XXXBZ: The goal in these checks is to allow a VLAN
2056                  * interface to be delegated to a jail without allowing the
2057                  * jail to change what underlying interface/VID it is
2058                  * associated with.  We are not entirely convinced that this
2059                  * is the right way to accomplish that policy goal.
2060                  */
2061                 if (ifp->if_vnet != ifp->if_home_vnet) {
2062                         error = EPERM;
2063                         break;
2064                 }
2065 #endif
2066                 error = copyin(ifr_data_get_ptr(ifr), &vlr, sizeof(vlr));
2067                 if (error)
2068                         break;
2069                 if (vlr.vlr_parent[0] == '\0') {
2070                         vlan_unconfig(ifp);
2071                         break;
2072                 }
2073                 p = ifunit_ref(vlr.vlr_parent);
2074                 if (p == NULL) {
2075                         error = ENOENT;
2076                         break;
2077                 }
2078 #ifdef COMPAT_FREEBSD12
2079                 if (vlr.vlr_proto == 0)
2080                         vlr.vlr_proto = ETHERTYPE_VLAN;
2081 #endif
2082                 oldmtu = ifp->if_mtu;
2083                 error = vlan_config(ifv, p, vlr.vlr_tag, vlr.vlr_proto);
2084                 if_rele(p);
2085
2086                 /*
2087                  * VLAN MTU may change during addition of the vlandev.
2088                  * If it did, do network layer specific procedure.
2089                  */
2090                 if (ifp->if_mtu != oldmtu) {
2091 #ifdef INET6
2092                         nd6_setmtu(ifp);
2093 #endif
2094                         rt_updatemtu(ifp);
2095                 }
2096                 break;
2097
2098         case SIOCGETVLAN:
2099 #ifdef VIMAGE
2100                 if (ifp->if_vnet != ifp->if_home_vnet) {
2101                         error = EPERM;
2102                         break;
2103                 }
2104 #endif
2105                 bzero(&vlr, sizeof(vlr));
2106                 VLAN_SLOCK();
2107                 if (TRUNK(ifv) != NULL) {
2108                         strlcpy(vlr.vlr_parent, PARENT(ifv)->if_xname,
2109                             sizeof(vlr.vlr_parent));
2110                         vlr.vlr_tag = ifv->ifv_vid;
2111                         vlr.vlr_proto = ifv->ifv_proto;
2112                 }
2113                 VLAN_SUNLOCK();
2114                 error = copyout(&vlr, ifr_data_get_ptr(ifr), sizeof(vlr));
2115                 break;
2116
2117         case SIOCSIFFLAGS:
2118                 /*
2119                  * We should propagate selected flags to the parent,
2120                  * e.g., promiscuous mode.
2121                  */
2122                 VLAN_XLOCK();
2123                 if (TRUNK(ifv) != NULL)
2124                         error = vlan_setflags(ifp, 1);
2125                 VLAN_XUNLOCK();
2126                 break;
2127
2128         case SIOCADDMULTI:
2129         case SIOCDELMULTI:
2130                 /*
2131                  * If we don't have a parent, just remember the membership for
2132                  * when we do.
2133                  *
2134                  * XXX We need the rmlock here to avoid sleeping while
2135                  * holding in6_multi_mtx.
2136                  */
2137                 VLAN_XLOCK();
2138                 trunk = TRUNK(ifv);
2139                 if (trunk != NULL)
2140                         error = vlan_setmulti(ifp);
2141                 VLAN_XUNLOCK();
2142
2143                 break;
2144         case SIOCGVLANPCP:
2145 #ifdef VIMAGE
2146                 if (ifp->if_vnet != ifp->if_home_vnet) {
2147                         error = EPERM;
2148                         break;
2149                 }
2150 #endif
2151                 ifr->ifr_vlan_pcp = ifv->ifv_pcp;
2152                 break;
2153
2154         case SIOCSVLANPCP:
2155 #ifdef VIMAGE
2156                 if (ifp->if_vnet != ifp->if_home_vnet) {
2157                         error = EPERM;
2158                         break;
2159                 }
2160 #endif
2161                 error = priv_check(curthread, PRIV_NET_SETVLANPCP);
2162                 if (error)
2163                         break;
2164                 if (ifr->ifr_vlan_pcp > VLAN_PCP_MAX) {
2165                         error = EINVAL;
2166                         break;
2167                 }
2168                 ifv->ifv_pcp = ifr->ifr_vlan_pcp;
2169                 ifp->if_pcp = ifv->ifv_pcp;
2170                 /* broadcast event about PCP change */
2171                 EVENTHANDLER_INVOKE(ifnet_event, ifp, IFNET_EVENT_PCP);
2172                 break;
2173
2174         case SIOCSIFCAP:
2175                 VLAN_SLOCK();
2176                 ifv->ifv_capenable = ifr->ifr_reqcap;
2177                 trunk = TRUNK(ifv);
2178                 if (trunk != NULL) {
2179                         struct epoch_tracker et;
2180
2181                         NET_EPOCH_ENTER(et);
2182                         vlan_capabilities(ifv);
2183                         NET_EPOCH_EXIT(et);
2184                 }
2185                 VLAN_SUNLOCK();
2186                 break;
2187
2188         default:
2189                 error = EINVAL;
2190                 break;
2191         }
2192
2193         return (error);
2194 }
2195
2196 #if defined(KERN_TLS) || defined(RATELIMIT)
2197 static int
2198 vlan_snd_tag_alloc(struct ifnet *ifp,
2199     union if_snd_tag_alloc_params *params,
2200     struct m_snd_tag **ppmt)
2201 {
2202         struct epoch_tracker et;
2203         const struct if_snd_tag_sw *sw;
2204         struct vlan_snd_tag *vst;
2205         struct ifvlan *ifv;
2206         struct ifnet *parent;
2207         int error;
2208
2209         switch (params->hdr.type) {
2210 #ifdef RATELIMIT
2211         case IF_SND_TAG_TYPE_UNLIMITED:
2212                 sw = &vlan_snd_tag_ul_sw;
2213                 break;
2214         case IF_SND_TAG_TYPE_RATE_LIMIT:
2215                 sw = &vlan_snd_tag_rl_sw;
2216                 break;
2217 #endif
2218 #ifdef KERN_TLS
2219         case IF_SND_TAG_TYPE_TLS:
2220                 sw = &vlan_snd_tag_tls_sw;
2221                 break;
2222 #ifdef RATELIMIT
2223         case IF_SND_TAG_TYPE_TLS_RATE_LIMIT:
2224                 sw = &vlan_snd_tag_tls_rl_sw;
2225                 break;
2226 #endif
2227 #endif
2228         default:
2229                 return (EOPNOTSUPP);
2230         }
2231
2232         NET_EPOCH_ENTER(et);
2233         ifv = ifp->if_softc;
2234         if (ifv->ifv_trunk != NULL)
2235                 parent = PARENT(ifv);
2236         else
2237                 parent = NULL;
2238         if (parent == NULL) {
2239                 NET_EPOCH_EXIT(et);
2240                 return (EOPNOTSUPP);
2241         }
2242         if_ref(parent);
2243         NET_EPOCH_EXIT(et);
2244
2245         vst = malloc(sizeof(*vst), M_VLAN, M_NOWAIT);
2246         if (vst == NULL) {
2247                 if_rele(parent);
2248                 return (ENOMEM);
2249         }
2250
2251         error = m_snd_tag_alloc(parent, params, &vst->tag);
2252         if_rele(parent);
2253         if (error) {
2254                 free(vst, M_VLAN);
2255                 return (error);
2256         }
2257
2258         m_snd_tag_init(&vst->com, ifp, sw);
2259
2260         *ppmt = &vst->com;
2261         return (0);
2262 }
2263
2264 static struct m_snd_tag *
2265 vlan_next_snd_tag(struct m_snd_tag *mst)
2266 {
2267         struct vlan_snd_tag *vst;
2268
2269         vst = mst_to_vst(mst);
2270         return (vst->tag);
2271 }
2272
2273 static int
2274 vlan_snd_tag_modify(struct m_snd_tag *mst,
2275     union if_snd_tag_modify_params *params)
2276 {
2277         struct vlan_snd_tag *vst;
2278
2279         vst = mst_to_vst(mst);
2280         return (vst->tag->sw->snd_tag_modify(vst->tag, params));
2281 }
2282
2283 static int
2284 vlan_snd_tag_query(struct m_snd_tag *mst,
2285     union if_snd_tag_query_params *params)
2286 {
2287         struct vlan_snd_tag *vst;
2288
2289         vst = mst_to_vst(mst);
2290         return (vst->tag->sw->snd_tag_query(vst->tag, params));
2291 }
2292
2293 static void
2294 vlan_snd_tag_free(struct m_snd_tag *mst)
2295 {
2296         struct vlan_snd_tag *vst;
2297
2298         vst = mst_to_vst(mst);
2299         m_snd_tag_rele(vst->tag);
2300         free(vst, M_VLAN);
2301 }
2302
2303 static void
2304 vlan_ratelimit_query(struct ifnet *ifp __unused, struct if_ratelimit_query_results *q)
2305 {
2306         /*
2307          * For vlan, we have an indirect
2308          * interface. The caller needs to
2309          * get a ratelimit tag on the actual
2310          * interface the flow will go on.
2311          */
2312         q->rate_table = NULL;
2313         q->flags = RT_IS_INDIRECT;
2314         q->max_flows = 0;
2315         q->number_of_rates = 0;
2316 }
2317
2318 #endif