diff options
author | Florin Coras <fcoras@cisco.com> | 2019-01-28 15:54:27 -0800 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-01-30 09:08:11 +0000 |
commit | 2d675d72d378466d1d71a4323891071038ba21d9 (patch) | |
tree | 75bfc072ed2fc0ec90bb69f0935f1739a69ca704 /src/vcl/vcl_private.h | |
parent | 822f5a498b3a21ee990a39d32b644eea947b31bb (diff) |
vls: support passive listeners
If an application worker calls listen on a session, vpp registers the
worker to the listener's work load balance group and, as new connections
are accepted, it may potentially push accept notifications to it.
There are however applications, like nginx, that on some workers may
never accept new connections on a session they've started listening on.
To avoid accumulating accept events on such workers, this patch adds
support for passive listeners. That is, workers that have started
listening on a session but then never call accept or epoll/select on
that listener.
Change-Id: I007e6dcb54fc88a0e3aab3c6e2a3d1ef135cbd58
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vcl/vcl_private.h')
-rw-r--r-- | src/vcl/vcl_private.h | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h index 1cde85027a5..c61bb0b9247 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -63,14 +63,15 @@ typedef enum typedef enum { - STATE_START = 0x01, - STATE_CONNECT = 0x02, - STATE_LISTEN = 0x04, - STATE_ACCEPT = 0x08, - STATE_VPP_CLOSING = 0x10, - STATE_DISCONNECT = 0x20, - STATE_FAILED = 0x40, - STATE_UPDATED = 0x80, + STATE_START = 0, + STATE_CONNECT = 0x01, + STATE_LISTEN = 0x02, + STATE_ACCEPT = 0x04, + STATE_VPP_CLOSING = 0x08, + STATE_DISCONNECT = 0x10, + STATE_FAILED = 0x20, + STATE_UPDATED = 0x40, + STATE_LISTEN_NO_MQ = 0x80, } session_state_t; #define SERVER_STATE_OPEN (STATE_ACCEPT|STATE_VPP_CLOSING) @@ -491,7 +492,7 @@ vcl_session_table_lookup_listener (vcl_worker_t * wrk, u64 listener_handle) } session = pool_elt_at_index (wrk->sessions, p[0]); - ASSERT (session->session_state & STATE_LISTEN); + ASSERT (session->session_state & (STATE_LISTEN | STATE_LISTEN_NO_MQ)); return session; } @@ -566,6 +567,12 @@ vcl_worker_get_current (void) return vcl_worker_get (vcl_get_worker_index ()); } +static inline u8 +vcl_n_workers (void) +{ + return pool_elts (vcm->workers); +} + static inline svm_msg_q_t * vcl_session_vpp_evt_q (vcl_worker_t * wrk, vcl_session_t * s) { @@ -588,7 +595,7 @@ void vppcom_app_send_detach (void); void vppcom_send_connect_sock (vcl_session_t * session); void vppcom_send_disconnect_session (u64 vpp_handle); void vppcom_send_bind_sock (vcl_session_t * session); -void vppcom_send_unbind_sock (u64 vpp_handle); +void vppcom_send_unbind_sock (vcl_worker_t * wrk, u64 vpp_handle); void vppcom_api_hookup (void); void vppcom_send_application_tls_cert_add (vcl_session_t * session, char *cert, u32 cert_len); |