diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2014-02-25 19:20:41 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-26 15:51:00 -0500 |
commit | 69647ce46a236a355a7a3096d793819a9bd7c1d3 (patch) | |
tree | 880944e2f3c20030f6e49ad9c9e590157ef738c8 | |
parent | a960ff81f0cd6390940faa75a078ac76acec7940 (diff) |
ipv4: use ip_skb_dst_mtu to determine mtu in ip_fragment
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>
-rw-r--r-- | net/ipv4/ip_output.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 8971780aec7c..22aa11971ed1 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -449,7 +449,6 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
449 | __be16 not_last_frag; | 449 | __be16 not_last_frag; |
450 | struct rtable *rt = skb_rtable(skb); | 450 | struct rtable *rt = skb_rtable(skb); |
451 | int err = 0; | 451 | int err = 0; |
452 | bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED; | ||
453 | 452 | ||
454 | dev = rt->dst.dev; | 453 | dev = rt->dst.dev; |
455 | 454 | ||
@@ -459,7 +458,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
459 | 458 | ||
460 | iph = ip_hdr(skb); | 459 | iph = ip_hdr(skb); |
461 | 460 | ||
462 | mtu = ip_dst_mtu_maybe_forward(&rt->dst, forwarding); | 461 | mtu = ip_skb_dst_mtu(skb); |
463 | if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->local_df) || | 462 | if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->local_df) || |
464 | (IPCB(skb)->frag_max_size && | 463 | (IPCB(skb)->frag_max_size && |
465 | IPCB(skb)->frag_max_size > mtu))) { | 464 | IPCB(skb)->frag_max_size > mtu))) { |