wire-up WiFi class to D-Bus, implement rudimentary scanning support
BUG=chromium-os:14886
TEST=emerge, run wifi_integrationtest on device
Change-Id: I7ff0799d198b4eed0bf92afbef2c5591ca2a388e
Reviewed-on: http://gerrit.chromium.org/gerrit/1585
Reviewed-by: Chris Masone <cmasone@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/wifi.h b/wifi.h
index e61e2b2..d962de4 100644
--- a/wifi.h
+++ b/wifi.h
@@ -5,15 +5,18 @@
#ifndef SHILL_WIFI_
#define SHILL_WIFI_
+#include <map>
#include <string>
+#include <vector>
#include "shill/device.h"
#include "shill/shill_event.h"
+#include "shill/supplicant-process.h"
+#include "shill/supplicant-interface.h"
namespace shill {
-// Device superclass. Individual network interfaces types will inherit from
-// this class.
+// WiFi class. Specialization of Device for WiFi.
class WiFi : public Device {
public:
WiFi(ControlInterface *control_interface,
@@ -21,9 +24,85 @@
Manager *manager,
const std::string& link_name,
int interface_index);
- ~WiFi();
- bool TechnologyIs(Device::Technology type);
+ virtual ~WiFi();
+ virtual void Start();
+ virtual void Stop();
+ virtual bool TechnologyIs(const Technology type);
+
+ // called by SupplicantInterfaceProxy, in response to events from
+ // wpa_supplicant.
+ void BSSAdded(const ::DBus::Path &BSS,
+ const std::map<std::string, ::DBus::Variant>
+ &properties);
+ void ScanDone();
+
private:
+ // SupplicantProcessProxy. provides access to wpa_supplicant's
+ // process-level D-Bus APIs.
+ class SupplicantProcessProxy :
+ public fi::w1::wpa_supplicant1_proxy,
+ private ::DBus::ObjectProxy // used by dbus-c++, not WiFi
+ {
+ public:
+ explicit SupplicantProcessProxy(DBus::Connection *bus);
+
+ private:
+ // called by dbus-c++, via wpa_supplicant1_proxy interface,
+ // in response to signals from wpa_supplicant. not exposed
+ // to WiFi.
+ virtual void InterfaceAdded(
+ const ::DBus::Path &path,
+ const std::map<std::string, ::DBus::Variant> &properties);
+ virtual void InterfaceRemoved(const ::DBus::Path &path);
+ virtual void PropertiesChanged(
+ const std::map<std::string, ::DBus::Variant> &properties);
+ };
+
+ // SupplicantInterfaceProxy. provides access to wpa_supplicant's
+ // network-interface D-Bus APIs.
+ class SupplicantInterfaceProxy :
+ public fi::w1::wpa_supplicant1::Interface_proxy,
+ private ::DBus::ObjectProxy // used by dbus-c++, not WiFi
+ {
+ public:
+ SupplicantInterfaceProxy(WiFi *wifi, DBus::Connection *bus,
+ const ::DBus::Path &object_path);
+
+ private:
+ // called by dbus-c++, via Interface_proxy interface,
+ // in response to signals from wpa_supplicant. not exposed
+ // to WiFi.
+ virtual void ScanDone(const bool &success);
+ virtual void BSSAdded(const ::DBus::Path &BSS,
+ const std::map<std::string, ::DBus::Variant>
+ &properties);
+ virtual void BSSRemoved(const ::DBus::Path &BSS);
+ virtual void BlobAdded(const std::string &blobname);
+ virtual void BlobRemoved(const std::string &blobname);
+ virtual void NetworkAdded(const ::DBus::Path &network,
+ const std::map<std::string, ::DBus::Variant>
+ &properties);
+ virtual void NetworkRemoved(const ::DBus::Path &network);
+ virtual void NetworkSelected(const ::DBus::Path &network);
+ virtual void PropertiesChanged(const std::map<std::string, ::DBus::Variant>
+ &properties);
+
+ WiFi &wifi_;
+ };
+
+ static const char kSupplicantPath[];
+ static const char kSupplicantDBusAddr[];
+ static const char kSupplicantWiFiDriver[];
+
+ DBus::Connection dbus_;
+ scoped_ptr<SupplicantProcessProxy> supplicant_process_proxy_;
+ scoped_ptr<SupplicantInterfaceProxy> supplicant_interface_proxy_;
+ bool scan_pending_;
+ std::vector<std::string> ssids_;
+
+ // provide WiFiTest access to scan_pending_, so it can determine
+ // if the scan completed, or timed out.
+ friend class WiFiTest;
DISALLOW_COPY_AND_ASSIGN(WiFi);
};