Expose more statistics
authoraland <aland>
Thu, 19 Jun 2008 14:49:48 +0000 (14:49 +0000)
committeraland <aland>
Thu, 19 Jun 2008 14:49:48 +0000 (14:49 +0000)
share/dictionary.freeradius
src/main/stats.c

index 4936579..1db0506 100644 (file)
@@ -15,8 +15,25 @@ BEGIN-VENDOR FreeRADIUS
 
 ATTRIBUTE      FreeRADIUS-Proxied-To                   1       ipaddr
 
+
+#
+#  Really a bitmask.
+#
+ATTRIBUTE      FreeRADIUS-Statistics-Type              127     integer
+
+VALUE  FreeRADIUS-Statistics-Type      None    0
+VALUE  FreeRADIUS-Statistics-Type      Authentication  1
+VALUE  FreeRADIUS-Statistics-Type      Accounting      2
+VALUE  FreeRADIUS-Statistics-Type      Proxy-Authentication    4
+VALUE  FreeRADIUS-Statistics-Type      Proxy-Accounting        8
+
+#
+#  Note that these statistics are available ONLY for packets
+#  originating from localhost.
+#
+
 #
-#  Global numbers received by the server.
+#  Global authentication statistics for packets received by the server.
 #
 ATTRIBUTE      FreeRADIUS-Total-Access-Requests        128     integer
 ATTRIBUTE      FreeRADIUS-Total-Access-Accepts         129     integer
@@ -30,7 +47,7 @@ ATTRIBUTE     FreeRADIUS-Total-Auth-Dropped-Requests  136     integer
 ATTRIBUTE      FreeRADIUS-Total-Auth-Unknown-Types     137     integer
 
 #
-#  Global numbers sent by the server to all home servers
+#  Global statistics for auth packets sent by the server to all home servers
 #
 ATTRIBUTE      FreeRADIUS-Total-Proxy-Access-Requests  138     integer
 ATTRIBUTE      FreeRADIUS-Total-Proxy-Access-Accepts   139     integer
@@ -43,4 +60,26 @@ ATTRIBUTE    FreeRADIUS-Total-Proxy-Auth-Invalid-Requests    145     integer
 ATTRIBUTE      FreeRADIUS-Total-Proxy-Auth-Dropped-Requests    146     integer
 ATTRIBUTE      FreeRADIUS-Total-Proxy-Auth-Unknown-Types       147     integer
 
+#
+#  Global accounting statistics for packets received by the server.
+#
+ATTRIBUTE      FreeRADIUS-Total-Accounting-Requests    148     integer
+ATTRIBUTE      FreeRADIUS-Total-Accounting-Responses   149     integer
+ATTRIBUTE      FreeRADIUS-Total-Acct-Duplicate-Requests        150     integer
+ATTRIBUTE      FreeRADIUS-Total-Acct-Malformed-Requests        151     integer
+ATTRIBUTE      FreeRADIUS-Total-Acct-Invalid-Requests  152     integer
+ATTRIBUTE      FreeRADIUS-Total-Acct-Dropped-Requests  153     integer
+ATTRIBUTE      FreeRADIUS-Total-Acct-Unknown-Types     154     integer
+
+#
+#  Global statistics for acct packets sent by the server to all home servers
+#
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Accounting-Requests      155     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Accounting-Responses     156     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Acct-Duplicate-Requests  157     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Acct-Malformed-Requests  158     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Acct-Invalid-Requests    159     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Acct-Dropped-Requests    160     integer
+ATTRIBUTE      FreeRADIUS-Total-Proxy-Acct-Unknown-Types       161     integer
+
 END-VENDOR FreeRADIUS
index e18ec14..44e9080 100644 (file)
@@ -182,6 +182,7 @@ static fr_stats2vp authvp[] = {
        { 0, 0 }
 };
 
+
 #ifdef WITH_PROXY
 /*
  *     Proxied authentication requests.
@@ -201,42 +202,90 @@ static fr_stats2vp proxy_authvp[] = {
 };
 #endif
 
+
+#ifdef WITH_ACCOUNTING
+/*
+ *     Accounting
+ */
+static fr_stats2vp acctvp[] = {
+       { 148, offsetof(fr_stats_t, total_requests) },
+       { 149, offsetof(fr_stats_t, total_responses) },
+       { 150, offsetof(fr_stats_t, total_dup_requests) },
+       { 151, offsetof(fr_stats_t, total_malformed_requests) },
+       { 152, offsetof(fr_stats_t, total_bad_authenticators) },
+       { 153, offsetof(fr_stats_t, total_packets_dropped) },
+       { 154, offsetof(fr_stats_t, total_unknown_types) },
+       { 0, 0 }
+};
+
+#ifdef WITH_PROXY
+static fr_stats2vp proxy_acctvp[] = {
+       { 155, offsetof(fr_stats_t, total_requests) },
+       { 156, offsetof(fr_stats_t, total_responses) },
+       { 157, offsetof(fr_stats_t, total_dup_requests) },
+       { 158, offsetof(fr_stats_t, total_malformed_requests) },
+       { 159, offsetof(fr_stats_t, total_bad_authenticators) },
+       { 160, offsetof(fr_stats_t, total_packets_dropped) },
+       { 161, offsetof(fr_stats_t, total_unknown_types) },
+       { 0, 0 }
+};
+#endif
+#endif
+
+
 #define FR2ATTR(x) ((11344 << 16) | (x))
 
-void request_stats_reply(REQUEST *request)
+static void request_stats_addvp(REQUEST *request,
+                               fr_stats2vp *table, fr_stats_t *stats)
 {
        int i;
        VALUE_PAIR *vp;
 
+       for (i = 0; table[i].attribute != 0; i++) {
+               vp = radius_paircreate(request, &request->reply->vps,
+                                      FR2ATTR(table[i].attribute),
+                                      PW_TYPE_INTEGER);
+               if (!vp) continue;
+
+               vp->vp_integer = *(int *)(((char *) stats) + table[i].offset);
+       }
+}
+
+
+void request_stats_reply(REQUEST *request)
+{
+       VALUE_PAIR *vp;
+
        if (request->packet->code != PW_STATUS_SERVER) return;
 
        if ((request->packet->src_ipaddr.af != AF_INET) ||
            (request->packet->src_ipaddr.ipaddr.ip4addr.s_addr != htonl(INADDR_LOOPBACK))) return;
 
-       vp = pairfind(request->packet->vps, PW_CONFIGURATION_TOKEN);
-       if (!vp || (strcmp(vp->vp_strvalue, "Statistics") != 0)) return;
+       vp = pairfind(request->packet->vps, FR2ATTR(127));
+       if (!vp || (vp->vp_integer == 0)) return;
 
-       for (i = 0; authvp[i].attribute != 0; i++) {
-               vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(authvp[i].attribute),
-                                      PW_TYPE_INTEGER);
-               if (!vp) continue;
 
-               vp->vp_integer = *(int *)(((char *) &radius_auth_stats) + 
-                                         authvp[i].offset);
+       if (vp->vp_integer & 0x01) {
+               request_stats_addvp(request, authvp, &radius_auth_stats);
        }
+               
+#ifdef WITH_ACCOUNTING
+       if (vp->vp_integer & 0x02) {
+               request_stats_addvp(request, acctvp, &radius_acct_stats);
+       }
+#endif
 
 #ifdef WITH_PROXY
-       for (i = 0; proxy_authvp[i].attribute != 0; i++) {
-               vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(proxy_authvp[i].attribute),
-                                      PW_TYPE_INTEGER);
-               if (!vp) continue;
+       if (vp->vp_integer & 0x04) {
+               request_stats_addvp(request, proxy_authvp, &proxy_auth_stats);
+       }
 
-               vp->vp_integer = *(int *)(((char *) &proxy_auth_stats) + 
-                                         proxy_authvp[i].offset);
+#ifdef WITH_ACCOUNTING
+       if (vp->vp_integer & 0x08) {
+               request_stats_addvp(request, proxy_acctvp, &proxy_acct_stats);
        }
 #endif
+#endif
 }
 
 #endif /* WITH_STATS */