bmp->options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_ADD_SEGMENT;
bmp->options[APP_OPTIONS_FLAGS] |= APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE;
bmp->options[APP_OPTIONS_FLAGS] |= APP_OPTIONS_FLAGS_USE_LOCAL_SCOPE;
- bmp->options[APP_OPTIONS_FLAGS] |= APP_OPTIONS_FLAGS_USE_MQ_FOR_CTRL_MSGS;
bmp->options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] = 2;
bmp->options[APP_OPTIONS_RX_FIFO_SIZE] = utm->fifo_size;
bmp->options[APP_OPTIONS_TX_FIFO_SIZE] = utm->fifo_size;
else
{
/* We don't do anything with the data, drop it */
- actual_transfer = svm_fifo_max_dequeue (rx_fifo);
+ actual_transfer = svm_fifo_max_dequeue_cons (rx_fifo);
svm_fifo_dequeue_drop (rx_fifo, actual_transfer);
}
}
session_index = session - utm->sessions;
session->session_index = session_index;
- /* Cut-through case */
- if (mp->server_event_queue_address)
- {
- clib_warning ("cut-through session");
- session->vpp_evt_q = uword_to_pointer (mp->client_event_queue_address,
- svm_msg_q_t *);
- sleep (1);
- rx_fifo->master_session_index = session_index;
- tx_fifo->master_session_index = session_index;
- utm->cut_through_session_index = session_index;
- session->rx_fifo = rx_fifo;
- session->tx_fifo = tx_fifo;
- session->is_dgram = 0;
-
- rv = pthread_create (&utm->cut_through_thread_handle,
- NULL /*attr */ , cut_through_thread_fn, 0);
- if (rv)
- {
- clib_warning ("pthread_create returned %d", rv);
- rv = VNET_API_ERROR_SYSCALL_ERROR_1;
- }
- }
- else
- {
- rx_fifo->client_session_index = session_index;
- tx_fifo->client_session_index = session_index;
- session->rx_fifo = rx_fifo;
- session->tx_fifo = tx_fifo;
- clib_memcpy_fast (&session->transport.rmt_ip, mp->ip,
- sizeof (ip46_address_t));
- session->transport.is_ip4 = mp->is_ip4;
- session->transport.rmt_port = mp->port;
- }
+ rx_fifo->client_session_index = session_index;
+ tx_fifo->client_session_index = session_index;
+ session->rx_fifo = rx_fifo;
+ session->tx_fifo = tx_fifo;
+ clib_memcpy_fast (&session->transport.rmt_ip, mp->ip,
+ sizeof (ip46_address_t));
+ session->transport.is_ip4 = mp->is_ip4;
+ session->transport.rmt_port = mp->port;
hash_set (utm->session_index_by_vpp_handles, mp->handle, session_index);
if (pool_elts (utm->sessions) && (pool_elts (utm->sessions) % 20000) == 0)
session->tx_fifo = uword_to_pointer (mp->server_tx_fifo, svm_fifo_t *);
/* Cut-through case */
- if (mp->client_event_queue_address)
+ if (mp->ct_rx_fifo)
{
clib_warning ("cut-through session");
- session->vpp_evt_q = uword_to_pointer (mp->server_event_queue_address,
+ session->vpp_evt_q = uword_to_pointer (mp->vpp_event_queue_address,
svm_msg_q_t *);
- utm->ct_event_queue = uword_to_pointer (mp->client_event_queue_address,
- svm_msg_q_t *);
utm->cut_through_session_index = session->session_index;
session->is_dgram = 0;
sleep (1);
session->rx_fifo->client_session_index = session->session_index;
session->tx_fifo->client_session_index = session->session_index;
+ /* TODO use ct fifos */
}
else
{
u8 *test_data = utm->connect_test_data;
u32 bytes_to_snd, enq_space, min_chunk;
- session_evt_type_t et = FIFO_EVENT_APP_TX;
int written;
test_buf_len = vec_len (test_data);
test_buf_offset = utm->bytes_sent % test_buf_len;
bytes_this_chunk = clib_min (test_buf_len - test_buf_offset,
utm->bytes_to_send);
- enq_space = svm_fifo_max_enqueue (s->tx_fifo);
+ enq_space = svm_fifo_max_enqueue_prod (s->tx_fifo);
bytes_this_chunk = clib_min (bytes_this_chunk, enq_space);
- et += (s->session_index == utm->cut_through_session_index);
-
- if (s->is_dgram)
- written = app_send_dgram_raw (s->tx_fifo, &s->transport, s->vpp_evt_q,
- test_data + test_buf_offset,
- bytes_this_chunk, et, SVM_Q_WAIT);
- else
- written = app_send_stream_raw (s->tx_fifo, s->vpp_evt_q,
- test_data + test_buf_offset,
- bytes_this_chunk, et, SVM_Q_WAIT);
+ written = app_send (s, test_data + test_buf_offset, bytes_this_chunk,
+ SVM_Q_WAIT);
if (written > 0)
{
utm->bytes_to_send -= written;
wait_for_state_change (utm, STATE_DETACHED);
}
-static void
-vl_api_bind_uri_reply_t_handler (vl_api_bind_uri_reply_t * mp)
-{
- udp_echo_main_t *utm = &udp_echo_main;
- svm_fifo_t *rx_fifo, *tx_fifo;
- app_session_t *session;
- u32 session_index;
-
- if (mp->retval)
- {
- clib_warning ("bind failed: %d", mp->retval);
- utm->state = STATE_FAILED;
- return;
- }
-
- rx_fifo = uword_to_pointer (mp->rx_fifo, svm_fifo_t *);
- tx_fifo = uword_to_pointer (mp->tx_fifo, svm_fifo_t *);
-
- pool_get (utm->sessions, session);
- clib_memset (session, 0, sizeof (*session));
- session_index = session - utm->sessions;
-
- rx_fifo->client_session_index = session_index;
- tx_fifo->client_session_index = session_index;
- session->rx_fifo = rx_fifo;
- session->tx_fifo = tx_fifo;
- clib_memcpy_fast (&session->transport.lcl_ip, mp->lcl_ip,
- sizeof (ip46_address_t));
- session->transport.is_ip4 = mp->lcl_is_ip4;
- session->transport.lcl_port = mp->lcl_port;
- session->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *);
-
- utm->state = utm->is_connected ? STATE_BOUND : STATE_READY;
-}
-
static void
vl_api_map_another_segment_t_handler (vl_api_map_another_segment_t * mp)
{
}
#define foreach_tcp_echo_msg \
-_(BIND_URI_REPLY, bind_uri_reply) \
_(UNBIND_URI_REPLY, unbind_uri_reply) \
_(MAP_ANOTHER_SEGMENT, map_another_segment) \
_(UNMAP_SEGMENT, unmap_segment) \
app_session_t *session;
int rv;
u32 max_dequeue, offset, max_transfer, rx_buf_len;
- session_evt_type_t et = FIFO_EVENT_APP_TX;
session = pool_elt_at_index (utm->sessions, session_index);
rx_buf_len = vec_len (utm->rx_buf);
rx_fifo = session->rx_fifo;
tx_fifo = session->tx_fifo;
- et += (session->session_index == utm->cut_through_session_index);
- max_dequeue = svm_fifo_max_dequeue (rx_fifo);
+ max_dequeue = svm_fifo_max_dequeue_cons (rx_fifo);
/* Allow enqueuing of a new event */
svm_fifo_unset_event (rx_fifo);
offset = 0;
do
{
- if (session->is_dgram)
- rv = app_send_dgram_raw (tx_fifo, &session->transport,
- session->vpp_evt_q,
- &utm->rx_buf[offset], n_read, et,
- SVM_Q_WAIT);
- else
- rv = app_send_stream_raw (tx_fifo, session->vpp_evt_q,
- &utm->rx_buf[offset], n_read, et,
- SVM_Q_WAIT);
+ rv = app_send (session, &utm->rx_buf[offset], n_read,
+ SVM_Q_WAIT);
if (rv > 0)
{
n_read -= rv;
/* If event wasn't set, add one */
if (svm_fifo_set_event (tx_fifo))
- app_send_io_evt_to_vpp (session->vpp_evt_q, tx_fifo,
- et, SVM_Q_WAIT);
+ app_send_io_evt_to_vpp (session->vpp_evt_q,
+ tx_fifo->master_session_index,
+ SESSION_IO_EVT_TX, SVM_Q_WAIT);
}
}
while ((n_read < 0 || max_dequeue > 0) && !utm->time_to_stop);
e = svm_msg_q_msg_data (mq, &msg);
switch (e->event_type)
{
- case FIFO_EVENT_APP_RX:
- server_handle_fifo_event_rx (utm, e->fifo->client_session_index);
- break;
- case SESSION_IO_EVT_CT_TX:
+ case SESSION_IO_EVT_RX:
+ server_handle_fifo_event_rx (utm, e->session_index);
break;
default: