Add reporting for disconnect reason
Report disconnect reason code back to AIDL callback so we know why a
client disconnected from the SoftAP
Bug: 361651437
Test: VtsHalHostapdTargetTest
Test: VtsHalWifiSupplicantStaIfaceTargetTest
Test: VtsHalWifiSupplicantStaNetworkTargetTest
Test: VtsHalWifiSupplicantP2pIfaceTargetTest
Change-Id: I3acbffa6f9c830f5b3328adba50abe5c5f315b9b
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()) {