diff options
-rw-r--r-- | src/vnet/session/transport.c | 76 |
1 files changed, 37 insertions, 39 deletions
diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c index 192a201612a..554508672e7 100644 --- a/src/vnet/session/transport.c +++ b/src/vnet/session/transport.c @@ -17,36 +17,26 @@ #include <vnet/session/session.h> #include <vnet/fib/fib.h> -typedef struct local_endpoint_ -{ - transport_endpoint_t ep; - int refcnt; -} local_endpoint_t; - /** * Per-type vector of transport protocol virtual function tables */ transport_proto_vft_t *tp_vfts; -/* - * Port allocator seed - */ -static u32 port_allocator_seed; - -/* - * Local endpoints table - */ -static transport_endpoint_table_t local_endpoints_table; +typedef struct local_endpoint_ +{ + transport_endpoint_t ep; + int refcnt; +} local_endpoint_t; -/* - * Pool of local endpoints - */ -static local_endpoint_t *local_endpoints; +typedef struct transport_main_ +{ + transport_endpoint_table_t local_endpoints_table; + local_endpoint_t *local_endpoints; + u32 port_allocator_seed; + clib_spinlock_t local_endpoints_lock; +} transport_main_t; -/* - * Local endpoints pool lock - */ -static clib_spinlock_t local_endpoints_lock; +static transport_main_t tp_main; u8 * format_transport_proto (u8 * s, va_list * args) @@ -426,52 +416,58 @@ transport_connection_attribute (transport_proto_t tp, u32 conn_index, void transport_endpoint_free (u32 tepi) { - pool_put_index (local_endpoints, tepi); + transport_main_t *tm = &tp_main; + pool_put_index (tm->local_endpoints, tepi); } always_inline local_endpoint_t * transport_endpoint_alloc (void) { + transport_main_t *tm = &tp_main; local_endpoint_t *lep; ASSERT (vlib_get_thread_index () <= transport_cl_thread ()); - pool_get_aligned_safe (local_endpoints, lep, 0); + pool_get_aligned_safe (tm->local_endpoints, lep, 0); return lep; } void transport_endpoint_cleanup (u8 proto, ip46_address_t * lcl_ip, u16 port) { + transport_main_t *tm = &tp_main; local_endpoint_t *lep; u32 lepi; /* Cleanup local endpoint if this was an active connect */ - lepi = transport_endpoint_lookup (&local_endpoints_table, proto, lcl_ip, + lepi = transport_endpoint_lookup (&tm->local_endpoints_table, proto, lcl_ip, clib_net_to_host_u16 (port)); if (lepi == ENDPOINT_INVALID_INDEX) return; - lep = pool_elt_at_index (local_endpoints, lepi); + lep = pool_elt_at_index (tm->local_endpoints, lepi); if (!clib_atomic_sub_fetch (&lep->refcnt, 1)) { - transport_endpoint_table_del (&local_endpoints_table, proto, &lep->ep); + transport_endpoint_table_del (&tm->local_endpoints_table, proto, + &lep->ep); /* All workers can free connections. Synchronize access to pool */ - clib_spinlock_lock (&local_endpoints_lock); + clib_spinlock_lock (&tm->local_endpoints_lock); transport_endpoint_free (lepi); - clib_spinlock_unlock (&local_endpoints_lock); + clib_spinlock_unlock (&tm->local_endpoints_lock); } } static int transport_endpoint_mark_used (u8 proto, ip46_address_t *ip, u16 port) { + transport_main_t *tm = &tp_main; local_endpoint_t *lep; u32 tei; ASSERT (vlib_get_thread_index () <= transport_cl_thread ()); - tei = transport_endpoint_lookup (&local_endpoints_table, proto, ip, port); + tei = + transport_endpoint_lookup (&tm->local_endpoints_table, proto, ip, port); if (tei != ENDPOINT_INVALID_INDEX) return SESSION_E_PORTINUSE; @@ -481,8 +477,8 @@ transport_endpoint_mark_used (u8 proto, ip46_address_t *ip, u16 port) lep->ep.port = port; lep->refcnt = 1; - transport_endpoint_table_add (&local_endpoints_table, proto, &lep->ep, - lep - local_endpoints); + transport_endpoint_table_add (&tm->local_endpoints_table, proto, &lep->ep, + lep - tm->local_endpoints); return 0; } @@ -490,14 +486,15 @@ transport_endpoint_mark_used (u8 proto, ip46_address_t *ip, u16 port) void transport_share_local_endpoint (u8 proto, ip46_address_t * lcl_ip, u16 port) { + transport_main_t *tm = &tp_main; local_endpoint_t *lep; u32 lepi; - lepi = transport_endpoint_lookup (&local_endpoints_table, proto, lcl_ip, + lepi = transport_endpoint_lookup (&tm->local_endpoints_table, proto, lcl_ip, clib_net_to_host_u16 (port)); if (lepi != ENDPOINT_INVALID_INDEX) { - lep = pool_elt_at_index (local_endpoints, lepi); + lep = pool_elt_at_index (tm->local_endpoints, lepi); clib_atomic_add_fetch (&lep->refcnt, 1); } } @@ -525,7 +522,7 @@ transport_alloc_local_port (u8 proto, ip46_address_t * ip) /* Find a port in the specified range */ while (1) { - port = random_u32 (&port_allocator_seed) & PORT_MASK; + port = random_u32 (&tp_main.port_allocator_seed) & PORT_MASK; if (PREDICT_TRUE (port >= min && port < max)) break; } @@ -846,6 +843,7 @@ transport_init (void) { vlib_thread_main_t *vtm = vlib_get_thread_main (); session_main_t *smm = vnet_get_session_main (); + transport_main_t *tm = &tp_main; u32 num_threads; if (smm->local_endpoints_table_buckets == 0) @@ -854,12 +852,12 @@ transport_init (void) smm->local_endpoints_table_memory = 512 << 20; /* Initialize [port-allocator] random number seed */ - port_allocator_seed = (u32) clib_cpu_time_now (); + tm->port_allocator_seed = (u32) clib_cpu_time_now (); - clib_bihash_init_24_8 (&local_endpoints_table, "local endpoints table", + clib_bihash_init_24_8 (&tm->local_endpoints_table, "local endpoints table", smm->local_endpoints_table_buckets, smm->local_endpoints_table_memory); - clib_spinlock_init (&local_endpoints_lock); + clib_spinlock_init (&tm->local_endpoints_lock); num_threads = 1 /* main thread */ + vtm->n_threads; if (num_threads > 1) |