tcp: avoid updating rcv wnd in resets
[vpp.git] / src / vnet / tcp / tcp_output.c
index 6ed478f..aff2d93 100644 (file)
@@ -115,8 +115,6 @@ tcp_update_rcv_wnd (tcp_connection_t * tc)
   u32 available_space, wnd;
   i32 observed_wnd;
 
-  ASSERT (tc->rcv_opts.mss < transport_rx_fifo_size (&tc->connection));
-
   /*
    * Figure out how much space we have available
    */
@@ -875,7 +873,7 @@ tcp_send_reset (tcp_connection_t * tc)
 
   tc->snd_opts_len = tcp_make_options (tc, &tc->snd_opts, tc->state);
   tcp_hdr_opts_len = tc->snd_opts_len + sizeof (tcp_header_t);
-  advertise_wnd = tcp_window_to_advertise (tc, TCP_STATE_ESTABLISHED);
+  advertise_wnd = tc->rcv_wnd >> tc->rcv_wscale;
   flags = TCP_FLAG_RST;
   th = vlib_buffer_push_tcp (b, tc->c_lcl_port, tc->c_rmt_port, tc->snd_nxt,
                             tc->rcv_nxt, tcp_hdr_opts_len, flags,
@@ -1637,7 +1635,7 @@ tcp_timer_persist_handler (tcp_connection_t * tc)
   /* Problem already solved or worse */
   if (tc->state == TCP_STATE_CLOSED || tc->snd_wnd > tc->snd_mss
       || (tc->flags & TCP_CONN_FINSNT))
-    return;
+    goto update_scheduler;
 
   available_bytes = transport_max_tx_dequeue (&tc->connection);
   offset = tc->snd_nxt - tc->snd_una;
@@ -1651,7 +1649,7 @@ tcp_timer_persist_handler (tcp_connection_t * tc)
     }
 
   if (available_bytes <= offset)
-    return;
+    goto update_scheduler;
 
   /* Increment RTO backoff */
   tc->rto_boff += 1;
@@ -1665,6 +1663,7 @@ tcp_timer_persist_handler (tcp_connection_t * tc)
       tcp_persist_timer_set (tc);
       return;
     }
+
   b = vlib_get_buffer (vm, bi);
   data = tcp_init_buffer (vm, b);
 
@@ -1693,6 +1692,13 @@ tcp_timer_persist_handler (tcp_connection_t * tc)
 
   /* Just sent new data, enable retransmit */
   tcp_retransmit_timer_update (tc);
+
+  return;
+
+update_scheduler:
+
+  if (tcp_is_descheduled (tc))
+    transport_connection_reschedule (&tc->connection);
 }
 
 /**