Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51263fff authored by Alexander Aring's avatar Alexander Aring Committed by David S. Miller
Browse files

6lowpan_rtnl: fix fragmentation with two fragments



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 d4b2816d
("6lowpan: fix fragmentation").

Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 86c92ee3
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -312,7 +312,7 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev,
	frag_hdr[0] |= LOWPAN_DISPATCH_FRAGN;
	frag_hdr[0] |= LOWPAN_DISPATCH_FRAGN;
	frag_cap = round_down(payload_cap - LOWPAN_FRAGN_HEAD_SIZE, 8);
	frag_cap = round_down(payload_cap - LOWPAN_FRAGN_HEAD_SIZE, 8);


	while (skb_unprocessed >= frag_cap) {
	do {
		dgram_offset += frag_len;
		dgram_offset += frag_len;
		skb_offset += frag_len;
		skb_offset += frag_len;
		skb_unprocessed -= 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);
				 __func__, frag_tag, skb_offset);
			goto err;
			goto err;
		}
		}
	}
	} while (skb_unprocessed >= frag_cap);


	consume_skb(skb);
	consume_skb(skb);
	return NET_XMIT_SUCCESS;
	return NET_XMIT_SUCCESS;