From: Alan T. DeKok Date: Wed, 21 Jun 2017 13:44:57 +0000 (-0400) Subject: add cleanup_delay timers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=848825e108aef86aa28b6955e22e2f34a81e9255;p=thirdparty%2Ffreeradius-server.git add cleanup_delay timers Still have to add debug printing tho... --- diff --git a/src/lib/io/track.c b/src/lib/io/track.c index 46cd8cd241f..92c29573364 100644 --- a/src/lib/io/track.c +++ b/src/lib/io/track.c @@ -221,6 +221,7 @@ fr_tracking_status_t fr_radius_tracking_entry_insert(fr_tracking_t *ft, uint8_t * The entry is unused, insert it. */ if (entry->timestamp == 0) { + entry->ft = ft; entry->timestamp = timestamp; entry->reply = NULL; entry->reply_len = 0; @@ -312,6 +313,7 @@ fr_tracking_status_t fr_radius_tracking_entry_insert(fr_tracking_t *ft, uint8_t if (!entry) return FR_TRACKING_ERROR; memset(entry, 0, align + ft->src_dst_size); + entry->ft = ft; entry->timestamp = timestamp; insert = true; diff --git a/src/lib/io/track.h b/src/lib/io/track.h index 06358d3bd9a..827aa2fc12b 100644 --- a/src/lib/io/track.h +++ b/src/lib/io/track.h @@ -42,6 +42,9 @@ typedef struct fr_tracking_t fr_tracking_t; * be cleaned up at an appropriate time. */ typedef struct fr_tracking_entry_t { + fr_tracking_t *ft; //!< for cleanup_delay + fr_event_timer_t *ev; //!< for cleanup_delay + fr_time_t timestamp; //!< when the request was received void *src_dst; //!< information about src/dst IP/port size_t src_dst_size; //!< size of the data in src_dst diff --git a/src/modules/proto_radius/proto_radius_udp.c b/src/modules/proto_radius/proto_radius_udp.c index 9871644779d..b4ab3040523 100644 --- a/src/modules/proto_radius/proto_radius_udp.c +++ b/src/modules/proto_radius/proto_radius_udp.c @@ -140,8 +140,14 @@ static ssize_t mod_read(void const *instance, void **packet_ctx, uint8_t *buffer case FR_TRACKING_SAME: return 0; - case FR_TRACKING_NEW: + /* + * Delete any pre-existing cleanup_delay timers. + */ case FR_TRACKING_DIFFERENT: + if (track->ev) (void) fr_event_timer_delete(inst->el, &track->ev); + break; + + case FR_TRACKING_NEW: break; } @@ -150,6 +156,15 @@ static ssize_t mod_read(void const *instance, void **packet_ctx, uint8_t *buffer return packet_len; } +static void mod_cleanup_delay(UNUSED fr_event_list_t *el, UNUSED struct timeval *now, void *uctx) +{ + fr_tracking_entry_t *track = uctx; + // proto_radius_udp_t const *inst = talloc_parent(track->ft); + + (void) fr_radius_tracking_entry_delete(track->ft, track); +} + + static ssize_t mod_write(void const *instance, fr_time_t request_time, void *packet_ctx, uint8_t *buffer, size_t buffer_len) { proto_radius_udp_t const *inst = talloc_get_type_abort(instance, proto_radius_udp_t); @@ -158,6 +173,7 @@ static ssize_t mod_write(void const *instance, fr_time_t request_time, void *pac ssize_t data_size; fr_time_t reply_time; + struct timeval tv; /* * The original packet has changed. Suppress the write, @@ -206,8 +222,19 @@ static ssize_t mod_write(void const *instance, fr_time_t request_time, void *pac } /* - * @todo - set cleanup_delay + * @todo - Move event timers to fr_time_t */ + gettimeofday(&tv, NULL); + + tv.tv_sec += inst->cleanup_delay; + + /* + * Clean up after a while. + */ + if (fr_event_timer_insert(inst->el, mod_cleanup_delay, track, &tv, &track->ev) < 0) { + (void) fr_radius_tracking_entry_delete(inst->ft, track); + return data_size; + } return data_size; }