tcp: drop outstanding data when entering closing state 37/17737/4
authorFlorin Coras <fcoras@cisco.com>
Thu, 21 Feb 2019 03:48:31 +0000 (19:48 -0800)
committerDamjan Marion <dmarion@me.com>
Thu, 21 Feb 2019 12:27:03 +0000 (12:27 +0000)
Change-Id: I92a009b9630b0d882ea3c5c99aad88ed6f5109a0
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/session/application_worker.c
src/vnet/session/session.c
src/vnet/session/session.h
src/vnet/tcp/tcp_input.c

index 3bab356..5423733 100644 (file)
@@ -199,6 +199,7 @@ app_worker_free (app_worker_t * app_wrk)
     {
       sm = segment_manager_get (app_wrk->connects_seg_manager);
       sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
+      sm->first_is_protected = 0;
       segment_manager_init_del (sm);
     }
 
index 606f717..83c889c 100644 (file)
@@ -462,7 +462,7 @@ stream_session_peek_bytes (transport_connection_t * tc, u8 * buffer,
 }
 
 u32
-stream_session_dequeue_drop (transport_connection_t * tc, u32 max_bytes)
+session_dequeue_drop (transport_connection_t * tc, u32 max_bytes)
 {
   session_t *s = session_get (tc->s_index, tc->thread_index);
   return svm_fifo_dequeue_drop (s->tx_fifo, max_bytes);
index 4de7642..f20e0db 100644 (file)
@@ -375,7 +375,7 @@ int session_enqueue_dgram_connection (session_t * s,
                                      u8 queue_event);
 int stream_session_peek_bytes (transport_connection_t * tc, u8 * buffer,
                               u32 offset, u32 max_bytes);
-u32 stream_session_dequeue_drop (transport_connection_t * tc, u32 max_bytes);
+u32 session_dequeue_drop (transport_connection_t * tc, u32 max_bytes);
 
 int session_stream_connect_notify (transport_connection_t * tc, u8 is_fail);
 int session_dgram_connect_notify (transport_connection_t * tc,
index c5dfb3f..dbe1fc4 100644 (file)
@@ -564,7 +564,7 @@ tcp_handle_postponed_dequeues (tcp_worker_ctx_t * wrk)
        continue;
 
       /* Dequeue the newly ACKed bytes */
-      stream_session_dequeue_drop (&tc->connection, tc->burst_acked);
+      session_dequeue_drop (&tc->connection, tc->burst_acked);
       tc->burst_acked = 0;
       tcp_validate_txf_size (tc, tc->snd_una_max - tc->snd_una);
 
@@ -2806,8 +2806,7 @@ tcp46_rcv_process_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
              /* Don't try to deq the FIN acked */
              if (tc0->burst_acked > 1)
-               stream_session_dequeue_drop (&tc0->connection,
-                                            tc0->burst_acked - 1);
+               session_dequeue_drop (&tc0->connection, tc0->burst_acked - 1);
              tc0->burst_acked = 0;
            }
          break;
@@ -2950,8 +2949,17 @@ tcp46_rcv_process_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
        case TCP_STATE_FIN_WAIT_1:
          tc0->rcv_nxt += 1;
          tcp_connection_set_state (tc0, TCP_STATE_CLOSING);
-         tcp_program_ack (wrk, tc0);
-         /* Wait for ACK but not forever */
+         if (tc0->flags & TCP_CONN_FINPNDG)
+           {
+             /* Drop all outstanding tx data. */
+             session_dequeue_drop (&tc0->connection,
+                                   transport_max_tx_dequeue
+                                   (&tc0->connection));
+             tcp_send_fin (tc0);
+           }
+         else
+           tcp_program_ack (wrk, tc0);
+         /* Wait for ACK for our FIN but not forever */
          tcp_timer_update (tc0, TCP_TIMER_WAITCLOSE, TCP_2MSL_TIME);
          break;
        case TCP_STATE_FIN_WAIT_2: