ethernet.h revision 3de88a00f446215b3299fe5834d4f120863e3ac7
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" 19da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_eap_state_handler.h" 20da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_event_delegate_interface.h" 21b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 22b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewartnamespace shill { 23b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 249413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass CertificateFile; 25ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewartclass EapListener; 2635eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewartclass EthernetEapProvider; 279413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass ProxyFactory; 288bda796282e34295cca0d2953783ad04d8f692edmukesh agrawalclass Sockets; 299413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantEAPStateHandler; 309413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantInterfaceProxyInterface; 319413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass SupplicantProcessProxyInterface; 32ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 339413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewartclass Ethernet : public Device, public SupplicantEventDelegateInterface { 34b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart public: 35afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov Ethernet(ControlInterface *control_interface, 36afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov EventDispatcher *dispatcher, 373426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le Metrics *metrics, 38afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov Manager *manager, 39afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov const std::string& link_name, 40626719f89881a949d8b5a8fa808beb924496489fChris Masone const std::string &address, 41afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov int interface_index); 425ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan ~Ethernet() override; 43afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 443de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void Start(Error *error, 453de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart const EnabledStateChangedCallback &callback) override; 463de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void Stop(Error *error, const EnabledStateChangedCallback &callback) override; 473de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void LinkEvent(unsigned int flags, unsigned int change) override; 483de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 492f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley virtual void ConnectTo(EthernetService *service); 502f1bbf02bf310aee36ee29d716a73bf544dcee82Christopher Wiley virtual void DisconnectFrom(EthernetService *service); 51f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart 529413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Test to see if conditions are correct for EAP authentication (both 539413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // credentials and a remote EAP authenticator is present) and initiate 549413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // an authentication if possible. 559413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart virtual void TryEapAuthentication(); 569413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 579413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Implementation of SupplicantEventDelegateInterface. These methods 589413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // are called by SupplicantInterfaceProxy, in response to events from 599413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // wpa_supplicant. 603de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void BSSAdded( 619413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart const ::DBus::Path &BSS, 623de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart const std::map<std::string, ::DBus::Variant> &properties) override; 633de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void BSSRemoved(const ::DBus::Path &BSS) override; 643de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void Certification( 653de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart const std::map<std::string, ::DBus::Variant> &properties) override; 663de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void EAPEvent( 673de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart const std::string &status, const std::string ¶meter) override; 683de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void PropertiesChanged( 693de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart const std::map<std::string, ::DBus::Variant> &properties) override; 703de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart void ScanDone() override; 713de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart 723de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart virtual bool link_up() const { return link_up_; } 739413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 74b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart private: 75ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart friend class EthernetTest; 763de88a00f446215b3299fe5834d4f120863e3ac7Paul Stewart friend class EthernetServiceTest; // For weak_ptr_factory_. 77ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 7835eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a pointer to the EAP provider for Ethernet devices. 7935eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart EthernetEapProvider *GetEapProvider(); 8035eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 8135eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Return a reference to the shared service that contains EAP credentials 8235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // for Ethernet. 8335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart ServiceConstRefPtr GetEapService(); 8435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 859413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Invoked by |eap_listener_| when an EAP authenticator is detected. 86ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart void OnEapDetected(); 87ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 889413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start and stop a supplicant instance on this link. 899413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartSupplicant(); 909413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void StopSupplicant(); 919413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 929413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Start the EAP authentication process. 939413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool StartEapAuthentication(); 949413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 959413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Change our EAP authentication state. 969413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void SetIsEapAuthenticated(bool is_eap_authenticated); 979413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 989413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Callback tasks run as a result of event delegate methods. 997fab89734d88724a288e96a9996b15548c5294c7Ben Chan void CertificationTask(const std::string &subject, uint32_t depth); 1009413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void EAPEventTask(const std::string &status, const std::string ¶meter); 1019413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart void SupplicantStateChangedTask(const std::string &state); 1029413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 10335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Callback task run as a result of TryEapAuthentication(). 10435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart void TryEapAuthenticationTask(); 10535eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 1068e9e41cedee1a6be89ebc027afab62c9a52cb574Paul Stewart void SetupWakeOnLan(); 1078bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1089413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart EthernetServiceRefPtr service_; 109afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov bool link_up_; 110afa6fc4d31e884af8710deb14798c69b9c9a898eDarin Petkov 1119413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track whether we have completed EAP authentication successfully. 1129413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart bool is_eap_authenticated_; 1139413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 114ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart // Track whether an EAP authenticator has been detected on this link. 115ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart bool is_eap_detected_; 116cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<EapListener> eap_listener_; 117ced3ad7361acd352eb022365261228e14bb4fc39Paul Stewart 1189413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Track the progress of EAP authentication. 1199413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart SupplicantEAPStateHandler eap_state_handler_; 1209413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 1219413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Proxy instances used to talk to wpa_supplicant. 122cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantProcessProxyInterface> supplicant_process_proxy_; 123cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<SupplicantInterfaceProxyInterface> 124cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan supplicant_interface_proxy_; 1259413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_interface_path_; 1269413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart std::string supplicant_network_path_; 1279413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 128c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // Certificate file instance to generate public key data for remote 129c350e68360d08626cff8c4020c743b61d7da5a2bPaul Stewart // authentication. 1309413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart CertificateFile certificate_file_; 1319413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 13235eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // Make sure TryEapAuthenticationTask is only queued for execution once 13335eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart // at a time. 13435eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart base::CancelableClosure try_eap_authentication_callback_; 13535eff134fd95fdf1918803c4966f8b790914b3d4Paul Stewart 1369413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart // Store cached copy of proxy factory singleton for speed/ease of testing. 1379413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart ProxyFactory *proxy_factory_; 1389413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 139cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<Sockets> sockets_; 1408bda796282e34295cca0d2953783ad04d8f692edmukesh agrawal 1419413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart base::WeakPtrFactory<Ethernet> weak_ptr_factory_; 1429413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart 143b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart DISALLOW_COPY_AND_ASSIGN(Ethernet); 144b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart}; 145b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 146b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart} // namespace shill 147b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 14887602518c59af2f9e8288d81a1f877dd80f24433Ben Chan#endif // SHILL_ETHERNET_ETHERNET_H_ 149