}
-/*
- * Do the statistics
- */
-static unlang_action_t CC_HINT(nonnull) mod_stats(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+static unlang_action_t CC_HINT(nonnull) mod_stats_inc(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
{
rlm_stats_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
rlm_stats_thread_t *t = talloc_get_type_abort(mctx->thread, rlm_stats_thread_t);
- int i;
- uint32_t stats_type;
+ int i, src_code, dst_code;
+ rlm_stats_data_t *stats;
+ rlm_stats_data_t mydata;
+ src_code = request->packet->code;
+ if (src_code >= FR_RADIUS_CODE_MAX) src_code = 0;
- fr_pair_t *vp;
- rlm_stats_data_t mydata;
- char buffer[64];
- uint64_t local_stats[NUM_ELEMENTS(inst->mutable->stats)];
+ dst_code = request->reply->code;
+ if (dst_code >= FR_RADIUS_CODE_MAX) dst_code = 0;
+
+ pthread_mutex_lock(&t->mutex);
+ t->stats[src_code]++;
+ t->stats[dst_code]++;
/*
- * Increment counters only in "send foo" sections.
- *
- * i.e. only when we have a reply to send.
- *
- * FIXME - Nothing sets request_state anymore
+ * Update source statistics
*/
-#if 0
- if (request->request_state == REQUEST_SEND) {
- int src_code, dst_code;
- rlm_stats_data_t *stats;
+ mydata.ipaddr = request->packet->socket.inet.src_ipaddr;
+ stats = fr_rb_find(t->src, &mydata);
+ if (!stats) {
+ MEM(stats = talloc_zero(t, rlm_stats_data_t));
- src_code = request->packet->code;
- if (src_code >= FR_RADIUS_CODE_MAX) src_code = 0;
+ stats->ipaddr = request->packet->socket.inet.src_ipaddr;
+ stats->created = request->async->recv_time;
- dst_code = request->reply->code;
- if (dst_code >= FR_RADIUS_CODE_MAX) dst_code = 0;
+ (void) fr_rb_insert(t->src, stats);
+ }
- pthread_mutex_lock(&t->mutex);
- t->stats[src_code]++;
- t->stats[dst_code]++;
+ stats->last_packet = request->async->recv_time;
+ stats->stats[src_code]++;
+ stats->stats[dst_code]++;
- /*
- * Update source statistics
- */
- mydata.ipaddr = request->packet->socket.inet.src_ipaddr;
- stats = fr_rb_find(t->src, &mydata);
- if (!stats) {
- MEM(stats = talloc_zero(t, rlm_stats_data_t));
+ /*
+ * Update destination statistics
+ */
+ mydata.ipaddr = request->packet->socket.inet.dst_ipaddr;
+ stats = fr_rb_find(t->dst, &mydata);
+ if (!stats) {
+ MEM(stats = talloc_zero(t, rlm_stats_data_t));
- stats->ipaddr = request->packet->socket.inet.src_ipaddr;
- stats->created = request->async->recv_time;
+ stats->ipaddr = request->packet->socket.inet.dst_ipaddr;
+ stats->created = request->async->recv_time;
- (void) fr_rb_insert(t->src, stats);
- }
-
- stats->last_packet = request->async->recv_time;
- stats->stats[src_code]++;
- stats->stats[dst_code]++;
+ (void) fr_rb_insert(t->dst, stats);
+ }
- /*
- * Update destination statistics
- */
- mydata.ipaddr = request->packet->socket.inet.dst_ipaddr;
- stats = fr_rb_find(t->dst, &mydata);
- if (!stats) {
- MEM(stats = talloc_zero(t, rlm_stats_data_t));
+ stats->last_packet = request->async->recv_time;
+ stats->stats[src_code]++;
+ stats->stats[dst_code]++;
+ pthread_mutex_unlock(&t->mutex);
- stats->ipaddr = request->packet->socket.inet.dst_ipaddr;
- stats->created = request->async->recv_time;
+ /*
+ * @todo - periodically clean up old entries.
+ */
- (void) fr_rb_insert(t->dst, stats);
- }
+ if (fr_time_gt(fr_time_add(t->last_global_update, fr_time_delta_wrap(NSEC)), request->async->recv_time)) {
+ RETURN_MODULE_UPDATED;
+ }
- stats->last_packet = request->async->recv_time;
- stats->stats[src_code]++;
- stats->stats[dst_code]++;
- pthread_mutex_unlock(&t->mutex);
+ t->last_global_update = request->async->recv_time;
- /*
- * @todo - periodically clean up old entries.
- */
+ pthread_mutex_lock(&inst->mutable->mutex);
+ for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
+ inst->mutable->stats[i] += t->stats[i];
+ t->stats[i] = 0;
+ }
+ pthread_mutex_unlock(&inst->mutable->mutex);
- if ((t->last_global_update + NSEC) > request->async->recv_time) {
- RETURN_MODULE_UPDATED;
- }
+ RETURN_MODULE_UPDATED;
+}
- t->last_global_update = request->async->recv_time;
+/*
+ * Do the statistics
+ */
+static unlang_action_t CC_HINT(nonnull) mod_stats_read(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+{
+ rlm_stats_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_stats_t);
+ rlm_stats_thread_t *t = talloc_get_type_abort(mctx->thread, rlm_stats_thread_t);
+ int i;
+ uint32_t stats_type;
- pthread_mutex_lock(&inst->mutable->mutex);
- for (i = 0; i < FR_RADIUS_CODE_MAX; i++) {
- inst->mutable->stats[i] += t->stats[i];
- t->stats[i] = 0;
- }
- pthread_mutex_unlock(&inst->mutable->mutex);
- RETURN_MODULE_UPDATED;
- }
-#endif
+ fr_pair_t *vp;
+ rlm_stats_data_t mydata;
+ char buffer[64];
+ uint64_t local_stats[NUM_ELEMENTS(inst->mutable->stats)];
/*
* Ignore "authenticate" and anything other than Status-Server
},
.method_group = {
.bindings = (module_method_binding_t[]){
- { .section = SECTION_NAME(CF_IDENT_ANY, CF_IDENT_ANY), .method = mod_stats },
+ { .section = SECTION_NAME("send", CF_IDENT_ANY), .method = mod_stats_inc },
+ { .section = SECTION_NAME("recv", "Status-Server"), .method = mod_stats_read },
MODULE_BINDING_TERMINATOR
}
}