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: Cong Wang <amwang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f3da38932b
commit
6eacf8ad8d
@ -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,
|
|||||||
* 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user