|
@@ -5006,7 +5006,18 @@ static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter,
|
|
|
IXGBE_ADVTXD_DTYP_CTXT);
|
|
|
|
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
- switch (skb->protocol) {
|
|
|
+ __be16 protocol;
|
|
|
+
|
|
|
+ if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) {
|
|
|
+ const struct vlan_ethhdr *vhdr =
|
|
|
+ (const struct vlan_ethhdr *)skb->data;
|
|
|
+
|
|
|
+ protocol = vhdr->h_vlan_encapsulated_proto;
|
|
|
+ } else {
|
|
|
+ protocol = skb->protocol;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (protocol) {
|
|
|
case cpu_to_be16(ETH_P_IP):
|
|
|
type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
|
|
|
if (ip_hdr(skb)->protocol == IPPROTO_TCP)
|