mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
i40evf: Fix Outer UDP RX checksum code
Inner protocol being UDP should not stop us from verifying Outer UDP checksum correctness. If the Outer protocol is not UDP (NVGRE) we should not be doing a UDP checksum check. If the packet has zero checksum, skip checksum check. Change-ID: Ie7f153feb276a59f66a54a0938901b2c0a8100fa Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com> Tested-by: Jim Young <james.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
11a9c7821c
commit
818f2e7b25
1 changed files with 13 additions and 11 deletions
|
@ -915,9 +915,7 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
|
|||
* so the total length of IPv4 header is IHL*4 bytes
|
||||
* The UDP_0 bit *may* bet set if the *inner* header is UDP
|
||||
*/
|
||||
if (ipv4_tunnel &&
|
||||
(decoded.inner_prot != I40E_RX_PTYPE_INNER_PROT_UDP) &&
|
||||
!(rx_status & (1 << I40E_RX_DESC_STATUS_UDP_0_SHIFT))) {
|
||||
if (ipv4_tunnel) {
|
||||
skb->transport_header = skb->mac_header +
|
||||
sizeof(struct ethhdr) +
|
||||
(ip_hdr(skb)->ihl * 4);
|
||||
|
@ -927,15 +925,19 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
|
|||
skb->protocol == htons(ETH_P_8021AD))
|
||||
? VLAN_HLEN : 0;
|
||||
|
||||
rx_udp_csum = udp_csum(skb);
|
||||
iph = ip_hdr(skb);
|
||||
csum = csum_tcpudp_magic(
|
||||
iph->saddr, iph->daddr,
|
||||
(skb->len - skb_transport_offset(skb)),
|
||||
IPPROTO_UDP, rx_udp_csum);
|
||||
if ((ip_hdr(skb)->protocol == IPPROTO_UDP) &&
|
||||
(udp_hdr(skb)->check != 0)) {
|
||||
rx_udp_csum = udp_csum(skb);
|
||||
iph = ip_hdr(skb);
|
||||
csum = csum_tcpudp_magic(iph->saddr, iph->daddr,
|
||||
(skb->len -
|
||||
skb_transport_offset(skb)),
|
||||
IPPROTO_UDP, rx_udp_csum);
|
||||
|
||||
if (udp_hdr(skb)->check != csum)
|
||||
goto checksum_fail;
|
||||
if (udp_hdr(skb)->check != csum)
|
||||
goto checksum_fail;
|
||||
|
||||
} /* else its GRE and so no outer UDP header */
|
||||
}
|
||||
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
|
Loading…
Reference in a new issue