| --- a/hostapd/config_file.c |
| +++ b/hostapd/config_file.c |
| @@ -2848,6 +2848,14 @@ static int hostapd_config_fill(struct ho |
| line, bss->max_num_sta, MAX_STA_COUNT); |
| return 1; |
| } |
| + } else if (os_strcmp(buf, "iface_max_num_sta") == 0) { |
| + conf->max_num_sta = atoi(pos); |
| + if (conf->max_num_sta < 0 || |
| + conf->max_num_sta > MAX_STA_COUNT) { |
| + wpa_printf(MSG_ERROR, "Line %d: Invalid max_num_sta=%d; allowed range 0..%d", |
| + line, conf->max_num_sta, MAX_STA_COUNT); |
| + return 1; |
| + } |
| } else if (os_strcmp(buf, "wpa") == 0) { |
| bss->wpa = atoi(pos); |
| } else if (os_strcmp(buf, "extended_key_id") == 0) { |
| --- a/src/ap/hostapd.h |
| +++ b/src/ap/hostapd.h |
| @@ -742,6 +742,7 @@ void hostapd_cleanup_cs_params(struct ho |
| void hostapd_periodic_iface(struct hostapd_iface *iface); |
| int hostapd_owe_trans_get_info(struct hostapd_data *hapd); |
| void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); |
| +int hostapd_check_max_sta(struct hostapd_data *hapd); |
| |
| void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap); |
| void hostapd_cleanup_cca_params(struct hostapd_data *hapd); |
| --- a/src/ap/hostapd.c |
| +++ b/src/ap/hostapd.c |
| @@ -244,6 +244,29 @@ static int hostapd_iface_conf_changed(st |
| return 0; |
| } |
| |
| +static inline int hostapd_iface_num_sta(struct hostapd_iface *iface) |
| +{ |
| + int num_sta = 0; |
| + int i; |
| + |
| + for (i = 0; i < iface->num_bss; i++) |
| + num_sta += iface->bss[i]->num_sta; |
| + |
| + return num_sta; |
| +} |
| + |
| + |
| +int hostapd_check_max_sta(struct hostapd_data *hapd) |
| +{ |
| + if (hapd->num_sta >= hapd->conf->max_num_sta) |
| + return 1; |
| + |
| + if (hapd->iconf->max_num_sta && |
| + hostapd_iface_num_sta(hapd->iface) >= hapd->iconf->max_num_sta) |
| + return 1; |
| + |
| + return 0; |
| +} |
| |
| int hostapd_reload_config(struct hostapd_iface *iface) |
| { |
| --- a/src/ap/beacon.c |
| +++ b/src/ap/beacon.c |
| @@ -1252,7 +1252,7 @@ void handle_probe_req(struct hostapd_dat |
| if (hapd->conf->no_probe_resp_if_max_sta && |
| is_multicast_ether_addr(mgmt->da) && |
| is_multicast_ether_addr(mgmt->bssid) && |
| - hapd->num_sta >= hapd->conf->max_num_sta && |
| + hostapd_check_max_sta(hapd) && |
| !ap_get_sta(hapd, mgmt->sa)) { |
| wpa_printf(MSG_MSGDUMP, "%s: Ignore Probe Request from " MACSTR |
| " since no room for additional STA", |
| --- a/src/ap/ap_config.h |
| +++ b/src/ap/ap_config.h |
| @@ -1039,6 +1039,8 @@ struct hostapd_config { |
| unsigned int track_sta_max_num; |
| unsigned int track_sta_max_age; |
| |
| + int max_num_sta; |
| + |
| char country[3]; /* first two octets: country code as described in |
| * ISO/IEC 3166-1. Third octet: |
| * ' ' (ascii 32): all environments |