Merge remote-tracking branch 'gnss/gnss-next'
[linux] / net / openvswitch / actions.c
index 85ae53d..e47ebbb 100644 (file)
@@ -301,7 +301,7 @@ static int push_vlan(struct sk_buff *skb, struct sw_flow_key *key,
                key->eth.vlan.tpid = vlan->vlan_tpid;
        }
        return skb_vlan_push(skb, vlan->vlan_tpid,
-                            ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT);
+                            ntohs(vlan->vlan_tci) & ~VLAN_CFI_MASK);
 }
 
 /* 'src' is already properly masked. */
@@ -822,8 +822,10 @@ static int ovs_vport_output(struct net *net, struct sock *sk, struct sk_buff *sk
        __skb_dst_copy(skb, data->dst);
        *OVS_CB(skb) = data->cb;
        skb->inner_protocol = data->inner_protocol;
-       skb->vlan_tci = data->vlan_tci;
-       skb->vlan_proto = data->vlan_proto;
+       if (data->vlan_tci & VLAN_CFI_MASK)
+               __vlan_hwaccel_put_tag(skb, data->vlan_proto, data->vlan_tci & ~VLAN_CFI_MASK);
+       else
+               __vlan_hwaccel_clear_tag(skb);
 
        /* Reconstruct the MAC header.  */
        skb_push(skb, data->l2_len);
@@ -867,7 +869,10 @@ static void prepare_frag(struct vport *vport, struct sk_buff *skb,
        data->cb = *OVS_CB(skb);
        data->inner_protocol = skb->inner_protocol;
        data->network_offset = orig_network_offset;
-       data->vlan_tci = skb->vlan_tci;
+       if (skb_vlan_tag_present(skb))
+               data->vlan_tci = skb_vlan_tag_get(skb) | VLAN_CFI_MASK;
+       else
+               data->vlan_tci = 0;
        data->vlan_proto = skb->vlan_proto;
        data->mac_proto = mac_proto;
        data->l2_len = hlen;