blob: caebda7e355e689d3d31afebd1996a79bf851fef [file] [log] [blame] [edit]
// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shill/virtual_device.h"
#include <netinet/ether.h>
#include <linux/if.h> // NOLINT - Needs definitions from netinet/ether.h
#include <memory>
#include <string>
#include <utility>
#include "shill/logging.h"
#include "shill/manager.h"
#include "shill/net/rtnl_handler.h"
#include <base/logging.h>
namespace shill {
namespace {
const char kHardwareAddressEmpty[] = "";
} // namespace
VirtualDevice::VirtualDevice(Manager* manager,
const std::string& link_name,
int interface_index,
Technology technology,
bool fixed_ip_params)
: Device(manager,
link_name,
kHardwareAddressEmpty,
interface_index,
technology,
fixed_ip_params) {}
VirtualDevice::~VirtualDevice() = default;
bool VirtualDevice::Load(const StoreInterface* /*storage*/) {
// Virtual devices have no persistent state.
return true;
}
bool VirtualDevice::Save(StoreInterface* /*storage*/) {
// Virtual devices have no persistent state.
return true;
}
void VirtualDevice::Start(EnabledStateChangedCallback callback) {
if (!network()->fixed_ip_params()) {
rtnl_handler()->SetInterfaceFlags(interface_index(), IFF_UP, IFF_UP);
}
std::move(callback).Run(Error(Error::kSuccess));
}
void VirtualDevice::Stop(EnabledStateChangedCallback callback) {
std::move(callback).Run(Error(Error::kSuccess));
}
void VirtualDevice::UpdateIPConfig(
std::unique_ptr<IPConfig::Properties> ipv4_properties,
std::unique_ptr<IPConfig::Properties> ipv6_properties) {
network()->set_link_protocol_ipv4_properties(std::move(ipv4_properties));
network()->set_link_protocol_ipv6_properties(std::move(ipv6_properties));
network()->Start(Network::StartOptions{
.dhcp = std::nullopt,
.accept_ra = false,
.probing_configuration =
manager()->GetPortalDetectorProbingConfiguration(),
});
}
void VirtualDevice::DropConnection() {
Device::DropConnection();
}
void VirtualDevice::SelectService(const ServiceRefPtr& service) {
Device::SelectService(service);
}
void VirtualDevice::SetServiceState(Service::ConnectState state) {
Device::SetServiceState(state);
}
void VirtualDevice::SetServiceFailure(Service::ConnectFailure failure_state) {
Device::SetServiceFailure(failure_state);
}
void VirtualDevice::SetServiceFailureSilent(
Service::ConnectFailure failure_state) {
Device::SetServiceFailureSilent(failure_state);
}
} // namespace shill