Patch "net/mlx4_en: don't set CHECKSUM_COMPLETE on SCTP packets" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
net/mlx4_en: don't set CHECKSUM_COMPLETE on SCTP packets
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-mlx4_en-don-t-set-checksum_complete-on-sctp-packets.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Aug 11 09:10:20 PDT 2017
From: Davide Caratti <[email protected]>
Date: Thu, 3 Aug 2017 22:54:48 +0200
Subject: net/mlx4_en: don't set CHECKSUM_COMPLETE on SCTP packets
From: Davide Caratti <[email protected]>
[ Upstream commit e718fe450e616227b74d27a233cdf37b4df0c82b ]
if the NIC fails to validate the checksum on TCP/UDP, and validation of IP checksum is successful, the driver subtracts the pseudo-header checksum from the value obtained by the hardware and sets CHECKSUM_COMPLETE. Don't do that if protocol is IPPROTO_SCTP, otherwise CRC32c validation fails.
V2: don't test MLX4_CQE_STATUS_IPV6 if MLX4_CQE_STATUS_IPV4 is set
--- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_rx.c +18 -11
@@ -724,16 +724,21 @@ static inline __wsum get_fixed_vlan_csum* header, the HW adds it. To address that, we are subtracting the pseudo * header checksum from the checksum value provided by the HW. */ -static void get_fixed_ipv4_csum (__wsum hw_checksum,struct sk_buff *skb, -struct iphdr *iph) +static int get_fixed_ipv4_csum (__wsum hw_checksum,struct sk_buff *skb, +struct iphdr *iph) {__u16 length_for_csum =0 ;__wsum csum_pseudo_header =0 ; +__u8 ipproto = iph->protocol; + +if (unlikely (ipproto ==IPPROTO_SCTP )) +return -1 ; length_for_csum = (be16_to_cpu (iph->tot_len) - (iph->ihl <<2 )); csum_pseudo_header =csum_tcpudp_nofold (iph->saddr, iph->daddr, - length_for_csum, iph->protocol,0 ); + length_for_csum, ipproto,0 ); skb->csum =csum_sub (hw_checksum, csum_pseudo_header); +return 0 ; }#if IS_ENABLED (CONFIG_IPV6 )
@@ -744,17 +749,20 @@ static void get_fixed_ipv4_csum(__wsum hstatic int get_fixed_ipv6_csum (__wsum hw_checksum,struct sk_buff *skb,struct ipv6hdr *ipv6h) { +__u8 nexthdr = ipv6h->nexthdr;__wsum csum_pseudo_hdr =0 ; -if (unlikely (ipv6h->nexthdr ==IPPROTO_FRAGMENT || - ipv6h->nexthdr ==IPPROTO_HOPOPTS )) +if (unlikely (nexthdr ==IPPROTO_FRAGMENT || + nexthdr ==IPPROTO_HOPOPTS || + nexthdr ==IPPROTO_SCTP ))return -1 ; - hw_checksum =csum_add (hw_checksum, (__force __wsum )htons (ipv6h->nexthdr)); + hw_checksum =csum_add (hw_checksum, (__force __wsum )htons (nexthdr)); csum_pseudo_hdr =csum_partial (&ipv6h->saddr,sizeof (ipv6h->saddr) +sizeof (ipv6h->daddr),0 ); csum_pseudo_hdr =csum_add (csum_pseudo_hdr, (__force __wsum )ipv6h->payload_len); - csum_pseudo_hdr =csum_add (csum_pseudo_hdr, (__force __wsum )ntohs (ipv6h->nexthdr)); + csum_pseudo_hdr =csum_add (csum_pseudo_hdr, + (__force __wsum )htons (nexthdr)); skb->csum =csum_sub (hw_checksum, csum_pseudo_hdr); skb->csum =csum_add (skb->csum,csum_partial (ipv6h,sizeof (struct ipv6hdr ),0 ));
@@ -777,11 +785,10 @@ static int check_csum(struct mlx4_cqe *c }if (cqe->status &cpu_to_be16 (MLX4_CQE_STATUS_IPV4 )) -get_fixed_ipv4_csum (hw_checksum, skb, hdr); +return get_fixed_ipv4_csum (hw_checksum, skb, hdr);#if IS_ENABLED (CONFIG_IPV6 ) - else if (cqe->status & cpu_to_be16(MLX4_CQE_STATUS_IPV6)) - if (unlikely(get_fixed_ipv6_csum(hw_checksum, skb, hdr))) - return -1; +if (cqe->status &cpu_to_be16 (MLX4_CQE_STATUS_IPV6 )) +return get_fixed_ipv6_csum (hw_checksum, skb, hdr);#endif return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-mlx4_en-don-t-set-checksum_complete-on-sctp-packets.patch