diff options
| author | Patrick McHardy <kaber@trash.net> | 2012-08-26 13:13:55 -0400 |
|---|---|---|
| committer | Patrick McHardy <kaber@trash.net> | 2012-08-26 13:13:55 -0400 |
| commit | 5f2d04f1f9b52604fca6ee08a77972c0df67e082 (patch) | |
| tree | f4caa0aa602f6044f1fc20c6dfa89527183803d1 /include | |
| parent | 0fa7fa98dbcc2789409ed24e885485e645803d7f (diff) | |
ipv4: fix path MTU discovery with connection tracking
IPv4 conntrack defragments incoming packet at the PRE_ROUTING hook and
(in case of forwarded packets) refragments them at POST_ROUTING
independent of the IP_DF flag. Refragmentation uses the dst_mtu() of
the local route without caring about the original fragment sizes,
thereby breaking PMTUD.
This patch fixes this by keeping track of the largest received fragment
with IP_DF set and generates an ICMP fragmentation required error during
refragmentation if that size exceeds the MTU.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Eric Dumazet <edumazet@google.com>
Acked-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/inet_frag.h | 2 | ||||
| -rw-r--r-- | include/net/ip.h | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 2431cf83aeca..5098ee7b7e0e 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h | |||
| @@ -29,6 +29,8 @@ struct inet_frag_queue { | |||
| 29 | #define INET_FRAG_COMPLETE 4 | 29 | #define INET_FRAG_COMPLETE 4 |
| 30 | #define INET_FRAG_FIRST_IN 2 | 30 | #define INET_FRAG_FIRST_IN 2 |
| 31 | #define INET_FRAG_LAST_IN 1 | 31 | #define INET_FRAG_LAST_IN 1 |
| 32 | |||
| 33 | u16 max_size; | ||
| 32 | }; | 34 | }; |
| 33 | 35 | ||
| 34 | #define INETFRAGS_HASHSZ 64 | 36 | #define INETFRAGS_HASHSZ 64 |
diff --git a/include/net/ip.h b/include/net/ip.h index 5a5d84d3d2c6..0707fb9551aa 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -42,6 +42,8 @@ struct inet_skb_parm { | |||
| 42 | #define IPSKB_XFRM_TRANSFORMED 4 | 42 | #define IPSKB_XFRM_TRANSFORMED 4 |
| 43 | #define IPSKB_FRAG_COMPLETE 8 | 43 | #define IPSKB_FRAG_COMPLETE 8 |
| 44 | #define IPSKB_REROUTED 16 | 44 | #define IPSKB_REROUTED 16 |
| 45 | |||
| 46 | u16 frag_max_size; | ||
| 45 | }; | 47 | }; |
| 46 | 48 | ||
| 47 | static inline unsigned int ip_hdrlen(const struct sk_buff *skb) | 49 | static inline unsigned int ip_hdrlen(const struct sk_buff *skb) |
