ixgbevf: Fix checksum error when using stacked vlan
When a skb has multiple vlans and it is CHECKSUM_PARTIAL, ixgbevf_tx_csum() fails to get the network protocol and checksum related descriptor fields are not configured correctly because skb->protocol doesn't show the L3 protocol in this case. Use first->protocol instead of skb->protocol to get the proper network protocol. Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0213668f06
commit
10e4fb333c
1 changed files with 2 additions and 2 deletions
|
@ -3099,7 +3099,7 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
|
||||||
/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
|
/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
|
||||||
type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP;
|
type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP;
|
||||||
|
|
||||||
if (skb->protocol == htons(ETH_P_IP)) {
|
if (first->protocol == htons(ETH_P_IP)) {
|
||||||
struct iphdr *iph = ip_hdr(skb);
|
struct iphdr *iph = ip_hdr(skb);
|
||||||
iph->tot_len = 0;
|
iph->tot_len = 0;
|
||||||
iph->check = 0;
|
iph->check = 0;
|
||||||
|
@ -3156,7 +3156,7 @@ static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring,
|
||||||
|
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||||
u8 l4_hdr = 0;
|
u8 l4_hdr = 0;
|
||||||
switch (skb->protocol) {
|
switch (first->protocol) {
|
||||||
case htons(ETH_P_IP):
|
case htons(ETH_P_IP):
|
||||||
vlan_macip_lens |= skb_network_header_len(skb);
|
vlan_macip_lens |= skb_network_header_len(skb);
|
||||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||||
|
|
Loading…
Add table
Reference in a new issue