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:
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);