Similarly to how the core networking stack behaves, let the first vlan tag be always stored in skb->vlan_tci. This is already ensured in __netif_receive_skb_core for packets that were received from the kernel and honored by skb_vlan_push and skb_vlan_pop. The only remaining place are packets received from the user space. Just do the same things with vlan frames as __netif_receive_skb_core does.
Signed-off-by: Jiri Benc <jb...@redhat.com> --- net/openvswitch/datapath.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 4d67ea856067..c47b3da8ecf2 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -594,6 +594,16 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) else packet->protocol = htons(ETH_P_802_2); + if (eth_type_vlan(packet->protocol)) { + __skb_pull(packet, ETH_HLEN); + skb_reset_network_header(packet); + skb_reset_mac_len(packet); + packet = skb_vlan_untag(packet); + if (unlikely(!packet)) + goto err; + skb_push(packet, ETH_HLEN); + } + /* Set packet's mru */ if (a[OVS_PACKET_ATTR_MRU]) { mru = nla_get_u16(a[OVS_PACKET_ATTR_MRU]); -- 1.8.3.1