X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.h;h=a1491b944ddbf65b3596acf3317068c3f48d71db;hb=5035bf04130a35b76f6b49f450e27d02bafb9dab;hp=f4cc2c88e6248420656e13897445ace5b148ed17;hpb=9f86d225ab4f3dccbf61383a75d6af7d321a204e;p=vpp.git diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index f4cc2c88e62..a1491b944dd 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -28,14 +28,13 @@ typedef void (timer_expiration_handler) (tcp_connection_t * tc); -extern timer_expiration_handler tcp_timer_delack_handler; extern timer_expiration_handler tcp_timer_retransmit_handler; extern timer_expiration_handler tcp_timer_persist_handler; extern timer_expiration_handler tcp_timer_retransmit_syn_handler; typedef enum _tcp_error { -#define tcp_error(n,s) TCP_ERROR_##n, +#define tcp_error(f, n, s, d) TCP_ERROR_##f, #include #undef tcp_error TCP_N_ERROR, @@ -58,6 +57,7 @@ typedef struct _tcp_lookup_dispatch _(to_closing, u32, "timeout closing") \ _(tr_abort, u32, "timer retransmit abort") \ _(rst_unread, u32, "reset on close due to unread data") \ + _(no_buffer, u32, "out of buffers") \ typedef struct tcp_wrk_stats_ { @@ -91,15 +91,15 @@ typedef struct tcp_worker_ctx_ /** convenience pointer to this thread's vlib main */ vlib_main_t *vm; - /** worker time */ - u32 time_now; + /** Time used for high precision (us) measurements in seconds */ + f64 time_us; + + /** Time measured in @ref TCP_TSTAMP_TICK used for time stamps */ + u32 time_tstamp; /* Max timers to be handled per dispatch loop */ u32 max_timers_per_loop; - /** Session layer edge indices to tcp output */ - u32 tco_next_node[2]; - /* Fifo of pending timer expirations */ u32 *pending_timers; @@ -114,6 +114,9 @@ typedef struct tcp_worker_ctx_ /* fifo of pending free requests */ tcp_cleanup_req_t *pending_cleanups; + /** Session layer edge indices to tcp output */ + u32 tco_next_node[2]; + /** worker timer wheel */ tcp_timer_wheel_t timer_wheel; @@ -163,26 +166,26 @@ typedef struct tcp_configuration_ * a zero rwnd advertisement */ u32 rwnd_min_update_ack; - /** Delayed ack time (disabled) */ - u16 delack_time; - /** Timer ticks to wait for close from app */ - u16 closewait_time; + u32 closewait_time; /** Timer ticks to wait in time-wait. Also known as 2MSL */ - u16 timewait_time; + u32 timewait_time; /** Timer ticks to wait in fin-wait1 to send fin and rcv fin-ack */ - u16 finwait1_time; + u32 finwait1_time; /** Timer ticks to wait in last ack for ack */ - u16 lastack_time; + u32 lastack_time; /** Timer ticks to wait in fin-wait2 for fin */ - u16 finwait2_time; + u32 finwait2_time; /** Timer ticks to wait in closing for fin ack */ - u16 closing_time; + u32 closing_time; + + /** Timer ticks to wait for free buffer */ + u32 alloc_err_timeout; /** Time to wait (sec) before cleaning up the connection */ f32 cleanup_time; @@ -190,8 +193,8 @@ typedef struct tcp_configuration_ /** Number of preallocated connections */ u32 preallocated_connections; - /** Number of preallocated half-open connections */ - u32 preallocated_half_open_connections; + /** Maxium allowed GSO packet size */ + u32 max_gso_size; /** Vectors of src addresses. Optional unless one needs > 63K active-opens */ ip4_address_t *ip4_src_addrs; @@ -209,8 +212,6 @@ typedef struct _tcp_main /* Pool of listeners. */ tcp_connection_t *listener_pool; - f64 tstamp_ticks_per_clock; - /** vlib buffer size */ u32 bytes_per_buffer; @@ -220,11 +221,6 @@ typedef struct _tcp_main /** Dispatch table by state and flags */ tcp_lookup_dispatch_t dispatch_table[TCP_N_STATES][64]; - clib_spinlock_t half_open_lock; - - /** Pool of half-open connections on which we've sent a SYN */ - tcp_connection_t *half_open_connections; - /** Seed used to generate random iss */ tcp_iss_seed_t iss_seed; @@ -254,6 +250,9 @@ typedef struct _tcp_main /** Protocol configuration */ tcp_configuration_t cfg; + + /** message ID base for API */ + u16 msg_id_base; } tcp_main_t; extern tcp_main_t tcp_main; @@ -269,6 +268,8 @@ extern vlib_node_registration_t tcp4_rcv_process_node; extern vlib_node_registration_t tcp6_rcv_process_node; extern vlib_node_registration_t tcp4_listen_node; extern vlib_node_registration_t tcp6_listen_node; +extern vlib_node_registration_t tcp4_input_nolookup_node; +extern vlib_node_registration_t tcp6_input_nolookup_node; #define tcp_cfg tcp_main.cfg #define tcp_node_index(node_id, is_ip4) \ @@ -287,18 +288,9 @@ tcp_get_worker (u32 thread_index) return &tcp_main.wrk_ctx[thread_index]; } -#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 - tcp_connection_t *tcp_connection_alloc (u8 thread_index); tcp_connection_t *tcp_connection_alloc_w_base (u8 thread_index, - tcp_connection_t * base); + tcp_connection_t **base); void tcp_connection_free (tcp_connection_t * tc); void tcp_connection_close (tcp_connection_t * tc); void tcp_connection_cleanup (tcp_connection_t * tc); @@ -323,8 +315,8 @@ u32 tcp_snd_space (tcp_connection_t * tc); int tcp_fastrecovery_prr_snd_space (tcp_connection_t * tc); void tcp_reschedule (tcp_connection_t * tc); fib_node_index_t tcp_lookup_rmt_in_fib (tcp_connection_t * tc); -u32 tcp_session_push_header (transport_connection_t * tconn, - vlib_buffer_t * b); +u32 tcp_session_push_header (transport_connection_t *tconn, vlib_buffer_t **b, + u32 n_bufs); int tcp_session_custom_tx (void *conn, transport_send_params_t * sp); void tcp_connection_timers_init (tcp_connection_t * tc); @@ -335,7 +327,9 @@ void tcp_connection_tx_pacer_update (tcp_connection_t * tc); void tcp_connection_tx_pacer_reset (tcp_connection_t * tc, u32 window, u32 start_bucket); void tcp_program_cleanup (tcp_worker_ctx_t * wrk, tcp_connection_t * tc); +void tcp_check_gso (tcp_connection_t *tc); +int tcp_buffer_make_reset (vlib_main_t *vm, vlib_buffer_t *b, u8 is_ip4); void tcp_punt_unknown (vlib_main_t * vm, u8 is_ip4, u8 is_add); int tcp_configure_v4_source_address_range (vlib_main_t * vm, ip4_address_t * start,