X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp_output.c;h=d33cbdd4ad4d27903a2928010979401d99ac3d9d;hb=6080e0d15e152e38811b01306eef6719a682c007;hp=5eccda60ad224fa15f5f33c666509e72f413ba89;hpb=aa3886993c13d71d93ef01dc73b79985d6ec997f;p=vpp.git diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c index 5eccda60ad2..d33cbdd4ad4 100644 --- a/src/vnet/tcp/tcp_output.c +++ b/src/vnet/tcp/tcp_output.c @@ -1473,7 +1473,7 @@ tcp_timer_retransmit_handler (tcp_connection_t * tc) session_transport_closing_notify (&tc->connection); session_transport_closed_notify (&tc->connection); tcp_connection_timers_reset (tc); - tcp_timer_update (tc, TCP_TIMER_WAITCLOSE, tcp_cfg.closewait_time); + tcp_program_cleanup (wrk, tc); tcp_workerp_stats_inc (wrk, tr_abort, 1); return; } @@ -1525,7 +1525,7 @@ tcp_timer_retransmit_handler (tcp_connection_t * tc) { tcp_connection_set_state (tc, TCP_STATE_CLOSED); tcp_connection_timers_reset (tc); - tcp_timer_update (tc, TCP_TIMER_WAITCLOSE, tcp_cfg.cleanup_time); + tcp_program_cleanup (wrk, tc); tcp_workerp_stats_inc (wrk, tr_abort, 1); return; } @@ -1637,7 +1637,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 +1651,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 +1665,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 +1694,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); } /** @@ -2064,6 +2072,7 @@ tcp_send_acks (tcp_connection_t * tc, u32 max_burst_size) if (!vec_len (tc->snd_sacks)) { tcp_send_ack (tc); + tc->dupacks_out += 1; tc->pending_dupacks = 0; return 1; }