Commit 818f2e7b authored by Anjali Singhai Jain's avatar Anjali Singhai Jain Committed by Jeff Kirsher

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: default avatarAnjali Singhai Jain <anjali.singhai@intel.com>
Tested-by: default avatarJim Young <james.m.young@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 11a9c782
...@@ -915,9 +915,7 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, ...@@ -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 * so the total length of IPv4 header is IHL*4 bytes
* The UDP_0 bit *may* bet set if the *inner* header is UDP * The UDP_0 bit *may* bet set if the *inner* header is UDP
*/ */
if (ipv4_tunnel && if (ipv4_tunnel) {
(decoded.inner_prot != I40E_RX_PTYPE_INNER_PROT_UDP) &&
!(rx_status & (1 << I40E_RX_DESC_STATUS_UDP_0_SHIFT))) {
skb->transport_header = skb->mac_header + skb->transport_header = skb->mac_header +
sizeof(struct ethhdr) + sizeof(struct ethhdr) +
(ip_hdr(skb)->ihl * 4); (ip_hdr(skb)->ihl * 4);
...@@ -927,15 +925,19 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, ...@@ -927,15 +925,19 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
skb->protocol == htons(ETH_P_8021AD)) skb->protocol == htons(ETH_P_8021AD))
? VLAN_HLEN : 0; ? VLAN_HLEN : 0;
if ((ip_hdr(skb)->protocol == IPPROTO_UDP) &&
(udp_hdr(skb)->check != 0)) {
rx_udp_csum = udp_csum(skb); rx_udp_csum = udp_csum(skb);
iph = ip_hdr(skb); iph = ip_hdr(skb);
csum = csum_tcpudp_magic( csum = csum_tcpudp_magic(iph->saddr, iph->daddr,
iph->saddr, iph->daddr, (skb->len -
(skb->len - skb_transport_offset(skb)), skb_transport_offset(skb)),
IPPROTO_UDP, rx_udp_csum); IPPROTO_UDP, rx_udp_csum);
if (udp_hdr(skb)->check != csum) if (udp_hdr(skb)->check != csum)
goto checksum_fail; goto checksum_fail;
} /* else its GRE and so no outer UDP header */
} }
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment