Skip to content

Commit 362546a

Browse files
committed
Reset tx_retries_left in fsm_dflow
1 parent 7c0093f commit 362546a

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

datalink_arq/arq_fsm.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,14 +1788,20 @@ static void fsm_dflow(arq_session_t *sess, const arq_event_t *ev)
17881788
* round-trip (peer guard + MODE_ACK TX + channel clear ≈ 4s;
17891789
* ack_timeout_s=6s provides adequate margin) so the peer's
17901790
* payload decoder is reset before our next DATA preamble.
1791-
* Skip mode-upgrade check here — we just aborted one. */
1791+
* Skip mode-upgrade check here — we just aborted one.
1792+
*
1793+
* Reset tx_retries_left: it was decremented to 0 by the
1794+
* MODE_REQ retry loop and must not be inherited by the next
1795+
* DATA_TX cycle. Also lets enter_idle_iss() honour a
1796+
* pending_disconnect whose drain condition was met here. */
1797+
sess->tx_retries_left = ARQ_DATA_RETRY_SLOTS;
17921798
uint64_t guard_ms = tm ? (uint64_t)(tm->ack_timeout_s * 1000.0f) : 6000ULL;
17931799
if (g_cbs.tx_backlog && g_cbs.tx_backlog() > 0)
17941800
dflow_enter(sess, ARQ_DFLOW_DATA_TX,
17951801
hermes_uptime_ms() + guard_ms,
17961802
ARQ_EV_TIMER_ACK);
17971803
else
1798-
dflow_enter(sess, ARQ_DFLOW_IDLE_ISS, UINT64_MAX, ARQ_EV_TIMER_RETRY);
1804+
enter_idle_iss(sess, false);
17991805
}
18001806
else
18011807
{

0 commit comments

Comments
 (0)