blob: 16d8442a9267800d5419005620e85086a968558a [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#ifndef SHILL_DHCP_CONFIG_
6#define SHILL_DHCP_CONFIG_
7
Darin Petkov92c43902011-06-09 20:46:06 -07008#include <base/file_path.h>
Darin Petkovd1b715b2011-06-02 21:21:22 -07009#include <base/memory/scoped_ptr.h>
Darin Petkov98dd6a02011-06-10 15:12:57 -070010#include <dbus-c++/connection.h>
Darin Petkov92c43902011-06-09 20:46:06 -070011#include <glib.h>
Darin Petkove7cb7f82011-06-03 13:21:51 -070012#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkovd1b715b2011-06-02 21:21:22 -070013
Chris Masonec1e50412011-06-07 13:04:53 -070014#include "shill/device.h"
Darin Petkov50308cd2011-06-01 18:25:07 -070015#include "shill/ipconfig.h"
16
17namespace shill {
18
Darin Petkovd1b715b2011-06-02 21:21:22 -070019class DHCPConfig;
20class DHCPProvider;
21class DHCPProxyInterface;
Darin Petkovf7897bc2011-06-08 17:13:36 -070022class GLibInterface;
Darin Petkovd1b715b2011-06-02 21:21:22 -070023
24typedef scoped_refptr<DHCPConfig> DHCPConfigRefPtr;
25
Darin Petkov50308cd2011-06-01 18:25:07 -070026class DHCPConfig : public IPConfig {
27 public:
Darin Petkove7cb7f82011-06-03 13:21:51 -070028 typedef std::map<std::string, DBus::Variant> Configuration;
29
Darin Petkovf7897bc2011-06-08 17:13:36 -070030 DHCPConfig(DHCPProvider *provider,
31 DeviceConstRefPtr device,
32 GLibInterface *glib);
Darin Petkov50308cd2011-06-01 18:25:07 -070033 virtual ~DHCPConfig();
34
Darin Petkovd1b715b2011-06-02 21:21:22 -070035 // Inherited from IPConfig.
Darin Petkov92c43902011-06-09 20:46:06 -070036 virtual bool RequestIP();
37 virtual bool RenewIP();
38 virtual bool ReleaseIP();
Darin Petkovd1b715b2011-06-02 21:21:22 -070039
40 // If |proxy_| is not initialized already, sets it to a new D-Bus proxy to
41 // |service|.
42 void InitProxy(DBus::Connection *connection, const char *service);
43
Darin Petkove7cb7f82011-06-03 13:21:51 -070044 // Processes an Event signal from dhcpcd.
45 void ProcessEventSignal(const std::string &reason,
46 const Configuration &configuration);
47
Darin Petkov50308cd2011-06-01 18:25:07 -070048 private:
Darin Petkov98dd6a02011-06-10 15:12:57 -070049 friend class DHCPConfigTest;
Darin Petkove7cb7f82011-06-03 13:21:51 -070050 FRIEND_TEST(DHCPConfigTest, GetIPv4AddressString);
51 FRIEND_TEST(DHCPConfigTest, ParseConfiguration);
Darin Petkovf9b0ca82011-06-20 12:10:23 -070052 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalFail);
53 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalSuccess);
54 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalUnknown);
Darin Petkov98dd6a02011-06-10 15:12:57 -070055 FRIEND_TEST(DHCPConfigTest, ReleaseIP);
56 FRIEND_TEST(DHCPConfigTest, RenewIP);
57 FRIEND_TEST(DHCPConfigTest, RequestIP);
58 FRIEND_TEST(DHCPConfigTest, Restart);
59 FRIEND_TEST(DHCPConfigTest, RestartNoClient);
Darin Petkov92c43902011-06-09 20:46:06 -070060 FRIEND_TEST(DHCPConfigTest, StartFail);
61 FRIEND_TEST(DHCPConfigTest, StartSuccess);
Darin Petkov98dd6a02011-06-10 15:12:57 -070062 FRIEND_TEST(DHCPConfigTest, Stop);
63 FRIEND_TEST(DHCPProviderTest, CreateConfig);
Darin Petkove7cb7f82011-06-03 13:21:51 -070064
Darin Petkovf9b0ca82011-06-20 12:10:23 -070065 static const char kConfigurationKeyBroadcastAddress[];
66 static const char kConfigurationKeyDNS[];
67 static const char kConfigurationKeyDomainName[];
68 static const char kConfigurationKeyDomainSearch[];
69 static const char kConfigurationKeyIPAddress[];
70 static const char kConfigurationKeyMTU[];
71 static const char kConfigurationKeyRouters[];
72 static const char kConfigurationKeySubnetCIDR[];
73
Darin Petkovd1b715b2011-06-02 21:21:22 -070074 static const char kDHCPCDPath[];
Darin Petkov92c43902011-06-09 20:46:06 -070075 static const char kDHCPCDPathFormatLease[];
76 static const char kDHCPCDPathFormatPID[];
Darin Petkovd1b715b2011-06-02 21:21:22 -070077
Darin Petkovf9b0ca82011-06-20 12:10:23 -070078 static const char kReasonBound[];
79 static const char kReasonFail[];
80 static const char kReasonRebind[];
81 static const char kReasonReboot[];
82 static const char kReasonRenew[];
83
Darin Petkovd1b715b2011-06-02 21:21:22 -070084 // Starts dhcpcd, returns true on success and false otherwise.
85 bool Start();
86
Darin Petkov92c43902011-06-09 20:46:06 -070087 // Stops dhcpcd if running.
88 void Stop();
89
Darin Petkov98dd6a02011-06-10 15:12:57 -070090 // Stops dhcpcd if already running and then starts it. Returns true on success
91 // and false otherwise.
92 bool Restart();
93
Darin Petkove7cb7f82011-06-03 13:21:51 -070094 // Parses |configuration| into |properties|. Returns true on success, and
95 // false otherwise.
96 bool ParseConfiguration(const Configuration& configuration,
97 IPConfig::Properties *properties);
98
99 // Returns the string representation of the IP address |address|, or an
100 // empty string on failure.
101 std::string GetIPv4AddressString(unsigned int address);
102
Darin Petkov92c43902011-06-09 20:46:06 -0700103 // Called when the dhcpcd client process exits.
104 static void ChildWatchCallback(GPid pid, gint status, gpointer data);
105
Darin Petkov98dd6a02011-06-10 15:12:57 -0700106 // Cleans up remaining state from a running client, if any, including freeing
107 // its GPid, exit watch callback, and state files.
Darin Petkov92c43902011-06-09 20:46:06 -0700108 void CleanupClientState();
109
Darin Petkovd1b715b2011-06-02 21:21:22 -0700110 DHCPProvider *provider_;
111
112 // The PID of the spawned DHCP client. May be 0 if no client has been spawned
113 // yet or the client has died.
Darin Petkov92c43902011-06-09 20:46:06 -0700114 int pid_;
115
116 // Child exit watch callback source tag.
117 unsigned int child_watch_tag_;
Darin Petkovd1b715b2011-06-02 21:21:22 -0700118
119 // The proxy for communicating with the DHCP client.
120 scoped_ptr<DHCPProxyInterface> proxy_;
121
Darin Petkov92c43902011-06-09 20:46:06 -0700122 // Root file path, used for testing.
123 FilePath root_;
124
Darin Petkovf7897bc2011-06-08 17:13:36 -0700125 GLibInterface *glib_;
126
Darin Petkov50308cd2011-06-01 18:25:07 -0700127 DISALLOW_COPY_AND_ASSIGN(DHCPConfig);
128};
129
130} // namespace shill
131
132#endif // SHILL_DHCP_CONFIG_