summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorhiren <hiren@FreeBSD.org>2015-10-29 00:36:10 +0000
committerhiren <hiren@FreeBSD.org>2015-10-29 00:36:10 +0000
commit07e8014e2b9f208ef20814cb53a4ee52c9b8332d (patch)
tree5e32e3b47d077210234a8d4793852a2e569d75c6 /sys/netinet
parenta8f2fadc532c88e8b56dba654067af63dc146409 (diff)
downloadFreeBSD-src-07e8014e2b9f208ef20814cb53a4ee52c9b8332d.zip
FreeBSD-src-07e8014e2b9f208ef20814cb53a4ee52c9b8332d.tar.gz
MFC r289293
Fix an unnecessarily aggressive behavior where mtu clamping begins on first retransmission timeout (rto) when blackhole detection is enabled. Make sure it only happens when the second attempt to send the same segment also fails with rto. Also make sure that each mtu probing stage (usually 1448 -> 1188 -> 524) follows the same pattern and gets 2 chances (rto) before further clamping down. Note: RFC4821 doesn't specify implementation details on how this situation should be handled.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/tcp_timer.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 48eb904..3dc3a81 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -617,9 +617,15 @@ tcp_timer_rexmt(void * xtp)
int isipv6;
#endif
+ /*
+ * Idea here is that at each stage of mtu probe (usually, 1448
+ * -> 1188 -> 524) should be given 2 chances to recover before
+ * further clamping down. 'tp->t_rxtshift % 2 == 0' should
+ * take care of that.
+ */
if (((tp->t_flags2 & (TF2_PLPMTU_PMTUD|TF2_PLPMTU_MAXSEGSNT)) ==
(TF2_PLPMTU_PMTUD|TF2_PLPMTU_MAXSEGSNT)) &&
- (tp->t_rxtshift <= 2)) {
+ (tp->t_rxtshift >= 2 && tp->t_rxtshift % 2 == 0)) {
/*
* Enter Path MTU Black-hole Detection mechanism:
* - Disable Path MTU Discovery (IP "DF" bit).
@@ -687,9 +693,11 @@ tcp_timer_rexmt(void * xtp)
* with a lowered MTU, maybe this isn't a blackhole and
* we restore the previous MSS and blackhole detection
* flags.
+ * The limit '6' is determined by giving each probe
+ * stage (1448, 1188, 524) 2 chances to recover.
*/
if ((tp->t_flags2 & TF2_PLPMTU_BLACKHOLE) &&
- (tp->t_rxtshift > 4)) {
+ (tp->t_rxtshift > 6)) {
tp->t_flags2 |= TF2_PLPMTU_PMTUD;
tp->t_flags2 &= ~TF2_PLPMTU_BLACKHOLE;
optlen = tp->t_maxopd - tp->t_maxseg;
OpenPOWER on IntegriCloud