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