]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
save reason for stopping in the fr_retry_t
authorAlan T. DeKok <aland@freeradius.org>
Thu, 10 Oct 2024 14:54:26 +0000 (10:54 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 10 Oct 2024 14:54:26 +0000 (10:54 -0400)
src/lib/util/retry.c
src/lib/util/retry.h

index 272a27396d91f6715de4580277fb6291bbc303a4..3a5e5d3577e3508dfdf74e44cb30e378d67571f8 100644 (file)
@@ -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;
                }
        }
index 068ae488cd5daa90323dc72cdd016e50fcf5c536..752ffb33a02b91ba1694ccfc6a370e32dc99828d 100644 (file)
@@ -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);