blob: e2e8a5981267c2cabe8384ef31ed899076bb96db [file] [log] [blame]
Paul Stewart20088d82012-02-16 06:58:55 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewartfdd16072011-09-16 12:41:35 -07002// 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/technology.h"
6
Paul Stewart20088d82012-02-16 06:58:55 -08007#include <set>
Paul Stewartfdd16072011-09-16 12:41:35 -07008#include <string>
Paul Stewart1b253142012-01-26 14:05:52 -08009#include <vector>
Paul Stewartfdd16072011-09-16 12:41:35 -070010
Eric Shienbrood3e20a232012-02-16 11:35:56 -050011#include <base/stl_util.h>
Ben Chana0ddf462014-02-06 11:32:42 -080012#include <base/strings/string_split.h>
Paul Stewartfdd16072011-09-16 12:41:35 -070013#include <chromeos/dbus/service_constants.h>
14
Paul Stewart20088d82012-02-16 06:58:55 -080015#include "shill/error.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070016#include "shill/logging.h"
Paul Stewart20088d82012-02-16 06:58:55 -080017
Paul Stewartfdd16072011-09-16 12:41:35 -070018namespace shill {
19
Paul Stewart20088d82012-02-16 06:58:55 -080020using std::set;
Paul Stewartfdd16072011-09-16 12:41:35 -070021using std::string;
Paul Stewart1b253142012-01-26 14:05:52 -080022using std::vector;
Paul Stewartfdd16072011-09-16 12:41:35 -070023
Paul Stewartca876ee2012-04-21 08:55:58 -070024const char Technology::kLoopbackName[] = "loopback";
25const char Technology::kTunnelName[] = "tunnel";
26const char Technology::kPPPName[] = "ppp";
27const char Technology::kUnknownName[] = "unknown";
Paul Stewartfdd16072011-09-16 12:41:35 -070028
Gaurav Shah435de2c2011-11-17 19:01:07 -080029// static
Paul Stewart1b253142012-01-26 14:05:52 -080030Technology::Identifier Technology::IdentifierFromName(const string &name) {
Ben Chan923a5022013-09-20 11:23:23 -070031 if (name == kTypeEthernet) {
Paul Stewartfdd16072011-09-16 12:41:35 -070032 return kEthernet;
Paul Stewart44dba7b2013-04-16 09:43:42 -070033 } else if (name == kTypeEthernetEap) {
34 return kEthernetEap;
Ben Chan923a5022013-09-20 11:23:23 -070035 } else if (name == kTypeWifi) {
Paul Stewartfdd16072011-09-16 12:41:35 -070036 return kWifi;
Ben Chan923a5022013-09-20 11:23:23 -070037 } else if (name == kTypeWimax) {
Ben Chan46af1272012-05-01 10:34:00 -070038 return kWiMax;
Ben Chan923a5022013-09-20 11:23:23 -070039 } else if (name == kTypeCellular) {
Paul Stewartfdd16072011-09-16 12:41:35 -070040 return kCellular;
Ben Chan923a5022013-09-20 11:23:23 -070041 } else if (name == kTypeVPN) {
Darin Petkov33af05c2012-02-28 10:10:30 +010042 return kVPN;
Paul Stewarte81eb702012-04-11 15:04:53 -070043 } else if (name == kLoopbackName) {
44 return kLoopback;
Paul Stewartcba0f7f2012-02-29 16:33:05 -080045 } else if (name == kTunnelName) {
46 return kTunnel;
Paul Stewartca876ee2012-04-21 08:55:58 -070047 } else if (name == kPPPName) {
48 return kPPP;
Paul Stewartfdd16072011-09-16 12:41:35 -070049 } else {
50 return kUnknown;
51 }
52}
53
Gaurav Shah435de2c2011-11-17 19:01:07 -080054// static
Paul Stewart1b253142012-01-26 14:05:52 -080055string Technology::NameFromIdentifier(Technology::Identifier id) {
Paul Stewartfdd16072011-09-16 12:41:35 -070056 if (id == kEthernet) {
Ben Chan923a5022013-09-20 11:23:23 -070057 return kTypeEthernet;
Paul Stewart44dba7b2013-04-16 09:43:42 -070058 } else if (id == kEthernetEap) {
59 return kTypeEthernetEap;
Paul Stewartfdd16072011-09-16 12:41:35 -070060 } else if (id == kWifi) {
Ben Chan923a5022013-09-20 11:23:23 -070061 return kTypeWifi;
Ben Chan46af1272012-05-01 10:34:00 -070062 } else if (id == kWiMax) {
Ben Chan923a5022013-09-20 11:23:23 -070063 return kTypeWimax;
Paul Stewartfdd16072011-09-16 12:41:35 -070064 } else if (id == kCellular) {
Ben Chan923a5022013-09-20 11:23:23 -070065 return kTypeCellular;
Darin Petkov33af05c2012-02-28 10:10:30 +010066 } else if (id == kVPN) {
Ben Chan923a5022013-09-20 11:23:23 -070067 return kTypeVPN;
Paul Stewarte81eb702012-04-11 15:04:53 -070068 } else if (id == kLoopback) {
69 return kLoopbackName;
Paul Stewartcba0f7f2012-02-29 16:33:05 -080070 } else if (id == kTunnel) {
71 return kTunnelName;
Paul Stewartca876ee2012-04-21 08:55:58 -070072 } else if (id == kPPP) {
73 return kPPPName;
Paul Stewartfdd16072011-09-16 12:41:35 -070074 } else {
75 return kUnknownName;
76 }
77}
78
Paul Stewart1b253142012-01-26 14:05:52 -080079// static
80Technology::Identifier Technology::IdentifierFromStorageGroup(
81 const string &group) {
82 vector<string> group_parts;
83 base::SplitString(group, '_', &group_parts);
84 if (group_parts.empty()) {
85 return kUnknown;
86 }
87 return IdentifierFromName(group_parts[0]);
88}
89
Paul Stewart20088d82012-02-16 06:58:55 -080090// static
91bool Technology::GetTechnologyVectorFromString(
92 const string &technologies_string,
93 vector<Identifier> *technologies_vector,
94 Error *error) {
Ben Chanc12cf662012-04-05 14:47:18 -070095 CHECK(technologies_vector);
96 CHECK(error);
97
Paul Stewart20088d82012-02-16 06:58:55 -080098 vector<string> technology_parts;
Paul Stewart20088d82012-02-16 06:58:55 -080099 set<Technology::Identifier> seen;
Ben Chanc12cf662012-04-05 14:47:18 -0700100 technologies_vector->clear();
101
Paul Stewart5ad16062013-02-21 18:10:48 -0800102 // Check if |technologies_string| is empty as some versions of
103 // base::SplitString return a vector with one empty string when given an
104 // empty string.
Ben Chanc12cf662012-04-05 14:47:18 -0700105 if (!technologies_string.empty())
106 base::SplitString(technologies_string, ',', &technology_parts);
Paul Stewart20088d82012-02-16 06:58:55 -0800107
Paul Stewart6db7b242014-05-02 15:34:21 -0700108 for (const auto &name : technology_parts) {
109 Technology::Identifier identifier = Technology::IdentifierFromName(name);
Paul Stewart20088d82012-02-16 06:58:55 -0800110
111 if (identifier == Technology::kUnknown) {
112 Error::PopulateAndLog(error, Error::kInvalidArguments,
Paul Stewart6db7b242014-05-02 15:34:21 -0700113 name + " is an unknown technology name");
Paul Stewart20088d82012-02-16 06:58:55 -0800114 return false;
115 }
116
117 if (ContainsKey(seen, identifier)) {
118 Error::PopulateAndLog(error, Error::kInvalidArguments,
Paul Stewart6db7b242014-05-02 15:34:21 -0700119 name + " is duplicated in the list");
Paul Stewart20088d82012-02-16 06:58:55 -0800120 return false;
121 }
122 seen.insert(identifier);
123 technologies_vector->push_back(identifier);
124 }
125
126 return true;
127}
128
Ben Chan5086b972013-01-15 21:51:38 -0800129// static
130bool Technology::IsPrimaryConnectivityTechnology(Identifier technology) {
131 return (technology == kCellular ||
132 technology == kEthernet ||
133 technology == kWifi ||
134 technology == kWiMax);
135}
136
Paul Stewartfdd16072011-09-16 12:41:35 -0700137} // namespace shill