blob: 6201e01de6f14af78fe597c6047637968d4fe8cd [file] [log] [blame]
Darin Petkov33af05c2012-02-28 10:10:30 +01001// 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_OPENVPN_DRIVER_
6#define SHILL_OPENVPN_DRIVER_
7
Darin Petkov14c29ec2012-03-02 11:34:19 +01008#include <map>
Darin Petkovfe6a9372012-02-28 16:25:06 +01009#include <string>
10#include <vector>
11
Darin Petkova9b1fed2012-02-29 11:49:05 +010012#include <base/memory/scoped_ptr.h>
Darin Petkovfe6a9372012-02-28 16:25:06 +010013#include <gtest/gtest_prod.h> // for FRIEND_TEST
14
Darin Petkov14c29ec2012-03-02 11:34:19 +010015#include "shill/ipconfig.h"
Darin Petkovfe6a9372012-02-28 16:25:06 +010016#include "shill/key_value_store.h"
Darin Petkovf20994f2012-03-05 16:12:19 +010017#include "shill/refptr_types.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010018#include "shill/vpn_driver.h"
19
20namespace shill {
21
Darin Petkova9b1fed2012-02-29 11:49:05 +010022class ControlInterface;
Paul Stewartca6abd42012-03-01 15:45:29 -080023class DeviceInfo;
Darin Petkov33af05c2012-02-28 10:10:30 +010024class Error;
Darin Petkovf20994f2012-03-05 16:12:19 +010025class EventDispatcher;
26class Manager;
27class Metrics;
Darin Petkova9b1fed2012-02-29 11:49:05 +010028class RPCTask;
Paul Stewartca6abd42012-03-01 15:45:29 -080029class DeviceStub;
Darin Petkov33af05c2012-02-28 10:10:30 +010030
31class OpenVPNDriver : public VPNDriver {
32 public:
Paul Stewartca6abd42012-03-01 15:45:29 -080033 OpenVPNDriver(ControlInterface *control,
Darin Petkovf20994f2012-03-05 16:12:19 +010034 EventDispatcher *dispatcher,
35 Metrics *metrics,
36 Manager *manager,
Paul Stewartca6abd42012-03-01 15:45:29 -080037 DeviceInfo *device_info,
38 const KeyValueStore &args);
Darin Petkov33af05c2012-02-28 10:10:30 +010039 virtual ~OpenVPNDriver();
40
Darin Petkov14c29ec2012-03-02 11:34:19 +010041 bool Notify(const std::string &reason,
42 const std::map<std::string, std::string> &dict);
43
Darin Petkovf20994f2012-03-05 16:12:19 +010044 // Inherited from VPNDriver. |Connect| initiates the VPN connection by
45 // creating a tunnel device. When the device index becomes available, this
46 // instance is notified through |ClaimInterface| and resumes the connection
47 // process by setting up and spawning an external 'openvpn' process. IP
48 // configuration settings are passed back from the external process through
49 // the |Notify| RPC service method.
50 virtual void Connect(Error *error);
Paul Stewartca6abd42012-03-01 15:45:29 -080051 virtual bool ClaimInterface(const std::string &link_name,
52 int interface_index);
Darin Petkov33af05c2012-02-28 10:10:30 +010053
54 private:
Darin Petkovfe6a9372012-02-28 16:25:06 +010055 friend class OpenVPNDriverTest;
56 FRIEND_TEST(OpenVPNDriverTest, AppendFlag);
57 FRIEND_TEST(OpenVPNDriverTest, AppendValueOption);
Paul Stewartca6abd42012-03-01 15:45:29 -080058 FRIEND_TEST(OpenVPNDriverTest, ClaimInterface);
Darin Petkovf20994f2012-03-05 16:12:19 +010059 FRIEND_TEST(OpenVPNDriverTest, Connect);
Darin Petkov60596742012-03-05 12:17:17 +010060 FRIEND_TEST(OpenVPNDriverTest, GetRouteOptionEntry);
Darin Petkovfe6a9372012-02-28 16:25:06 +010061 FRIEND_TEST(OpenVPNDriverTest, InitOptions);
62 FRIEND_TEST(OpenVPNDriverTest, InitOptionsNoHost);
Darin Petkov14c29ec2012-03-02 11:34:19 +010063 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOption);
64 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOptions);
65 FRIEND_TEST(OpenVPNDriverTest, ParseIPConfiguration);
Darin Petkov60596742012-03-05 12:17:17 +010066 FRIEND_TEST(OpenVPNDriverTest, ParseRouteOption);
67 FRIEND_TEST(OpenVPNDriverTest, SetRoutes);
Darin Petkov14c29ec2012-03-02 11:34:19 +010068
69 // The map is a sorted container that allows us to iterate through the options
70 // in order.
71 typedef std::map<int, std::string> ForeignOptions;
Darin Petkov60596742012-03-05 12:17:17 +010072 typedef std::map<int, IPConfig::Route> RouteOptions;
Darin Petkov14c29ec2012-03-02 11:34:19 +010073
74 static void ParseIPConfiguration(
75 const std::map<std::string, std::string> &configuration,
76 IPConfig::Properties *properties);
77 static void ParseForeignOptions(const ForeignOptions &options,
78 IPConfig::Properties *properties);
79 static void ParseForeignOption(const std::string &option,
80 IPConfig::Properties *properties);
Darin Petkov60596742012-03-05 12:17:17 +010081 static IPConfig::Route *GetRouteOptionEntry(const std::string &prefix,
82 const std::string &key,
83 RouteOptions *routes);
84 static void ParseRouteOption(const std::string &key,
85 const std::string &value,
86 RouteOptions *routes);
87 static void SetRoutes(const RouteOptions &routes,
88 IPConfig::Properties *properties);
Darin Petkovfe6a9372012-02-28 16:25:06 +010089
90 void InitOptions(std::vector<std::string> *options, Error *error);
91
92 void AppendValueOption(const std::string &property,
93 const std::string &option,
94 std::vector<std::string> *options);
95 void AppendFlag(const std::string &property,
96 const std::string &option,
97 std::vector<std::string> *options);
98
Darin Petkova9b1fed2012-02-29 11:49:05 +010099 ControlInterface *control_;
Darin Petkovf20994f2012-03-05 16:12:19 +0100100 EventDispatcher *dispatcher_;
101 Metrics *metrics_;
102 Manager *manager_;
Paul Stewartca6abd42012-03-01 15:45:29 -0800103 DeviceInfo *device_info_;
Darin Petkovfe6a9372012-02-28 16:25:06 +0100104 KeyValueStore args_;
Darin Petkova9b1fed2012-02-29 11:49:05 +0100105 scoped_ptr<RPCTask> rpc_task_;
Paul Stewartca6abd42012-03-01 15:45:29 -0800106 std::string tunnel_interface_;
Darin Petkovf20994f2012-03-05 16:12:19 +0100107 VPNRefPtr device_;
Darin Petkovfe6a9372012-02-28 16:25:06 +0100108
Darin Petkov33af05c2012-02-28 10:10:30 +0100109 DISALLOW_COPY_AND_ASSIGN(OpenVPNDriver);
110};
111
112} // namespace shill
113
114#endif // SHILL_OPENVPN_DRIVER_