Add Event-Timestamp to all Accounting-Request packets
authorNick Lowe <nick.lowe@lugatech.com>
Sun, 24 Jan 2016 11:38:40 +0000 (11:38 +0000)
committerJouni Malinen <j@w1.fi>
Fri, 5 Feb 2016 23:24:59 +0000 (01:24 +0200)
Event-Timestamp should be sent for all Accounting-Request packets and
only after the system clock has a sane value, not where there's a value
close to the Unix time epoch.

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

index c4aea40..abf3cf1 100644 (file)
@@ -41,6 +41,7 @@ static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
        size_t len;
        int i;
        struct wpabuf *b;
+       struct os_time now;
 
        msg = radius_msg_new(RADIUS_CODE_ACCOUNTING_REQUEST,
                             radius_client_get_id(hapd->radius));
@@ -159,6 +160,14 @@ static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
                }
        }
 
+       os_get_time(&now);
+       if (now.sec > 1000000000 &&
+           !radius_msg_add_attr_int32(msg, RADIUS_ATTR_EVENT_TIMESTAMP,
+                                      now.sec)) {
+               wpa_printf(MSG_INFO, "Could not add Event-Timestamp");
+               goto fail;
+       }
+
        return msg;
 
  fail:
@@ -261,7 +270,6 @@ static void accounting_sta_report(struct hostapd_data *hapd,
        int cause = sta->acct_terminate_cause;
        struct hostap_sta_driver_data data;
        struct os_reltime now_r, diff;
-       struct os_time now;
        u32 gigawords;
 
        if (!hapd->conf->radius->acct_server)
@@ -276,7 +284,6 @@ static void accounting_sta_report(struct hostapd_data *hapd,
        }
 
        os_get_reltime(&now_r);
-       os_get_time(&now);
        os_reltime_sub(&now_r, &sta->acct_session_start, &diff);
        if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_SESSION_TIME,
                                       diff.sec)) {
@@ -333,12 +340,6 @@ static void accounting_sta_report(struct hostapd_data *hapd,
                }
        }
 
-       if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_EVENT_TIMESTAMP,
-                                      now.sec)) {
-               wpa_printf(MSG_INFO, "Could not add Event-Timestamp");
-               goto fail;
-       }
-
        if (eloop_terminated())
                cause = RADIUS_ACCT_TERMINATE_CAUSE_ADMIN_REBOOT;