6lowpan: Fix fragmentation with link-local compressed addresses
authorDavid Hauweele <david@hauweele.net>
Fri, 16 Aug 2013 19:59:55 +0000 (21:59 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Aug 2013 20:23:11 +0000 (13:23 -0700)
When a new 6lowpan fragment is received, a skbuff is allocated for
the reassembled packet. However when a 6lowpan packet compresses
link-local addresses based on link-layer addresses, the processing
function relies on the skb mac control block to find the related
link-layer address.

This patch copies the control block from the first fragment into
the newly allocated skb to keep a trace of the link-layer addresses
in case of a link-local compressed address.

Edit: small changes on comment issue

Signed-off-by: David Hauweele <david@hauweele.net>
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Reviewed-by: Werner Almesberger <werner@almesberger.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ieee802154/6lowpan.c

index 92429db0b2373191521559b3d98570fe3a58cf44..632b3fdf46a4f9813d93bd27b2ae55f8c387df27 100644 (file)
@@ -698,6 +698,12 @@ lowpan_alloc_new_frame(struct sk_buff *skb, u16 len, u16 tag)
        skb_reserve(frame->skb, sizeof(struct ipv6hdr));
        skb_put(frame->skb, frame->length);
 
+       /* copy the first control block to keep a
+        * trace of the link-layer addresses in case
+        * of a link-local compressed address
+        */
+       memcpy(frame->skb->cb, skb->cb, sizeof(skb->cb));
+
        init_timer(&frame->timer);
        /* time out is the same as for ipv6 - 60 sec */
        frame->timer.expires = jiffies + LOWPAN_FRAG_TIMEOUT;