return;
}
s->session_state = SESSION_STATE_READY;
+ if (!svm_fifo_is_empty (s->server_rx_fifo))
+ {
+ application_t *app;
+ app = application_get (s->app_index);
+ application_send_event (app, s, FIFO_EVENT_APP_RX);
+ }
}
}
svm_msg_q_msg_t _msg, *msg = &_msg;
session_disconnected_msg_t *mp;
session_event_t *evt;
+ stream_session_t *s;
application_t *app;
int rv = 0;
mp = (session_disconnected_msg_t *) data;
app = application_lookup (mp->client_index);
- if (app)
- {
- a->handle = mp->handle;
- a->app_index = app->index;
- rv = vnet_disconnect_session (a);
- }
- else
+ s = session_get_from_handle_if_valid (mp->handle);
+ if (!(app && s && s->app_index == app->index))
{
- rv = VNET_API_ERROR_APPLICATION_NOT_ATTACHED;
+ clib_warning ("could not disconnect session: %llu app: %u", mp->handle,
+ mp->client_index);
+ return;
}
+ a->handle = mp->handle;
+ a->app_index = app->index;
+ rv = vnet_disconnect_session (a);
+
svm_msg_q_lock_and_alloc_msg_w_ring (app->event_queue,
SESSION_MQ_CTRL_EVT_RING,
SVM_Q_WAIT, msg);
{
stream_session_t *s; /* $$$ prefetch 1 ahead maybe */
session_event_t *e;
- u32 to_dequeue;
+ u8 is_full;
e = &fifo_events[i];
switch (e->event_type)
clib_warning ("It's dead, Jim!");
continue;
}
- to_dequeue = svm_fifo_max_dequeue (s->server_tx_fifo);
+ is_full = svm_fifo_is_full (s->server_tx_fifo);
/* Spray packets in per session type frames, since they go to
* different nodes */
if (PREDICT_TRUE (rv == SESSION_TX_OK))
{
/* Notify app there's tx space if not polling */
- if (PREDICT_FALSE (to_dequeue == s->server_tx_fifo->nitems
+ if (PREDICT_FALSE (is_full
&& !svm_fifo_has_event (s->server_tx_fifo)))
session_dequeue_notify (s);
}