Browse Source

RADIUS DAS: Support Chargeable-User-Identity with Disconnect-Request

Chargeable-User-Identity can now be used in Disconnect-Request to
identify the station to be disconnected.

Signed-hostap: Jouni Malinen <j@w1.fi>
Jouni Malinen 12 years ago
parent
commit
302fc0a3c7
3 changed files with 19 additions and 0 deletions
  1. 11 0
      src/ap/hostapd.c
  2. 6 0
      src/radius/radius_das.c
  3. 2 0
      src/radius/radius_das.h

+ 11 - 0
src/ap/hostapd.c

@@ -541,6 +541,17 @@ static struct sta_info * hostapd_das_find_sta(struct hostapd_data *hapd,
 		}
 	}
 
+	if (sta == NULL && attr->cui) {
+		for (sta = hapd->sta_list; sta; sta = sta->next) {
+			struct wpabuf *cui;
+			cui = ieee802_1x_get_radius_cui(sta->eapol_sm);
+			if (cui && wpabuf_len(cui) == attr->cui_len &&
+			    os_memcmp(wpabuf_head(cui), attr->cui,
+				      attr->cui_len) == 0)
+				break;
+		}
+	}
+
 	if (sta == NULL && attr->user_name) {
 		for (sta = hapd->sta_list; sta; sta = sta->next) {
 			u8 *identity;

+ 6 - 0
src/radius/radius_das.c

@@ -97,6 +97,12 @@ static struct radius_msg * radius_das_disconnect(struct radius_das_data *das,
 		attrs.acct_session_id_len = len;
 	}
 
+	if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_CHARGEABLE_USER_IDENTITY,
+				    &buf, &len, NULL) == 0) {
+		attrs.cui = buf;
+		attrs.cui_len = len;
+	}
+
 	res = das->disconnect(das->ctx, &attrs);
 	switch (res) {
 	case RADIUS_DAS_NAS_MISMATCH:

+ 2 - 0
src/radius/radius_das.h

@@ -23,6 +23,8 @@ struct radius_das_attrs {
 	size_t user_name_len;
 	const u8 *acct_session_id;
 	size_t acct_session_id_len;
+	const u8 *cui;
+	size_t cui_len;
 };
 
 struct radius_das_conf {