diff options
| author | Yuya Kusakabe <yuya.kusakabe@gmail.com> | 2019-04-15 21:22:28 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-04-17 00:29:38 -0400 |
| commit | d85e8be2a5a02869f815dd0ac2d743deb4cd7957 (patch) | |
| tree | 00badaa5ac62ee6c27c7f5757bfb5b41d760f037 | |
| parent | 899537b73557aafbdd11050b501cf54b4f5c45af (diff) | |
net: Fix missing meta data in skb with vlan packet
skb_reorder_vlan_header() should move XDP meta data with ethernet header
if XDP meta data exists.
Fixes: de8f3a83b0a0 ("bpf: add meta pointer for direct access")
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
Signed-off-by: Takeru Hayasaka <taketarou2@gmail.com>
Co-developed-by: Takeru Hayasaka <taketarou2@gmail.com>
Reviewed-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/core/skbuff.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index ef2cd5712098..40796b8bf820 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -5083,7 +5083,8 @@ EXPORT_SYMBOL_GPL(skb_gso_validate_mac_len); | |||
| 5083 | 5083 | ||
| 5084 | static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb) | 5084 | static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb) |
| 5085 | { | 5085 | { |
| 5086 | int mac_len; | 5086 | int mac_len, meta_len; |
| 5087 | void *meta; | ||
| 5087 | 5088 | ||
| 5088 | if (skb_cow(skb, skb_headroom(skb)) < 0) { | 5089 | if (skb_cow(skb, skb_headroom(skb)) < 0) { |
| 5089 | kfree_skb(skb); | 5090 | kfree_skb(skb); |
| @@ -5095,6 +5096,13 @@ static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb) | |||
| 5095 | memmove(skb_mac_header(skb) + VLAN_HLEN, skb_mac_header(skb), | 5096 | memmove(skb_mac_header(skb) + VLAN_HLEN, skb_mac_header(skb), |
| 5096 | mac_len - VLAN_HLEN - ETH_TLEN); | 5097 | mac_len - VLAN_HLEN - ETH_TLEN); |
| 5097 | } | 5098 | } |
| 5099 | |||
| 5100 | meta_len = skb_metadata_len(skb); | ||
| 5101 | if (meta_len) { | ||
| 5102 | meta = skb_metadata_end(skb) - meta_len; | ||
| 5103 | memmove(meta + VLAN_HLEN, meta, meta_len); | ||
| 5104 | } | ||
| 5105 | |||
| 5098 | skb->mac_header += VLAN_HLEN; | 5106 | skb->mac_header += VLAN_HLEN; |
| 5099 | return skb; | 5107 | return skb; |
| 5100 | } | 5108 | } |
