1243a2e63SVlad Yasevich #include <linux/kernel.h> 2243a2e63SVlad Yasevich #include <linux/netdevice.h> 3243a2e63SVlad Yasevich #include <linux/rtnetlink.h> 4243a2e63SVlad Yasevich #include <linux/slab.h> 5243a2e63SVlad Yasevich 6243a2e63SVlad Yasevich #include "br_private.h" 7243a2e63SVlad Yasevich 8552406c4SVlad Yasevich static void __vlan_add_pvid(struct net_port_vlans *v, u16 vid) 9552406c4SVlad Yasevich { 10552406c4SVlad Yasevich if (v->pvid == vid) 11552406c4SVlad Yasevich return; 12552406c4SVlad Yasevich 13552406c4SVlad Yasevich smp_wmb(); 14552406c4SVlad Yasevich v->pvid = vid; 15552406c4SVlad Yasevich } 16552406c4SVlad Yasevich 17552406c4SVlad Yasevich static void __vlan_delete_pvid(struct net_port_vlans *v, u16 vid) 18552406c4SVlad Yasevich { 19552406c4SVlad Yasevich if (v->pvid != vid) 20552406c4SVlad Yasevich return; 21552406c4SVlad Yasevich 22552406c4SVlad Yasevich smp_wmb(); 23552406c4SVlad Yasevich v->pvid = 0; 24552406c4SVlad Yasevich } 25552406c4SVlad Yasevich 2635e03f3aSVlad Yasevich static void __vlan_add_flags(struct net_port_vlans *v, u16 vid, u16 flags) 2735e03f3aSVlad Yasevich { 2835e03f3aSVlad Yasevich if (flags & BRIDGE_VLAN_INFO_PVID) 2935e03f3aSVlad Yasevich __vlan_add_pvid(v, vid); 3035e03f3aSVlad Yasevich 3135e03f3aSVlad Yasevich if (flags & BRIDGE_VLAN_INFO_UNTAGGED) 3235e03f3aSVlad Yasevich set_bit(vid, v->untagged_bitmap); 3335e03f3aSVlad Yasevich } 3435e03f3aSVlad Yasevich 35552406c4SVlad Yasevich static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) 36243a2e63SVlad Yasevich { 37bc9a25d2SVlad Yasevich struct net_bridge_port *p = NULL; 38bc9a25d2SVlad Yasevich struct net_bridge *br; 39bc9a25d2SVlad Yasevich struct net_device *dev; 40243a2e63SVlad Yasevich int err; 41243a2e63SVlad Yasevich 42552406c4SVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) { 4335e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 44552406c4SVlad Yasevich return 0; 45552406c4SVlad Yasevich } 46243a2e63SVlad Yasevich 47bc9a25d2SVlad Yasevich if (v->port_idx) { 48bc9a25d2SVlad Yasevich p = v->parent.port; 49bc9a25d2SVlad Yasevich br = p->br; 50bc9a25d2SVlad Yasevich dev = p->dev; 51bc9a25d2SVlad Yasevich } else { 52bc9a25d2SVlad Yasevich br = v->parent.br; 53bc9a25d2SVlad Yasevich dev = br->dev; 54bc9a25d2SVlad Yasevich } 55243a2e63SVlad Yasevich 5619236837SToshiaki Makita if (p) { 57243a2e63SVlad Yasevich /* Add VLAN to the device filter if it is supported. 58fdb0a662SToshiaki Makita * This ensures tagged traffic enters the bridge when 59fdb0a662SToshiaki Makita * promiscuous mode is disabled by br_manage_promisc(). 60243a2e63SVlad Yasevich */ 618580e211SToshiaki Makita err = vlan_vid_add(dev, br->vlan_proto, vid); 62243a2e63SVlad Yasevich if (err) 63243a2e63SVlad Yasevich return err; 64243a2e63SVlad Yasevich } 65bc9a25d2SVlad Yasevich 66bc9a25d2SVlad Yasevich err = br_fdb_insert(br, p, dev->dev_addr, vid); 67bc9a25d2SVlad Yasevich if (err) { 68bc9a25d2SVlad Yasevich br_err(br, "failed insert local address into bridge " 69bc9a25d2SVlad Yasevich "forwarding table\n"); 70bc9a25d2SVlad Yasevich goto out_filt; 71bc9a25d2SVlad Yasevich } 72bc9a25d2SVlad Yasevich 73243a2e63SVlad Yasevich set_bit(vid, v->vlan_bitmap); 746cbdceebSVlad Yasevich v->num_vlans++; 7535e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 76552406c4SVlad Yasevich 77243a2e63SVlad Yasevich return 0; 78bc9a25d2SVlad Yasevich 79bc9a25d2SVlad Yasevich out_filt: 8019236837SToshiaki Makita if (p) 818580e211SToshiaki Makita vlan_vid_del(dev, br->vlan_proto, vid); 82bc9a25d2SVlad Yasevich return err; 83243a2e63SVlad Yasevich } 84243a2e63SVlad Yasevich 85243a2e63SVlad Yasevich static int __vlan_del(struct net_port_vlans *v, u16 vid) 86243a2e63SVlad Yasevich { 87243a2e63SVlad Yasevich if (!test_bit(vid, v->vlan_bitmap)) 88243a2e63SVlad Yasevich return -EINVAL; 89243a2e63SVlad Yasevich 90552406c4SVlad Yasevich __vlan_delete_pvid(v, vid); 9135e03f3aSVlad Yasevich clear_bit(vid, v->untagged_bitmap); 92552406c4SVlad Yasevich 938580e211SToshiaki Makita if (v->port_idx) { 948580e211SToshiaki Makita struct net_bridge_port *p = v->parent.port; 958580e211SToshiaki Makita vlan_vid_del(p->dev, p->br->vlan_proto, vid); 968580e211SToshiaki Makita } 97243a2e63SVlad Yasevich 98243a2e63SVlad Yasevich clear_bit(vid, v->vlan_bitmap); 996cbdceebSVlad Yasevich v->num_vlans--; 100ef40b7efSToshiaki Makita if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) { 101243a2e63SVlad Yasevich if (v->port_idx) 102cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 103243a2e63SVlad Yasevich else 104cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 105243a2e63SVlad Yasevich kfree_rcu(v, rcu); 106243a2e63SVlad Yasevich } 107243a2e63SVlad Yasevich return 0; 108243a2e63SVlad Yasevich } 109243a2e63SVlad Yasevich 110243a2e63SVlad Yasevich static void __vlan_flush(struct net_port_vlans *v) 111243a2e63SVlad Yasevich { 112552406c4SVlad Yasevich smp_wmb(); 113552406c4SVlad Yasevich v->pvid = 0; 114ef40b7efSToshiaki Makita bitmap_zero(v->vlan_bitmap, VLAN_N_VID); 115243a2e63SVlad Yasevich if (v->port_idx) 116cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 117243a2e63SVlad Yasevich else 118cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 119243a2e63SVlad Yasevich kfree_rcu(v, rcu); 120243a2e63SVlad Yasevich } 121243a2e63SVlad Yasevich 12278851988SVlad Yasevich struct sk_buff *br_handle_vlan(struct net_bridge *br, 12378851988SVlad Yasevich const struct net_port_vlans *pv, 124a37b85c9SVlad Yasevich struct sk_buff *skb) 125a37b85c9SVlad Yasevich { 126a37b85c9SVlad Yasevich u16 vid; 127a37b85c9SVlad Yasevich 12820adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 12920adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 13078851988SVlad Yasevich goto out; 13178851988SVlad Yasevich 132fc92f745SVlad Yasevich /* Vlan filter table must be configured at this point. The 133fc92f745SVlad Yasevich * only exception is the bridge is set in promisc mode and the 134fc92f745SVlad Yasevich * packet is destined for the bridge device. In this case 135fc92f745SVlad Yasevich * pass the packet as is. 136fc92f745SVlad Yasevich */ 137fc92f745SVlad Yasevich if (!pv) { 138fc92f745SVlad Yasevich if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) { 139fc92f745SVlad Yasevich goto out; 140fc92f745SVlad Yasevich } else { 141fc92f745SVlad Yasevich kfree_skb(skb); 142fc92f745SVlad Yasevich return NULL; 143fc92f745SVlad Yasevich } 144fc92f745SVlad Yasevich } 145fc92f745SVlad Yasevich 14678851988SVlad Yasevich /* At this point, we know that the frame was filtered and contains 14735e03f3aSVlad Yasevich * a valid vlan id. If the vlan id is set in the untagged bitmap, 1481a81a2e0Stanxiaojun * send untagged; otherwise, send tagged. 14978851988SVlad Yasevich */ 15078851988SVlad Yasevich br_vlan_get_tag(skb, &vid); 15135e03f3aSVlad Yasevich if (test_bit(vid, pv->untagged_bitmap)) 15299b192daSToshiaki Makita skb->vlan_tci = 0; 15378851988SVlad Yasevich 15478851988SVlad Yasevich out: 15578851988SVlad Yasevich return skb; 15678851988SVlad Yasevich } 15778851988SVlad Yasevich 15878851988SVlad Yasevich /* Called under RCU */ 15978851988SVlad Yasevich bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, 16078851988SVlad Yasevich struct sk_buff *skb, u16 *vid) 16178851988SVlad Yasevich { 1628580e211SToshiaki Makita bool tagged; 1638580e211SToshiaki Makita __be16 proto; 164b90356ceSToshiaki Makita 165a37b85c9SVlad Yasevich /* If VLAN filtering is disabled on the bridge, all packets are 166a37b85c9SVlad Yasevich * permitted. 167a37b85c9SVlad Yasevich */ 16820adfa1aSVlad Yasevich if (!br->vlan_enabled) { 16920adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = false; 170a37b85c9SVlad Yasevich return true; 17120adfa1aSVlad Yasevich } 172a37b85c9SVlad Yasevich 173a37b85c9SVlad Yasevich /* If there are no vlan in the permitted list, all packets are 174a37b85c9SVlad Yasevich * rejected. 175a37b85c9SVlad Yasevich */ 176a37b85c9SVlad Yasevich if (!v) 177eb707618SToshiaki Makita goto drop; 178a37b85c9SVlad Yasevich 17920adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = true; 1808580e211SToshiaki Makita proto = br->vlan_proto; 1818580e211SToshiaki Makita 18212464bb8SToshiaki Makita /* If vlan tx offload is disabled on bridge device and frame was 18312464bb8SToshiaki Makita * sent from vlan device on the bridge device, it does not have 18412464bb8SToshiaki Makita * HW accelerated vlan tag. 18512464bb8SToshiaki Makita */ 18612464bb8SToshiaki Makita if (unlikely(!vlan_tx_tag_present(skb) && 1878580e211SToshiaki Makita skb->protocol == proto)) { 1880d5501c1SVlad Yasevich skb = skb_vlan_untag(skb); 18912464bb8SToshiaki Makita if (unlikely(!skb)) 19012464bb8SToshiaki Makita return false; 19112464bb8SToshiaki Makita } 19212464bb8SToshiaki Makita 1938580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid)) { 1948580e211SToshiaki Makita /* Tagged frame */ 1958580e211SToshiaki Makita if (skb->vlan_proto != proto) { 1968580e211SToshiaki Makita /* Protocol-mismatch, empty out vlan_tci for new tag */ 1978580e211SToshiaki Makita skb_push(skb, ETH_HLEN); 1988580e211SToshiaki Makita skb = __vlan_put_tag(skb, skb->vlan_proto, 1998580e211SToshiaki Makita vlan_tx_tag_get(skb)); 2008580e211SToshiaki Makita if (unlikely(!skb)) 2018580e211SToshiaki Makita return false; 2028580e211SToshiaki Makita 2038580e211SToshiaki Makita skb_pull(skb, ETH_HLEN); 2048580e211SToshiaki Makita skb_reset_mac_len(skb); 2058580e211SToshiaki Makita *vid = 0; 2068580e211SToshiaki Makita tagged = false; 2078580e211SToshiaki Makita } else { 2088580e211SToshiaki Makita tagged = true; 2098580e211SToshiaki Makita } 2108580e211SToshiaki Makita } else { 2118580e211SToshiaki Makita /* Untagged frame */ 2128580e211SToshiaki Makita tagged = false; 2138580e211SToshiaki Makita } 2148580e211SToshiaki Makita 215b90356ceSToshiaki Makita if (!*vid) { 21678851988SVlad Yasevich u16 pvid = br_get_pvid(v); 21778851988SVlad Yasevich 218b90356ceSToshiaki Makita /* Frame had a tag with VID 0 or did not have a tag. 219b90356ceSToshiaki Makita * See if pvid is set on this port. That tells us which 220b90356ceSToshiaki Makita * vlan untagged or priority-tagged traffic belongs to. 22178851988SVlad Yasevich */ 22278851988SVlad Yasevich if (pvid == VLAN_N_VID) 223eb707618SToshiaki Makita goto drop; 22478851988SVlad Yasevich 225b90356ceSToshiaki Makita /* PVID is set on this port. Any untagged or priority-tagged 226b90356ceSToshiaki Makita * ingress frame is considered to belong to this vlan. 22778851988SVlad Yasevich */ 228dfb5fa32SToshiaki Makita *vid = pvid; 2298580e211SToshiaki Makita if (likely(!tagged)) 230b90356ceSToshiaki Makita /* Untagged Frame. */ 2318580e211SToshiaki Makita __vlan_hwaccel_put_tag(skb, proto, pvid); 232b90356ceSToshiaki Makita else 233b90356ceSToshiaki Makita /* Priority-tagged Frame. 234b90356ceSToshiaki Makita * At this point, We know that skb->vlan_tci had 235b90356ceSToshiaki Makita * VLAN_TAG_PRESENT bit and its VID field was 0x000. 236b90356ceSToshiaki Makita * We update only VID field and preserve PCP field. 237b90356ceSToshiaki Makita */ 238b90356ceSToshiaki Makita skb->vlan_tci |= pvid; 239b90356ceSToshiaki Makita 24078851988SVlad Yasevich return true; 24178851988SVlad Yasevich } 24278851988SVlad Yasevich 24378851988SVlad Yasevich /* Frame had a valid vlan tag. See if vlan is allowed */ 24478851988SVlad Yasevich if (test_bit(*vid, v->vlan_bitmap)) 245a37b85c9SVlad Yasevich return true; 246eb707618SToshiaki Makita drop: 247eb707618SToshiaki Makita kfree_skb(skb); 248a37b85c9SVlad Yasevich return false; 249a37b85c9SVlad Yasevich } 250a37b85c9SVlad Yasevich 25185f46c6bSVlad Yasevich /* Called under RCU. */ 25285f46c6bSVlad Yasevich bool br_allowed_egress(struct net_bridge *br, 25385f46c6bSVlad Yasevich const struct net_port_vlans *v, 25485f46c6bSVlad Yasevich const struct sk_buff *skb) 25585f46c6bSVlad Yasevich { 25685f46c6bSVlad Yasevich u16 vid; 25785f46c6bSVlad Yasevich 25820adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 25920adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 26085f46c6bSVlad Yasevich return true; 26185f46c6bSVlad Yasevich 26285f46c6bSVlad Yasevich if (!v) 26385f46c6bSVlad Yasevich return false; 26485f46c6bSVlad Yasevich 26585f46c6bSVlad Yasevich br_vlan_get_tag(skb, &vid); 26685f46c6bSVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) 26785f46c6bSVlad Yasevich return true; 26885f46c6bSVlad Yasevich 26985f46c6bSVlad Yasevich return false; 27085f46c6bSVlad Yasevich } 27185f46c6bSVlad Yasevich 272e0d7968aSToshiaki Makita /* Called under RCU */ 273e0d7968aSToshiaki Makita bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid) 274e0d7968aSToshiaki Makita { 275e0d7968aSToshiaki Makita struct net_bridge *br = p->br; 276e0d7968aSToshiaki Makita struct net_port_vlans *v; 277e0d7968aSToshiaki Makita 27820adfa1aSVlad Yasevich /* If filtering was disabled at input, let it pass. */ 27920adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 280e0d7968aSToshiaki Makita return true; 281e0d7968aSToshiaki Makita 282e0d7968aSToshiaki Makita v = rcu_dereference(p->vlan_info); 283e0d7968aSToshiaki Makita if (!v) 284e0d7968aSToshiaki Makita return false; 285e0d7968aSToshiaki Makita 2868580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto) 2878580e211SToshiaki Makita *vid = 0; 2888580e211SToshiaki Makita 289e0d7968aSToshiaki Makita if (!*vid) { 290e0d7968aSToshiaki Makita *vid = br_get_pvid(v); 291e0d7968aSToshiaki Makita if (*vid == VLAN_N_VID) 292e0d7968aSToshiaki Makita return false; 293e0d7968aSToshiaki Makita 294e0d7968aSToshiaki Makita return true; 295e0d7968aSToshiaki Makita } 296e0d7968aSToshiaki Makita 297e0d7968aSToshiaki Makita if (test_bit(*vid, v->vlan_bitmap)) 298e0d7968aSToshiaki Makita return true; 299e0d7968aSToshiaki Makita 300e0d7968aSToshiaki Makita return false; 301e0d7968aSToshiaki Makita } 302e0d7968aSToshiaki Makita 3038adff41cSToshiaki Makita /* Must be protected by RTNL. 3048adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 3058adff41cSToshiaki Makita */ 306552406c4SVlad Yasevich int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags) 307243a2e63SVlad Yasevich { 308243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 309243a2e63SVlad Yasevich int err; 310243a2e63SVlad Yasevich 311243a2e63SVlad Yasevich ASSERT_RTNL(); 312243a2e63SVlad Yasevich 313243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 314243a2e63SVlad Yasevich if (pv) 315552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 316243a2e63SVlad Yasevich 317243a2e63SVlad Yasevich /* Create port vlan infomration 318243a2e63SVlad Yasevich */ 319243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 320243a2e63SVlad Yasevich if (!pv) 321243a2e63SVlad Yasevich return -ENOMEM; 322243a2e63SVlad Yasevich 323243a2e63SVlad Yasevich pv->parent.br = br; 324552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 325243a2e63SVlad Yasevich if (err) 326243a2e63SVlad Yasevich goto out; 327243a2e63SVlad Yasevich 328243a2e63SVlad Yasevich rcu_assign_pointer(br->vlan_info, pv); 329243a2e63SVlad Yasevich return 0; 330243a2e63SVlad Yasevich out: 331243a2e63SVlad Yasevich kfree(pv); 332243a2e63SVlad Yasevich return err; 333243a2e63SVlad Yasevich } 334243a2e63SVlad Yasevich 3358adff41cSToshiaki Makita /* Must be protected by RTNL. 3368adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 3378adff41cSToshiaki Makita */ 338243a2e63SVlad Yasevich int br_vlan_delete(struct net_bridge *br, u16 vid) 339243a2e63SVlad Yasevich { 340243a2e63SVlad Yasevich struct net_port_vlans *pv; 341243a2e63SVlad Yasevich 342243a2e63SVlad Yasevich ASSERT_RTNL(); 343243a2e63SVlad Yasevich 344243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 345243a2e63SVlad Yasevich if (!pv) 346243a2e63SVlad Yasevich return -EINVAL; 347243a2e63SVlad Yasevich 348424bb9c9SToshiaki Makita br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid); 349bc9a25d2SVlad Yasevich 350243a2e63SVlad Yasevich __vlan_del(pv, vid); 351243a2e63SVlad Yasevich return 0; 352243a2e63SVlad Yasevich } 353243a2e63SVlad Yasevich 354243a2e63SVlad Yasevich void br_vlan_flush(struct net_bridge *br) 355243a2e63SVlad Yasevich { 356243a2e63SVlad Yasevich struct net_port_vlans *pv; 357243a2e63SVlad Yasevich 358243a2e63SVlad Yasevich ASSERT_RTNL(); 359243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 360243a2e63SVlad Yasevich if (!pv) 361243a2e63SVlad Yasevich return; 362243a2e63SVlad Yasevich 363243a2e63SVlad Yasevich __vlan_flush(pv); 364243a2e63SVlad Yasevich } 365243a2e63SVlad Yasevich 3662b292fb4SToshiaki Makita bool br_vlan_find(struct net_bridge *br, u16 vid) 3672b292fb4SToshiaki Makita { 3682b292fb4SToshiaki Makita struct net_port_vlans *pv; 3692b292fb4SToshiaki Makita bool found = false; 3702b292fb4SToshiaki Makita 3712b292fb4SToshiaki Makita rcu_read_lock(); 3722b292fb4SToshiaki Makita pv = rcu_dereference(br->vlan_info); 3732b292fb4SToshiaki Makita 3742b292fb4SToshiaki Makita if (!pv) 3752b292fb4SToshiaki Makita goto out; 3762b292fb4SToshiaki Makita 3772b292fb4SToshiaki Makita if (test_bit(vid, pv->vlan_bitmap)) 3782b292fb4SToshiaki Makita found = true; 3792b292fb4SToshiaki Makita 3802b292fb4SToshiaki Makita out: 3812b292fb4SToshiaki Makita rcu_read_unlock(); 3822b292fb4SToshiaki Makita return found; 3832b292fb4SToshiaki Makita } 3842b292fb4SToshiaki Makita 385204177f3SToshiaki Makita /* Must be protected by RTNL. */ 386204177f3SToshiaki Makita static void recalculate_group_addr(struct net_bridge *br) 387204177f3SToshiaki Makita { 388204177f3SToshiaki Makita if (br->group_addr_set) 389204177f3SToshiaki Makita return; 390204177f3SToshiaki Makita 391204177f3SToshiaki Makita spin_lock_bh(&br->lock); 392204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) { 393204177f3SToshiaki Makita /* Bridge Group Address */ 394204177f3SToshiaki Makita br->group_addr[5] = 0x00; 395204177f3SToshiaki Makita } else { /* vlan_enabled && ETH_P_8021AD */ 396204177f3SToshiaki Makita /* Provider Bridge Group Address */ 397204177f3SToshiaki Makita br->group_addr[5] = 0x08; 398204177f3SToshiaki Makita } 399204177f3SToshiaki Makita spin_unlock_bh(&br->lock); 400204177f3SToshiaki Makita } 401204177f3SToshiaki Makita 402204177f3SToshiaki Makita /* Must be protected by RTNL. */ 403204177f3SToshiaki Makita void br_recalculate_fwd_mask(struct net_bridge *br) 404204177f3SToshiaki Makita { 405204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) 406204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT; 407204177f3SToshiaki Makita else /* vlan_enabled && ETH_P_8021AD */ 408204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_8021AD & 409204177f3SToshiaki Makita ~(1u << br->group_addr[5]); 410204177f3SToshiaki Makita } 411204177f3SToshiaki Makita 412243a2e63SVlad Yasevich int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) 413243a2e63SVlad Yasevich { 414243a2e63SVlad Yasevich if (!rtnl_trylock()) 415243a2e63SVlad Yasevich return restart_syscall(); 416243a2e63SVlad Yasevich 417243a2e63SVlad Yasevich if (br->vlan_enabled == val) 418243a2e63SVlad Yasevich goto unlock; 419243a2e63SVlad Yasevich 420243a2e63SVlad Yasevich br->vlan_enabled = val; 4212796d0c6SVlad Yasevich br_manage_promisc(br); 422204177f3SToshiaki Makita recalculate_group_addr(br); 423204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 424243a2e63SVlad Yasevich 425243a2e63SVlad Yasevich unlock: 426243a2e63SVlad Yasevich rtnl_unlock(); 427243a2e63SVlad Yasevich return 0; 428243a2e63SVlad Yasevich } 429243a2e63SVlad Yasevich 430204177f3SToshiaki Makita int br_vlan_set_proto(struct net_bridge *br, unsigned long val) 431204177f3SToshiaki Makita { 432204177f3SToshiaki Makita int err = 0; 433204177f3SToshiaki Makita struct net_bridge_port *p; 434204177f3SToshiaki Makita struct net_port_vlans *pv; 435204177f3SToshiaki Makita __be16 proto, oldproto; 436204177f3SToshiaki Makita u16 vid, errvid; 437204177f3SToshiaki Makita 438204177f3SToshiaki Makita if (val != ETH_P_8021Q && val != ETH_P_8021AD) 439204177f3SToshiaki Makita return -EPROTONOSUPPORT; 440204177f3SToshiaki Makita 441204177f3SToshiaki Makita if (!rtnl_trylock()) 442204177f3SToshiaki Makita return restart_syscall(); 443204177f3SToshiaki Makita 444204177f3SToshiaki Makita proto = htons(val); 445204177f3SToshiaki Makita if (br->vlan_proto == proto) 446204177f3SToshiaki Makita goto unlock; 447204177f3SToshiaki Makita 448204177f3SToshiaki Makita /* Add VLANs for the new proto to the device filter. */ 449204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 450204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 451204177f3SToshiaki Makita if (!pv) 452204177f3SToshiaki Makita continue; 453204177f3SToshiaki Makita 454204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { 455204177f3SToshiaki Makita err = vlan_vid_add(p->dev, proto, vid); 456204177f3SToshiaki Makita if (err) 457204177f3SToshiaki Makita goto err_filt; 458204177f3SToshiaki Makita } 459204177f3SToshiaki Makita } 460204177f3SToshiaki Makita 461204177f3SToshiaki Makita oldproto = br->vlan_proto; 462204177f3SToshiaki Makita br->vlan_proto = proto; 463204177f3SToshiaki Makita 464204177f3SToshiaki Makita recalculate_group_addr(br); 465204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 466204177f3SToshiaki Makita 467204177f3SToshiaki Makita /* Delete VLANs for the old proto from the device filter. */ 468204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 469204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 470204177f3SToshiaki Makita if (!pv) 471204177f3SToshiaki Makita continue; 472204177f3SToshiaki Makita 473204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 474204177f3SToshiaki Makita vlan_vid_del(p->dev, oldproto, vid); 475204177f3SToshiaki Makita } 476204177f3SToshiaki Makita 477204177f3SToshiaki Makita unlock: 478204177f3SToshiaki Makita rtnl_unlock(); 479204177f3SToshiaki Makita return err; 480204177f3SToshiaki Makita 481204177f3SToshiaki Makita err_filt: 482204177f3SToshiaki Makita errvid = vid; 483204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, errvid) 484204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 485204177f3SToshiaki Makita 486204177f3SToshiaki Makita list_for_each_entry_continue_reverse(p, &br->port_list, list) { 487204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 488204177f3SToshiaki Makita if (!pv) 489204177f3SToshiaki Makita continue; 490204177f3SToshiaki Makita 491204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 492204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 493204177f3SToshiaki Makita } 494204177f3SToshiaki Makita 495204177f3SToshiaki Makita goto unlock; 496204177f3SToshiaki Makita } 497204177f3SToshiaki Makita 4988580e211SToshiaki Makita void br_vlan_init(struct net_bridge *br) 4998580e211SToshiaki Makita { 5008580e211SToshiaki Makita br->vlan_proto = htons(ETH_P_8021Q); 5018580e211SToshiaki Makita } 5028580e211SToshiaki Makita 5038adff41cSToshiaki Makita /* Must be protected by RTNL. 5048adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 5058adff41cSToshiaki Makita */ 506552406c4SVlad Yasevich int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) 507243a2e63SVlad Yasevich { 508243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 509243a2e63SVlad Yasevich int err; 510243a2e63SVlad Yasevich 511243a2e63SVlad Yasevich ASSERT_RTNL(); 512243a2e63SVlad Yasevich 513243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 514243a2e63SVlad Yasevich if (pv) 515552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 516243a2e63SVlad Yasevich 517243a2e63SVlad Yasevich /* Create port vlan infomration 518243a2e63SVlad Yasevich */ 519243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 520243a2e63SVlad Yasevich if (!pv) { 521243a2e63SVlad Yasevich err = -ENOMEM; 522243a2e63SVlad Yasevich goto clean_up; 523243a2e63SVlad Yasevich } 524243a2e63SVlad Yasevich 525243a2e63SVlad Yasevich pv->port_idx = port->port_no; 526243a2e63SVlad Yasevich pv->parent.port = port; 527552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 528243a2e63SVlad Yasevich if (err) 529243a2e63SVlad Yasevich goto clean_up; 530243a2e63SVlad Yasevich 531243a2e63SVlad Yasevich rcu_assign_pointer(port->vlan_info, pv); 532243a2e63SVlad Yasevich return 0; 533243a2e63SVlad Yasevich 534243a2e63SVlad Yasevich clean_up: 535243a2e63SVlad Yasevich kfree(pv); 536243a2e63SVlad Yasevich return err; 537243a2e63SVlad Yasevich } 538243a2e63SVlad Yasevich 5398adff41cSToshiaki Makita /* Must be protected by RTNL. 5408adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 5418adff41cSToshiaki Makita */ 542243a2e63SVlad Yasevich int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) 543243a2e63SVlad Yasevich { 544243a2e63SVlad Yasevich struct net_port_vlans *pv; 545243a2e63SVlad Yasevich 546243a2e63SVlad Yasevich ASSERT_RTNL(); 547243a2e63SVlad Yasevich 548243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 549243a2e63SVlad Yasevich if (!pv) 550243a2e63SVlad Yasevich return -EINVAL; 551243a2e63SVlad Yasevich 552424bb9c9SToshiaki Makita br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid); 553bc9a25d2SVlad Yasevich 554243a2e63SVlad Yasevich return __vlan_del(pv, vid); 555243a2e63SVlad Yasevich } 556243a2e63SVlad Yasevich 557243a2e63SVlad Yasevich void nbp_vlan_flush(struct net_bridge_port *port) 558243a2e63SVlad Yasevich { 559243a2e63SVlad Yasevich struct net_port_vlans *pv; 560dbbaf949SToshiaki Makita u16 vid; 561243a2e63SVlad Yasevich 562243a2e63SVlad Yasevich ASSERT_RTNL(); 563243a2e63SVlad Yasevich 564243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 565243a2e63SVlad Yasevich if (!pv) 566243a2e63SVlad Yasevich return; 567243a2e63SVlad Yasevich 568dbbaf949SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 5698580e211SToshiaki Makita vlan_vid_del(port->dev, port->br->vlan_proto, vid); 570dbbaf949SToshiaki Makita 571243a2e63SVlad Yasevich __vlan_flush(pv); 572243a2e63SVlad Yasevich } 573bc9a25d2SVlad Yasevich 574bc9a25d2SVlad Yasevich bool nbp_vlan_find(struct net_bridge_port *port, u16 vid) 575bc9a25d2SVlad Yasevich { 576bc9a25d2SVlad Yasevich struct net_port_vlans *pv; 577bc9a25d2SVlad Yasevich bool found = false; 578bc9a25d2SVlad Yasevich 579bc9a25d2SVlad Yasevich rcu_read_lock(); 580bc9a25d2SVlad Yasevich pv = rcu_dereference(port->vlan_info); 581bc9a25d2SVlad Yasevich 582bc9a25d2SVlad Yasevich if (!pv) 583bc9a25d2SVlad Yasevich goto out; 584bc9a25d2SVlad Yasevich 585bc9a25d2SVlad Yasevich if (test_bit(vid, pv->vlan_bitmap)) 586bc9a25d2SVlad Yasevich found = true; 587bc9a25d2SVlad Yasevich 588bc9a25d2SVlad Yasevich out: 589bc9a25d2SVlad Yasevich rcu_read_unlock(); 590bc9a25d2SVlad Yasevich return found; 591bc9a25d2SVlad Yasevich } 592