From 3f19d399f51def640101001f28387baade399621 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 30 Mar 2011 14:54:26 -0700 Subject: [PATCH] datapath: Fix mysterious GRE-over-IPSEC problems. We've noticed that packets that go up to userspace and then back down to the kernel and then enter an GRE tunnel that is then ESP encapsulated by IPSEC end up with a bad ESP "next header" value: it ends up as zero instead of 0x2f (IPPROTO_GRE). Just putting packets from userspace into a freshly allocated skb fixes the problem. The underlying problem that this works around is still unknown. Signed-off-by: Ben Pfaff Acked-by: Jesse Gross Bug #4769. --- datapath/datapath.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index e8ff4a5aa..5ce77cd34 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -682,6 +682,7 @@ static int odp_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) struct datapath *dp; struct ethhdr *eth; bool is_frag; + int len; int err; err = -EINVAL; @@ -693,12 +694,14 @@ static int odp_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) if (err) goto err; - packet = skb_clone(skb, GFP_KERNEL); + len = nla_len(a[ODP_PACKET_ATTR_PACKET]); + packet = __dev_alloc_skb(NET_IP_ALIGN + len, GFP_KERNEL); err = -ENOMEM; if (!packet) goto err; - packet->data = nla_data(a[ODP_PACKET_ATTR_PACKET]); - packet->len = nla_len(a[ODP_PACKET_ATTR_PACKET]); + skb_reserve(packet, NET_IP_ALIGN); + + memcpy(__skb_put(packet, len), nla_data(a[ODP_PACKET_ATTR_PACKET]), len); skb_reset_mac_header(packet); eth = eth_hdr(packet); -- 2.43.0