]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - net/bridge/br_vlan.c
Merge tag 'vmwgfx-fixes-4.3-151001' of git://people.freedesktop.org/~thomash/linux...
[mirror_ubuntu-bionic-kernel.git] / net / bridge / br_vlan.c
1 #include <linux/kernel.h>
2 #include <linux/netdevice.h>
3 #include <linux/rtnetlink.h>
4 #include <linux/slab.h>
5 #include <net/switchdev.h>
6
7 #include "br_private.h"
8
9 static void __vlan_add_pvid(struct net_port_vlans *v, u16 vid)
10 {
11 if (v->pvid == vid)
12 return;
13
14 smp_wmb();
15 v->pvid = vid;
16 }
17
18 static void __vlan_delete_pvid(struct net_port_vlans *v, u16 vid)
19 {
20 if (v->pvid != vid)
21 return;
22
23 smp_wmb();
24 v->pvid = 0;
25 }
26
27 static void __vlan_add_flags(struct net_port_vlans *v, u16 vid, u16 flags)
28 {
29 if (flags & BRIDGE_VLAN_INFO_PVID)
30 __vlan_add_pvid(v, vid);
31 else
32 __vlan_delete_pvid(v, vid);
33
34 if (flags & BRIDGE_VLAN_INFO_UNTAGGED)
35 set_bit(vid, v->untagged_bitmap);
36 else
37 clear_bit(vid, v->untagged_bitmap);
38 }
39
40 static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br,
41 u16 vid, u16 flags)
42 {
43 const struct net_device_ops *ops = dev->netdev_ops;
44 int err;
45
46 /* If driver uses VLAN ndo ops, use 8021q to install vid
47 * on device, otherwise try switchdev ops to install vid.
48 */
49
50 if (ops->ndo_vlan_rx_add_vid) {
51 err = vlan_vid_add(dev, br->vlan_proto, vid);
52 } else {
53 struct switchdev_obj vlan_obj = {
54 .id = SWITCHDEV_OBJ_PORT_VLAN,
55 .u.vlan = {
56 .flags = flags,
57 .vid_begin = vid,
58 .vid_end = vid,
59 },
60 };
61
62 err = switchdev_port_obj_add(dev, &vlan_obj);
63 if (err == -EOPNOTSUPP)
64 err = 0;
65 }
66
67 return err;
68 }
69
70 static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags)
71 {
72 struct net_bridge_port *p = NULL;
73 struct net_bridge *br;
74 struct net_device *dev;
75 int err;
76
77 if (test_bit(vid, v->vlan_bitmap)) {
78 __vlan_add_flags(v, vid, flags);
79 return 0;
80 }
81
82 if (v->port_idx) {
83 p = v->parent.port;
84 br = p->br;
85 dev = p->dev;
86 } else {
87 br = v->parent.br;
88 dev = br->dev;
89 }
90
91 if (p) {
92 /* Add VLAN to the device filter if it is supported.
93 * This ensures tagged traffic enters the bridge when
94 * promiscuous mode is disabled by br_manage_promisc().
95 */
96 err = __vlan_vid_add(dev, br, vid, flags);
97 if (err)
98 return err;
99 }
100
101 err = br_fdb_insert(br, p, dev->dev_addr, vid);
102 if (err) {
103 br_err(br, "failed insert local address into bridge "
104 "forwarding table\n");
105 goto out_filt;
106 }
107
108 set_bit(vid, v->vlan_bitmap);
109 v->num_vlans++;
110 __vlan_add_flags(v, vid, flags);
111
112 return 0;
113
114 out_filt:
115 if (p)
116 vlan_vid_del(dev, br->vlan_proto, vid);
117 return err;
118 }
119
120 static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br,
121 u16 vid)
122 {
123 const struct net_device_ops *ops = dev->netdev_ops;
124 int err = 0;
125
126 /* If driver uses VLAN ndo ops, use 8021q to delete vid
127 * on device, otherwise try switchdev ops to delete vid.
128 */
129
130 if (ops->ndo_vlan_rx_kill_vid) {
131 vlan_vid_del(dev, br->vlan_proto, vid);
132 } else {
133 struct switchdev_obj vlan_obj = {
134 .id = SWITCHDEV_OBJ_PORT_VLAN,
135 .u.vlan = {
136 .vid_begin = vid,
137 .vid_end = vid,
138 },
139 };
140
141 err = switchdev_port_obj_del(dev, &vlan_obj);
142 if (err == -EOPNOTSUPP)
143 err = 0;
144 }
145
146 return err;
147 }
148
149 static int __vlan_del(struct net_port_vlans *v, u16 vid)
150 {
151 if (!test_bit(vid, v->vlan_bitmap))
152 return -EINVAL;
153
154 __vlan_delete_pvid(v, vid);
155 clear_bit(vid, v->untagged_bitmap);
156
157 if (v->port_idx) {
158 struct net_bridge_port *p = v->parent.port;
159 int err;
160
161 err = __vlan_vid_del(p->dev, p->br, vid);
162 if (err)
163 return err;
164 }
165
166 clear_bit(vid, v->vlan_bitmap);
167 v->num_vlans--;
168 if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) {
169 if (v->port_idx)
170 RCU_INIT_POINTER(v->parent.port->vlan_info, NULL);
171 else
172 RCU_INIT_POINTER(v->parent.br->vlan_info, NULL);
173 kfree_rcu(v, rcu);
174 }
175 return 0;
176 }
177
178 static void __vlan_flush(struct net_port_vlans *v)
179 {
180 smp_wmb();
181 v->pvid = 0;
182 bitmap_zero(v->vlan_bitmap, VLAN_N_VID);
183 if (v->port_idx)
184 RCU_INIT_POINTER(v->parent.port->vlan_info, NULL);
185 else
186 RCU_INIT_POINTER(v->parent.br->vlan_info, NULL);
187 kfree_rcu(v, rcu);
188 }
189
190 struct sk_buff *br_handle_vlan(struct net_bridge *br,
191 const struct net_port_vlans *pv,
192 struct sk_buff *skb)
193 {
194 u16 vid;
195
196 /* If this packet was not filtered at input, let it pass */
197 if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
198 goto out;
199
200 /* Vlan filter table must be configured at this point. The
201 * only exception is the bridge is set in promisc mode and the
202 * packet is destined for the bridge device. In this case
203 * pass the packet as is.
204 */
205 if (!pv) {
206 if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) {
207 goto out;
208 } else {
209 kfree_skb(skb);
210 return NULL;
211 }
212 }
213
214 /* At this point, we know that the frame was filtered and contains
215 * a valid vlan id. If the vlan id is set in the untagged bitmap,
216 * send untagged; otherwise, send tagged.
217 */
218 br_vlan_get_tag(skb, &vid);
219 if (test_bit(vid, pv->untagged_bitmap))
220 skb->vlan_tci = 0;
221
222 out:
223 return skb;
224 }
225
226 /* Called under RCU */
227 bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
228 struct sk_buff *skb, u16 *vid)
229 {
230 bool tagged;
231 __be16 proto;
232
233 /* If VLAN filtering is disabled on the bridge, all packets are
234 * permitted.
235 */
236 if (!br->vlan_enabled) {
237 BR_INPUT_SKB_CB(skb)->vlan_filtered = false;
238 return true;
239 }
240
241 /* If there are no vlan in the permitted list, all packets are
242 * rejected.
243 */
244 if (!v)
245 goto drop;
246
247 BR_INPUT_SKB_CB(skb)->vlan_filtered = true;
248 proto = br->vlan_proto;
249
250 /* If vlan tx offload is disabled on bridge device and frame was
251 * sent from vlan device on the bridge device, it does not have
252 * HW accelerated vlan tag.
253 */
254 if (unlikely(!skb_vlan_tag_present(skb) &&
255 skb->protocol == proto)) {
256 skb = skb_vlan_untag(skb);
257 if (unlikely(!skb))
258 return false;
259 }
260
261 if (!br_vlan_get_tag(skb, vid)) {
262 /* Tagged frame */
263 if (skb->vlan_proto != proto) {
264 /* Protocol-mismatch, empty out vlan_tci for new tag */
265 skb_push(skb, ETH_HLEN);
266 skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto,
267 skb_vlan_tag_get(skb));
268 if (unlikely(!skb))
269 return false;
270
271 skb_pull(skb, ETH_HLEN);
272 skb_reset_mac_len(skb);
273 *vid = 0;
274 tagged = false;
275 } else {
276 tagged = true;
277 }
278 } else {
279 /* Untagged frame */
280 tagged = false;
281 }
282
283 if (!*vid) {
284 u16 pvid = br_get_pvid(v);
285
286 /* Frame had a tag with VID 0 or did not have a tag.
287 * See if pvid is set on this port. That tells us which
288 * vlan untagged or priority-tagged traffic belongs to.
289 */
290 if (!pvid)
291 goto drop;
292
293 /* PVID is set on this port. Any untagged or priority-tagged
294 * ingress frame is considered to belong to this vlan.
295 */
296 *vid = pvid;
297 if (likely(!tagged))
298 /* Untagged Frame. */
299 __vlan_hwaccel_put_tag(skb, proto, pvid);
300 else
301 /* Priority-tagged Frame.
302 * At this point, We know that skb->vlan_tci had
303 * VLAN_TAG_PRESENT bit and its VID field was 0x000.
304 * We update only VID field and preserve PCP field.
305 */
306 skb->vlan_tci |= pvid;
307
308 return true;
309 }
310
311 /* Frame had a valid vlan tag. See if vlan is allowed */
312 if (test_bit(*vid, v->vlan_bitmap))
313 return true;
314 drop:
315 kfree_skb(skb);
316 return false;
317 }
318
319 /* Called under RCU. */
320 bool br_allowed_egress(struct net_bridge *br,
321 const struct net_port_vlans *v,
322 const struct sk_buff *skb)
323 {
324 u16 vid;
325
326 /* If this packet was not filtered at input, let it pass */
327 if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
328 return true;
329
330 if (!v)
331 return false;
332
333 br_vlan_get_tag(skb, &vid);
334 if (test_bit(vid, v->vlan_bitmap))
335 return true;
336
337 return false;
338 }
339
340 /* Called under RCU */
341 bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)
342 {
343 struct net_bridge *br = p->br;
344 struct net_port_vlans *v;
345
346 /* If filtering was disabled at input, let it pass. */
347 if (!br->vlan_enabled)
348 return true;
349
350 v = rcu_dereference(p->vlan_info);
351 if (!v)
352 return false;
353
354 if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto)
355 *vid = 0;
356
357 if (!*vid) {
358 *vid = br_get_pvid(v);
359 if (!*vid)
360 return false;
361
362 return true;
363 }
364
365 if (test_bit(*vid, v->vlan_bitmap))
366 return true;
367
368 return false;
369 }
370
371 /* Must be protected by RTNL.
372 * Must be called with vid in range from 1 to 4094 inclusive.
373 */
374 int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)
375 {
376 struct net_port_vlans *pv = NULL;
377 int err;
378
379 ASSERT_RTNL();
380
381 pv = rtnl_dereference(br->vlan_info);
382 if (pv)
383 return __vlan_add(pv, vid, flags);
384
385 /* Create port vlan infomration
386 */
387 pv = kzalloc(sizeof(*pv), GFP_KERNEL);
388 if (!pv)
389 return -ENOMEM;
390
391 pv->parent.br = br;
392 err = __vlan_add(pv, vid, flags);
393 if (err)
394 goto out;
395
396 rcu_assign_pointer(br->vlan_info, pv);
397 return 0;
398 out:
399 kfree(pv);
400 return err;
401 }
402
403 /* Must be protected by RTNL.
404 * Must be called with vid in range from 1 to 4094 inclusive.
405 */
406 int br_vlan_delete(struct net_bridge *br, u16 vid)
407 {
408 struct net_port_vlans *pv;
409
410 ASSERT_RTNL();
411
412 pv = rtnl_dereference(br->vlan_info);
413 if (!pv)
414 return -EINVAL;
415
416 br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid);
417
418 __vlan_del(pv, vid);
419 return 0;
420 }
421
422 void br_vlan_flush(struct net_bridge *br)
423 {
424 struct net_port_vlans *pv;
425
426 ASSERT_RTNL();
427 pv = rtnl_dereference(br->vlan_info);
428 if (!pv)
429 return;
430
431 __vlan_flush(pv);
432 }
433
434 bool br_vlan_find(struct net_bridge *br, u16 vid)
435 {
436 struct net_port_vlans *pv;
437 bool found = false;
438
439 rcu_read_lock();
440 pv = rcu_dereference(br->vlan_info);
441
442 if (!pv)
443 goto out;
444
445 if (test_bit(vid, pv->vlan_bitmap))
446 found = true;
447
448 out:
449 rcu_read_unlock();
450 return found;
451 }
452
453 /* Must be protected by RTNL. */
454 static void recalculate_group_addr(struct net_bridge *br)
455 {
456 if (br->group_addr_set)
457 return;
458
459 spin_lock_bh(&br->lock);
460 if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) {
461 /* Bridge Group Address */
462 br->group_addr[5] = 0x00;
463 } else { /* vlan_enabled && ETH_P_8021AD */
464 /* Provider Bridge Group Address */
465 br->group_addr[5] = 0x08;
466 }
467 spin_unlock_bh(&br->lock);
468 }
469
470 /* Must be protected by RTNL. */
471 void br_recalculate_fwd_mask(struct net_bridge *br)
472 {
473 if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q))
474 br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT;
475 else /* vlan_enabled && ETH_P_8021AD */
476 br->group_fwd_mask_required = BR_GROUPFWD_8021AD &
477 ~(1u << br->group_addr[5]);
478 }
479
480 int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
481 {
482 if (br->vlan_enabled == val)
483 return 0;
484
485 br->vlan_enabled = val;
486 br_manage_promisc(br);
487 recalculate_group_addr(br);
488 br_recalculate_fwd_mask(br);
489
490 return 0;
491 }
492
493 int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
494 {
495 if (!rtnl_trylock())
496 return restart_syscall();
497
498 __br_vlan_filter_toggle(br, val);
499 rtnl_unlock();
500
501 return 0;
502 }
503
504 int __br_vlan_set_proto(struct net_bridge *br, __be16 proto)
505 {
506 int err = 0;
507 struct net_bridge_port *p;
508 struct net_port_vlans *pv;
509 __be16 oldproto;
510 u16 vid, errvid;
511
512 if (br->vlan_proto == proto)
513 return 0;
514
515 /* Add VLANs for the new proto to the device filter. */
516 list_for_each_entry(p, &br->port_list, list) {
517 pv = rtnl_dereference(p->vlan_info);
518 if (!pv)
519 continue;
520
521 for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
522 err = vlan_vid_add(p->dev, proto, vid);
523 if (err)
524 goto err_filt;
525 }
526 }
527
528 oldproto = br->vlan_proto;
529 br->vlan_proto = proto;
530
531 recalculate_group_addr(br);
532 br_recalculate_fwd_mask(br);
533
534 /* Delete VLANs for the old proto from the device filter. */
535 list_for_each_entry(p, &br->port_list, list) {
536 pv = rtnl_dereference(p->vlan_info);
537 if (!pv)
538 continue;
539
540 for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID)
541 vlan_vid_del(p->dev, oldproto, vid);
542 }
543
544 return 0;
545
546 err_filt:
547 errvid = vid;
548 for_each_set_bit(vid, pv->vlan_bitmap, errvid)
549 vlan_vid_del(p->dev, proto, vid);
550
551 list_for_each_entry_continue_reverse(p, &br->port_list, list) {
552 pv = rtnl_dereference(p->vlan_info);
553 if (!pv)
554 continue;
555
556 for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID)
557 vlan_vid_del(p->dev, proto, vid);
558 }
559
560 return err;
561 }
562
563 int br_vlan_set_proto(struct net_bridge *br, unsigned long val)
564 {
565 int err;
566
567 if (val != ETH_P_8021Q && val != ETH_P_8021AD)
568 return -EPROTONOSUPPORT;
569
570 if (!rtnl_trylock())
571 return restart_syscall();
572
573 err = __br_vlan_set_proto(br, htons(val));
574 rtnl_unlock();
575
576 return err;
577 }
578
579 static bool vlan_default_pvid(struct net_port_vlans *pv, u16 vid)
580 {
581 return pv && vid == pv->pvid && test_bit(vid, pv->untagged_bitmap);
582 }
583
584 static void br_vlan_disable_default_pvid(struct net_bridge *br)
585 {
586 struct net_bridge_port *p;
587 u16 pvid = br->default_pvid;
588
589 /* Disable default_pvid on all ports where it is still
590 * configured.
591 */
592 if (vlan_default_pvid(br_get_vlan_info(br), pvid))
593 br_vlan_delete(br, pvid);
594
595 list_for_each_entry(p, &br->port_list, list) {
596 if (vlan_default_pvid(nbp_get_vlan_info(p), pvid))
597 nbp_vlan_delete(p, pvid);
598 }
599
600 br->default_pvid = 0;
601 }
602
603 static int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)
604 {
605 struct net_bridge_port *p;
606 u16 old_pvid;
607 int err = 0;
608 unsigned long *changed;
609
610 changed = kcalloc(BITS_TO_LONGS(BR_MAX_PORTS), sizeof(unsigned long),
611 GFP_KERNEL);
612 if (!changed)
613 return -ENOMEM;
614
615 old_pvid = br->default_pvid;
616
617 /* Update default_pvid config only if we do not conflict with
618 * user configuration.
619 */
620 if ((!old_pvid || vlan_default_pvid(br_get_vlan_info(br), old_pvid)) &&
621 !br_vlan_find(br, pvid)) {
622 err = br_vlan_add(br, pvid,
623 BRIDGE_VLAN_INFO_PVID |
624 BRIDGE_VLAN_INFO_UNTAGGED);
625 if (err)
626 goto out;
627 br_vlan_delete(br, old_pvid);
628 set_bit(0, changed);
629 }
630
631 list_for_each_entry(p, &br->port_list, list) {
632 /* Update default_pvid config only if we do not conflict with
633 * user configuration.
634 */
635 if ((old_pvid &&
636 !vlan_default_pvid(nbp_get_vlan_info(p), old_pvid)) ||
637 nbp_vlan_find(p, pvid))
638 continue;
639
640 err = nbp_vlan_add(p, pvid,
641 BRIDGE_VLAN_INFO_PVID |
642 BRIDGE_VLAN_INFO_UNTAGGED);
643 if (err)
644 goto err_port;
645 nbp_vlan_delete(p, old_pvid);
646 set_bit(p->port_no, changed);
647 }
648
649 br->default_pvid = pvid;
650
651 out:
652 kfree(changed);
653 return err;
654
655 err_port:
656 list_for_each_entry_continue_reverse(p, &br->port_list, list) {
657 if (!test_bit(p->port_no, changed))
658 continue;
659
660 if (old_pvid)
661 nbp_vlan_add(p, old_pvid,
662 BRIDGE_VLAN_INFO_PVID |
663 BRIDGE_VLAN_INFO_UNTAGGED);
664 nbp_vlan_delete(p, pvid);
665 }
666
667 if (test_bit(0, changed)) {
668 if (old_pvid)
669 br_vlan_add(br, old_pvid,
670 BRIDGE_VLAN_INFO_PVID |
671 BRIDGE_VLAN_INFO_UNTAGGED);
672 br_vlan_delete(br, pvid);
673 }
674 goto out;
675 }
676
677 int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val)
678 {
679 u16 pvid = val;
680 int err = 0;
681
682 if (val >= VLAN_VID_MASK)
683 return -EINVAL;
684
685 if (!rtnl_trylock())
686 return restart_syscall();
687
688 if (pvid == br->default_pvid)
689 goto unlock;
690
691 /* Only allow default pvid change when filtering is disabled */
692 if (br->vlan_enabled) {
693 pr_info_once("Please disable vlan filtering to change default_pvid\n");
694 err = -EPERM;
695 goto unlock;
696 }
697
698 if (!pvid)
699 br_vlan_disable_default_pvid(br);
700 else
701 err = __br_vlan_set_default_pvid(br, pvid);
702
703 unlock:
704 rtnl_unlock();
705 return err;
706 }
707
708 int br_vlan_init(struct net_bridge *br)
709 {
710 br->vlan_proto = htons(ETH_P_8021Q);
711 br->default_pvid = 1;
712 return br_vlan_add(br, 1,
713 BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED);
714 }
715
716 /* Must be protected by RTNL.
717 * Must be called with vid in range from 1 to 4094 inclusive.
718 */
719 int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)
720 {
721 struct net_port_vlans *pv = NULL;
722 int err;
723
724 ASSERT_RTNL();
725
726 pv = rtnl_dereference(port->vlan_info);
727 if (pv)
728 return __vlan_add(pv, vid, flags);
729
730 /* Create port vlan infomration
731 */
732 pv = kzalloc(sizeof(*pv), GFP_KERNEL);
733 if (!pv) {
734 err = -ENOMEM;
735 goto clean_up;
736 }
737
738 pv->port_idx = port->port_no;
739 pv->parent.port = port;
740 err = __vlan_add(pv, vid, flags);
741 if (err)
742 goto clean_up;
743
744 rcu_assign_pointer(port->vlan_info, pv);
745 return 0;
746
747 clean_up:
748 kfree(pv);
749 return err;
750 }
751
752 /* Must be protected by RTNL.
753 * Must be called with vid in range from 1 to 4094 inclusive.
754 */
755 int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
756 {
757 struct net_port_vlans *pv;
758
759 ASSERT_RTNL();
760
761 pv = rtnl_dereference(port->vlan_info);
762 if (!pv)
763 return -EINVAL;
764
765 br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid);
766 br_fdb_delete_by_port(port->br, port, vid, 0);
767
768 return __vlan_del(pv, vid);
769 }
770
771 void nbp_vlan_flush(struct net_bridge_port *port)
772 {
773 struct net_port_vlans *pv;
774 u16 vid;
775
776 ASSERT_RTNL();
777
778 pv = rtnl_dereference(port->vlan_info);
779 if (!pv)
780 return;
781
782 for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID)
783 vlan_vid_del(port->dev, port->br->vlan_proto, vid);
784
785 __vlan_flush(pv);
786 }
787
788 bool nbp_vlan_find(struct net_bridge_port *port, u16 vid)
789 {
790 struct net_port_vlans *pv;
791 bool found = false;
792
793 rcu_read_lock();
794 pv = rcu_dereference(port->vlan_info);
795
796 if (!pv)
797 goto out;
798
799 if (test_bit(vid, pv->vlan_bitmap))
800 found = true;
801
802 out:
803 rcu_read_unlock();
804 return found;
805 }
806
807 int nbp_vlan_init(struct net_bridge_port *p)
808 {
809 return p->br->default_pvid ?
810 nbp_vlan_add(p, p->br->default_pvid,
811 BRIDGE_VLAN_INFO_PVID |
812 BRIDGE_VLAN_INFO_UNTAGGED) :
813 0;
814 }