vpn_driver.h revision 8a5322984f2d81bcbfd8d44c59747a11bd9b904b
133af05c849e0888b15222da38b55515784b821c7Darin Petkov// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
233af05c849e0888b15222da38b55515784b821c7Darin Petkov// Use of this source code is governed by a BSD-style license that can be
333af05c849e0888b15222da38b55515784b821c7Darin Petkov// found in the LICENSE file.
433af05c849e0888b15222da38b55515784b821c7Darin Petkov
5a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov#ifndef SHILL_VPN_DRIVER_H_
6a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov#define SHILL_VPN_DRIVER_H_
733af05c849e0888b15222da38b55515784b821c7Darin Petkov
8ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart#include <string>
98a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector>
10ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart
1133af05c849e0888b15222da38b55515784b821c7Darin Petkov#include <base/basictypes.h>
12602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/cancelable_callback.h>
13602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/memory/weak_ptr.h>
140e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
1533af05c849e0888b15222da38b55515784b821c7Darin Petkov
16b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/accessor_interface.h"
17b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/key_value_store.h"
1879d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov#include "shill/refptr_types.h"
1979d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov
2033af05c849e0888b15222da38b55515784b821c7Darin Petkovnamespace shill {
2133af05c849e0888b15222da38b55515784b821c7Darin Petkov
2233af05c849e0888b15222da38b55515784b821c7Darin Petkovclass Error;
23602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkovclass EventDispatcher;
240e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkovclass Manager;
25ebd3856da9d213154f3c85a71e4ec8e8fce3b9eaPaul Stewartclass PropertyStore;
26f3c71d70885fdddff8d71db75878c1310af28f9dDarin Petkovclass StoreInterface;
2733af05c849e0888b15222da38b55515784b821c7Darin Petkov
2833af05c849e0888b15222da38b55515784b821c7Darin Petkovclass VPNDriver {
2933af05c849e0888b15222da38b55515784b821c7Darin Petkov public:
30b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual ~VPNDriver();
3133af05c849e0888b15222da38b55515784b821c7Darin Petkov
32ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart  virtual bool ClaimInterface(const std::string &link_name,
33ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart                              int interface_index) = 0;
3479d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov  virtual void Connect(const VPNServiceRefPtr &service, Error *error) = 0;
356aa2187f18e5a9ba3d6d475669cd27dfee4d92bdDarin Petkov  virtual void Disconnect() = 0;
3639964fa3426450903d2640046e562708aeda0a30Paul Stewart  virtual std::string GetProviderType() const = 0;
37b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
38a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // Invoked by VPNService when the underlying connection disconnects.
39a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  virtual void OnConnectionDisconnected() = 0;
40a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov
41b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual void InitPropertyStore(PropertyStore *store);
42b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
43b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual bool Load(StoreInterface *storage, const std::string &storage_id);
44cb71529cc0432935aff005726c81df109d1dc710Darin Petkov  virtual bool Save(StoreInterface *storage,
45cb71529cc0432935aff005726c81df109d1dc710Darin Petkov                    const std::string &storage_id,
46cb71529cc0432935aff005726c81df109d1dc710Darin Petkov                    bool save_credentials);
47cb71529cc0432935aff005726c81df109d1dc710Darin Petkov  virtual void UnloadCredentials();
48b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
499c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov  std::string GetHost() const;
509c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov
51b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  KeyValueStore *args() { return &args_; }
52ba8f141693168a9613b1f86de0d6bf6ae4057e9cPaul Stewart  const KeyValueStore *const_args() const { return &args_; }
53b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
54b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov protected:
55b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  struct Property {
56b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    enum Flags {
57cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kEphemeral = 1 << 0,   // Never load or save.
58cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kCredential = 1 << 1,  // Save if saving credentials (crypted).
59cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kWriteOnly = 1 << 2,   // Never read over RPC.
60df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart      kArray = 1 << 3,       // Property is an array of strings.
61b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    };
62b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
63b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    const char *property;
64b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    int flags;
65b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  };
66b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
670cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  static const int kDefaultConnectTimeoutSeconds;
680cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov
69602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  VPNDriver(EventDispatcher *dispatcher,
70602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov            Manager *manager,
710e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov            const Property *properties,
720e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov            size_t property_count);
730e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
74602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  EventDispatcher *dispatcher() const { return dispatcher_; }
750e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  Manager *manager() const { return manager_; }
760e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
77b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov  virtual KeyValueStore GetProvider(Error *error);
78b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov
790cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // Initializes a callback that will invoke OnConnectTimeout after
800cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // |timeout_seconds|. The timeout will not be restarted if it's already
810cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // scheduled.
820cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  void StartConnectTimeout(int timeout_seconds);
83602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // Cancels the connect timeout callback, if any, previously scheduled through
84602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // StartConnectTimeout.
85602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  void StopConnectTimeout();
86602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // Returns true if a connect timeout is scheduled, false otherwise.
87602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  bool IsConnectTimeoutStarted() const;
88602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
89a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // Called if a connect timeout scheduled through StartConnectTimeout
90a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // fires. Cancels the timeout callback.
91a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  virtual void OnConnectTimeout();
92a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov
930cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  int connect_timeout_seconds() const { return connect_timeout_seconds_; }
94602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
950cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov private:
960cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  friend class VPNDriverTest;
97602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
98df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  void ClearMappedStringProperty(const size_t &index, Error *error);
99df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  void ClearMappedStringsProperty(const size_t &index, Error *error);
100df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  std::string GetMappedStringProperty(const size_t &index, Error *error);
101df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  std::vector<std::string> GetMappedStringsProperty(
102df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart      const size_t &index, Error *error);
103df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  bool SetMappedStringProperty(
104b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov      const size_t &index, const std::string &value, Error *error);
105df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  bool SetMappedStringsProperty(
106df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart      const size_t &index, const std::vector<std::string> &value, Error *error);
107b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
108602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  base::WeakPtrFactory<VPNDriver> weak_ptr_factory_;
109602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  EventDispatcher *dispatcher_;
1100e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  Manager *manager_;
111b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  const Property * const properties_;
112b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  const size_t property_count_;
113b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  KeyValueStore args_;
114b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
115602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  base::CancelableClosure connect_timeout_callback_;
116602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  int connect_timeout_seconds_;
117602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
118b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  DISALLOW_COPY_AND_ASSIGN(VPNDriver);
11933af05c849e0888b15222da38b55515784b821c7Darin Petkov};
12033af05c849e0888b15222da38b55515784b821c7Darin Petkov
12133af05c849e0888b15222da38b55515784b821c7Darin Petkov}  // namespace shill
12233af05c849e0888b15222da38b55515784b821c7Darin Petkov
123a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov#endif  // SHILL_VPN_DRIVER_H_
124