shill: Convert DHCP Proxy to use a model similar to Supplicant and ModemManager.
Also, don't create a DBus connection for each proxy since this doesn't work in
some event callbacks and wastes resources. Instead use a shared connection
provided by the ProxyFactory.
BUG=chromium-os:17735
TEST=unit tests, tested on device
Change-Id: I4d16b430783c1159501c0414ef3b846bce1a4c0e
Reviewed-on: http://gerrit.chromium.org/gerrit/4279
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
diff --git a/dhcpcd_proxy.cc b/dhcpcd_proxy.cc
index ec308f6..d77efb1 100644
--- a/dhcpcd_proxy.cc
+++ b/dhcpcd_proxy.cc
@@ -8,7 +8,6 @@
#include "shill/dhcp_provider.h"
-using std::map;
using std::string;
using std::vector;
@@ -17,17 +16,21 @@
const char DHCPCDProxy::kDBusInterfaceName[] = "org.chromium.dhcpcd";
const char DHCPCDProxy::kDBusPath[] = "/org/chromium/dhcpcd";
-DHCPCDListener::DHCPCDListener(DHCPProvider *provider,
- DBus::Connection *connection)
+DHCPCDListener::DHCPCDListener(DBus::Connection *connection,
+ DHCPProvider *provider)
+ : proxy_(connection, provider) {}
+
+DHCPCDListener::Proxy::Proxy(DBus::Connection *connection,
+ DHCPProvider *provider)
: DBus::InterfaceProxy(DHCPCDProxy::kDBusInterfaceName),
DBus::ObjectProxy(*connection, DHCPCDProxy::kDBusPath),
provider_(provider) {
VLOG(2) << __func__;
- connect_signal(DHCPCDListener, Event, EventSignal);
- connect_signal(DHCPCDListener, StatusChanged, StatusChangedSignal);
+ connect_signal(DHCPCDListener::Proxy, Event, EventSignal);
+ connect_signal(DHCPCDListener::Proxy, StatusChanged, StatusChangedSignal);
}
-void DHCPCDListener::EventSignal(const DBus::SignalMessage &signal) {
+void DHCPCDListener::Proxy::EventSignal(const DBus::SignalMessage &signal) {
VLOG(2) << __func__;
DBus::MessageIter ri = signal.reader();
unsigned int pid;
@@ -39,7 +42,7 @@
LOG(ERROR) << "Unknown DHCP client PID " << pid;
return;
}
- config->InitProxy(&conn(), signal.sender());
+ config->InitProxy(signal.sender());
string reason;
ri >> reason;
@@ -48,7 +51,8 @@
config->ProcessEventSignal(reason, configuration);
}
-void DHCPCDListener::StatusChangedSignal(const DBus::SignalMessage &signal) {
+void DHCPCDListener::Proxy::StatusChangedSignal(
+ const DBus::SignalMessage &signal) {
VLOG(2) << __func__;
DBus::MessageIter ri = signal.reader();
unsigned int pid;
@@ -62,36 +66,39 @@
LOG(ERROR) << "Unknown DHCP client PID " << pid;
return;
}
- config->InitProxy(&conn(), signal.sender());
+ config->InitProxy(signal.sender());
}
-DHCPCDProxy::DHCPCDProxy(DBus::Connection *connection,
- const char *service)
- : DBus::ObjectProxy(*connection, kDBusPath, service) {
+DHCPCDProxy::DHCPCDProxy(DBus::Connection *connection, const char *service)
+ : proxy_(connection, service) {
VLOG(2) << "DHCPCDProxy(service=" << service << ").";
+}
+void DHCPCDProxy::Rebind(const string &interface) {
+ proxy_.Rebind(interface);
+}
+
+void DHCPCDProxy::Release(const string &interface) {
+ proxy_.Release(interface);
+}
+
+DHCPCDProxy::Proxy::Proxy(DBus::Connection *connection,
+ const char *service)
+ : DBus::ObjectProxy(*connection, kDBusPath, service) {
// Don't catch signals directly in this proxy because they will be dispatched
- // to us by the DHCPCD listener.
+ // to the client by the DHCPCD listener.
_signals.erase("Event");
_signals.erase("StatusChanged");
}
-void DHCPCDProxy::DoRebind(const string &interface) {
- Rebind(interface);
-}
-
-void DHCPCDProxy::DoRelease(const string &interface) {
- Release(interface);
-}
-
-void DHCPCDProxy::Event(const uint32_t &pid,
- const std::string &reason,
- const DHCPConfig::Configuration &configuration) {
+void DHCPCDProxy::Proxy::Event(const uint32_t &pid,
+ const std::string &reason,
+ const DHCPConfig::Configuration &configuration) {
NOTREACHED();
}
-void DHCPCDProxy::StatusChanged(const uint32_t &pid,
- const std::string &status) {
+void DHCPCDProxy::Proxy::StatusChanged(const uint32_t &pid,
+ const std::string &status) {
NOTREACHED();
}