|
@@ -209,7 +209,7 @@ static void prb_clear_rxhash(struct tpacket_kbdq_core *,
|
|
|
static void prb_fill_vlan_info(struct tpacket_kbdq_core *,
|
|
|
struct tpacket3_hdr *);
|
|
|
static void packet_flush_mclist(struct sock *sk);
|
|
|
-static void packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb);
|
|
|
+static u16 packet_pick_tx_queue(struct sk_buff *skb);
|
|
|
|
|
|
struct packet_skb_cb {
|
|
|
union {
|
|
@@ -243,40 +243,7 @@ static void __fanout_link(struct sock *sk, struct packet_sock *po);
|
|
|
|
|
|
static int packet_direct_xmit(struct sk_buff *skb)
|
|
|
{
|
|
|
- struct net_device *dev = skb->dev;
|
|
|
- struct sk_buff *orig_skb = skb;
|
|
|
- struct netdev_queue *txq;
|
|
|
- int ret = NETDEV_TX_BUSY;
|
|
|
- bool again = false;
|
|
|
-
|
|
|
- if (unlikely(!netif_running(dev) ||
|
|
|
- !netif_carrier_ok(dev)))
|
|
|
- goto drop;
|
|
|
-
|
|
|
- skb = validate_xmit_skb_list(skb, dev, &again);
|
|
|
- if (skb != orig_skb)
|
|
|
- goto drop;
|
|
|
-
|
|
|
- packet_pick_tx_queue(dev, skb);
|
|
|
- txq = skb_get_tx_queue(dev, skb);
|
|
|
-
|
|
|
- local_bh_disable();
|
|
|
-
|
|
|
- HARD_TX_LOCK(dev, txq, smp_processor_id());
|
|
|
- if (!netif_xmit_frozen_or_drv_stopped(txq))
|
|
|
- ret = netdev_start_xmit(skb, dev, txq, false);
|
|
|
- HARD_TX_UNLOCK(dev, txq);
|
|
|
-
|
|
|
- local_bh_enable();
|
|
|
-
|
|
|
- if (!dev_xmit_complete(ret))
|
|
|
- kfree_skb(skb);
|
|
|
-
|
|
|
- return ret;
|
|
|
-drop:
|
|
|
- atomic_long_inc(&dev->tx_dropped);
|
|
|
- kfree_skb_list(skb);
|
|
|
- return NET_XMIT_DROP;
|
|
|
+ return dev_direct_xmit(skb, packet_pick_tx_queue(skb));
|
|
|
}
|
|
|
|
|
|
static struct net_device *packet_cached_dev_get(struct packet_sock *po)
|
|
@@ -313,8 +280,9 @@ static u16 __packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
|
|
|
return (u16) raw_smp_processor_id() % dev->real_num_tx_queues;
|
|
|
}
|
|
|
|
|
|
-static void packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
|
|
|
+static u16 packet_pick_tx_queue(struct sk_buff *skb)
|
|
|
{
|
|
|
+ struct net_device *dev = skb->dev;
|
|
|
const struct net_device_ops *ops = dev->netdev_ops;
|
|
|
u16 queue_index;
|
|
|
|
|
@@ -326,7 +294,7 @@ static void packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
|
|
|
queue_index = __packet_pick_tx_queue(dev, skb);
|
|
|
}
|
|
|
|
|
|
- skb_set_queue_mapping(skb, queue_index);
|
|
|
+ return queue_index;
|
|
|
}
|
|
|
|
|
|
/* __register_prot_hook must be invoked through register_prot_hook
|