- mp = vl_msg_api_alloc_as_if_client (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
-
- mp->_vl_msg_id = clib_host_to_net_u16 (VL_API_ACCEPT_SESSION);
- mp->context = server->index;
- listener = listen_session_get (s->session_type, s->listener_index);
- tp_vft = transport_protocol_get_vft (session_get_transport_proto (s));
- tc = tp_vft->get_connection (s->connection_index, s->thread_index);
- mp->listener_handle = listen_session_get_handle (listener);
-
- if (application_is_proxy (server))
- {
- listener =
- application_first_listener (server,
- transport_connection_fib_proto (tc),
- tc->proto);
- if (listener)
- mp->listener_handle = listen_session_get_handle (listener);
- }
- mp->handle = session_handle (s);
- mp->server_rx_fifo = pointer_to_uword (s->server_rx_fifo);
- mp->server_tx_fifo = pointer_to_uword (s->server_tx_fifo);
- mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
- mp->port = tc->rmt_port;
- mp->is_ip4 = tc->is_ip4;
- clib_memcpy (&mp->ip, &tc->rmt_ip, sizeof (tc->rmt_ip));
- vl_msg_api_send_shmem (q, (u8 *) & mp);
+ evt = svm_msg_q_msg_data (app_mq, msg);
+ clib_memset (evt, 0, sizeof (*evt));
+ evt->event_type = SESSION_CTRL_EVT_ACCEPTED;
+ mp = (session_accepted_msg_t *) evt->data;
+ clib_memset (mp, 0, sizeof (*mp));
+ mp->context = app->app_index;
+ mp->server_rx_fifo = pointer_to_uword (s->rx_fifo);
+ mp->server_tx_fifo = pointer_to_uword (s->tx_fifo);
+ mp->segment_handle = session_segment_handle (s);
+
+ if (session_has_transport (s))
+ {
+ listener = listen_session_get (s->listener_index);
+ al = app_listener_get (app, listener->al_index);
+ mp->listener_handle = app_listener_handle (al);
+ if (application_is_proxy (app))
+ {
+ listener =
+ app_worker_first_listener (app_wrk, session_get_fib_proto (s),
+ session_get_transport_proto (s));
+ if (listener)
+ mp->listener_handle = listen_session_get_handle (listener);
+ }
+ vpp_queue = session_main_get_vpp_event_queue (s->thread_index);
+ mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
+ mp->handle = session_handle (s);
+ tc = transport_get_connection (session_get_transport_proto (s),
+ s->connection_index, s->thread_index);
+ mp->port = tc->rmt_port;
+ mp->is_ip4 = tc->is_ip4;
+ clib_memcpy_fast (&mp->ip, &tc->rmt_ip, sizeof (tc->rmt_ip));
+ }
+ else
+ {
+ u8 main_thread = vlib_num_workers ()? 1 : 0;
+ ct_connection_t *ct;
+
+ ct = (ct_connection_t *) session_get_transport (s);
+ send_app_cut_through_registration_add (app_wrk->api_client_index,
+ app_wrk->wrk_map_index,
+ ct->server_evt_q,
+ ct->client_evt_q);
+
+ listener = listen_session_get (s->listener_index);
+ al = app_listener_get (app, listener->al_index);
+ mp->listener_handle = app_listener_handle (al);
+ mp->is_ip4 = session_type_is_ip4 (listener->session_type);
+ mp->handle = session_handle (s);
+ mp->port = ct->c_rmt_port;
+ vpp_queue = session_main_get_vpp_event_queue (main_thread);
+ mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
+ mp->client_event_queue_address = ct->client_evt_q;
+ mp->server_event_queue_address = ct->server_evt_q;
+ }
+ svm_msg_q_add_and_unlock (app_mq, msg);