]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Avoid excessive probe response retries
authorHelmut Schaa <helmut.schaa@googlemail.com>
Sat, 19 Nov 2011 17:09:49 +0000 (19:09 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 19 Nov 2011 17:09:49 +0000 (19:09 +0200)
Some client implementations only wait a few ms after sending a probe
request while scanning. Since probe responses are always sent at a low
rate this can eat quite some airtime and it might be impossible to get
the frame out before the client leaves the channel again. If the client
leaves before all probe reponses where acked this can cause the probe
reponse to be retried quite often consuming even more airtime.

Hence, add a new noack flag to the driver's send_mlme callback that
allows hostapd to request whether the driver should expect an ACK for
this frame or not.

Use the new noack-policy only for broadcast probe requests that contain
a wildcard SSID.

Signed-hostap: Helmut Schaa <helmut.schaa@googlemail.com>

src/ap/beacon.c

index 626783123bb09c8a25a0e7b4c884bc61a9456e6a..c9bbfa93bc818d9a8ca585ca18fec097277cbb9b 100644 (file)
@@ -198,6 +198,7 @@ void handle_probe_req(struct hostapd_data *hapd,
        struct sta_info *sta = NULL;
        size_t buflen;
        size_t i;
+       int noack;
 
        ie = mgmt->u.probe_req.variable;
        if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req))
@@ -407,7 +408,13 @@ void handle_probe_req(struct hostapd_data *hapd,
                pos = hostapd_eid_p2p_manage(hapd, pos);
 #endif /* CONFIG_P2P_MANAGER */
 
-       if (hostapd_drv_send_mlme(hapd, resp, pos - (u8 *) resp, 0) < 0)
+       /*
+        * If this is a broadcast probe request, apply no ack policy to avoid
+        * excessive retries.
+        */
+       noack = !!(elems.ssid_len == 0 && is_broadcast_ether_addr(mgmt->da));
+
+       if (hostapd_drv_send_mlme(hapd, resp, pos - (u8 *) resp, noack) < 0)
                perror("handle_probe_req: send");
 
        os_free(resp);