diff options
author | Vlad Yasevich <vyasevic@redhat.com> | 2014-03-27 17:26:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-03-28 17:10:36 -0400 |
commit | 53d6471cef17262d3ad1c7ce8982a234244f68ec (patch) | |
tree | b7adb468b9fb7b500a96222742a3752545ff47b6 /net/core/skbuff.c | |
parent | 898602a049504dea256e696ee3152dc0b788a393 (diff) | |
download | linux-stable-53d6471cef17262d3ad1c7ce8982a234244f68ec.tar.gz linux-stable-53d6471cef17262d3ad1c7ce8982a234244f68ec.tar.bz2 linux-stable-53d6471cef17262d3ad1c7ce8982a234244f68ec.zip |
net: Account for all vlan headers in skb_mac_gso_segment
skb_network_protocol() already accounts for multiple vlan
headers that may be present in the skb. However, skb_mac_gso_segment()
doesn't know anything about it and assumes that skb->mac_len
is set correctly to skip all mac headers. That may not
always be the case. If we are simply forwarding the packet (via
bridge or macvtap), all vlan headers may not be accounted for.
A simple solution is to allow skb_network_protocol to return
the vlan depth it has calculated. This way skb_mac_gso_segment
will correctly skip all mac headers.
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/skbuff.c')
-rw-r--r-- | net/core/skbuff.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 97e5a2c3d947..90b96a11b974 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2879,8 +2879,9 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb, int err = -ENOMEM; int i = 0; int pos; + int dummy; - proto = skb_network_protocol(head_skb); + proto = skb_network_protocol(head_skb, &dummy); if (unlikely(!proto)) return ERR_PTR(-EINVAL); |