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