6lowpan_rtnl: fix fragmentation with two fragments
authorAlexander Aring <alex.aring@gmail.com>
Mon, 2 Jun 2014 11:21:57 +0000 (13:21 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Jun 2014 17:39:42 +0000 (10:39 -0700)
This patch fix the 6LoWPAN fragmentation for the case if we have exactly
two fragments. The problem is that the (skb_unprocessed >= frag_cap)
condition is always false on the second fragment after sending the first
fragment. A fragmentation with only one fragment doesn't make any sense.
The solution is that we use a do while loop here, that ensures we sending
always a minimum of two fragments if we need a fragmentation.

This issue was introduced by commit d4b2816d67d6e07b2f27037f282d8db03a5829d7
("6lowpan: fix fragmentation").

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ieee802154/6lowpan_rtnl.c

index 1ae8a5628fb5b5e188926d8ae7e3d5e747fac092..9d57026fd9d5f017a9d3cdf9b0845984c1466ddd 100644 (file)
@@ -312,7 +312,7 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev,
        frag_hdr[0] |= LOWPAN_DISPATCH_FRAGN;
        frag_cap = round_down(payload_cap - LOWPAN_FRAGN_HEAD_SIZE, 8);
 
-       while (skb_unprocessed >= frag_cap) {
+       do {
                dgram_offset += frag_len;
                skb_offset += frag_len;
                skb_unprocessed -= frag_len;
@@ -328,7 +328,7 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev,
                                 __func__, frag_tag, skb_offset);
                        goto err;
                }
-       }
+       } while (skb_unprocessed >= frag_cap);
 
        consume_skb(skb);
        return NET_XMIT_SUCCESS;