tcp: force deschedule if no send space available

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Iae9f118f710153b6c0e390265039db7434e67ed8
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index b1c2428..b5f4321 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -872,7 +872,7 @@
 	  (ctx->s->session_state >= SESSION_STATE_TRANSPORT_CLOSED))
 	return SESSION_TX_OK;
       max_burst -= n_custom_tx;
-      if (!max_burst)
+      if (!max_burst || (ctx->s->flags & SESSION_F_CUSTOM_TX))
 	{
 	  session_evt_add_old (wrk, elt);
 	  return SESSION_TX_OK;
@@ -883,18 +883,18 @@
 
   if (!ctx->sp.snd_space)
     {
-      /* This flow queue is "empty" so it should be re-evaluated before
-       * the ones that have data to send. */
-      if (PREDICT_TRUE (!ctx->sp.flags))
-	session_evt_add_head_old (wrk, elt);
+      /* If the deschedule flag was set, remove session from scheduler.
+       * Transport is responsible for rescheduling this session. */
+      if (ctx->sp.flags & TRANSPORT_SND_F_DESCHED)
+	transport_connection_deschedule (ctx->tc);
       /* Request to postpone the session, e.g., zero-wnd and transport
        * is not currently probing */
       else if (ctx->sp.flags & TRANSPORT_SND_F_POSTPONE)
 	session_evt_add_old (wrk, elt);
-      /* If the deschedule flag was set, remove session from scheduler.
-       * Transport is responsible for rescheduling this session. */
+      /* This flow queue is "empty" so it should be re-evaluated before
+       * the ones that have data to send. */
       else
-	transport_connection_deschedule (ctx->tc);
+	session_evt_add_head_old (wrk, elt);
 
       return SESSION_TX_NO_DATA;
     }