diff options
author | Vladimir Kropylev <vladimir.kropylev@enea.com> | 2019-07-02 11:25:26 +0300 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2019-07-05 15:36:08 +0000 |
commit | 1cfcb78940580c8e3645fca0419d32f9286e942d (patch) | |
tree | 250a88de0af51e2d32a8922345c200efb30715a9 | |
parent | 17237fbdbbbd9d64988f9c608d02deab09782a94 (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.h | 11 | ||||
-rw-r--r-- | src/vnet/tcp/tcp_input.c | 2 | ||||
-rw-r--r-- | 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); |