PERFORCE change 175592 for review
Andre Oppermann
andre at FreeBSD.org
Thu Mar 11 17:14:43 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=175592
Change 175592 by andre at andre_t61 on 2010/03/11 17:14:33
Update and improve some comments.
Add error handling skeleton to tcp_retransmit().
Affected files ...
.. //depot/projects/tcp_new/netinet/tcp_output.c#16 edit
Differences ...
==== //depot/projects/tcp_new/netinet/tcp_output.c#16 (text+ko) ====
@@ -216,6 +216,7 @@
/*
* Conservative approximation of data still travelling in the network.
+ * XXXAO: Alternative version w/o SACK.
*/
inflight = duna - tp->snd_sacked;
@@ -230,7 +231,7 @@
rwin = tcp_rcv_wnd(tp, so);
/*
- * Act based on the phase we are in.
+ * Act based on the send phase we are in.
*/
switch (tp->t_phase) {
case TP_IDLE:
@@ -411,7 +412,7 @@
goto send;
/*
- * Always send if NODELAY is enabled. This gives at least
+ * Always send if NODELAY is enabled. This causes at least
* one segment per application write no matter how small
* the amount of data.
*/
@@ -555,6 +556,8 @@
/*
* NB: len > 0 means we sent this much data w/o error.
* error == 0 means we sent everything w/o error.
+ * NB: The difference between the three cases is subtle
+ * but important.
*
* XXXAO: Avoid unconditional writes to the tcpcb.
*/
@@ -783,15 +786,10 @@
* Do not retransmit too many times.
* Limit the amount of data that is inflight.
* Retransmit only the stuff that was not SACK'ed.
- */
- /*
- * The moment we receive a duplicate ACK everything freezes.
- * No more new data is sent except for those allowed by limited
- * transmit.
+ *
* The fast recovery algorithms start their work by the third
* duplicate ACK.
- */
- /*
+ *
* We have the following mechanisms:
* 1. Fast recovery: After we get three duplicate ACKs RFC2581
* 2. NewReno RFC3782
@@ -868,6 +866,54 @@
} while (error == 0);
+ if (rlen > 0) {
+ }
+
+ if (error == 0) {
+ }
+
+ if (rlen > 0 || error == 0) {
+ /*
+ * Update last send timestamp.
+ */
+ if ((tp->t_flags & TF_TIMESTAMP) && tp->snd_tslast != to->to_tsval)
+ tp->snd_tslast = to->to_tsval;
+
+ /*
+ * Last ACK we sent.
+ */
+ if (tp->snd_lastack != th->th_ack)
+ tp->snd_lastack = th->th_ack;
+ }
+
+ if (rlen > 0 && error == 0) {
+ }
+
+ switch (error) {
+ case EPERM:
+ case EACCES:
+ break;
+ case ENOBUFS:
+ case ENOMEM:
+ break;
+ case EMSGSIZE:
+ break;
+ case ENETDOWN:
+ case ENETUNREACH:
+ case EHOSTDOWN:
+ case EHOSTUNREACH:
+ break;
+ case 0:
+ /*
+ * No error.
+ */
+ break;
+
+ default:
+ KASSERT(0 == 1,
+ ("%s: unkown error %i", __func__, error));
+ }
+
return (error);
}
@@ -1256,8 +1302,9 @@
/*
* Report shrunk socket buffers.
*/
- if (delta < 0)
+ if (delta < 0) {
/*tcp_log("our receive socket buffer was shrunk")*/;
+ }
/*
* Our current open receive window to be advertized is
@@ -1288,7 +1335,7 @@
/*
* Compute options for segment.
- * We only have to care about SYN and established connection
+ * We only have to care about SYN-SENT and established connection
* segments. Options for SYN-ACK segments are handled in TCP
* syncache. Before ESTABLISHED, force sending of initial options
* unless TCP set not to do any options.
More information about the p4-projects
mailing list