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