- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] Got a request: client sid %d", vcm->my_pid,
- client_session_index);
-
- ep->vrf = client_session->vrf;
- ep->is_cut_thru = client_session->is_cut_thru;
- ep->is_ip4 = client_session->peer_addr.is_ip4;
- ep->port = client_session->port;
- if (client_session->peer_addr.is_ip4)
- clib_memcpy (ep->ip, &client_session->peer_addr.ip46.ip4,
- sizeof (ip4_address_t));
- else
- clib_memcpy (ep->ip, &client_session->peer_addr.ip46.ip6,
- sizeof (ip6_address_t));
- clib_spinlock_unlock (&vcm->sessions_lockp);
- return (int) client_session_index;
-}
-
-int
-vppcom_session_connect (uint32_t session_index, vppcom_endpt_t * server_ep)
-{
- vppcom_main_t *vcm = &vppcom_main;
- session_t *session = 0;
- int rv;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- rv = vppcom_session_at_index (session_index, &session);
- if (PREDICT_FALSE (rv))
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] invalid session, sid (%u) has been closed!",
- vcm->my_pid, session_index);
- return rv;
- }
-
- if (session->is_vep)
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] invalid session, sid (%u) is an epoll session!",
- vcm->my_pid, session_index);
- return VPPCOM_EBADFD;
- }
-
- if (session->state == STATE_CONNECT)
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] session, sid (%u) already connected!",
- vcm->my_pid, session_index);
- return VPPCOM_OK;
- }
-
- session->vrf = server_ep->vrf;
- session->peer_addr.is_ip4 = server_ep->is_ip4;
- session->peer_addr.ip46 = to_ip46 (!server_ep->is_ip4, server_ep->ip);
- session->port = server_ep->port;
-
- if (VPPCOM_DEBUG > 0)
- {
- u8 *ip_str = format (0, "%U", format_ip46_address,
- &session->peer_addr.ip46,
- session->peer_addr.is_ip4);
- clib_warning ("[%d] connect sid %d to %s server port %d proto %s",
- vcm->my_pid, session_index, ip_str,
- clib_net_to_host_u16 (session->port),
- session->proto ? "UDP" : "TCP");
- vec_free (ip_str);
- }
-
- vppcom_send_connect_sock (session, session_index);
- clib_spinlock_unlock (&vcm->sessions_lockp);
- rv = vppcom_wait_for_session_state_change (session_index, STATE_CONNECT,
- vcm->cfg.session_timeout);
- if (PREDICT_FALSE (rv))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] connect timed out, rv = %s (%d)",
- vcm->my_pid, vppcom_retval_str (rv), rv);
- return rv;
- }
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sid %d connected!", vcm->my_pid, session_index);
-
- return VPPCOM_OK;
-}
-
-int
-vppcom_session_read (uint32_t session_index, void *buf, int n)
-{
- vppcom_main_t *vcm = &vppcom_main;
- session_t *session = 0;
- svm_fifo_t *rx_fifo;
- int n_read = 0;
- int rv;
- char *fifo_str;
- u32 poll_et;
-
- ASSERT (buf);
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- rv = vppcom_session_at_index (session_index, &session);
- if (PREDICT_FALSE (rv))
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] invalid session, sid (%u) has been closed!",
- vcm->my_pid, session_index);
- return rv;
- }
-
- if (session->is_vep)
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] invalid session, sid (%u) is an epoll session!",
- vcm->my_pid, session_index);
- return VPPCOM_EBADFD;
- }
-
- if (session->state == STATE_DISCONNECT)
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sid (%u) has been closed by remote peer!",
- vcm->my_pid, session_index);
- return VPPCOM_ECONNRESET;
- }
-
- rx_fifo = ((!session->is_cut_thru || session->is_server) ?
- session->server_rx_fifo : session->server_tx_fifo);
- fifo_str = ((!session->is_cut_thru || session->is_server) ?
- "server_rx_fifo" : "server_tx_fifo");
- poll_et = EPOLLET & session->vep.ev.events;
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- do
- {
- n_read = svm_fifo_dequeue_nowait (rx_fifo, n, buf);
- }
- while (!session->is_nonblocking && (n_read <= 0));
-
- if (poll_et && (n_read <= 0))
- {
- clib_spinlock_lock (&vcm->sessions_lockp);
- session->vep.et_mask |= EPOLLIN;
- clib_spinlock_unlock (&vcm->sessions_lockp);
- }
-
- if ((VPPCOM_DEBUG > 2) && (n_read > 0))
- clib_warning ("[%d] sid %d, read %d bytes from %s (%p)", vcm->my_pid,
- session_index, n_read, fifo_str, rx_fifo);
-
- return (n_read <= 0) ? VPPCOM_EAGAIN : n_read;
-}
-
-static inline int
-vppcom_session_read_ready (session_t * session, u32 session_index)
-{
- vppcom_main_t *vcm = &vppcom_main;
- svm_fifo_t *rx_fifo;
- int ready = 0;