diff options
| author | Jiri Benc <jbenc@redhat.com> | 2016-05-11 09:53:57 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-05-11 15:16:32 -0400 |
| commit | e271c7b4420ddbb9fae82a2b31a5ab3edafcf4fe (patch) | |
| tree | 8c92fd7336a3bbec4d987dab1c67bfb347f56f9d | |
| parent | 16ec3d4fbb967bd0e1c8d9dce9ef70e915a86615 (diff) | |
gre: do not keep the GRE header around in collect medata mode
For ipgre interface in collect metadata mode, it doesn't make sense for the
interface to be of ARPHRD_IPGRE type. The outer header of received packets
is not needed, as all the information from it is present in metadata_dst. We
already don't set ipgre_header_ops for collect metadata interfaces, which is
the only consumer of mac_header pointing to the outer IP header.
Just set the interface type to ARPHRD_NONE in collect metadata mode for
ipgre (not gretap, that still correctly stays ARPHRD_ETHER) and reset
mac_header.
Fixes: a64b04d86d14 ("gre: do not assign header_ops in collect metadata mode")
Fixes: 2e15ea390e6f4 ("ip_gre: Add support to collect tunnel metadata.")
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/ipv4/ip_gre.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 205a2b8a5a84..4cc84212cce1 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -398,7 +398,10 @@ static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi) | |||
| 398 | iph->saddr, iph->daddr, tpi->key); | 398 | iph->saddr, iph->daddr, tpi->key); |
| 399 | 399 | ||
| 400 | if (tunnel) { | 400 | if (tunnel) { |
| 401 | skb_pop_mac_header(skb); | 401 | if (tunnel->dev->type != ARPHRD_NONE) |
| 402 | skb_pop_mac_header(skb); | ||
| 403 | else | ||
| 404 | skb_reset_mac_header(skb); | ||
| 402 | if (tunnel->collect_md) { | 405 | if (tunnel->collect_md) { |
| 403 | __be16 flags; | 406 | __be16 flags; |
| 404 | __be64 tun_id; | 407 | __be64 tun_id; |
| @@ -1031,6 +1034,8 @@ static void ipgre_netlink_parms(struct net_device *dev, | |||
| 1031 | struct ip_tunnel *t = netdev_priv(dev); | 1034 | struct ip_tunnel *t = netdev_priv(dev); |
| 1032 | 1035 | ||
| 1033 | t->collect_md = true; | 1036 | t->collect_md = true; |
| 1037 | if (dev->type == ARPHRD_IPGRE) | ||
| 1038 | dev->type = ARPHRD_NONE; | ||
| 1034 | } | 1039 | } |
| 1035 | } | 1040 | } |
| 1036 | 1041 | ||
