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// 16b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 1787602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#ifndef SHILL_ETHERNET_ETHERNET_H_ 1887602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#define SHILL_ETHERNET_ETHERNET_H_ 19b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <map> 21cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <memory> 2246eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone#include <string> 2346eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone 2435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart#include <base/cancelable_callback.h> 259413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart#include <base/memory/weak_ptr.h> 26ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 279413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart#include "shill/certificate_file.h" 28b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart#include "shill/device.h" 2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 302b10554b6c736f3421102d483b74b70bb82f997cChris Masone#include "shill/refptr_types.h" 311a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 321a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 33fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu#include "shill/key_value_store.h" 34da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_eap_state_handler.h" 35da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_event_delegate_interface.h" 361a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 37b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 38b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewartnamespace shill { 39b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 408bda796282e34295cca0d2953783ad04d8f692edmukesh agrawalclass Sockets; 4165a5672a129759458b87427488957cbbdb87e469Garret Kellyclass StoreInterface; 421a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 431a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 441a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass CertificateFile; 451a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass EapListener; 461a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass EthernetEapProvider; 479413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantEAPStateHandler; 489413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantInterfaceProxyInterface; 499413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantProcessProxyInterface; 501a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 511a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 521a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiuclass Ethernet 531a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 541a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu : public Device, public SupplicantEventDelegateInterface { 551a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#else 561a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu : public Device { 571a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 58b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart public: 597e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Ethernet(ControlInterface* control_interface, 607e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EventDispatcher* dispatcher, 617e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Metrics* metrics, 627e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart Manager* manager, 63afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov const std::string& link_name, 647e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart const std::string& address, 65afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov int interface_index); 665ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan ~Ethernet() override; 67afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 687e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void Start(Error* error, 697e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart const EnabledStateChangedCallback& callback) override; 707e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void Stop(Error* error, const EnabledStateChangedCallback& callback) override; 713de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void LinkEvent(unsigned int flags, unsigned int change) override; 727e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool Load(StoreInterface* storage) override; 737e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool Save(StoreInterface* storage) override; 743de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 757e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart virtual void ConnectTo(EthernetService* service); 767e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart virtual void DisconnectFrom(EthernetService* service); 77f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 781a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 799413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Test to see if conditions are correct for EAP authentication (both 809413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // credentials and a remote EAP authenticator is present) and initiate 819413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // an authentication if possible. 829413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart virtual void TryEapAuthentication(); 839413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 849413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Implementation of SupplicantEventDelegateInterface. These methods 859413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // are called by SupplicantInterfaceProxy, in response to events from 869413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // wpa_supplicant. 873de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void BSSAdded( 88fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const std::string& BSS, 89fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties) override; 90fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemoved(const std::string& BSS) override; 91fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void Certification(const KeyValueStore& properties) override; 92fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void EAPEvent(const std::string& status, 93fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const std::string& parameter) override; 94fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void PropertiesChanged(const KeyValueStore& properties) override; 957e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void ScanDone(const bool& /*success*/) override; 967e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void TDLSDiscoverResponse(const std::string& peer_address) override; 971a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 983de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 993de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart virtual bool link_up() const { return link_up_; } 1009413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 101b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart private: 102ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart friend class EthernetTest; 1033de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart friend class EthernetServiceTest; // For weak_ptr_factory_. 1042dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly friend class PPPoEServiceTest; // For weak_ptr_factory_. 105ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1061a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 10735eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a pointer to the EAP provider for Ethernet devices. 1087e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart EthernetEapProvider* GetEapProvider(); 10935eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 11035eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a reference to the shared service that contains EAP credentials 11135eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // for Ethernet. 11235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart ServiceConstRefPtr GetEapService(); 11335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 1149413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Invoked by |eap_listener_| when an EAP authenticator is detected. 115ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart void OnEapDetected(); 116ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1179413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start and stop a supplicant instance on this link. 1189413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartSupplicant(); 1199413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void StopSupplicant(); 1209413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1219413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start the EAP authentication process. 1229413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartEapAuthentication(); 1239413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1249413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Change our EAP authentication state. 1259413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void SetIsEapAuthenticated(bool is_eap_authenticated); 1269413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1279413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Callback tasks run as a result of event delegate methods. 1287e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void CertificationTask(const std::string& subject, uint32_t depth); 1297e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void EAPEventTask(const std::string& status, const std::string& parameter); 1307e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void SupplicantStateChangedTask(const std::string& state); 1319413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 13235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Callback task run as a result of TryEapAuthentication(). 13335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart void TryEapAuthenticationTask(); 1341a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 13535eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 13665a5672a129759458b87427488957cbbdb87e469Garret Kelly // Accessors for the PPoE property. 1377e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool GetPPPoEMode(Error* error); 1387e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart bool ConfigurePPPoEMode(const bool& mode, Error* error); 1397e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart void ClearPPPoEMode(Error* error); 14065a5672a129759458b87427488957cbbdb87e469Garret Kelly 14165a5672a129759458b87427488957cbbdb87e469Garret Kelly // Helpers for creating services with |this| as their device. 14265a5672a129759458b87427488957cbbdb87e469Garret Kelly EthernetServiceRefPtr CreateEthernetService(); 14365a5672a129759458b87427488957cbbdb87e469Garret Kelly EthernetServiceRefPtr CreatePPPoEService(); 14465a5672a129759458b87427488957cbbdb87e469Garret Kelly 1458e9e41cedee1a6be89ebc027afab62c9a52cb574Paul Stewart void SetupWakeOnLan(); 1468bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1477e779d87abbba4d9e50ef28513a27c7bbd5cd550Paul Stewart ControlInterface* control_interface_; 14865a5672a129759458b87427488957cbbdb87e469Garret Kelly 1499413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart EthernetServiceRefPtr service_; 150afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov bool link_up_; 151afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 1521a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIRED_8021X) 1539413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track whether we have completed EAP authentication successfully. 1549413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool is_eap_authenticated_; 1559413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 156ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart // Track whether an EAP authenticator has been detected on this link. 157ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart bool is_eap_detected_; 158cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<EapListener> eap_listener_; 159ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1609413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track the progress of EAP authentication. 1619413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart SupplicantEAPStateHandler eap_state_handler_; 1629413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1639413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Proxy instances used to talk to wpa_supplicant. 164cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantProcessProxyInterface> supplicant_process_proxy_; 165cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantInterfaceProxyInterface> 166cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan supplicant_interface_proxy_; 1679413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_interface_path_; 1689413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_network_path_; 1699413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 170c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // Certificate file instance to generate public key data for remote 171c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // authentication. 1729413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart CertificateFile certificate_file_; 1739413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 17435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Make sure TryEapAuthenticationTask is only queued for execution once 17535eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // at a time. 17635eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart base::CancelableClosure try_eap_authentication_callback_; 1771a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIRED_8021X 17835eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 179cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<Sockets> sockets_; 1808bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1819413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart base::WeakPtrFactory<Ethernet> weak_ptr_factory_; 1829413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 183b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart DISALLOW_COPY_AND_ASSIGN(Ethernet); 184b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart}; 185b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 186b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart} // namespace shill 187b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 18887602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#endif // SHILL_ETHERNET_ETHERNET_H_ 189