X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_node.c;h=f3ba9e77bcfb42422ffc915388cfd8f46860d69e;hb=b2f09146c957f87edd431e75a24f8a456d539a02;hp=3bfc80eca66ac6ca90cea8466f4ee86994ba8687;hpb=dd97a48d9fac91c7f16a31aa661dd6c968c3b760;p=vpp.git diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index 3bfc80eca66..f3ba9e77bcf 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -55,6 +55,7 @@ session_mq_listen_handler (void *data) 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; @@ -115,6 +116,8 @@ session_mq_connect_handler (void *data) 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); @@ -307,8 +310,8 @@ session_mq_reset_reply_handler (void *data) 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); @@ -871,19 +874,29 @@ session_tx_fifo_read_and_snd_i (session_worker_t * wrk, 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); @@ -892,9 +905,7 @@ session_tx_fifo_read_and_snd_i (session_worker_t * wrk, 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; } @@ -906,7 +917,8 @@ session_tx_fifo_read_and_snd_i (session_worker_t * wrk, { 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; @@ -1257,6 +1269,7 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, 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