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
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
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
{ 0, 0 }
};
+
#ifdef WITH_PROXY
/*
* Proxied authentication requests.
};
#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 */