Commit c9d39962 authored by Jian Shen's avatar Jian Shen Committed by Jiantao Xiao
Browse files

net: hns3: fix miss L3E checking for rx packet

mainline inclusion
from mainline-v6.2-rc3
commit 7d89b53c
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6A42Q
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7d89b53cea1a702f97117fb4361523519bb1e52c



----------------------------------------------------------------------

For device supports RXD advanced layout, the driver will
return directly if the hardware finish the checksum
calculate. It cause missing L3E checking for ip packets.
Fixes it.

Fixes: 1ddc028a ("net: hns3: refactor out RX completion checksum")
Signed-off-by: default avatarJian Shen <shenjian15@huawei.com>
Signed-off-by: default avatarHao Lan <lanhao@huawei.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarJiantao Xiao <xiaojiantao1@h-partners.com>
parent 575b059d
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -3935,18 +3935,16 @@ static int hns3_gro_complete(struct sk_buff *skb, u32 l234info)
	return 0;
}

static bool hns3_checksum_complete(struct hns3_enet_ring *ring,
static void hns3_checksum_complete(struct hns3_enet_ring *ring,
				   struct sk_buff *skb, u32 ptype, u16 csum)
{
	if (ptype == HNS3_INVALID_PTYPE ||
	    hns3_rx_ptype_tbl[ptype].ip_summed != CHECKSUM_COMPLETE)
		return false;
		return;

	hns3_ring_stats_update(ring, csum_complete);
	skb->ip_summed = CHECKSUM_COMPLETE;
	skb->csum = csum_unfold((__force __sum16)csum);

	return true;
}

static void hns3_rx_handle_csum(struct sk_buff *skb, u32 l234info,
@@ -4006,8 +4004,7 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb,
		ptype = hnae3_get_field(ol_info, HNS3_RXD_PTYPE_M,
					HNS3_RXD_PTYPE_S);

	if (hns3_checksum_complete(ring, skb, ptype, csum))
		return;
	hns3_checksum_complete(ring, skb, ptype, csum);

	/* check if hardware has done checksum */
	if (!(bd_base_info & BIT(HNS3_RXD_L3L4P_B)))
@@ -4016,6 +4013,7 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb,
	if (unlikely(l234info & (BIT(HNS3_RXD_L3E_B) | BIT(HNS3_RXD_L4E_B) |
				 BIT(HNS3_RXD_OL3E_B) |
				 BIT(HNS3_RXD_OL4E_B)))) {
		skb->ip_summed = CHECKSUM_NONE;
		hns3_ring_stats_update(ring, l3l4_csum_err);

		return;