On Mon, Jun 30, 2014 at 09:53:59PM +0100, Tom Jones wrote:
> On Mon, Jun 30, 2014 at 12:29:44PM -0700, Adrian Chadd wrote:
> > Hi!
> > 
> > Cool! Would you mind throwing it into a bugzilla ticket so it's not
> > lost and it can be assigned for some review?
> > 
> > http://bugs.freebsd.org/submit/
> 
> Done.
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191520
> 
> > Is there any benefit in hanging this state off of it as a pointer to
> > some other struct, rather than having it in the tcpcb? Is it always
> > going to be used?
> 
> The draft recommends newcwv be used as a default, so there is a chance it will
> always be around. What would the impact to performance be by moving the state
> out into a struct?

I have updated the patch to move the new variable introduced with newcwv into a
struct within the tcpcb.

-- 
Tom             | I don't see how we are going to build the dystopian megapoli
@adventureloop  | we were promised in 80s and early 90s cyberpunk fiction if
adventurist.me  | you guys keep complaining.

:wq
Index: sys/conf/files
===================================================================
--- sys/conf/files      (revision 269231)
+++ sys/conf/files      (working copy)
@@ -3383,6 +3383,7 @@
 netinet/tcp_sack.c             optional inet | inet6
 netinet/tcp_subr.c             optional inet | inet6
 netinet/tcp_syncache.c         optional inet | inet6
+netinet/tcp_newcwv.c           optional inet | inet6
 netinet/tcp_timer.c            optional inet | inet6
 netinet/tcp_timewait.c         optional inet | inet6
 netinet/tcp_usrreq.c           optional inet | inet6
Index: sys/netinet/tcp_input.c
===================================================================
--- sys/netinet/tcp_input.c     (revision 269231)
+++ sys/netinet/tcp_input.c     (working copy)
@@ -105,6 +105,7 @@
 #include <netinet6/tcp6_var.h>
 #include <netinet/tcpip.h>
 #include <netinet/tcp_syncache.h>
+#include <netinet/tcp_newcwv.h>
 #ifdef TCPDEBUG
 #include <netinet/tcp_debug.h>
 #endif /* TCPDEBUG */
@@ -174,6 +175,11 @@
     &VNET_NAME(tcp_abc_l_var), 2,
     "Cap the max cwnd increment during slow-start to this number of segments");
 
+VNET_DEFINE(int, tcp_do_newcwv) = 0;
+SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, newcwv, CTLFLAG_RW,
+    &VNET_NAME(tcp_do_newcwv), 0,
+    "Enable draft-ietf-tcpm-newcwv-06 (New Congestion Window Validation)");
+
 static SYSCTL_NODE(_net_inet_tcp, OID_AUTO, ecn, CTLFLAG_RW, 0, "TCP ECN");
 
 VNET_DEFINE(int, tcp_do_ecn) = 0;
@@ -285,9 +291,12 @@
        INP_WLOCK_ASSERT(tp->t_inpcb);
 
        tp->ccv->bytes_this_ack = BYTES_THIS_ACK(tp, th);
-       if (tp->snd_cwnd <= tp->snd_wnd)
+       /* draft-ietf-tcpm-newcwv relaxes conditions for growing cwnd */
+       if (tp->snd_cwnd <= tp->snd_wnd || 
+               (V_tcp_do_newcwv && tp->newcwv.pipeack >= (tp->snd_cwnd >> 1)) 
) {
                tp->ccv->flags |= CCF_CWND_LIMITED;
-       else
+               tp->newcwv.cwnd_valid_ts = ticks;
+       } else
                tp->ccv->flags &= ~CCF_CWND_LIMITED;
 
        if (type == CC_ACK) {
@@ -309,6 +318,12 @@
                tp->ccv->curack = th->th_ack;
                CC_ALGO(tp)->ack_received(tp->ccv, type);
        }
+
+       /*
+        * update draft-ietf-newcwv-06 pipeack
+        */
+       if(V_tcp_do_newcwv && !IN_FASTRECOVERY(tp->t_flags))
+               tcp_newcwv_update_pipeack(tp);
 }
 
 static void inline
@@ -378,6 +393,12 @@
                        tp->snd_cwnd = 4 * tp->t_maxseg;
        }
 
+       /* 
+        * Initialise NewCWV state
+        */
+       tp->newcwv.init_cwnd = tp->snd_cwnd;
+       tcp_newcwv_reset(tp);
+
        if (CC_ALGO(tp)->conn_init != NULL)
                CC_ALGO(tp)->conn_init(tp->ccv);
 }
@@ -426,6 +447,11 @@
                tp->t_badrxtwin = 0;
                break;
        }
+       
+       if (V_tcp_do_newcwv && 
+                       (type == CC_NDUPACK || type == CC_ECN) &&
+                               tp->newcwv.pipeack <= (tp->snd_cwnd >> 1) )
+               tcp_newcwv_enter_recovery(tp);
 
        if (CC_ALGO(tp)->cong_signal != NULL) {
                if (th != NULL)
@@ -447,6 +473,13 @@
        }
        /* XXXLAS: EXIT_RECOVERY ? */
        tp->t_bytes_acked = 0;
+
+       if(V_tcp_do_newcwv) {
+               if(tp->newcwv.loss_flight_size)
+                       tcp_newcwv_end_recovery(tp);
+               tcp_newcwv_reset(tp);   
+       }
+       tp->newcwv.loss_flight_size = 0;
 }
 
 #ifdef TCP_SIGNATURE
Index: sys/netinet/tcp_output.c
===================================================================
--- sys/netinet/tcp_output.c    (revision 269231)
+++ sys/netinet/tcp_output.c    (working copy)
@@ -74,6 +74,7 @@
 #include <netinet/tcp_timer.h>
 #include <netinet/tcp_var.h>
 #include <netinet/tcpip.h>
+#include <netinet/tcp_newcwv.h>
 #ifdef TCPDEBUG
 #include <netinet/tcp_debug.h>
 #endif
@@ -691,6 +692,10 @@
 #endif
                hdrlen = sizeof (struct tcpiphdr);
 
+       /* Trigger the newcwv timer */
+       if(V_tcp_do_newcwv)
+               tcp_newcwv_datalim_closedown(tp);
+
        /*
         * Compute options for segment.
         * We only have to care about SYN and established connection
Index: sys/netinet/tcp_subr.c
===================================================================
--- sys/netinet/tcp_subr.c      (revision 269231)
+++ sys/netinet/tcp_subr.c      (working copy)
@@ -800,6 +800,7 @@
                tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP);
        if (V_tcp_do_sack)
                tp->t_flags |= TF_SACK_PERMIT;
+
        TAILQ_INIT(&tp->snd_holes);
        tp->t_inpcb = inp;      /* XXX */
        /*
Index: sys/netinet/tcp_var.h
===================================================================
--- sys/netinet/tcp_var.h       (revision 269231)
+++ sys/netinet/tcp_var.h       (working copy)
@@ -172,6 +172,22 @@
        int     t_sndzerowin;           /* zero-window updates sent */
        u_int   t_badrxtwin;            /* window for retransmit recovery */
        u_char  snd_limited;            /* segments limited transmitted */
+/* NewCWV releated state */
+       struct {
+               u_int32_t pipeack;
+               u_int32_t psp;                  /* pipeack sampling period */
+
+               u_int32_t head;
+               u_int32_t psample[4];   /* pipe ack samples */
+               u_int32_t time_stamp[4];        /* time stamp samples */
+               u_int32_t prev_snd_una;         /* previous snd_una in this 
sampe */
+               u_int32_t prev_snd_nxt;         /* previous snd_nxt in this 
sampe */
+
+               u_int32_t loss_flight_size;     /* flightsize at loss detection 
*/
+               u_int32_t prior_retrans;        /* Retransmission before going 
into FR */
+               u_int32_t cwnd_valid_ts;        /*last time cwnd was found 
valid */
+               u_int32_t init_cwnd;    /* The inital cwnd */
+       } newcwv;
 /* SACK related state */
        int     snd_numholes;           /* number of holes seen by sender */
        TAILQ_HEAD(sackhole_head, sackhole) snd_holes;
@@ -605,6 +621,7 @@
 VNET_DECLARE(int, path_mtu_discovery);
 VNET_DECLARE(int, tcp_do_rfc3465);
 VNET_DECLARE(int, tcp_abc_l_var);
+VNET_DECLARE(int, tcp_do_newcwv);
 #define        V_tcb                   VNET(tcb)
 #define        V_tcbinfo               VNET(tcbinfo)
 #define        V_tcp_mssdflt           VNET(tcp_mssdflt)
@@ -617,6 +634,7 @@
 #define        V_path_mtu_discovery    VNET(path_mtu_discovery)
 #define        V_tcp_do_rfc3465        VNET(tcp_do_rfc3465)
 #define        V_tcp_abc_l_var         VNET(tcp_abc_l_var)
+#define        V_tcp_do_newcwv         VNET(tcp_do_newcwv)
 
 VNET_DECLARE(int, tcp_do_sack);                        /* SACK 
enabled/disabled */
 VNET_DECLARE(int, tcp_sc_rst_sock_fail);       /* RST on sock alloc failure */
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to