On Thu, 25 Jan 2001, Garrett Wollman wrote: > <<On Thu, 25 Jan 2001 00:25:10 -0800, jayanth <[EMAIL PROTECTED]> said: > > > could you test this patch and compare the results. > > By generating an ACK for every segment with the TH_PSH flag set > > I found a significant increase in throughput. > > I don't think this is right. I don't think it is either -- trying it with the rmt(8) results in each mss packet geting it's own ACK, which is the same behaviour as turning of delayed acks all together. This morning I came up with this patch, which *seems* to have solved both problems: 1) the rmt(8) problem Bruce wrote about and 2) my problem with the Solaris <-> FreeBSD problem I was experiencing. Thing is, I'm no TCP expert, and I am way out of my league on this. In fact, I'm certain it breaks something (for one the delayed ack counter no longer runs up, hmmm, and a few connections will stall), but maybe it's a start. Whatever happened to TF_DELACK anyway? -Paul.
Index: tcp_input.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v retrieving revision 1.121 diff -u -r1.121 tcp_input.c --- tcp_input.c 2000/12/15 21:45:49 1.121 +++ tcp_input.c 2001/01/25 17:36:21 @@ -178,9 +178,14 @@ if ((th)->th_seq == (tp)->rcv_nxt && \ LIST_EMPTY(&(tp)->t_segq) && \ (tp)->t_state == TCPS_ESTABLISHED) { \ - if (tcp_delack_enabled) \ - callout_reset(tp->tt_delack, tcp_delacktime, \ - tcp_timer_delack, tp); \ + if (tcp_delack_enabled) { \ + if (th->th_flags & TH_PUSH) { \ + tp->t_flags |= TF_ACKNOW; \ + callout_reset(tp->tt_delack, tcp_delacktime, +tcp_timer_delack, tp); \ + } \ + else \ + tp->t_flags |= TF_DELACK; \ + } \ else \ tp->t_flags |= TF_ACKNOW; \ (tp)->rcv_nxt += *(tlenp); \ @@ -967,8 +972,13 @@ sbappend(&so->so_rcv, m); sorwakeup(so); if (tcp_delack_enabled) { - callout_reset(tp->tt_delack, tcp_delacktime, - tcp_timer_delack, tp); + if (th->th_flags & TH_PUSH) { + tp->t_flags |= TF_ACKNOW; + callout_reset(tp->tt_delack, tcp_delacktime, + tcp_timer_delack, tp); + } + else + tp->t_flags |= TF_DELACK; } else { tp->t_flags |= TF_ACKNOW; tcp_output(tp); Index: tcp_output.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/tcp_output.c,v retrieving revision 1.48 diff -u -r1.48 tcp_output.c --- tcp_output.c 2000/10/27 11:45:41 1.48 +++ tcp_output.c 2001/01/25 17:36:21 @@ -913,7 +913,7 @@ if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) tp->rcv_adv = tp->rcv_nxt + win; tp->last_ack_sent = tp->rcv_nxt; - tp->t_flags &= ~TF_ACKNOW; + tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); if (tcp_delack_enabled) callout_stop(tp->tt_delack); if (sendalot && (!tcp_do_newreno || --maxburst)) Index: tcp_timer.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/tcp_timer.c,v retrieving revision 1.39 diff -u -r1.39 tcp_timer.c --- tcp_timer.c 2000/10/02 15:00:13 1.39 +++ tcp_timer.c 2001/01/25 17:36:21 @@ -173,11 +173,13 @@ splx(s); return; } - callout_deactivate(tp->tt_delack); - - tp->t_flags |= TF_ACKNOW; - tcpstat.tcps_delack++; - (void) tcp_output(tp); + if (tp->t_flags & TF_DELACK) { + callout_deactivate(tp->tt_delack); + tp->t_flags &= ~TF_DELACK; + tp->t_flags |= TF_ACKNOW; + tcpstat.tcps_delack++; + (void) tcp_output(tp); + } splx(s); }