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); 30635126b7SVlad Yasevich else 31635126b7SVlad Yasevich __vlan_delete_pvid(v, vid); 3235e03f3aSVlad Yasevich 3335e03f3aSVlad Yasevich if (flags & BRIDGE_VLAN_INFO_UNTAGGED) 3435e03f3aSVlad Yasevich set_bit(vid, v->untagged_bitmap); 35635126b7SVlad Yasevich else 36635126b7SVlad Yasevich clear_bit(vid, v->untagged_bitmap); 3735e03f3aSVlad Yasevich } 3835e03f3aSVlad Yasevich 39552406c4SVlad Yasevich static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) 40243a2e63SVlad Yasevich { 41bc9a25d2SVlad Yasevich struct net_bridge_port *p = NULL; 42bc9a25d2SVlad Yasevich struct net_bridge *br; 43bc9a25d2SVlad Yasevich struct net_device *dev; 44243a2e63SVlad Yasevich int err; 45243a2e63SVlad Yasevich 46552406c4SVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) { 4735e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 48552406c4SVlad Yasevich return 0; 49552406c4SVlad Yasevich } 50243a2e63SVlad Yasevich 51bc9a25d2SVlad Yasevich if (v->port_idx) { 52bc9a25d2SVlad Yasevich p = v->parent.port; 53bc9a25d2SVlad Yasevich br = p->br; 54bc9a25d2SVlad Yasevich dev = p->dev; 55bc9a25d2SVlad Yasevich } else { 56bc9a25d2SVlad Yasevich br = v->parent.br; 57bc9a25d2SVlad Yasevich dev = br->dev; 58bc9a25d2SVlad Yasevich } 59243a2e63SVlad Yasevich 6019236837SToshiaki Makita if (p) { 61243a2e63SVlad Yasevich /* Add VLAN to the device filter if it is supported. 62fdb0a662SToshiaki Makita * This ensures tagged traffic enters the bridge when 63fdb0a662SToshiaki Makita * promiscuous mode is disabled by br_manage_promisc(). 64243a2e63SVlad Yasevich */ 658580e211SToshiaki Makita err = vlan_vid_add(dev, br->vlan_proto, vid); 66243a2e63SVlad Yasevich if (err) 67243a2e63SVlad Yasevich return err; 68243a2e63SVlad Yasevich } 69bc9a25d2SVlad Yasevich 70bc9a25d2SVlad Yasevich err = br_fdb_insert(br, p, dev->dev_addr, vid); 71bc9a25d2SVlad Yasevich if (err) { 72bc9a25d2SVlad Yasevich br_err(br, "failed insert local address into bridge " 73bc9a25d2SVlad Yasevich "forwarding table\n"); 74bc9a25d2SVlad Yasevich goto out_filt; 75bc9a25d2SVlad Yasevich } 76bc9a25d2SVlad Yasevich 77243a2e63SVlad Yasevich set_bit(vid, v->vlan_bitmap); 786cbdceebSVlad Yasevich v->num_vlans++; 7935e03f3aSVlad Yasevich __vlan_add_flags(v, vid, flags); 80552406c4SVlad Yasevich 81243a2e63SVlad Yasevich return 0; 82bc9a25d2SVlad Yasevich 83bc9a25d2SVlad Yasevich out_filt: 8419236837SToshiaki Makita if (p) 858580e211SToshiaki Makita vlan_vid_del(dev, br->vlan_proto, vid); 86bc9a25d2SVlad Yasevich return err; 87243a2e63SVlad Yasevich } 88243a2e63SVlad Yasevich 89243a2e63SVlad Yasevich static int __vlan_del(struct net_port_vlans *v, u16 vid) 90243a2e63SVlad Yasevich { 91243a2e63SVlad Yasevich if (!test_bit(vid, v->vlan_bitmap)) 92243a2e63SVlad Yasevich return -EINVAL; 93243a2e63SVlad Yasevich 94552406c4SVlad Yasevich __vlan_delete_pvid(v, vid); 9535e03f3aSVlad Yasevich clear_bit(vid, v->untagged_bitmap); 96552406c4SVlad Yasevich 978580e211SToshiaki Makita if (v->port_idx) { 988580e211SToshiaki Makita struct net_bridge_port *p = v->parent.port; 998580e211SToshiaki Makita vlan_vid_del(p->dev, p->br->vlan_proto, vid); 1008580e211SToshiaki Makita } 101243a2e63SVlad Yasevich 102243a2e63SVlad Yasevich clear_bit(vid, v->vlan_bitmap); 1036cbdceebSVlad Yasevich v->num_vlans--; 104ef40b7efSToshiaki Makita if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) { 105243a2e63SVlad Yasevich if (v->port_idx) 106cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 107243a2e63SVlad Yasevich else 108cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 109243a2e63SVlad Yasevich kfree_rcu(v, rcu); 110243a2e63SVlad Yasevich } 111243a2e63SVlad Yasevich return 0; 112243a2e63SVlad Yasevich } 113243a2e63SVlad Yasevich 114243a2e63SVlad Yasevich static void __vlan_flush(struct net_port_vlans *v) 115243a2e63SVlad Yasevich { 116552406c4SVlad Yasevich smp_wmb(); 117552406c4SVlad Yasevich v->pvid = 0; 118ef40b7efSToshiaki Makita bitmap_zero(v->vlan_bitmap, VLAN_N_VID); 119243a2e63SVlad Yasevich if (v->port_idx) 120cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.port->vlan_info, NULL); 121243a2e63SVlad Yasevich else 122cd18721eSMonam Agarwal RCU_INIT_POINTER(v->parent.br->vlan_info, NULL); 123243a2e63SVlad Yasevich kfree_rcu(v, rcu); 124243a2e63SVlad Yasevich } 125243a2e63SVlad Yasevich 12678851988SVlad Yasevich struct sk_buff *br_handle_vlan(struct net_bridge *br, 12778851988SVlad Yasevich const struct net_port_vlans *pv, 128a37b85c9SVlad Yasevich struct sk_buff *skb) 129a37b85c9SVlad Yasevich { 130a37b85c9SVlad Yasevich u16 vid; 131a37b85c9SVlad Yasevich 13220adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 13320adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 13478851988SVlad Yasevich goto out; 13578851988SVlad Yasevich 136fc92f745SVlad Yasevich /* Vlan filter table must be configured at this point. The 137fc92f745SVlad Yasevich * only exception is the bridge is set in promisc mode and the 138fc92f745SVlad Yasevich * packet is destined for the bridge device. In this case 139fc92f745SVlad Yasevich * pass the packet as is. 140fc92f745SVlad Yasevich */ 141fc92f745SVlad Yasevich if (!pv) { 142fc92f745SVlad Yasevich if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) { 143fc92f745SVlad Yasevich goto out; 144fc92f745SVlad Yasevich } else { 145fc92f745SVlad Yasevich kfree_skb(skb); 146fc92f745SVlad Yasevich return NULL; 147fc92f745SVlad Yasevich } 148fc92f745SVlad Yasevich } 149fc92f745SVlad Yasevich 15078851988SVlad Yasevich /* At this point, we know that the frame was filtered and contains 15135e03f3aSVlad Yasevich * a valid vlan id. If the vlan id is set in the untagged bitmap, 1521a81a2e0Stanxiaojun * send untagged; otherwise, send tagged. 15378851988SVlad Yasevich */ 15478851988SVlad Yasevich br_vlan_get_tag(skb, &vid); 15535e03f3aSVlad Yasevich if (test_bit(vid, pv->untagged_bitmap)) 15699b192daSToshiaki Makita skb->vlan_tci = 0; 15778851988SVlad Yasevich 15878851988SVlad Yasevich out: 15978851988SVlad Yasevich return skb; 16078851988SVlad Yasevich } 16178851988SVlad Yasevich 16278851988SVlad Yasevich /* Called under RCU */ 16378851988SVlad Yasevich bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, 16478851988SVlad Yasevich struct sk_buff *skb, u16 *vid) 16578851988SVlad Yasevich { 1668580e211SToshiaki Makita bool tagged; 1678580e211SToshiaki Makita __be16 proto; 168b90356ceSToshiaki Makita 169a37b85c9SVlad Yasevich /* If VLAN filtering is disabled on the bridge, all packets are 170a37b85c9SVlad Yasevich * permitted. 171a37b85c9SVlad Yasevich */ 17220adfa1aSVlad Yasevich if (!br->vlan_enabled) { 17320adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = false; 174a37b85c9SVlad Yasevich return true; 17520adfa1aSVlad Yasevich } 176a37b85c9SVlad Yasevich 177a37b85c9SVlad Yasevich /* If there are no vlan in the permitted list, all packets are 178a37b85c9SVlad Yasevich * rejected. 179a37b85c9SVlad Yasevich */ 180a37b85c9SVlad Yasevich if (!v) 181eb707618SToshiaki Makita goto drop; 182a37b85c9SVlad Yasevich 18320adfa1aSVlad Yasevich BR_INPUT_SKB_CB(skb)->vlan_filtered = true; 1848580e211SToshiaki Makita proto = br->vlan_proto; 1858580e211SToshiaki Makita 18612464bb8SToshiaki Makita /* If vlan tx offload is disabled on bridge device and frame was 18712464bb8SToshiaki Makita * sent from vlan device on the bridge device, it does not have 18812464bb8SToshiaki Makita * HW accelerated vlan tag. 18912464bb8SToshiaki Makita */ 19012464bb8SToshiaki Makita if (unlikely(!vlan_tx_tag_present(skb) && 1918580e211SToshiaki Makita skb->protocol == proto)) { 1920d5501c1SVlad Yasevich skb = skb_vlan_untag(skb); 19312464bb8SToshiaki Makita if (unlikely(!skb)) 19412464bb8SToshiaki Makita return false; 19512464bb8SToshiaki Makita } 19612464bb8SToshiaki Makita 1978580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid)) { 1988580e211SToshiaki Makita /* Tagged frame */ 1998580e211SToshiaki Makita if (skb->vlan_proto != proto) { 2008580e211SToshiaki Makita /* Protocol-mismatch, empty out vlan_tci for new tag */ 2018580e211SToshiaki Makita skb_push(skb, ETH_HLEN); 20262749e2cSJiri Pirko skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, 2038580e211SToshiaki Makita vlan_tx_tag_get(skb)); 2048580e211SToshiaki Makita if (unlikely(!skb)) 2058580e211SToshiaki Makita return false; 2068580e211SToshiaki Makita 2078580e211SToshiaki Makita skb_pull(skb, ETH_HLEN); 2088580e211SToshiaki Makita skb_reset_mac_len(skb); 2098580e211SToshiaki Makita *vid = 0; 2108580e211SToshiaki Makita tagged = false; 2118580e211SToshiaki Makita } else { 2128580e211SToshiaki Makita tagged = true; 2138580e211SToshiaki Makita } 2148580e211SToshiaki Makita } else { 2158580e211SToshiaki Makita /* Untagged frame */ 2168580e211SToshiaki Makita tagged = false; 2178580e211SToshiaki Makita } 2188580e211SToshiaki Makita 219b90356ceSToshiaki Makita if (!*vid) { 22078851988SVlad Yasevich u16 pvid = br_get_pvid(v); 22178851988SVlad Yasevich 222b90356ceSToshiaki Makita /* Frame had a tag with VID 0 or did not have a tag. 223b90356ceSToshiaki Makita * See if pvid is set on this port. That tells us which 224b90356ceSToshiaki Makita * vlan untagged or priority-tagged traffic belongs to. 22578851988SVlad Yasevich */ 2263df6bf45SVlad Yasevich if (!pvid) 227eb707618SToshiaki Makita goto drop; 22878851988SVlad Yasevich 229b90356ceSToshiaki Makita /* PVID is set on this port. Any untagged or priority-tagged 230b90356ceSToshiaki Makita * ingress frame is considered to belong to this vlan. 23178851988SVlad Yasevich */ 232dfb5fa32SToshiaki Makita *vid = pvid; 2338580e211SToshiaki Makita if (likely(!tagged)) 234b90356ceSToshiaki Makita /* Untagged Frame. */ 2358580e211SToshiaki Makita __vlan_hwaccel_put_tag(skb, proto, pvid); 236b90356ceSToshiaki Makita else 237b90356ceSToshiaki Makita /* Priority-tagged Frame. 238b90356ceSToshiaki Makita * At this point, We know that skb->vlan_tci had 239b90356ceSToshiaki Makita * VLAN_TAG_PRESENT bit and its VID field was 0x000. 240b90356ceSToshiaki Makita * We update only VID field and preserve PCP field. 241b90356ceSToshiaki Makita */ 242b90356ceSToshiaki Makita skb->vlan_tci |= pvid; 243b90356ceSToshiaki Makita 24478851988SVlad Yasevich return true; 24578851988SVlad Yasevich } 24678851988SVlad Yasevich 24778851988SVlad Yasevich /* Frame had a valid vlan tag. See if vlan is allowed */ 24878851988SVlad Yasevich if (test_bit(*vid, v->vlan_bitmap)) 249a37b85c9SVlad Yasevich return true; 250eb707618SToshiaki Makita drop: 251eb707618SToshiaki Makita kfree_skb(skb); 252a37b85c9SVlad Yasevich return false; 253a37b85c9SVlad Yasevich } 254a37b85c9SVlad Yasevich 25585f46c6bSVlad Yasevich /* Called under RCU. */ 25685f46c6bSVlad Yasevich bool br_allowed_egress(struct net_bridge *br, 25785f46c6bSVlad Yasevich const struct net_port_vlans *v, 25885f46c6bSVlad Yasevich const struct sk_buff *skb) 25985f46c6bSVlad Yasevich { 26085f46c6bSVlad Yasevich u16 vid; 26185f46c6bSVlad Yasevich 26220adfa1aSVlad Yasevich /* If this packet was not filtered at input, let it pass */ 26320adfa1aSVlad Yasevich if (!BR_INPUT_SKB_CB(skb)->vlan_filtered) 26485f46c6bSVlad Yasevich return true; 26585f46c6bSVlad Yasevich 26685f46c6bSVlad Yasevich if (!v) 26785f46c6bSVlad Yasevich return false; 26885f46c6bSVlad Yasevich 26985f46c6bSVlad Yasevich br_vlan_get_tag(skb, &vid); 27085f46c6bSVlad Yasevich if (test_bit(vid, v->vlan_bitmap)) 27185f46c6bSVlad Yasevich return true; 27285f46c6bSVlad Yasevich 27385f46c6bSVlad Yasevich return false; 27485f46c6bSVlad Yasevich } 27585f46c6bSVlad Yasevich 276e0d7968aSToshiaki Makita /* Called under RCU */ 277e0d7968aSToshiaki Makita bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid) 278e0d7968aSToshiaki Makita { 279e0d7968aSToshiaki Makita struct net_bridge *br = p->br; 280e0d7968aSToshiaki Makita struct net_port_vlans *v; 281e0d7968aSToshiaki Makita 28220adfa1aSVlad Yasevich /* If filtering was disabled at input, let it pass. */ 283c095f248SVlad Yasevich if (!br->vlan_enabled) 284e0d7968aSToshiaki Makita return true; 285e0d7968aSToshiaki Makita 286e0d7968aSToshiaki Makita v = rcu_dereference(p->vlan_info); 287e0d7968aSToshiaki Makita if (!v) 288e0d7968aSToshiaki Makita return false; 289e0d7968aSToshiaki Makita 2908580e211SToshiaki Makita if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto) 2918580e211SToshiaki Makita *vid = 0; 2928580e211SToshiaki Makita 293e0d7968aSToshiaki Makita if (!*vid) { 294e0d7968aSToshiaki Makita *vid = br_get_pvid(v); 2953df6bf45SVlad Yasevich if (!*vid) 296e0d7968aSToshiaki Makita return false; 297e0d7968aSToshiaki Makita 298e0d7968aSToshiaki Makita return true; 299e0d7968aSToshiaki Makita } 300e0d7968aSToshiaki Makita 301e0d7968aSToshiaki Makita if (test_bit(*vid, v->vlan_bitmap)) 302e0d7968aSToshiaki Makita return true; 303e0d7968aSToshiaki Makita 304e0d7968aSToshiaki Makita return false; 305e0d7968aSToshiaki Makita } 306e0d7968aSToshiaki Makita 3078adff41cSToshiaki Makita /* Must be protected by RTNL. 3088adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 3098adff41cSToshiaki Makita */ 310552406c4SVlad Yasevich int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags) 311243a2e63SVlad Yasevich { 312243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 313243a2e63SVlad Yasevich int err; 314243a2e63SVlad Yasevich 315243a2e63SVlad Yasevich ASSERT_RTNL(); 316243a2e63SVlad Yasevich 317243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 318243a2e63SVlad Yasevich if (pv) 319552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 320243a2e63SVlad Yasevich 321243a2e63SVlad Yasevich /* Create port vlan infomration 322243a2e63SVlad Yasevich */ 323243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 324243a2e63SVlad Yasevich if (!pv) 325243a2e63SVlad Yasevich return -ENOMEM; 326243a2e63SVlad Yasevich 327243a2e63SVlad Yasevich pv->parent.br = br; 328552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 329243a2e63SVlad Yasevich if (err) 330243a2e63SVlad Yasevich goto out; 331243a2e63SVlad Yasevich 332243a2e63SVlad Yasevich rcu_assign_pointer(br->vlan_info, pv); 333243a2e63SVlad Yasevich return 0; 334243a2e63SVlad Yasevich out: 335243a2e63SVlad Yasevich kfree(pv); 336243a2e63SVlad Yasevich return err; 337243a2e63SVlad Yasevich } 338243a2e63SVlad Yasevich 3398adff41cSToshiaki Makita /* Must be protected by RTNL. 3408adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 3418adff41cSToshiaki Makita */ 342243a2e63SVlad Yasevich int br_vlan_delete(struct net_bridge *br, u16 vid) 343243a2e63SVlad Yasevich { 344243a2e63SVlad Yasevich struct net_port_vlans *pv; 345243a2e63SVlad Yasevich 346243a2e63SVlad Yasevich ASSERT_RTNL(); 347243a2e63SVlad Yasevich 348243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 349243a2e63SVlad Yasevich if (!pv) 350243a2e63SVlad Yasevich return -EINVAL; 351243a2e63SVlad Yasevich 352424bb9c9SToshiaki Makita br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid); 353bc9a25d2SVlad Yasevich 354243a2e63SVlad Yasevich __vlan_del(pv, vid); 355243a2e63SVlad Yasevich return 0; 356243a2e63SVlad Yasevich } 357243a2e63SVlad Yasevich 358243a2e63SVlad Yasevich void br_vlan_flush(struct net_bridge *br) 359243a2e63SVlad Yasevich { 360243a2e63SVlad Yasevich struct net_port_vlans *pv; 361243a2e63SVlad Yasevich 362243a2e63SVlad Yasevich ASSERT_RTNL(); 363243a2e63SVlad Yasevich pv = rtnl_dereference(br->vlan_info); 364243a2e63SVlad Yasevich if (!pv) 365243a2e63SVlad Yasevich return; 366243a2e63SVlad Yasevich 367243a2e63SVlad Yasevich __vlan_flush(pv); 368243a2e63SVlad Yasevich } 369243a2e63SVlad Yasevich 3702b292fb4SToshiaki Makita bool br_vlan_find(struct net_bridge *br, u16 vid) 3712b292fb4SToshiaki Makita { 3722b292fb4SToshiaki Makita struct net_port_vlans *pv; 3732b292fb4SToshiaki Makita bool found = false; 3742b292fb4SToshiaki Makita 3752b292fb4SToshiaki Makita rcu_read_lock(); 3762b292fb4SToshiaki Makita pv = rcu_dereference(br->vlan_info); 3772b292fb4SToshiaki Makita 3782b292fb4SToshiaki Makita if (!pv) 3792b292fb4SToshiaki Makita goto out; 3802b292fb4SToshiaki Makita 3812b292fb4SToshiaki Makita if (test_bit(vid, pv->vlan_bitmap)) 3822b292fb4SToshiaki Makita found = true; 3832b292fb4SToshiaki Makita 3842b292fb4SToshiaki Makita out: 3852b292fb4SToshiaki Makita rcu_read_unlock(); 3862b292fb4SToshiaki Makita return found; 3872b292fb4SToshiaki Makita } 3882b292fb4SToshiaki Makita 389204177f3SToshiaki Makita /* Must be protected by RTNL. */ 390204177f3SToshiaki Makita static void recalculate_group_addr(struct net_bridge *br) 391204177f3SToshiaki Makita { 392204177f3SToshiaki Makita if (br->group_addr_set) 393204177f3SToshiaki Makita return; 394204177f3SToshiaki Makita 395204177f3SToshiaki Makita spin_lock_bh(&br->lock); 396204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) { 397204177f3SToshiaki Makita /* Bridge Group Address */ 398204177f3SToshiaki Makita br->group_addr[5] = 0x00; 399204177f3SToshiaki Makita } else { /* vlan_enabled && ETH_P_8021AD */ 400204177f3SToshiaki Makita /* Provider Bridge Group Address */ 401204177f3SToshiaki Makita br->group_addr[5] = 0x08; 402204177f3SToshiaki Makita } 403204177f3SToshiaki Makita spin_unlock_bh(&br->lock); 404204177f3SToshiaki Makita } 405204177f3SToshiaki Makita 406204177f3SToshiaki Makita /* Must be protected by RTNL. */ 407204177f3SToshiaki Makita void br_recalculate_fwd_mask(struct net_bridge *br) 408204177f3SToshiaki Makita { 409204177f3SToshiaki Makita if (!br->vlan_enabled || br->vlan_proto == htons(ETH_P_8021Q)) 410204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT; 411204177f3SToshiaki Makita else /* vlan_enabled && ETH_P_8021AD */ 412204177f3SToshiaki Makita br->group_fwd_mask_required = BR_GROUPFWD_8021AD & 413204177f3SToshiaki Makita ~(1u << br->group_addr[5]); 414204177f3SToshiaki Makita } 415204177f3SToshiaki Makita 416243a2e63SVlad Yasevich int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) 417243a2e63SVlad Yasevich { 418243a2e63SVlad Yasevich if (!rtnl_trylock()) 419243a2e63SVlad Yasevich return restart_syscall(); 420243a2e63SVlad Yasevich 421243a2e63SVlad Yasevich if (br->vlan_enabled == val) 422243a2e63SVlad Yasevich goto unlock; 423243a2e63SVlad Yasevich 424243a2e63SVlad Yasevich br->vlan_enabled = val; 4252796d0c6SVlad Yasevich br_manage_promisc(br); 426204177f3SToshiaki Makita recalculate_group_addr(br); 427204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 428243a2e63SVlad Yasevich 429243a2e63SVlad Yasevich unlock: 430243a2e63SVlad Yasevich rtnl_unlock(); 431243a2e63SVlad Yasevich return 0; 432243a2e63SVlad Yasevich } 433243a2e63SVlad Yasevich 434204177f3SToshiaki Makita int br_vlan_set_proto(struct net_bridge *br, unsigned long val) 435204177f3SToshiaki Makita { 436204177f3SToshiaki Makita int err = 0; 437204177f3SToshiaki Makita struct net_bridge_port *p; 438204177f3SToshiaki Makita struct net_port_vlans *pv; 439204177f3SToshiaki Makita __be16 proto, oldproto; 440204177f3SToshiaki Makita u16 vid, errvid; 441204177f3SToshiaki Makita 442204177f3SToshiaki Makita if (val != ETH_P_8021Q && val != ETH_P_8021AD) 443204177f3SToshiaki Makita return -EPROTONOSUPPORT; 444204177f3SToshiaki Makita 445204177f3SToshiaki Makita if (!rtnl_trylock()) 446204177f3SToshiaki Makita return restart_syscall(); 447204177f3SToshiaki Makita 448204177f3SToshiaki Makita proto = htons(val); 449204177f3SToshiaki Makita if (br->vlan_proto == proto) 450204177f3SToshiaki Makita goto unlock; 451204177f3SToshiaki Makita 452204177f3SToshiaki Makita /* Add VLANs for the new proto to the device filter. */ 453204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 454204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 455204177f3SToshiaki Makita if (!pv) 456204177f3SToshiaki Makita continue; 457204177f3SToshiaki Makita 458204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { 459204177f3SToshiaki Makita err = vlan_vid_add(p->dev, proto, vid); 460204177f3SToshiaki Makita if (err) 461204177f3SToshiaki Makita goto err_filt; 462204177f3SToshiaki Makita } 463204177f3SToshiaki Makita } 464204177f3SToshiaki Makita 465204177f3SToshiaki Makita oldproto = br->vlan_proto; 466204177f3SToshiaki Makita br->vlan_proto = proto; 467204177f3SToshiaki Makita 468204177f3SToshiaki Makita recalculate_group_addr(br); 469204177f3SToshiaki Makita br_recalculate_fwd_mask(br); 470204177f3SToshiaki Makita 471204177f3SToshiaki Makita /* Delete VLANs for the old proto from the device filter. */ 472204177f3SToshiaki Makita list_for_each_entry(p, &br->port_list, list) { 473204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 474204177f3SToshiaki Makita if (!pv) 475204177f3SToshiaki Makita continue; 476204177f3SToshiaki Makita 477204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 478204177f3SToshiaki Makita vlan_vid_del(p->dev, oldproto, vid); 479204177f3SToshiaki Makita } 480204177f3SToshiaki Makita 481204177f3SToshiaki Makita unlock: 482204177f3SToshiaki Makita rtnl_unlock(); 483204177f3SToshiaki Makita return err; 484204177f3SToshiaki Makita 485204177f3SToshiaki Makita err_filt: 486204177f3SToshiaki Makita errvid = vid; 487204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, errvid) 488204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 489204177f3SToshiaki Makita 490204177f3SToshiaki Makita list_for_each_entry_continue_reverse(p, &br->port_list, list) { 491204177f3SToshiaki Makita pv = rtnl_dereference(p->vlan_info); 492204177f3SToshiaki Makita if (!pv) 493204177f3SToshiaki Makita continue; 494204177f3SToshiaki Makita 495204177f3SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 496204177f3SToshiaki Makita vlan_vid_del(p->dev, proto, vid); 497204177f3SToshiaki Makita } 498204177f3SToshiaki Makita 499204177f3SToshiaki Makita goto unlock; 500204177f3SToshiaki Makita } 501204177f3SToshiaki Makita 5025be5a2dfSVlad Yasevich static bool vlan_default_pvid(struct net_port_vlans *pv, u16 vid) 5035be5a2dfSVlad Yasevich { 5045be5a2dfSVlad Yasevich return pv && vid == pv->pvid && test_bit(vid, pv->untagged_bitmap); 5055be5a2dfSVlad Yasevich } 5065be5a2dfSVlad Yasevich 5075be5a2dfSVlad Yasevich static void br_vlan_disable_default_pvid(struct net_bridge *br) 5085be5a2dfSVlad Yasevich { 5095be5a2dfSVlad Yasevich struct net_bridge_port *p; 5105be5a2dfSVlad Yasevich u16 pvid = br->default_pvid; 5115be5a2dfSVlad Yasevich 5125be5a2dfSVlad Yasevich /* Disable default_pvid on all ports where it is still 5135be5a2dfSVlad Yasevich * configured. 5145be5a2dfSVlad Yasevich */ 5155be5a2dfSVlad Yasevich if (vlan_default_pvid(br_get_vlan_info(br), pvid)) 5165be5a2dfSVlad Yasevich br_vlan_delete(br, pvid); 5175be5a2dfSVlad Yasevich 5185be5a2dfSVlad Yasevich list_for_each_entry(p, &br->port_list, list) { 5195be5a2dfSVlad Yasevich if (vlan_default_pvid(nbp_get_vlan_info(p), pvid)) 5205be5a2dfSVlad Yasevich nbp_vlan_delete(p, pvid); 5215be5a2dfSVlad Yasevich } 5225be5a2dfSVlad Yasevich 5235be5a2dfSVlad Yasevich br->default_pvid = 0; 5245be5a2dfSVlad Yasevich } 5255be5a2dfSVlad Yasevich 5265be5a2dfSVlad Yasevich static int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid) 5275be5a2dfSVlad Yasevich { 5285be5a2dfSVlad Yasevich struct net_bridge_port *p; 5295be5a2dfSVlad Yasevich u16 old_pvid; 5305be5a2dfSVlad Yasevich int err = 0; 5315be5a2dfSVlad Yasevich unsigned long *changed; 5325be5a2dfSVlad Yasevich 5335be5a2dfSVlad Yasevich changed = kcalloc(BITS_TO_LONGS(BR_MAX_PORTS), sizeof(unsigned long), 5345be5a2dfSVlad Yasevich GFP_KERNEL); 5355be5a2dfSVlad Yasevich if (!changed) 5365be5a2dfSVlad Yasevich return -ENOMEM; 5375be5a2dfSVlad Yasevich 5385be5a2dfSVlad Yasevich old_pvid = br->default_pvid; 5395be5a2dfSVlad Yasevich 5405be5a2dfSVlad Yasevich /* Update default_pvid config only if we do not conflict with 5415be5a2dfSVlad Yasevich * user configuration. 5425be5a2dfSVlad Yasevich */ 5435be5a2dfSVlad Yasevich if ((!old_pvid || vlan_default_pvid(br_get_vlan_info(br), old_pvid)) && 5445be5a2dfSVlad Yasevich !br_vlan_find(br, pvid)) { 5455be5a2dfSVlad Yasevich err = br_vlan_add(br, pvid, 5465be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 5475be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 5485be5a2dfSVlad Yasevich if (err) 5495be5a2dfSVlad Yasevich goto out; 5505be5a2dfSVlad Yasevich br_vlan_delete(br, old_pvid); 5515be5a2dfSVlad Yasevich set_bit(0, changed); 5525be5a2dfSVlad Yasevich } 5535be5a2dfSVlad Yasevich 5545be5a2dfSVlad Yasevich list_for_each_entry(p, &br->port_list, list) { 5555be5a2dfSVlad Yasevich /* Update default_pvid config only if we do not conflict with 5565be5a2dfSVlad Yasevich * user configuration. 5575be5a2dfSVlad Yasevich */ 5585be5a2dfSVlad Yasevich if ((old_pvid && 5595be5a2dfSVlad Yasevich !vlan_default_pvid(nbp_get_vlan_info(p), old_pvid)) || 5605be5a2dfSVlad Yasevich nbp_vlan_find(p, pvid)) 5615be5a2dfSVlad Yasevich continue; 5625be5a2dfSVlad Yasevich 5635be5a2dfSVlad Yasevich err = nbp_vlan_add(p, pvid, 5645be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 5655be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 5665be5a2dfSVlad Yasevich if (err) 5675be5a2dfSVlad Yasevich goto err_port; 5685be5a2dfSVlad Yasevich nbp_vlan_delete(p, old_pvid); 5695be5a2dfSVlad Yasevich set_bit(p->port_no, changed); 5705be5a2dfSVlad Yasevich } 5715be5a2dfSVlad Yasevich 5725be5a2dfSVlad Yasevich br->default_pvid = pvid; 5735be5a2dfSVlad Yasevich 5745be5a2dfSVlad Yasevich out: 5755be5a2dfSVlad Yasevich kfree(changed); 5765be5a2dfSVlad Yasevich return err; 5775be5a2dfSVlad Yasevich 5785be5a2dfSVlad Yasevich err_port: 5795be5a2dfSVlad Yasevich list_for_each_entry_continue_reverse(p, &br->port_list, list) { 5805be5a2dfSVlad Yasevich if (!test_bit(p->port_no, changed)) 5815be5a2dfSVlad Yasevich continue; 5825be5a2dfSVlad Yasevich 5835be5a2dfSVlad Yasevich if (old_pvid) 5845be5a2dfSVlad Yasevich nbp_vlan_add(p, old_pvid, 5855be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 5865be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 5875be5a2dfSVlad Yasevich nbp_vlan_delete(p, pvid); 5885be5a2dfSVlad Yasevich } 5895be5a2dfSVlad Yasevich 5905be5a2dfSVlad Yasevich if (test_bit(0, changed)) { 5915be5a2dfSVlad Yasevich if (old_pvid) 5925be5a2dfSVlad Yasevich br_vlan_add(br, old_pvid, 5935be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 5945be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED); 5955be5a2dfSVlad Yasevich br_vlan_delete(br, pvid); 5965be5a2dfSVlad Yasevich } 5975be5a2dfSVlad Yasevich goto out; 5985be5a2dfSVlad Yasevich } 5995be5a2dfSVlad Yasevich 60096a20d9dSVlad Yasevich int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val) 60196a20d9dSVlad Yasevich { 60296a20d9dSVlad Yasevich u16 pvid = val; 60396a20d9dSVlad Yasevich int err = 0; 60496a20d9dSVlad Yasevich 6055be5a2dfSVlad Yasevich if (val >= VLAN_VID_MASK) 60696a20d9dSVlad Yasevich return -EINVAL; 60796a20d9dSVlad Yasevich 60896a20d9dSVlad Yasevich if (!rtnl_trylock()) 60996a20d9dSVlad Yasevich return restart_syscall(); 61096a20d9dSVlad Yasevich 61196a20d9dSVlad Yasevich if (pvid == br->default_pvid) 61296a20d9dSVlad Yasevich goto unlock; 61396a20d9dSVlad Yasevich 61496a20d9dSVlad Yasevich /* Only allow default pvid change when filtering is disabled */ 61596a20d9dSVlad Yasevich if (br->vlan_enabled) { 61696a20d9dSVlad Yasevich pr_info_once("Please disable vlan filtering to change default_pvid\n"); 61796a20d9dSVlad Yasevich err = -EPERM; 61896a20d9dSVlad Yasevich goto unlock; 61996a20d9dSVlad Yasevich } 62096a20d9dSVlad Yasevich 6215be5a2dfSVlad Yasevich if (!pvid) 6225be5a2dfSVlad Yasevich br_vlan_disable_default_pvid(br); 6235be5a2dfSVlad Yasevich else 6245be5a2dfSVlad Yasevich err = __br_vlan_set_default_pvid(br, pvid); 62596a20d9dSVlad Yasevich 62696a20d9dSVlad Yasevich unlock: 62796a20d9dSVlad Yasevich rtnl_unlock(); 62896a20d9dSVlad Yasevich return err; 62996a20d9dSVlad Yasevich } 63096a20d9dSVlad Yasevich 6315be5a2dfSVlad Yasevich int br_vlan_init(struct net_bridge *br) 6328580e211SToshiaki Makita { 6338580e211SToshiaki Makita br->vlan_proto = htons(ETH_P_8021Q); 63496a20d9dSVlad Yasevich br->default_pvid = 1; 6355be5a2dfSVlad Yasevich return br_vlan_add(br, 1, 6365be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED); 6378580e211SToshiaki Makita } 6388580e211SToshiaki Makita 6398adff41cSToshiaki Makita /* Must be protected by RTNL. 6408adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 6418adff41cSToshiaki Makita */ 642552406c4SVlad Yasevich int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) 643243a2e63SVlad Yasevich { 644243a2e63SVlad Yasevich struct net_port_vlans *pv = NULL; 645243a2e63SVlad Yasevich int err; 646243a2e63SVlad Yasevich 647243a2e63SVlad Yasevich ASSERT_RTNL(); 648243a2e63SVlad Yasevich 649243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 650243a2e63SVlad Yasevich if (pv) 651552406c4SVlad Yasevich return __vlan_add(pv, vid, flags); 652243a2e63SVlad Yasevich 653243a2e63SVlad Yasevich /* Create port vlan infomration 654243a2e63SVlad Yasevich */ 655243a2e63SVlad Yasevich pv = kzalloc(sizeof(*pv), GFP_KERNEL); 656243a2e63SVlad Yasevich if (!pv) { 657243a2e63SVlad Yasevich err = -ENOMEM; 658243a2e63SVlad Yasevich goto clean_up; 659243a2e63SVlad Yasevich } 660243a2e63SVlad Yasevich 661243a2e63SVlad Yasevich pv->port_idx = port->port_no; 662243a2e63SVlad Yasevich pv->parent.port = port; 663552406c4SVlad Yasevich err = __vlan_add(pv, vid, flags); 664243a2e63SVlad Yasevich if (err) 665243a2e63SVlad Yasevich goto clean_up; 666243a2e63SVlad Yasevich 667243a2e63SVlad Yasevich rcu_assign_pointer(port->vlan_info, pv); 668243a2e63SVlad Yasevich return 0; 669243a2e63SVlad Yasevich 670243a2e63SVlad Yasevich clean_up: 671243a2e63SVlad Yasevich kfree(pv); 672243a2e63SVlad Yasevich return err; 673243a2e63SVlad Yasevich } 674243a2e63SVlad Yasevich 6758adff41cSToshiaki Makita /* Must be protected by RTNL. 6768adff41cSToshiaki Makita * Must be called with vid in range from 1 to 4094 inclusive. 6778adff41cSToshiaki Makita */ 678243a2e63SVlad Yasevich int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) 679243a2e63SVlad Yasevich { 680243a2e63SVlad Yasevich struct net_port_vlans *pv; 681243a2e63SVlad Yasevich 682243a2e63SVlad Yasevich ASSERT_RTNL(); 683243a2e63SVlad Yasevich 684243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 685243a2e63SVlad Yasevich if (!pv) 686243a2e63SVlad Yasevich return -EINVAL; 687243a2e63SVlad Yasevich 688424bb9c9SToshiaki Makita br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid); 689bc9a25d2SVlad Yasevich 690243a2e63SVlad Yasevich return __vlan_del(pv, vid); 691243a2e63SVlad Yasevich } 692243a2e63SVlad Yasevich 693243a2e63SVlad Yasevich void nbp_vlan_flush(struct net_bridge_port *port) 694243a2e63SVlad Yasevich { 695243a2e63SVlad Yasevich struct net_port_vlans *pv; 696dbbaf949SToshiaki Makita u16 vid; 697243a2e63SVlad Yasevich 698243a2e63SVlad Yasevich ASSERT_RTNL(); 699243a2e63SVlad Yasevich 700243a2e63SVlad Yasevich pv = rtnl_dereference(port->vlan_info); 701243a2e63SVlad Yasevich if (!pv) 702243a2e63SVlad Yasevich return; 703243a2e63SVlad Yasevich 704dbbaf949SToshiaki Makita for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) 7058580e211SToshiaki Makita vlan_vid_del(port->dev, port->br->vlan_proto, vid); 706dbbaf949SToshiaki Makita 707243a2e63SVlad Yasevich __vlan_flush(pv); 708243a2e63SVlad Yasevich } 709bc9a25d2SVlad Yasevich 710bc9a25d2SVlad Yasevich bool nbp_vlan_find(struct net_bridge_port *port, u16 vid) 711bc9a25d2SVlad Yasevich { 712bc9a25d2SVlad Yasevich struct net_port_vlans *pv; 713bc9a25d2SVlad Yasevich bool found = false; 714bc9a25d2SVlad Yasevich 715bc9a25d2SVlad Yasevich rcu_read_lock(); 716bc9a25d2SVlad Yasevich pv = rcu_dereference(port->vlan_info); 717bc9a25d2SVlad Yasevich 718bc9a25d2SVlad Yasevich if (!pv) 719bc9a25d2SVlad Yasevich goto out; 720bc9a25d2SVlad Yasevich 721bc9a25d2SVlad Yasevich if (test_bit(vid, pv->vlan_bitmap)) 722bc9a25d2SVlad Yasevich found = true; 723bc9a25d2SVlad Yasevich 724bc9a25d2SVlad Yasevich out: 725bc9a25d2SVlad Yasevich rcu_read_unlock(); 726bc9a25d2SVlad Yasevich return found; 727bc9a25d2SVlad Yasevich } 7285be5a2dfSVlad Yasevich 7295be5a2dfSVlad Yasevich int nbp_vlan_init(struct net_bridge_port *p) 7305be5a2dfSVlad Yasevich { 7315be5a2dfSVlad Yasevich return p->br->default_pvid ? 7325be5a2dfSVlad Yasevich nbp_vlan_add(p, p->br->default_pvid, 7335be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_PVID | 7345be5a2dfSVlad Yasevich BRIDGE_VLAN_INFO_UNTAGGED) : 7355be5a2dfSVlad Yasevich 0; 7365be5a2dfSVlad Yasevich } 737