ipv4: use ip_skb_dst_mtu to determine mtu in ip_fragment
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Wed, 26 Feb 2014 00:20:41 +0000 (01:20 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 26 Feb 2014 20:51:00 +0000 (15:51 -0500)
ip_skb_dst_mtu mostly falls back to ip_dst_mtu_maybe_forward if no socket
is attached to the skb (in case of forwarding) or determines the mtu like
we do in ip_finish_output, which actually checks if we should branch to
ip_fragment. Thus use the same function to determine the mtu here, too.

This is important for the introduction of IP_PMTUDISC_OMIT, where we
want the packets getting cut in pieces of the size of the outgoing
interface mtu. IPv6 already does this correctly.

Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_output.c

index 8971780aec7c5fadb4223c0391b05aa9c881ba34..22aa11971ed1e8d208e7bd62966209e049d3f379 100644 (file)
@@ -449,7 +449,6 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
        __be16 not_last_frag;
        struct rtable *rt = skb_rtable(skb);
        int err = 0;
-       bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
 
        dev = rt->dst.dev;
 
@@ -459,7 +458,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
 
        iph = ip_hdr(skb);
 
-       mtu = ip_dst_mtu_maybe_forward(&rt->dst, forwarding);
+       mtu = ip_skb_dst_mtu(skb);
        if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->local_df) ||
                     (IPCB(skb)->frag_max_size &&
                      IPCB(skb)->frag_max_size > mtu))) {