blob: 00f7eabc92877a7d267f46c1165b0f1122aa843f [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 Petkov33af05c2012-02-28 10:10:30 +010017#include "shill/vpn_driver.h"
18
19namespace shill {
20
Darin Petkova9b1fed2012-02-29 11:49:05 +010021class ControlInterface;
Paul Stewartca6abd42012-03-01 15:45:29 -080022class DeviceInfo;
Darin Petkov33af05c2012-02-28 10:10:30 +010023class Error;
Darin Petkova9b1fed2012-02-29 11:49:05 +010024class RPCTask;
Paul Stewartca6abd42012-03-01 15:45:29 -080025class DeviceStub;
Darin Petkov33af05c2012-02-28 10:10:30 +010026
27class OpenVPNDriver : public VPNDriver {
28 public:
Paul Stewartca6abd42012-03-01 15:45:29 -080029 OpenVPNDriver(ControlInterface *control,
30 DeviceInfo *device_info,
31 const KeyValueStore &args);
Darin Petkov33af05c2012-02-28 10:10:30 +010032 virtual ~OpenVPNDriver();
33
Darin Petkov14c29ec2012-03-02 11:34:19 +010034 bool Notify(const std::string &reason,
35 const std::map<std::string, std::string> &dict);
36
Darin Petkov33af05c2012-02-28 10:10:30 +010037 // Inherited from VPNDriver.
Paul Stewartca6abd42012-03-01 15:45:29 -080038 virtual bool ClaimInterface(const std::string &link_name,
39 int interface_index);
Darin Petkov33af05c2012-02-28 10:10:30 +010040 virtual void Connect(Error *error);
41
42 private:
Darin Petkovfe6a9372012-02-28 16:25:06 +010043 friend class OpenVPNDriverTest;
44 FRIEND_TEST(OpenVPNDriverTest, AppendFlag);
45 FRIEND_TEST(OpenVPNDriverTest, AppendValueOption);
Paul Stewartca6abd42012-03-01 15:45:29 -080046 FRIEND_TEST(OpenVPNDriverTest, ClaimInterface);
Darin Petkovfe6a9372012-02-28 16:25:06 +010047 FRIEND_TEST(OpenVPNDriverTest, InitOptions);
48 FRIEND_TEST(OpenVPNDriverTest, InitOptionsNoHost);
Darin Petkov14c29ec2012-03-02 11:34:19 +010049 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOption);
50 FRIEND_TEST(OpenVPNDriverTest, ParseForeignOptions);
51 FRIEND_TEST(OpenVPNDriverTest, ParseIPConfiguration);
52
53 // The map is a sorted container that allows us to iterate through the options
54 // in order.
55 typedef std::map<int, std::string> ForeignOptions;
56
57 static void ParseIPConfiguration(
58 const std::map<std::string, std::string> &configuration,
59 IPConfig::Properties *properties);
60 static void ParseForeignOptions(const ForeignOptions &options,
61 IPConfig::Properties *properties);
62 static void ParseForeignOption(const std::string &option,
63 IPConfig::Properties *properties);
Darin Petkovfe6a9372012-02-28 16:25:06 +010064
65 void InitOptions(std::vector<std::string> *options, Error *error);
66
67 void AppendValueOption(const std::string &property,
68 const std::string &option,
69 std::vector<std::string> *options);
70 void AppendFlag(const std::string &property,
71 const std::string &option,
72 std::vector<std::string> *options);
73
Darin Petkova9b1fed2012-02-29 11:49:05 +010074 ControlInterface *control_;
Paul Stewartca6abd42012-03-01 15:45:29 -080075 DeviceInfo *device_info_;
Darin Petkovfe6a9372012-02-28 16:25:06 +010076 KeyValueStore args_;
Darin Petkova9b1fed2012-02-29 11:49:05 +010077 scoped_ptr<RPCTask> rpc_task_;
Paul Stewartca6abd42012-03-01 15:45:29 -080078 std::string tunnel_interface_;
79 int interface_index_;
Darin Petkovfe6a9372012-02-28 16:25:06 +010080
Darin Petkov33af05c2012-02-28 10:10:30 +010081 DISALLOW_COPY_AND_ASSIGN(OpenVPNDriver);
82};
83
84} // namespace shill
85
86#endif // SHILL_OPENVPN_DRIVER_