mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 17:53:56 +08:00
net: qualcomm: rmnet: Fix incorrect UL checksum offload logic
The udp_ip4_ind bit is set only for IPv4 UDP non-fragmented packets
so that the hardware can flip the checksum to 0xFFFF if the computed
checksum is 0 per RFC768.
However, this bit had to be set for IPv6 UDP non fragmented packets
as well per hardware requirements. Otherwise, IPv6 UDP packets
with computed checksum as 0 were transmitted by hardware and were
dropped in the network.
In addition to setting this bit for IPv6 UDP, the field is also
appropriately renamed to udp_ind as part of this change.
Fixes: 5eb5f8608e
("net: qualcomm: rmnet: Add support for TX checksum offload")
Cc: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
01f5bffad5
commit
a7cf3d24ee
@ -206,9 +206,9 @@ rmnet_map_ipv4_ul_csum_header(void *iphdr,
|
||||
ul_header->csum_insert_offset = skb->csum_offset;
|
||||
ul_header->csum_enabled = 1;
|
||||
if (ip4h->protocol == IPPROTO_UDP)
|
||||
ul_header->udp_ip4_ind = 1;
|
||||
ul_header->udp_ind = 1;
|
||||
else
|
||||
ul_header->udp_ip4_ind = 0;
|
||||
ul_header->udp_ind = 0;
|
||||
|
||||
/* Changing remaining fields to network order */
|
||||
hdr++;
|
||||
@ -239,6 +239,7 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr,
|
||||
struct rmnet_map_ul_csum_header *ul_header,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ipv6hdr *ip6h = (struct ipv6hdr *)ip6hdr;
|
||||
__be16 *hdr = (__be16 *)ul_header, offset;
|
||||
|
||||
offset = htons((__force u16)(skb_transport_header(skb) -
|
||||
@ -246,7 +247,11 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr,
|
||||
ul_header->csum_start_offset = offset;
|
||||
ul_header->csum_insert_offset = skb->csum_offset;
|
||||
ul_header->csum_enabled = 1;
|
||||
ul_header->udp_ip4_ind = 0;
|
||||
|
||||
if (ip6h->nexthdr == IPPROTO_UDP)
|
||||
ul_header->udp_ind = 1;
|
||||
else
|
||||
ul_header->udp_ind = 0;
|
||||
|
||||
/* Changing remaining fields to network order */
|
||||
hdr++;
|
||||
@ -419,7 +424,7 @@ sw_csum:
|
||||
ul_header->csum_start_offset = 0;
|
||||
ul_header->csum_insert_offset = 0;
|
||||
ul_header->csum_enabled = 0;
|
||||
ul_header->udp_ip4_ind = 0;
|
||||
ul_header->udp_ind = 0;
|
||||
|
||||
priv->stats.csum_sw++;
|
||||
}
|
||||
|
@ -41,11 +41,11 @@ struct rmnet_map_ul_csum_header {
|
||||
__be16 csum_start_offset;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
u16 csum_insert_offset:14;
|
||||
u16 udp_ip4_ind:1;
|
||||
u16 udp_ind:1;
|
||||
u16 csum_enabled:1;
|
||||
#elif defined (__BIG_ENDIAN_BITFIELD)
|
||||
u16 csum_enabled:1;
|
||||
u16 udp_ip4_ind:1;
|
||||
u16 udp_ind:1;
|
||||
u16 csum_insert_offset:14;
|
||||
#else
|
||||
#error "Please fix <asm/byteorder.h>"
|
||||
|
Loading…
Reference in New Issue
Block a user