_(IS_PROXY, "Application is proxying") \
_(USE_GLOBAL_SCOPE, "App can use global session scope") \
_(USE_LOCAL_SCOPE, "App can use local session scope") \
- _(USE_MQ_FOR_CTRL_MSGS, "Use message queue for ctr msgs") \
_(EVT_MQ_USE_EVENTFD, "Use eventfds for signaling") \
typedef enum _app_options
uword server_tx_fifo;
u64 segment_handle;
uword vpp_event_queue_address;
- uword server_event_queue_address;
- uword client_event_queue_address;
u16 port;
u8 is_ip4;
u8 ip[16];
uword server_rx_fifo;
uword server_tx_fifo;
u64 segment_handle;
+ uword ct_rx_fifo;
+ uword ct_tx_fifo;
+ u64 ct_segment_handle;
uword vpp_event_queue_address;
- uword client_event_queue_address;
- uword server_event_queue_address;
u32 segment_size;
u8 segment_name_length;
u8 segment_name[64];
* @return 0 if success, negative integer otherwise
*/
static inline int
-app_send_io_evt_to_vpp (svm_msg_q_t * mq, svm_fifo_t * f, u8 evt_type,
+app_send_io_evt_to_vpp (svm_msg_q_t * mq, u32 session_index, u8 evt_type,
u8 noblock)
{
session_event_t *evt;
return -2;
}
evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
- evt->fifo = f;
+ evt->session_index = session_index;
evt->event_type = evt_type;
svm_msg_q_add_and_unlock (mq, &msg);
return 0;
svm_msg_q_wait (mq);
msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
- evt->fifo = f;
+ evt->session_index = session_index;
evt->event_type = evt_type;
if (svm_msg_q_is_full (mq))
svm_msg_q_wait (mq);
always_inline int
app_send_dgram_raw (svm_fifo_t * f, app_session_transport_t * at,
svm_msg_q_t * vpp_evt_q, u8 * data, u32 len, u8 evt_type,
- u8 noblock)
+ u8 do_evt, u8 noblock)
{
u32 max_enqueue, actual_write;
session_dgram_hdr_t hdr;
int rv;
- max_enqueue = svm_fifo_max_enqueue (f);
+ max_enqueue = svm_fifo_max_enqueue_prod (f);
if (max_enqueue <= sizeof (session_dgram_hdr_t))
return 0;
rv = svm_fifo_enqueue_nowait (f, sizeof (hdr), (u8 *) & hdr);
ASSERT (rv == sizeof (hdr));
- if ((rv = svm_fifo_enqueue_nowait (f, actual_write, data)) > 0)
+ rv = svm_fifo_enqueue_nowait (f, actual_write, data);
+ if (do_evt)
{
- if (svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f, evt_type, noblock);
+ if (rv > 0 && svm_fifo_set_event (f))
+ app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
+ noblock);
}
ASSERT (rv);
return rv;
app_send_dgram (app_session_t * s, u8 * data, u32 len, u8 noblock)
{
return app_send_dgram_raw (s->tx_fifo, &s->transport, s->vpp_evt_q, data,
- len, SESSION_IO_EVT_TX, noblock);
+ len, SESSION_IO_EVT_TX, 1 /* do_evt */ ,
+ noblock);
}
always_inline int
app_send_stream_raw (svm_fifo_t * f, svm_msg_q_t * vpp_evt_q, u8 * data,
- u32 len, u8 evt_type, u8 noblock)
+ u32 len, u8 evt_type, u8 do_evt, u8 noblock)
{
int rv;
- if ((rv = svm_fifo_enqueue_nowait (f, len, data)) > 0)
+ rv = svm_fifo_enqueue_nowait (f, len, data);
+ if (do_evt)
{
- if (svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f, evt_type, noblock);
+ if (rv > 0 && svm_fifo_set_event (f))
+ app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
+ noblock);
}
return rv;
}
app_send_stream (app_session_t * s, u8 * data, u32 len, u8 noblock)
{
return app_send_stream_raw (s->tx_fifo, s->vpp_evt_q, data, len,
- SESSION_IO_EVT_TX, noblock);
+ SESSION_IO_EVT_TX, 1 /* do_evt */ , noblock);
}
always_inline int
u32 max_deq;
int rv;
- max_deq = svm_fifo_max_dequeue (f);
+ max_deq = svm_fifo_max_dequeue_cons (f);
if (max_deq < sizeof (session_dgram_hdr_t))
{
if (clear_evt)