From 8b2486115479582b2ab164a4508f22ed23a9a4cb Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 18 Dec 2012 18:13:31 +0200 Subject: [PATCH] Add Acct-Session-Id into Access-Request messages This optional attribute may make it easier to bind together the Access-Request and Accounting-Request messages. The accounting session identifier is now generated when the STA associates instead of waiting for the actual session to start after successfull authentication. Signed-hostap: Jouni Malinen --- src/ap/accounting.c | 5 +---- src/ap/accounting.h | 6 ++++++ src/ap/ieee802_1x.c | 10 ++++++++++ src/ap/sta_info.c | 1 + 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/ap/accounting.c b/src/ap/accounting.c index 7563b52e1..954053131 100644 --- a/src/ap/accounting.c +++ b/src/ap/accounting.c @@ -26,8 +26,6 @@ * input/output octets and updates Acct-{Input,Output}-Gigawords. */ #define ACCT_DEFAULT_UPDATE_INTERVAL 300 -static void accounting_sta_get_id(struct hostapd_data *hapd, - struct sta_info *sta); static void accounting_sta_interim(struct hostapd_data *hapd, struct sta_info *sta); @@ -210,7 +208,6 @@ void accounting_sta_start(struct hostapd_data *hapd, struct sta_info *sta) if (sta->acct_session_started) return; - accounting_sta_get_id(hapd, sta); hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS, HOSTAPD_LEVEL_INFO, "starting accounting session %08X-%08X", @@ -377,7 +374,7 @@ void accounting_sta_stop(struct hostapd_data *hapd, struct sta_info *sta) } -static void accounting_sta_get_id(struct hostapd_data *hapd, +void accounting_sta_get_id(struct hostapd_data *hapd, struct sta_info *sta) { sta->acct_session_id_lo = hapd->acct_session_id_lo++; diff --git a/src/ap/accounting.h b/src/ap/accounting.h index 9d13d011c..dcc54ee94 100644 --- a/src/ap/accounting.h +++ b/src/ap/accounting.h @@ -10,6 +10,11 @@ #define ACCOUNTING_H #ifdef CONFIG_NO_ACCOUNTING +static inline void accounting_sta_get_id(struct hostapd_data *hapd, + struct sta_info *sta) +{ +} + static inline void accounting_sta_start(struct hostapd_data *hapd, struct sta_info *sta) { @@ -29,6 +34,7 @@ static inline void accounting_deinit(struct hostapd_data *hapd) { } #else /* CONFIG_NO_ACCOUNTING */ +void accounting_sta_get_id(struct hostapd_data *hapd, struct sta_info *sta); void accounting_sta_start(struct hostapd_data *hapd, struct sta_info *sta); void accounting_sta_stop(struct hostapd_data *hapd, struct sta_info *sta); int accounting_init(struct hostapd_data *hapd); diff --git a/src/ap/ieee802_1x.c b/src/ap/ieee802_1x.c index 5b011201c..3098d74ba 100644 --- a/src/ap/ieee802_1x.c +++ b/src/ap/ieee802_1x.c @@ -454,6 +454,16 @@ static int add_common_radius_sta_attr(struct hostapd_data *hapd, return -1; } + if (sta->acct_session_id_hi || sta->acct_session_id_lo) { + os_snprintf(buf, sizeof(buf), "%08X-%08X", + sta->acct_session_id_hi, sta->acct_session_id_lo); + 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"); + return -1; + } + } + return 0; } diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c index 6bc43d2d5..97cd0136b 100644 --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c @@ -493,6 +493,7 @@ struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr) return NULL; } sta->acct_interim_interval = hapd->conf->acct_interim_interval; + accounting_sta_get_id(hapd, sta); /* initialize STA info data */ wpa_printf(MSG_DEBUG, "%s: register ap_handle_timer timeout "