blob: bcefc36b2db5f295270736df8f08cb8cd1584a4b [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 Petkovfe6a9372012-02-28 16:25:06 +010060 FRIEND_TEST(OpenVPNDriverTest, InitOptions);
61 FRIEND_TEST(OpenVPNDriverTest, InitOptionsNoHost);
Darin Petkov14c29ec2012-03-02 11:34:19 +010062 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOption);
63 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOptions);
64 FRIEND_TEST(OpenVPNDriverTest, ParseIPConfiguration);
65
66 // The map is a sorted container that allows us to iterate through the options
67 // in order.
68 typedef std::map<int, std::string> ForeignOptions;
69
70 static void ParseIPConfiguration(
71 const std::map<std::string, std::string> &configuration,
72 IPConfig::Properties *properties);
73 static void ParseForeignOptions(const ForeignOptions &options,
74 IPConfig::Properties *properties);
75 static void ParseForeignOption(const std::string &option,
76 IPConfig::Properties *properties);
Darin Petkovfe6a9372012-02-28 16:25:06 +010077
78 void InitOptions(std::vector<std::string> *options, Error *error);
79
80 void AppendValueOption(const std::string &property,
81 const std::string &option,
82 std::vector<std::string> *options);
83 void AppendFlag(const std::string &property,
84 const std::string &option,
85 std::vector<std::string> *options);
86
Darin Petkova9b1fed2012-02-29 11:49:05 +010087 ControlInterface *control_;
Darin Petkovf20994f2012-03-05 16:12:19 +010088 EventDispatcher *dispatcher_;
89 Metrics *metrics_;
90 Manager *manager_;
Paul Stewartca6abd42012-03-01 15:45:29 -080091 DeviceInfo *device_info_;
Darin Petkovfe6a9372012-02-28 16:25:06 +010092 KeyValueStore args_;
Darin Petkova9b1fed2012-02-29 11:49:05 +010093 scoped_ptr<RPCTask> rpc_task_;
Paul Stewartca6abd42012-03-01 15:45:29 -080094 std::string tunnel_interface_;
Darin Petkovf20994f2012-03-05 16:12:19 +010095 VPNRefPtr device_;
Darin Petkovfe6a9372012-02-28 16:25:06 +010096
Darin Petkov33af05c2012-02-28 10:10:30 +010097 DISALLOW_COPY_AND_ASSIGN(OpenVPNDriver);
98};
99
100} // namespace shill
101
102#endif // SHILL_OPENVPN_DRIVER_