blob: c266900000b0e4481bb1d54907efd1e209755f40 [file] [log] [blame]
Darin Petkov7476a262012-04-12 16:30:46 +02001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_L2TP_IPSEC_DRIVER_
6#define SHILL_L2TP_IPSEC_DRIVER_
7
Darin Petkovf7ef50a2012-04-16 20:54:31 +02008#include <vector>
9
10#include <base/file_path.h>
Darin Petkov209e6292012-04-20 11:33:32 +020011#include <base/memory/scoped_ptr.h>
Darin Petkovf7ef50a2012-04-16 20:54:31 +020012#include <gtest/gtest_prod.h> // for FRIEND_TEST
13
Darin Petkov209e6292012-04-20 11:33:32 +020014#include "shill/glib.h"
Darin Petkov0e9735d2012-04-24 12:33:45 +020015#include "shill/ipconfig.h"
Darin Petkov209e6292012-04-20 11:33:32 +020016#include "shill/rpc_task.h"
17#include "shill/service.h"
Darin Petkov7476a262012-04-12 16:30:46 +020018#include "shill/vpn_driver.h"
19
20namespace shill {
21
Darin Petkov209e6292012-04-20 11:33:32 +020022class ControlInterface;
Darin Petkovf8046b82012-04-24 16:29:23 +020023class DeviceInfo;
Darin Petkov209e6292012-04-20 11:33:32 +020024class GLib;
Darin Petkovf8046b82012-04-24 16:29:23 +020025class Metrics;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020026class NSS;
Darin Petkov5a850472012-06-06 15:44:24 +020027class ProcessKiller;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020028
Darin Petkov209e6292012-04-20 11:33:32 +020029class L2TPIPSecDriver : public VPNDriver,
30 public RPCTaskDelegate {
Darin Petkov7476a262012-04-12 16:30:46 +020031 public:
Darin Petkovf8046b82012-04-24 16:29:23 +020032 L2TPIPSecDriver(ControlInterface *control,
33 EventDispatcher *dispatcher,
34 Metrics *metrics,
35 Manager *manager,
36 DeviceInfo *device_info,
37 GLib *glib);
Darin Petkov7476a262012-04-12 16:30:46 +020038 virtual ~L2TPIPSecDriver();
39
40 // Inherited from VPNDriver.
41 virtual bool ClaimInterface(const std::string &link_name,
42 int interface_index);
43 virtual void Connect(const VPNServiceRefPtr &service, Error *error);
44 virtual void Disconnect();
Darin Petkov5eb05422012-05-11 15:45:25 +020045 virtual void OnConnectionDisconnected();
Darin Petkov7476a262012-04-12 16:30:46 +020046 virtual std::string GetProviderType() const;
47
48 private:
49 friend class L2TPIPSecDriverTest;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020050 FRIEND_TEST(L2TPIPSecDriverTest, AppendFlag);
51 FRIEND_TEST(L2TPIPSecDriverTest, AppendValueOption);
52 FRIEND_TEST(L2TPIPSecDriverTest, Cleanup);
Darin Petkov602303f2012-06-06 12:15:59 +020053 FRIEND_TEST(L2TPIPSecDriverTest, Connect);
Darin Petkov0e9735d2012-04-24 12:33:45 +020054 FRIEND_TEST(L2TPIPSecDriverTest, DeletePSKFile);
Darin Petkova0e645e2012-04-25 11:38:59 +020055 FRIEND_TEST(L2TPIPSecDriverTest, Disconnect);
Darin Petkov209e6292012-04-20 11:33:32 +020056 FRIEND_TEST(L2TPIPSecDriverTest, GetLogin);
57 FRIEND_TEST(L2TPIPSecDriverTest, InitEnvironment);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020058 FRIEND_TEST(L2TPIPSecDriverTest, InitNSSOptions);
59 FRIEND_TEST(L2TPIPSecDriverTest, InitOptions);
60 FRIEND_TEST(L2TPIPSecDriverTest, InitOptionsNoHost);
61 FRIEND_TEST(L2TPIPSecDriverTest, InitPSKOptions);
Darin Petkov0e9735d2012-04-24 12:33:45 +020062 FRIEND_TEST(L2TPIPSecDriverTest, Notify);
Darin Petkova0e645e2012-04-25 11:38:59 +020063 FRIEND_TEST(L2TPIPSecDriverTest, NotifyFail);
Darin Petkov5eb05422012-05-11 15:45:25 +020064 FRIEND_TEST(L2TPIPSecDriverTest, OnConnectionDisconnected);
Darin Petkov209e6292012-04-20 11:33:32 +020065 FRIEND_TEST(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied);
Darin Petkov0e9735d2012-04-24 12:33:45 +020066 FRIEND_TEST(L2TPIPSecDriverTest, ParseIPConfiguration);
Darin Petkov209e6292012-04-20 11:33:32 +020067 FRIEND_TEST(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN);
Darin Petkova0e645e2012-04-25 11:38:59 +020068 FRIEND_TEST(L2TPIPSecDriverTest, VerifyPaths);
Darin Petkovd4325392012-04-23 15:48:22 +020069
Darin Petkovf7ef50a2012-04-16 20:54:31 +020070 static const char kPPPDPlugin[];
Darin Petkov209e6292012-04-20 11:33:32 +020071 static const char kL2TPIPSecVPNPath[];
Darin Petkovd4325392012-04-23 15:48:22 +020072 static const Property kProperties[];
Darin Petkovf7ef50a2012-04-16 20:54:31 +020073
Darin Petkov209e6292012-04-20 11:33:32 +020074 bool SpawnL2TPIPSecVPN(Error *error);
75
76 void InitEnvironment(std::vector<std::string> *environment);
77
78 bool InitOptions(std::vector<std::string> *options, Error *error);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020079 bool InitPSKOptions(std::vector<std::string> *options, Error *error);
80 void InitNSSOptions(std::vector<std::string> *options);
81
Darin Petkov209e6292012-04-20 11:33:32 +020082 void Cleanup(Service::ConnectState state);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020083
Darin Petkov0e9735d2012-04-24 12:33:45 +020084 void DeletePSKFile();
85
Darin Petkovf7ef50a2012-04-16 20:54:31 +020086 // Returns true if an opton was appended.
87 bool AppendValueOption(const std::string &property,
88 const std::string &option,
89 std::vector<std::string> *options);
90
91 // Returns true if a flag was appended.
92 bool AppendFlag(const std::string &property,
93 const std::string &true_option,
94 const std::string &false_option,
95 std::vector<std::string> *options);
96
Darin Petkov0e9735d2012-04-24 12:33:45 +020097 static void ParseIPConfiguration(
98 const std::map<std::string, std::string> &configuration,
99 IPConfig::Properties *properties,
100 std::string *interface_name);
101
Darin Petkov209e6292012-04-20 11:33:32 +0200102 // Called when the l2tpipsec_vpn process exits.
103 static void OnL2TPIPSecVPNDied(GPid pid, gint status, gpointer data);
104
Darin Petkovb536a742012-04-26 11:31:28 +0200105 // Inherit from VPNDriver to add custom properties.
106 virtual KeyValueStore GetProvider(Error *error);
107
Darin Petkov209e6292012-04-20 11:33:32 +0200108 // Implements RPCTaskDelegate.
109 virtual void GetLogin(std::string *user, std::string *password);
110 virtual void Notify(const std::string &reason,
111 const std::map<std::string, std::string> &dict);
112
113 ControlInterface *control_;
Darin Petkovf8046b82012-04-24 16:29:23 +0200114 Metrics *metrics_;
115 DeviceInfo *device_info_;
Darin Petkov209e6292012-04-20 11:33:32 +0200116 GLib *glib_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200117 NSS *nss_;
Darin Petkov5a850472012-06-06 15:44:24 +0200118 ProcessKiller *process_killer_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200119
Darin Petkov209e6292012-04-20 11:33:32 +0200120 VPNServiceRefPtr service_;
121 scoped_ptr<RPCTask> rpc_task_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200122 FilePath psk_file_;
Darin Petkovf8046b82012-04-24 16:29:23 +0200123 VPNRefPtr device_;
Darin Petkov7476a262012-04-12 16:30:46 +0200124
Darin Petkov209e6292012-04-20 11:33:32 +0200125 // The PID of the spawned l2tpipsec_vpn process. May be 0 if no process has
126 // been spawned yet or the process has died.
127 int pid_;
128
129 // Child exit watch callback source tag.
130 unsigned int child_watch_tag_;
131
Darin Petkov7476a262012-04-12 16:30:46 +0200132 DISALLOW_COPY_AND_ASSIGN(L2TPIPSecDriver);
133};
134
135} // namespace shill
136
137#endif // SHILL_L2TP_IPSEC_DRIVER_