Commit f6385979 authored by Anjali Singhai's avatar Anjali Singhai Committed by Jeff Kirsher

i40e: Fix Rx checksum error counter

The Rx port checksum error counter was incrementing incorrectly with
UDP encapsulated tunneled traffic.  This patch fixes the problem so that
the port_rx_csum counter will show accurate statistics.
Signed-off-by: default avatarAnjali Singhai <anjali.singhai@intel.com>
Signed-off-by: default avatarGreg Rose <gregory.v.rose@intel.com>
Tested-by: default avatarJim Young <james.m.young@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent d91649f5
...@@ -1325,9 +1325,7 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, ...@@ -1325,9 +1325,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);
...@@ -1337,15 +1335,19 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, ...@@ -1337,15 +1335,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;
rx_udp_csum = udp_csum(skb); if ((ip_hdr(skb)->protocol == IPPROTO_UDP) &&
iph = ip_hdr(skb); (udp_hdr(skb)->check != 0)) {
csum = csum_tcpudp_magic( rx_udp_csum = udp_csum(skb);
iph->saddr, iph->daddr, iph = ip_hdr(skb);
(skb->len - skb_transport_offset(skb)), csum = csum_tcpudp_magic(
IPPROTO_UDP, rx_udp_csum); iph->saddr, iph->daddr,
(skb->len - skb_transport_offset(skb)),
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