diff options
Diffstat (limited to 'drivers/net/ethernet/intel/iavf/iavf_txrx.c')
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_txrx.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c index ffaf2742a2e0..3525eab8e9f9 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c +++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c @@ -1905,13 +1905,20 @@ static int iavf_tso(struct iavf_tx_buffer *first, u8 *hdr_len,  	/* determine offset of inner transport header */  	l4_offset = l4.hdr - skb->data; -  	/* remove payload length from inner checksum */  	paylen = skb->len - l4_offset; -	csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen)); -	/* compute length of segmentation header */ -	*hdr_len = (l4.tcp->doff * 4) + l4_offset; +	if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) { +		csum_replace_by_diff(&l4.udp->check, +				     (__force __wsum)htonl(paylen)); +		/* compute length of UDP segmentation header */ +		*hdr_len = (u8)sizeof(l4.udp) + l4_offset; +	} else { +		csum_replace_by_diff(&l4.tcp->check, +				     (__force __wsum)htonl(paylen)); +		/* compute length of TCP segmentation header */ +		*hdr_len = (u8)((l4.tcp->doff * 4) + l4_offset); +	}  	/* pull values out of skb_shinfo */  	gso_size = skb_shinfo(skb)->gso_size; @@ -2098,7 +2105,7 @@ static int iavf_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,  }  /** - * iavf_create_tx_ctx Build the Tx context descriptor + * iavf_create_tx_ctx - Build the Tx context descriptor   * @tx_ring:  ring to create the descriptor on   * @cd_type_cmd_tso_mss: Quad Word 1   * @cd_tunneling: Quad Word 0 - bits 0-31 | 
