|
@@ -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 &&
|
|
|
|
- (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 +
|
|
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,
|
|
skb->protocol == htons(ETH_P_8021AD))
|
|
skb->protocol == htons(ETH_P_8021AD))
|
|
? VLAN_HLEN : 0;
|
|
? 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;
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|