From ace5b9f653047e5ca92bf41a5e8706246eaff346 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Jan 2010 02:26:00 +0000 Subject: hostapd: upgrade to latest git version, add patches to fix multi-bss support with a single hostapd instance git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19234 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../hostapd/patches/160-sta_roam_between_bss.patch | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 package/hostapd/patches/160-sta_roam_between_bss.patch (limited to 'package/hostapd/patches/160-sta_roam_between_bss.patch') diff --git a/package/hostapd/patches/160-sta_roam_between_bss.patch b/package/hostapd/patches/160-sta_roam_between_bss.patch new file mode 100644 index 0000000000..dfd5fd88c8 --- /dev/null +++ b/package/hostapd/patches/160-sta_roam_between_bss.patch @@ -0,0 +1,79 @@ +--- a/src/ap/sta_info.c ++++ b/src/ap/sta_info.c +@@ -32,8 +32,8 @@ + #include "vlan_init.h" + #include "sta_info.h" + +-static int ap_sta_in_other_bss(struct hostapd_data *hapd, +- struct sta_info *sta, u32 flags); ++static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd, ++ struct sta_info *sta); + static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx); + #ifdef CONFIG_IEEE80211W + static void ap_sa_query_timer(void *eloop_ctx, void *timeout_ctx); +@@ -123,8 +123,8 @@ void ap_free_sta(struct hostapd_data *ha + + if (sta->flags & WLAN_STA_WDS) + hapd->drv.set_wds_sta(hapd, sta->addr, sta->aid, 0); +- if (!ap_sta_in_other_bss(hapd, sta, WLAN_STA_ASSOC) && +- !(sta->flags & WLAN_STA_PREAUTH)) ++ ++ if (!(sta->flags & WLAN_STA_PREAUTH)) + hapd->drv.sta_remove(hapd, sta->addr); + + ap_sta_hash_del(hapd, sta); +@@ -451,6 +451,7 @@ struct sta_info * ap_sta_add(struct host + hapd->num_sta++; + ap_sta_hash_add(hapd, sta); + sta->ssid = &hapd->conf->ssid; ++ ap_sta_remove_in_other_bss(hapd, sta); + + return sta; + } +@@ -472,8 +473,8 @@ static int ap_sta_remove(struct hostapd_ + } + + +-static int ap_sta_in_other_bss(struct hostapd_data *hapd, +- struct sta_info *sta, u32 flags) ++static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd, ++ struct sta_info *sta) + { + struct hostapd_iface *iface = hapd->iface; + size_t i; +@@ -488,11 +489,11 @@ static int ap_sta_in_other_bss(struct ho + if (bss == hapd || bss == NULL) + continue; + sta2 = ap_get_sta(bss, sta->addr); +- if (sta2 && ((sta2->flags & flags) == flags)) +- return 1; +- } ++ if (!sta2) ++ continue; + +- return 0; ++ ap_sta_disconnect(bss, sta2, sta2->addr, WLAN_REASON_DEAUTH_LEAVING); ++ } + } + + +@@ -502,8 +503,7 @@ void ap_sta_disassociate(struct hostapd_ + wpa_printf(MSG_DEBUG, "%s: disassociate STA " MACSTR, + hapd->conf->iface, MAC2STR(sta->addr)); + sta->flags &= ~WLAN_STA_ASSOC; +- if (!ap_sta_in_other_bss(hapd, sta, WLAN_STA_ASSOC)) +- ap_sta_remove(hapd, sta); ++ ap_sta_remove(hapd, sta); + sta->timeout_next = STA_DEAUTH; + eloop_cancel_timeout(ap_handle_timer, hapd, sta); + eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DISASSOC, 0, +@@ -521,8 +521,7 @@ void ap_sta_deauthenticate(struct hostap + wpa_printf(MSG_DEBUG, "%s: deauthenticate STA " MACSTR, + hapd->conf->iface, MAC2STR(sta->addr)); + sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC); +- if (!ap_sta_in_other_bss(hapd, sta, WLAN_STA_ASSOC)) +- ap_sta_remove(hapd, sta); ++ ap_sta_remove(hapd, sta); + sta->timeout_next = STA_REMOVE; + eloop_cancel_timeout(ap_handle_timer, hapd, sta); + eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DEAUTH, 0, -- cgit v1.2.3