From: Alan T. DeKok Date: Thu, 10 Oct 2024 14:54:26 +0000 (-0400) Subject: save reason for stopping in the fr_retry_t X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3570f5afeaf57e199962f7abca4721777f6fa8ad;p=thirdparty%2Ffreeradius-server.git save reason for stopping in the fr_retry_t --- diff --git a/src/lib/util/retry.c b/src/lib/util/retry.c index 272a27396d9..3a5e5d3577e 100644 --- a/src/lib/util/retry.c +++ b/src/lib/util/retry.c @@ -46,6 +46,7 @@ void fr_retry_init(fr_retry_t *r, fr_time_t now, fr_retry_config_t const *config r->start = now; r->end = fr_time_add(now, config->mrd); r->updated = now; + r->state = FR_RETRY_CONTINUE; /* * Ensure that we always have an end time. @@ -113,6 +114,7 @@ fr_retry_state_t fr_retry_next(fr_retry_t *r, fr_time_t now) * We retried too many times. Fail. */ if (r->config->mrc && (r->count > r->config->mrc)) { + r->state = FR_RETRY_MRC; return FR_RETRY_MRC; } @@ -125,6 +127,7 @@ redo: end = fr_time_add(r->start, r->config->mrd); if (fr_time_gt(now, end)) { + r->state = FR_RETRY_MRD; return FR_RETRY_MRD; } } diff --git a/src/lib/util/retry.h b/src/lib/util/retry.h index 068ae488cd5..752ffb33a02 100644 --- a/src/lib/util/retry.h +++ b/src/lib/util/retry.h @@ -38,6 +38,16 @@ typedef struct { #define RETRY_INIT { fr_time_delta_wrap(0), fr_time_delta_wrap(0), fr_time_delta_wrap(0), 0 } +/* + * Anything other than "CONTINUE" means "DONE". For helpfulness, + * we return *why* the timer is done. + */ +typedef enum { + FR_RETRY_CONTINUE = 0, + FR_RETRY_MRC, //!< reached maximum retransmission count + FR_RETRY_MRD, //!< reached maximum retransmission duration +} fr_retry_state_t; + typedef struct { fr_retry_config_t const *config; //!< master configuration fr_time_t start; //!< when we started the retransmission @@ -47,18 +57,9 @@ typedef struct { fr_time_delta_t rt; //!< retransmit interval uint32_t count; //!< number of sent packets uint32_t replies; //!< number of responses received. + fr_retry_state_t state; //!< so callers can see what state it's in. } fr_retry_t; -/* - * Anything other than "CONTINUE" means "DONE". For helpfulness, - * we return *why* the timer is done. - */ -typedef enum { - FR_RETRY_CONTINUE = 0, - FR_RETRY_MRC, //!< reached maximum retransmission count - FR_RETRY_MRD, //!< reached maximum retransmission duration -} fr_retry_state_t; - void fr_retry_init(fr_retry_t *r, fr_time_t now, fr_retry_config_t const *config) CC_HINT(nonnull); fr_retry_state_t fr_retry_next(fr_retry_t *r, fr_time_t now) CC_HINT(nonnull);