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.
* We retried too many times. Fail.
*/
if (r->config->mrc && (r->count > r->config->mrc)) {
+ r->state = FR_RETRY_MRC;
return FR_RETRY_MRC;
}
end = fr_time_add(r->start, r->config->mrd);
if (fr_time_gt(now, end)) {
+ r->state = FR_RETRY_MRD;
return FR_RETRY_MRD;
}
}
#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
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);