Enable building WITHOUT_ACCOUNTING
[freeradius.git] / src / main / stats.c
index 6d5471d..ced48bb 100644 (file)
@@ -55,8 +55,21 @@ void request_stats_final(REQUEST *request)
        if (request->master_state == REQUEST_COUNTED) return;
 
        if ((request->listener->type != RAD_LISTEN_NONE) &&
-           (request->listener->type != RAD_LISTEN_AUTH) &&
-           (request->listener->type != RAD_LISTEN_ACCT)) return;
+#ifdef WITH_ACCOUNTING
+           (request->listener->type != RAD_LISTEN_ACCT) &&
+#endif
+           (request->listener->type != RAD_LISTEN_AUTH)) return;
+
+#undef INC_AUTH
+#define INC_AUTH(_x) radius_auth_stats._x++;request->listener->stats._x++;if (request->client && request->client->auth) request->client->auth->_x++;
+
+
+#undef INC_ACCT
+#ifdef WITH_ACCOUNTING
+#define INC_ACCT(_x) radius_acct_stats._x++;request->listener->stats._x++;if (request->client && request->client->acct) request->client->acct->_x++
+#else
+#define INC_ACCT(_x)
+#endif
 
        /*
         *      Update the statistics.
@@ -66,47 +79,25 @@ void request_stats_final(REQUEST *request)
         *      deleted, because only the main server thread calls
         *      this function, which makes it thread-safe.
         */
-       switch (request->reply->code) {
+       if (request->reply) switch (request->reply->code) {
        case PW_AUTHENTICATION_ACK:
-               radius_auth_stats.total_responses++;
-               radius_auth_stats.total_access_accepts++;
-               request->listener->stats.total_responses++;
-               request->listener->stats.total_access_accepts++;
-               if (request->client && request->client->auth) {
-                       request->client->auth->total_access_accepts++;
-                       request->client->auth->total_responses++;
-               }
+               INC_AUTH(total_responses);
+               INC_AUTH(total_access_accepts);
                break;
 
        case PW_AUTHENTICATION_REJECT:
-               radius_auth_stats.total_responses++;
-               radius_auth_stats.total_access_rejects++;
-               request->listener->stats.total_responses++;
-               request->listener->stats.total_access_rejects++;
-               if (request->client && request->client->auth) {
-                       request->client->auth->total_access_rejects++;
-                       request->client->auth->total_responses++;
-               }
+               INC_AUTH(total_responses);
+               INC_AUTH(total_access_rejects);
                break;
 
        case PW_ACCESS_CHALLENGE:
-               radius_auth_stats.total_responses++;
-               radius_auth_stats.total_access_challenges++;
-               request->listener->stats.total_responses++;
-               request->listener->stats.total_access_challenges++;
-               if (request->client && request->client->auth) {
-                       request->client->auth->total_access_challenges++;
-                       request->client->auth->total_responses++;
-               }
+               INC_AUTH(total_responses);
+               INC_AUTH(total_access_challenges);
                break;
 
 #ifdef WITH_ACCOUNTING
        case PW_ACCOUNTING_RESPONSE:
-               radius_acct_stats.total_responses++;
-               request->listener->stats.total_responses++;
-               if (request->client && request->client->acct) {
-                       request->client->acct->total_responses++;
-               }
+               INC_ACCT(total_responses);
                break;
 #endif
 
@@ -116,10 +107,16 @@ void request_stats_final(REQUEST *request)
                 */
        case 0:
                if (request->packet->code == PW_AUTHENTICATION_REQUEST) {
-                       radius_auth_stats.total_bad_authenticators++;
-                       request->listener->stats.total_bad_authenticators++;
-                       if (request->client && request->client->auth) {
-                               request->client->auth->total_bad_authenticators++;
+                       if (request->reply->offset == -2) {
+                               INC_AUTH(total_bad_authenticators);
+                       } else {
+                               INC_AUTH(total_packets_dropped);
+                       }
+               } else if (request->packet->code == PW_ACCOUNTING_REQUEST) {
+                       if (request->reply->offset == -2) {
+                               INC_ACCT(total_bad_authenticators);
+                       } else {
+                               INC_ACCT(total_packets_dropped);
                        }
                }
                break;
@@ -173,7 +170,7 @@ void request_stats_final(REQUEST *request)
 
 #ifdef WITH_ACCOUNTING
        case PW_ACCOUNTING_RESPONSE:
-               radius_acct_stats.total_responses++;
+               proxy_acct_stats.total_responses++;
                request->proxy_listener->stats.total_responses++;
                request->home_server->stats.total_responses++;
                break;
@@ -291,8 +288,6 @@ static fr_stats2vp client_acctvp[] = {
 };
 #endif
 
-#define FR2ATTR(x) ((11344 << 16) | (x))
-
 static void request_stats_addvp(REQUEST *request,
                                fr_stats2vp *table, fr_stats_t *stats)
 {
@@ -301,7 +296,7 @@ static void request_stats_addvp(REQUEST *request,
 
        for (i = 0; table[i].attribute != 0; i++) {
                vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(table[i].attribute),
+                                      table[i].attribute, VENDORPEC_FREERADIUS,
                                       PW_TYPE_INTEGER);
                if (!vp) continue;
 
@@ -320,7 +315,7 @@ void request_stats_reply(REQUEST *request)
        rad_assert(request->packet->code == PW_STATUS_SERVER);
        rad_assert(request->listener->type == RAD_LISTEN_NONE);
                
-       flag = pairfind(request->packet->vps, FR2ATTR(127));
+       flag = pairfind(request->packet->vps, 127, VENDORPEC_FREERADIUS);
        if (!flag || (flag->vp_integer == 0)) return;
 
        /*
@@ -366,10 +361,10 @@ void request_stats_reply(REQUEST *request)
         */
        if ((flag->vp_integer & 0x10) != 0) {
                vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(176), PW_TYPE_DATE);
+                                      176, VENDORPEC_FREERADIUS, PW_TYPE_DATE);
                if (vp) vp->vp_date = start_time.tv_sec;
                vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(177), PW_TYPE_DATE);
+                                      177, VENDORPEC_FREERADIUS, PW_TYPE_DATE);
                if (vp) vp->vp_date = hup_time.tv_sec;
                
 #ifdef HAVE_PTHREAD_H
@@ -377,15 +372,17 @@ void request_stats_reply(REQUEST *request)
 
                thread_pool_queue_stats(array);
 
+#ifdef WITH_DETAIL
                for (i = 0; i <= RAD_LISTEN_DETAIL; i++) {
                        vp = radius_paircreate(request, &request->reply->vps,
-                                              FR2ATTR(162 + i),
+                                              162 + i, VENDORPEC_FREERADIUS,
                                               PW_TYPE_INTEGER);
                        
                        if (!vp) continue;
                        vp->vp_integer = array[i];
                }
 #endif
+#endif
        }
 
        /*
@@ -401,10 +398,10 @@ void request_stats_reply(REQUEST *request)
                 *      See if we need to look up the client by server
                 *      socket.
                 */
-               server_ip = pairfind(request->packet->vps, FR2ATTR(170));
+               server_ip = pairfind(request->packet->vps, 170, VENDORPEC_FREERADIUS);
                if (server_ip) {
                        server_port = pairfind(request->packet->vps,
-                                              FR2ATTR(171));
+                                              171, VENDORPEC_FREERADIUS);
 
                        if (server_port) {
                                ipaddr.af = AF_INET;
@@ -419,7 +416,7 @@ void request_stats_reply(REQUEST *request)
                }
 
 
-               vp = pairfind(request->packet->vps, FR2ATTR(167));
+               vp = pairfind(request->packet->vps, 167, VENDORPEC_FREERADIUS);
                if (vp) {
                        ipaddr.af = AF_INET;
                        ipaddr.ipaddr.ip4addr.s_addr = vp->vp_ipaddr;
@@ -434,7 +431,7 @@ void request_stats_reply(REQUEST *request)
                         *      Else look it up by number.
                         */
                } else if ((vp = pairfind(request->packet->vps,
-                                          FR2ATTR(168))) != NULL) {
+                                          168, VENDORPEC_FREERADIUS)) != NULL) {
                        client = client_findbynumber(cl, vp->vp_integer);
                }
 
@@ -453,7 +450,7 @@ void request_stats_reply(REQUEST *request)
                            (client->ipaddr.af == AF_INET)) {
                                vp = radius_paircreate(request,
                                                       &request->reply->vps,
-                                                      FR2ATTR(167),
+                                                      167, VENDORPEC_FREERADIUS,
                                                       PW_TYPE_IPADDR);
                                if (vp) {
                                        vp->vp_ipaddr = client->ipaddr.ipaddr.ip4addr.s_addr;
@@ -462,7 +459,7 @@ void request_stats_reply(REQUEST *request)
                                if (client->prefix != 32) {
                                        vp = radius_paircreate(request,
                                                               &request->reply->vps,
-                                                              FR2ATTR(169),
+                                                              169, VENDORPEC_FREERADIUS,
                                                               PW_TYPE_INTEGER);
                                        if (vp) {
                                                vp->vp_integer = client->prefix;
@@ -505,11 +502,11 @@ void request_stats_reply(REQUEST *request)
                 *      See if we need to look up the server by socket
                 *      socket.
                 */
-               server_ip = pairfind(request->packet->vps, FR2ATTR(170));
+               server_ip = pairfind(request->packet->vps, 170, VENDORPEC_FREERADIUS);
                if (!server_ip) return;
 
                server_port = pairfind(request->packet->vps,
-                                      FR2ATTR(171));
+                                      171, VENDORPEC_FREERADIUS);
                if (!server_port) return;
                
                ipaddr.af = AF_INET;
@@ -542,6 +539,7 @@ void request_stats_reply(REQUEST *request)
 #endif
        }
 
+#ifdef WITH_PROXY
        /*
         *      Home servers.
         */
@@ -555,16 +553,17 @@ void request_stats_reply(REQUEST *request)
                 *      See if we need to look up the server by socket
                 *      socket.
                 */
-               server_ip = pairfind(request->packet->vps, FR2ATTR(170));
+               server_ip = pairfind(request->packet->vps, 170, VENDORPEC_FREERADIUS);
                if (!server_ip) return;
 
                server_port = pairfind(request->packet->vps,
-                                      FR2ATTR(171));
+                                      171, VENDORPEC_FREERADIUS);
                if (!server_port) return;
                
                ipaddr.af = AF_INET;
                ipaddr.ipaddr.ip4addr.s_addr = server_ip->vp_ipaddr;
-               home = home_server_find(&ipaddr, server_port->vp_integer);
+               home = home_server_find(&ipaddr, server_port->vp_integer,
+                                       IPPROTO_UDP);
 
                /*
                 *      Not found: don't do anything
@@ -577,17 +576,17 @@ void request_stats_reply(REQUEST *request)
                        paircopyvp(server_port));
 
                vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(172), PW_TYPE_INTEGER);
+                                      172, VENDORPEC_FREERADIUS, PW_TYPE_INTEGER);
                if (vp) vp->vp_integer = home->currently_outstanding;
 
                vp = radius_paircreate(request, &request->reply->vps,
-                                      FR2ATTR(173), PW_TYPE_INTEGER);
+                                      173, VENDORPEC_FREERADIUS, PW_TYPE_INTEGER);
                if (vp) vp->vp_integer = home->state;
 
                if ((home->state == HOME_STATE_ALIVE) &&
                    (home->revive_time.tv_sec != 0)) {
                        vp = radius_paircreate(request, &request->reply->vps,
-                                              FR2ATTR(175), PW_TYPE_DATE);
+                                              175, VENDORPEC_FREERADIUS, PW_TYPE_DATE);
                        if (vp) vp->vp_date = home->revive_time.tv_sec;
                }
 
@@ -595,17 +594,17 @@ void request_stats_reply(REQUEST *request)
                    (home->ema.window > 0)) {
                                vp = radius_paircreate(request,
                                                       &request->reply->vps,
-                                                      FR2ATTR(178),
+                                                      178, VENDORPEC_FREERADIUS,
                                                       PW_TYPE_INTEGER);
                                if (vp) vp->vp_integer = home->ema.window;
                                vp = radius_paircreate(request,
                                                       &request->reply->vps,
-                                                      FR2ATTR(179),
+                                                      179, VENDORPEC_FREERADIUS,
                                                       PW_TYPE_INTEGER);
                                if (vp) vp->vp_integer = home->ema.ema1 / EMA_SCALE;
                                vp = radius_paircreate(request,
                                                       &request->reply->vps,
-                                                      FR2ATTR(180),
+                                                      180, VENDORPEC_FREERADIUS,
                                                       PW_TYPE_INTEGER);
                                if (vp) vp->vp_integer = home->ema.ema10 / EMA_SCALE;
 
@@ -613,7 +612,7 @@ void request_stats_reply(REQUEST *request)
 
                if (home->state == HOME_STATE_IS_DEAD) {
                        vp = radius_paircreate(request, &request->reply->vps,
-                                              FR2ATTR(174), PW_TYPE_DATE);
+                                              174, VENDORPEC_FREERADIUS, PW_TYPE_DATE);
                        if (vp) vp->vp_date = home->zombie_period_start.tv_sec + home->zombie_period;
                }
 
@@ -631,6 +630,7 @@ void request_stats_reply(REQUEST *request)
                }
 #endif
        }
+#endif /* WITH_PROXY */
 }
 
 void radius_stats_init(int flag)