diff options
| -rw-r--r-- | src/lib/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/lib/config.h.in | 1 | ||||
| -rw-r--r-- | src/lib/timerwheel.c | 18 | 
3 files changed, 9 insertions, 12 deletions
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 4f7d5d18..196bb905 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -200,6 +200,8 @@ set(FRCT_LINUX_RTT_ESTIMATOR TRUE CACHE BOOL    "Use Linux RTT estimator formula instead of the TCP RFC formula")  set(FRCT_RTO_MDEV_MULTIPLIER 2 CACHE STRING    "Multiplier for deviation term in the RTO: RTO = sRTT + (mdev << X)") +set(FRCT_RTO_INC_FACTOR 0 CACHE STRING +  "Divisor for RTO increase after timeout: RTO += RTX >> X, 0: Karn/Partridge")  set(FRCT_RTO_MIN 250 CACHE STRING    "Minimum Retransmission Timeout (RTO) for FRCT (us)")  set(FRCT_TICK_TIME 5000 CACHE STRING diff --git a/src/lib/config.h.in b/src/lib/config.h.in index e413a0c9..fd54dcd8 100644 --- a/src/lib/config.h.in +++ b/src/lib/config.h.in @@ -76,6 +76,7 @@  #define RQ_SIZE             (@FRCT_REORDER_QUEUE_SIZE@)  #define START_WINDOW        (@FRCT_START_WINDOW@)  #define RTO_MIN             (@FRCT_RTO_MIN@ * 1000) +#define RTO_DIV             (@FRCT_RTO_INC_FACTOR@)  #define MDEV_MUL            (@FRCT_RTO_MDEV_MULTIPLIER@)  #define TICTIME             (@FRCT_TICK_TIME@ * 1000)        /* ns */ diff --git a/src/lib/timerwheel.c b/src/lib/timerwheel.c index f30f867d..cf4e1eef 100644 --- a/src/lib/timerwheel.c +++ b/src/lib/timerwheel.c @@ -36,7 +36,6 @@ struct rxm {          struct frct_pci *    pkt;          size_t               len;          time_t               t0;      /* Time when original was sent (us). */ -        size_t               mul;     /* RTO multiplier.                   */          struct frcti *       frcti;          int                  fd;          int                  flow_id; /* Prevent rtx when fd reused.       */ @@ -166,9 +165,7 @@ static void timerwheel_move(void)                                  struct flow *        f;                                  uint32_t             snd_lwe;                                  uint32_t             rcv_lwe; -                                time_t               rto;                                  size_t               lvl = 0; -                                time_t               act;                                  r = list_entry(p, struct rxm, next); @@ -188,8 +185,6 @@ static void timerwheel_move(void)                                  snd_lwe = snd_cr->lwe;                                  rcv_lwe = rcv_cr->lwe; -                                rto     = r->frcti->rto; -                                act     = ts_to_ns(r->frcti->rcv_cr.act);                                  pthread_rwlock_unlock(&r->frcti->lock); @@ -203,20 +198,20 @@ static void timerwheel_move(void)                                  pthread_rwlock_wrlock(&r->frcti->lock); -                                if (r->frcti->probe -                                    && (r->frcti->rttseq == r->seqno)) +                                if (r->seqno == r->frcti->rttseq) { +                                        r->frcti->rto += +                                                f->frcti->rto >> RTO_DIV;                                          r->frcti->probe = false; +                                }  #ifdef PROC_FLOW_STATS                                  r->frcti->n_rtx++;  #endif -                                pthread_rwlock_unlock(&r->frcti->lock); +                                rslot = r->frcti->rto >> RXMQ_RES; -                                if (ts_to_ns(now) - act > (rto << 2)) -                                        rto <<= r->mul++; +                                pthread_rwlock_unlock(&r->frcti->lock);                                  /* Schedule at least in the next time slot. */                                  slot = ts_to_ns(now) >> RXMQ_RES; -                                rslot = rto >> RXMQ_RES;                                  while (rslot >= RXMQ_SLOTS) {                                          ++lvl; @@ -326,7 +321,6 @@ static int timerwheel_rxm(struct frcti *       frcti,          clock_gettime(PTHREAD_COND_CLOCK, &now);          r->t0    = ts_to_ns(now); -        r->mul   = 0;          r->seqno = seqno;          r->frcti = frcti;          r->len  = shm_du_buff_len(sdb);  | 
