mirror of https://gitee.com/openkylin/linux.git
net: 6lowpan: fix reserved space for single frames
This patch fixes patch add handling to take care tail and headroom for single 6lowpan frames. We need to be sure we have a skb with the right head and tailroom for single frames. This patch do it by using skb_copy_expand() if head and tailroom is not enough allocated by upper layer. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=195059 Reported-by: David Palma <david.palma@ntnu.no> Reported-by: Rabi Narayan Sahoo <rabinarayans0828@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Alexander Aring <aring@mojatatu.com> Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
This commit is contained in:
parent
a304610803
commit
ac74f87c78
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue