1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/virtual_device.h" 18 19 #include <netinet/ether.h> 20 #include <linux/if.h> // NOLINT - Needs definitions from netinet/ether.h 21 22 #include "shill/logging.h" 23 #include "shill/net/rtnl_handler.h" 24 25 using std::string; 26 27 namespace shill { 28 29 namespace Logging { 30 static auto kModuleLogScope = ScopeLogger::kDevice; 31 static string ObjectID(VirtualDevice* v) { return "(virtual_device)"; } 32 } 33 34 namespace { 35 const char kHardwareAddressEmpty[] = ""; 36 } // namespace 37 38 VirtualDevice::VirtualDevice(ControlInterface* control, 39 EventDispatcher* dispatcher, 40 Metrics* metrics, 41 Manager* manager, 42 const string& link_name, 43 int interface_index, 44 Technology::Identifier technology) 45 : Device(control, dispatcher, metrics, manager, link_name, 46 kHardwareAddressEmpty, interface_index, technology) {} 47 48 VirtualDevice::~VirtualDevice() {} 49 50 bool VirtualDevice::Load(StoreInterface* /*storage*/) { 51 // Virtual devices have no persistent state. 52 return true; 53 } 54 55 bool VirtualDevice::Save(StoreInterface* /*storage*/) { 56 // Virtual devices have no persistent state. 57 return true; 58 } 59 60 void VirtualDevice::Start(Error* error, 61 const EnabledStateChangedCallback& /*callback*/) { 62 rtnl_handler()->SetInterfaceFlags(interface_index(), IFF_UP, IFF_UP); 63 // TODO(quiche): Should we call OnEnabledStateChanged, like other Devices? 64 if (error) 65 error->Reset(); // indicate immediate completion 66 } 67 68 void VirtualDevice::Stop(Error* error, 69 const EnabledStateChangedCallback& /*callback*/) { 70 // TODO(quiche): Should we call OnEnabledStateChanged, like other Devices? 71 if (error) 72 error->Reset(); // indicate immediate completion 73 } 74 75 void VirtualDevice::UpdateIPConfig(const IPConfig::Properties& properties) { 76 SLOG(this, 2) << __func__ << " on " << link_name(); 77 if (!ipconfig()) { 78 set_ipconfig(new IPConfig(control_interface(), link_name())); 79 } 80 ipconfig()->set_properties(properties); 81 OnIPConfigUpdated(ipconfig(), true); 82 } 83 84 void VirtualDevice::DropConnection() { 85 Device::DropConnection(); 86 } 87 88 void VirtualDevice::SelectService(const ServiceRefPtr& service) { 89 Device::SelectService(service); 90 } 91 92 void VirtualDevice::SetServiceState(Service::ConnectState state) { 93 Device::SetServiceState(state); 94 } 95 96 void VirtualDevice::SetServiceFailure(Service::ConnectFailure failure_state) { 97 Device::SetServiceFailure(failure_state); 98 } 99 100 void VirtualDevice::SetServiceFailureSilent( 101 Service::ConnectFailure failure_state) { 102 Device::SetServiceFailureSilent(failure_state); 103 } 104 105 } // namespace shill 106