Skip to content

Commit

Permalink
[SK_BUFF]: Some more layer header conversions
Browse files Browse the repository at this point in the history
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
acmel authored and David S. Miller committed Apr 26, 2007
1 parent 0a6114d commit ddc7b8e
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 17 deletions.
30 changes: 18 additions & 12 deletions net/core/pktgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -2357,8 +2357,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;
Expand Down Expand Up @@ -2387,12 +2391,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);
Expand Down Expand Up @@ -2693,8 +2696,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;
Expand Down Expand Up @@ -2731,13 +2738,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);
Expand Down
2 changes: 1 addition & 1 deletion net/core/skbuff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1905,7 +1905,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);

Expand Down
3 changes: 2 additions & 1 deletion net/ipv4/ipmr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion net/ipv6/xfrm6_mode_beet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion net/ipv6/xfrm6_mode_ro.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion net/ipv6/xfrm6_mode_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit ddc7b8e

Please sign in to comment.