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

Commit b8ee93ba authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

gro: Clean up tcpX_gro_receive checksum verification



This patch simplifies the checksum verification in tcpX_gro_receive
by reusing the CHECKSUM_COMPLETE code for CHECKSUM_NONE.  All it
does for CHECKSUM_NONE is compute the partial checksum and then
treat it as if it came from the hardware (CHECKSUM_COMPLETE).

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>

Cheers,
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cc5c00bb
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -274,35 +274,29 @@ static struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *
{
	const struct iphdr *iph = skb_gro_network_header(skb);
	__wsum wsum;
	__sum16 sum;

	/* Don't bother verifying checksum if we're going to flush anyway. */
	if (NAPI_GRO_CB(skb)->flush)
		goto skip_csum;

	wsum = skb->csum;

	switch (skb->ip_summed) {
	case CHECKSUM_NONE:
		wsum = skb_checksum(skb, skb_gro_offset(skb), skb_gro_len(skb),
				    0);

		/* fall through */

	case CHECKSUM_COMPLETE:
		if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr,
				  skb->csum)) {
				  wsum)) {
			skb->ip_summed = CHECKSUM_UNNECESSARY;
			break;
		}
flush:

		NAPI_GRO_CB(skb)->flush = 1;
		return NULL;

	case CHECKSUM_NONE:
		wsum = csum_tcpudp_nofold(iph->saddr, iph->daddr,
					  skb_gro_len(skb), IPPROTO_TCP, 0);
		sum = csum_fold(skb_checksum(skb,
					     skb_gro_offset(skb),
					     skb_gro_len(skb),
					     wsum));
		if (sum)
			goto flush;

		skb->ip_summed = CHECKSUM_UNNECESSARY;
		break;
	}

skip_csum:
+10 −17
Original line number Diff line number Diff line
@@ -37,36 +37,29 @@ static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
{
	const struct ipv6hdr *iph = skb_gro_network_header(skb);
	__wsum wsum;
	__sum16 sum;

	/* Don't bother verifying checksum if we're going to flush anyway. */
	if (NAPI_GRO_CB(skb)->flush)
		goto skip_csum;

	wsum = skb->csum;

	switch (skb->ip_summed) {
	case CHECKSUM_NONE:
		wsum = skb_checksum(skb, skb_gro_offset(skb), skb_gro_len(skb),
				    wsum);

		/* fall through */

	case CHECKSUM_COMPLETE:
		if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr,
				  skb->csum)) {
				  wsum)) {
			skb->ip_summed = CHECKSUM_UNNECESSARY;
			break;
		}
flush:

		NAPI_GRO_CB(skb)->flush = 1;
		return NULL;

	case CHECKSUM_NONE:
		wsum = ~csum_unfold(csum_ipv6_magic(&iph->saddr, &iph->daddr,
						    skb_gro_len(skb),
						    IPPROTO_TCP, 0));
		sum = csum_fold(skb_checksum(skb,
					     skb_gro_offset(skb),
					     skb_gro_len(skb),
					     wsum));
		if (sum)
			goto flush;

		skb->ip_summed = CHECKSUM_UNNECESSARY;
		break;
	}

skip_csum: