|
@@ -250,7 +250,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;
|
|
|
- netdev_features_t features;
|
|
|
+ struct sk_buff *orig_skb = skb;
|
|
|
struct netdev_queue *txq;
|
|
|
int ret = NETDEV_TX_BUSY;
|
|
|
|
|
@@ -258,9 +258,8 @@ static int packet_direct_xmit(struct sk_buff *skb)
|
|
|
!netif_carrier_ok(dev)))
|
|
|
goto drop;
|
|
|
|
|
|
- features = netif_skb_features(skb);
|
|
|
- if (skb_needs_linearize(skb, features) &&
|
|
|
- __skb_linearize(skb))
|
|
|
+ skb = validate_xmit_skb_list(skb, dev);
|
|
|
+ if (skb != orig_skb)
|
|
|
goto drop;
|
|
|
|
|
|
txq = skb_get_tx_queue(dev, skb);
|
|
@@ -280,7 +279,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
|
|
|
return ret;
|
|
|
drop:
|
|
|
atomic_long_inc(&dev->tx_dropped);
|
|
|
- kfree_skb(skb);
|
|
|
+ kfree_skb_list(skb);
|
|
|
return NET_XMIT_DROP;
|
|
|
}
|
|
|
|