blob: ec308f61a3fd068b37270793fe00e9433dd2d4e6 [file] [log] [blame]
Darin Petkov50308cd2011-06-01 18:25:07 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/dhcpcd_proxy.h"
6
7#include <base/logging.h>
8
Darin Petkovd1b715b2011-06-02 21:21:22 -07009#include "shill/dhcp_provider.h"
10
Darin Petkove7cb7f82011-06-03 13:21:51 -070011using std::map;
Darin Petkovd1b715b2011-06-02 21:21:22 -070012using std::string;
Darin Petkove7cb7f82011-06-03 13:21:51 -070013using std::vector;
Darin Petkovd1b715b2011-06-02 21:21:22 -070014
Darin Petkov50308cd2011-06-01 18:25:07 -070015namespace shill {
16
17const char DHCPCDProxy::kDBusInterfaceName[] = "org.chromium.dhcpcd";
18const char DHCPCDProxy::kDBusPath[] = "/org/chromium/dhcpcd";
19
Darin Petkovd1b715b2011-06-02 21:21:22 -070020DHCPCDListener::DHCPCDListener(DHCPProvider *provider,
21 DBus::Connection *connection)
Darin Petkov50308cd2011-06-01 18:25:07 -070022 : DBus::InterfaceProxy(DHCPCDProxy::kDBusInterfaceName),
Darin Petkovd1b715b2011-06-02 21:21:22 -070023 DBus::ObjectProxy(*connection, DHCPCDProxy::kDBusPath),
24 provider_(provider) {
Darin Petkov50308cd2011-06-01 18:25:07 -070025 VLOG(2) << __func__;
26 connect_signal(DHCPCDListener, Event, EventSignal);
27 connect_signal(DHCPCDListener, StatusChanged, StatusChangedSignal);
28}
29
30void DHCPCDListener::EventSignal(const DBus::SignalMessage &signal) {
31 VLOG(2) << __func__;
32 DBus::MessageIter ri = signal.reader();
33 unsigned int pid;
34 ri >> pid;
35 VLOG(2) << "sender(" << signal.sender() << ") pid(" << pid << ")";
Darin Petkovd1b715b2011-06-02 21:21:22 -070036
37 DHCPConfigRefPtr config = provider_->GetConfig(pid);
38 if (!config.get()) {
39 LOG(ERROR) << "Unknown DHCP client PID " << pid;
40 return;
41 }
42 config->InitProxy(&conn(), signal.sender());
Darin Petkove7cb7f82011-06-03 13:21:51 -070043
44 string reason;
45 ri >> reason;
46 DHCPConfig::Configuration configuration;
47 ri >> configuration;
48 config->ProcessEventSignal(reason, configuration);
Darin Petkov50308cd2011-06-01 18:25:07 -070049}
50
51void DHCPCDListener::StatusChangedSignal(const DBus::SignalMessage &signal) {
52 VLOG(2) << __func__;
53 DBus::MessageIter ri = signal.reader();
54 unsigned int pid;
55 ri >> pid;
56 VLOG(2) << "sender(" << signal.sender() << ") pid(" << pid << ")";
Darin Petkovd1b715b2011-06-02 21:21:22 -070057
58 // Accept StatusChanged signals just to get the sender address and create an
59 // appropriate proxy for the PID/sender pair.
60 DHCPConfigRefPtr config = provider_->GetConfig(pid);
61 if (!config.get()) {
62 LOG(ERROR) << "Unknown DHCP client PID " << pid;
63 return;
64 }
65 config->InitProxy(&conn(), signal.sender());
Darin Petkov50308cd2011-06-01 18:25:07 -070066}
67
Darin Petkovd1b715b2011-06-02 21:21:22 -070068DHCPCDProxy::DHCPCDProxy(DBus::Connection *connection,
Darin Petkov50308cd2011-06-01 18:25:07 -070069 const char *service)
Darin Petkovd1b715b2011-06-02 21:21:22 -070070 : DBus::ObjectProxy(*connection, kDBusPath, service) {
71 VLOG(2) << "DHCPCDProxy(service=" << service << ").";
Darin Petkov50308cd2011-06-01 18:25:07 -070072
73 // Don't catch signals directly in this proxy because they will be dispatched
74 // to us by the DHCPCD listener.
75 _signals.erase("Event");
76 _signals.erase("StatusChanged");
77}
78
Darin Petkovd1b715b2011-06-02 21:21:22 -070079void DHCPCDProxy::DoRebind(const string &interface) {
80 Rebind(interface);
81}
82
Darin Petkov98dd6a02011-06-10 15:12:57 -070083void DHCPCDProxy::DoRelease(const string &interface) {
84 Release(interface);
85}
86
Darin Petkove7cb7f82011-06-03 13:21:51 -070087void DHCPCDProxy::Event(const uint32_t &pid,
88 const std::string &reason,
89 const DHCPConfig::Configuration &configuration) {
Darin Petkovd1b715b2011-06-02 21:21:22 -070090 NOTREACHED();
Darin Petkov50308cd2011-06-01 18:25:07 -070091}
92
Darin Petkove7cb7f82011-06-03 13:21:51 -070093void DHCPCDProxy::StatusChanged(const uint32_t &pid,
94 const std::string &status) {
Darin Petkovd1b715b2011-06-02 21:21:22 -070095 NOTREACHED();
Darin Petkov50308cd2011-06-01 18:25:07 -070096}
97
98} // namespace shill