More MTU discovery: avoid over-retransmission if route changes in the
middle of a fully-open window. Also, keep track of how many retransmits we do as a result of MTU discovery. This may actually do more work than necessary, but it's an unusual condition... Suggested by: Janey Hoe <janey@lcs.mit.edu>
This commit is contained in:
parent
1448ea7e81
commit
143d7a5499
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95
|
||||
* $Id: tcp_subr.c,v 1.16 1995/09/22 17:43:37 wollman Exp $
|
||||
* $Id: tcp_subr.c,v 1.17 1995/10/03 16:54:15 wollman Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -503,6 +503,8 @@ tcp_mtudisc(inp, errno)
|
||||
offered = taop->tao_mssopt;
|
||||
mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr);
|
||||
mss = min(mss, offered);
|
||||
if (tp->t_maxopd <= mss)
|
||||
return;
|
||||
tp->t_maxopd = mss;
|
||||
|
||||
if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP &&
|
||||
@ -523,15 +525,12 @@ tcp_mtudisc(inp, errno)
|
||||
|
||||
tp->t_maxseg = mss;
|
||||
|
||||
/*
|
||||
* Nudge TCP output. Unfortunately, we have no way to know
|
||||
* which packet that we sent is the failing one, but in the
|
||||
* vast majority of cases we expect that it will be at the
|
||||
* beginning of the window, so this should do the right
|
||||
* thing (I hope).
|
||||
*/
|
||||
tp->snd_nxt = tp->snd_una;
|
||||
tcp_output(tp);
|
||||
if (SEQ_GT(tp->snd_una, tp->t_lastmturesend)) {
|
||||
tcpstat.tcps_mturesent++;
|
||||
tp->t_rtt = 0;
|
||||
tp->snd_nxt = tp->t_lastmturesend = tp->snd_una;
|
||||
tcp_output(tp);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MTUDISC */
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95
|
||||
* $Id: tcp_subr.c,v 1.16 1995/09/22 17:43:37 wollman Exp $
|
||||
* $Id: tcp_subr.c,v 1.17 1995/10/03 16:54:15 wollman Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -503,6 +503,8 @@ tcp_mtudisc(inp, errno)
|
||||
offered = taop->tao_mssopt;
|
||||
mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr);
|
||||
mss = min(mss, offered);
|
||||
if (tp->t_maxopd <= mss)
|
||||
return;
|
||||
tp->t_maxopd = mss;
|
||||
|
||||
if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP &&
|
||||
@ -523,15 +525,12 @@ tcp_mtudisc(inp, errno)
|
||||
|
||||
tp->t_maxseg = mss;
|
||||
|
||||
/*
|
||||
* Nudge TCP output. Unfortunately, we have no way to know
|
||||
* which packet that we sent is the failing one, but in the
|
||||
* vast majority of cases we expect that it will be at the
|
||||
* beginning of the window, so this should do the right
|
||||
* thing (I hope).
|
||||
*/
|
||||
tp->snd_nxt = tp->snd_una;
|
||||
tcp_output(tp);
|
||||
if (SEQ_GT(tp->snd_una, tp->t_lastmturesend)) {
|
||||
tcpstat.tcps_mturesent++;
|
||||
tp->t_rtt = 0;
|
||||
tp->snd_nxt = tp->t_lastmturesend = tp->snd_una;
|
||||
tcp_output(tp);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MTUDISC */
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)tcp_var.h 8.4 (Berkeley) 5/24/95
|
||||
* $Id: tcp_var.h,v 1.17 1995/09/22 07:40:18 peter Exp $
|
||||
* $Id: tcp_var.h,v 1.18 1995/10/04 20:49:03 wollman Exp $
|
||||
*/
|
||||
|
||||
#ifndef _NETINET_TCP_VAR_H_
|
||||
@ -141,6 +141,8 @@ struct tcpcb {
|
||||
caddr_t t_tuba_pcb; /* next level down pcb for TCP over z */
|
||||
/* More RTT stuff */
|
||||
u_long t_rttupdated; /* number of times rtt sampled */
|
||||
/* For MTU discovery */
|
||||
tcp_seq t_lastmturesend; /* seq of resend for mtu discovery */
|
||||
};
|
||||
|
||||
/*
|
||||
@ -287,6 +289,7 @@ struct tcpstat {
|
||||
u_long tcps_usedssthresh; /* times ssthresh initialized from rt*/
|
||||
u_long tcps_persistdrop; /* timeout in persist state */
|
||||
u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */
|
||||
u_long tcps_mturesent; /* resends due to MTU discovery */
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user