TCP: Update time_now once per burst

Change-Id: I58089d7a9867ede9d8a36b2aea62edef04cb5b81
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index a17262f..52610dd 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -367,6 +367,7 @@
 
   u8 log2_tstamp_clocks_per_tick;
   f64 tstamp_ticks_per_clock;
+  u32 *time_now;
 
   /** per-worker tx buffer free lists */
   u32 **tx_buffers;
@@ -619,12 +620,21 @@
 always_inline u32
 tcp_time_now (void)
 {
-  return clib_cpu_time_now () * tcp_main.tstamp_ticks_per_clock;
+  return tcp_main.time_now[vlib_get_thread_index ()];
+}
+
+always_inline u32
+tcp_set_time_now (u32 thread_index)
+{
+  tcp_main.time_now[thread_index] = clib_cpu_time_now ()
+    * tcp_main.tstamp_ticks_per_clock;
+  return tcp_main.time_now[thread_index];
 }
 
 always_inline void
 tcp_update_time (f64 now, u32 thread_index)
 {
+  tcp_set_time_now (thread_index);
   tw_timer_expire_timers_16t_2w_512sl (&tcp_main.timer_wheels[thread_index],
 				       now);
   tcp_flush_frames_to_output (thread_index);