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

Commit f93592ff authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[NETFILTER]: Fix HW checksum handling in ECN target

parent fd841326
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -71,6 +71,10 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward)
		return 0;
		return 0;
	tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4;
	tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4;


	if ((*pskb)->ip_summed == CHECKSUM_HW &&
	    skb_checksum_help(*pskb, inward))
		return 0;

	diffs[0] = ((u_int16_t *)tcph)[6];
	diffs[0] = ((u_int16_t *)tcph)[6];
	if (einfo->operation & IPT_ECN_OP_SET_ECE)
	if (einfo->operation & IPT_ECN_OP_SET_ECE)
		tcph->ece = einfo->proto.tcp.ece;
		tcph->ece = einfo->proto.tcp.ece;
@@ -79,13 +83,10 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward)
	diffs[1] = ((u_int16_t *)tcph)[6];
	diffs[1] = ((u_int16_t *)tcph)[6];
	diffs[0] = diffs[0] ^ 0xFFFF;
	diffs[0] = diffs[0] ^ 0xFFFF;


	if ((*pskb)->ip_summed != CHECKSUM_HW)
	if ((*pskb)->ip_summed != CHECKSUM_UNNECESSARY)
		tcph->check = csum_fold(csum_partial((char *)diffs,
		tcph->check = csum_fold(csum_partial((char *)diffs,
						     sizeof(diffs),
						     sizeof(diffs),
						     tcph->check^0xFFFF));
						     tcph->check^0xFFFF));
	else
		if (skb_checksum_help(*pskb, inward))
			return 0;
	(*pskb)->nfcache |= NFC_ALTERED;
	(*pskb)->nfcache |= NFC_ALTERED;
	return 1;
	return 1;
}
}