PERFORCE change 164829 for review
Andre Oppermann
andre at FreeBSD.org
Sun Jun 21 20:31:45 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=164829
Change 164829 by andre at andre_t61 on 2009/06/21 20:31:09
Merge in some fixes to head after the branch point of tcp_new:
svn r178862 jhb
Always bump tcpstat.tcps_badrst if we get a RST for a connection in the
syncache that has an invalid SEQ instead of only doing it when we suceed
in mallocing space for the log message.
svn r179832 ups
Fix a check in SYN cache expansion (syncache_expand()) to accept packets
that arrive in the receive window instead of just on the left edge of the
receive window.
This is needed for correct behavior when packets are lost or reordered.
svn r179833 ups
Change incorrect stale cookie detection in syncookie_lookup() that prematurely
declared a cookie as expired.
Affected files ...
.. //depot/projects/tcp_new/netinet/tcp_syncache.c#2 edit
Differences ...
==== //depot/projects/tcp_new/netinet/tcp_syncache.c#2 (text+ko) ====
@@ -567,10 +567,11 @@
"connection attempt aborted by remote endpoint\n",
s, __func__);
tcpstat.tcps_sc_reset++;
- } else if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
- log(LOG_DEBUG, "%s; %s: RST with invalid SEQ %u != IRS %u "
- "(+WND %u), segment ignored\n",
- s, __func__, th->th_seq, sc->sc_irs, sc->sc_wnd);
+ } else {
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
+ log(LOG_DEBUG, "%s; %s: RST with invalid SEQ %u != "
+ "IRS %u (+WND %u), segment ignored\n",
+ s, __func__, th->th_seq, sc->sc_irs, sc->sc_wnd);
tcpstat.tcps_badrst++;
}
@@ -902,12 +903,14 @@
"rejected\n", s, __func__, th->th_ack, sc->sc_iss);
goto failed;
}
+
/*
- * The SEQ must match the received initial receive sequence
- * number + 1 (the SYN) because we didn't ACK any data that
- * may have come with the SYN.
+ * The SEQ must fall in the window starting at the received
+ * initial receive sequence number + 1 (the SYN).
*/
- if (th->th_seq != sc->sc_irs + 1 && !TOEPCB_ISSET(sc)) {
+ if ((SEQ_LEQ(th->th_seq, sc->sc_irs) ||
+ SEQ_GT(th->th_seq, sc->sc_irs + sc->sc_wnd) &&
+ !TOEPCB_ISSET(sc)) {
if ((s = tcp_log_addrs(inc, th, NULL, NULL)))
log(LOG_DEBUG, "%s; %s: SEQ %u != IRS+1 %u, segment "
"rejected\n", s, __func__, th->th_seq, sc->sc_irs);
@@ -1607,7 +1610,7 @@
* The secret wasn't updated for the lifetime of a syncookie,
* so this SYN-ACK/ACK is either too old (replay) or totally bogus.
*/
- if (sch->sch_reseed < time_uptime) {
+ if (sch->sch_reseed + SYNCOOKIE_LIFETIME < time_uptime) {
return (NULL);
}
More information about the p4-projects
mailing list