blob: 489f326df0bc8376eca85178d3d1600f4ee8789a [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#include "shill/ipconfig.h"
6
7#include <base/logging.h>
Chris Masone43b48a12011-07-01 13:37:07 -07008#include <chromeos/dbus/service_constants.h>
Darin Petkove02b3ca2011-05-31 16:00:44 -07009
Chris Masonec6c6c132011-06-30 11:29:52 -070010#include "shill/adaptor_interfaces.h"
Chris Masone19e30402011-07-19 15:48:47 -070011#include "shill/control_interface.h"
Chris Masone43b48a12011-07-01 13:37:07 -070012#include "shill/error.h"
Chris Masone8a7b8be2011-07-22 12:43:37 -070013#include "shill/store_interface.h"
Chris Masonec6c6c132011-06-30 11:29:52 -070014
Eric Shienbrood3e20a232012-02-16 11:35:56 -050015using base::Callback;
Darin Petkove02b3ca2011-05-31 16:00:44 -070016using std::string;
17
18namespace shill {
19
Chris Masone0756f232011-07-21 17:24:00 -070020// static
Chris Masone5dec5f42011-07-22 14:07:55 -070021const char IPConfig::kStorageType[] = "Method";
Chris Masone8a7b8be2011-07-22 12:43:37 -070022// static
Chris Masone0756f232011-07-21 17:24:00 -070023const char IPConfig::kType[] = "ip";
24// static
25uint IPConfig::global_serial_ = 0;
26
Chris Masone19e30402011-07-19 15:48:47 -070027IPConfig::IPConfig(ControlInterface *control_interface,
28 const std::string &device_name)
29 : device_name_(device_name),
Chris Masone0756f232011-07-21 17:24:00 -070030 type_(kType),
31 serial_(global_serial_++),
Chris Masone19e30402011-07-19 15:48:47 -070032 adaptor_(control_interface->CreateIPConfigAdaptor(this)) {
Chris Masone0756f232011-07-21 17:24:00 -070033 Init();
34}
35
36IPConfig::IPConfig(ControlInterface *control_interface,
37 const std::string &device_name,
38 const std::string &type)
39 : device_name_(device_name),
40 type_(type),
41 serial_(global_serial_++),
42 adaptor_(control_interface->CreateIPConfigAdaptor(this)) {
43 Init();
44}
45
46void IPConfig::Init() {
Chris Masone43b48a12011-07-01 13:37:07 -070047 // Address might be R/O or not, depending on the type of IPconfig, so
48 // we'll leave this up to the subclasses.
49 // Register(Const?)String(flimflam::kAddressProperty, &properties_.address);
Chris Masone27c4aa52011-07-02 13:10:14 -070050 store_.RegisterString(flimflam::kBroadcastProperty,
51 &properties_.broadcast_address);
52 store_.RegisterString(flimflam::kDomainNameProperty,
53 &properties_.domain_name);
54 store_.RegisterString(flimflam::kGatewayProperty, &properties_.gateway);
55 store_.RegisterConstString(flimflam::kMethodProperty, &properties_.method);
56 store_.RegisterInt32(flimflam::kMtuProperty, &properties_.mtu);
57 store_.RegisterStrings(flimflam::kNameServersProperty,
58 &properties_.dns_servers);
59 store_.RegisterString(flimflam::kPeerAddressProperty,
60 &properties_.peer_address);
Paul Stewart48100b02012-03-19 07:53:52 -070061 store_.RegisterInt32(flimflam::kPrefixlenProperty,
62 &properties_.subnet_prefix);
Chris Masone43b48a12011-07-01 13:37:07 -070063 // TODO(cmasone): Does anyone use this?
Chris Masone27c4aa52011-07-02 13:10:14 -070064 // store_.RegisterStrings(flimflam::kSearchDomainsProperty,
65 // &properties_.domain_search);
Chris Masone0756f232011-07-21 17:24:00 -070066 VLOG(2) << __func__ << " device: " << device_name();
Darin Petkove02b3ca2011-05-31 16:00:44 -070067}
68
69IPConfig::~IPConfig() {
Darin Petkovf65e9282011-06-21 14:29:56 -070070 VLOG(2) << __func__ << " device: " << device_name();
Darin Petkove02b3ca2011-05-31 16:00:44 -070071}
72
Chris Masone4e851612011-07-01 10:46:53 -070073string IPConfig::GetRpcIdentifier() {
74 return adaptor_->GetRpcIdentifier();
75}
76
Chris Masone34af2182011-08-22 11:59:36 -070077string IPConfig::GetStorageIdentifier(const string &id_suffix) {
Chris Masone5dec5f42011-07-22 14:07:55 -070078 string id = GetRpcIdentifier();
79 ControlInterface::RpcIdToStorageId(&id);
Chris Masone34af2182011-08-22 11:59:36 -070080 size_t needle = id.find('_');
81 LOG_IF(ERROR, needle == string::npos) << "No _ in storage id?!?!";
82 id.replace(id.begin() + needle + 1, id.end(), id_suffix);
Chris Masone5dec5f42011-07-22 14:07:55 -070083 return id;
84}
85
Darin Petkov92c43902011-06-09 20:46:06 -070086bool IPConfig::RequestIP() {
Darin Petkove7cb7f82011-06-03 13:21:51 -070087 return false;
88}
89
Darin Petkov92c43902011-06-09 20:46:06 -070090bool IPConfig::RenewIP() {
91 return false;
92}
93
94bool IPConfig::ReleaseIP() {
Darin Petkove7cb7f82011-06-03 13:21:51 -070095 return false;
96}
97
Chris Masone34af2182011-08-22 11:59:36 -070098bool IPConfig::Load(StoreInterface *storage, const string &id_suffix) {
99 const string id = GetStorageIdentifier(id_suffix);
Chris Masone8a7b8be2011-07-22 12:43:37 -0700100 if (!storage->ContainsGroup(id)) {
101 LOG(WARNING) << "IPConfig is not available in the persistent store: " << id;
102 return false;
103 }
104 string local_type;
105 storage->GetString(id, kStorageType, &local_type);
106 return local_type == type();
107}
108
Chris Masone34af2182011-08-22 11:59:36 -0700109bool IPConfig::Save(StoreInterface *storage, const string &id_suffix) {
110 const string id = GetStorageIdentifier(id_suffix);
Chris Masone8a7b8be2011-07-22 12:43:37 -0700111 storage->SetString(id, kStorageType, type());
112 return true;
113}
114
Darin Petkovf9b0ca82011-06-20 12:10:23 -0700115void IPConfig::UpdateProperties(const Properties &properties, bool success) {
Darin Petkove7cb7f82011-06-03 13:21:51 -0700116 properties_ = properties;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500117 if (!update_callback_.is_null()) {
118 update_callback_.Run(this, success);
Darin Petkovefb09c32011-06-07 20:24:17 -0700119 }
120}
121
122void IPConfig::RegisterUpdateCallback(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500123 const Callback<void(const IPConfigRefPtr&, bool)> &callback) {
124 update_callback_ = callback;
Darin Petkove7cb7f82011-06-03 13:21:51 -0700125}
126
Darin Petkove02b3ca2011-05-31 16:00:44 -0700127} // namespace shill