shill: monitor bss signal strength
This wires WiFiEndpoint up to a proxy, to monitor
changes in the corresponding wpa_supplicant BSS
object.
The WiFiEndpoint object notifies its WiFi object
about the change, and WiFi relays the information
to the appropriate WiFiService.
BUG=chromium-os:16786
TEST=new unit tests, manual
Manual testing: ran on device (with --v=1000), observed
"signal is now" messages in log file.
Collateral changes:
- fix WiFiService leak in WiFi (reset |current_service| on Stop)
- suppress some "uninteresting call" messages in
WiFiMainTest.CurrentBSSChangedUpdateServiceEndpoint
Change-Id: Ic329ecd28f73d93238d517a73105f2cd35cbff2e
Reviewed-on: https://gerrit.chromium.org/gerrit/15868
Commit-Ready: mukesh agrawal <quiche@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/wifi_endpoint.cc b/wifi_endpoint.cc
index a36ad45..e78d6cd 100644
--- a/wifi_endpoint.cc
+++ b/wifi_endpoint.cc
@@ -12,7 +12,10 @@
#include <chromeos/dbus/service_constants.h>
#include "shill/ieee80211.h"
+#include "shill/proxy_factory.h"
+#include "shill/supplicant_bss_proxy_interface.h"
#include "shill/wifi.h"
+#include "shill/wifi_endpoint.h"
#include "shill/wpa_supplicant.h"
using std::map;
@@ -22,9 +25,14 @@
namespace shill {
-WiFiEndpoint::WiFiEndpoint(
- const map<string, ::DBus::Variant> &properties)
- : frequency_(0) {
+WiFiEndpoint::WiFiEndpoint(ProxyFactory *proxy_factory,
+ const WiFiRefPtr &device,
+ const string &rpc_id,
+ const map<string, ::DBus::Variant> &properties)
+ : frequency_(0),
+ proxy_factory_(proxy_factory),
+ device_(device),
+ rpc_id_(rpc_id) {
// XXX will segfault on missing properties
ssid_ =
properties.find(wpa_supplicant::kBSSPropertySSID)->second.
@@ -59,6 +67,25 @@
WiFiEndpoint::~WiFiEndpoint() {}
+void WiFiEndpoint::Start() {
+ supplicant_bss_proxy_.reset(
+ proxy_factory_->CreateSupplicantBSSProxy(
+ this, rpc_id_, wpa_supplicant::kDBusAddr));
+}
+
+void WiFiEndpoint::PropertiesChanged(
+ const map<string, ::DBus::Variant> &properties) {
+ LOG(INFO) << __func__;
+ map<string, ::DBus::Variant>::const_iterator properties_it =
+ properties.find(wpa_supplicant::kBSSPropertySignal);
+ if (properties_it != properties.end()) {
+ signal_strength_ = properties_it->second.reader().get_int16();
+ VLOG(2) << "WiFiEndpoint " << bssid_string_ << " signal is now "
+ << signal_strength_;
+ device_->NotifyEndpointChanged(*this);
+ }
+}
+
// static
uint32_t WiFiEndpoint::ModeStringToUint(const std::string &mode_string) {
if (mode_string == flimflam::kModeManaged)
@@ -112,8 +139,10 @@
}
// static
-WiFiEndpoint *WiFiEndpoint::MakeOpenEndpoint(
- const string &ssid, const string &bssid) {
+WiFiEndpoint *WiFiEndpoint::MakeOpenEndpoint(ProxyFactory *proxy_factory,
+ const WiFiRefPtr &wifi,
+ const string &ssid,
+ const string &bssid) {
map <string, ::DBus::Variant> args;
::DBus::MessageIter writer;
@@ -132,7 +161,8 @@
wpa_supplicant::kNetworkModeInfrastructure);
// We indicate this is an open BSS by leaving out all security properties.
- return new WiFiEndpoint(args);
+ return new WiFiEndpoint(
+ proxy_factory, wifi, bssid, args); // |bssid| fakes an RPC ID
}
// static