diff options
author | Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> | 2018-03-13 06:51:28 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-16 15:03:47 +0100 |
commit | cbe7128c4b92e2004984f477fd38dfa81662f02e (patch) | |
tree | 7805f8eec1279109bf15a6177f286a0aacbf017c /net/8021q | |
parent | net: Fix vlan untag for bridge and vlan_dev with reorder_hdr off (diff) | |
download | linux-cbe7128c4b92e2004984f477fd38dfa81662f02e.tar.xz linux-cbe7128c4b92e2004984f477fd38dfa81662f02e.zip |
vlan: Fix out of order vlan headers with reorder header off
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>
Diffstat (limited to 'net/8021q')
-rw-r--r-- | net/8021q/vlan_core.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 64aa9f755e1d..45c9bf5ff3a0 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -48,8 +48,8 @@ bool vlan_do_receive(struct sk_buff **skbp) * original position later */ skb_push(skb, offset); - skb = *skbp = vlan_insert_tag(skb, skb->vlan_proto, - skb->vlan_tci); + skb = *skbp = vlan_insert_inner_tag(skb, skb->vlan_proto, + skb->vlan_tci, skb->mac_len); if (!skb) return false; skb_pull(skb, offset + VLAN_HLEN); |