summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/unittest/tcp_test.c14
-rw-r--r--src/vnet/tcp/tcp.c46
-rw-r--r--src/vnet/tcp/tcp.h48
3 files changed, 50 insertions, 58 deletions
diff --git a/src/plugins/unittest/tcp_test.c b/src/plugins/unittest/tcp_test.c
index bdd74c8bc0a..a485823ffc7 100644
--- a/src/plugins/unittest/tcp_test.c
+++ b/src/plugins/unittest/tcp_test.c
@@ -815,7 +815,6 @@ static int
tcp_test_lookup (vlib_main_t * vm, unformat_input_t * input)
{
session_main_t *smm = &session_main;
- tcp_main_t *tm = &tcp_main;
transport_connection_t _tc1, *tc1 = &_tc1, _tc2, *tc2 = &_tc2, *tconn;
tcp_connection_t *tc;
session_t *s, *s1;
@@ -829,9 +828,7 @@ tcp_test_lookup (vlib_main_t * vm, unformat_input_t * input)
clib_memset (s, 0, sizeof (*s));
s->session_index = sidx = s - smm->wrk[0].sessions;
- pool_get (tm->connections[0], tc);
- clib_memset (tc, 0, sizeof (*tc));
- tc->connection.c_index = tc - tm->connections[0];
+ tc = tcp_connection_alloc (0);
tc->connection.s_index = s->session_index;
s->connection_index = tc->connection.c_index;
@@ -850,9 +847,7 @@ tcp_test_lookup (vlib_main_t * vm, unformat_input_t * input)
clib_memset (s, 0, sizeof (*s));
s->session_index = s - smm->wrk[0].sessions;
- pool_get (tm->connections[0], tc);
- clib_memset (tc, 0, sizeof (*tc));
- tc->connection.c_index = tc - tm->connections[0];
+ tc = tcp_connection_alloc (0);
tc->connection.s_index = s->session_index;
s->connection_index = tc->connection.c_index;
@@ -926,7 +921,6 @@ tcp_test_session (vlib_main_t * vm, unformat_input_t * input)
tcp_connection_t *tc0;
ip4_address_t local, remote;
u16 local_port, remote_port;
- tcp_main_t *tm = vnet_get_tcp_main ();
int is_add = 1;
@@ -947,12 +941,10 @@ tcp_test_session (vlib_main_t * vm, unformat_input_t * input)
local_port = clib_host_to_net_u16 (1234);
remote_port = clib_host_to_net_u16 (11234);
- pool_get (tm->connections[0], tc0);
- clib_memset (tc0, 0, sizeof (*tc0));
+ tc0 = tcp_connection_alloc (0);
tc0->state = TCP_STATE_ESTABLISHED;
tc0->rcv_las = 1;
- tc0->c_c_index = tc0 - tm->connections[0];
tc0->c_lcl_port = local_port;
tc0->c_rmt_port = remote_port;
tc0->c_is_ip4 = 1;
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c
index c3fa6d49da5..ec24082347f 100644
--- a/src/vnet/tcp/tcp.c
+++ b/src/vnet/tcp/tcp.c
@@ -237,8 +237,6 @@ tcp_half_open_connection_new (void)
void
tcp_connection_cleanup (tcp_connection_t * tc)
{
- tcp_main_t *tm = &tcp_main;
-
TCP_EVT (TCP_EVT_DELETE, tc);
/* Cleanup local endpoint if this was an active connect */
@@ -257,8 +255,6 @@ tcp_connection_cleanup (tcp_connection_t * tc)
}
else
{
- int thread_index = tc->c_thread_index;
-
/* Make sure all timers are cleared */
tcp_connection_timers_reset (tc);
@@ -274,10 +270,7 @@ tcp_connection_cleanup (tcp_connection_t * tc)
if (tc->cfg_flags & TCP_CFG_F_RATE_SAMPLE)
tcp_bt_cleanup (tc);
- /* Poison the entry */
- if (CLIB_DEBUG > 0)
- clib_memset (tc, 0xFA, sizeof (*tc));
- pool_put (tm->connections[thread_index], tc);
+ tcp_connection_free (tc);
}
}
@@ -298,12 +291,12 @@ tcp_connection_del (tcp_connection_t * tc)
tcp_connection_t *
tcp_connection_alloc (u8 thread_index)
{
- tcp_main_t *tm = vnet_get_tcp_main ();
+ tcp_worker_ctx_t *wrk = tcp_get_worker (thread_index);
tcp_connection_t *tc;
- pool_get (tm->connections[thread_index], tc);
+ pool_get (wrk->connections, tc);
clib_memset (tc, 0, sizeof (*tc));
- tc->c_c_index = tc - tm->connections[thread_index];
+ tc->c_c_index = tc - wrk->connections;
tc->c_thread_index = thread_index;
return tc;
}
@@ -311,12 +304,12 @@ tcp_connection_alloc (u8 thread_index)
tcp_connection_t *
tcp_connection_alloc_w_base (u8 thread_index, tcp_connection_t * base)
{
- tcp_main_t *tm = vnet_get_tcp_main ();
+ tcp_worker_ctx_t *wrk = tcp_get_worker (thread_index);
tcp_connection_t *tc;
- pool_get (tm->connections[thread_index], tc);
+ pool_get (wrk->connections, tc);
clib_memcpy_fast (tc, base, sizeof (*tc));
- tc->c_c_index = tc - tm->connections[thread_index];
+ tc->c_c_index = tc - wrk->connections;
tc->c_thread_index = thread_index;
return tc;
}
@@ -324,15 +317,14 @@ tcp_connection_alloc_w_base (u8 thread_index, tcp_connection_t * base)
void
tcp_connection_free (tcp_connection_t * tc)
{
- tcp_main_t *tm = &tcp_main;
+ tcp_worker_ctx_t *wrk = tcp_get_worker (tc->c_thread_index);
if (CLIB_DEBUG)
{
- u8 thread_index = tc->c_thread_index;
clib_memset (tc, 0xFA, sizeof (*tc));
- pool_put (tm->connections[thread_index], tc);
+ pool_put (wrk->connections, tc);
return;
}
- pool_put (tm->connections[tc->c_thread_index], tc);
+ pool_put (wrk->connections, tc);
}
/**
@@ -1514,6 +1506,7 @@ tcp_main_enable (vlib_main_t * vm)
u32 num_threads, n_workers, prealloc_conn_per_wrk;
tcp_connection_t *tc __attribute__ ((unused));
tcp_main_t *tm = vnet_get_tcp_main ();
+ tcp_worker_ctx_t *wrk;
clib_error_t *error = 0;
int thread;
@@ -1536,25 +1529,28 @@ tcp_main_enable (vlib_main_t * vm)
*/
num_threads = 1 /* main thread */ + vtm->n_threads;
- vec_validate (tm->connections, num_threads - 1);
vec_validate (tm->wrk_ctx, num_threads - 1);
n_workers = num_threads == 1 ? 1 : vtm->n_threads;
prealloc_conn_per_wrk = tcp_cfg.preallocated_connections / n_workers;
for (thread = 0; thread < num_threads; thread++)
{
- vec_validate (tm->wrk_ctx[thread].pending_deq_acked, 255);
- vec_validate (tm->wrk_ctx[thread].pending_disconnects, 255);
- vec_reset_length (tm->wrk_ctx[thread].pending_deq_acked);
- vec_reset_length (tm->wrk_ctx[thread].pending_disconnects);
- tm->wrk_ctx[thread].vm = vlib_mains[thread];
+ wrk = &tm->wrk_ctx[thread];
+
+ vec_validate (wrk->pending_deq_acked, 255);
+ vec_validate (wrk->pending_disconnects, 255);
+ vec_validate (wrk->pending_resets, 255);
+ vec_reset_length (wrk->pending_deq_acked);
+ vec_reset_length (wrk->pending_disconnects);
+ vec_reset_length (wrk->pending_resets);
+ wrk->vm = vlib_mains[thread];
/*
* Preallocate connections. Assume that thread 0 won't
* use preallocated threads when running multi-core
*/
if ((thread > 0 || num_threads == 1) && prealloc_conn_per_wrk)
- pool_init_fixed (tm->connections[thread], prealloc_conn_per_wrk);
+ pool_init_fixed (wrk->connections, prealloc_conn_per_wrk);
}
/*
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index 36e98a98dd6..59ccf8f1a73 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -506,11 +506,8 @@ typedef struct tcp_worker_ctx_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
- /** 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;
@@ -518,6 +515,7 @@ typedef struct tcp_worker_ctx_
/** vector of pending disconnect notifications */
u32 *pending_disconnects;
+ /** vector of pending reset notifications */
u32 *pending_resets;
/** convenience pointer to this thread's vlib main */
@@ -526,11 +524,17 @@ typedef struct tcp_worker_ctx_
/** 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];
+ /** tx buffer free list */
+ u32 *tx_buffers;
+
/** worker timer wheel */
tw_timer_wheel_16t_2w_512sl_t timer_wheel;
@@ -614,27 +618,24 @@ typedef struct tcp_configuration_
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;
+ 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];
- 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;
- 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;
@@ -694,6 +695,7 @@ vnet_get_tcp_main ()
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];
}
@@ -721,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)
{
- 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 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)
{
- if (tcp_main.connections[thread_index] == 0)
+ tcp_worker_ctx_t *wrk;
+ if (thread_index >= vec_len (tcp_main.wrk_ctx))
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 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 *