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