Patchwork hostapd: Return code-17 on max-station limitation.

login
register
mail settings
Submitter Ben Greear
Date April 5, 2013, 10:59 p.m.
Message ID <1365202781-29759-1-git-send-email-greearb@candelatech.com>
Download mbox | patch
Permalink /patch/234294/
State Superseded
Headers show

Comments

Ben Greear - April 5, 2013, 10:59 p.m.
From: Ben Greear <greearb@candelatech.com>

I believe this is a more valid response code.

Signed-hostap: Ben Greear <greearb@candelatech.com>
---
 hostapd/ctrl_iface.c   |    3 ++-
 src/ap/drv_callbacks.c |    9 +++++----
 src/ap/gas_serv.c      |    3 ++-
 src/ap/ieee802_11.c    |    3 +--
 src/ap/preauth_auth.c  |    3 ++-
 src/ap/sta_info.c      |    5 ++++-
 src/ap/sta_info.h      |    4 +++-
 src/ap/wpa_auth_glue.c |    3 ++-
 8 files changed, 21 insertions(+), 12 deletions(-)
Ben Greear - April 6, 2013, 3:54 p.m.
On 04/05/2013 03:59 PM, greearb@candelatech.com wrote:
> From: Ben Greear <greearb@candelatech.com>
>
> I believe this is a more valid response code.

There were a few bugs in this one (passing by value instead
of by address), so I'll post a corrected version soon.


> @@ -132,6 +132,7 @@ static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
>   {
>   	u8 addr[ETH_ALEN];
>   	struct sta_info *sta;
> +	u16 resp;
>
>   	wpa_printf(MSG_DEBUG, "CTRL_IFACE NEW_STA %s", txtaddr);
>
> @@ -144,7 +145,7 @@ static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
>
>   	wpa_printf(MSG_DEBUG, "Add new STA " MACSTR " based on ctrl_iface "
>   		   "notification", MAC2STR(addr));
> -	sta = ap_sta_add(hapd, addr);
> +	sta = ap_sta_add(hapd, addr, resp);
>   	if (sta == NULL)
>   		return -1;

> @@ -454,11 +454,12 @@ hostapd_wpa_auth_add_sta(void *ctx, const u8 *sta_addr)
>   {
>   	struct hostapd_data *hapd = ctx;
>   	struct sta_info *sta;
> +	u16 resp;
>
>   	if (hostapd_add_sta_node(hapd, sta_addr, WLAN_AUTH_FT) < 0)
>   		return NULL;
>
> -	sta = ap_sta_add(hapd, sta_addr);
> +	sta = ap_sta_add(hapd, sta_addr, resp);
>   	if (sta == NULL)
>   		return NULL;
>   	if (sta->wpa_sm) {
>


Thanks,
Ben

Patch

diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index 2153329..bf3984f 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -132,6 +132,7 @@  static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
 {
 	u8 addr[ETH_ALEN];
 	struct sta_info *sta;
+	u16 resp;
 
 	wpa_printf(MSG_DEBUG, "CTRL_IFACE NEW_STA %s", txtaddr);
 
@@ -144,7 +145,7 @@  static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
 
 	wpa_printf(MSG_DEBUG, "Add new STA " MACSTR " based on ctrl_iface "
 		   "notification", MAC2STR(addr));
-	sta = ap_sta_add(hapd, addr);
+	sta = ap_sta_add(hapd, addr, resp);
 	if (sta == NULL)
 		return -1;
 
diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 6d22d49..a625f25 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -93,7 +93,8 @@  int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
 		 */
 		sta->timeout_next = STA_NULLFUNC;
 	} else {
-		sta = ap_sta_add(hapd, addr);
+		u16 resp;
+		sta = ap_sta_add(hapd, addr, &resp);
 		if (sta == NULL) {
 			hostapd_drv_sta_disassoc(hapd, addr,
 						 WLAN_REASON_DISASSOC_AP_BUSY);
@@ -467,9 +468,8 @@  static void hostapd_notif_auth(struct hostapd_data *hapd,
 
 	sta = ap_get_sta(hapd, rx_auth->peer);
 	if (!sta) {
-		sta = ap_sta_add(hapd, rx_auth->peer);
+		sta = ap_sta_add(hapd, rx_auth->peer, &status);
 		if (sta == NULL) {
-			status = WLAN_STATUS_UNSPECIFIED_FAILURE;
 			goto fail;
 		}
 	}
@@ -675,13 +675,14 @@  static void hostapd_mgmt_tx_cb(struct hostapd_data *hapd, const u8 *buf,
 
 static int hostapd_event_new_sta(struct hostapd_data *hapd, const u8 *addr)
 {
+	u16 resp;
 	struct sta_info *sta = ap_get_sta(hapd, addr);
 	if (sta)
 		return 0;
 
 	wpa_printf(MSG_DEBUG, "Data frame from unknown STA " MACSTR
 		   " - adding a new STA", MAC2STR(addr));
-	sta = ap_sta_add(hapd, addr);
+	sta = ap_sta_add(hapd, addr, &resp);
 	if (sta) {
 		hostapd_new_assoc_sta(hapd, sta, 0);
 	} else {
diff --git a/src/ap/gas_serv.c b/src/ap/gas_serv.c
index b3574ba..6e3479e 100644
--- a/src/ap/gas_serv.c
+++ b/src/ap/gas_serv.c
@@ -28,13 +28,14 @@  gas_dialog_create(struct hostapd_data *hapd, const u8 *addr, u8 dialog_token)
 
 	sta = ap_get_sta(hapd, addr);
 	if (!sta) {
+		u16 resp;
 		/*
 		 * We need a STA entry to be able to maintain state for
 		 * the GAS query.
 		 */
 		wpa_printf(MSG_DEBUG, "ANQP: Add a temporary STA entry for "
 			   "GAS query");
-		sta = ap_sta_add(hapd, addr);
+		sta = ap_sta_add(hapd, addr, &resp);
 		if (!sta) {
 			wpa_printf(MSG_DEBUG, "Failed to add STA " MACSTR
 				   " for GAS query", MAC2STR(addr));
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 8baa15e..36b7f86 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -633,9 +633,8 @@  static void handle_auth(struct hostapd_data *hapd,
 		return;
 	}
 
-	sta = ap_sta_add(hapd, mgmt->sa);
+	sta = ap_sta_add(hapd, mgmt->sa, &resp);
 	if (!sta) {
-		resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
 		goto fail;
 	}
 
diff --git a/src/ap/preauth_auth.c b/src/ap/preauth_auth.c
index 3e0c800..28cd867 100644
--- a/src/ap/preauth_auth.c
+++ b/src/ap/preauth_auth.c
@@ -71,7 +71,8 @@  static void rsn_preauth_receive(void *ctx, const u8 *src_addr,
 		return;
 	}
 	if (!sta && hdr->type == IEEE802_1X_TYPE_EAPOL_START) {
-		sta = ap_sta_add(hapd, ethhdr->h_source);
+		u16 resp;
+		sta = ap_sta_add(hapd, ethhdr->h_source, &resp);
 		if (sta == NULL)
 			return;
 		sta->flags = WLAN_STA_PREAUTH;
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index cbafb47..a8e4e56 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -477,7 +477,8 @@  void ap_sta_no_session_timeout(struct hostapd_data *hapd, struct sta_info *sta)
 }
 
 
-struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
+struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr,
+			     u16* resp)
 {
 	struct sta_info *sta;
 
@@ -490,12 +491,14 @@  struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
 		/* FIX: might try to remove some old STAs first? */
 		wpa_printf(MSG_DEBUG, "no more room for new STAs (%d/%d)",
 			   hapd->num_sta, hapd->conf->max_num_sta);
+		*resp = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
 		return NULL;
 	}
 
 	sta = os_zalloc(sizeof(struct sta_info));
 	if (sta == NULL) {
 		wpa_printf(MSG_ERROR, "malloc failed");
+		*resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
 		return NULL;
 	}
 	sta->acct_interim_interval = hapd->conf->acct_interim_interval;
diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h
index 32ea46e..cd9c261 100644
--- a/src/ap/sta_info.h
+++ b/src/ap/sta_info.h
@@ -163,7 +163,9 @@  void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta,
 			    u32 session_timeout);
 void ap_sta_no_session_timeout(struct hostapd_data *hapd,
 			       struct sta_info *sta);
-struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr);
+/* If failure (NULL is returned), *resp will contain the error code. */
+struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr,
+			     u16* resp);
 void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
 			 u16 reason);
 void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
diff --git a/src/ap/wpa_auth_glue.c b/src/ap/wpa_auth_glue.c
index fdaaaff..b8ab1bd 100644
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -454,11 +454,12 @@  hostapd_wpa_auth_add_sta(void *ctx, const u8 *sta_addr)
 {
 	struct hostapd_data *hapd = ctx;
 	struct sta_info *sta;
+	u16 resp;
 
 	if (hostapd_add_sta_node(hapd, sta_addr, WLAN_AUTH_FT) < 0)
 		return NULL;
 
-	sta = ap_sta_add(hapd, sta_addr);
+	sta = ap_sta_add(hapd, sta_addr, resp);
 	if (sta == NULL)
 		return NULL;
 	if (sta->wpa_sm) {