diff options
author | Eric Dumazet <edumazet@google.com> | 2012-07-23 03:48:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-23 03:58:46 -0400 |
commit | 563d34d05786263893ba4a1042eb9b9374127cf5 (patch) | |
tree | e9ce502c1f32bea966c81d5597d0a29eb4b9d244 /include/net/sock.h | |
parent | c3def943c7117d42caaed3478731ea7c3c87190e (diff) |
tcp: dont drop MTU reduction indications
ICMP messages generated in output path if frame length is bigger than
mtu are actually lost because socket is owned by user (doing the xmit)
One example is the ipgre_tunnel_xmit() calling
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
We had a similar case fixed in commit a34a101e1e6 (ipv6: disable GSO on
sockets hitting dst_allfrag).
Problem of such fix is that it relied on retransmit timers, so short tcp
sessions paid a too big latency increase price.
This patch uses the tcp_release_cb() infrastructure so that MTU
reduction messages (ICMP messages) are not lost, and no extra delay
is added in TCP transmits.
Reported-by: Maciej Żenczykowski <maze@google.com>
Diagnosed-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Nandita Dukkipati <nanditad@google.com>
Cc: Tom Herbert <therbert@google.com>
Cc: Tore Anderson <tore@fud.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sock.h')
-rw-r--r-- | include/net/sock.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 88de092df50f..e067f8c18f88 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -859,6 +859,7 @@ struct proto { | |||
859 | struct sk_buff *skb); | 859 | struct sk_buff *skb); |
860 | 860 | ||
861 | void (*release_cb)(struct sock *sk); | 861 | void (*release_cb)(struct sock *sk); |
862 | void (*mtu_reduced)(struct sock *sk); | ||
862 | 863 | ||
863 | /* Keeping track of sk's, looking them up, and port selection methods. */ | 864 | /* Keeping track of sk's, looking them up, and port selection methods. */ |
864 | void (*hash)(struct sock *sk); | 865 | void (*hash)(struct sock *sk); |