TCP source address automation
[vpp.git] / src / vnet / tcp / tcp.h
index 997df76..097cc8c 100644 (file)
@@ -97,6 +97,7 @@ extern timer_expiration_handler tcp_timer_retransmit_syn_handler;
                                                 * ticks to timer units */
 #define TCP_DELACK_TIME         1      /* 0.1s */
 #define TCP_ESTABLISH_TIME      750    /* 75s */
+#define TCP_SYN_RCVD_TIME      100     /* 10s */
 #define TCP_2MSL_TIME           300    /* 30s */
 #define TCP_CLOSEWAIT_TIME     20      /* 0.1s */
 #define TCP_CLEANUP_TIME       5       /* 0.5s Time to wait before cleanup */
@@ -116,7 +117,8 @@ extern timer_expiration_handler tcp_timer_retransmit_syn_handler;
   _(RECOVERY, "Recovery on")                    \
   _(FAST_RECOVERY, "Fast Recovery on")         \
   _(FR_1_SMSS, "Sent 1 SMSS")                  \
-  _(HALF_OPEN_DONE, "Half-open completed")
+  _(HALF_OPEN_DONE, "Half-open completed")     \
+  _(FINPNDG, "FIN pending")
 
 typedef enum _tcp_connection_flag_bits
 {
@@ -366,6 +368,7 @@ typedef struct _tcp_main
 
   u8 log2_tstamp_clocks_per_tick;
   f64 tstamp_ticks_per_clock;
+  u32 *time_now;
 
   /** per-worker tx buffer free lists */
   u32 **tx_buffers;
@@ -404,6 +407,9 @@ typedef struct _tcp_main
 
   /** Port allocator random number generator seed */
   u32 port_allocator_seed;
+
+  /** vlib buffer size */
+  u32 bytes_per_buffer;
 } tcp_main_t;
 
 extern tcp_main_t tcp_main;
@@ -459,7 +465,13 @@ void tcp_connection_del (tcp_connection_t * tc);
 int tcp_half_open_connection_cleanup (tcp_connection_t * tc);
 tcp_connection_t *tcp_connection_new (u8 thread_index);
 void tcp_connection_reset (tcp_connection_t * tc);
-
+int tcp_configure_v4_source_address_range (vlib_main_t * vm,
+                                          ip4_address_t * start,
+                                          ip4_address_t * end, u32 table_id);
+int tcp_configure_v6_source_address_range (vlib_main_t * vm,
+                                          ip6_address_t * start,
+                                          ip6_address_t * end, u32 table_id);
+void tcp_api_reference (void);
 u8 *format_tcp_connection_id (u8 * s, va_list * args);
 u8 *format_tcp_connection (u8 * s, va_list * args);
 u8 *format_tcp_scoreboard (u8 * s, va_list * args);
@@ -587,6 +599,14 @@ tcp_available_snd_space (const tcp_connection_t * tc)
   return available_wnd - flight_size;
 }
 
+always_inline u8
+tcp_is_lost_fin (tcp_connection_t * tc)
+{
+  if ((tc->flags & TCP_CONN_FINSNT) && tc->snd_una_max - tc->snd_una == 1)
+    return 1;
+  return 0;
+}
+
 i32 tcp_rcv_wnd_available (tcp_connection_t * tc);
 u32 tcp_snd_space (tcp_connection_t * tc);
 void tcp_update_rcv_wnd (tcp_connection_t * tc);
@@ -607,12 +627,21 @@ void tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end);
 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);
@@ -621,8 +650,8 @@ tcp_update_time (f64 now, u32 thread_index)
 u32 tcp_push_header (transport_connection_t * tconn, vlib_buffer_t * b);
 
 u32
-tcp_prepare_retransmit_segment (tcp_connection_t * tc, vlib_buffer_t * b,
-                               u32 offset, u32 max_bytes);
+tcp_prepare_retransmit_segment (tcp_connection_t * tc, u32 offset,
+                               u32 max_bytes, vlib_buffer_t ** b);
 
 void tcp_connection_timers_init (tcp_connection_t * tc);
 void tcp_connection_timers_reset (tcp_connection_t * tc);