blob: 3bec003aa4eddba74f9bd835eec9b3625f81b8f9 [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 Petkovaceede32011-07-18 15:32:38 -070010#include <dbus-c++/types.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
Darin Petkov50308cd2011-06-01 18:25:07 -070014#include "shill/ipconfig.h"
15
16namespace shill {
17
Darin Petkovd1b715b2011-06-02 21:21:22 -070018class DHCPProvider;
19class DHCPProxyInterface;
Darin Petkov3258a812011-06-23 11:28:45 -070020class GLib;
Darin Petkovd1b715b2011-06-02 21:21:22 -070021
Darin Petkov50308cd2011-06-01 18:25:07 -070022class DHCPConfig : public IPConfig {
23 public:
Darin Petkove7cb7f82011-06-03 13:21:51 -070024 typedef std::map<std::string, DBus::Variant> Configuration;
25
Darin Petkovf7897bc2011-06-08 17:13:36 -070026 DHCPConfig(DHCPProvider *provider,
Darin Petkovf65e9282011-06-21 14:29:56 -070027 const std::string &device_name,
Darin Petkov3258a812011-06-23 11:28:45 -070028 GLib *glib);
Darin Petkov50308cd2011-06-01 18:25:07 -070029 virtual ~DHCPConfig();
30
Darin Petkovd1b715b2011-06-02 21:21:22 -070031 // Inherited from IPConfig.
Darin Petkov92c43902011-06-09 20:46:06 -070032 virtual bool RequestIP();
33 virtual bool RenewIP();
34 virtual bool ReleaseIP();
Darin Petkovd1b715b2011-06-02 21:21:22 -070035
36 // If |proxy_| is not initialized already, sets it to a new D-Bus proxy to
37 // |service|.
Darin Petkovaceede32011-07-18 15:32:38 -070038 void InitProxy(const char *service);
Darin Petkovd1b715b2011-06-02 21:21:22 -070039
Darin Petkove7cb7f82011-06-03 13:21:51 -070040 // Processes an Event signal from dhcpcd.
41 void ProcessEventSignal(const std::string &reason,
42 const Configuration &configuration);
43
Darin Petkov50308cd2011-06-01 18:25:07 -070044 private:
Darin Petkov98dd6a02011-06-10 15:12:57 -070045 friend class DHCPConfigTest;
Darin Petkove7cb7f82011-06-03 13:21:51 -070046 FRIEND_TEST(DHCPConfigTest, GetIPv4AddressString);
47 FRIEND_TEST(DHCPConfigTest, ParseConfiguration);
Darin Petkovf9b0ca82011-06-20 12:10:23 -070048 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalFail);
49 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalSuccess);
50 FRIEND_TEST(DHCPConfigTest, ProcessEventSignalUnknown);
Darin Petkov98dd6a02011-06-10 15:12:57 -070051 FRIEND_TEST(DHCPConfigTest, ReleaseIP);
52 FRIEND_TEST(DHCPConfigTest, RenewIP);
53 FRIEND_TEST(DHCPConfigTest, RequestIP);
54 FRIEND_TEST(DHCPConfigTest, Restart);
55 FRIEND_TEST(DHCPConfigTest, RestartNoClient);
Darin Petkov92c43902011-06-09 20:46:06 -070056 FRIEND_TEST(DHCPConfigTest, StartFail);
57 FRIEND_TEST(DHCPConfigTest, StartSuccess);
Darin Petkov98dd6a02011-06-10 15:12:57 -070058 FRIEND_TEST(DHCPConfigTest, Stop);
59 FRIEND_TEST(DHCPProviderTest, CreateConfig);
Darin Petkove7cb7f82011-06-03 13:21:51 -070060
Darin Petkovf9b0ca82011-06-20 12:10:23 -070061 static const char kConfigurationKeyBroadcastAddress[];
62 static const char kConfigurationKeyDNS[];
63 static const char kConfigurationKeyDomainName[];
64 static const char kConfigurationKeyDomainSearch[];
65 static const char kConfigurationKeyIPAddress[];
66 static const char kConfigurationKeyMTU[];
67 static const char kConfigurationKeyRouters[];
68 static const char kConfigurationKeySubnetCIDR[];
69
Darin Petkovd1b715b2011-06-02 21:21:22 -070070 static const char kDHCPCDPath[];
Darin Petkov92c43902011-06-09 20:46:06 -070071 static const char kDHCPCDPathFormatLease[];
72 static const char kDHCPCDPathFormatPID[];
Darin Petkovd1b715b2011-06-02 21:21:22 -070073
Darin Petkovf9b0ca82011-06-20 12:10:23 -070074 static const char kReasonBound[];
75 static const char kReasonFail[];
76 static const char kReasonRebind[];
77 static const char kReasonReboot[];
78 static const char kReasonRenew[];
79
Darin Petkovd1b715b2011-06-02 21:21:22 -070080 // Starts dhcpcd, returns true on success and false otherwise.
81 bool Start();
82
Darin Petkov92c43902011-06-09 20:46:06 -070083 // Stops dhcpcd if running.
84 void Stop();
85
Darin Petkov98dd6a02011-06-10 15:12:57 -070086 // Stops dhcpcd if already running and then starts it. Returns true on success
87 // and false otherwise.
88 bool Restart();
89
Darin Petkove7cb7f82011-06-03 13:21:51 -070090 // Parses |configuration| into |properties|. Returns true on success, and
91 // false otherwise.
92 bool ParseConfiguration(const Configuration& configuration,
93 IPConfig::Properties *properties);
94
95 // Returns the string representation of the IP address |address|, or an
96 // empty string on failure.
97 std::string GetIPv4AddressString(unsigned int address);
98
Darin Petkov92c43902011-06-09 20:46:06 -070099 // Called when the dhcpcd client process exits.
100 static void ChildWatchCallback(GPid pid, gint status, gpointer data);
101
Darin Petkov98dd6a02011-06-10 15:12:57 -0700102 // Cleans up remaining state from a running client, if any, including freeing
103 // its GPid, exit watch callback, and state files.
Darin Petkov92c43902011-06-09 20:46:06 -0700104 void CleanupClientState();
105
Darin Petkovd1b715b2011-06-02 21:21:22 -0700106 DHCPProvider *provider_;
107
108 // The PID of the spawned DHCP client. May be 0 if no client has been spawned
109 // yet or the client has died.
Darin Petkov92c43902011-06-09 20:46:06 -0700110 int pid_;
111
112 // Child exit watch callback source tag.
113 unsigned int child_watch_tag_;
Darin Petkovd1b715b2011-06-02 21:21:22 -0700114
115 // The proxy for communicating with the DHCP client.
116 scoped_ptr<DHCPProxyInterface> proxy_;
117
Darin Petkov92c43902011-06-09 20:46:06 -0700118 // Root file path, used for testing.
119 FilePath root_;
120
Darin Petkov3258a812011-06-23 11:28:45 -0700121 GLib *glib_;
Darin Petkovf7897bc2011-06-08 17:13:36 -0700122
Darin Petkov50308cd2011-06-01 18:25:07 -0700123 DISALLOW_COPY_AND_ASSIGN(DHCPConfig);
124};
125
126} // namespace shill
127
128#endif // SHILL_DHCP_CONFIG_