From e886573152135298b5673631e99faadc14aabe99 Mon Sep 17 00:00:00 2001 From: Arran Cudbard-Bell Date: Tue, 3 Mar 2020 19:09:55 -0600 Subject: [PATCH] rlm_radius_udp: Add reset function for status_check packets --- src/modules/rlm_radius/rlm_radius_udp.c | 26 +++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/modules/rlm_radius/rlm_radius_udp.c b/src/modules/rlm_radius/rlm_radius_udp.c index dc007e7f9de9..7b16d57afeb0 100644 --- a/src/modules/rlm_radius/rlm_radius_udp.c +++ b/src/modules/rlm_radius/rlm_radius_udp.c @@ -253,6 +253,24 @@ static rlm_rcode_t radius_code_to_rcode[FR_RADIUS_MAX_PACKET_CODE] = { [FR_CODE_PROTOCOL_ERROR] = RLM_MODULE_HANDLED, }; +/** Reset a status_check packet, ready to re-use + * + */ +static void status_check_reset(udp_handle_t *h, udp_request_t *u) +{ + rad_assert(u->status_check == true); + + h->status_checking = false; + u->num_replies = 0; /* Reset */ + u->retry.start = 0; + + if (u->rr) (void) radius_track_delete(&u->rr); /* Not used for conn status check */ + if (u->ev) (void) fr_event_timer_delete(&u->ev); + + TALLOC_FREE(u->packet); + fr_pair_list_free(&u->extra); +} + /* * Status-Server checks. Manually build the packet, and * all of its associated glue. @@ -1849,17 +1867,17 @@ static void status_check_reply(fr_trunk_request_t *treq, fr_time_t now) DEBUG("Received enough replies to status check, marking connection as active - %s", h->name); - if (u->rr) (void) radius_track_delete(&u->rr); - if (u->ev) (void) fr_event_timer_delete(&u->ev); - /* * Set the "last idle" time to now, so that we don't * restart zombie_period until sufficient time has * passed. */ h->last_idle = fr_time(); - h->status_checking = false; + /* + * Reset retry interval and retransmission counters + */ + status_check_reset(h, u); fr_trunk_connection_signal_active(treq->tconn); }