From: Jiri Pirko <jiri@xxxxxxxxxxx> Date: Fri, 8 Nov 2013 08:52:01 +0100 > Fri, Nov 08, 2013 at 12:54:53AM CET, davem@xxxxxxxxxxxxx wrote: >>From: Jiri Pirko <jiri@xxxxxxxxxxx> >>Date: Wed, 6 Nov 2013 17:52:19 +0100 >> >>> 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@xxxxxxxxxxx> >> ... >> >>> 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); >> >>Jiri are you sure that you don't need to take GSO into account in the >>new part you are adding to the test? > > > For gso skb, we need co cap outgoing fragments by the original frag size > as well. So I believe that this code is correct for that case as well. I'm still not so sure I agree, even after having taken a second look at this. Look at ipv4's logic for this same facility: if (skb->len > ip_skb_dst_mtu(skb) && !skb_is_gso(skb)) return ip_fragment(skb, ip_finish_output2); Strictly, we only call ip_fragment() if skb_is_gso() is false. And then in ip_fragment(): if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->local_df) || (IPCB(skb)->frag_max_size && IPCB(skb)->frag_max_size > dst_mtu(&rt->dst)))) { And that second branch of this test is what you're trying to duplicate into ipv6. Perhaps I don't understand completely the intentions and logic of dst_allfrag() in the ipv6 case, and maybe you can explain it to me. -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html