From 1cfcb78940580c8e3645fca0419d32f9286e942d Mon Sep 17 00:00:00 2001 From: Vladimir Kropylev Date: Tue, 2 Jul 2019 11:25:26 +0300 Subject: [PATCH] tcp: timestamp adjustment Type: feature Change-Id: Icb3c574100cde95ab5be4923c8739889cf7e48c6 Signed-off-by: Vladimir Kropylev --- src/vnet/tcp/tcp.h | 11 +++++++++++ src/vnet/tcp/tcp_input.c | 2 +- src/vnet/tcp/tcp_output.c | 4 ++-- 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); -- 2.16.6