vlan: Fix out of order vlan headers with reorder header off
authorToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Tue, 13 Mar 2018 05:51:28 +0000 (14:51 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:16 +0000 (07:52 +0200)
commit99ba9a9728707888b113f00ac8eee4faa6d60431
tree260f5cd502cfcb4cc0669db436b1836d5c678689
parent01a68a265ef506e95058c3cd0a8d9e4264eb9233
vlan: Fix out of order vlan headers with reorder header off

[ Upstream commit cbe7128c4b92e2004984f477fd38dfa81662f02e ]

With reorder header off, received packets are untagged in skb_vlan_untag()
called from within __netif_receive_skb_core(), and later the tag will be
inserted back in vlan_do_receive().

This caused out of order vlan headers when we create a vlan device on top
of another vlan device, because vlan_do_receive() inserts a tag as the
outermost vlan tag. E.g. the outer tag is first removed in skb_vlan_untag()
and inserted back in vlan_do_receive(), then the inner tag is next removed
and inserted back as the outermost tag.

This patch fixes the behaviour by inserting the inner tag at the right
position.

Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/if_vlan.h
net/8021q/vlan_core.c