Hi: This patch moves the hardware headers when we decapsulate tunnel packets. The packet socket interface assumes that the hardware headers are right next to the network headers. This patch allows tcpdump to (incoming) show tunnel packets correctly. Cheers, -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Index: kernel-source-2.5/net/ipv4/xfrm4_input.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/ipv4/xfrm4_input.c,v retrieving revision 1.5 diff -u -r1.5 xfrm4_input.c --- kernel-source-2.5/net/ipv4/xfrm4_input.c 9 Aug 2003 03:42:54 -0000 1.5 +++ kernel-source-2.5/net/ipv4/xfrm4_input.c 17 Aug 2003 04:58:12 -0000 @@ -9,6 +9,8 @@ * */ +#include <linux/netdevice.h> +#include <linux/string.h> #include <net/inet_ecn.h> #include <net/ip.h> #include <net/xfrm.h> @@ -126,6 +128,11 @@ skb->sp->len += xfrm_nr; if (decaps) { + if (skb->dev->hard_header) { + int len = skb->dev->hard_header_len; + skb->mac.raw = + memmove(skb->data - len, skb->mac.raw, len); + } if (!(skb->dev->flags&IFF_LOOPBACK)) { dst_release(skb->dst); skb->dst = NULL; Index: kernel-source-2.5/net/ipv6/xfrm6_input.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/ipv6/xfrm6_input.c,v retrieving revision 1.4 diff -u -r1.4 xfrm6_input.c --- kernel-source-2.5/net/ipv6/xfrm6_input.c 29 Jul 2003 11:11:34 -0000 1.4 +++ kernel-source-2.5/net/ipv6/xfrm6_input.c 17 Aug 2003 04:58:19 -0000 @@ -9,6 +9,8 @@ * IPv6 support */ +#include <linux/netdevice.h> +#include <linux/string.h> #include <net/inet_ecn.h> #include <net/ip.h> #include <net/ipv6.h> @@ -108,6 +110,11 @@ skb->ip_summed = CHECKSUM_NONE; if (decaps) { + if (skb->dev->hard_header) { + int len = skb->dev->hard_header_len; + skb->mac.raw = + memmove(skb->data - len, skb->mac.raw, len); + } if (!(skb->dev->flags&IFF_LOOPBACK)) { dst_release(skb->dst); skb->dst = NULL;