summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_input.c
diff options
context:
space:
mode:
authormarkus <markus@openbsd.org>2004-04-12 14:17:55 +0000
committermarkus <markus@openbsd.org>2004-04-12 14:17:55 +0000
commit75a5c79be09ed7eb3f2af96eb9db9934a464a122 (patch)
tree5d036f81c72ee8c4554de450fe5f04e84bd21e51 /sys/netinet/tcp_input.c
parentFix DMA length on complex SGL. Apparantly this fixes the outstanding 1.03.xx mpt firmware issue. From NetBSD pointed out by deraadt@. ok deraadt@, krw@ (diff)
downloadwireguard-openbsd-75a5c79be09ed7eb3f2af96eb9db9934a464a122.tar.xz
wireguard-openbsd-75a5c79be09ed7eb3f2af96eb9db9934a464a122.zip
factor out dropafterack_ratelim code, use ratelimit
for tcps_rcvacktoomuch, too; drop very old ACKs; ok deraadt@
Diffstat (limited to 'sys/netinet/tcp_input.c')
-rw-r--r--sys/netinet/tcp_input.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 8a3b78fe9b6..a3fed0250a1 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_input.c,v 1.159 2004/04/04 17:39:07 deraadt Exp $ */
+/* $OpenBSD: tcp_input.c,v 1.160 2004/04/12 14:17:55 markus Exp $ */
/* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */
/*
@@ -122,9 +122,9 @@ int tcp_rst_ppslim = 100; /* 100pps */
int tcp_rst_ppslim_count = 0;
struct timeval tcp_rst_ppslim_last;
-int tcp_synack_ppslim = 100; /* 100pps */
-int tcp_synack_ppslim_count = 0;
-struct timeval tcp_synack_ppslim_last;
+int tcp_ackdrop_ppslim = 100; /* 100pps */
+int tcp_ackdrop_ppslim_count = 0;
+struct timeval tcp_ackdrop_ppslim_last;
#endif /* TUBA_INCLUDE */
#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ)
@@ -1455,16 +1455,10 @@ trimthenstep6:
/*
* If a SYN is in the window, then this is an
- * error and we send an RST and drop the connection.
+ * error and we ACK and drop the packet.
*/
- if (tiflags & TH_SYN) {
- if (ppsratecheck(&tcp_synack_ppslim_last, &tcp_synack_ppslim_count,
- tcp_synack_ppslim) == 0) {
- /* XXX stat */
- goto drop;
- }
- goto dropafterack;
- }
+ if (tiflags & TH_SYN)
+ goto dropafterack_ratelim;
/*
* If the ACK bit is off we drop the segment and return.
@@ -1565,8 +1559,16 @@ trimthenstep6:
* Window shrinks
* Old ACK
*/
- if (tlen)
+ if (tlen) {
+ /* Drop very old ACKs unless th_seq matches */
+ if (th->th_seq != tp->rcv_nxt &&
+ SEQ_LT(th->th_ack,
+ tp->snd_una - tp->max_sndwnd)) {
+ /* XXX stat */
+ goto drop;
+ }
break;
+ }
/*
* If we get an old ACK, there is probably packet
* reordering going on. Be conservative and reset
@@ -1769,7 +1771,7 @@ trimthenstep6:
#endif
if (SEQ_GT(th->th_ack, tp->snd_max)) {
tcpstat.tcps_rcvacktoomuch++;
- goto dropafterack;
+ goto dropafterack_ratelim;
}
acked = th->th_ack - tp->snd_una;
tcpstat.tcps_rcvackpack++;
@@ -2127,6 +2129,14 @@ badsyn:
tp = NULL;
goto dropwithreset;
+dropafterack_ratelim:
+ if (ppsratecheck(&tcp_ackdrop_ppslim_last, &tcp_ackdrop_ppslim_count,
+ tcp_ackdrop_ppslim) == 0) {
+ /* XXX stat */
+ goto drop;
+ }
+ /* ...fall into dropafterack... */
+
dropafterack:
/*
* Generate an ACK dropping incoming segment if it occupies