Add Acct-Session-Id to Accounting-On/Off
authorNick Lowe <nick.lowe@lugatech.com>
Mon, 25 Jan 2016 10:43:33 +0000 (10:43 +0000)
committerJouni Malinen <j@w1.fi>
Sat, 6 Feb 2016 15:11:01 +0000 (17:11 +0200)
An Acct-Session-Id is required on Accounting-On and Accounting-Off forms
of Accounting-Request.

Signed-off-by: Nick Lowe <nick.lowe@lugatech.com>
src/ap/accounting.c
src/ap/hostapd.h

index 962a869..87ab5f9 100644 (file)
@@ -448,6 +448,16 @@ static void accounting_report_state(struct hostapd_data *hapd, int on)
        if (!msg)
                return;
 
+       if (hapd->acct_session_id) {
+               char buf[20];
+
+               os_snprintf(buf, sizeof(buf), "%016lX",
+                           (long unsigned int) hapd->acct_session_id);
+               if (!radius_msg_add_attr(msg, RADIUS_ATTR_ACCT_SESSION_ID,
+                                        (u8 *) buf, os_strlen(buf)))
+                       wpa_printf(MSG_ERROR, "Could not add Acct-Session-Id");
+       }
+
        if (radius_client_send(hapd->radius, msg, RADIUS_ACCT, NULL) < 0)
                radius_msg_free(msg);
 }
@@ -460,6 +470,15 @@ static void accounting_report_state(struct hostapd_data *hapd, int on)
  */
 int accounting_init(struct hostapd_data *hapd)
 {
+       /*
+        * Acct-Session-Id should be globally and temporarily unique.
+        * A high quality random number is required therefore.
+        * This could be be improved by switching to a GUID.
+        */
+       if (os_get_random((u8 *) &hapd->acct_session_id,
+                         sizeof(hapd->acct_session_id)) < 0)
+               return -1;
+
        if (radius_client_register(hapd->radius, RADIUS_ACCT,
                                   accounting_receive, hapd))
                return -1;
index 72f8252..b3d702e 100644 (file)
@@ -138,6 +138,7 @@ struct hostapd_data {
        void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */
 
        struct radius_client_data *radius;
+       u64 acct_session_id;
        struct radius_das_data *radius_das;
 
        struct iapp_data *iapp;