blob: 8ac7b388686188759005d1c7cba6a3cc4f776a0d [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#include "shill/vpn_provider.h"
6
7#include <base/logging.h>
8#include <chromeos/dbus/service_constants.h>
9
10#include "shill/error.h"
Paul Stewartca6abd42012-03-01 15:45:29 -080011#include "shill/manager.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010012#include "shill/openvpn_driver.h"
13#include "shill/vpn_service.h"
14
15using std::string;
Paul Stewartca6abd42012-03-01 15:45:29 -080016using std::vector;
Darin Petkov33af05c2012-02-28 10:10:30 +010017
18namespace shill {
19
20VPNProvider::VPNProvider(ControlInterface *control_interface,
21 EventDispatcher *dispatcher,
22 Metrics *metrics,
23 Manager *manager)
24 : control_interface_(control_interface),
25 dispatcher_(dispatcher),
26 metrics_(metrics),
27 manager_(manager) {}
28
29VPNProvider::~VPNProvider() {}
30
31void VPNProvider::Start() {}
32
33void VPNProvider::Stop() {}
34
35VPNServiceRefPtr VPNProvider::GetService(const KeyValueStore &args,
36 Error *error) {
37 VLOG(2) << __func__;
Darin Petkov7f060332012-03-14 11:46:47 +010038 string type = args.LookupString(flimflam::kProviderTypeProperty, "");
39 if (type.empty()) {
Darin Petkov33af05c2012-02-28 10:10:30 +010040 Error::PopulateAndLog(
41 error, Error::kNotSupported, "Missing VPN type property.");
42 return NULL;
43 }
Paul Stewartca6abd42012-03-01 15:45:29 -080044
Darin Petkov02867712012-03-12 14:25:05 +010045 string storage_id = VPNService::CreateStorageIdentifier(args, error);
46 if (storage_id.empty()) {
47 return NULL;
48 }
49
Darin Petkov33af05c2012-02-28 10:10:30 +010050 scoped_ptr<VPNDriver> driver;
51 if (type == flimflam::kProviderOpenVpn) {
Darin Petkovf20994f2012-03-05 16:12:19 +010052 driver.reset(new OpenVPNDriver(
53 control_interface_, dispatcher_, metrics_, manager_,
Darin Petkov36a3ace2012-03-06 17:22:14 +010054 manager_->device_info(), manager_->glib(), args));
Darin Petkov33af05c2012-02-28 10:10:30 +010055 } else {
56 Error::PopulateAndLog(
57 error, Error::kNotSupported, "Unsupported VPN type: " + type);
58 return NULL;
59 }
Paul Stewartca6abd42012-03-01 15:45:29 -080060
Darin Petkov79d74c92012-03-07 17:20:32 +010061 VPNServiceRefPtr service = new VPNService(
62 control_interface_, dispatcher_, metrics_, manager_, driver.release());
Darin Petkov02867712012-03-12 14:25:05 +010063 service->set_storage_id(storage_id);
Darin Petkov7f060332012-03-14 11:46:47 +010064 string name = args.LookupString(flimflam::kProviderNameProperty, "");
65 if (!name.empty()) {
66 service->set_friendly_name(name);
67 }
Darin Petkov79d74c92012-03-07 17:20:32 +010068 services_.push_back(service);
69 manager_->RegisterService(service);
70 return service;
Paul Stewartca6abd42012-03-01 15:45:29 -080071}
72
73bool VPNProvider::OnDeviceInfoAvailable(const string &link_name,
74 int interface_index) {
75 for (vector<VPNServiceRefPtr>::const_iterator it = services_.begin();
76 it != services_.end();
77 ++it) {
78 if ((*it)->driver()->ClaimInterface(link_name, interface_index)) {
79 return true;
80 }
81 }
82
83 return false;
Darin Petkov33af05c2012-02-28 10:10:30 +010084}
85
86} // namespace shill