Merge "ANDROID: add SCAN_STARTED and SCAN_RESULTS events..." into main
diff --git a/hostapd/Android.mk b/hostapd/Android.mk
index d5d1190..680c572 100644
--- a/hostapd/Android.mk
+++ b/hostapd/Android.mk
@@ -1209,7 +1209,7 @@
endif
ifeq ($(HOSTAPD_USE_AIDL), y)
LOCAL_SHARED_LIBRARIES += android.hardware.wifi.hostapd-V3-ndk
-LOCAL_SHARED_LIBRARIES += android.hardware.wifi.common-V1-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.wifi.common-V2-ndk
LOCAL_SHARED_LIBRARIES += libbase libutils
LOCAL_SHARED_LIBRARIES += libbinder_ndk
LOCAL_STATIC_LIBRARIES += libhostapd_aidl
@@ -1264,7 +1264,7 @@
aidl/hostapd.cpp
LOCAL_SHARED_LIBRARIES := \
android.hardware.wifi.hostapd-V3-ndk \
- android.hardware.wifi.common-V1-ndk \
+ android.hardware.wifi.common-V2-ndk \
libbinder_ndk \
libbase \
libutils \
diff --git a/hostapd/aidl/hostapd.cpp b/hostapd/aidl/hostapd.cpp
index 9c485e7..a3d4e28 100644
--- a/hostapd/aidl/hostapd.cpp
+++ b/hostapd/aidl/hostapd.cpp
@@ -855,23 +855,39 @@
}
}
+std::optional<struct sta_info*> getStaInfoByMacAddr(const struct hostapd_data* iface_hapd,
+ const u8 *mac_addr) {
+ if (iface_hapd == nullptr || mac_addr == nullptr){
+ wpa_printf(MSG_ERROR, "nullptr passsed to getStaInfoByMacAddr!");
+ return std::nullopt;
+ }
+
+ for (struct sta_info* sta_ptr = iface_hapd->sta_list; sta_ptr; sta_ptr = sta_ptr->next) {
+ int res;
+ res = memcmp(sta_ptr->addr, mac_addr, ETH_ALEN);
+ if (res == 0) {
+ return sta_ptr;
+ }
+ }
+ return std::nullopt;
+}
+
bool forceStaDisconnection(struct hostapd_data* hapd,
const std::vector<uint8_t>& client_address,
const uint16_t reason_code) {
- struct sta_info *sta;
if (client_address.size() != ETH_ALEN) {
return false;
}
- for (sta = hapd->sta_list; sta; sta = sta->next) {
- int res;
- res = memcmp(sta->addr, client_address.data(), ETH_ALEN);
- if (res == 0) {
- wpa_printf(MSG_INFO, "Force client:" MACSTR " disconnect with reason: %d",
- MAC2STR(client_address.data()), reason_code);
- ap_sta_disconnect(hapd, sta, sta->addr, reason_code);
- return true;
- }
+
+ auto sta_ptr_optional = getStaInfoByMacAddr(hapd, client_address.data());
+ if (sta_ptr_optional.has_value()) {
+ wpa_printf(MSG_INFO, "Force client:" MACSTR " disconnect with reason: %d",
+ MAC2STR(client_address.data()), reason_code);
+ ap_sta_disconnect(hapd, sta_ptr_optional.value(), sta_ptr_optional.value()->addr,
+ reason_code);
+ return true;
}
+
return false;
}
@@ -1260,6 +1276,15 @@
info.apIfaceInstance = instanceName;
info.clientAddress.assign(mac_addr, mac_addr + ETH_ALEN);
info.isConnected = authorized;
+ if(isAidlServiceVersionAtLeast(3) && !authorized) {
+ u16 disconnect_reason_code = WLAN_REASON_UNSPECIFIED;
+ auto sta_ptr_optional = getStaInfoByMacAddr(iface_hapd, mac_addr);
+ if (sta_ptr_optional.has_value()){
+ disconnect_reason_code = sta_ptr_optional.value()->deauth_reason;
+ }
+ info.disconnectReasonCode =
+ static_cast<common::DeauthenticationReasonCode>(disconnect_reason_code);
+ }
for (const auto &callback : callbacks_) {
auto status = callback->onConnectedClientsChanged(info);
if (!status.isOk()) {
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index 13613db..aa7e156 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -1625,6 +1625,7 @@
if (sta == NULL)
return;
+ sta->deauth_reason = reason;
ap_sta_set_authorized(hapd, sta, 0);
sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
hostapd_set_sta_flags(hapd, sta);
@@ -1654,7 +1655,6 @@
return;
}
- sta->deauth_reason = reason;
sta->flags |= WLAN_STA_PENDING_DEAUTH_CB;
eloop_cancel_timeout(ap_sta_deauth_cb_timeout, hapd, sta);
eloop_register_timeout(hapd->iface->drv_flags &