tcp: improve rate estimate
[vpp.git] / src / plugins / unittest / tcp_test.c
index e604884..6f765e7 100644 (file)
@@ -786,6 +786,14 @@ tbt_seq_lt (u32 a, u32 b)
   return seq_lt (a, b);
 }
 
+static inline int
+approx_equal (u32 a, u32 b)
+{
+  if (b > 0.99 * a && b < 1.01 * a)
+    return 1;
+  return 0;
+}
+
 static int
 tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
 {
@@ -794,7 +802,7 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
   tcp_connection_t _tc, *tc = &_tc;
   sack_scoreboard_t *sb = &tc->sack_sb;
   int __clib_unused verbose = 0, i;
-  u64 rate = 100, burst = 100;
+  u64 rate = 1000, burst = 100;
   sack_block_t *sacks = 0;
   tcp_byte_tracker_t *bt;
   rb_node_t *root, *rbn;
@@ -849,10 +857,11 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
   TCP_TEST (pool_elts (bt->samples) == 0, "sample should've been consumed");
   TCP_TEST (tc->delivered_time == 2, "delivered time should be 2");
   TCP_TEST (tc->delivered == burst, "delivered should be 100");
-  TCP_TEST (rs->ack_time == 1, "ack time should be 1");
+  TCP_TEST (rs->interval_time == 1, "ack time should be 1");
   TCP_TEST (rs->delivered == burst, "delivered should be 100");
-  TCP_TEST (rs->sample_delivered == 0, "sample delivered should be 0");
-  TCP_TEST (rs->tx_rate == rate, "delivered should be %u", rate);
+  TCP_TEST (rs->prior_delivered == 0, "sample delivered should be 0");
+  TCP_TEST (approx_equal (rate, rs->tx_rate), "rate should be %u is %u", rate,
+           rs->tx_rate);
   TCP_TEST (!(rs->flags & TCP_BTS_IS_RXT), "not retransmitted");
 
   /* 3) track second burst at time 2 */
@@ -888,10 +897,11 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
   TCP_TEST (tc->delivered_time == 4, "delivered time should be 4");
   TCP_TEST (tc->delivered == 3 * burst, "delivered should be 300 is %u",
            tc->delivered);
-  TCP_TEST (rs->ack_time == 2, "ack time should be 2");
+  TCP_TEST (rs->interval_time == 2, "ack time should be 2");
   TCP_TEST (rs->delivered == 2 * burst, "delivered should be 200");
-  TCP_TEST (rs->sample_delivered == burst, "delivered should be 100");
-  TCP_TEST (rs->tx_rate == rate, "delivered should be %u", rate);
+  TCP_TEST (rs->prior_delivered == burst, "delivered should be 100");
+  TCP_TEST (approx_equal (rate, rs->tx_rate), "rate should be %u is %u", rate,
+           rs->tx_rate);
   TCP_TEST (!(rs->flags & TCP_BTS_IS_RXT), "not retransmitted");
   TCP_TEST (!(bts->flags & TCP_BTS_IS_APP_LIMITED), "not app limited");
 
@@ -954,11 +964,13 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
            3 * burst + 30, tc->delivered);
   /* All 3 samples have the same delivered number of bytes. So the first is
    * the reference for delivery estimate. */
-  TCP_TEST (rs->ack_time == 4, "ack time should be 4 is %.2f", rs->ack_time);
+  TCP_TEST (rs->interval_time == 4, "ack time should be 4 is %.2f",
+           rs->interval_time);
   TCP_TEST (rs->delivered == 30, "delivered should be 30");
-  TCP_TEST (rs->sample_delivered == 3 * burst,
+  TCP_TEST (rs->prior_delivered == 3 * burst,
            "sample delivered should be %u", 3 * burst);
-  TCP_TEST (rs->tx_rate == rate, "delivered should be %u", rate);
+  TCP_TEST (approx_equal (rate, rs->tx_rate), "rate should be %u is %u", rate,
+           rs->tx_rate);
   TCP_TEST (!(rs->flags & TCP_BTS_IS_RXT), "not retransmitted");
   TCP_TEST (!(rs->flags & TCP_BTS_IS_APP_LIMITED), "not app limited");
 
@@ -1034,13 +1046,15 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
   TCP_TEST (tc->delivered == 5 * burst + 40, "delivered should be %u is %u",
            5 * burst + 40, tc->delivered);
   /* A rxt was acked and delivered time for it is 8 (last ack time) */
-  TCP_TEST (rs->ack_time == 2, "ack time should be 2 is %.2f", rs->ack_time);
+  TCP_TEST (rs->interval_time == 2, "ack time should be 2 is %.2f",
+           rs->interval_time);
   /* delivered_now - delivered_rxt ~ 5 * burst + 40 - 3 * burst - 30 */
   TCP_TEST (rs->delivered == 2 * burst + 10, "delivered should be 210 is %u",
            rs->delivered);
-  TCP_TEST (rs->sample_delivered == 3 * burst + 30,
+  TCP_TEST (rs->prior_delivered == 3 * burst + 30,
            "sample delivered should be %u", 3 * burst + 30);
-  TCP_TEST (rs->tx_rate == rate, "delivered should be %u", rate);
+  TCP_TEST (approx_equal (rate, rs->tx_rate), "rate should be %u is %u", rate,
+           rs->tx_rate);
   TCP_TEST (rs->flags & TCP_BTS_IS_RXT, "is retransmitted");
   /* Sample is app limited because of the retransmits */
   TCP_TEST (rs->flags & TCP_BTS_IS_APP_LIMITED, "is app limited");
@@ -1059,20 +1073,22 @@ tcp_test_delivery (vlib_main_t * vm, unformat_input_t * input)
   tcp_bt_sample_delivery_rate (tc, rs);
 
   TCP_TEST (tcp_bt_is_sane (bt), "tracker should be sane");
-  TCP_TEST (pool_elts (bt->samples) == 0, "num samples should be 3 is %u",
+  TCP_TEST (pool_elts (bt->samples) == 0, "num samples should be 0 is %u",
            pool_elts (bt->samples));
-  TCP_TEST (tc->delivered_time == 11, "delivered time should be 10");
+  TCP_TEST (tc->delivered_time == 11, "delivered time should be 11");
   TCP_TEST (tc->delivered == 7 * burst, "delivered should be %u is %u",
            7 * burst, tc->delivered);
   /* Last rxt was at time 8 */
-  TCP_TEST (rs->ack_time == 3, "ack time should be 3 is %.2f", rs->ack_time);
+  TCP_TEST (rs->interval_time == 3, "ack time should be 3 is %.2f",
+           rs->interval_time);
   /* delivered_now - delivered_rxt ~ 7 * burst - 3 * burst - 30.
    * That's because we didn't retransmit any new segment. */
   TCP_TEST (rs->delivered == 4 * burst - 30, "delivered should be 160 is %u",
            rs->delivered);
-  TCP_TEST (rs->sample_delivered == 3 * burst + 30,
+  TCP_TEST (rs->prior_delivered == 3 * burst + 30,
            "sample delivered should be %u", 3 * burst + 30);
-  TCP_TEST (rs->tx_rate == rate, "delivered should be %u", rate);
+  TCP_TEST (approx_equal (rate, rs->tx_rate), "rate should be %u is %u", rate,
+           rs->tx_rate);
   TCP_TEST (rs->flags & TCP_BTS_IS_RXT, "is retransmitted");
   TCP_TEST (rs->flags & TCP_BTS_IS_APP_LIMITED, "is app limited");
   TCP_TEST (tc->app_limited == 0, "app limited should be cleared");