// // Copyright (C) 2012 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_ETHERNET_ETHERNET_H_ #define SHILL_ETHERNET_ETHERNET_H_ #include <map> #include <memory> #include <string> #include <base/cancelable_callback.h> #include <base/memory/weak_ptr.h> #include "shill/certificate_file.h" #include "shill/device.h" #include "shill/event_dispatcher.h" #include "shill/refptr_types.h" #if !defined(DISABLE_WIRED_8021X) #include "shill/key_value_store.h" #include "shill/supplicant/supplicant_eap_state_handler.h" #include "shill/supplicant/supplicant_event_delegate_interface.h" #endif // DISABLE_WIRED_8021X namespace shill { class Sockets; class StoreInterface; #if !defined(DISABLE_WIRED_8021X) class CertificateFile; class EapListener; class EthernetEapProvider; class SupplicantEAPStateHandler; class SupplicantInterfaceProxyInterface; class SupplicantProcessProxyInterface; #endif // DISABLE_WIRED_8021X class Ethernet #if !defined(DISABLE_WIRED_8021X) : public Device, public SupplicantEventDelegateInterface { #else : public Device { #endif // DISABLE_WIRED_8021X public: Ethernet(ControlInterface* control_interface, EventDispatcher* dispatcher, Metrics* metrics, Manager* manager, const std::string& link_name, const std::string& address, int interface_index); ~Ethernet() override; void Start(Error* error, const EnabledStateChangedCallback& callback) override; void Stop(Error* error, const EnabledStateChangedCallback& callback) override; void LinkEvent(unsigned int flags, unsigned int change) override; bool Load(StoreInterface* storage) override; bool Save(StoreInterface* storage) override; virtual void ConnectTo(EthernetService* service); virtual void DisconnectFrom(EthernetService* service); #if !defined(DISABLE_WIRED_8021X) // Test to see if conditions are correct for EAP authentication (both // credentials and a remote EAP authenticator is present) and initiate // an authentication if possible. virtual void TryEapAuthentication(); // Implementation of SupplicantEventDelegateInterface. These methods // are called by SupplicantInterfaceProxy, in response to events from // wpa_supplicant. void BSSAdded( const std::string& BSS, const KeyValueStore& properties) override; void BSSRemoved(const std::string& BSS) override; void Certification(const KeyValueStore& properties) override; void EAPEvent(const std::string& status, const std::string& parameter) override; void PropertiesChanged(const KeyValueStore& properties) override; void ScanDone(const bool& /*success*/) override; void TDLSDiscoverResponse(const std::string& peer_address) override; #endif // DISABLE_WIRED_8021X virtual bool link_up() const { return link_up_; } private: friend class EthernetTest; friend class EthernetServiceTest; // For weak_ptr_factory_. friend class PPPoEServiceTest; // For weak_ptr_factory_. #if !defined(DISABLE_WIRED_8021X) // Return a pointer to the EAP provider for Ethernet devices. EthernetEapProvider* GetEapProvider(); // Return a reference to the shared service that contains EAP credentials // for Ethernet. ServiceConstRefPtr GetEapService(); // Invoked by |eap_listener_| when an EAP authenticator is detected. void OnEapDetected(); // Start and stop a supplicant instance on this link. bool StartSupplicant(); void StopSupplicant(); // Start the EAP authentication process. bool StartEapAuthentication(); // Change our EAP authentication state. void SetIsEapAuthenticated(bool is_eap_authenticated); // Callback tasks run as a result of event delegate methods. void CertificationTask(const std::string& subject, uint32_t depth); void EAPEventTask(const std::string& status, const std::string& parameter); void SupplicantStateChangedTask(const std::string& state); // Callback task run as a result of TryEapAuthentication(). void TryEapAuthenticationTask(); #endif // DISABLE_WIRED_8021X // Accessors for the PPoE property. bool GetPPPoEMode(Error* error); bool ConfigurePPPoEMode(const bool& mode, Error* error); void ClearPPPoEMode(Error* error); // Helpers for creating services with |this| as their device. EthernetServiceRefPtr CreateEthernetService(); EthernetServiceRefPtr CreatePPPoEService(); void SetupWakeOnLan(); ControlInterface* control_interface_; EthernetServiceRefPtr service_; bool link_up_; #if !defined(DISABLE_WIRED_8021X) // Track whether we have completed EAP authentication successfully. bool is_eap_authenticated_; // Track whether an EAP authenticator has been detected on this link. bool is_eap_detected_; std::unique_ptr<EapListener> eap_listener_; // Track the progress of EAP authentication. SupplicantEAPStateHandler eap_state_handler_; // Proxy instances used to talk to wpa_supplicant. std::unique_ptr<SupplicantProcessProxyInterface> supplicant_process_proxy_; std::unique_ptr<SupplicantInterfaceProxyInterface> supplicant_interface_proxy_; std::string supplicant_interface_path_; std::string supplicant_network_path_; // Certificate file instance to generate public key data for remote // authentication. CertificateFile certificate_file_; // Make sure TryEapAuthenticationTask is only queued for execution once // at a time. base::CancelableClosure try_eap_authentication_callback_; #endif // DISABLE_WIRED_8021X std::unique_ptr<Sockets> sockets_; base::WeakPtrFactory<Ethernet> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(Ethernet); }; } // namespace shill #endif // SHILL_ETHERNET_ETHERNET_H_