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;
}
{
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;
}
/* 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;
}
if (available_bytes <= offset)
- return;
+ goto update_scheduler;
/* Increment RTO backoff */
tc->rto_boff += 1;
tcp_persist_timer_set (tc);
return;
}
+
b = vlib_get_buffer (vm, bi);
data = tcp_init_buffer (vm, b);
/* Just sent new data, enable retransmit */
tcp_retransmit_timer_update (tc);
+
+update_scheduler:
+
+ if (transport_connection_is_descheduled (&tc->connection))
+ transport_connection_reschedule (&tc->connection);
}
/**
if (!vec_len (tc->snd_sacks))
{
tcp_send_ack (tc);
+ tc->dupacks_out += 1;
tc->pending_dupacks = 0;
return 1;
}