vpn_driver.h revision 0e9735db6db73a48c4b0cc3151a5272e3a8b9d2f
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
533af05c849e0888b15222da38b55515784b821c7Darin Petkov#ifndef SHILL_VPN_DRIVER_
633af05c849e0888b15222da38b55515784b821c7Darin Petkov#define SHILL_VPN_DRIVER_
733af05c849e0888b15222da38b55515784b821c7Darin Petkov
8ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart#include <string>
9ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart
1033af05c849e0888b15222da38b55515784b821c7Darin Petkov#include <base/basictypes.h>
110e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
1233af05c849e0888b15222da38b55515784b821c7Darin Petkov
13b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/accessor_interface.h"
140e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include "shill/ipconfig.h"
15b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/key_value_store.h"
1679d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov#include "shill/refptr_types.h"
1779d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov
1833af05c849e0888b15222da38b55515784b821c7Darin Petkovnamespace shill {
1933af05c849e0888b15222da38b55515784b821c7Darin Petkov
2033af05c849e0888b15222da38b55515784b821c7Darin Petkovclass Error;
210e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkovclass Manager;
22ebd3856da9d213154f3c85a71e4ec8e8fce3b9eaPaul Stewartclass PropertyStore;
23f3c71d70885fdddff8d71db75878c1310af28f9dDarin Petkovclass StoreInterface;
2433af05c849e0888b15222da38b55515784b821c7Darin Petkov
2533af05c849e0888b15222da38b55515784b821c7Darin Petkovclass VPNDriver {
2633af05c849e0888b15222da38b55515784b821c7Darin Petkov public:
27b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual ~VPNDriver();
2833af05c849e0888b15222da38b55515784b821c7Darin Petkov
29ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart  virtual bool ClaimInterface(const std::string &link_name,
30ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart                              int interface_index) = 0;
3179d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov  virtual void Connect(const VPNServiceRefPtr &service, Error *error) = 0;
326aa2187f18e5a9ba3d6d475669cd27dfee4d92bdDarin Petkov  virtual void Disconnect() = 0;
3339964fa3426450903d2640046e562708aeda0a30Paul Stewart  virtual std::string GetProviderType() const = 0;
34b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
35b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual void InitPropertyStore(PropertyStore *store);
36b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
37b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual bool Load(StoreInterface *storage, const std::string &storage_id);
38b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual bool Save(StoreInterface *storage, const std::string &storage_id);
39b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
40b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  KeyValueStore *args() { return &args_; }
41b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
42b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov protected:
43b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  struct Property {
44b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    enum Flags {
45b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov      kEphemeral = 1 << 0,
46b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov      kCrypted = 1 << 1,
47b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    };
48b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
49b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    const char *property;
50b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    int flags;
51b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  };
52b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
530e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  VPNDriver(Manager *manager,
540e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov            const Property *properties,
550e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov            size_t property_count);
560e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
570e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  Manager *manager() const { return manager_; }
580e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
590e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  bool PinHostRoute(const IPConfig::Properties &properties);
60b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
61b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov private:
620e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  FRIEND_TEST(VPNDriverTest, PinHostRoute);
630e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
64b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  Stringmap GetProvider(Error *error);
65b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  void ClearMappedProperty(const size_t &index, Error *error);
66b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  std::string GetMappedProperty(const size_t &index, Error *error);
67b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  void SetMappedProperty(
68b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov      const size_t &index, const std::string &value, Error *error);
69b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
700e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov  Manager *manager_;
71b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  const Property * const properties_;
72b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  const size_t property_count_;
73b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  KeyValueStore args_;
74b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
75b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  DISALLOW_COPY_AND_ASSIGN(VPNDriver);
7633af05c849e0888b15222da38b55515784b821c7Darin Petkov};
7733af05c849e0888b15222da38b55515784b821c7Darin Petkov
7833af05c849e0888b15222da38b55515784b821c7Darin Petkov}  // namespace shill
7933af05c849e0888b15222da38b55515784b821c7Darin Petkov
8033af05c849e0888b15222da38b55515784b821c7Darin Petkov#endif  // SHILL_VPN_DRIVER_
81