blob: 0963039122a2d894c85b3d58da3ba09e2cc64a9a [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shill/ipconfig.h"
#include <base/logging.h>
#include <chromeos/dbus/service_constants.h>
#include "shill/adaptor_interfaces.h"
#include "shill/control_interface.h"
#include "shill/error.h"
#include "shill/scope_logger.h"
#include "shill/static_ip_parameters.h"
#include "shill/store_interface.h"
using base::Callback;
using std::string;
namespace shill {
// static
const char IPConfig::kStorageType[] = "Method";
// static
const char IPConfig::kType[] = "ip";
// static
uint IPConfig::global_serial_ = 0;
IPConfig::IPConfig(ControlInterface *control_interface,
const std::string &device_name)
: device_name_(device_name),
type_(kType),
serial_(global_serial_++),
adaptor_(control_interface->CreateIPConfigAdaptor(this)) {
Init();
}
IPConfig::IPConfig(ControlInterface *control_interface,
const std::string &device_name,
const std::string &type)
: device_name_(device_name),
type_(type),
serial_(global_serial_++),
adaptor_(control_interface->CreateIPConfigAdaptor(this)) {
Init();
}
void IPConfig::Init() {
store_.RegisterConstString(flimflam::kAddressProperty,
&properties_.address);
store_.RegisterConstString(flimflam::kBroadcastProperty,
&properties_.broadcast_address);
store_.RegisterConstString(flimflam::kDomainNameProperty,
&properties_.domain_name);
store_.RegisterConstString(flimflam::kGatewayProperty, &properties_.gateway);
store_.RegisterConstString(flimflam::kMethodProperty, &properties_.method);
store_.RegisterConstInt32(flimflam::kMtuProperty, &properties_.mtu);
store_.RegisterConstStrings(flimflam::kNameServersProperty,
&properties_.dns_servers);
store_.RegisterConstString(flimflam::kPeerAddressProperty,
&properties_.peer_address);
store_.RegisterConstInt32(flimflam::kPrefixlenProperty,
&properties_.subnet_prefix);
// TODO(cmasone): Does anyone use this?
// store_.RegisterStrings(flimflam::kSearchDomainsProperty,
// &properties_.domain_search);
SLOG(Inet, 2) << __func__ << " device: " << device_name();
}
IPConfig::~IPConfig() {
SLOG(Inet, 2) << __func__ << " device: " << device_name();
}
string IPConfig::GetRpcIdentifier() {
return adaptor_->GetRpcIdentifier();
}
string IPConfig::GetStorageIdentifier(const string &id_suffix) {
string id = GetRpcIdentifier();
ControlInterface::RpcIdToStorageId(&id);
size_t needle = id.find('_');
LOG_IF(ERROR, needle == string::npos) << "No _ in storage id?!?!";
id.replace(id.begin() + needle + 1, id.end(), id_suffix);
return id;
}
bool IPConfig::RequestIP() {
return false;
}
bool IPConfig::RenewIP() {
return false;
}
bool IPConfig::ReleaseIP() {
return false;
}
void IPConfig::ApplyStaticIPParameters(
const StaticIPParameters &static_ip_parameters) {
static_ip_parameters.ApplyTo(&properties_);
}
bool IPConfig::Load(StoreInterface *storage, const string &id_suffix) {
const string id = GetStorageIdentifier(id_suffix);
if (!storage->ContainsGroup(id)) {
LOG(WARNING) << "IPConfig is not available in the persistent store: " << id;
return false;
}
string local_type;
storage->GetString(id, kStorageType, &local_type);
return local_type == type();
}
bool IPConfig::Save(StoreInterface *storage, const string &id_suffix) {
const string id = GetStorageIdentifier(id_suffix);
storage->SetString(id, kStorageType, type());
return true;
}
void IPConfig::UpdateProperties(const Properties &properties, bool success) {
properties_ = properties;
if (!update_callback_.is_null()) {
update_callback_.Run(this, success);
}
}
void IPConfig::RegisterUpdateCallback(
const Callback<void(const IPConfigRefPtr&, bool)> &callback) {
update_callback_ = callback;
}
} // namespace shill