aboutsummaryrefslogtreecommitdiffstats
path: root/src/vcl/vcl_private.h
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-01-28 15:54:27 -0800
committerDamjan Marion <dmarion@me.com>2019-01-30 09:08:11 +0000
commit2d675d72d378466d1d71a4323891071038ba21d9 (patch)
tree75bfc072ed2fc0ec90bb69f0935f1739a69ca704 /src/vcl/vcl_private.h
parent822f5a498b3a21ee990a39d32b644eea947b31bb (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.h27
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);