tcp: fix handling of TCP RST segments missing timestamps
A TCP RST segment should be processed even it is missing TCP timestamps. Reported by: dmgk@, kevans@ Reviewed by: rscheff@, dmgk@ Sponsored by: Netflix, Inc. MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D28143
This commit is contained in:
parent
03cab14ea3
commit
cc3c34859e
@ -1692,16 +1692,25 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
/*
|
||||
* If timestamps were negotiated during SYN/ACK and a
|
||||
* segment without a timestamp is received, silently drop
|
||||
* the segment.
|
||||
* the segment, unless it is a RST segment.
|
||||
* See section 3.2 of RFC 7323.
|
||||
*/
|
||||
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, "
|
||||
"segment silently dropped\n", s, __func__);
|
||||
free(s, M_TCPLOG);
|
||||
if ((thflags & TH_RST) != 0) {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp missing, "
|
||||
"segment processed normally\n",
|
||||
s, __func__);
|
||||
free(s, M_TCPLOG);
|
||||
}
|
||||
} else {
|
||||
if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
|
||||
log(LOG_DEBUG, "%s; %s: Timestamp missing, "
|
||||
"segment silently dropped\n", s, __func__);
|
||||
free(s, M_TCPLOG);
|
||||
}
|
||||
goto drop;
|
||||
}
|
||||
goto drop;
|
||||
}
|
||||
/*
|
||||
* If timestamps were not negotiated during SYN/ACK and a
|
||||
|
@ -11463,10 +11463,11 @@ bbr_do_segment_nounlock(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
/*
|
||||
* If timestamps were negotiated during SYN/ACK and a
|
||||
* segment without a timestamp is received, silently drop
|
||||
* the segment.
|
||||
* the segment, unless it is a RST segment.
|
||||
* See section 3.2 of RFC 7323.
|
||||
*/
|
||||
if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS)) {
|
||||
if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS) &&
|
||||
((thflags & TH_RST) == 0)) {
|
||||
retval = 0;
|
||||
goto done_with_input;
|
||||
}
|
||||
|
@ -10879,10 +10879,11 @@ rack_do_segment_nounlock(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
/*
|
||||
* If timestamps were negotiated during SYN/ACK and a
|
||||
* segment without a timestamp is received, silently drop
|
||||
* the segment.
|
||||
* the segment, unless it is a RST segment.
|
||||
* See section 3.2 of RFC 7323.
|
||||
*/
|
||||
if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS)) {
|
||||
if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS) &&
|
||||
((thflags & TH_RST) == 0)) {
|
||||
way_out = 5;
|
||||
retval = 0;
|
||||
goto done_with_input;
|
||||
|
Loading…
Reference in New Issue
Block a user