Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c6de058 authored by Yasuyuki Kozakai's avatar Yasuyuki Kozakai Committed by David S. Miller
Browse files

[NETFILTER]: nf_conntrack: Fix TCP/UDP HW checksum handling for IPv6 packet



If skb->ip_summed is CHECKSUM_HW here, skb->csum includes checksum
of actual IPv6 header and extension headers. Then such excess
checksum must be subtruct when nf_conntrack calculates TCP/UDP checksum
with pseudo IPv6 header. Spotted by Ben Skeggs.

Signed-off-by: default avatarYasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 763ecff1
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -864,7 +864,9 @@ static int csum6(const struct sk_buff *skb, unsigned int dataoff)
{
	return csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr,
			       skb->len - dataoff, IPPROTO_TCP,
			       skb->ip_summed == CHECKSUM_HW ? skb->csum
			       skb->ip_summed == CHECKSUM_HW
			       ? csum_sub(skb->csum,
					  skb_checksum(skb, 0, dataoff, 0))
			       : skb_checksum(skb, dataoff, skb->len - dataoff,
					      0));
}
+3 −1
Original line number Diff line number Diff line
@@ -161,7 +161,9 @@ static int csum6(const struct sk_buff *skb, unsigned int dataoff)
{
	return csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr,
			       skb->len - dataoff, IPPROTO_UDP,
			       skb->ip_summed == CHECKSUM_HW ? skb->csum
			       skb->ip_summed == CHECKSUM_HW
			       ? csum_sub(skb->csum,
					  skb_checksum(skb, 0, dataoff, 0))
			       : skb_checksum(skb, dataoff, skb->len - dataoff,
					      0));
}