@@ -556,7 +556,10 @@ static void hns_nic_rx_checksum(struct hns_nic_ring_data *ring_data,
return;
/* now, this has to be a packet with valid RX checksum */
- skb->ip_summed = CHECKSUM_UNNECESSARY;
+ if (l4id == HNS_RX_FLAG_L4ID_SCTP)
+ skb_set_csum_crc32_unnecessary(skb);
+ else
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
}
static int hns_nic_poll_rx_skb(struct hns_nic_ring_data *ring_data,
@@ -3908,11 +3908,19 @@ static void hns3_rx_handle_csum(struct sk_buff *skb, u32 l234info,
HNS3_RXD_L4ID_S);
/* Can checksum ipv4 or ipv6 + UDP/TCP/SCTP packets */
if ((l3_type == HNS3_L3_TYPE_IPV4 ||
- l3_type == HNS3_L3_TYPE_IPV6) &&
- (l4_type == HNS3_L4_TYPE_UDP ||
- l4_type == HNS3_L4_TYPE_TCP ||
- l4_type == HNS3_L4_TYPE_SCTP))
- skb->ip_summed = CHECKSUM_UNNECESSARY;
+ l3_type == HNS3_L3_TYPE_IPV6)) {
+ switch (l4_type) {
+ case HNS3_L4_TYPE_UDP:
+ case HNS3_L4_TYPE_TCP:
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ break;
+ case HNS3_L4_TYPE_SCTP:
+ skb_set_csum_crc32_unnecessary(skb);
+ break;
+ default:
+ break;
+ }
+ }
break;
default:
break;
When a validated offload CRC for SCTP is detected call skb_set_csum_crc32_unnessary instead of setting CHECKSUM_UNNECESSARY Signed-off-by: Tom Herbert <tom@herbertland.com> --- drivers/net/ethernet/hisilicon/hns/hns_enet.c | 5 ++++- .../net/ethernet/hisilicon/hns3/hns3_enet.c | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-)