Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
---
net/core/pktgen.c               |   30 ++++++++++++++++++------------
net/core/skbuff.c               |    2 +-
net/ipv4/ipmr.c                 |    3 ++-
net/ipv6/xfrm6_mode_beet.c      |    3 ++-
net/ipv6/xfrm6_mode_ro.c        |    3 ++-
net/ipv6/xfrm6_mode_transport.c |    3 ++-
6 files changed, 27 insertions(+), 17 deletions(-)
From bfea1060e3cb17b3633b84dfc4ae4781794bc18a Mon Sep 17 00:00:00 2001
From: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
Date: Thu, 15 Mar 2007 21:42:27 -0300
Subject: [PATCH 2/2] [SK_BUFF]: Some more layer header conversions

Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
---
 net/core/pktgen.c               |   30 ++++++++++++++++++------------
 net/core/skbuff.c               |    2 +-
 net/ipv4/ipmr.c                 |    3 ++-
 net/ipv6/xfrm6_mode_beet.c      |    3 ++-
 net/ipv6/xfrm6_mode_ro.c        |    3 ++-
 net/ipv6/xfrm6_mode_transport.c |    3 ++-
 6 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 2d49dbc..d015389 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -2356,8 +2356,12 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
 		*vlan_encapsulated_proto = htons(ETH_P_IP);
 	}
 
-	iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr));
-	udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr));
+	skb_set_network_header(skb, skb->tail - skb->data);
+	skb->h.raw = skb->nh.raw + sizeof(struct iphdr);
+	skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr));
+
+	iph = ip_hdr(skb);
+	udph = udp_hdr(skb);
 
 	memcpy(eth, pkt_dev->hh, 12);
 	*(__be16 *) & eth[12] = protocol;
@@ -2386,12 +2390,11 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
 	iph->check = 0;
 	iph->check = ip_fast_csum((void *)iph, iph->ihl);
 	skb->protocol = protocol;
-	skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32) -
-		VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev);
+	skb->mac.raw = (skb->nh.raw - ETH_HLEN -
+			pkt_dev->nr_labels * sizeof(u32) -
+			VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev));
 	skb->dev = odev;
 	skb->pkt_type = PACKET_HOST;
-	skb->nh.raw = (unsigned char *)iph;
-	skb->h.raw = (unsigned char *)udph;
 
 	if (pkt_dev->nfrags <= 0)
 		pgh = (struct pktgen_hdr *)skb_put(skb, datalen);
@@ -2692,8 +2695,12 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
 		*vlan_encapsulated_proto = htons(ETH_P_IPV6);
 	}
 
-	iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr));
-	udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr));
+	skb_set_network_header(skb, skb->tail - skb->data);
+	skb->h.raw = skb->nh.raw + sizeof(struct ipv6hdr);
+	skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr));
+
+	iph = ipv6_hdr(skb);
+	udph = udp_hdr(skb);
 
 	memcpy(eth, pkt_dev->hh, 12);
 	*(__be16 *) & eth[12] = protocol;
@@ -2730,13 +2737,12 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
 	ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr);
 	ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr);
 
-	skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32) -
-		VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev);
+	skb->mac.raw = (skb->nh.raw - ETH_HLEN -
+			pkt_dev->nr_labels * sizeof(u32) -
+			VLAN_TAG_SIZE(pkt_dev) - SVLAN_TAG_SIZE(pkt_dev));
 	skb->protocol = protocol;
 	skb->dev = odev;
 	skb->pkt_type = PACKET_HOST;
-	skb->nh.raw = (unsigned char *)iph;
-	skb->h.raw = (unsigned char *)udph;
 
 	if (pkt_dev->nfrags <= 0)
 		pgh = (struct pktgen_hdr *)skb_put(skb, datalen);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index d3e0977..100fb2f 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1959,7 +1959,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
 
 		skb_reserve(nskb, headroom);
 		skb_reset_mac_header(nskb);
-		nskb->nh.raw = nskb->data + skb->mac_len;
+		skb_set_network_header(nskb, skb->mac_len);
 		nskb->h.raw = nskb->nh.raw + (skb->h.raw - skb->nh.raw);
 		memcpy(skb_put(nskb, doffset), skb->data, doffset);
 
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 8f45c95..3578942 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -580,7 +580,8 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
 	 *	Copy the IP header
 	 */
 
-	skb->nh.raw = skb_put(skb, ihl);
+	skb_set_network_header(skb, skb->tail - skb->data);
+	skb_put(skb, ihl);
 	memcpy(skb->data,pkt->data,ihl);
 	ip_hdr(skb)->protocol = 0;			/* Flag to the kernel this is a route add */
 	msg = (struct igmpmsg *)skb_network_header(skb);
diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c
index 0cc96ec..8a01b0d 100644
--- a/net/ipv6/xfrm6_mode_beet.c
+++ b/net/ipv6/xfrm6_mode_beet.c
@@ -41,7 +41,8 @@ static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb)
 	iph = ipv6_hdr(skb);
 
 	hdr_len = ip6_find_1stfragopt(skb, &prevhdr);
-	skb->nh.raw = prevhdr - x->props.header_len;
+	skb_set_network_header(skb,
+			       (prevhdr - x->props.header_len) - skb->data);
 	skb_set_transport_header(skb, hdr_len);
 	memmove(skb->data, iph, hdr_len);
 
diff --git a/net/ipv6/xfrm6_mode_ro.c b/net/ipv6/xfrm6_mode_ro.c
index da48ecf..6ad6d7a 100644
--- a/net/ipv6/xfrm6_mode_ro.c
+++ b/net/ipv6/xfrm6_mode_ro.c
@@ -53,7 +53,8 @@ static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb)
 	iph = ipv6_hdr(skb);
 
 	hdr_len = x->type->hdr_offset(x, skb, &prevhdr);
-	skb->nh.raw = prevhdr - x->props.header_len;
+	skb_set_network_header(skb,
+			       (prevhdr - x->props.header_len) - skb->data);
 	skb_set_transport_header(skb, hdr_len);
 	memmove(skb->data, iph, hdr_len);
 	return 0;
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c
index d526f4e..eb1864b 100644
--- a/net/ipv6/xfrm6_mode_transport.c
+++ b/net/ipv6/xfrm6_mode_transport.c
@@ -35,7 +35,8 @@ static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb)
 	iph = ipv6_hdr(skb);
 
 	hdr_len = x->type->hdr_offset(x, skb, &prevhdr);
-	skb->nh.raw = prevhdr - x->props.header_len;
+	skb_set_network_header(skb,
+			       (prevhdr - x->props.header_len) - skb->data);
 	skb_set_transport_header(skb, hdr_len);
 	memmove(skb->data, iph, hdr_len);
 	return 0;
-- 
1.5.0.3

Reply via email to