blob: 9f577c5df0a125b98e52124593aa8f2971bcce3b [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
11using std::string;
12
Darin Petkov50308cd2011-06-01 18:25:07 -070013namespace shill {
14
15const char DHCPCDProxy::kDBusInterfaceName[] = "org.chromium.dhcpcd";
16const char DHCPCDProxy::kDBusPath[] = "/org/chromium/dhcpcd";
17
Darin Petkovd1b715b2011-06-02 21:21:22 -070018DHCPCDListener::DHCPCDListener(DHCPProvider *provider,
19 DBus::Connection *connection)
Darin Petkov50308cd2011-06-01 18:25:07 -070020 : DBus::InterfaceProxy(DHCPCDProxy::kDBusInterfaceName),
Darin Petkovd1b715b2011-06-02 21:21:22 -070021 DBus::ObjectProxy(*connection, DHCPCDProxy::kDBusPath),
22 provider_(provider) {
Darin Petkov50308cd2011-06-01 18:25:07 -070023 VLOG(2) << __func__;
24 connect_signal(DHCPCDListener, Event, EventSignal);
25 connect_signal(DHCPCDListener, StatusChanged, StatusChangedSignal);
26}
27
28void DHCPCDListener::EventSignal(const DBus::SignalMessage &signal) {
29 VLOG(2) << __func__;
30 DBus::MessageIter ri = signal.reader();
31 unsigned int pid;
32 ri >> pid;
33 VLOG(2) << "sender(" << signal.sender() << ") pid(" << pid << ")";
Darin Petkovd1b715b2011-06-02 21:21:22 -070034
35 DHCPConfigRefPtr config = provider_->GetConfig(pid);
36 if (!config.get()) {
37 LOG(ERROR) << "Unknown DHCP client PID " << pid;
38 return;
39 }
40 config->InitProxy(&conn(), signal.sender());
41 // TODO(petkov): Process and dispatch the signal to the appropriate DHCP
42 // configuration.
Darin Petkov50308cd2011-06-01 18:25:07 -070043}
44
45void DHCPCDListener::StatusChangedSignal(const DBus::SignalMessage &signal) {
46 VLOG(2) << __func__;
47 DBus::MessageIter ri = signal.reader();
48 unsigned int pid;
49 ri >> pid;
50 VLOG(2) << "sender(" << signal.sender() << ") pid(" << pid << ")";
Darin Petkovd1b715b2011-06-02 21:21:22 -070051
52 // Accept StatusChanged signals just to get the sender address and create an
53 // appropriate proxy for the PID/sender pair.
54 DHCPConfigRefPtr config = provider_->GetConfig(pid);
55 if (!config.get()) {
56 LOG(ERROR) << "Unknown DHCP client PID " << pid;
57 return;
58 }
59 config->InitProxy(&conn(), signal.sender());
Darin Petkov50308cd2011-06-01 18:25:07 -070060}
61
Darin Petkovd1b715b2011-06-02 21:21:22 -070062DHCPCDProxy::DHCPCDProxy(DBus::Connection *connection,
Darin Petkov50308cd2011-06-01 18:25:07 -070063 const char *service)
Darin Petkovd1b715b2011-06-02 21:21:22 -070064 : DBus::ObjectProxy(*connection, kDBusPath, service) {
65 VLOG(2) << "DHCPCDProxy(service=" << service << ").";
Darin Petkov50308cd2011-06-01 18:25:07 -070066
67 // Don't catch signals directly in this proxy because they will be dispatched
68 // to us by the DHCPCD listener.
69 _signals.erase("Event");
70 _signals.erase("StatusChanged");
71}
72
Darin Petkovd1b715b2011-06-02 21:21:22 -070073void DHCPCDProxy::DoRebind(const string &interface) {
74 Rebind(interface);
75}
76
Darin Petkov50308cd2011-06-01 18:25:07 -070077void DHCPCDProxy::Event(
78 const uint32_t& pid,
79 const std::string& reason,
80 const std::map< std::string, DBus::Variant >& configuration) {
Darin Petkovd1b715b2011-06-02 21:21:22 -070081 NOTREACHED();
Darin Petkov50308cd2011-06-01 18:25:07 -070082}
83
84void DHCPCDProxy::StatusChanged(const uint32_t& pid,
85 const std::string& status) {
Darin Petkovd1b715b2011-06-02 21:21:22 -070086 NOTREACHED();
Darin Petkov50308cd2011-06-01 18:25:07 -070087}
88
89} // namespace shill