tcp: loss recovery improvements/fixes

- fix newreno cwnd computation
- reset snd_una_max on entering recovery
- accept acks beyond snd_nxt but less than snd_congestion when in
recovery
- avoid entering fast recovery multiple times when using sacks
- avoid as much as possible sending small segments when doing fast
retransmit
- more event logging

Change-Id: I19dd151d7704e39d4eae06de3a26f5e124875366
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index 46fc4dc..e046efb 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -260,6 +260,8 @@
        * session is not ready or closed */
       if (s->session_state < SESSION_STATE_READY)
 	return 1;
+      if (s->session_state == SESSION_STATE_CLOSED)
+	return 2;
     }
   return 0;
 }
@@ -364,11 +366,12 @@
   session_tx_context_t *ctx = &smm->ctx[thread_index];
   transport_proto_t tp;
   vlib_buffer_t *pb;
-  u16 n_bufs;
+  u16 n_bufs, rv;
 
-  if (PREDICT_FALSE (session_tx_not_ready (s, peek_data)))
+  if (PREDICT_FALSE ((rv = session_tx_not_ready (s, peek_data))))
     {
-      vec_add1 (smm->pending_event_vector[thread_index], *e);
+      if (rv < 2)
+	vec_add1 (smm->pending_event_vector[thread_index], *e);
       return 0;
     }