blob: 890b56044218731844cfb7e0cbe6c76db72e8ffd [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 Petkovf7ef50a2012-04-16 20:54:31 +020016#include "shill/key_value_store.h"
Darin Petkov209e6292012-04-20 11:33:32 +020017#include "shill/rpc_task.h"
18#include "shill/service.h"
Darin Petkov7476a262012-04-12 16:30:46 +020019#include "shill/vpn_driver.h"
20
21namespace shill {
22
Darin Petkov209e6292012-04-20 11:33:32 +020023class ControlInterface;
Darin Petkovf8046b82012-04-24 16:29:23 +020024class DeviceInfo;
25class EventDispatcher;
Darin Petkov209e6292012-04-20 11:33:32 +020026class GLib;
Darin Petkovf8046b82012-04-24 16:29:23 +020027class Metrics;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020028class NSS;
29
Darin Petkov209e6292012-04-20 11:33:32 +020030class L2TPIPSecDriver : public VPNDriver,
31 public RPCTaskDelegate {
Darin Petkov7476a262012-04-12 16:30:46 +020032 public:
Darin Petkovf8046b82012-04-24 16:29:23 +020033 L2TPIPSecDriver(ControlInterface *control,
34 EventDispatcher *dispatcher,
35 Metrics *metrics,
36 Manager *manager,
37 DeviceInfo *device_info,
38 GLib *glib);
Darin Petkov7476a262012-04-12 16:30:46 +020039 virtual ~L2TPIPSecDriver();
40
41 // Inherited from VPNDriver.
42 virtual bool ClaimInterface(const std::string &link_name,
43 int interface_index);
44 virtual void Connect(const VPNServiceRefPtr &service, Error *error);
45 virtual void Disconnect();
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 Petkov0e9735d2012-04-24 12:33:45 +020053 FRIEND_TEST(L2TPIPSecDriverTest, DeletePSKFile);
Darin Petkov209e6292012-04-20 11:33:32 +020054 FRIEND_TEST(L2TPIPSecDriverTest, GetLogin);
55 FRIEND_TEST(L2TPIPSecDriverTest, InitEnvironment);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020056 FRIEND_TEST(L2TPIPSecDriverTest, InitNSSOptions);
57 FRIEND_TEST(L2TPIPSecDriverTest, InitOptions);
58 FRIEND_TEST(L2TPIPSecDriverTest, InitOptionsNoHost);
59 FRIEND_TEST(L2TPIPSecDriverTest, InitPSKOptions);
Darin Petkov0e9735d2012-04-24 12:33:45 +020060 FRIEND_TEST(L2TPIPSecDriverTest, Notify);
Darin Petkov209e6292012-04-20 11:33:32 +020061 FRIEND_TEST(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied);
Darin Petkov0e9735d2012-04-24 12:33:45 +020062 FRIEND_TEST(L2TPIPSecDriverTest, ParseIPConfiguration);
Darin Petkov209e6292012-04-20 11:33:32 +020063 FRIEND_TEST(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN);
Darin Petkovd4325392012-04-23 15:48:22 +020064
Darin Petkovf7ef50a2012-04-16 20:54:31 +020065 static const char kPPPDPlugin[];
Darin Petkov209e6292012-04-20 11:33:32 +020066 static const char kL2TPIPSecVPNPath[];
Darin Petkovd4325392012-04-23 15:48:22 +020067 static const Property kProperties[];
Darin Petkovf7ef50a2012-04-16 20:54:31 +020068
Darin Petkov209e6292012-04-20 11:33:32 +020069 bool SpawnL2TPIPSecVPN(Error *error);
70
71 void InitEnvironment(std::vector<std::string> *environment);
72
73 bool InitOptions(std::vector<std::string> *options, Error *error);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020074 bool InitPSKOptions(std::vector<std::string> *options, Error *error);
75 void InitNSSOptions(std::vector<std::string> *options);
76
Darin Petkov209e6292012-04-20 11:33:32 +020077 void Cleanup(Service::ConnectState state);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020078
Darin Petkov0e9735d2012-04-24 12:33:45 +020079 void DeletePSKFile();
80
Darin Petkovf7ef50a2012-04-16 20:54:31 +020081 // Returns true if an opton was appended.
82 bool AppendValueOption(const std::string &property,
83 const std::string &option,
84 std::vector<std::string> *options);
85
86 // Returns true if a flag was appended.
87 bool AppendFlag(const std::string &property,
88 const std::string &true_option,
89 const std::string &false_option,
90 std::vector<std::string> *options);
91
Darin Petkov0e9735d2012-04-24 12:33:45 +020092 static void ParseIPConfiguration(
93 const std::map<std::string, std::string> &configuration,
94 IPConfig::Properties *properties,
95 std::string *interface_name);
96
Darin Petkov209e6292012-04-20 11:33:32 +020097 // Called when the l2tpipsec_vpn process exits.
98 static void OnL2TPIPSecVPNDied(GPid pid, gint status, gpointer data);
99
100 // Implements RPCTaskDelegate.
101 virtual void GetLogin(std::string *user, std::string *password);
102 virtual void Notify(const std::string &reason,
103 const std::map<std::string, std::string> &dict);
104
105 ControlInterface *control_;
Darin Petkovf8046b82012-04-24 16:29:23 +0200106 EventDispatcher *dispatcher_;
107 Metrics *metrics_;
108 DeviceInfo *device_info_;
Darin Petkov209e6292012-04-20 11:33:32 +0200109 GLib *glib_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200110 NSS *nss_;
111 KeyValueStore args_;
112
Darin Petkov209e6292012-04-20 11:33:32 +0200113 VPNServiceRefPtr service_;
114 scoped_ptr<RPCTask> rpc_task_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200115 FilePath psk_file_;
Darin Petkovf8046b82012-04-24 16:29:23 +0200116 VPNRefPtr device_;
Darin Petkov7476a262012-04-12 16:30:46 +0200117
Darin Petkov209e6292012-04-20 11:33:32 +0200118 // The PID of the spawned l2tpipsec_vpn process. May be 0 if no process has
119 // been spawned yet or the process has died.
120 int pid_;
121
122 // Child exit watch callback source tag.
123 unsigned int child_watch_tag_;
124
Darin Petkov7476a262012-04-12 16:30:46 +0200125 DISALLOW_COPY_AND_ASSIGN(L2TPIPSecDriver);
126};
127
128} // namespace shill
129
130#endif // SHILL_L2TP_IPSEC_DRIVER_