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