|
@@ -1883,17 +1883,16 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb,
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
|
|
|
- if (protocol == htons(ETH_P_IP)) {
|
|
|
- iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb);
|
|
|
+ iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb);
|
|
|
+ ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb);
|
|
|
+
|
|
|
+ if (iph->version == 4) {
|
|
|
tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb);
|
|
|
iph->tot_len = 0;
|
|
|
iph->check = 0;
|
|
|
tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
|
|
|
0, IPPROTO_TCP, 0);
|
|
|
- } else if (skb_is_gso_v6(skb)) {
|
|
|
-
|
|
|
- ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb)
|
|
|
- : ipv6_hdr(skb);
|
|
|
+ } else if (ipv6h->version == 6) {
|
|
|
tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb);
|
|
|
ipv6h->payload_len = 0;
|
|
|
tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr,
|
|
@@ -1989,13 +1988,9 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags,
|
|
|
I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;
|
|
|
}
|
|
|
} else if (tx_flags & I40E_TX_FLAGS_IPV6) {
|
|
|
- if (tx_flags & I40E_TX_FLAGS_TSO) {
|
|
|
- *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6;
|
|
|
+ *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6;
|
|
|
+ if (tx_flags & I40E_TX_FLAGS_TSO)
|
|
|
ip_hdr(skb)->check = 0;
|
|
|
- } else {
|
|
|
- *cd_tunneling |=
|
|
|
- I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/* Now set the ctx descriptor fields */
|
|
@@ -2005,7 +2000,10 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags,
|
|
|
((skb_inner_network_offset(skb) -
|
|
|
skb_transport_offset(skb)) >> 1) <<
|
|
|
I40E_TXD_CTX_QW0_NATLEN_SHIFT;
|
|
|
-
|
|
|
+ if (this_ip_hdr->version == 6) {
|
|
|
+ tx_flags &= ~I40E_TX_FLAGS_IPV4;
|
|
|
+ tx_flags |= I40E_TX_FLAGS_IPV6;
|
|
|
+ }
|
|
|
} else {
|
|
|
network_hdr_len = skb_network_header_len(skb);
|
|
|
this_ip_hdr = ip_hdr(skb);
|