blob: 6708b127dfb01eae3ac69c3526c52f9287a44840 [file] [log] [blame]
Darin Petkove02b3ca2011-05-31 16:00:44 -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_IPCONFIG_
6#define SHILL_IPCONFIG_
7
8#include <string>
Darin Petkove7cb7f82011-06-03 13:21:51 -07009#include <vector>
Darin Petkove02b3ca2011-05-31 16:00:44 -070010
Darin Petkovefb09c32011-06-07 20:24:17 -070011#include <base/callback_old.h>
Darin Petkove02b3ca2011-05-31 16:00:44 -070012#include <base/memory/ref_counted.h>
Darin Petkovefb09c32011-06-07 20:24:17 -070013#include <base/memory/scoped_ptr.h>
14#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkove02b3ca2011-05-31 16:00:44 -070015
Chris Masonec1e50412011-06-07 13:04:53 -070016namespace shill {
Darin Petkove02b3ca2011-05-31 16:00:44 -070017
Darin Petkovefb09c32011-06-07 20:24:17 -070018class IPConfig;
19
20typedef scoped_refptr<IPConfig> IPConfigRefPtr;
21
Darin Petkove02b3ca2011-05-31 16:00:44 -070022// IPConfig superclass. Individual IP configuration types will inherit from this
23// class.
24class IPConfig : public base::RefCounted<IPConfig> {
25 public:
Paul Stewartc39f1132011-06-22 12:02:28 -070026 enum AddressFamily {
27 kAddressFamilyUnknown,
28 kAddressFamilyIPv4,
29 kAddressFamilyIPv6
30 };
Darin Petkove7cb7f82011-06-03 13:21:51 -070031
Paul Stewartc39f1132011-06-22 12:02:28 -070032 struct Properties {
33 Properties() : address_family(kAddressFamilyUnknown),
34 subnet_cidr(0),
35 mtu(0) {}
36
37 AddressFamily address_family;
Darin Petkove7cb7f82011-06-03 13:21:51 -070038 std::string address;
39 int subnet_cidr;
40 std::string broadcast_address;
41 std::string gateway;
42 std::vector<std::string> dns_servers;
43 std::string domain_name;
44 std::vector<std::string> domain_search;
45 int mtu;
46 };
47
Darin Petkovf65e9282011-06-21 14:29:56 -070048 explicit IPConfig(const std::string &device_name);
Darin Petkove02b3ca2011-05-31 16:00:44 -070049 virtual ~IPConfig();
50
Darin Petkovf65e9282011-06-21 14:29:56 -070051 const std::string &device_name() const { return device_name_; }
Darin Petkove02b3ca2011-05-31 16:00:44 -070052
Darin Petkovefb09c32011-06-07 20:24:17 -070053 // Registers a callback that's executed every time the configuration
54 // properties change. Takes ownership of |callback|. Pass NULL to remove a
Darin Petkovf9b0ca82011-06-20 12:10:23 -070055 // callback. The callback's first argument is a pointer to this IP
56 // configuration instance allowing clients to more easily manage multiple IP
57 // configurations. The callback's second argument is set to false if IP
58 // configuration failed.
59 void RegisterUpdateCallback(Callback2<IPConfigRefPtr, bool>::Type *callback);
Darin Petkove7cb7f82011-06-03 13:21:51 -070060
61 const Properties &properties() const { return properties_; }
62
Darin Petkov92c43902011-06-09 20:46:06 -070063 // Request, renew and release IP configuration. Return true on success, false
Darin Petkove7cb7f82011-06-03 13:21:51 -070064 // otherwise. The default implementation always returns false indicating a
65 // failure.
Darin Petkov92c43902011-06-09 20:46:06 -070066 virtual bool RequestIP();
67 virtual bool RenewIP();
68 virtual bool ReleaseIP();
Darin Petkovd1b715b2011-06-02 21:21:22 -070069
Darin Petkovefb09c32011-06-07 20:24:17 -070070 protected:
71 // Updates the IP configuration properties and notifies registered listeners
Darin Petkovf9b0ca82011-06-20 12:10:23 -070072 // about the event. |success| is set to false if the IP configuration failed.
73 void UpdateProperties(const Properties &properties, bool success);
Darin Petkovefb09c32011-06-07 20:24:17 -070074
Darin Petkove02b3ca2011-05-31 16:00:44 -070075 private:
Darin Petkovafa6fc42011-06-21 16:21:08 -070076 FRIEND_TEST(DeviceTest, AcquireDHCPConfig);
77 FRIEND_TEST(DeviceTest, DestroyIPConfig);
Darin Petkovefb09c32011-06-07 20:24:17 -070078 FRIEND_TEST(IPConfigTest, UpdateCallback);
79 FRIEND_TEST(IPConfigTest, UpdateProperties);
80
Darin Petkovf65e9282011-06-21 14:29:56 -070081 const std::string device_name_;
Darin Petkove7cb7f82011-06-03 13:21:51 -070082 Properties properties_;
Darin Petkovf9b0ca82011-06-20 12:10:23 -070083 scoped_ptr<Callback2<IPConfigRefPtr, bool>::Type> update_callback_;
Darin Petkove02b3ca2011-05-31 16:00:44 -070084
85 DISALLOW_COPY_AND_ASSIGN(IPConfig);
86};
87
88} // namespace shill
89
90#endif // SHILL_IPCONFIG_