1243a2e63SVlad Yasevich #include <linux/kernel.h> 2243a2e63SVlad Yasevich #include <linux/netdevice.h> 3243a2e63SVlad Yasevich #include <linux/rtnetlink.h> 4243a2e63SVlad Yasevich #include <linux/slab.h> 57f109539SScott Feldman #include <net/switchdev.h> 6243a2e63SVlad Yasevich 7243a2e63SVlad Yasevich #include "br_private.h" 8243a2e63SVlad Yasevich 9552406c4SVlad Yasevich static void __vlan_add_pvid(struct net_port_vlans *v, u16 vid) 10552406c4SVlad Yasevich { 11552406c4SVlad Yasevich if (v->pvid == vid) 12552406c4SVlad Yasevich return; 13552406c4SVlad Yasevich 14552406c4SVlad Yasevich smp_wmb(); 15552406c4SVlad Yasevich v->pvid = vid; 16552406c4SVlad Yasevich } 17552406c4SVlad Yasevich 18552406c4SVlad Yasevich static void __vlan_delete_pvid(struct net_port_vlans *v, u16 vid) 19552406c4SVlad Yasevich { 20552406c4SVlad Yasevich if (v->pvid != vid) 21552406c4SVlad Yasevich return; 22552406c4SVlad Yasevich 23552406c4SVlad Yasevich smp_wmb(); 24552406c4SVlad Yasevich v->pvid = 0; 25552406c4SVlad Yasevich } 26552406c4SVlad Yasevich 2735e03f3aSVlad Yasevich static void __vlan_add_flags(struct net_port_vlans *v, u16 vid, u16 flags) 2835e03f3aSVlad Yasevich { 2935e03f3aSVlad Yasevich if (flags & BRIDGE_VLAN_INFO_PVID) 3035e03f3aSVlad Yasevich __vlan_add_pvid(v, vid); 31635126b7SVlad Yasevich else 32635126b7SVlad Yasevich __vlan_delete_pvid(v, vid); 3335e03f3aSVlad Yasevich 3435e03f3aSVlad Yasevich if (flags & BRIDGE_VLAN_INFO_UNTAGGED) 3535e03f3aSVlad Yasevich set_bit(vid, v->untagged_bitmap); 36635126b7SVlad Yasevich else 37635126b7SVlad Yasevich clear_bit(vid, v->untagged_bitmap); 3835e03f3aSVlad Yasevich } 3935e03f3aSVlad Yasevich 407f109539SScott Feldman static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br, 417f109539SScott Feldman u16 vid, u16 flags) 427f109539SScott Feldman { 437f109539SScott Feldman const struct net_device_ops *ops = dev->netdev_ops; 447f109539SScott Feldman int err; 457f109539SScott Feldman 467f109539SScott Feldman /* If driver uses VLAN ndo ops, use 8021q to install vid 477f109539SScott Feldman * on device, otherwise try switchdev ops to install vid. 487f109539SScott Feldman */ 497f109539SScott Feldman 507f109539SScott Feldman if (ops->ndo_vlan_rx_add_vid) { 517f109539SScott Feldman err = vlan_vid_add(dev, br->vlan_proto, vid); 527f109539SScott Feldman } else { 537f109539SScott Feldman struct switchdev_obj vlan_obj = { 547f109539SScott Feldman .id = SWITCHDEV_OBJ_PORT_VLAN, 557f109539SScott Feldman .u.vlan = { 567f109539SScott Feldman .flags = flags, 573e3a78b4SScott Feldman .vid_begin = vid, 587f109539SScott Feldman .vid_end = vid, 597f109539SScott Feldman }, 607f109539SScott Feldman }; 617f109539SScott Feldman 627f109539SScott Feldman err = switchdev_port_obj_add(dev, &vlan_obj); 637f109539SScott Feldman if (err == -EOPNOTSUPP) 647f109539SScott Feldman err = 0; 657f109539SScott Feldman } 667f109539SScott Feldman 677f109539SScott Feldman return err; 687f109539SScott Feldman } 697f109539SScott Feldman 70552406c4SVlad Yasevich static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) 71243a2e63SVlad Yasevich { 72bc9a25d2SVlad Yasevich struct net_bridge_port *p = NULL; 73bc9a25d2SVlad Yasevich struct net_bridge *br; 74bc9a25d2SVlad Yasevich struct net_device *dev; 75243a2e63SVlad Yasevich int err; 76243a2e63SVlad Yasevich 77552406c4SVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) { 7835e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 79552406c4SVlad Yasevich return 0; 80552406c4SVlad Yasevich } 81243a2e63SVlad Yasevich 82bc9a25d2SVlad Yasevich if (v->port_idx) { 83bc9a25d2SVlad Yasevich p = v->parent.port; 84bc9a25d2SVlad Yasevich br = p->br; 85bc9a25d2SVlad Yasevich dev = p->dev; 86bc9a25d2SVlad Yasevich } else { 87bc9a25d2SVlad Yasevich br = v->parent.br; 88bc9a25d2SVlad Yasevich dev = br->dev; 89bc9a25d2SVlad Yasevich } 90243a2e63SVlad Yasevich 9119236837SToshiaki Makita if (p) { 92243a2e63SVlad Yasevich /* Add VLAN to the device filter if it is supported. 93fdb0a662SToshiaki Makita * This ensures tagged traffic enters the bridge when 94fdb0a662SToshiaki Makita * promiscuous mode is disabled by br_manage_promisc(). 95243a2e63SVlad Yasevich */ 967f109539SScott Feldman err = __vlan_vid_add(dev, br, vid, flags); 97243a2e63SVlad Yasevich if (err) 98243a2e63SVlad Yasevich return err; 99243a2e63SVlad Yasevich } 100bc9a25d2SVlad Yasevich 101bc9a25d2SVlad Yasevich err = br_fdb_insert(br, p, dev->dev_addr, vid); 102bc9a25d2SVlad Yasevich if (err) { 103bc9a25d2SVlad Yasevich br_err(br, "failed insert local address into bridge " 104bc9a25d2SVlad Yasevich "forwarding table\n"); 105bc9a25d2SVlad Yasevich goto out_filt; 106bc9a25d2SVlad Yasevich } 107bc9a25d2SVlad Yasevich 108243a2e63SVlad Yasevich set_bit(vid, v->vlan_bitmap); 1096cbdceebSVlad Yasevich v->num_vlans++; 11035e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 111552406c4SVlad Yasevich 112243a2e63SVlad Yasevich return 0; 113bc9a25d2SVlad Yasevich 114bc9a25d2SVlad Yasevich out_filt: 11519236837SToshiaki Makita if (p) 1168580e211SToshiaki Makita vlan_vid_del(dev, br->vlan_proto, vid); 117bc9a25d2SVlad Yasevich return err; 118243a2e63SVlad Yasevich } 119243a2e63SVlad Yasevich 120bf361ad3SVivien Didelot static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br, 1217f109539SScott Feldman u16 vid) 1227f109539SScott Feldman { 1237f109539SScott Feldman const struct net_device_ops *ops = dev->netdev_ops; 124bf361ad3SVivien Didelot int err = 0; 1257f109539SScott Feldman 1267f109539SScott Feldman /* If driver uses VLAN ndo ops, use 8021q to delete vid 1277f109539SScott Feldman * on device, otherwise try switchdev ops to delete vid. 1287f109539SScott Feldman */ 1297f109539SScott Feldman 1307f109539SScott Feldman if (ops->ndo_vlan_rx_kill_vid) { 1317f109539SScott Feldman vlan_vid_del(dev, br->vlan_proto, vid); 1327f109539SScott Feldman } else { 1337f109539SScott Feldman struct switchdev_obj vlan_obj = { 1347f109539SScott Feldman .id = SWITCHDEV_OBJ_PORT_VLAN, 1357f109539SScott Feldman .u.vlan = { 1363e3a78b4SScott Feldman .vid_begin = vid, 1377f109539SScott Feldman .vid_end = vid, 1387f109539SScott Feldman }, 1397f109539SScott Feldman }; 1407f109539SScott Feldman 141bf361ad3SVivien Didelot err = switchdev_port_obj_del(dev, &vlan_obj); 142bf361ad3SVivien Didelot if (err == -EOPNOTSUPP) 143bf361ad3SVivien Didelot err = 0; 1447f109539SScott Feldman } 145bf361ad3SVivien Didelot 146bf361ad3SVivien Didelot return err; 1477f109539SScott Feldman } 1487f109539SScott Feldman 149243a2e63SVlad Yasevich static int __vlan_del(struct net_port_vlans *v, u16 vid) 150243a2e63SVlad Yasevich { 151243a2e63SVlad Yasevich if (!test_bit(vid, v->vlan_bitmap)) 152243a2e63SVlad Yasevich return -EINVAL; 153243a2e63SVlad Yasevich 154552406c4SVlad Yasevich __vlan_delete_pvid(v, vid); 15535e03f3aSVlad Yasevich clear_bit(vid, v->untagged_bitmap); 156552406c4SVlad Yasevich 1578580e211SToshiaki Makita if (v->port_idx) { 1588580e211SToshiaki Makita struct net_bridge_port *p = v->parent.port; 159bf361ad3SVivien Didelot int err; 160bf361ad3SVivien Didelot 161bf361ad3SVivien Didelot err = __vlan_vid_del(p->dev, p->br, vid); 162bf361ad3SVivien Didelot if (err) 163bf361ad3SVivien Didelot return err; 1648580e211SToshiaki Makita } 165243a2e63SVlad Yasevich 166243a2e63SVlad Yasevich clear_bit(vid, v->vlan_bitmap); 1676cbdceebSVlad Yasevich v->num_vlans--; 168ef40b7efSToshiaki Makita if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) { 169243a2e63SVlad Yasevich if (v->port_idx) 170cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 171243a2e63SVlad Yasevich else 172cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 173243a2e63SVlad Yasevich kfree_rcu(v, rcu); 174243a2e63SVlad Yasevich } 175243a2e63SVlad Yasevich return 0; 176243a2e63SVlad Yasevich } 177243a2e63SVlad Yasevich 178243a2e63SVlad Yasevich static void __vlan_flush(struct net_port_vlans *v) 179243a2e63SVlad Yasevich { 180552406c4SVlad Yasevich smp_wmb(); 181552406c4SVlad Yasevich v->pvid = 0; 182ef40b7efSToshiaki Makita bitmap_zero(v->vlan_bitmap, VLAN_N_VID); 183243a2e63SVlad Yasevich if (v->port_idx) 184cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 185243a2e63SVlad Yasevich else 186cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 187243a2e63SVlad Yasevich kfree_rcu(v, rcu); 188243a2e63SVlad Yasevich } 189243a2e63SVlad Yasevich 19078851988SVlad Yasevich struct sk_buff *br_handle_vlan(struct net_bridge *br, 19178851988SVlad Yasevich const struct net_port_vlans *pv, 192a37b85c9SVlad Yasevich struct sk_buff *skb) 193a37b85c9SVlad Yasevich { 194a37b85c9SVlad Yasevich u16 vid; 195a37b85c9SVlad Yasevich 19620adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 19720adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 19878851988SVlad Yasevich goto out; 19978851988SVlad Yasevich 200fc92f745SVlad Yasevich /* Vlan filter table must be configured at this point. The 201fc92f745SVlad Yasevich * only exception is the bridge is set in promisc mode and the 202fc92f745SVlad Yasevich * packet is destined for the bridge device. In this case 203fc92f745SVlad Yasevich * pass the packet as is. 204fc92f745SVlad Yasevich */ 205fc92f745SVlad Yasevich if (!pv) { 206fc92f745SVlad Yasevich if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) { 207fc92f745SVlad Yasevich goto out; 208fc92f745SVlad Yasevich } else { 209fc92f745SVlad Yasevich kfree_skb(skb); 210fc92f745SVlad Yasevich return NULL; 211fc92f745SVlad Yasevich } 212fc92f745SVlad Yasevich } 213fc92f745SVlad Yasevich 21478851988SVlad Yasevich /* At this point, we know that the frame was filtered and contains 21535e03f3aSVlad Yasevich * a valid vlan id. If the vlan id is set in the untagged bitmap, 2161a81a2e0Stanxiaojun * send untagged; otherwise, send tagged. 21778851988SVlad Yasevich */ 21878851988SVlad Yasevich br_vlan_get_tag(skb, &vid); 21935e03f3aSVlad Yasevich if (test_bit(vid, pv->untagged_bitmap)) 22099b192daSToshiaki Makita skb->vlan_tci = 0; 22178851988SVlad Yasevich 22278851988SVlad Yasevich out: 22378851988SVlad Yasevich return skb; 22478851988SVlad Yasevich } 22578851988SVlad Yasevich 22678851988SVlad Yasevich /* Called under RCU */ 22778851988SVlad Yasevich bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, 22878851988SVlad Yasevich struct sk_buff *skb, u16 *vid) 22978851988SVlad Yasevich { 2308580e211SToshiaki Makita bool tagged; 2318580e211SToshiaki Makita __be16 proto; 232b90356ceSToshiaki Makita 233a37b85c9SVlad Yasevich /* If VLAN filtering is disabled on the bridge, all packets are 234a37b85c9SVlad Yasevich * permitted. 235a37b85c9SVlad Yasevich */ 23620adfa1aSVlad Yasevich if (!br->vlan_enabled) { 23720adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = false; 238a37b85c9SVlad Yasevich return true; 23920adfa1aSVlad Yasevich } 240a37b85c9SVlad Yasevich 241a37b85c9SVlad Yasevich /* If there are no vlan in the permitted list, all packets are 242a37b85c9SVlad Yasevich * rejected. 243a37b85c9SVlad Yasevich */ 244a37b85c9SVlad Yasevich if (!v) 245eb707618SToshiaki Makita goto drop; 246a37b85c9SVlad Yasevich 24720adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = true; 2488580e211SToshiaki Makita proto = br->vlan_proto; 2498580e211SToshiaki Makita 25012464bb8SToshiaki Makita /* If vlan tx offload is disabled on bridge device and frame was 25112464bb8SToshiaki Makita * sent from vlan device on the bridge device, it does not have 25212464bb8SToshiaki Makita * HW accelerated vlan tag. 25312464bb8SToshiaki Makita */ 254df8a39deSJiri Pirko if (unlikely(!skb_vlan_tag_present(skb) && 2558580e211SToshiaki Makita skb->protocol == proto)) { 2560d5501c1SVlad Yasevich skb = skb_vlan_untag(skb); 25712464bb8SToshiaki Makita if (unlikely(!skb)) 25812464bb8SToshiaki Makita return false; 25912464bb8SToshiaki Makita } 26012464bb8SToshiaki Makita 2618580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid)) { 2628580e211SToshiaki Makita /* Tagged frame */ 2638580e211SToshiaki Makita if (skb->vlan_proto != proto) { 2648580e211SToshiaki Makita /* Protocol-mismatch, empty out vlan_tci for new tag */ 2658580e211SToshiaki Makita skb_push(skb, ETH_HLEN); 26662749e2cSJiri Pirko skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, 267df8a39deSJiri Pirko skb_vlan_tag_get(skb)); 2688580e211SToshiaki Makita if (unlikely(!skb)) 2698580e211SToshiaki Makita return false; 2708580e211SToshiaki Makita 2718580e211SToshiaki Makita skb_pull(skb, ETH_HLEN); 2728580e211SToshiaki Makita skb_reset_mac_len(skb); 2738580e211SToshiaki Makita *vid = 0; 2748580e211SToshiaki Makita tagged = false; 2758580e211SToshiaki Makita } else { 2768580e211SToshiaki Makita tagged = true; 2778580e211SToshiaki Makita } 2788580e211SToshiaki Makita } else { 2798580e211SToshiaki Makita /* Untagged frame */ 2808580e211SToshiaki Makita tagged = false; 2818580e211SToshiaki Makita } 2828580e211SToshiaki Makita 283b90356ceSToshiaki Makita if (!*vid) { 28478851988SVlad Yasevich u16 pvid = br_get_pvid(v); 28578851988SVlad Yasevich 286b90356ceSToshiaki Makita /* Frame had a tag with VID 0 or did not have a tag. 287b90356ceSToshiaki Makita * See if pvid is set on this port. That tells us which 288b90356ceSToshiaki Makita * vlan untagged or priority-tagged traffic belongs to. 28978851988SVlad Yasevich */ 2903df6bf45SVlad Yasevich if (!pvid) 291eb707618SToshiaki Makita goto drop; 29278851988SVlad Yasevich 293b90356ceSToshiaki Makita /* PVID is set on this port. Any untagged or priority-tagged 294b90356ceSToshiaki Makita * ingress frame is considered to belong to this vlan. 29578851988SVlad Yasevich */ 296dfb5fa32SToshiaki Makita *vid = pvid; 2978580e211SToshiaki Makita if (likely(!tagged)) 298b90356ceSToshiaki Makita /* Untagged Frame. */ 2998580e211SToshiaki Makita __vlan_hwaccel_put_tag(skb, proto, pvid); 300b90356ceSToshiaki Makita else 301b90356ceSToshiaki Makita /* Priority-tagged Frame. 302b90356ceSToshiaki Makita * At this point, We know that skb->vlan_tci had 303b90356ceSToshiaki Makita * VLAN_TAG_PRESENT bit and its VID field was 0x000. 304b90356ceSToshiaki Makita * We update only VID field and preserve PCP field. 305b90356ceSToshiaki Makita */ 306b90356ceSToshiaki Makita skb->vlan_tci |= pvid; 307b90356ceSToshiaki Makita 30878851988SVlad Yasevich return true; 30978851988SVlad Yasevich } 31078851988SVlad Yasevich 31178851988SVlad Yasevich /* Frame had a valid vlan tag. See if vlan is allowed */ 31278851988SVlad Yasevich if (test_bit(*vid, v->vlan_bitmap)) 313a37b85c9SVlad Yasevich return true; 314eb707618SToshiaki Makita drop: 315eb707618SToshiaki Makita kfree_skb(skb); 316a37b85c9SVlad Yasevich return false; 317a37b85c9SVlad Yasevich } 318a37b85c9SVlad Yasevich 31985f46c6bSVlad Yasevich /* Called under RCU. */ 32085f46c6bSVlad Yasevich bool br_allowed_egress(struct net_bridge *br, 32185f46c6bSVlad Yasevich const struct net_port_vlans *v, 32285f46c6bSVlad Yasevich const struct sk_buff *skb) 32385f46c6bSVlad Yasevich { 32485f46c6bSVlad Yasevich u16 vid; 32585f46c6bSVlad Yasevich 32620adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 32720adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 32885f46c6bSVlad Yasevich return true; 32985f46c6bSVlad Yasevich 33085f46c6bSVlad Yasevich if (!v) 33185f46c6bSVlad Yasevich return false; 33285f46c6bSVlad Yasevich 33385f46c6bSVlad Yasevich br_vlan_get_tag(skb, &vid); 33485f46c6bSVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) 33585f46c6bSVlad Yasevich return true; 33685f46c6bSVlad Yasevich 33785f46c6bSVlad Yasevich return false; 33885f46c6bSVlad Yasevich } 33985f46c6bSVlad Yasevich 340e0d7968aSToshiaki Makita /* Called under RCU */ 341e0d7968aSToshiaki Makita bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid) 342e0d7968aSToshiaki Makita { 343e0d7968aSToshiaki Makita struct net_bridge *br = p->br; 344e0d7968aSToshiaki Makita struct net_port_vlans *v; 345e0d7968aSToshiaki Makita 34620adfa1aSVlad Yasevich /* If filtering was disabled at input, let it pass. */ 347c095f248SVlad Yasevich if (!br->vlan_enabled) 348e0d7968aSToshiaki Makita return true; 349e0d7968aSToshiaki Makita 350e0d7968aSToshiaki Makita v = rcu_dereference(p->vlan_info); 351e0d7968aSToshiaki Makita if (!v) 352e0d7968aSToshiaki Makita return false; 353e0d7968aSToshiaki Makita 3548580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto) 3558580e211SToshiaki Makita *vid = 0; 3568580e211SToshiaki Makita 357e0d7968aSToshiaki Makita if (!*vid) { 358e0d7968aSToshiaki Makita *vid = br_get_pvid(v); 3593df6bf45SVlad Yasevich if (!*vid) 360e0d7968aSToshiaki Makita return false; 361e0d7968aSToshiaki Makita 362e0d7968aSToshiaki Makita return true; 363e0d7968aSToshiaki Makita } 364e0d7968aSToshiaki Makita 365e0d7968aSToshiaki Makita if (test_bit(*vid, v->vlan_bitmap)) 366e0d7968aSToshiaki Makita return true; 367e0d7968aSToshiaki Makita 368e0d7968aSToshiaki Makita return false; 369e0d7968aSToshiaki Makita } 370e0d7968aSToshiaki Makita 3718adff41cSToshiaki Makita /* Must be protected by RTNL. 3728adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 3738adff41cSToshiaki Makita */ 374552406c4SVlad Yasevich int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags) 375243a2e63SVlad Yasevich { 376243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 377243a2e63SVlad Yasevich int err; 378243a2e63SVlad Yasevich 379243a2e63SVlad Yasevich ASSERT_RTNL(); 380243a2e63SVlad Yasevich 381243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 382243a2e63SVlad Yasevich if (pv) 383552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 384243a2e63SVlad Yasevich 385243a2e63SVlad Yasevich /* Create port vlan infomration 386243a2e63SVlad Yasevich */ 387243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 388243a2e63SVlad Yasevich if (!pv) 389243a2e63SVlad Yasevich return -ENOMEM; 390243a2e63SVlad Yasevich 391243a2e63SVlad Yasevich pv->parent.br = br; 392552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 393243a2e63SVlad Yasevich if (err) 394243a2e63SVlad Yasevich goto out; 395243a2e63SVlad Yasevich 396243a2e63SVlad Yasevich rcu_assign_pointer(br->vlan_info, pv); 397243a2e63SVlad Yasevich return 0; 398243a2e63SVlad Yasevich out: 399243a2e63SVlad Yasevich kfree(pv); 400243a2e63SVlad Yasevich return err; 401243a2e63SVlad Yasevich } 402243a2e63SVlad Yasevich 4038adff41cSToshiaki Makita /* Must be protected by RTNL. 4048adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 4058adff41cSToshiaki Makita */ 406243a2e63SVlad Yasevich int br_vlan_delete(struct net_bridge *br, u16 vid) 407243a2e63SVlad Yasevich { 408243a2e63SVlad Yasevich struct net_port_vlans *pv; 409243a2e63SVlad Yasevich 410243a2e63SVlad Yasevich ASSERT_RTNL(); 411243a2e63SVlad Yasevich 412243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 413243a2e63SVlad Yasevich if (!pv) 414243a2e63SVlad Yasevich return -EINVAL; 415243a2e63SVlad Yasevich 416424bb9c9SToshiaki Makita br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid); 417bc9a25d2SVlad Yasevich 418243a2e63SVlad Yasevich __vlan_del(pv, vid); 419243a2e63SVlad Yasevich return 0; 420243a2e63SVlad Yasevich } 421243a2e63SVlad Yasevich 422243a2e63SVlad Yasevich void br_vlan_flush(struct net_bridge *br) 423243a2e63SVlad Yasevich { 424243a2e63SVlad Yasevich struct net_port_vlans *pv; 425243a2e63SVlad Yasevich 426243a2e63SVlad Yasevich ASSERT_RTNL(); 427243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 428243a2e63SVlad Yasevich if (!pv) 429243a2e63SVlad Yasevich return; 430243a2e63SVlad Yasevich 431243a2e63SVlad Yasevich __vlan_flush(pv); 432243a2e63SVlad Yasevich } 433243a2e63SVlad Yasevich 4342b292fb4SToshiaki Makita bool br_vlan_find(struct net_bridge *br, u16 vid) 4352b292fb4SToshiaki Makita { 4362b292fb4SToshiaki Makita struct net_port_vlans *pv; 4372b292fb4SToshiaki Makita bool found = false; 4382b292fb4SToshiaki Makita 4392b292fb4SToshiaki Makita rcu_read_lock(); 4402b292fb4SToshiaki Makita pv = rcu_dereference(br->vlan_info); 4412b292fb4SToshiaki Makita 4422b292fb4SToshiaki Makita if (!pv) 4432b292fb4SToshiaki Makita goto out; 4442b292fb4SToshiaki Makita 4452b292fb4SToshiaki Makita if (test_bit(vid, pv->vlan_bitmap)) 4462b292fb4SToshiaki Makita found = true; 4472b292fb4SToshiaki Makita 4482b292fb4SToshiaki Makita out: 4492b292fb4SToshiaki Makita rcu_read_unlock(); 4502b292fb4SToshiaki Makita return found; 4512b292fb4SToshiaki Makita } 4522b292fb4SToshiaki Makita 453204177f3SToshiaki Makita /* Must be protected by RTNL. */ 454204177f3SToshiaki Makita static void recalculate_group_addr(struct net_bridge *br) 455204177f3SToshiaki Makita { 456204177f3SToshiaki Makita if (br->group_addr_set) 457204177f3SToshiaki Makita return; 458204177f3SToshiaki Makita 459204177f3SToshiaki Makita spin_lock_bh(&br->lock); 460204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) { 461204177f3SToshiaki Makita /* Bridge Group Address */ 462204177f3SToshiaki Makita br->group_addr[5] = 0x00; 463204177f3SToshiaki Makita } else { /* vlan_enabled && ETH_P_8021AD */ 464204177f3SToshiaki Makita /* Provider Bridge Group Address */ 465204177f3SToshiaki Makita br->group_addr[5] = 0x08; 466204177f3SToshiaki Makita } 467204177f3SToshiaki Makita spin_unlock_bh(&br->lock); 468204177f3SToshiaki Makita } 469204177f3SToshiaki Makita 470204177f3SToshiaki Makita /* Must be protected by RTNL. */ 471204177f3SToshiaki Makita void br_recalculate_fwd_mask(struct net_bridge *br) 472204177f3SToshiaki Makita { 473204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) 474204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT; 475204177f3SToshiaki Makita else /* vlan_enabled && ETH_P_8021AD */ 476204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_8021AD & 477204177f3SToshiaki Makita ~(1u << br->group_addr[5]); 478204177f3SToshiaki Makita } 479204177f3SToshiaki Makita 480a7854037SNikolay Aleksandrov int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) 481243a2e63SVlad Yasevich { 482243a2e63SVlad Yasevich if (br->vlan_enabled == val) 483a7854037SNikolay Aleksandrov return 0; 484243a2e63SVlad Yasevich 485243a2e63SVlad Yasevich br->vlan_enabled = val; 4862796d0c6SVlad Yasevich br_manage_promisc(br); 487204177f3SToshiaki Makita recalculate_group_addr(br); 488204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 489243a2e63SVlad Yasevich 490a7854037SNikolay Aleksandrov return 0; 491a7854037SNikolay Aleksandrov } 492a7854037SNikolay Aleksandrov 493a7854037SNikolay Aleksandrov int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) 494a7854037SNikolay Aleksandrov { 495a7854037SNikolay Aleksandrov if (!rtnl_trylock()) 496a7854037SNikolay Aleksandrov return restart_syscall(); 497a7854037SNikolay Aleksandrov 498a7854037SNikolay Aleksandrov __br_vlan_filter_toggle(br, val); 499243a2e63SVlad Yasevich rtnl_unlock(); 500a7854037SNikolay Aleksandrov 501243a2e63SVlad Yasevich return 0; 502243a2e63SVlad Yasevich } 503243a2e63SVlad Yasevich 504d2d427b3SToshiaki Makita int __br_vlan_set_proto(struct net_bridge *br, __be16 proto) 505204177f3SToshiaki Makita { 506204177f3SToshiaki Makita int err = 0; 507204177f3SToshiaki Makita struct net_bridge_port *p; 508204177f3SToshiaki Makita struct net_port_vlans *pv; 509d2d427b3SToshiaki Makita __be16 oldproto; 510204177f3SToshiaki Makita u16 vid, errvid; 511204177f3SToshiaki Makita 512204177f3SToshiaki Makita if (br->vlan_proto == proto) 513d2d427b3SToshiaki Makita return 0; 514204177f3SToshiaki Makita 515204177f3SToshiaki Makita /* Add VLANs for the new proto to the device filter. */ 516204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 517204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 518204177f3SToshiaki Makita if (!pv) 519204177f3SToshiaki Makita continue; 520204177f3SToshiaki Makita 521204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { 522204177f3SToshiaki Makita err = vlan_vid_add(p->dev, proto, vid); 523204177f3SToshiaki Makita if (err) 524204177f3SToshiaki Makita goto err_filt; 525204177f3SToshiaki Makita } 526204177f3SToshiaki Makita } 527204177f3SToshiaki Makita 528204177f3SToshiaki Makita oldproto = br->vlan_proto; 529204177f3SToshiaki Makita br->vlan_proto = proto; 530204177f3SToshiaki Makita 531204177f3SToshiaki Makita recalculate_group_addr(br); 532204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 533204177f3SToshiaki Makita 534204177f3SToshiaki Makita /* Delete VLANs for the old proto from the device filter. */ 535204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 536204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 537204177f3SToshiaki Makita if (!pv) 538204177f3SToshiaki Makita continue; 539204177f3SToshiaki Makita 540204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 541204177f3SToshiaki Makita vlan_vid_del(p->dev, oldproto, vid); 542204177f3SToshiaki Makita } 543204177f3SToshiaki Makita 544d2d427b3SToshiaki Makita return 0; 545204177f3SToshiaki Makita 546204177f3SToshiaki Makita err_filt: 547204177f3SToshiaki Makita errvid = vid; 548204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, errvid) 549204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 550204177f3SToshiaki Makita 551204177f3SToshiaki Makita list_for_each_entry_continue_reverse(p, &br->port_list, list) { 552204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 553204177f3SToshiaki Makita if (!pv) 554204177f3SToshiaki Makita continue; 555204177f3SToshiaki Makita 556204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 557204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 558204177f3SToshiaki Makita } 559204177f3SToshiaki Makita 560d2d427b3SToshiaki Makita return err; 561d2d427b3SToshiaki Makita } 562d2d427b3SToshiaki Makita 563d2d427b3SToshiaki Makita int br_vlan_set_proto(struct net_bridge *br, unsigned long val) 564d2d427b3SToshiaki Makita { 565d2d427b3SToshiaki Makita int err; 566d2d427b3SToshiaki Makita 567d2d427b3SToshiaki Makita if (val != ETH_P_8021Q && val != ETH_P_8021AD) 568d2d427b3SToshiaki Makita return -EPROTONOSUPPORT; 569d2d427b3SToshiaki Makita 570d2d427b3SToshiaki Makita if (!rtnl_trylock()) 571d2d427b3SToshiaki Makita return restart_syscall(); 572d2d427b3SToshiaki Makita 573d2d427b3SToshiaki Makita err = __br_vlan_set_proto(br, htons(val)); 574d2d427b3SToshiaki Makita rtnl_unlock(); 575d2d427b3SToshiaki Makita 576d2d427b3SToshiaki Makita return err; 577204177f3SToshiaki Makita } 578204177f3SToshiaki Makita 5795be5a2dfSVlad Yasevich static bool vlan_default_pvid(struct net_port_vlans *pv, u16 vid) 5805be5a2dfSVlad Yasevich { 5815be5a2dfSVlad Yasevich return pv && vid == pv->pvid && test_bit(vid, pv->untagged_bitmap); 5825be5a2dfSVlad Yasevich } 5835be5a2dfSVlad Yasevich 5845be5a2dfSVlad Yasevich static void br_vlan_disable_default_pvid(struct net_bridge *br) 5855be5a2dfSVlad Yasevich { 5865be5a2dfSVlad Yasevich struct net_bridge_port *p; 5875be5a2dfSVlad Yasevich u16 pvid = br->default_pvid; 5885be5a2dfSVlad Yasevich 5895be5a2dfSVlad Yasevich /* Disable default_pvid on all ports where it is still 5905be5a2dfSVlad Yasevich * configured. 5915be5a2dfSVlad Yasevich */ 5925be5a2dfSVlad Yasevich if (vlan_default_pvid(br_get_vlan_info(br), pvid)) 5935be5a2dfSVlad Yasevich br_vlan_delete(br, pvid); 5945be5a2dfSVlad Yasevich 5955be5a2dfSVlad Yasevich list_for_each_entry(p, &br->port_list, list) { 5965be5a2dfSVlad Yasevich if (vlan_default_pvid(nbp_get_vlan_info(p), pvid)) 5975be5a2dfSVlad Yasevich nbp_vlan_delete(p, pvid); 5985be5a2dfSVlad Yasevich } 5995be5a2dfSVlad Yasevich 6005be5a2dfSVlad Yasevich br->default_pvid = 0; 6015be5a2dfSVlad Yasevich } 6025be5a2dfSVlad Yasevich 6035be5a2dfSVlad Yasevich static int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid) 6045be5a2dfSVlad Yasevich { 6055be5a2dfSVlad Yasevich struct net_bridge_port *p; 6065be5a2dfSVlad Yasevich u16 old_pvid; 6075be5a2dfSVlad Yasevich int err = 0; 6085be5a2dfSVlad Yasevich unsigned long *changed; 6095be5a2dfSVlad Yasevich 6105be5a2dfSVlad Yasevich changed = kcalloc(BITS_TO_LONGS(BR_MAX_PORTS), sizeof(unsigned long), 6115be5a2dfSVlad Yasevich GFP_KERNEL); 6125be5a2dfSVlad Yasevich if (!changed) 6135be5a2dfSVlad Yasevich return -ENOMEM; 6145be5a2dfSVlad Yasevich 6155be5a2dfSVlad Yasevich old_pvid = br->default_pvid; 6165be5a2dfSVlad Yasevich 6175be5a2dfSVlad Yasevich /* Update default_pvid config only if we do not conflict with 6185be5a2dfSVlad Yasevich * user configuration. 6195be5a2dfSVlad Yasevich */ 6205be5a2dfSVlad Yasevich if ((!old_pvid || vlan_default_pvid(br_get_vlan_info(br), old_pvid)) && 6215be5a2dfSVlad Yasevich !br_vlan_find(br, pvid)) { 6225be5a2dfSVlad Yasevich err = br_vlan_add(br, pvid, 6235be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 6245be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 6255be5a2dfSVlad Yasevich if (err) 6265be5a2dfSVlad Yasevich goto out; 6275be5a2dfSVlad Yasevich br_vlan_delete(br, old_pvid); 6285be5a2dfSVlad Yasevich set_bit(0, changed); 6295be5a2dfSVlad Yasevich } 6305be5a2dfSVlad Yasevich 6315be5a2dfSVlad Yasevich list_for_each_entry(p, &br->port_list, list) { 6325be5a2dfSVlad Yasevich /* Update default_pvid config only if we do not conflict with 6335be5a2dfSVlad Yasevich * user configuration. 6345be5a2dfSVlad Yasevich */ 6355be5a2dfSVlad Yasevich if ((old_pvid && 6365be5a2dfSVlad Yasevich !vlan_default_pvid(nbp_get_vlan_info(p), old_pvid)) || 6375be5a2dfSVlad Yasevich nbp_vlan_find(p, pvid)) 6385be5a2dfSVlad Yasevich continue; 6395be5a2dfSVlad Yasevich 6405be5a2dfSVlad Yasevich err = nbp_vlan_add(p, pvid, 6415be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 6425be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 6435be5a2dfSVlad Yasevich if (err) 6445be5a2dfSVlad Yasevich goto err_port; 6455be5a2dfSVlad Yasevich nbp_vlan_delete(p, old_pvid); 6465be5a2dfSVlad Yasevich set_bit(p->port_no, changed); 6475be5a2dfSVlad Yasevich } 6485be5a2dfSVlad Yasevich 6495be5a2dfSVlad Yasevich br->default_pvid = pvid; 6505be5a2dfSVlad Yasevich 6515be5a2dfSVlad Yasevich out: 6525be5a2dfSVlad Yasevich kfree(changed); 6535be5a2dfSVlad Yasevich return err; 6545be5a2dfSVlad Yasevich 6555be5a2dfSVlad Yasevich err_port: 6565be5a2dfSVlad Yasevich list_for_each_entry_continue_reverse(p, &br->port_list, list) { 6575be5a2dfSVlad Yasevich if (!test_bit(p->port_no, changed)) 6585be5a2dfSVlad Yasevich continue; 6595be5a2dfSVlad Yasevich 6605be5a2dfSVlad Yasevich if (old_pvid) 6615be5a2dfSVlad Yasevich nbp_vlan_add(p, old_pvid, 6625be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 6635be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 6645be5a2dfSVlad Yasevich nbp_vlan_delete(p, pvid); 6655be5a2dfSVlad Yasevich } 6665be5a2dfSVlad Yasevich 6675be5a2dfSVlad Yasevich if (test_bit(0, changed)) { 6685be5a2dfSVlad Yasevich if (old_pvid) 6695be5a2dfSVlad Yasevich br_vlan_add(br, old_pvid, 6705be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 6715be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 6725be5a2dfSVlad Yasevich br_vlan_delete(br, pvid); 6735be5a2dfSVlad Yasevich } 6745be5a2dfSVlad Yasevich goto out; 6755be5a2dfSVlad Yasevich } 6765be5a2dfSVlad Yasevich 67796a20d9dSVlad Yasevich int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val) 67896a20d9dSVlad Yasevich { 67996a20d9dSVlad Yasevich u16 pvid = val; 68096a20d9dSVlad Yasevich int err = 0; 68196a20d9dSVlad Yasevich 6825be5a2dfSVlad Yasevich if (val >= VLAN_VID_MASK) 68396a20d9dSVlad Yasevich return -EINVAL; 68496a20d9dSVlad Yasevich 68596a20d9dSVlad Yasevich if (!rtnl_trylock()) 68696a20d9dSVlad Yasevich return restart_syscall(); 68796a20d9dSVlad Yasevich 68896a20d9dSVlad Yasevich if (pvid == br->default_pvid) 68996a20d9dSVlad Yasevich goto unlock; 69096a20d9dSVlad Yasevich 69196a20d9dSVlad Yasevich /* Only allow default pvid change when filtering is disabled */ 69296a20d9dSVlad Yasevich if (br->vlan_enabled) { 69396a20d9dSVlad Yasevich pr_info_once("Please disable vlan filtering to change default_pvid\n"); 69496a20d9dSVlad Yasevich err = -EPERM; 69596a20d9dSVlad Yasevich goto unlock; 69696a20d9dSVlad Yasevich } 69796a20d9dSVlad Yasevich 6985be5a2dfSVlad Yasevich if (!pvid) 6995be5a2dfSVlad Yasevich br_vlan_disable_default_pvid(br); 7005be5a2dfSVlad Yasevich else 7015be5a2dfSVlad Yasevich err = __br_vlan_set_default_pvid(br, pvid); 70296a20d9dSVlad Yasevich 70396a20d9dSVlad Yasevich unlock: 70496a20d9dSVlad Yasevich rtnl_unlock(); 70596a20d9dSVlad Yasevich return err; 70696a20d9dSVlad Yasevich } 70796a20d9dSVlad Yasevich 7085be5a2dfSVlad Yasevich int br_vlan_init(struct net_bridge *br) 7098580e211SToshiaki Makita { 7108580e211SToshiaki Makita br->vlan_proto = htons(ETH_P_8021Q); 71196a20d9dSVlad Yasevich br->default_pvid = 1; 7125be5a2dfSVlad Yasevich return br_vlan_add(br, 1, 7135be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED); 7148580e211SToshiaki Makita } 7158580e211SToshiaki Makita 7168adff41cSToshiaki Makita /* Must be protected by RTNL. 7178adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 7188adff41cSToshiaki Makita */ 719552406c4SVlad Yasevich int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) 720243a2e63SVlad Yasevich { 721243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 722243a2e63SVlad Yasevich int err; 723243a2e63SVlad Yasevich 724243a2e63SVlad Yasevich ASSERT_RTNL(); 725243a2e63SVlad Yasevich 726243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 727243a2e63SVlad Yasevich if (pv) 728552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 729243a2e63SVlad Yasevich 730243a2e63SVlad Yasevich /* Create port vlan infomration 731243a2e63SVlad Yasevich */ 732243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 733243a2e63SVlad Yasevich if (!pv) { 734243a2e63SVlad Yasevich err = -ENOMEM; 735243a2e63SVlad Yasevich goto clean_up; 736243a2e63SVlad Yasevich } 737243a2e63SVlad Yasevich 738243a2e63SVlad Yasevich pv->port_idx = port->port_no; 739243a2e63SVlad Yasevich pv->parent.port = port; 740552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 741243a2e63SVlad Yasevich if (err) 742243a2e63SVlad Yasevich goto clean_up; 743243a2e63SVlad Yasevich 744243a2e63SVlad Yasevich rcu_assign_pointer(port->vlan_info, pv); 745243a2e63SVlad Yasevich return 0; 746243a2e63SVlad Yasevich 747243a2e63SVlad Yasevich clean_up: 748243a2e63SVlad Yasevich kfree(pv); 749243a2e63SVlad Yasevich return err; 750243a2e63SVlad Yasevich } 751243a2e63SVlad Yasevich 7528adff41cSToshiaki Makita /* Must be protected by RTNL. 7538adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 7548adff41cSToshiaki Makita */ 755243a2e63SVlad Yasevich int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) 756243a2e63SVlad Yasevich { 757243a2e63SVlad Yasevich struct net_port_vlans *pv; 758243a2e63SVlad Yasevich 759243a2e63SVlad Yasevich ASSERT_RTNL(); 760243a2e63SVlad Yasevich 761243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 762243a2e63SVlad Yasevich if (!pv) 763243a2e63SVlad Yasevich return -EINVAL; 764243a2e63SVlad Yasevich 765424bb9c9SToshiaki Makita br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid); 7661ea2d020SNikolay Aleksandrov br_fdb_delete_by_port(port->br, port, vid, 0); 767bc9a25d2SVlad Yasevich 768243a2e63SVlad Yasevich return __vlan_del(pv, vid); 769243a2e63SVlad Yasevich } 770243a2e63SVlad Yasevich 771243a2e63SVlad Yasevich void nbp_vlan_flush(struct net_bridge_port *port) 772243a2e63SVlad Yasevich { 773243a2e63SVlad Yasevich struct net_port_vlans *pv; 774dbbaf949SToshiaki Makita u16 vid; 775243a2e63SVlad Yasevich 776243a2e63SVlad Yasevich ASSERT_RTNL(); 777243a2e63SVlad Yasevich 778243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 779243a2e63SVlad Yasevich if (!pv) 780243a2e63SVlad Yasevich return; 781243a2e63SVlad Yasevich 782dbbaf949SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 7838580e211SToshiaki Makita vlan_vid_del(port->dev, port->br->vlan_proto, vid); 784dbbaf949SToshiaki Makita 785243a2e63SVlad Yasevich __vlan_flush(pv); 786243a2e63SVlad Yasevich } 787bc9a25d2SVlad Yasevich 788bc9a25d2SVlad Yasevich bool nbp_vlan_find(struct net_bridge_port *port, u16 vid) 789bc9a25d2SVlad Yasevich { 790bc9a25d2SVlad Yasevich struct net_port_vlans *pv; 791bc9a25d2SVlad Yasevich bool found = false; 792bc9a25d2SVlad Yasevich 793bc9a25d2SVlad Yasevich rcu_read_lock(); 794bc9a25d2SVlad Yasevich pv = rcu_dereference(port->vlan_info); 795bc9a25d2SVlad Yasevich 796bc9a25d2SVlad Yasevich if (!pv) 797bc9a25d2SVlad Yasevich goto out; 798bc9a25d2SVlad Yasevich 799bc9a25d2SVlad Yasevich if (test_bit(vid, pv->vlan_bitmap)) 800bc9a25d2SVlad Yasevich found = true; 801bc9a25d2SVlad Yasevich 802bc9a25d2SVlad Yasevich out: 803bc9a25d2SVlad Yasevich rcu_read_unlock(); 804bc9a25d2SVlad Yasevich return found; 805bc9a25d2SVlad Yasevich } 8065be5a2dfSVlad Yasevich 8075be5a2dfSVlad Yasevich int nbp_vlan_init(struct net_bridge_port *p) 8085be5a2dfSVlad Yasevich { 8095be5a2dfSVlad Yasevich return p->br->default_pvid ? 8105be5a2dfSVlad Yasevich nbp_vlan_add(p, p->br->default_pvid, 8115be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 8125be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED) : 8135be5a2dfSVlad Yasevich 0; 8145be5a2dfSVlad Yasevich } 815