|
@@ -249,7 +249,6 @@ drop:
|
|
|
*/
|
|
|
static netdev_tx_t bpq_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
{
|
|
|
- struct sk_buff *newskb;
|
|
|
unsigned char *ptr;
|
|
|
struct bpqdev *bpq;
|
|
|
int size;
|
|
@@ -263,28 +262,23 @@ static netdev_tx_t bpq_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
return NETDEV_TX_OK;
|
|
|
}
|
|
|
|
|
|
- skb_pull(skb, 1);
|
|
|
+ skb_pull(skb, 1); /* Drop KISS byte */
|
|
|
size = skb->len;
|
|
|
|
|
|
/*
|
|
|
- * The AX.25 code leaves enough room for the ethernet header, but
|
|
|
- * sendto() does not.
|
|
|
+ * We're about to mess with the skb which may still shared with the
|
|
|
+ * generic networking code so unshare and ensure it's got enough
|
|
|
+ * space for the BPQ headers.
|
|
|
*/
|
|
|
- if (skb_headroom(skb) < AX25_BPQ_HEADER_LEN) { /* Ough! */
|
|
|
- if ((newskb = skb_realloc_headroom(skb, AX25_BPQ_HEADER_LEN)) == NULL) {
|
|
|
- printk(KERN_WARNING "bpqether: out of memory\n");
|
|
|
- kfree_skb(skb);
|
|
|
- return NETDEV_TX_OK;
|
|
|
- }
|
|
|
-
|
|
|
- if (skb->sk != NULL)
|
|
|
- skb_set_owner_w(newskb, skb->sk);
|
|
|
-
|
|
|
+ if (skb_cow(skb, AX25_BPQ_HEADER_LEN)) {
|
|
|
+ if (net_ratelimit())
|
|
|
+ pr_err("bpqether: out of memory\n");
|
|
|
kfree_skb(skb);
|
|
|
- skb = newskb;
|
|
|
+
|
|
|
+ return NETDEV_TX_OK;
|
|
|
}
|
|
|
|
|
|
- ptr = skb_push(skb, 2);
|
|
|
+ ptr = skb_push(skb, 2); /* Make space for length */
|
|
|
|
|
|
*ptr++ = (size + 5) % 256;
|
|
|
*ptr++ = (size + 5) / 256;
|