aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSunil Dutt <usdutt@qti.qualcomm.com>2016-01-14 12:55:57 (GMT)
committerJouni Malinen <j@w1.fi>2016-06-17 17:45:35 (GMT)
commitbb4e19e3f4c9d1973279b3b768bc0539ee7cb962 (patch)
tree8115b91ac8739bf5a4800cebfbeec2296377ade4
parent20c7d26f80b42554cf1eac636b336495084b86cf (diff)
downloadhostap-bb4e19e3f4c9d1973279b3b768bc0539ee7cb962.zip
hostap-bb4e19e3f4c9d1973279b3b768bc0539ee7cb962.tar.gz
hostap-bb4e19e3f4c9d1973279b3b768bc0539ee7cb962.tar.bz2
hostapd: Skip hostapd ACL check for drivers supporting ACL offload
Commit 0603bcb7fe8babf183362518238c142afe8e2036 ('hostapd: Process MAC ACLs on a station association event (SME in driver)') processes MAC ACL on a station association event for drivers which use AP SME offload but does not consider the scenario where the drivers offload ACL. This can result in station disconnection, though the driver accepts the connection. Address this by avoiding the hostapd ACL check for the drivers offloading MAC ACL. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
-rw-r--r--src/ap/drv_callbacks.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 02557ab..3552b3e 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -116,8 +116,15 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
}
sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS | WLAN_STA_WPS2);
- res = hostapd_check_acl(hapd, addr, NULL);
- if (res != HOSTAPD_ACL_ACCEPT) {
+ /*
+ * ACL configurations to the drivers (implementing AP SME and ACL
+ * offload) without hostapd's knowledge, can result in a disconnection
+ * though the driver accepts the connection. Skip the hostapd check for
+ * ACL if the driver supports ACL offload to avoid potentially
+ * conflicting ACL rules.
+ */
+ if (hapd->iface->drv_max_acl_mac_addrs == 0 &&
+ hostapd_check_acl(hapd, addr, NULL) != HOSTAPD_ACL_ACCEPT) {
wpa_printf(MSG_INFO, "STA " MACSTR " not allowed to connect",
MAC2STR(addr));
reason = WLAN_REASON_UNSPECIFIED;