1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 16f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 1787602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#include "shill/ethernet/ethernet_service.h" 18afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 19f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include <netinet/ether.h> 2000b8f34cee8125edb2a828263aa28e7cf9fa5a8bSamuel Tan#if defined(__ANDROID__) 2100b8f34cee8125edb2a828263aa28e7cf9fa5a8bSamuel Tan#include <net/if.h> 2200b8f34cee8125edb2a828263aa28e7cf9fa5a8bSamuel Tan#else 23a41ab517725d036b63420f8445550246f8f50b99Alex Vakulenko#include <linux/if.h> // NOLINT - Needs definitions from netinet/ether.h 2400b8f34cee8125edb2a828263aa28e7cf9fa5a8bSamuel Tan#endif // __ANDROID__ 25a41ab517725d036b63420f8445550246f8f50b99Alex Vakulenko#include <stdio.h> 26a41ab517725d036b63420f8445550246f8f50b99Alex Vakulenko#include <time.h> 27f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 28f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include <string> 29f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 30a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 31289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 32289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 33289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 343bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone#include <chromeos/dbus/service_constants.h> 35289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 36f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 37f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include "shill/control_interface.h" 38f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include "shill/device.h" 39f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include "shill/device_info.h" 40c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart#include "shill/eap_credentials.h" 4187602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#include "shill/ethernet/ethernet.h" 4226b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 43f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart#include "shill/manager.h" 447aa5f90848b530999d8b6788ecb40aa30871c7aeChris Masone#include "shill/profile.h" 45f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 46f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewartusing std::string; 47f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 48f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewartnamespace shill { 49afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 5034af218abe6a99144ffe01332ce36fbad94f2628Chris Masone// static 513de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewartconst char EthernetService::kAutoConnNoCarrier[] = "no carrier"; 5234af218abe6a99144ffe01332ce36fbad94f2628Chris Masoneconst char EthernetService::kServiceType[] = "ethernet"; 5334af218abe6a99144ffe01332ce36fbad94f2628Chris Masone 547e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul StewartEthernetService::EthernetService(ControlInterface* control_interface, 557e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EventDispatcher* dispatcher, 567e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Metrics* metrics, 577e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Manager* manager, 583de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart base::WeakPtr<Ethernet> ethernet) 592dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly : EthernetService(control_interface, dispatcher, metrics, manager, 602dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly Technology::kEthernet, ethernet) { 61cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal SetConnectable(true); 62cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal SetAutoConnect(true); 630ad019a39da2fe66445f1ef4b2c2f83d5af55d76Paul Stewart set_friendly_name("Ethernet"); 648f3f775cc511815300fec4e67cf30a329c975e56mukesh agrawal SetStrength(kStrengthMax); 653de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 663de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart // Now that |this| is a fully constructed EthernetService, synchronize 673de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart // observers with our current state, and emit the appropriate change 683de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart // notifications. (Initial observer state may have been set in our base 693de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart // class.) 703de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart NotifyPropertyChanges(); 71f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart} 72f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 737e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul StewartEthernetService::EthernetService(ControlInterface* control_interface, 747e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EventDispatcher* dispatcher, 757e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Metrics* metrics, 767e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Manager* manager, 772dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly Technology::Identifier technology, 782dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly base::WeakPtr<Ethernet> ethernet) 792dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly : Service(control_interface, dispatcher, metrics, manager, technology), 802dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly ethernet_(ethernet) {} 812dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 82f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul StewartEthernetService::~EthernetService() { } 83f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 847e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartvoid EthernetService::Connect(Error* error, const char* reason) { 85dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal Service::Connect(error, reason); 863de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 872f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley ethernet_->ConnectTo(this); 882f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley} 892f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley 907e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartvoid EthernetService::Disconnect(Error* error, const char* reason) { 910d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan Service::Disconnect(error, reason); 923de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 932f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley ethernet_->DisconnectFrom(this); 942f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley} 952f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley 967e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartstd::string EthernetService::GetDeviceRpcId(Error* /*error*/) const { 973de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 9895207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone return ethernet_->GetRpcIdentifier(); 9995207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone} 10095207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone 1016515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masonestring EthernetService::GetStorageIdentifier() const { 1023de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 1032dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly return base::StringPrintf( 1042dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly "%s_%s", Technology::NameFromIdentifier(technology()).c_str(), 1052dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly ethernet_->address().c_str()); 10634af218abe6a99144ffe01332ce36fbad94f2628Chris Masone} 10734af218abe6a99144ffe01332ce36fbad94f2628Chris Masone 1083de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewartbool EthernetService::IsAutoConnectByDefault() const { 1093de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart return true; 1103de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart} 1113de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 1127e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartbool EthernetService::SetAutoConnectFull(const bool& connect, 1137e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Error* error) { 114cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart if (!connect) { 115cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart Error::PopulateAndLog( 11634f424e672439bdf237a755f85245ebd7b66e8e2Paul Stewart FROM_HERE, error, Error::kInvalidArguments, 117cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart "Auto-connect on Ethernet services must not be disabled."); 118bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return false; 119cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart } 120bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return Service::SetAutoConnectFull(connect, error); 121cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart} 122cf199de9b7c813635b5247a1858a99ab1fc9e21bPaul Stewart 1237e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartvoid EthernetService::Remove(Error* error) { 1240e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk error->Populate(Error::kNotSupported); 1250e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk} 1260e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk 1273de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewartbool EthernetService::IsVisible() const { 1283de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 1293de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart return ethernet_->link_up(); 1303de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart} 1313de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 1327e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartbool EthernetService::IsAutoConnectable(const char** reason) const { 1333de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart if (!Service::IsAutoConnectable(reason)) { 1343de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart return false; 1353de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart } 1363de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 1373de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart if (!ethernet_->link_up()) { 1383de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart *reason = kAutoConnNoCarrier; 1393de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart return false; 1403de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart } 1413de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart return true; 1423de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart} 1433de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 1443de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewartvoid EthernetService::OnVisibilityChanged() { 1453de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart NotifyPropertyChanges(); 1463de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart} 1473de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 1487e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewartstring EthernetService::GetTethering(Error* /*error*/) const { 1493de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart CHECK(ethernet_); 150fa11e28ddb81dab93971d5433a5274a1dc5c8283Paul Stewart return ethernet_->IsConnectedViaTether() ? kTetheringConfirmedState : 151fa11e28ddb81dab93971d5433a5274a1dc5c8283Paul Stewart kTetheringNotDetectedState; 152fa11e28ddb81dab93971d5433a5274a1dc5c8283Paul Stewart} 153fa11e28ddb81dab93971d5433a5274a1dc5c8283Paul Stewart 154f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart} // namespace shill 155