]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add cleanup_delay timers
authorAlan T. DeKok <aland@freeradius.org>
Wed, 21 Jun 2017 13:44:57 +0000 (09:44 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 21 Jun 2017 13:46:53 +0000 (09:46 -0400)
Still have to add debug printing tho...

src/lib/io/track.c
src/lib/io/track.h
src/modules/proto_radius/proto_radius_udp.c

index 46cd8cd241f37b40465afde5349727e382090956..92c2957336430582ffcf592aa903957237bdeb08 100644 (file)
@@ -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;
 
index 06358d3bd9a2064edc42b2bca5d1118273442b4f..827aa2fc12b6dd13f30237ece54c5e0cf555753e 100644 (file)
@@ -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
index 9871644779d3d16e18923d99eb8ca4ba5fdbadb9..b4ab3040523a7ac15c5c255318720341a417e285 100644 (file)
@@ -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;
 }