summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1998-02-26 05:25:39 +0000
committerdg <dg@FreeBSD.org>1998-02-26 05:25:39 +0000
commitabb797303f8a1c9c501930df5cee82ba24bbc3a0 (patch)
tree2bf0c4efd8152c6a21a48ea92b5cf87806d4eb6c
parent0712ea24bf42cbaa2e009b77c3560d846ac133ea (diff)
downloadFreeBSD-src-abb797303f8a1c9c501930df5cee82ba24bbc3a0.zip
FreeBSD-src-abb797303f8a1c9c501930df5cee82ba24bbc3a0.tar.gz
Changes to support the addition of a new sysctl variable:
net.inet.tcp.delack_enabled Which defaults to 1 and can be set to 0 to disable TCP delayed-ack processing (i.e. all acks are immediate).
-rw-r--r--sys/netinet/tcp_input.c34
-rw-r--r--sys/netinet/tcp_reass.c34
-rw-r--r--sys/netinet/tcp_timer.c23
-rw-r--r--sys/netinet/tcp_var.h3
4 files changed, 46 insertions, 48 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index a8c15cd..24740ef 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $Id: tcp_input.c,v 1.68 1998/01/21 02:05:59 fenner Exp $
+ * $Id: tcp_input.c,v 1.69 1998/01/27 09:15:08 davidg Exp $
*/
#include "opt_tcpdebug.h"
@@ -82,6 +82,10 @@ static int log_in_vain = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, log_in_vain, CTLFLAG_RW,
&log_in_vain, 0, "");
+int tcp_delack_enabled = 1;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, delack_enabled, CTLFLAG_RW,
+ &tcp_delack_enabled, 0, "");
+
u_long tcp_now;
struct inpcbhead tcb;
struct inpcbinfo tcbinfo;
@@ -109,7 +113,10 @@ static void tcp_xmit_timer __P((struct tcpcb *, int));
if ((ti)->ti_seq == (tp)->rcv_nxt && \
(tp)->seg_next == (struct tcpiphdr *)(tp) && \
(tp)->t_state == TCPS_ESTABLISHED) { \
- tp->t_flags |= TF_DELACK; \
+ if (tcp_delack_enabled) \
+ tp->t_flags |= TF_DELACK; \
+ else \
+ tp->t_flags |= TF_ACKNOW; \
(tp)->rcv_nxt += (ti)->ti_len; \
flags = (ti)->ti_flags & TH_FIN; \
tcpstat.tcps_rcvpack++;\
@@ -558,21 +565,12 @@ findpcb:
*/
sbappend(&so->so_rcv, m);
sorwakeup(so);
-#ifdef TCP_ACK_HACK
- /*
- * If this is a short packet, then ACK now - with Nagel
- * congestion avoidance sender won't send more until
- * he gets an ACK.
- */
- if (tiflags & TH_PUSH) {
+ if (tcp_delack_enabled) {
+ tp->t_flags |= TF_DELACK;
+ } else {
tp->t_flags |= TF_ACKNOW;
tcp_output(tp);
- } else {
- tp->t_flags |= TF_DELACK;
}
-#else
- tp->t_flags |= TF_DELACK;
-#endif
return;
}
}
@@ -697,8 +695,8 @@ findpcb:
* segment. Otherwise must send ACK now in case
* the other side is slow starting.
*/
- if ((tiflags & TH_FIN) || (ti->ti_len != 0 &&
- in_localaddr(inp->inp_faddr)))
+ if (tcp_delack_enabled && ((tiflags & TH_FIN) || (ti->ti_len != 0 &&
+ in_localaddr(inp->inp_faddr))))
tp->t_flags |= (TF_DELACK | TF_NEEDSYN);
else
tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN);
@@ -834,7 +832,7 @@ findpcb:
* If there's data, delay ACK; if there's also a FIN
* ACKNOW will be turned on later.
*/
- if (ti->ti_len != 0)
+ if (tcp_delack_enabled && ti->ti_len != 0)
tp->t_flags |= TF_DELACK;
else
tp->t_flags |= TF_ACKNOW;
@@ -1576,7 +1574,7 @@ dodata: /* XXX */
* Otherwise, since we received a FIN then no
* more input can be expected, send ACK now.
*/
- if (tp->t_flags & TF_NEEDSYN)
+ if (tcp_delack_enabled && (tp->t_flags & TF_NEEDSYN))
tp->t_flags |= TF_DELACK;
else
tp->t_flags |= TF_ACKNOW;
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index a8c15cd..24740ef 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $Id: tcp_input.c,v 1.68 1998/01/21 02:05:59 fenner Exp $
+ * $Id: tcp_input.c,v 1.69 1998/01/27 09:15:08 davidg Exp $
*/
#include "opt_tcpdebug.h"
@@ -82,6 +82,10 @@ static int log_in_vain = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, log_in_vain, CTLFLAG_RW,
&log_in_vain, 0, "");
+int tcp_delack_enabled = 1;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, delack_enabled, CTLFLAG_RW,
+ &tcp_delack_enabled, 0, "");
+
u_long tcp_now;
struct inpcbhead tcb;
struct inpcbinfo tcbinfo;
@@ -109,7 +113,10 @@ static void tcp_xmit_timer __P((struct tcpcb *, int));
if ((ti)->ti_seq == (tp)->rcv_nxt && \
(tp)->seg_next == (struct tcpiphdr *)(tp) && \
(tp)->t_state == TCPS_ESTABLISHED) { \
- tp->t_flags |= TF_DELACK; \
+ if (tcp_delack_enabled) \
+ tp->t_flags |= TF_DELACK; \
+ else \
+ tp->t_flags |= TF_ACKNOW; \
(tp)->rcv_nxt += (ti)->ti_len; \
flags = (ti)->ti_flags & TH_FIN; \
tcpstat.tcps_rcvpack++;\
@@ -558,21 +565,12 @@ findpcb:
*/
sbappend(&so->so_rcv, m);
sorwakeup(so);
-#ifdef TCP_ACK_HACK
- /*
- * If this is a short packet, then ACK now - with Nagel
- * congestion avoidance sender won't send more until
- * he gets an ACK.
- */
- if (tiflags & TH_PUSH) {
+ if (tcp_delack_enabled) {
+ tp->t_flags |= TF_DELACK;
+ } else {
tp->t_flags |= TF_ACKNOW;
tcp_output(tp);
- } else {
- tp->t_flags |= TF_DELACK;
}
-#else
- tp->t_flags |= TF_DELACK;
-#endif
return;
}
}
@@ -697,8 +695,8 @@ findpcb:
* segment. Otherwise must send ACK now in case
* the other side is slow starting.
*/
- if ((tiflags & TH_FIN) || (ti->ti_len != 0 &&
- in_localaddr(inp->inp_faddr)))
+ if (tcp_delack_enabled && ((tiflags & TH_FIN) || (ti->ti_len != 0 &&
+ in_localaddr(inp->inp_faddr))))
tp->t_flags |= (TF_DELACK | TF_NEEDSYN);
else
tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN);
@@ -834,7 +832,7 @@ findpcb:
* If there's data, delay ACK; if there's also a FIN
* ACKNOW will be turned on later.
*/
- if (ti->ti_len != 0)
+ if (tcp_delack_enabled && ti->ti_len != 0)
tp->t_flags |= TF_DELACK;
else
tp->t_flags |= TF_ACKNOW;
@@ -1576,7 +1574,7 @@ dodata: /* XXX */
* Otherwise, since we received a FIN then no
* more input can be expected, send ACK now.
*/
- if (tp->t_flags & TF_NEEDSYN)
+ if (tcp_delack_enabled && (tp->t_flags & TF_NEEDSYN))
tp->t_flags |= TF_DELACK;
else
tp->t_flags |= TF_ACKNOW;
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index f13f8a1..ac1dedb 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_timer.c 8.2 (Berkeley) 5/24/95
- * $Id: tcp_timer.c,v 1.24 1997/09/16 18:36:06 joerg Exp $
+ * $Id: tcp_timer.c,v 1.25 1998/01/25 04:23:33 eivind Exp $
*/
#include "opt_compat.h"
@@ -100,18 +100,19 @@ tcp_fasttimo()
register struct tcpcb *tp;
int s;
- s = splnet();
-
- for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) {
- if ((tp = (struct tcpcb *)inp->inp_ppcb) &&
- (tp->t_flags & TF_DELACK)) {
- tp->t_flags &= ~TF_DELACK;
- tp->t_flags |= TF_ACKNOW;
- tcpstat.tcps_delack++;
- (void) tcp_output(tp);
+ if (tcp_delack_enabled) {
+ s = splnet();
+ for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) {
+ if ((tp = (struct tcpcb *)inp->inp_ppcb) &&
+ (tp->t_flags & TF_DELACK)) {
+ tp->t_flags &= ~TF_DELACK;
+ tp->t_flags |= TF_ACKNOW;
+ tcpstat.tcps_delack++;
+ (void) tcp_output(tp);
+ }
}
+ splx(s);
}
- splx(s);
}
/*
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index e1bc97f..71f58073 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_var.h 8.4 (Berkeley) 5/24/95
- * $Id: tcp_var.h,v 1.39 1997/04/27 20:01:15 wollman Exp $
+ * $Id: tcp_var.h,v 1.40 1998/01/27 09:15:12 davidg Exp $
*/
#ifndef _NETINET_TCP_VAR_H_
@@ -324,6 +324,7 @@ extern struct inpcbinfo tcbinfo;
extern struct tcpstat tcpstat; /* tcp statistics */
extern int tcp_mssdflt; /* XXX */
extern u_long tcp_now; /* for RFC 1323 timestamps */
+extern int tcp_delack_enabled;
void tcp_canceltimers __P((struct tcpcb *));
struct tcpcb *
OpenPOWER on IntegriCloud