gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit ad9f73856d5b28e4f4d507b0f8c9b53f40166da4
parent 66c62a774237097bc01c26773f63fb28ef7258b4
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Wed, 29 Jul 2026 16:11:05 +0200

transport: further chase disconnect bug

Diffstat:
Msrc/service/core/gnunet-service-core_kx.c | 21+++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/service/core/gnunet-service-core_kx.c b/src/service/core/gnunet-service-core_kx.c @@ -2663,10 +2663,27 @@ resend_initiator_hello (void *cls) struct GSC_KeyExchangeInfo *kx = cls; kx->resend_task = NULL; + if (0 == kx->resend_tries_left) + { + /* The InitiatorHello we keep repeating carries the ephemeral public key + generated by #send_initiator_hello(), and only #restart_kx() ever + generates a new one. Retrying the same message forever therefore + never recovers from a responder that has dropped the exchange -- it + just keeps a 10s retransmit running against a peer that is not + answering. Give up like #resend_responder_hello() and + #resend_initiator_done() do and start a fresh exchange. */ + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "InitiatorHello not answered by `%s', restarting KX\n", + GNUNET_i2s (&kx->peer)); + restart_kx (kx); + return; + } + kx->resend_tries_left--; + // FIXME (Exponential) backoff? GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Resending InitiatorHello.\n"); + "Resending InitiatorHello. Retries left: %u\n", + kx->resend_tries_left); GNUNET_MQ_send_copy (kx->mq, kx->resend_env); - // FIXME (Exponential) backoff? kx->resend_task = GNUNET_SCHEDULER_add_delayed (RESEND_TIMEOUT, &resend_initiator_hello, kx);