ip6_output: fragment outgoing reassembled skb properly
authorJiri Pirko <jiri@resnulli.us>
Wed, 6 Nov 2013 16:52:19 +0000 (17:52 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Nov 2013 05:19:35 +0000 (00:19 -0500)
If reassembled packet would fit into outdev MTU, it is not fragmented
according the original frag size and it is send as single big packet.

The second case is if skb is gso. In that case fragmentation does not happen
according to the original frag size.

This patch fixes these.

Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6_output.c

index 91fb4e8212f52d434e6d072103f70dbb8d219326..5e31a909a2b0c215df8266a76f28d2d0218e9790 100644 (file)
@@ -125,7 +125,8 @@ static int ip6_finish_output2(struct sk_buff *skb)
 static int ip6_finish_output(struct sk_buff *skb)
 {
        if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) ||
-           dst_allfrag(skb_dst(skb)))
+           dst_allfrag(skb_dst(skb)) ||
+           (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
                return ip6_fragment(skb, ip6_finish_output2);
        else
                return ip6_finish_output2(skb);