diff options
author | Patrick McHardy <kaber@trash.net> | 2013-04-18 22:04:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-19 14:46:06 -0400 |
commit | 86a9bad3ab6b6f858fd4443b48738cabbb6d094c (patch) | |
tree | 21d41b1c81e0f3e53ac4004627a8c9588099fea1 /net/core | |
parent | 1fd9b1fc310314911f66d2f14a8e4f0ef37bf47b (diff) |
net: vlan: add protocol argument to packet tagging functions
Add a protocol argument to the VLAN packet tagging functions. In case of HW
tagging, we need that protocol available in the ndo_start_xmit functions,
so it is stored in a new field in the skb. The new field fits into a hole
(on 64 bit) and doesn't increase the sks's size.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 5 | ||||
-rw-r--r-- | net/core/netpoll.c | 5 | ||||
-rw-r--r-- | net/core/skbuff.c | 1 |
3 files changed, 7 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 07a8e9dc43fc..3a12ee132b59 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2482,8 +2482,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
2482 | features = netif_skb_features(skb); | 2482 | features = netif_skb_features(skb); |
2483 | 2483 | ||
2484 | if (vlan_tx_tag_present(skb) && | 2484 | if (vlan_tx_tag_present(skb) && |
2485 | !(features & NETIF_F_HW_VLAN_CTAG_TX)) { | 2485 | !vlan_hw_offload_capable(features, skb->vlan_proto)) { |
2486 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); | 2486 | skb = __vlan_put_tag(skb, skb->vlan_proto, |
2487 | vlan_tx_tag_get(skb)); | ||
2487 | if (unlikely(!skb)) | 2488 | if (unlikely(!skb)) |
2488 | goto out; | 2489 | goto out; |
2489 | 2490 | ||
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 8de961e67cf7..209d84253dd5 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -383,8 +383,9 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
383 | if (__netif_tx_trylock(txq)) { | 383 | if (__netif_tx_trylock(txq)) { |
384 | if (!netif_xmit_stopped(txq)) { | 384 | if (!netif_xmit_stopped(txq)) { |
385 | if (vlan_tx_tag_present(skb) && | 385 | if (vlan_tx_tag_present(skb) && |
386 | !(netif_skb_features(skb) & NETIF_F_HW_VLAN_CTAG_TX)) { | 386 | !vlan_hw_offload_capable(netif_skb_features(skb), |
387 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); | 387 | skb->vlan_proto)) { |
388 | skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb)); | ||
388 | if (unlikely(!skb)) | 389 | if (unlikely(!skb)) |
389 | break; | 390 | break; |
390 | skb->vlan_tci = 0; | 391 | skb->vlan_tci = 0; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index ba646145cd5c..a92d9e7d10f7 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -707,6 +707,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
707 | new->tc_verd = old->tc_verd; | 707 | new->tc_verd = old->tc_verd; |
708 | #endif | 708 | #endif |
709 | #endif | 709 | #endif |
710 | new->vlan_proto = old->vlan_proto; | ||
710 | new->vlan_tci = old->vlan_tci; | 711 | new->vlan_tci = old->vlan_tci; |
711 | 712 | ||
712 | skb_copy_secmark(new, old); | 713 | skb_copy_secmark(new, old); |