Extend debug logging of TCP timestamp related specification
violations. Update related comments and style.
This commit is contained in:
parent
3334a61716
commit
07dacf031e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253150
@ -1446,6 +1446,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
int thflags, acked, ourfinisacked, needoutput = 0;
|
||||
int rstreason, todrop, win;
|
||||
u_long tiwin;
|
||||
char *s;
|
||||
struct in_conninfo *inc;
|
||||
struct tcpopt to;
|
||||
|
||||
#ifdef TCPDEBUG
|
||||
@ -1458,6 +1460,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
short ostate = 0;
|
||||
#endif
|
||||
thflags = th->th_flags;
|
||||
inc = &tp->t_inpcb->inp_inc;
|
||||
tp->sackhint.last_sack_ack = 0;
|
||||
|
||||
/*
|
||||
@ -1546,6 +1549,24 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
if (TSTMP_GT(to.to_tsecr, tcp_ts_getticks()))
|
||||
to.to_tsecr = 0;
|
||||
}
|
||||
/*
|
||||
* If timestamps were negotiated during SYN/ACK they should
|
||||
* appear on every segment during this session and vice versa.
|
||||
*/
|
||||
if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS)) {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp missing, "
|
||||
"no action\n", s, __func__);
|
||||
free(s, M_TCPLOG);
|
||||
}
|
||||
}
|
||||
if (!(tp->t_flags & TF_RCVD_TSTMP) && (to.to_flags & TOF_TS)) {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp not expected, "
|
||||
"no action\n", s, __func__);
|
||||
free(s, M_TCPLOG);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Process options only when we get SYN/ACK back. The SYN case
|
||||
@ -2213,15 +2234,14 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
*/
|
||||
if ((so->so_state & SS_NOFDREF) &&
|
||||
tp->t_state > TCPS_CLOSE_WAIT && tlen) {
|
||||
char *s;
|
||||
|
||||
KASSERT(ti_locked == TI_WLOCKED, ("%s: SS_NOFDEREF && "
|
||||
"CLOSE_WAIT && tlen ti_locked %d", __func__, ti_locked));
|
||||
INP_INFO_WLOCK_ASSERT(&V_tcbinfo);
|
||||
|
||||
if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: %s: Received %d bytes of data after socket "
|
||||
"was closed, sending RST and removing tcpcb\n",
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: %s: Received %d bytes of data "
|
||||
"after socket was closed, "
|
||||
"sending RST and removing tcpcb\n",
|
||||
s, __func__, tcpstates[tp->t_state], tlen);
|
||||
free(s, M_TCPLOG);
|
||||
}
|
||||
|
@ -992,12 +992,29 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
* If timestamps were not negotiated during SYN/ACK they
|
||||
* must not appear on any segment during this session.
|
||||
*/
|
||||
if (!(sc->sc_flags & SCF_TIMESTAMP) && (to->to_flags & TOF_TS)) {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL)))
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp not expected, "
|
||||
"segment rejected\n", s, __func__);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
* If timestamps were negotiated during SYN/ACK they should
|
||||
* appear on every segment during this session.
|
||||
* XXXAO: This is only informal as there have been unverified
|
||||
* reports of non-compliants stacks.
|
||||
*/
|
||||
if ((sc->sc_flags & SCF_TIMESTAMP) && !(to->to_flags & TOF_TS)) {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL)))
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp missing, "
|
||||
"no action\n", s, __func__);
|
||||
}
|
||||
|
||||
/*
|
||||
* If timestamps were negotiated the reflected timestamp
|
||||
* must be equal to what we actually sent in the SYN|ACK.
|
||||
|
Loading…
Reference in New Issue
Block a user