nl80211: Make use of driver's capability to detect inactive stations
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Tue, 27 Mar 2012 17:45:23 +0000 (20:45 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 27 Mar 2012 17:49:44 +0000 (20:49 +0300)
When drivers advertise their capability to free up inactive
stations based on ap_max_inactivity, send the inactivity period
timeout to driver in NL80211_ATTR_INACTIVITY_TIMEOUT. This
introduces a WPA_DRIVER_FLAGS (WPA_DRIVER_FLAGS_INACTIVITY_TIMER)
so that the inactivity period will be sent only when this capability
bit is set.

Signed-hostap: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>

src/ap/beacon.c
src/drivers/driver.h
src/drivers/driver_nl80211.c

index 4ea8684..5efa4cd 100644 (file)
@@ -682,6 +682,7 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
            !is_zero_ether_addr(hapd->conf->hessid))
                params.hessid = hapd->conf->hessid;
        params.access_network_type = hapd->conf->access_network_type;
+       params.ap_max_inactivity = hapd->conf->ap_max_inactivity;
        if (hostapd_drv_set_ap(hapd, &params))
                wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
        hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);
index 04aedcf..6eb0421 100644 (file)
@@ -707,6 +707,13 @@ struct wpa_driver_ap_params {
         * enabled.
         */
        u8 access_network_type;
+
+       /**
+        * ap_max_inactivity - Timeout in seconds to detect STA's inactivity
+        *
+        * This is used by driver which advertises this capability.
+        */
+       int ap_max_inactivity;
 };
 
 /**
@@ -790,6 +797,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD            0x00200000
 /* Driver supports U-APSD in AP mode */
 #define WPA_DRIVER_FLAGS_AP_UAPSD                      0x00400000
+/* Driver supports inactivity timer in AP mode */
+#define WPA_DRIVER_FLAGS_INACTIVITY_TIMER              0x00800000
        unsigned int flags;
 
        int max_scan_ssids;
index 74865f3..94fbca1 100644 (file)
@@ -2512,6 +2512,9 @@ broken_combination:
 
                if (flags & NL80211_FEATURE_SK_TX_STATUS)
                        info->data_tx_status = 1;
+
+               if (flags & NL80211_FEATURE_INACTIVITY_TIMER)
+                       capa->flags |= WPA_DRIVER_FLAGS_INACTIVITY_TIMER;
        }
 
        if (tb[NL80211_ATTR_PROBE_RESP_OFFLOAD]) {
@@ -5415,6 +5418,11 @@ static int wpa_driver_nl80211_set_ap(void *priv,
                        wpabuf_head(params->assocresp_ies));
        }
 
+       if (drv->capa.flags & WPA_DRIVER_FLAGS_INACTIVITY_TIMER)  {
+               NLA_PUT_U16(msg, NL80211_ATTR_INACTIVITY_TIMEOUT,
+                           params->ap_max_inactivity);
+       }
+
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
        if (ret) {
                wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",