提交 51263fff 编写于 作者: A Alexander Aring 提交者: David S. Miller

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: NAlexander Aring <alex.aring@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 86c92ee3
...@@ -312,7 +312,7 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev, ...@@ -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, ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册