|
@@ -3008,7 +3008,18 @@ static inline bool igb_tx_csum_adv(struct igb_adapter *adapter,
|
|
|
tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_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):
|
|
|
tu_cmd |= E1000_ADVTXD_TUCMD_IPV4;
|
|
|
if (ip_hdr(skb)->protocol == IPPROTO_TCP)
|