]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bridge: use __vlan_hwaccel helpers
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Thu, 8 Nov 2018 23:18:03 +0000 (00:18 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Nov 2018 04:45:04 +0000 (20:45 -0800)
This removes assumption than vlan_tci != 0 when tag is present.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_netfilter_hooks.c
net/bridge/br_private.h
net/bridge/br_vlan.c

index b1b5e8516724ae442e2a107762dc382f9d1587e0..c9383c470a838d5b8a39ef2abc4d071eb3a6f227 100644 (file)
@@ -671,10 +671,8 @@ static int br_nf_push_frag_xmit(struct net *net, struct sock *sk, struct sk_buff
                return 0;
        }
 
-       if (data->vlan_tci) {
-               skb->vlan_tci = data->vlan_tci;
-               skb->vlan_proto = data->vlan_proto;
-       }
+       if (data->vlan_proto)
+               __vlan_hwaccel_put_tag(skb, data->vlan_proto, data->vlan_tci);
 
        skb_copy_to_linear_data_offset(skb, -data->size, data->mac, data->size);
        __skb_push(skb, data->encap_size);
@@ -740,8 +738,13 @@ static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff
 
                data = this_cpu_ptr(&brnf_frag_data_storage);
 
-               data->vlan_tci = skb->vlan_tci;
-               data->vlan_proto = skb->vlan_proto;
+               if (skb_vlan_tag_present(skb)) {
+                       data->vlan_tci = skb->vlan_tci;
+                       data->vlan_proto = skb->vlan_proto;
+               } else {
+                       data->vlan_proto = 0;
+               }
+
                data->encap_size = nf_bridge_encap_header_len(skb);
                data->size = ETH_HLEN + data->encap_size;
 
index 2920e06a540329ffb8f1286c65bc5acc6f53afad..67105c66584a7e1e5c65e353b975a86cc0763b5f 100644 (file)
@@ -905,7 +905,7 @@ static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid)
        int err = 0;
 
        if (skb_vlan_tag_present(skb)) {
-               *vid = skb_vlan_tag_get(skb) & VLAN_VID_MASK;
+               *vid = skb_vlan_tag_get_id(skb);
        } else {
                *vid = 0;
                err = -EINVAL;
index 8c9297a019475fe68ee110a85cda1647deaf9075..a7e869da21bfdd67fb8c8258f654553638422b1f 100644 (file)
@@ -420,7 +420,7 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
        }
 
        if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED)
-               skb->vlan_tci = 0;
+               __vlan_hwaccel_clear_tag(skb);
 
        if (p && (p->flags & BR_VLAN_TUNNEL) &&
            br_handle_egress_vlan_tunnel(skb, v)) {
@@ -493,8 +493,8 @@ static bool __allowed_ingress(const struct net_bridge *br,
                        __vlan_hwaccel_put_tag(skb, br->vlan_proto, pvid);
                else
                        /* Priority-tagged Frame.
-                        * At this point, We know that skb->vlan_tci had
-                        * VLAN_TAG_PRESENT bit and its VID field was 0x000.
+                        * At this point, we know that skb->vlan_tci VID
+                        * field was 0.
                         * We update only VID field and preserve PCP field.
                         */
                        skb->vlan_tci |= pvid;