_(SENT_RCV_WND0, "Sent 0 receive window") \
_(RECOVERY, "Recovery on") \
_(FAST_RECOVERY, "Fast Recovery on") \
- _(FR_1_SMSS, "Sent 1 SMSS")
+ _(FR_1_SMSS, "Sent 1 SMSS") \
+ _(HALF_OPEN_DONE, "Half-open completed")
typedef enum _tcp_connection_flag_bits
{
/** per-worker tx buffer free lists */
u32 **tx_buffers;
+ /** per-worker tx frames to 4/6 output nodes */
+ vlib_frame_t **tx_frames[2];
/* Per worker-thread timer wheel for connections timers */
tw_timer_wheel_16t_2w_512sl_t *timer_wheels;
/* Local endpoints lookup table */
transport_endpoint_table_t local_endpoints_table;
+ clib_spinlock_t local_endpoints_lock;
/* Congestion control algorithms registered */
tcp_cc_algorithm_t *cc_algos;
u32 last_v6_address_rotor;
ip6_address_t *ip6_src_addresses;
- /* convenience */
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
- ip4_main_t *ip4_main;
- ip6_main_t *ip6_main;
+ /** Port allocator random number generator seed */
+ u32 port_allocator_seed;
} tcp_main_t;
extern tcp_main_t tcp_main;
always_inline tcp_connection_t *
tcp_connection_get (u32 conn_index, u32 thread_index)
{
- if (pool_is_free_index (tcp_main.connections[thread_index], conn_index))
+ if (PREDICT_FALSE
+ (pool_is_free_index (tcp_main.connections[thread_index], conn_index)))
return 0;
return pool_elt_at_index (tcp_main.connections[thread_index], conn_index);
}
void tcp_connection_close (tcp_connection_t * tc);
void tcp_connection_cleanup (tcp_connection_t * tc);
void tcp_connection_del (tcp_connection_t * tc);
-void tcp_half_open_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);
always_inline tcp_connection_t *
tcp_half_open_connection_get (u32 conn_index)
{
- if (pool_is_free_index (tcp_main.half_open_connections, conn_index))
- return 0;
- return pool_elt_at_index (tcp_main.half_open_connections, conn_index);
+ tcp_connection_t *tc = 0;
+ clib_spinlock_lock_if_init (&tcp_main.half_open_lock);
+ if (!pool_is_free_index (tcp_main.half_open_connections, conn_index))
+ tc = pool_elt_at_index (tcp_main.half_open_connections, conn_index);
+ clib_spinlock_unlock_if_init (&tcp_main.half_open_lock);
+ return tc;
}
void tcp_make_ack (tcp_connection_t * ts, vlib_buffer_t * b);
void tcp_init_mss (tcp_connection_t * tc);
void tcp_update_snd_mss (tcp_connection_t * tc);
void tcp_update_rto (tcp_connection_t * tc);
+void tcp_flush_frame_to_output (vlib_main_t * vm, u8 thread_index, u8 is_ip4);
+void tcp_flush_frames_to_output (u8 thread_index);
always_inline u32
tcp_end_seq (tcp_header_t * th, u32 len)
{
tw_timer_expire_timers_16t_2w_512sl (&tcp_main.timer_wheels[thread_index],
now);
+ tcp_flush_frames_to_output (thread_index);
}
u32 tcp_push_header (transport_connection_t * tconn, vlib_buffer_t * b);