]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/ieee802154/6lowpan/tx.c
net: 6lowpan: fix reserved space for single frames
[mirror_ubuntu-bionic-kernel.git] / net / ieee802154 / 6lowpan / tx.c
index e6ff5128e61acf135b7be9071dc06ed2e4fa96b7..ca53efa17be15b78db9e00372b33a9ef0911b47f 100644 (file)
@@ -265,9 +265,24 @@ netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *ldev)
        /* We must take a copy of the skb before we modify/replace the ipv6
         * header as the header could be used elsewhere
         */
-       skb = skb_unshare(skb, GFP_ATOMIC);
-       if (!skb)
-               return NET_XMIT_DROP;
+       if (unlikely(skb_headroom(skb) < ldev->needed_headroom ||
+                    skb_tailroom(skb) < ldev->needed_tailroom)) {
+               struct sk_buff *nskb;
+
+               nskb = skb_copy_expand(skb, ldev->needed_headroom,
+                                      ldev->needed_tailroom, GFP_ATOMIC);
+               if (likely(nskb)) {
+                       consume_skb(skb);
+                       skb = nskb;
+               } else {
+                       kfree_skb(skb);
+                       return NET_XMIT_DROP;
+               }
+       } else {
+               skb = skb_unshare(skb, GFP_ATOMIC);
+               if (!skb)
+                       return NET_XMIT_DROP;
+       }
 
        ret = lowpan_header(skb, ldev, &dgram_size, &dgram_offset);
        if (ret < 0) {