+ listen_session = vcl_session_get_w_handle (wrk, listen_sh);
+ VDBG (0, "session %u [0x%llx]: listen failed! returning %d (%s)",
+ listen_sh, listen_session->vpp_handle, rv,
+ vppcom_retval_str (rv));
+ return rv;
+ }
+
+ return VPPCOM_OK;
+}
+
+int
+vppcom_session_tls_add_cert (uint32_t session_handle, char *cert,
+ uint32_t cert_len)
+{
+
+ vcl_worker_t *wrk = vcl_worker_get_current ();
+ vcl_session_t *session = 0;
+
+ session = vcl_session_get_w_handle (wrk, session_handle);
+ if (!session)
+ return VPPCOM_EBADFD;
+
+ if (cert_len == 0 || cert_len == ~0)
+ return VPPCOM_EBADFD;
+
+ /*
+ * Send listen request to vpp and wait for reply
+ */
+ vppcom_send_application_tls_cert_add (session, cert, cert_len);
+ vcm->app_state = STATE_APP_ADDING_TLS_DATA;
+ vcl_wait_for_app_state_change (STATE_APP_READY);
+ return VPPCOM_OK;
+
+}
+
+int
+vppcom_session_tls_add_key (uint32_t session_handle, char *key,
+ uint32_t key_len)
+{
+
+ vcl_worker_t *wrk = vcl_worker_get_current ();
+ vcl_session_t *session = 0;
+
+ session = vcl_session_get_w_handle (wrk, session_handle);
+ if (!session)
+ return VPPCOM_EBADFD;
+
+ if (key_len == 0 || key_len == ~0)
+ return VPPCOM_EBADFD;
+
+ vppcom_send_application_tls_key_add (session, key, key_len);
+ vcm->app_state = STATE_APP_ADDING_TLS_DATA;
+ vcl_wait_for_app_state_change (STATE_APP_READY);
+ return VPPCOM_OK;
+}
+
+static int
+validate_args_session_accept_ (vcl_worker_t * wrk, vcl_session_t * ls)
+{
+ if (ls->is_vep)
+ {
+ VDBG (0, "ERROR: cannot accept on epoll session %u!",
+ ls->session_index);
+ return VPPCOM_EBADFD;
+ }
+
+ if ((ls->session_state != STATE_LISTEN)
+ && (!vcl_session_is_connectable_listener (wrk, ls)))
+ {
+ VDBG (0,
+ "ERROR: session [0x%llx]: not in listen state! state 0x%x"
+ " (%s)", ls->vpp_handle, ls->session_state,
+ vppcom_session_state_str (ls->session_state));
+ return VPPCOM_EBADFD;
+ }
+ return VPPCOM_OK;
+}
+
+int
+vppcom_unformat_proto (uint8_t * proto, char *proto_str)
+{
+ if (!strcmp (proto_str, "TCP"))
+ *proto = VPPCOM_PROTO_TCP;
+ else if (!strcmp (proto_str, "tcp"))
+ *proto = VPPCOM_PROTO_TCP;
+ else if (!strcmp (proto_str, "UDP"))
+ *proto = VPPCOM_PROTO_UDP;
+ else if (!strcmp (proto_str, "udp"))
+ *proto = VPPCOM_PROTO_UDP;
+ else if (!strcmp (proto_str, "UDPC"))
+ *proto = VPPCOM_PROTO_UDPC;
+ else if (!strcmp (proto_str, "udpc"))
+ *proto = VPPCOM_PROTO_UDPC;
+ else if (!strcmp (proto_str, "SCTP"))
+ *proto = VPPCOM_PROTO_SCTP;
+ else if (!strcmp (proto_str, "sctp"))
+ *proto = VPPCOM_PROTO_SCTP;
+ else if (!strcmp (proto_str, "TLS"))
+ *proto = VPPCOM_PROTO_TLS;
+ else if (!strcmp (proto_str, "tls"))
+ *proto = VPPCOM_PROTO_TLS;
+ else if (!strcmp (proto_str, "QUIC"))
+ *proto = VPPCOM_PROTO_QUIC;
+ else if (!strcmp (proto_str, "quic"))
+ *proto = VPPCOM_PROTO_QUIC;
+ else
+ return 1;
+ return 0;
+}
+
+int
+vppcom_session_accept (uint32_t listen_session_handle, vppcom_endpt_t * ep,
+ uint32_t flags)
+{
+ u32 client_session_index = ~0, listen_session_index, accept_flags = 0;
+ vcl_worker_t *wrk = vcl_worker_get_current ();
+ session_accepted_msg_t accepted_msg;
+ vcl_session_t *listen_session = 0;
+ vcl_session_t *client_session = 0;
+ vcl_session_msg_t *evt;
+ svm_msg_q_msg_t msg;
+ session_event_t *e;
+ u8 is_nonblocking;
+ int rv;
+
+ listen_session = vcl_session_get_w_handle (wrk, listen_session_handle);
+ if (!listen_session)
+ return VPPCOM_EBADFD;
+
+ listen_session_index = listen_session->session_index;
+ if ((rv = validate_args_session_accept_ (wrk, listen_session)))
+ return rv;
+
+ if (clib_fifo_elts (listen_session->accept_evts_fifo))
+ {
+ clib_fifo_sub2 (listen_session->accept_evts_fifo, evt);
+ accept_flags = evt->flags;
+ accepted_msg = evt->accepted_msg;
+ goto handle;