[PATCH 1/3] AP: consider uapsd support

Eliad Peller eliad
Wed Aug 31 03:30:28 PDT 2011


Check whether the driver advertises support for uapsd
in ap mode, and evaluate wmm_uapsd only in this case.

Signed-off-by: Eliad Peller <eliad at wizery.com>
---
(need to sync nl80211_copy.h first)

 src/ap/wmm.c                 |    3 ++-
 src/drivers/driver.h         |    2 ++
 src/drivers/driver_nl80211.c |    6 ++++++
 3 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/src/ap/wmm.c b/src/ap/wmm.c
index a6d9b89..9bdf5dc 100644
--- a/src/ap/wmm.c
+++ b/src/ap/wmm.c
@@ -72,7 +72,8 @@ u8 * hostapd_eid_wmm(struct hostapd_data *hapd, u8 *eid)
 	wmm->version = WMM_VERSION;
 	wmm->qos_info = hapd->parameter_set_count & 0xf;
 
-	if (hapd->conf->wmm_uapsd)
+	if (hapd->conf->wmm_uapsd &&
+	    (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD))
 		wmm->qos_info |= 0x80;
 
 	wmm->reserved = 0;
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 67c5631..54e2ef3 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -675,6 +675,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_EAPOL_TX_STATUS		0x00010000
 /* Driver indicates TX status events for Deauth/Disassoc frames */
 #define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS		0x00020000
+/* Driver supports uapsd in ap mode */
+#define WPA_DRIVER_FLAGS_AP_UAPSD			0x00040000
 	unsigned int flags;
 
 	int max_scan_ssids;
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 233cdb2..b0eaac5 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -1638,6 +1638,7 @@ struct wiphy_info_data {
 	int auth_supported;
 	int connect_supported;
 	int offchan_tx_supported;
+	int ap_uapsd_supported;
 	int max_remain_on_chan;
 };
 
@@ -1694,6 +1695,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
 	if (tb[NL80211_ATTR_OFFCHANNEL_TX_OK])
 		info->offchan_tx_supported = 1;
 
+	if (tb[NL80211_ATTR_SUPPORT_AP_UAPSD])
+		info->ap_uapsd_supported = 1;
+
 	if (tb[NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION])
 		info->max_remain_on_chan =
 			nla_get_u32(tb[NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION]);
@@ -1771,6 +1775,8 @@ static int wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
 	drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE;
 	if (info.p2p_supported)
 		drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE;
+	if (info.ap_uapsd_supported)
+		drv->capa.flags |= WPA_DRIVER_FLAGS_AP_UAPSD;
 	drv->capa.flags |= WPA_DRIVER_FLAGS_EAPOL_TX_STATUS;
 	drv->capa.flags |= WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS;
 	drv->capa.max_remain_on_chan = info.max_remain_on_chan;
-- 
1.7.0.4




More information about the Hostap mailing list