Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
tcp: move connections to wrk ctx
[vpp.git]
/
src
/
vnet
/
tcp
/
tcp.h
diff --git
a/src/vnet/tcp/tcp.h
b/src/vnet/tcp/tcp.h
index
e9247eb
..
59ccf8f
100644
(file)
--- a/
src/vnet/tcp/tcp.h
+++ b/
src/vnet/tcp/tcp.h
@@
-82,7
+82,7
@@
typedef enum _tcp_timers
TCP_N_TIMERS
} tcp_timers_e;
TCP_N_TIMERS
} tcp_timers_e;
-typedef void (timer_expiration_handler) (u32 index);
+typedef void (timer_expiration_handler) (u32 index
, u32 thread_index
);
extern timer_expiration_handler tcp_timer_delack_handler;
extern timer_expiration_handler tcp_timer_retransmit_handler;
extern timer_expiration_handler tcp_timer_delack_handler;
extern timer_expiration_handler tcp_timer_retransmit_handler;
@@
-109,6
+109,7
@@
extern timer_expiration_handler tcp_timer_retransmit_syn_handler;
_(NO_CSUM_OFFLOAD, "No csum offload") \
_(NO_TSO, "TSO off") \
_(TSO, "TSO") \
_(NO_CSUM_OFFLOAD, "No csum offload") \
_(NO_TSO, "TSO off") \
_(TSO, "TSO") \
+ _(NO_ENDPOINT,"No endpoint") \
typedef enum tcp_cfg_flag_bits_
{
typedef enum tcp_cfg_flag_bits_
{
@@
-435,6
+436,8
@@
typedef struct _tcp_connection
u16 mss; /**< Our max seg size that includes options */
u32 timestamp_delta; /**< Offset for timestamp */
u32 ipv6_flow_label; /**< flow label for ipv6 header */
u16 mss; /**< Our max seg size that includes options */
u32 timestamp_delta; /**< Offset for timestamp */
u32 ipv6_flow_label; /**< flow label for ipv6 header */
+
+#define rst_state snd_wl1
} tcp_connection_t;
/* *INDENT-OFF* */
} tcp_connection_t;
/* *INDENT-OFF* */
@@
-502,17
+505,9
@@
typedef struct _tcp_lookup_dispatch
typedef struct tcp_worker_ctx_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
typedef struct tcp_worker_ctx_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
- /** worker time */
- u32 time_now;
-
- /** worker timer wheel */
- tw_timer_wheel_16t_2w_512sl_t timer_wheel;
- /** tx buffer free list */
- u32 *tx_buffers;
-
- /** tx frames for ip 4/6 lookup nodes */
- vlib_frame_t *ip_lookup_tx_frames[2];
+ /** worker's pool of connections */
+ tcp_connection_t *connections;
/** vector of pending ack dequeues */
u32 *pending_deq_acked;
/** vector of pending ack dequeues */
u32 *pending_deq_acked;
@@
-520,14
+515,29
@@
typedef struct tcp_worker_ctx_
/** vector of pending disconnect notifications */
u32 *pending_disconnects;
/** vector of pending disconnect notifications */
u32 *pending_disconnects;
+ /** vector of pending reset notifications */
+ u32 *pending_resets;
+
/** convenience pointer to this thread's vlib main */
vlib_main_t *vm;
/** convenience pointer to this thread's vlib main */
vlib_main_t *vm;
+ /** worker time */
+ u32 time_now;
+
+ /** tx frames for ip 4/6 lookup nodes */
+ vlib_frame_t *ip_lookup_tx_frames[2];
+
CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
/** cached 'on the wire' options for bursts */
u8 cached_opts[40];
CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
/** cached 'on the wire' options for bursts */
u8 cached_opts[40];
+ /** tx buffer free list */
+ u32 *tx_buffers;
+
+ /** worker timer wheel */
+ tw_timer_wheel_16t_2w_512sl_t timer_wheel;
+
} tcp_worker_ctx_t;
typedef struct tcp_iss_seed_
} tcp_worker_ctx_t;
typedef struct tcp_iss_seed_
@@
-558,6
+568,9
@@
typedef struct tcp_configuration_
/** Allow use of TSO whenever available */
u8 allow_tso;
/** Allow use of TSO whenever available */
u8 allow_tso;
+ /** Set if csum offloading is enabled */
+ u8 csum_offload;
+
/** Default congestion control algorithm type */
tcp_cc_algorithm_type_e cc_algo;
/** Default congestion control algorithm type */
tcp_cc_algorithm_type_e cc_algo;
@@
-605,27
+618,24
@@
typedef struct tcp_configuration_
typedef struct _tcp_main
{
typedef struct _tcp_main
{
- /*
Per-worker thread tcp connection pools
*/
- tcp_
connection_t **connections
;
+ /*
* per-worker context
*/
+ tcp_
worker_ctx_t *wrk_ctx
;
/* Pool of listeners. */
tcp_connection_t *listener_pool;
/* Pool of listeners. */
tcp_connection_t *listener_pool;
+ f64 tstamp_ticks_per_clock;
+
+ /** vlib buffer size */
+ u32 bytes_per_buffer;
+
/** Dispatch table by state and flags */
tcp_lookup_dispatch_t dispatch_table[TCP_N_STATES][64];
/** Dispatch table by state and flags */
tcp_lookup_dispatch_t dispatch_table[TCP_N_STATES][64];
- u8 log2_tstamp_clocks_per_tick;
- f64 tstamp_ticks_per_clock;
-
- /** per-worker context */
- tcp_worker_ctx_t *wrk_ctx;
+ clib_spinlock_t half_open_lock;
/** Pool of half-open connections on which we've sent a SYN */
tcp_connection_t *half_open_connections;
/** Pool of half-open connections on which we've sent a SYN */
tcp_connection_t *half_open_connections;
- clib_spinlock_t half_open_lock;
-
- /** vlib buffer size */
- u32 bytes_per_buffer;
/** Seed used to generate random iss */
tcp_iss_seed_t iss_seed;
/** Seed used to generate random iss */
tcp_iss_seed_t iss_seed;
@@
-685,6
+695,7
@@
vnet_get_tcp_main ()
always_inline tcp_worker_ctx_t *
tcp_get_worker (u32 thread_index)
{
always_inline tcp_worker_ctx_t *
tcp_get_worker (u32 thread_index)
{
+ ASSERT (thread_index < vec_len (tcp_main.wrk_ctx));
return &tcp_main.wrk_ctx[thread_index];
}
return &tcp_main.wrk_ctx[thread_index];
}
@@
-712,20
+723,22
@@
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)
{
always_inline tcp_connection_t *
tcp_connection_get (u32 conn_index, u32 thread_index)
{
- if (PREDICT_FALSE
-
(pool_is_free_index (tcp_main.connections[thread_index]
, conn_index)))
+ tcp_worker_ctx_t *wrk = tcp_get_worker (thread_index);
+
if (PREDICT_FALSE (pool_is_free_index (wrk->connections
, conn_index)))
return 0;
return 0;
- return pool_elt_at_index (
tcp_main.connections[thread_index]
, conn_index);
+ return pool_elt_at_index (
wrk->connections
, conn_index);
}
always_inline tcp_connection_t *
tcp_connection_get_if_valid (u32 conn_index, u32 thread_index)
{
}
always_inline tcp_connection_t *
tcp_connection_get_if_valid (u32 conn_index, u32 thread_index)
{
- if (tcp_main.connections[thread_index] == 0)
+ tcp_worker_ctx_t *wrk;
+ if (thread_index >= vec_len (tcp_main.wrk_ctx))
return 0;
return 0;
- if (pool_is_free_index (tcp_main.connections[thread_index], conn_index))
+ wrk = tcp_get_worker (thread_index);
+ if (pool_is_free_index (wrk->connections, conn_index))
return 0;
return 0;
- return pool_elt_at_index (
tcp_main.connections[thread_index]
, conn_index);
+ return pool_elt_at_index (
wrk->connections
, conn_index);
}
always_inline tcp_connection_t *
}
always_inline tcp_connection_t *
@@
-749,7
+762,6
@@
tcp_connection_t *tcp_connection_alloc (u8 thread_index);
tcp_connection_t *tcp_connection_alloc_w_base (u8 thread_index,
tcp_connection_t * base);
void tcp_connection_free (tcp_connection_t * tc);
tcp_connection_t *tcp_connection_alloc_w_base (u8 thread_index,
tcp_connection_t * base);
void tcp_connection_free (tcp_connection_t * tc);
-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_v4_source_address_range (vlib_main_t * vm,
ip4_address_t * start,
ip4_address_t * end, u32 table_id);
@@
-758,11
+770,15
@@
int tcp_configure_v6_source_address_range (vlib_main_t * vm,
ip6_address_t * end, u32 table_id);
void tcp_api_reference (void);
u8 *format_tcp_connection (u8 * s, va_list * args);
ip6_address_t * end, u32 table_id);
void tcp_api_reference (void);
u8 *format_tcp_connection (u8 * s, va_list * args);
+u8 *format_tcp_connection_id (u8 * s, va_list * args);
always_inline tcp_connection_t *
tcp_listener_get (u32 tli)
{
always_inline tcp_connection_t *
tcp_listener_get (u32 tli)
{
- return pool_elt_at_index (tcp_main.listener_pool, tli);
+ tcp_connection_t *tc = 0;
+ if (!pool_is_free_index (tcp_main.listener_pool, tli))
+ tc = pool_elt_at_index (tcp_main.listener_pool, tli);
+ return tc;
}
always_inline tcp_connection_t *
}
always_inline tcp_connection_t *