session: send rx events only if session ready 00/13600/3
authorFlorin Coras <fcoras@cisco.com>
Sun, 22 Jul 2018 19:59:30 +0000 (12:59 -0700)
committerDave Barach <openvpp@barachs.net>
Mon, 23 Jul 2018 20:23:58 +0000 (20:23 +0000)
Change-Id: I8d631121b104fb40c20701d4c1b428f2b71e5785
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/svm/svm_fifo.h
src/vnet/session/application.c
src/vnet/session/session_node.c

index 4018290..4024261 100644 (file)
@@ -113,6 +113,12 @@ svm_fifo_is_full (svm_fifo_t * f)
   return (f->cursize == f->nitems);
 }
 
+static inline int
+svm_fifo_is_empty (svm_fifo_t * f)
+{
+  return (f->cursize == 0);
+}
+
 static inline u32
 svm_fifo_max_enqueue (svm_fifo_t * f)
 {
index 1dc04f0..5f18bd2 100644 (file)
@@ -841,10 +841,11 @@ app_send_io_evt_rx (application_t * app, stream_session_t * s, u8 lock)
   svm_msg_q_msg_t msg;
   svm_msg_q_t *mq;
 
-  if (PREDICT_FALSE (s->session_state == SESSION_STATE_CLOSED))
+  if (PREDICT_FALSE (s->session_state != SESSION_STATE_READY))
     {
       /* Session is closed so app will never clean up. Flush rx fifo */
-      svm_fifo_dequeue_drop_all (s->server_rx_fifo);
+      if (s->session_state == SESSION_STATE_CLOSED)
+       svm_fifo_dequeue_drop_all (s->server_rx_fifo);
       return 0;
     }
 
index 1ae92ed..baabb05 100644 (file)
@@ -68,6 +68,12 @@ session_mq_accepted_reply_handler (void *data)
          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);
+       }
     }
 }