ethernet.h revision fc5236388674c3ae04255d98f5a3e93b789be185
13426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart// Use of this source code is governed by a BSD-style license that can be 3b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart// found in the LICENSE file. 4b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 587602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#ifndef SHILL_ETHERNET_ETHERNET_H_ 687602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#define SHILL_ETHERNET_ETHERNET_H_ 7b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 88a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <map> 9cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <memory> 1046eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone#include <string> 1146eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone 1235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart#include <base/cancelable_callback.h> 139413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart#include <base/memory/weak_ptr.h> 14ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 159413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart#include "shill/certificate_file.h" 16b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart#include "shill/device.h" 1726b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 182b10554b6c736f3421102d483b74b70bb82f997cChris Masone#include "shill/refptr_types.h" 191a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 201a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 21fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu#include "shill/key_value_store.h" 22da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_eap_state_handler.h" 23da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_event_delegate_interface.h" 241a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 25b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 26b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewartnamespace shill { 27b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 289413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass ProxyFactory; 298bda796282e34295cca0d2953783ad04d8f692edmukesh agrawalclass Sockets; 3065a5672a129759458b87427488957cbbdb87e469Garret Kellyclass StoreInterface; 311a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 321a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 331a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass CertificateFile; 341a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass EapListener; 351a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass EthernetEapProvider; 369413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantEAPStateHandler; 379413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantInterfaceProxyInterface; 389413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantProcessProxyInterface; 391a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 401a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 411a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass Ethernet 421a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 431a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu : public Device, public SupplicantEventDelegateInterface { 441a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#else 451a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu : public Device { 461a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 47b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart public: 487e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Ethernet(ControlInterface* control_interface, 497e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EventDispatcher* dispatcher, 507e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Metrics* metrics, 517e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Manager* manager, 52afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov const std::string& link_name, 537e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart const std::string& address, 54afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov int interface_index); 555ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan ~Ethernet() override; 56afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 577e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void Start(Error* error, 587e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart const EnabledStateChangedCallback& callback) override; 597e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void Stop(Error* error, const EnabledStateChangedCallback& callback) override; 603de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void LinkEvent(unsigned int flags, unsigned int change) override; 617e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool Load(StoreInterface* storage) override; 627e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool Save(StoreInterface* storage) override; 633de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 647e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart virtual void ConnectTo(EthernetService* service); 657e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart virtual void DisconnectFrom(EthernetService* service); 66f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 671a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 689413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Test to see if conditions are correct for EAP authentication (both 699413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // credentials and a remote EAP authenticator is present) and initiate 709413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // an authentication if possible. 719413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart virtual void TryEapAuthentication(); 729413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 739413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Implementation of SupplicantEventDelegateInterface. These methods 749413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // are called by SupplicantInterfaceProxy, in response to events from 759413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // wpa_supplicant. 763de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void BSSAdded( 77fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const std::string& BSS, 78fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties) override; 79fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemoved(const std::string& BSS) override; 80fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void Certification(const KeyValueStore& properties) override; 81fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void EAPEvent(const std::string& status, 82fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const std::string& parameter) override; 83fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void PropertiesChanged(const KeyValueStore& properties) override; 847e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void ScanDone(const bool& /*success*/) override; 857e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void TDLSDiscoverResponse(const std::string& peer_address) override; 861a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 873de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 883de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart virtual bool link_up() const { return link_up_; } 899413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 90b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart private: 91ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart friend class EthernetTest; 923de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart friend class EthernetServiceTest; // For weak_ptr_factory_. 932dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly friend class PPPoEServiceTest; // For weak_ptr_factory_. 94ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 951a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 9635eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a pointer to the EAP provider for Ethernet devices. 977e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EthernetEapProvider* GetEapProvider(); 9835eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 9935eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a reference to the shared service that contains EAP credentials 10035eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // for Ethernet. 10135eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart ServiceConstRefPtr GetEapService(); 10235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 1039413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Invoked by |eap_listener_| when an EAP authenticator is detected. 104ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart void OnEapDetected(); 105ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1069413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start and stop a supplicant instance on this link. 1079413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartSupplicant(); 1089413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void StopSupplicant(); 1099413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1109413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start the EAP authentication process. 1119413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartEapAuthentication(); 1129413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1139413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Change our EAP authentication state. 1149413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void SetIsEapAuthenticated(bool is_eap_authenticated); 1159413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1169413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Callback tasks run as a result of event delegate methods. 1177e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void CertificationTask(const std::string& subject, uint32_t depth); 1187e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void EAPEventTask(const std::string& status, const std::string& parameter); 1197e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void SupplicantStateChangedTask(const std::string& state); 1209413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 12135eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Callback task run as a result of TryEapAuthentication(). 12235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart void TryEapAuthenticationTask(); 1231a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 12435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 12565a5672a129759458b87427488957cbbdb87e469Garret Kelly // Accessors for the PPoE property. 1267e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool GetPPPoEMode(Error* error); 1277e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool ConfigurePPPoEMode(const bool& mode, Error* error); 1287e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void ClearPPPoEMode(Error* error); 12965a5672a129759458b87427488957cbbdb87e469Garret Kelly 13065a5672a129759458b87427488957cbbdb87e469Garret Kelly // Helpers for creating services with |this| as their device. 13165a5672a129759458b87427488957cbbdb87e469Garret Kelly EthernetServiceRefPtr CreateEthernetService(); 13265a5672a129759458b87427488957cbbdb87e469Garret Kelly EthernetServiceRefPtr CreatePPPoEService(); 13365a5672a129759458b87427488957cbbdb87e469Garret Kelly 1348e9e41cedee1a6be89ebc027afab62c9a52cb574Paul Stewart void SetupWakeOnLan(); 1358bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1367e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart ControlInterface* control_interface_; 13765a5672a129759458b87427488957cbbdb87e469Garret Kelly 1389413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart EthernetServiceRefPtr service_; 139afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov bool link_up_; 140afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 1411a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 1429413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track whether we have completed EAP authentication successfully. 1439413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool is_eap_authenticated_; 1449413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 145ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart // Track whether an EAP authenticator has been detected on this link. 146ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart bool is_eap_detected_; 147cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<EapListener> eap_listener_; 148ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1499413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track the progress of EAP authentication. 1509413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart SupplicantEAPStateHandler eap_state_handler_; 1519413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1529413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Proxy instances used to talk to wpa_supplicant. 153cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantProcessProxyInterface> supplicant_process_proxy_; 154cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantInterfaceProxyInterface> 155cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan supplicant_interface_proxy_; 1569413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_interface_path_; 1579413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_network_path_; 1589413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 159c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // Certificate file instance to generate public key data for remote 160c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // authentication. 1619413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart CertificateFile certificate_file_; 1629413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 16335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Make sure TryEapAuthenticationTask is only queued for execution once 16435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // at a time. 16535eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart base::CancelableClosure try_eap_authentication_callback_; 1661a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 16735eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 1689413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Store cached copy of proxy factory singleton for speed/ease of testing. 1697e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart ProxyFactory* proxy_factory_; 1709413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 171cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<Sockets> sockets_; 1728bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1739413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart base::WeakPtrFactory<Ethernet> weak_ptr_factory_; 1749413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 175b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart DISALLOW_COPY_AND_ASSIGN(Ethernet); 176b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart}; 177b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 178b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart} // namespace shill 179b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 18087602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#endif // SHILL_ETHERNET_ETHERNET_H_ 181