diff mbox

[xenial] (upstream) net/mlx4_en: Fix endianness bug in IPV6 csum calculation

Message ID 1462781358-22163-1-git-send-email-talatb@mellanox.com
State New
Headers show

Commit Message

Talat Batheesh May 9, 2016, 8:09 a.m. UTC
From: Daniel Jurgens <danielj@mellanox.com>

BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1544978

Use htons instead of unconditionally byte swapping nexthdr.  On a little
endian systems shifting the byte is correct behavior, but it results in
incorrect csums on big endian architectures.

Fixes: f8c6455bb04b ('net/mlx4_en: Extend checksum offloading by CHECKSUM COMPLETE')
Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
Reviewed-by: Carol Soto <clsoto@us.ibm.com>
Tested-by: Carol Soto <clsoto@us.ibm.com>
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 82d69203df634b4dfa765c94f60ce9482bcc44d6)
Signed-off-by: Talat Batheesh <talatb@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Tim Gardner May 9, 2016, 12:57 p.m. UTC | #1
cherry-pick from linux-next
Chris J Arges May 9, 2016, 3:27 p.m. UTC | #2
On Mon, May 09, 2016 at 11:09:18AM +0300, Talat Batheesh wrote:
> From: Daniel Jurgens <danielj@mellanox.com>
> 
> BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1544978
> 
> Use htons instead of unconditionally byte swapping nexthdr.  On a little
> endian systems shifting the byte is correct behavior, but it results in
> incorrect csums on big endian architectures.
> 
> Fixes: f8c6455bb04b ('net/mlx4_en: Extend checksum offloading by CHECKSUM COMPLETE')
> Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
> Reviewed-by: Carol Soto <clsoto@us.ibm.com>
> Tested-by: Carol Soto <clsoto@us.ibm.com>
> Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit 82d69203df634b4dfa765c94f60ce9482bcc44d6)

Amend this to include where it was cherry-picked from.
Other than that ACK.
--chris

> Signed-off-by: Talat Batheesh <talatb@mellanox.com>
> ---
>  drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> index e7a5000..bbff8ec 100644
> --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> @@ -704,7 +704,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb,
>  
>  	if (ipv6h->nexthdr == IPPROTO_FRAGMENT || ipv6h->nexthdr == IPPROTO_HOPOPTS)
>  		return -1;
> -	hw_checksum = csum_add(hw_checksum, (__force __wsum)(ipv6h->nexthdr << 8));
> +	hw_checksum = csum_add(hw_checksum, (__force __wsum)htons(ipv6h->nexthdr));
>  
>  	csum_pseudo_hdr = csum_partial(&ipv6h->saddr,
>  				       sizeof(ipv6h->saddr) + sizeof(ipv6h->daddr), 0);
> -- 
> 2.5.0
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Talat Batheesh May 10, 2016, 10:59 a.m. UTC | #3
Cherry-picked from net tree.

Yours,
Talat 


-----Original Message-----
From: Christopher Arges [mailto:chris.j.arges@canonical.com] 
Sent: Monday, May 09, 2016 6:28 PM
To: Talat Batheesh <talatb@mellanox.com>
Cc: kernel-team@lists.ubuntu.com; Shani Michaeli <shanim@mellanox.com>
Subject: Re: [PATCH] [xenial] [PATCH] (upstream) net/mlx4_en: Fix endianness bug in IPV6 csum calculation

On Mon, May 09, 2016 at 11:09:18AM +0300, Talat Batheesh wrote:
> From: Daniel Jurgens <danielj@mellanox.com>
> 
> BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1544978
> 
> Use htons instead of unconditionally byte swapping nexthdr.  On a 
> little endian systems shifting the byte is correct behavior, but it 
> results in incorrect csums on big endian architectures.
> 
> Fixes: f8c6455bb04b ('net/mlx4_en: Extend checksum offloading by 
> CHECKSUM COMPLETE')
> Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
> Reviewed-by: Carol Soto <clsoto@us.ibm.com>
> Tested-by: Carol Soto <clsoto@us.ibm.com>
> Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked 
> from commit 82d69203df634b4dfa765c94f60ce9482bcc44d6)

Amend this to include where it was cherry-picked from.
Other than that ACK.
--chris

> Signed-off-by: Talat Batheesh <talatb@mellanox.com>
> ---
>  drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c 
> b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> index e7a5000..bbff8ec 100644
> --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
> @@ -704,7 +704,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, 
> struct sk_buff *skb,
>  
>  	if (ipv6h->nexthdr == IPPROTO_FRAGMENT || ipv6h->nexthdr == IPPROTO_HOPOPTS)
>  		return -1;
> -	hw_checksum = csum_add(hw_checksum, (__force __wsum)(ipv6h->nexthdr << 8));
> +	hw_checksum = csum_add(hw_checksum, (__force 
> +__wsum)htons(ipv6h->nexthdr));
>  
>  	csum_pseudo_hdr = csum_partial(&ipv6h->saddr,
>  				       sizeof(ipv6h->saddr) + sizeof(ipv6h->daddr), 0);
> --
> 2.5.0
> 
> 
> --
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Kamal Mostafa May 10, 2016, 4:19 p.m. UTC | #4
Applied to Xenial.

(This commit has also landed in mainline now, so the cherry-pick line
was actually fine just as it was).

82d6920 net/mlx4_en: Fix endianness bug in IPV6 csum calculation

 -Kamal
diff mbox

Patch

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index e7a5000..bbff8ec 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -704,7 +704,7 @@  static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb,
 
 	if (ipv6h->nexthdr == IPPROTO_FRAGMENT || ipv6h->nexthdr == IPPROTO_HOPOPTS)
 		return -1;
-	hw_checksum = csum_add(hw_checksum, (__force __wsum)(ipv6h->nexthdr << 8));
+	hw_checksum = csum_add(hw_checksum, (__force __wsum)htons(ipv6h->nexthdr));
 
 	csum_pseudo_hdr = csum_partial(&ipv6h->saddr,
 				       sizeof(ipv6h->saddr) + sizeof(ipv6h->daddr), 0);