Accounting Bugs

Gunter Burchardt gbur at informatik.uni-rostock.de
Thu Jan 29 07:02:14 EST 2004


Hello,

The third patch for today is for accouting. There are several bugs
sending accouting information sent to a radius accouting server in
hostapd.

1. Accouting-Reguests with Status-Type=Start were send more than one
times during one session. (Reauth of a station)

2. Accouting-Requests with Status-Type=Stop were send with wrong
connection data in some cases, for example if a station disassociates.
When a idle timeout accurs everything works fine. 

3. Accouting-Stop will send without a previous start packed. assoc ->
auth failed -> disassoc

I wrote a patch which correct all the things. This patch is for the cvs
version 0.2.0. It would be nice if somebody could commit it and/or give
me write access to the cvs :).

regard
gunter
-------------- next part --------------
diff -urN hostap-0.2.0.old/hostapd/accounting.c hostap-0.2.0/hostapd/accounting.c
--- hostap-0.2.0.old/hostapd/accounting.c	2003-11-09 06:14:06.000000000 +0100
+++ hostap-0.2.0/hostapd/accounting.c	2004-01-29 12:32:03.000000000 +0100
@@ -149,20 +149,27 @@
 void accounting_sta_start(hostapd *hapd, struct sta_info *sta)
 {
 	struct radius_msg *msg;
+	
+	/* don't start a session already started */
+	if(sta->session_started == 0)
+	{
+		time(&sta->acct_session_start);
 
-	time(&sta->acct_session_start);
+		if (!hapd->conf->acct_server)
+			return;
 
-	if (!hapd->conf->acct_server)
-		return;
+		if (sta->acct_interim_interval) {
+			eloop_register_timeout(sta->acct_interim_interval, 0,
+					       accounting_interim_update, hapd, sta);
+		}
 
-	if (sta->acct_interim_interval) {
-		eloop_register_timeout(sta->acct_interim_interval, 0,
-				       accounting_interim_update, hapd, sta);
-	}
+		msg = accounting_msg(hapd, sta, RADIUS_ACCT_STATUS_TYPE_START);
+		if (msg)
+			radius_client_send(hapd, msg, RADIUS_ACCT);
 
-	msg = accounting_msg(hapd, sta, RADIUS_ACCT_STATUS_TYPE_START);
-	if (msg)
-		radius_client_send(hapd, msg, RADIUS_ACCT);
+		/* mark session as started */
+		sta->session_started = 1;
+	}
 }
 
 
@@ -237,14 +244,20 @@
 
 void accounting_sta_interim(hostapd *hapd, struct sta_info *sta)
 {
-	accounting_sta_report(hapd, sta, 0);
+        if(sta->session_started)
+        {
+		accounting_sta_report(hapd, sta, 0);
+	}
 }
 
 
 void accounting_sta_stop(hostapd *hapd, struct sta_info *sta)
 {
-	accounting_sta_report(hapd, sta, 1);
-	eloop_cancel_timeout(accounting_interim_update, hapd, sta);
+        if(sta->session_started)
+        {
+		accounting_sta_report(hapd, sta, 1);
+		eloop_cancel_timeout(accounting_interim_update, hapd, sta);
+	}
 }
 
 
diff -urN hostap-0.2.0.old/hostapd/ap.h hostap-0.2.0/hostapd/ap.h
--- hostap-0.2.0.old/hostapd/ap.h	2003-11-09 06:14:06.000000000 +0100
+++ hostap-0.2.0/hostapd/ap.h	2004-01-29 12:31:54.000000000 +0100
@@ -58,6 +58,7 @@
 
 	u32 acct_session_id_lo;
 	time_t acct_session_start;
+	int session_started;
 	int acct_terminate_cause; /* Acct-Terminate-Cause */
 	int acct_interim_interval; /* Acct-Interim-Interval */
 
diff -urN hostap-0.2.0.old/hostapd/ieee802_11.c hostap-0.2.0/hostapd/ieee802_11.c
--- hostap-0.2.0.old/hostapd/ieee802_11.c	2003-11-30 03:43:55.000000000 +0100
+++ hostap-0.2.0/hostapd/ieee802_11.c	2004-01-29 12:31:39.000000000 +0100
@@ -785,8 +785,8 @@
 		       HOSTAPD_LEVEL_INFO, "disassociated");
 	sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
 	ieee802_1x_set_port_enabled(hapd, sta, 0);
-	ieee802_1x_free_station(sta);
-	remove_sta(hapd, sta);
+//	ieee802_1x_free_station(sta);
+	ap_free_sta(hapd, sta);
 }
 
 
@@ -829,8 +829,8 @@
 		       HOSTAPD_LEVEL_DEBUG, "deauthenticated");
 	sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
 	ieee802_1x_set_port_enabled(hapd, sta, 0);
-	ieee802_1x_free_station(sta);
-	remove_sta(hapd, sta);
+//	ieee802_1x_free_station(sta);
+	ap_free_sta(hapd, sta);
 }
 
 
diff -urN hostap-0.2.0.old/hostapd/sta_info.c hostap-0.2.0/hostapd/sta_info.c
--- hostap-0.2.0.old/hostapd/sta_info.c	2003-09-28 19:25:45.000000000 +0200
+++ hostap-0.2.0/hostapd/sta_info.c	2004-01-29 12:31:39.000000000 +0100
@@ -243,7 +243,7 @@
 	case STA_DISASSOC:
 		sta->flags &= ~WLAN_STA_ASSOC;
 		ieee802_1x_set_port_enabled(hapd, sta, 0);
-		ieee802_1x_free_station(sta);
+//		ieee802_1x_free_station(sta);
 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
 			       HOSTAPD_LEVEL_INFO, "disassociated due to "
 			       "inactivity");


More information about the HostAP mailing list