[IPSEC] Move hardware headers for decaped packets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux