* The entry is unused, insert it.
*/
if (entry->timestamp == 0) {
+ entry->ft = ft;
entry->timestamp = timestamp;
entry->reply = NULL;
entry->reply_len = 0;
if (!entry) return FR_TRACKING_ERROR;
memset(entry, 0, align + ft->src_dst_size);
+ entry->ft = ft;
entry->timestamp = timestamp;
insert = true;
* 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
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;
}
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);
ssize_t data_size;
fr_time_t reply_time;
+ struct timeval tv;
/*
* The original packet has changed. Suppress the write,
}
/*
- * @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;
}