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 b1b5e85..c9383c4 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 2920e06..67105c6 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 8c9297a..a7e869d 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;