]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Reduce delay between Association Request and Association Response
authorJurijs Soloveckis <jsoloveckis@maxlinear.com>
Fri, 3 Nov 2023 08:14:24 +0000 (08:14 +0000)
committerJouni Malinen <j@w1.fi>
Fri, 3 Nov 2023 10:58:35 +0000 (12:58 +0200)
There is a delay between sending Association Response frame after having
received Association Request frame, due to the fact that between
receiving the request and sending the response the Beacon frame contents
is updated, after analyzing inputs from the STA. There may be several
updates if multiple fields need to change. This can cause issues with
some devices in noisy environments with many BSSs and connected STAs.

Optimize this by updating the beacon only once, even if there are
multiple reasons for updates.

Signed-off-by: Jurijs Soloveckis <jsoloveckis@maxlinear.com>
src/ap/ieee802_11.c
src/ap/ieee802_11.h
src/ap/ieee802_11_ht.c
wpa_supplicant/mesh_mpm.c

index 678925c7f837c8d4cca8adf43e2882d2aa5c4731..889348762717a184a75a8bc529ca75083ecf5dd5 100644 (file)
@@ -4437,7 +4437,8 @@ static void ieee80211_ml_process_link(struct hostapd_data *hapd,
        }
        hapd->sta_aid[(sta->aid - 1) / 32] |= BIT((sta->aid - 1) % 32);
        sta->listen_interval = origin_sta->listen_interval;
-       update_ht_state(hapd, sta);
+       if (update_ht_state(hapd, sta) > 0)
+               ieee802_11_update_beacons(hapd->iface);
 
        /* RSN Authenticator should always be the one on the original station */
        wpa_auth_sta_deinit(sta->wpa_sm);
@@ -5164,6 +5165,7 @@ static void handle_assoc(struct hostapd_data *hapd,
        int delay_assoc = 0;
 #endif /* CONFIG_FILS */
        int omit_rsnxe = 0;
+       bool set_beacon = false;
 
        if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_req) :
                                      sizeof(mgmt->u.assoc_req))) {
@@ -5405,7 +5407,7 @@ static void handle_assoc(struct hostapd_data *hapd,
                sta->nonerp_set = 1;
                hapd->iface->num_sta_non_erp++;
                if (hapd->iface->num_sta_non_erp == 1)
-                       ieee802_11_update_beacons(hapd->iface);
+                       set_beacon = true;
        }
 
        if (!(sta->capability & WLAN_CAPABILITY_SHORT_SLOT_TIME) &&
@@ -5416,7 +5418,7 @@ static void handle_assoc(struct hostapd_data *hapd,
                    hapd->iface->current_mode->mode ==
                    HOSTAPD_MODE_IEEE80211G &&
                    hapd->iface->num_sta_no_short_slot_time == 1)
-                       ieee802_11_update_beacons(hapd->iface);
+                       set_beacon = true;
        }
 
        if (sta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
@@ -5431,10 +5433,11 @@ static void handle_assoc(struct hostapd_data *hapd,
                if (hapd->iface->current_mode &&
                    hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
                    && hapd->iface->num_sta_no_short_preamble == 1)
-                       ieee802_11_update_beacons(hapd->iface);
+                       set_beacon = true;
        }
 
-       update_ht_state(hapd, sta);
+       if (update_ht_state(hapd, sta) > 0)
+               set_beacon = true;
 
        hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
                       HOSTAPD_LEVEL_DEBUG,
@@ -5473,6 +5476,9 @@ static void handle_assoc(struct hostapd_data *hapd,
        }
 #endif /* CONFIG_FILS */
 
+       if (set_beacon)
+               ieee802_11_set_beacons(hapd->iface);
+
  fail:
 
        /*
index 4e7d8fbe8e256378ca2eed56f1bab3975ff8988a..8ffce0bf5bfee04be9fe85598806d6b371463625 100644 (file)
@@ -100,7 +100,7 @@ u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta,
 u16 copy_sta_vendor_vht(struct hostapd_data *hapd, struct sta_info *sta,
                        const u8 *ie, size_t len);
 
-void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta);
+int update_ht_state(struct hostapd_data *hapd, struct sta_info *sta);
 void ht40_intolerant_add(struct hostapd_iface *iface, struct sta_info *sta);
 void ht40_intolerant_remove(struct hostapd_iface *iface, struct sta_info *sta);
 u16 copy_sta_vht_capab(struct hostapd_data *hapd, struct sta_info *sta,
index cf3867c86c2987ed7ce9d232850320c3435b9d0c..f90f1254e0408d3bccf529c8fb6aaaa722a96a61 100644 (file)
@@ -479,15 +479,14 @@ static void update_sta_no_ht(struct hostapd_data *hapd, struct sta_info *sta)
 }
 
 
-void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta)
+int update_ht_state(struct hostapd_data *hapd, struct sta_info *sta)
 {
        if ((sta->flags & WLAN_STA_HT) && sta->ht_capabilities)
                update_sta_ht(hapd, sta);
        else
                update_sta_no_ht(hapd, sta);
 
-       if (hostapd_ht_operation_update(hapd->iface) > 0)
-               ieee802_11_update_beacons(hapd->iface);
+       return hostapd_ht_operation_update(hapd->iface);
 }
 
 
index 77417ae6a4af63c6a45950ad18f94dec71f90a0a..138c013992b4ddf87cf2c1010badec7dc48d1fea 100644 (file)
@@ -16,6 +16,7 @@
 #include "ap/hostapd.h"
 #include "ap/sta_info.h"
 #include "ap/ieee802_11.h"
+#include "ap/beacon.h"
 #include "ap/wpa_auth.h"
 #include "wpa_supplicant_i.h"
 #include "driver_i.h"
@@ -769,7 +770,8 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s,
                set_disable_ht40(sta->ht_capabilities, 1);
        }
 
-       update_ht_state(data, sta);
+       if (update_ht_state(data, sta) > 0)
+               ieee802_11_update_beacons(data->iface);
 
 #ifdef CONFIG_IEEE80211AC
        copy_sta_vht_capab(data, sta, elems->vht_capabilities);