Commit 6eacf8ad authored by Amerigo Wang's avatar Amerigo Wang Committed by David S. Miller

vlan: clean up vlan_dev_hard_start_xmit()

Clean up vlan_dev_hard_start_xmit() function.

Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: David Miller <davem@davemloft.net>
Signed-off-by: default avatarCong Wang <amwang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f3da3893
...@@ -137,9 +137,21 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, ...@@ -137,9 +137,21 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
return rc; return rc;
} }
static inline netdev_tx_t vlan_netpoll_send_skb(struct vlan_dev_priv *vlan, struct sk_buff *skb)
{
#ifdef CONFIG_NET_POLL_CONTROLLER
if (vlan->netpoll)
netpoll_send_skb(vlan->netpoll, skb);
#else
BUG();
#endif
return NETDEV_TX_OK;
}
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
{ {
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data); struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
unsigned int len; unsigned int len;
int ret; int ret;
...@@ -150,29 +162,30 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, ...@@ -150,29 +162,30 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
* OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
*/ */
if (veth->h_vlan_proto != htons(ETH_P_8021Q) || if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR) { vlan->flags & VLAN_FLAG_REORDER_HDR) {
u16 vlan_tci; u16 vlan_tci;
vlan_tci = vlan_dev_priv(dev)->vlan_id; vlan_tci = vlan->vlan_id;
vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
skb = __vlan_hwaccel_put_tag(skb, vlan_tci); skb = __vlan_hwaccel_put_tag(skb, vlan_tci);
} }
skb->dev = vlan_dev_priv(dev)->real_dev; skb->dev = vlan->real_dev;
len = skb->len; len = skb->len;
if (netpoll_tx_running(dev)) if (unlikely(netpoll_tx_running(dev)))
return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev); return vlan_netpoll_send_skb(vlan, skb);
ret = dev_queue_xmit(skb); ret = dev_queue_xmit(skb);
if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) { if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
struct vlan_pcpu_stats *stats; struct vlan_pcpu_stats *stats;
stats = this_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats); stats = this_cpu_ptr(vlan->vlan_pcpu_stats);
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->tx_packets++; stats->tx_packets++;
stats->tx_bytes += len; stats->tx_bytes += len;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
} else { } else {
this_cpu_inc(vlan_dev_priv(dev)->vlan_pcpu_stats->tx_dropped); this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped);
} }
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment