+ case SESSION_IO_EVT_TX_FLUSH:
+ case SESSION_IO_EVT_TX:
+ /* Don't try to send more that one frame per dispatch cycle */
+ if (*n_tx_packets == VLIB_FRAME_SIZE)
+ {
+ session_evt_add_postponed (wrk, elt);
+ return;
+ }
+
+ s = session_event_get_session (e, thread_index);
+ if (PREDICT_FALSE (!s))
+ {
+ clib_warning ("session was freed!");
+ break;
+ }
+ CLIB_PREFETCH (s->tx_fifo, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+ wrk->ctx.s = s;
+ /* Spray packets in per session type frames, since they go to
+ * different nodes */
+ rv = (smm->session_tx_fns[s->session_type]) (wrk, node, elt,
+ n_tx_packets);
+ if (PREDICT_FALSE (rv == SESSION_TX_NO_BUFFERS))
+ {
+ vlib_node_increment_counter (wrk->vm, node->node_index,
+ SESSION_QUEUE_ERROR_NO_BUFFER, 1);
+ break;
+ }
+ break;
+ case SESSION_IO_EVT_RX:
+ s = session_event_get_session (e, thread_index);
+ if (!s)
+ break;
+ transport_app_rx_evt (session_get_transport_proto (s),
+ s->connection_index, s->thread_index);
+ break;
+ case SESSION_CTRL_EVT_CLOSE:
+ s = session_get_from_handle_if_valid (e->session_handle);
+ if (PREDICT_FALSE (!s))
+ break;
+ session_transport_close (s);
+ break;
+ case SESSION_IO_EVT_BUILTIN_RX:
+ s = session_event_get_session (e, thread_index);
+ if (PREDICT_FALSE (!s || s->session_state >= SESSION_STATE_CLOSING))
+ break;
+ svm_fifo_unset_event (s->rx_fifo);
+ app_wrk = app_worker_get (s->app_wrk_index);
+ app_worker_builtin_rx (app_wrk, s);
+ break;
+ case SESSION_IO_EVT_BUILTIN_TX:
+ s = session_get_from_handle_if_valid (e->session_handle);
+ wrk->ctx.s = s;
+ if (PREDICT_TRUE (s != 0))
+ session_tx_fifo_dequeue_internal (wrk, node, elt, n_tx_packets);
+ break;
+ case SESSION_CTRL_EVT_RPC:
+ fp = e->rpc_args.fp;
+ (*fp) (e->rpc_args.arg);
+ break;
+ case SESSION_CTRL_EVT_DISCONNECTED:
+ session_mq_disconnected_handler (e->data);
+ break;
+ case SESSION_CTRL_EVT_ACCEPTED_REPLY:
+ session_mq_accepted_reply_handler (e->data);
+ break;
+ case SESSION_CTRL_EVT_CONNECTED_REPLY:
+ break;
+ case SESSION_CTRL_EVT_DISCONNECTED_REPLY:
+ session_mq_disconnected_reply_handler (e->data);
+ break;
+ case SESSION_CTRL_EVT_RESET_REPLY:
+ session_mq_reset_reply_handler (e->data);
+ break;
+ case SESSION_CTRL_EVT_WORKER_UPDATE:
+ session_mq_worker_update_handler (e->data);
+ break;
+ default:
+ clib_warning ("unhandled event type %d", e->event_type);