a->sep.sw_if_index = ENDPOINT_INVALID_INDEX;
a->sep.transport_proto = mp->proto;
a->sep_ext.ckpair_index = mp->ckpair_index;
+ a->sep_ext.crypto_engine = mp->crypto_engine;
a->app_index = app->app_index;
a->wrk_map_index = mp->wrk_index;
a->sep.peer.sw_if_index = ENDPOINT_INVALID_INDEX;
a->sep_ext.parent_handle = mp->parent_handle;
a->sep_ext.ckpair_index = mp->ckpair_index;
+ a->sep_ext.crypto_engine = mp->crypto_engine;
+ a->sep_ext.flags = mp->flags;
if (mp->hostname_len)
{
vec_validate (a->sep_ext.hostname, mp->hostname_len - 1);
session_parse_handle (mp->handle, &index, &thread_index);
s = session_get_if_valid (index, thread_index);
- /* Session was already closed or already cleaned up */
- if (!s || s->session_state != SESSION_STATE_TRANSPORT_CLOSING)
+ /* No session or not the right session */
+ if (!s || s->session_state < SESSION_STATE_TRANSPORT_CLOSING)
return;
app_wrk = app_worker_get (s->app_wrk_index);
return SESSION_TX_NO_DATA;
}
- ctx->snd_space = transport_connection_snd_space (ctx->tc,
- vm->clib_time.
- last_cpu_time,
- ctx->snd_mss);
+ ctx->snd_space = transport_connection_snd_space (ctx->tc);
/* This flow queue is "empty" so it should be re-evaluated before
* the ones that have data to send. */
- if (ctx->snd_space == 0)
+ if (!ctx->snd_space)
{
session_evt_add_head_old (wrk, elt);
return SESSION_TX_NO_DATA;
}
+ if (transport_connection_is_tx_paced (ctx->tc))
+ {
+ u32 snd_space = transport_connection_tx_pacer_burst (ctx->tc);
+ if (snd_space < TRANSPORT_PACER_MIN_BURST)
+ {
+ session_evt_add_head_old (wrk, elt);
+ return SESSION_TX_NO_DATA;
+ }
+ snd_space = clib_min (ctx->snd_space, snd_space);
+ ctx->snd_space = snd_space >= ctx->snd_mss ?
+ snd_space - snd_space % ctx->snd_mss : snd_space;
+ }
+
/* Allow enqueuing of a new event */
svm_fifo_unset_event (ctx->s->tx_fifo);
if (PREDICT_FALSE (!ctx->max_len_to_snd))
{
- transport_connection_tx_pacer_reset_bucket (ctx->tc,
- vm->clib_time.
- last_cpu_time);
+ transport_connection_tx_pacer_reset_bucket (ctx->tc, 0);
return SESSION_TX_NO_DATA;
}
{
if (n_bufs)
vlib_buffer_free (vm, wrk->tx_buffers, n_bufs);
- session_evt_add_head_old (wrk, elt);
+ if (svm_fifo_set_event (ctx->s->tx_fifo))
+ session_evt_add_head_old (wrk, elt);
vlib_node_increment_counter (wrk->vm, node->node_index,
SESSION_QUEUE_ERROR_NO_BUFFER, 1);
return SESSION_TX_NO_BUFFERS;
SESSION_EVT (SESSION_EVT_DISPATCH_START, wrk);
wrk->last_vlib_time = vlib_time_now (vm);
+ wrk->last_vlib_us_time = wrk->last_vlib_time * CLIB_US_TIME_FREQ;
/*
* Update transport time