Push vlan tag onto packet before segmentation to simplify the code.
As suggested by Pravin Shelar and Jesse Gross.
Signed-off-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Jesse Gross <jesse@nicira.com>
features &= ~(NETIF_F_TSO | NETIF_F_TSO6 |
NETIF_F_UFO | NETIF_F_FSO);
+ skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
+ if (unlikely(!skb))
+ return 0;
+ vlan_set_tci(skb, 0);
+
if (netif_needs_gso(skb, features)) {
struct sk_buff *nskb;
goto drop;
skb_shinfo(skb)->gso_type &= ~SKB_GSO_DODGY;
- goto tag;
+ goto xmit;
}
if (IS_ERR(nskb))
do {
nskb = skb->next;
skb->next = NULL;
-
- skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
- if (likely(skb)) {
- len += skb->len;
- vlan_set_tci(skb, 0);
- dev_queue_xmit(skb);
- }
-
+ len += skb->len;
+ dev_queue_xmit(skb);
skb = nskb;
} while (skb);
return len;
}
-
-tag:
- skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
- if (unlikely(!skb))
- return 0;
- vlan_set_tci(skb, 0);
}
+xmit:
len = skb->len;
dev_queue_xmit(skb);