|
@@ -2842,25 +2842,25 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
|
|
|
skb->dev = odev;
|
|
|
skb->pkt_type = PACKET_HOST;
|
|
|
|
|
|
+ pktgen_finalize_skb(pkt_dev, skb, datalen);
|
|
|
+
|
|
|
if (!(pkt_dev->flags & F_UDPCSUM)) {
|
|
|
skb->ip_summed = CHECKSUM_NONE;
|
|
|
} else if (odev->features & NETIF_F_V4_CSUM) {
|
|
|
skb->ip_summed = CHECKSUM_PARTIAL;
|
|
|
skb->csum = 0;
|
|
|
- udp4_hwcsum(skb, udph->source, udph->dest);
|
|
|
+ udp4_hwcsum(skb, iph->saddr, iph->daddr);
|
|
|
} else {
|
|
|
- __wsum csum = udp_csum(skb);
|
|
|
+ __wsum csum = skb_checksum(skb, skb_transport_offset(skb), datalen + 8, 0);
|
|
|
|
|
|
/* add protocol-dependent pseudo-header */
|
|
|
- udph->check = csum_tcpudp_magic(udph->source, udph->dest,
|
|
|
+ udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,
|
|
|
datalen + 8, IPPROTO_UDP, csum);
|
|
|
|
|
|
if (udph->check == 0)
|
|
|
udph->check = CSUM_MANGLED_0;
|
|
|
}
|
|
|
|
|
|
- pktgen_finalize_skb(pkt_dev, skb, datalen);
|
|
|
-
|
|
|
#ifdef CONFIG_XFRM
|
|
|
if (!process_ipsec(pkt_dev, skb, protocol))
|
|
|
return NULL;
|
|
@@ -2976,6 +2976,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
|
|
|
skb->dev = odev;
|
|
|
skb->pkt_type = PACKET_HOST;
|
|
|
|
|
|
+ pktgen_finalize_skb(pkt_dev, skb, datalen);
|
|
|
+
|
|
|
if (!(pkt_dev->flags & F_UDPCSUM)) {
|
|
|
skb->ip_summed = CHECKSUM_NONE;
|
|
|
} else if (odev->features & NETIF_F_V6_CSUM) {
|
|
@@ -2984,7 +2986,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
|
|
|
skb->csum_offset = offsetof(struct udphdr, check);
|
|
|
udph->check = ~csum_ipv6_magic(&iph->saddr, &iph->daddr, udplen, IPPROTO_UDP, 0);
|
|
|
} else {
|
|
|
- __wsum csum = udp_csum(skb);
|
|
|
+ __wsum csum = skb_checksum(skb, skb_transport_offset(skb), udplen, 0);
|
|
|
|
|
|
/* add protocol-dependent pseudo-header */
|
|
|
udph->check = csum_ipv6_magic(&iph->saddr, &iph->daddr, udplen, IPPROTO_UDP, csum);
|
|
@@ -2993,8 +2995,6 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
|
|
|
udph->check = CSUM_MANGLED_0;
|
|
|
}
|
|
|
|
|
|
- pktgen_finalize_skb(pkt_dev, skb, datalen);
|
|
|
-
|
|
|
return skb;
|
|
|
}
|
|
|
|