aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Kropylev <vladimir.kropylev@enea.com>2019-07-02 11:25:26 +0300
committerFlorin Coras <florin.coras@gmail.com>2019-07-05 15:36:08 +0000
commit1cfcb78940580c8e3645fca0419d32f9286e942d (patch)
tree250a88de0af51e2d32a8922345c200efb30715a9
parent17237fbdbbbd9d64988f9c608d02deab09782a94 (diff)
tcp: timestamp adjustment
Type: feature Change-Id: Icb3c574100cde95ab5be4923c8739889cf7e48c6 Signed-off-by: Vladimir Kropylev <vladimir.kropylev@enea.com>
-rw-r--r--src/vnet/tcp/tcp.h11
-rw-r--r--src/vnet/tcp/tcp_input.c2
-rw-r--r--src/vnet/tcp/tcp_output.c4
3 files changed, 14 insertions, 3 deletions
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index c83e7dced1e..a13a30dcb72 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -377,6 +377,7 @@ typedef struct _tcp_connection
u32 last_fib_check; /**< Last time we checked fib route for peer */
u16 mss; /**< Our max seg size that includes options */
+ u32 timestamp_delta;
} tcp_connection_t;
/* *INDENT-OFF* */
@@ -928,6 +929,16 @@ tcp_time_now_w_thread (u32 thread_index)
return tcp_main.wrk_ctx[thread_index].time_now;
}
+/**
+ * Generate timestamp for tcp connection
+ */
+always_inline u32
+tcp_tstamp (tcp_connection_t * tc)
+{
+ return (tcp_main.wrk_ctx[tc->c_thread_index].time_now -
+ tc->timestamp_delta);
+}
+
always_inline f64
tcp_time_now_us (u32 thread_index)
{
diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c
index 50860ab1c8d..1b4e8a6ac21 100644
--- a/src/vnet/tcp/tcp_input.c
+++ b/src/vnet/tcp/tcp_input.c
@@ -508,7 +508,7 @@ tcp_update_rtt (tcp_connection_t * tc, u32 ack)
* seq_lt (tc->snd_una, ack). This is a condition for calling update_rtt */
else if (tcp_opts_tstamp (&tc->rcv_opts) && tc->rcv_opts.tsecr)
{
- u32 now = tcp_time_now_w_thread (tc->c_thread_index);
+ u32 now = tcp_tstamp (tc);
mrtt = clib_max (now - tc->rcv_opts.tsecr, 1);
}
diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c
index 17873ac4dab..7b0303f3033 100644
--- a/src/vnet/tcp/tcp_output.c
+++ b/src/vnet/tcp/tcp_output.c
@@ -344,7 +344,7 @@ tcp_make_established_options (tcp_connection_t * tc, tcp_options_t * opts)
if (tcp_opts_tstamp (&tc->rcv_opts))
{
opts->flags |= TCP_OPTS_FLAG_TSTAMP;
- opts->tsval = tcp_time_now_w_thread (tc->c_thread_index);
+ opts->tsval = tcp_tstamp (tc);
opts->tsecr = tc->tsval_recent;
len += TCP_OPTION_LEN_TIMESTAMP;
}
@@ -1605,7 +1605,7 @@ tcp_timer_retransmit_handler_i (u32 index, u8 is_syn)
/* For first retransmit, record timestamp (Eifel detection RFC3522) */
if (tc->rto_boff == 1)
- tc->snd_rxt_ts = tcp_time_now_w_thread (tc->c_thread_index);
+ tc->snd_rxt_ts = tcp_tstamp (tc);
tcp_enqueue_to_output (wrk, b, bi, tc->c_is_ip4);
tcp_retransmit_timer_force_update (tc);