1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 1633af05c849e0888b15222da38b55515784b821c7Darin Petkov 172240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#ifndef SHILL_VPN_VPN_DRIVER_H_ 182240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#define SHILL_VPN_VPN_DRIVER_H_ 1933af05c849e0888b15222da38b55515784b821c7Darin Petkov 20ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart#include <string> 218a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector> 22ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart 23602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/cancelable_callback.h> 24cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h> 25602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/memory/weak_ptr.h> 260e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include <gtest/gtest_prod.h> // for FRIEND_TEST 2733af05c849e0888b15222da38b55515784b821c7Darin Petkov 28b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/accessor_interface.h" 29b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/key_value_store.h" 3079d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov#include "shill/refptr_types.h" 3179d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov 3233af05c849e0888b15222da38b55515784b821c7Darin Petkovnamespace shill { 3333af05c849e0888b15222da38b55515784b821c7Darin Petkov 3433af05c849e0888b15222da38b55515784b821c7Darin Petkovclass Error; 35602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkovclass EventDispatcher; 360e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkovclass Manager; 37ebd3856da9d213154f3c85a71e4ec8e8fce3b9eaPaul Stewartclass PropertyStore; 38f3c71d70885fdddff8d71db75878c1310af28f9dDarin Petkovclass StoreInterface; 3933af05c849e0888b15222da38b55515784b821c7Darin Petkov 4033af05c849e0888b15222da38b55515784b821c7Darin Petkovclass VPNDriver { 4133af05c849e0888b15222da38b55515784b821c7Darin Petkov public: 42b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov virtual ~VPNDriver(); 4333af05c849e0888b15222da38b55515784b821c7Darin Petkov 44e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual bool ClaimInterface(const std::string& link_name, 45ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart int interface_index) = 0; 46e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual void Connect(const VPNServiceRefPtr& service, Error* error) = 0; 476aa2187f18e5a9ba3d6d475669cd27dfee4d92bdDarin Petkov virtual void Disconnect() = 0; 4839964fa3426450903d2640046e562708aeda0a30Paul Stewart virtual std::string GetProviderType() const = 0; 49b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 50a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov // Invoked by VPNService when the underlying connection disconnects. 51a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov virtual void OnConnectionDisconnected() = 0; 52a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov 53e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual void InitPropertyStore(PropertyStore* store); 54b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 55e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual bool Load(StoreInterface* storage, const std::string& storage_id); 56e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual bool Save(StoreInterface* storage, 57e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const std::string& storage_id, 58cb71529cc0432935aff005726c81df109d1dc710Darin Petkov bool save_credentials); 59cb71529cc0432935aff005726c81df109d1dc710Darin Petkov virtual void UnloadCredentials(); 60b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 619c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov std::string GetHost() const; 629c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov 63e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart KeyValueStore* args() { return &args_; } 64e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const KeyValueStore* const_args() const { return &args_; } 65b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 66b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov protected: 67b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov struct Property { 68b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov enum Flags { 69cb71529cc0432935aff005726c81df109d1dc710Darin Petkov kEphemeral = 1 << 0, // Never load or save. 70cb71529cc0432935aff005726c81df109d1dc710Darin Petkov kCredential = 1 << 1, // Save if saving credentials (crypted). 71cb71529cc0432935aff005726c81df109d1dc710Darin Petkov kWriteOnly = 1 << 2, // Never read over RPC. 72df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart kArray = 1 << 3, // Property is an array of strings. 73b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov }; 74b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 75e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const char* property; 76b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov int flags; 77b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov }; 78b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 790cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov static const int kDefaultConnectTimeoutSeconds; 800cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov 81e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart VPNDriver(EventDispatcher* dispatcher, 82e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart Manager* manager, 83e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const Property* properties, 840e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov size_t property_count); 850e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov 86e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart EventDispatcher* dispatcher() const { return dispatcher_; } 87e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart Manager* manager() const { return manager_; } 880e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov 89e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart virtual KeyValueStore GetProvider(Error* error); 90b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov 910cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov // Initializes a callback that will invoke OnConnectTimeout after 920cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov // |timeout_seconds|. The timeout will not be restarted if it's already 930cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov // scheduled. 940cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov void StartConnectTimeout(int timeout_seconds); 95602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov // Cancels the connect timeout callback, if any, previously scheduled through 96602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov // StartConnectTimeout. 97602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov void StopConnectTimeout(); 98602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov // Returns true if a connect timeout is scheduled, false otherwise. 99602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov bool IsConnectTimeoutStarted() const; 100602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov 101a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov // Called if a connect timeout scheduled through StartConnectTimeout 102a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov // fires. Cancels the timeout callback. 103a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov virtual void OnConnectTimeout(); 104a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov 1050cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov int connect_timeout_seconds() const { return connect_timeout_seconds_; } 106602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov 1070cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov private: 1080cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov friend class VPNDriverTest; 109602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov 110e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart void ClearMappedStringProperty(const size_t& index, Error* error); 111e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart void ClearMappedStringsProperty(const size_t& index, Error* error); 112e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart std::string GetMappedStringProperty(const size_t& index, Error* error); 113df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart std::vector<std::string> GetMappedStringsProperty( 114e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const size_t& index, Error* error); 115df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart bool SetMappedStringProperty( 116e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const size_t& index, const std::string& value, Error* error); 117df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart bool SetMappedStringsProperty( 118e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const size_t& index, const std::vector<std::string>& value, Error* error); 119b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 120602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov base::WeakPtrFactory<VPNDriver> weak_ptr_factory_; 121e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart EventDispatcher* dispatcher_; 122e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart Manager* manager_; 123e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart const Property* const properties_; 124b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov const size_t property_count_; 125b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov KeyValueStore args_; 126b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov 127602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov base::CancelableClosure connect_timeout_callback_; 128602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov int connect_timeout_seconds_; 129602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov 130b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov DISALLOW_COPY_AND_ASSIGN(VPNDriver); 13133af05c849e0888b15222da38b55515784b821c7Darin Petkov}; 13233af05c849e0888b15222da38b55515784b821c7Darin Petkov 13333af05c849e0888b15222da38b55515784b821c7Darin Petkov} // namespace shill 13433af05c849e0888b15222da38b55515784b821c7Darin Petkov 1352240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#endif // SHILL_VPN_VPN_DRIVER_H_ 136