l2tp_ipsec_driver.h revision e42d186ab3383b4a6bb267f490770af5932588b8
17476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
27476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov// Use of this source code is governed by a BSD-style license that can be
37476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov// found in the LICENSE file.
47476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
52240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#ifndef SHILL_VPN_L2TP_IPSEC_DRIVER_H_
62240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#define SHILL_VPN_L2TP_IPSEC_DRIVER_H_
77476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
8ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawal#include <sys/types.h>
9ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawal
108a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <map>
11d5dce94ec196e160c0d4bfeeb5ab8d4eb021ef15Ben Chan#include <memory>
128a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
13f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov#include <vector>
14f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
15a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_path.h>
16f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
17f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
180e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include "shill/ipconfig.h"
19209e629754acc6807fd5deff888bf4521867f68dDarin Petkov#include "shill/rpc_task.h"
20209e629754acc6807fd5deff888bf4521867f68dDarin Petkov#include "shill/service.h"
212240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#include "shill/vpn/vpn_driver.h"
227476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
237476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkovnamespace shill {
247476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
255baebb73bd597f5896b43d38e8ed3447680f47f4Paul Stewartclass CertificateFile;
26209e629754acc6807fd5deff888bf4521867f68dDarin Petkovclass ControlInterface;
27f8046b8f975417255baf5cc7cdd025c63aa2f918Darin Petkovclass DeviceInfo;
28ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawalclass ExternalTask;
29209e629754acc6807fd5deff888bf4521867f68dDarin Petkovclass GLib;
30f8046b8f975417255baf5cc7cdd025c63aa2f918Darin Petkovclass Metrics;
312e38263961190298d7198058ed91649dee106257mukesh agrawalclass PPPDeviceFactory;
32f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
33209e629754acc6807fd5deff888bf4521867f68dDarin Petkovclass L2TPIPSecDriver : public VPNDriver,
34209e629754acc6807fd5deff888bf4521867f68dDarin Petkov                        public RPCTaskDelegate {
357476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov public:
36e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  L2TPIPSecDriver(ControlInterface* control,
37e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  EventDispatcher* dispatcher,
38e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  Metrics* metrics,
39e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  Manager* manager,
40e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  DeviceInfo* device_info,
41e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  GLib* glib);
425ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~L2TPIPSecDriver() override;
437476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
44c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein  // Method to return service RPC identifier.
45c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein  std::string GetServiceRpcIdentifier();
46c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein
47a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov protected:
487476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov  // Inherited from VPNDriver.
49e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool ClaimInterface(const std::string& link_name,
506acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang                      int interface_index) override;
51e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void Connect(const VPNServiceRefPtr& service, Error* error) override;
526acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void Disconnect() override;
536acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  std::string GetProviderType() const override;
546acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void OnConnectionDisconnected() override;
556acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void OnConnectTimeout() override;
567476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
577476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov private:
587476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov  friend class L2TPIPSecDriverTest;
59f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, AppendFlag);
60f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, AppendValueOption);
61f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, Cleanup);
62602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, Connect);
633f71326c17aa63e13343d06cbdc8ee0a2cbac3d7Paul Stewart  FRIEND_TEST(L2TPIPSecDriverTest, DeleteTemporaryFiles);
64a0e645ef4df5ed16fef367ec97c3d9cded7980eeDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, Disconnect);
65209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, GetLogin);
66209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, InitEnvironment);
67f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, InitOptions);
68f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, InitOptionsNoHost);
693f71326c17aa63e13343d06cbdc8ee0a2cbac3d7Paul Stewart  FRIEND_TEST(L2TPIPSecDriverTest, InitPEMOptions);
70f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, InitPSKOptions);
713f71326c17aa63e13343d06cbdc8ee0a2cbac3d7Paul Stewart  FRIEND_TEST(L2TPIPSecDriverTest, InitXauthOptions);
722e38263961190298d7198058ed91649dee106257mukesh agrawal  FRIEND_TEST(L2TPIPSecDriverTest, Notify);
732e38263961190298d7198058ed91649dee106257mukesh agrawal  FRIEND_TEST(L2TPIPSecDriverTest, NotifyWithExistingDevice);
746999022029507e90bc8a032b85e87ef83d2c4d1dDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, NotifyDisconnected);
755eb0542cb67358d9030367498a4ad741fc42af4fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, OnConnectionDisconnected);
76209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied);
770e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, ParseIPConfiguration);
78209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  FRIEND_TEST(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN);
79d432539fc85363734b2c60290822054087b6c82bDarin Petkov
80209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  static const char kL2TPIPSecVPNPath[];
81d432539fc85363734b2c60290822054087b6c82bDarin Petkov  static const Property kProperties[];
82209e629754acc6807fd5deff888bf4521867f68dDarin Petkov
83e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool SpawnL2TPIPSecVPN(Error* error);
84f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
85e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool InitOptions(std::vector<std::string>* options, Error* error);
86e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool InitPSKOptions(std::vector<std::string>* options, Error* error);
87e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool InitPEMOptions(std::vector<std::string>* options);
88e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool InitXauthOptions(std::vector<std::string>* options, Error* error);
89f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
9085d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // Resets the VPN state and deallocates all resources. If there's a service
9185d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // associated through Connect, sets its state to Service::kStateIdle and
9285d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // disassociates from the service.
9385d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  void IdleService();
9485d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov
9585d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // Resets the VPN state and deallocates all resources. If there's a service
9685d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // associated through Connect, sets its state to Service::kStateFailure with
9785d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // failure reason |failure| and disassociates from the service.
9885d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  void FailService(Service::ConnectFailure failure);
9985d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov
10085d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // Implements the IdleService and FailService methods. Resets the VPN state
10185d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // and deallocates all resources. If there's a service associated through
10285d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // Connect, sets its state |state|; if |state| is Service::kStateFailure, sets
10385d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  // the failure reason to |failure|; disassociates from the service.
10485d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  void Cleanup(Service::ConnectState state, Service::ConnectFailure failure);
105f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
106e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void DeleteTemporaryFile(base::FilePath* temporary_file);
1073f71326c17aa63e13343d06cbdc8ee0a2cbac3d7Paul Stewart  void DeleteTemporaryFiles();
1080e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
109f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  // Returns true if an opton was appended.
110e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool AppendValueOption(const std::string& property,
111e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                         const std::string& option,
112e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                         std::vector<std::string>* options);
113f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
114f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov  // Returns true if a flag was appended.
115e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  bool AppendFlag(const std::string& property,
116e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  const std::string& true_option,
117e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  const std::string& false_option,
118e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                  std::vector<std::string>* options);
119f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
12085d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov  static Service::ConnectFailure TranslateExitStatusToFailure(int status);
12185d5317bed668c1fb0e4225de614c7b386e3de25Darin Petkov
122ba8f141693168a9613b1f86de0d6bf6ae4057e9cPaul Stewart  // Returns true if neither a PSK nor a client certificate has been provided
123ba8f141693168a9613b1f86de0d6bf6ae4057e9cPaul Stewart  // for the IPSec phase of the authentication process.
124ba8f141693168a9613b1f86de0d6bf6ae4057e9cPaul Stewart  bool IsPskRequired() const;
125ba8f141693168a9613b1f86de0d6bf6ae4057e9cPaul Stewart
126b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov  // Inherit from VPNDriver to add custom properties.
127e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  KeyValueStore GetProvider(Error* error) override;
128b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov
129209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  // Implements RPCTaskDelegate.
130e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void GetLogin(std::string* user, std::string* password) override;
131e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void Notify(const std::string& reason,
132e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart              const std::map<std::string, std::string>& dict) override;
133ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawal  // Called when the l2tpipsec_vpn process exits.
134ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawal  void OnL2TPIPSecVPNDied(pid_t pid, int status);
135209e629754acc6807fd5deff888bf4521867f68dDarin Petkov
13691a43cb5ddb565ed9e4abcaee2d5f9373250012aPaul Stewart  void ReportConnectionMetrics();
13791a43cb5ddb565ed9e4abcaee2d5f9373250012aPaul Stewart
138e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  ControlInterface* control_;
139e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  Metrics* metrics_;
140e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  DeviceInfo* device_info_;
141e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  GLib* glib_;
142e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  PPPDeviceFactory* ppp_device_factory_;
143f7ef50a6054414c446f891fa87401e6f0a00097fDarin Petkov
144209e629754acc6807fd5deff888bf4521867f68dDarin Petkov  VPNServiceRefPtr service_;
145d5dce94ec196e160c0d4bfeeb5ab8d4eb021ef15Ben Chan  std::unique_ptr<ExternalTask> external_task_;
1460e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  base::FilePath psk_file_;
1473f71326c17aa63e13343d06cbdc8ee0a2cbac3d7Paul Stewart  base::FilePath xauth_credentials_file_;
148d5dce94ec196e160c0d4bfeeb5ab8d4eb021ef15Ben Chan  std::unique_ptr<CertificateFile> certificate_file_;
1499da07771df3dbbc99ff99114c26317d01f29f7fcmukesh agrawal  PPPDeviceRefPtr device_;
150ae30e9e4f9050a5a2c3b18d20f8bd23f20aa8f38mukesh agrawal  base::WeakPtrFactory<L2TPIPSecDriver> weak_ptr_factory_;
151209e629754acc6807fd5deff888bf4521867f68dDarin Petkov
1527476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov  DISALLOW_COPY_AND_ASSIGN(L2TPIPSecDriver);
1537476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov};
1547476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
1557476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov}  // namespace shill
1567476a26345c7b36be98c1e14b5d54d00d823ce07Darin Petkov
1572240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#endif  // SHILL_VPN_L2TP_IPSEC_DRIVER_H_
158