X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.h;h=3a31234876e67ee499e58efbb53cc77251c4c579;hb=refs%2Fchanges%2F31%2F12931%2F11;hp=6020a3debbe06e090809561753a327070181c46e;hpb=4eeeaaf5e822718eb222e6c49abd82e1bcb566fd;p=vpp.git diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index 6020a3debbe..3a31234876e 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -99,8 +99,9 @@ extern timer_expiration_handler tcp_timer_retransmit_syn_handler; #define TCP_ESTABLISH_TIME 750 /* 75s */ #define TCP_SYN_RCVD_TIME 600 /* 60s */ #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 */ +#define TCP_CLOSEWAIT_TIME 20 /* 2s */ +#define TCP_TIMEWAIT_TIME 100 /* 10s */ +#define TCP_CLEANUP_TIME 10 /* 1s Time to wait before cleanup */ #define TCP_TIMER_PERSIST_MIN 2 /* 0.2s */ #define TCP_RTO_MAX 60 * THZ /* Min max RTO (60s) as per RFC6298 */ @@ -113,12 +114,12 @@ extern timer_expiration_handler tcp_timer_retransmit_syn_handler; #define foreach_tcp_connection_flag \ _(SNDACK, "Send ACK") \ _(FINSNT, "FIN sent") \ - _(SENT_RCV_WND0, "Sent 0 receive window") \ - _(RECOVERY, "Recovery on") \ - _(FAST_RECOVERY, "Fast Recovery on") \ + _(SENT_RCV_WND0, "Sent 0 rcv_wnd") \ + _(RECOVERY, "Recovery") \ + _(FAST_RECOVERY, "Fast Recovery") \ _(FR_1_SMSS, "Sent 1 SMSS") \ _(HALF_OPEN_DONE, "Half-open completed") \ - _(FINPNDG, "FIN pending") + _(FINPNDG, "FIN pending") \ typedef enum _tcp_connection_flag_bits { @@ -282,6 +283,7 @@ typedef struct _tcp_connection /* Congestion control */ u32 cwnd; /**< Congestion window */ + u32 cwnd_acc_bytes; /**< Bytes accumulated for cwnd increment */ u32 ssthresh; /**< Slow-start threshold */ u32 prev_ssthresh; /**< ssthresh before congestion */ u32 prev_cwnd; /**< ssthresh before congestion */ @@ -303,6 +305,7 @@ typedef struct _tcp_connection u16 mss; /**< Our max seg size that includes options */ u32 limited_transmit; /**< snd_nxt when limited transmit starts */ u32 last_fib_check; /**< Last time we checked fib route for peer */ + u32 sw_if_index; /**< Interface for the connection */ } tcp_connection_t; struct _tcp_cc_algorithm @@ -372,8 +375,10 @@ typedef struct _tcp_main /** per-worker tx buffer free lists */ u32 **tx_buffers; - /** per-worker tx frames to 4/6 output nodes */ + /** per-worker tx frames to tcp 4/6 output nodes */ vlib_frame_t **tx_frames[2]; + /** per-worker tx frames to ip 4/6 lookup nodes */ + vlib_frame_t **ip_lookup_tx_frames[2]; /* Per worker-thread timer wheel for connections timers */ tw_timer_wheel_16t_2w_512sl_t *timer_wheels; @@ -382,13 +387,6 @@ typedef struct _tcp_main tcp_connection_t *half_open_connections; clib_spinlock_t half_open_lock; - /* Pool of local TCP endpoints */ - transport_endpoint_t *local_endpoints; - - /* 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; @@ -399,21 +397,20 @@ typedef struct _tcp_main u32 preallocated_connections; u32 preallocated_half_open_connections; - /** Transport table (preallocation) size parameters */ - u32 local_endpoints_table_memory; - u32 local_endpoints_table_buckets; - /** Vectors of src addresses. Optional unless one needs > 63K active-opens */ ip4_address_t *ip4_src_addresses; u32 last_v4_address_rotor; u32 last_v6_address_rotor; ip6_address_t *ip6_src_addresses; - /** Port allocator random number generator seed */ - u32 port_allocator_seed; - /** vlib buffer size */ u32 bytes_per_buffer; + + u8 punt_unknown4; + u8 punt_unknown6; + + /** fault-injection */ + f64 buffer_fail_fraction; } tcp_main_t; extern tcp_main_t tcp_main; @@ -436,8 +433,19 @@ tcp_buffer_hdr (vlib_buffer_t * b) + vnet_buffer (b)->tcp.hdr_offset); } +#if (VLIB_BUFFER_TRACE_TRAJECTORY) +#define tcp_trajectory_add_start(b, start) \ +{ \ + (*vlib_buffer_trace_trajectory_cb) (b, start); \ +} +#else +#define tcp_trajectory_add_start(b, start) +#endif + clib_error_t *vnet_tcp_enable_disable (vlib_main_t * vm, u8 is_en); +void tcp_punt_unknown (vlib_main_t * vm, u8 is_ip4, u8 is_add); + always_inline tcp_connection_t * tcp_connection_get (u32 conn_index, u32 thread_index) { @@ -609,7 +617,7 @@ tcp_available_output_snd_space (const tcp_connection_t * tc) * Estimate of how many bytes we can still push into the network */ always_inline u32 -tcp_available_snd_space (const tcp_connection_t * tc) +tcp_available_cc_snd_space (const tcp_connection_t * tc) { u32 available_wnd = tcp_available_snd_wnd (tc); u32 flight_size = tcp_flight_size (tc); @@ -644,6 +652,7 @@ fib_node_index_t tcp_lookup_rmt_in_fib (tcp_connection_t * tc); /* Made public for unit testing only */ void tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end); +u32 tcp_sack_list_bytes (tcp_connection_t * tc); always_inline u32 tcp_time_now (void) @@ -659,15 +668,6 @@ tcp_set_time_now (u32 thread_index) 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); -} - u32 tcp_push_header (transport_connection_t * tconn, vlib_buffer_t * b); u32 @@ -787,12 +787,11 @@ tcp_timer_is_active (tcp_connection_t * tc, tcp_timers_e timer) #define tcp_validate_txf_size(_tc, _a) \ ASSERT(_tc->state != TCP_STATE_ESTABLISHED \ - || stream_session_tx_fifo_max_dequeue (&_tc->connection) >= _a) + || session_tx_fifo_max_dequeue (&_tc->connection) >= _a) void scoreboard_remove_hole (sack_scoreboard_t * sb, sack_scoreboard_hole_t * hole); -void scoreboard_update_lost (tcp_connection_t * tc, sack_scoreboard_t * sb); sack_scoreboard_hole_t *scoreboard_insert_hole (sack_scoreboard_t * sb, u32 prev_index, u32 start, u32 end);