|
@@ -358,6 +358,20 @@ netdev_tx_t i2400m_hard_start_xmit(struct sk_buff *skb,
|
|
|
int result;
|
|
|
|
|
|
d_fnstart(3, dev, "(skb %p net_dev %p)\n", skb, net_dev);
|
|
|
+ if (skb_header_cloned(skb)) {
|
|
|
+ /*
|
|
|
+ * Make tcpdump/wireshark happy -- if they are
|
|
|
+ * running, the skb is cloned and we will overwrite
|
|
|
+ * the mac fields in i2400m_tx_prep_header. Expand
|
|
|
+ * seems to fix this...
|
|
|
+ */
|
|
|
+ result = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
|
|
|
+ if (result) {
|
|
|
+ result = NETDEV_TX_BUSY;
|
|
|
+ goto error_expand;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (i2400m->state == I2400M_SS_IDLE)
|
|
|
result = i2400m_net_wake_tx(i2400m, net_dev, skb);
|
|
|
else
|
|
@@ -368,10 +382,11 @@ netdev_tx_t i2400m_hard_start_xmit(struct sk_buff *skb,
|
|
|
net_dev->stats.tx_packets++;
|
|
|
net_dev->stats.tx_bytes += skb->len;
|
|
|
}
|
|
|
+ result = NETDEV_TX_OK;
|
|
|
+error_expand:
|
|
|
kfree_skb(skb);
|
|
|
-
|
|
|
- d_fnend(3, dev, "(skb %p net_dev %p)\n", skb, net_dev);
|
|
|
- return NETDEV_TX_OK;
|
|
|
+ d_fnend(3, dev, "(skb %p net_dev %p) = %d\n", skb, net_dev, result);
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
|