Merge changes from topic "Signal Polling"
* changes:
Update receive bit rate to signal poll
Add receive bit rate to signal poll
wifi: Add Signal Polling interface to AIDL
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 6bbf1ec..a546984 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2393,6 +2393,7 @@
int avg_beacon_signal;
int current_noise;
int current_txrate;
+ int current_rxrate;
enum chan_width chanwidth;
int center_frq1;
int center_frq2;
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 1385edb..7472987 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -1701,6 +1701,20 @@
}
}
+ if (sinfo[NL80211_STA_INFO_RX_BITRATE]) {
+ if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX,
+ sinfo[NL80211_STA_INFO_RX_BITRATE],
+ rate_policy)) {
+ sig_change->current_rxrate = 0;
+ } else {
+ if (rinfo[NL80211_RATE_INFO_BITRATE]) {
+ sig_change->current_rxrate =
+ nla_get_u16(rinfo[
+ NL80211_RATE_INFO_BITRATE]) * 100;
+ }
+ }
+ }
+
return NL_SKIP;
}
@@ -1712,6 +1726,7 @@
sig->current_signal = -WPA_INVALID_NOISE;
sig->current_txrate = 0;
+ sig->current_rxrate = 0;
if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_STATION)) ||
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) {
diff --git a/wpa_supplicant/aidl/sta_iface.cpp b/wpa_supplicant/aidl/sta_iface.cpp
index eb3e559..1431340 100644
--- a/wpa_supplicant/aidl/sta_iface.cpp
+++ b/wpa_supplicant/aidl/sta_iface.cpp
@@ -811,6 +811,14 @@
&StaIface::getConnectionMloLinksInfoInternal, _aidl_return);
}
+::ndk::ScopedAStatus StaIface::getSignalPollResults(
+ std::vector<SignalPollResult> *results)
+{
+ return validateAndCall(
+ this, SupplicantStatusCode::FAILURE_UNKNOWN,
+ &StaIface::getSignalPollResultsInternal, results);
+}
+
std::pair<std::string, ndk::ScopedAStatus> StaIface::getNameInternal()
{
return {ifname_, ndk::ScopedAStatus::ok()};
@@ -1977,6 +1985,40 @@
return {linksInfo, ndk::ScopedAStatus::ok()};
}
+std::pair<std::vector<SignalPollResult>, ndk::ScopedAStatus>
+StaIface::getSignalPollResultsInternal()
+{
+ std::vector<SignalPollResult> results;
+ struct wpa_signal_info si;
+ struct wpa_mlo_signal_info mlo_si;
+ struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+
+ if (wpa_s->valid_links && wpa_drv_mlo_signal_poll(wpa_s, &mlo_si)) {
+ for (int i = 0; i < MAX_NUM_MLD_LINKS; i++) {
+ if (!(mlo_si.valid_links & BIT(i)))
+ continue;
+
+ SignalPollResult result;
+ result.linkId = 0;
+ result.currentRssiDbm = mlo_si.links[i].current_signal;
+ result.txBitrateMbps = mlo_si.links[i].current_txrate / 1000;
+ result.rxBitrateMbps = mlo_si.links[i].current_rxrate / 1000;
+ result.frequencyMhz = mlo_si.links[i].frequency;
+ results.push_back(result);
+ }
+ } else if (wpa_drv_signal_poll(wpa_s, &si) == 0) {
+ SignalPollResult result;
+ result.linkId = 0;
+ result.currentRssiDbm = si.current_signal;
+ result.txBitrateMbps = si.current_txrate / 1000;
+ result.rxBitrateMbps = si.current_rxrate / 1000;
+ result.frequencyMhz = si.frequency;
+ results.push_back(result);
+ }
+
+ return {results, ndk::ScopedAStatus::ok()};
+}
+
/**
* Retrieve the underlying |wpa_supplicant| struct
* pointer for this iface.
diff --git a/wpa_supplicant/aidl/sta_iface.h b/wpa_supplicant/aidl/sta_iface.h
index 0ed29d8..5371468 100644
--- a/wpa_supplicant/aidl/sta_iface.h
+++ b/wpa_supplicant/aidl/sta_iface.h
@@ -157,6 +157,8 @@
const std::vector<QosPolicyStatus>& in_qosPolicyStatusList) override;
::ndk::ScopedAStatus removeAllQosPolicies() override;
::ndk::ScopedAStatus getConnectionMloLinksInfo(MloLinksInfo* _aidl_return) override;
+ ::ndk::ScopedAStatus getSignalPollResults(
+ std::vector<SignalPollResult>* results) override;
private:
// Corresponding worker functions for the AIDL methods.
@@ -261,6 +263,8 @@
const std::vector<QosPolicyStatus>& qos_policy_status_list);
ndk::ScopedAStatus removeAllQosPoliciesInternal();
std::pair<MloLinksInfo, ndk::ScopedAStatus> getConnectionMloLinksInfoInternal();
+ std::pair<std::vector<SignalPollResult>, ndk::ScopedAStatus>
+ getSignalPollResultsInternal();
struct wpa_supplicant* retrieveIfacePtr();
// Reference to the global wpa_struct. This is assumed to be valid for