summaryrefslogtreecommitdiffstats
path: root/src/main/stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/stats.c')
-rw-r--r--src/main/stats.c95
1 files changed, 47 insertions, 48 deletions
diff --git a/src/main/stats.c b/src/main/stats.c
index a5c672e..29f2c48 100644
--- a/src/main/stats.c
+++ b/src/main/stats.c
@@ -91,51 +91,57 @@ static void stats_time(fr_stats_t *stats, struct timeval *start,
void request_stats_final(REQUEST *request)
{
rad_listen_t *listener;
+ RADCLIENT *client;
- if (request->master_state == REQUEST_COUNTED) return;
+ if ((request->options & RAD_REQUEST_OPTION_STATS) != 0) return;
- if (!request->listener) return;
- if (!request->client) return;
+ /* don't count statistic requests */
+ if (request->packet->code == PW_CODE_STATUS_SERVER) {
+ return;
+ }
- if ((request->listener->type != RAD_LISTEN_NONE) &&
+ listener = request->listener;
+ if (listener) switch (listener->type) {
+ case RAD_LISTEN_NONE:
#ifdef WITH_ACCOUNTING
- (request->listener->type != RAD_LISTEN_ACCT) &&
+ case RAD_LISTEN_ACCT:
#endif
#ifdef WITH_COA
- (request->listener->type != RAD_LISTEN_COA) &&
+ case RAD_LISTEN_COA:
#endif
- (request->listener->type != RAD_LISTEN_AUTH)) return;
+ case RAD_LISTEN_AUTH:
+ break;
- /* don't count statistic requests */
- if (request->packet->code == PW_CODE_STATUS_SERVER)
- return;
+ default:
+ return;
+ }
/*
* Deal with TCP / TLS issues. The statistics are kept in the parent socket.
*/
- listener = request->listener;
- if (listener->parent) listener = listener->parent;
+ if (listener && listener->parent) listener = listener->parent;
+ client = request->client;
#undef INC_AUTH
-#define INC_AUTH(_x) radius_auth_stats._x++;listener->stats._x++;request->client->auth._x++;
+#define INC_AUTH(_x) radius_auth_stats._x++;if (listener) listener->stats._x++;if (client) client->auth._x++;
#undef INC_ACCT
#ifdef WITH_ACCOUNTING
-#define INC_ACCT(_x) radius_acct_stats._x++;listener->stats._x++;request->client->acct._x++
+#define INC_ACCT(_x) radius_acct_stats._x++;if (listener) listener->stats._x++;if (client) client->acct._x++
#else
#define INC_ACCT(_x)
#endif
#undef INC_COA
#ifdef WITH_COA
-#define INC_COA(_x) radius_coa_stats._x++;listener->stats._x++;request->client->coa._x++
+#define INC_COA(_x) radius_coa_stats._x++;if (listener) listener->stats._x++;if (client) client->coa._x++
#else
#define INC_COA(_x)
#endif
#undef INC_DSC
#ifdef WITH_DSC
-#define INC_DSC(_x) radius_dsc_stats._x++;listener->stats._x++;request->client->dsc._x++
+#define INC_DSC(_x) radius_dsc_stats._x++;if (listener) listener->stats._x++;if (client) client->dsc._x++
#else
#define INC_DSC(_x)
#endif
@@ -148,7 +154,7 @@ void request_stats_final(REQUEST *request)
* deleted, because only the main server thread calls
* this function, which makes it thread-safe.
*/
- if (request->reply && (request->packet->code != PW_CODE_STATUS_SERVER)) switch (request->reply->code) {
+ if (request->reply) switch (request->reply->code) {
case PW_CODE_ACCESS_ACCEPT:
INC_AUTH(total_access_accepts);
@@ -247,25 +253,21 @@ void request_stats_final(REQUEST *request)
switch (request->proxy->code) {
case PW_CODE_ACCESS_REQUEST:
proxy_auth_stats.total_requests += request->num_proxied_requests;
- request->home_server->stats.total_requests += request->num_proxied_requests;
break;
#ifdef WITH_ACCOUNTING
case PW_CODE_ACCOUNTING_REQUEST:
proxy_acct_stats.total_requests += request->num_proxied_requests;
- request->home_server->stats.total_requests += request->num_proxied_requests;
break;
#endif
#ifdef WITH_COA
case PW_CODE_COA_REQUEST:
proxy_coa_stats.total_requests += request->num_proxied_requests;
- request->home_server->stats.total_requests += request->num_proxied_requests;
break;
case PW_CODE_DISCONNECT_REQUEST:
proxy_dsc_stats.total_requests += request->num_proxied_requests;
- request->home_server->stats.total_requests += request->num_proxied_requests;
break;
#endif
@@ -276,7 +278,7 @@ void request_stats_final(REQUEST *request)
if (!request->proxy_reply) goto done; /* simplifies formatting */
#undef INC
-#define INC(_x) proxy_auth_stats._x += request->num_proxied_responses; request->home_server->stats._x += request->num_proxied_responses;
+#define INC(_x) proxy_auth_stats._x += request->num_proxied_responses;request->home_server->stats._x += request->num_proxied_responses;
switch (request->proxy_reply->code) {
case PW_CODE_ACCESS_ACCEPT:
@@ -347,10 +349,7 @@ void request_stats_final(REQUEST *request)
done:
#endif /* WITH_PROXY */
-
if (request->max_time) {
- RADCLIENT *client = request->client;
-
switch (request->packet->code) {
case PW_CODE_ACCESS_REQUEST:
FR_STATS_INC(auth, unresponsive_child);
@@ -376,7 +375,7 @@ void request_stats_final(REQUEST *request)
}
}
- request->master_state = REQUEST_COUNTED;
+ request->options |= RAD_REQUEST_OPTION_STATS;
}
typedef struct fr_stats2vp {
@@ -525,8 +524,8 @@ void request_stats_reply(REQUEST *request)
/*
* Authentication.
*/
- if (((flag->vp_integer & 0x01) != 0) &&
- ((flag->vp_integer & 0xc0) == 0)) {
+ if (((flag->vp_integer & 0x01) != 0) && /* auth */
+ ((flag->vp_integer & 0xe0) == 0)) { /* not client, server or home-server */
request_stats_addvp(request, authvp, &radius_auth_stats);
}
@@ -534,8 +533,8 @@ void request_stats_reply(REQUEST *request)
/*
* Accounting
*/
- if (((flag->vp_integer & 0x02) != 0) &&
- ((flag->vp_integer & 0xc0) == 0)) {
+ if (((flag->vp_integer & 0x02) != 0) && /* accounting */
+ ((flag->vp_integer & 0xe0) == 0)) { /* not client, server or home-server */
request_stats_addvp(request, acctvp, &radius_acct_stats);
}
#endif
@@ -544,8 +543,8 @@ void request_stats_reply(REQUEST *request)
/*
* Proxied authentication requests.
*/
- if (((flag->vp_integer & 0x04) != 0) &&
- ((flag->vp_integer & 0x20) == 0)) {
+ if (((flag->vp_integer & 0x04) != 0) && /* proxy-auth */
+ ((flag->vp_integer & 0x20) == 0)) { /* not client */
request_stats_addvp(request, proxy_authvp, &proxy_auth_stats);
}
@@ -553,8 +552,8 @@ void request_stats_reply(REQUEST *request)
/*
* Proxied accounting requests.
*/
- if (((flag->vp_integer & 0x08) != 0) &&
- ((flag->vp_integer & 0x20) == 0)) {
+ if (((flag->vp_integer & 0x08) != 0) && /* proxy-accounting */
+ ((flag->vp_integer & 0x20) == 0)) { /* not client */
request_stats_addvp(request, proxy_acctvp, &proxy_acct_stats);
}
#endif
@@ -563,7 +562,7 @@ void request_stats_reply(REQUEST *request)
/*
* Internal server statistics
*/
- if ((flag->vp_integer & 0x10) != 0) {
+ if ((flag->vp_integer & 0x10) != 0) { /* internal */
vp = radius_pair_create(request->reply, &request->reply->vps,
PW_FREERADIUS_STATS_START_TIME, VENDORPEC_FREERADIUS);
if (vp) vp->vp_date = start_time.tv_sec;
@@ -607,7 +606,7 @@ void request_stats_reply(REQUEST *request)
/*
* For a particular client.
*/
- if ((flag->vp_integer & 0x20) != 0) {
+ if ((flag->vp_integer & 0x20) != 0) { /* client */
fr_ipaddr_t ipaddr;
VALUE_PAIR *server_ip, *server_port = NULL;
RADCLIENT *client = NULL;
@@ -764,8 +763,8 @@ void request_stats_reply(REQUEST *request)
/*
* For a particular "listen" socket.
*/
- if (((flag->vp_integer & 0x40) != 0) &&
- ((flag->vp_integer & 0x03) != 0)) {
+ if (((flag->vp_integer & 0x40) != 0) && /* server */
+ ((flag->vp_integer & 0x03) != 0)) { /* auth or accounting */
rad_listen_t *this;
VALUE_PAIR *server_ip, *server_port;
fr_ipaddr_t ipaddr;
@@ -807,7 +806,7 @@ void request_stats_reply(REQUEST *request)
fr_pair_add(&request->reply->vps,
fr_pair_copy(request->reply, server_port));
- if ((flag->vp_integer & 0x01) != 0) {
+ if ((flag->vp_integer & 0x01) != 0) { /* auth */
if ((request->listener->type == RAD_LISTEN_AUTH) ||
(request->listener->type == RAD_LISTEN_NONE)) {
request_stats_addvp(request, authvp, &this->stats);
@@ -817,7 +816,7 @@ void request_stats_reply(REQUEST *request)
}
#ifdef WITH_ACCOUNTING
- if ((flag->vp_integer & 0x02) != 0) {
+ if ((flag->vp_integer & 0x02) != 0) { /* accounting */
if ((request->listener->type == RAD_LISTEN_ACCT) ||
(request->listener->type == RAD_LISTEN_NONE)) {
request_stats_addvp(request, acctvp, &this->stats);
@@ -832,8 +831,8 @@ void request_stats_reply(REQUEST *request)
/*
* Home servers.
*/
- if (((flag->vp_integer & 0x80) != 0) &&
- ((flag->vp_integer & 0x03) != 0)) {
+ if (((flag->vp_integer & 0x80) != 0) && /* home-server */
+ ((flag->vp_integer & 0x03) != 0)) { /* auth or accounting */
home_server_t *home;
VALUE_PAIR *server_ip, *server_port;
fr_ipaddr_t ipaddr;
@@ -935,7 +934,7 @@ void request_stats_reply(REQUEST *request)
PW_FREERADIUS_STATS_LAST_PACKET_SENT, VENDORPEC_FREERADIUS);
if (vp) vp->vp_date = home->last_packet_sent;
- if ((flag->vp_integer & 0x01) != 0) {
+ if ((flag->vp_integer & 0x01) != 0) { /* auth */
if (home->type == HOME_TYPE_AUTH) {
request_stats_addvp(request, proxy_authvp,
&home->stats);
@@ -945,7 +944,7 @@ void request_stats_reply(REQUEST *request)
}
#ifdef WITH_ACCOUNTING
- if ((flag->vp_integer & 0x02) != 0) {
+ if ((flag->vp_integer & 0x02) != 0) { /* accounting */
if (home->type == HOME_TYPE_ACCT) {
request_stats_addvp(request, proxy_acctvp,
&home->stats);
@@ -991,14 +990,14 @@ void radius_stats_ema(fr_stats_ema_t *ema,
}
- tdiff = start->tv_sec;
- tdiff -= end->tv_sec;
+ tdiff = end->tv_sec;
+ tdiff -= start->tv_sec;
micro = (int) tdiff;
if (micro > 40) micro = 40; /* don't overflow 32-bit ints */
micro *= USEC;
- micro += start->tv_usec;
- micro -= end->tv_usec;
+ micro += end->tv_usec;
+ micro -= start->tv_usec;
micro *= EMA_SCALE;