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 &parameter) 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 &parameter);
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