ec_session_t *ecs;
pool_get_zero (wrk->sessions, ecs);
- ecs->data.session_index = ecs - wrk->sessions;
+ ecs->session_index = ecs - wrk->sessions;
ecs->thread_index = wrk->thread_index;
return ecs;
bytes_this_chunk =
clib_min (test_buf_len - test_buf_offset, es->bytes_to_send);
- if (!ecm->is_dgram)
+ if (!es->is_dgram)
{
if (ecm->no_copy)
{
- svm_fifo_t *f = es->data.tx_fifo;
+ svm_fifo_t *f = es->tx_fifo;
rv = clib_min (svm_fifo_max_enqueue_prod (f), bytes_this_chunk);
svm_fifo_enqueue_nocopy (f, rv);
session_send_io_evt_to_thread_custom (
&es->vpp_session_index, es->thread_index, SESSION_IO_EVT_TX);
}
else
- rv = app_send_stream (&es->data, test_data + test_buf_offset,
- bytes_this_chunk, 0);
+ rv =
+ app_send_stream ((app_session_t *) es, test_data + test_buf_offset,
+ bytes_this_chunk, 0);
}
else
{
- svm_fifo_t *f = es->data.tx_fifo;
+ svm_fifo_t *f = es->tx_fifo;
u32 max_enqueue = svm_fifo_max_enqueue_prod (f);
if (max_enqueue < sizeof (session_dgram_hdr_t))
if (ecm->no_copy)
{
session_dgram_hdr_t hdr;
- app_session_transport_t *at = &es->data.transport;
+ app_session_transport_t *at = &es->transport;
rv = clib_min (max_enqueue, bytes_this_chunk);
{
bytes_this_chunk = clib_min (bytes_this_chunk, max_enqueue);
bytes_this_chunk = clib_min (bytes_this_chunk, 1460);
- rv = app_send_dgram (&es->data, test_data + test_buf_offset,
- bytes_this_chunk, 0);
+ rv =
+ app_send_dgram ((app_session_t *) es, test_data + test_buf_offset,
+ bytes_this_chunk, 0);
}
}
receive_data_chunk (ec_worker_t *wrk, ec_session_t *es)
{
ec_main_t *ecm = &ec_main;
- svm_fifo_t *rx_fifo = es->data.rx_fifo;
+ svm_fifo_t *rx_fifo = es->rx_fifo;
int n_read, i;
if (ecm->cfg.test_bytes)
{
- if (!ecm->is_dgram)
- n_read =
- app_recv_stream (&es->data, wrk->rx_buf, vec_len (wrk->rx_buf));
- else
- n_read =
- app_recv_dgram (&es->data, wrk->rx_buf, vec_len (wrk->rx_buf));
+ n_read =
+ app_recv ((app_session_t *) es, wrk->rx_buf, vec_len (wrk->rx_buf));
}
else
{
* Setup session
*/
es = ec_session_alloc (wrk);
+ hs_test_app_session_init (es, s);
es->bytes_to_send = ecm->bytes_to_send;
es->bytes_to_receive = ecm->echo_bytes ? ecm->bytes_to_send : 0ULL;
- es->data.rx_fifo = s->rx_fifo;
- es->data.rx_fifo->shr->client_session_index = es->data.session_index;
- es->data.tx_fifo = s->tx_fifo;
- es->data.tx_fifo->shr->client_session_index = es->data.session_index;
- es->data.vpp_evt_q = wrk->vpp_event_queue;
es->vpp_session_handle = session_handle (s);
es->vpp_session_index = s->session_index;
- s->opaque = es->data.session_index;
-
- if (ecm->is_dgram)
- {
- transport_connection_t *tc;
- tc = session_get_transport (s);
- clib_memcpy_fast (&es->data.transport, tc, sizeof (es->data.transport));
- es->data.is_dgram = 1;
- }
+ s->opaque = es->session_index;
- vec_add1 (wrk->conn_indices, es->data.session_index);
+ vec_add1 (wrk->conn_indices, es->session_index);
clib_atomic_fetch_add (&ecm->ready_connections, 1);
if (ecm->ready_connections == ecm->expected_connections)
{
* Setup session
*/
es = ec_session_alloc (wrk);
+ hs_test_app_session_init (es, s);
es->bytes_to_send = ecm->bytes_to_send;
es->bytes_to_receive = ecm->echo_bytes ? ecm->bytes_to_send : 0ULL;
- es->data.rx_fifo = s->rx_fifo;
- es->data.rx_fifo->shr->client_session_index = es->data.session_index;
- es->data.tx_fifo = s->tx_fifo;
- es->data.tx_fifo->shr->client_session_index = es->data.session_index;
- es->data.vpp_evt_q = wrk->vpp_event_queue;
es->vpp_session_handle = session_handle (s);
es->vpp_session_index = s->session_index;
- s->opaque = es->data.session_index;
-
- if (ecm->is_dgram)
- {
- transport_connection_t *tc;
- tc = session_get_transport (s);
- clib_memcpy_fast (&es->data.transport, tc, sizeof (es->data.transport));
- es->data.is_dgram = 1;
- }
+ s->opaque = es->session_index;
- vec_add1 (wrk->conn_indices, es->data.session_index);
+ vec_add1 (wrk->conn_indices, es->session_index);
clib_atomic_fetch_add (&ecm->ready_connections, 1);
if (ecm->ready_connections == ecm->expected_connections)
{
goto cleanup;
}
ecm->transport_proto = ecm->connect_sep.transport_proto;
- ecm->is_dgram = (ecm->transport_proto == TRANSPORT_PROTO_UDP);
if (ecm->prealloc_sessions)
ec_prealloc_sessions (ecm);
typedef struct ec_session_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
- app_session_t data;
- u32 vpp_session_index;
+#define _(type, name) type name;
+ foreach_app_session_field
+#undef _
+ u32 vpp_session_index;
u32 thread_index;
u64 bytes_to_send;
u64 bytes_sent;
u32 private_segment_count; /**< Number of private fifo segs */
u64 private_segment_size; /**< size of private fifo segs */
u32 tls_engine; /**< TLS engine mbedtls/openssl */
- u8 is_dgram;
u32 no_copy; /**< Don't memcpy data to tx fifo */
u32 quic_streams; /**< QUIC streams per connection */
u32 ckpair_index; /**< Cert key pair for tls/quic */
typedef struct
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
- u32 session_index;
- u64 vpp_session_handle;
+#define _(type, name) type name;
+ foreach_app_session_field
+#undef _
+ u64 vpp_session_handle;
u32 vpp_session_index;
u32 rx_retries;
u8 byte_index;
char *server_uri; /**< Server URI */
u32 tls_engine; /**< TLS engine: mbedtls/openssl */
u32 ckpair_index; /**< Cert and key for tls/quic */
- u8 is_dgram; /**< set if transport is dgram */
/*
* Test state
es_worker_t *wrk = es_worker_get (s->thread_index);
es = es_session_alloc (wrk);
+ hs_test_app_session_init (es, s);
es->vpp_session_index = s->session_index;
es->vpp_session_handle = session_handle (s);
s->opaque = es->session_index;
svm_fifo_t *tx_fifo, *rx_fifo;
echo_server_main_t *esm = &echo_server_main;
u32 thread_index = vlib_get_thread_index ();
- app_session_transport_t at;
es_worker_t *wrk;
es_session_t *es;
wrk = es_worker_get (thread_index);
max_enqueue = svm_fifo_max_enqueue_prod (tx_fifo);
+ es = es_session_get (wrk, s->opaque);
- if (!esm->is_dgram)
- {
- max_dequeue = svm_fifo_max_dequeue_cons (rx_fifo);
- }
- else
+ if (es->is_dgram)
{
session_dgram_pre_hdr_t ph;
svm_fifo_peek (rx_fifo, 0, sizeof (ph), (u8 *) & ph);
ASSERT (wrk->vpp_event_queue);
max_enqueue -= sizeof (session_dgram_hdr_t);
}
+ else
+ {
+ max_dequeue = svm_fifo_max_dequeue_cons (rx_fifo);
+ }
if (PREDICT_FALSE (max_dequeue == 0))
return 0;
- es = es_session_get (wrk, s->opaque);
-
/* Number of bytes we're going to copy */
max_transfer = clib_min (max_dequeue, max_enqueue);
}
vec_validate (wrk->rx_buf, max_transfer);
- if (!esm->is_dgram)
- {
- actual_transfer =
- app_recv_stream_raw (rx_fifo, wrk->rx_buf, max_transfer,
- 0 /* don't clear event */, 0 /* peek */);
- }
- else
- {
- actual_transfer =
- app_recv_dgram_raw (rx_fifo, wrk->rx_buf, max_transfer, &at,
- 0 /* don't clear event */, 0 /* peek */);
- }
+ actual_transfer = app_recv ((app_session_t *) es, wrk->rx_buf, max_transfer);
ASSERT (actual_transfer == max_transfer);
if (esm->cfg.test_bytes)
* Echo back
*/
- if (!esm->is_dgram)
- {
- n_written = app_send_stream_raw (tx_fifo, wrk->vpp_event_queue,
- wrk->rx_buf, actual_transfer,
- SESSION_IO_EVT_TX, 1 /* do_evt */, 0);
- }
- else
- {
- n_written = app_send_dgram_raw (tx_fifo, &at, wrk->vpp_event_queue,
- wrk->rx_buf, actual_transfer,
- SESSION_IO_EVT_TX, 1 /* do_evt */, 0);
- }
+ n_written = app_send ((app_session_t *) es, wrk->rx_buf, actual_transfer, 0);
if (n_written != max_transfer)
es_err ("short trout! written %u read %u", n_written, max_transfer);
goto cleanup;
}
esm->transport_proto = sep.transport_proto;
- esm->is_dgram = (sep.transport_proto == TRANSPORT_PROTO_UDP);
rv = echo_server_create (vm, appns_id, appns_flags, appns_secret);
if (rv)
#define __included_hs_test_t__
#include <vnet/session/application_interface.h>
+#include <vnet/session/session.h>
#define HS_TEST_CFG_CTRL_MAGIC 0xfeedface
#define HS_TEST_CFG_TXBUF_SIZE_DEF 8192
return clib_host_to_net_u16 (p + 1);
}
+static inline void
+hs_test_app_session_init_ (app_session_t *as, session_t *s)
+{
+ as->rx_fifo = s->rx_fifo;
+ as->tx_fifo = s->tx_fifo;
+ as->vpp_evt_q = session_main_get_vpp_event_queue (s->thread_index);
+ if (session_get_transport_proto (s) == TRANSPORT_PROTO_UDP)
+ {
+ transport_connection_t *tc;
+ tc = session_get_transport (s);
+ clib_memcpy_fast (&as->transport, tc, sizeof (as->transport));
+ as->is_dgram = 1;
+ }
+}
+
+#define hs_test_app_session_init(_as, _s) \
+ hs_test_app_session_init_ ((app_session_t *) (_as), (_s))
+
#endif /* __included_hs_test_t__ */