{
u32 n_conns;
+ if (!vlib_num_workers ())
+ return;
+
n_conns = pool_elts (connections);
if (n_conns > 2)
return;
cs->session_state = SESSION_STATE_CONNECTING;
cs->app_wrk_index = client_wrk->wrk_index;
cs->connection_index = cct->c_c_index;
- cs->t_app_index = client_wrk->app_index;
cct->c_s_index = cs->session_index;
cct->client_rx_fifo = ss->tx_fifo;
*/
ss = session_alloc (0);
ll = listen_session_get (ll_index);
- ss->session_type = ll->session_type;
+ ss->session_type = session_type_from_proto_and_ip (TRANSPORT_PROTO_NONE,
+ sct->c_is_ip4);
ss->connection_index = sct->c_c_index;
ss->listener_index = ll->session_index;
ss->session_state = SESSION_STATE_CREATED;
server_wrk = application_listener_select_worker (ll);
ss->app_wrk_index = server_wrk->wrk_index;
- ss->t_app_index = server_wrk->app_index;
sct->c_s_index = ss->session_index;
sct->server_wrk = ss->app_wrk_index;
fib_proto = session_endpoint_fib_proto (sep);
table_index = application_session_table (app, fib_proto);
- ll = session_lookup_listener (table_index, sep);
+ ll = session_lookup_listener_wildcard (table_index, sep);
if (ll)
return ct_connect (app_wrk, ll, sep_ext);
return s;
}
+static int
+ct_custom_tx (void *session)
+{
+ session_t *s = (session_t *) session;
+ if (session_has_transport (s))
+ return 0;
+ return ct_session_tx (s);
+}
+
+static int
+ct_app_rx_evt (transport_connection_t * tc)
+{
+ ct_connection_t *ct = (ct_connection_t *) tc, *peer_ct;
+ session_t *ps;
+
+ peer_ct = ct_connection_get (ct->peer_index);
+ if (!peer_ct)
+ return -1;
+ ps = session_get (peer_ct->c_s_index, peer_ct->c_thread_index);
+ return session_dequeue_notify (ps);
+}
+
static u8 *
format_ct_listener (u8 * s, va_list * args)
{
.connect = ct_session_connect,
.close = ct_session_close,
.get_connection = ct_session_get,
+ .custom_tx = ct_custom_tx,
+ .app_rx_evt = ct_app_rx_evt,
.tx_type = TRANSPORT_TX_INTERNAL,
.service_type = TRANSPORT_SERVICE_APP,
.format_listener = format_ct_listener,