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