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

Commit 4b275d7e authored by Yan, Zheng's avatar Yan, Zheng Committed by David S. Miller
Browse files

bridge: Pseudo-header required for the checksum of ICMPv6



Checksum of ICMPv6 is not properly computed because the pseudo header is not used.
Thus, the MLD packet gets dropped by the bridge.

Signed-off-by: default avatarZheng Yan <zheng.z.yan@intel.com>
Reported-by: default avatarAng Way Chuang <wcang@sfc.wide.ad.jp>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e05c4ad3
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1520,16 +1520,23 @@ static int br_multicast_ipv6_rcv(struct net_bridge *br,
		err = pskb_trim_rcsum(skb2, len);
		if (err)
			goto out;
		err = -EINVAL;
	}

	ip6h = ipv6_hdr(skb2);

	switch (skb2->ip_summed) {
	case CHECKSUM_COMPLETE:
		if (!csum_fold(skb2->csum))
		if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, skb2->len,
					IPPROTO_ICMPV6, skb2->csum))
			break;
		/*FALLTHROUGH*/
	case CHECKSUM_NONE:
		skb2->csum = 0;
		if (skb_checksum_complete(skb2))
		skb2->csum = ~csum_unfold(csum_ipv6_magic(&ip6h->saddr,
							&ip6h->daddr,
							skb2->len,
							IPPROTO_ICMPV6, 0));
		if (__skb_checksum_complete(skb2))
			goto out;
	}