1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/network/network_type_pattern.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/network/network_event_log.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos {
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPatternDefault[] = "PatternDefault";
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPatternEthernet[] = "PatternEthernet";
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPatternWireless[] = "PatternWireless";
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPatternMobile[] = "PatternMobile";
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPatternNonVirtual[] = "PatternNonVirtual";
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum NetworkTypeBitFlag {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeNone = 0,
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeEthernet = 1 << 0,
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeWifi = 1 << 1,
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeWimax = 1 << 2,
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeCellular = 1 << 3,
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeVPN = 1 << 4,
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeEthernetEap = 1 << 5,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  kNetworkTypeBluetooth = 1 << 6
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct ShillToBitFlagEntry {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char* shill_network_type;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NetworkTypeBitFlag bit_flag;
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} shill_type_to_flag[] = {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeEthernet, kNetworkTypeEthernet },
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeEthernetEap, kNetworkTypeEthernetEap },
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeWifi, kNetworkTypeWifi },
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeWimax, kNetworkTypeWimax },
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeCellular, kNetworkTypeCellular },
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeVPN, kNetworkTypeVPN },
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  { shill::kTypeBluetooth, kNetworkTypeBluetooth }
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypeBitFlag ShillNetworkTypeToFlag(const std::string& shill_type) {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(shill_type_to_flag); ++i) {
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (shill_type_to_flag[i].shill_network_type == shill_type)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return shill_type_to_flag[i].bit_flag;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NET_LOG_ERROR("ShillNetworkTypeToFlag", "Unknown type: " + shill_type);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return kNetworkTypeNone;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Default() {
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(~0);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Wireless() {
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeWifi | kNetworkTypeWimax |
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            kNetworkTypeCellular);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Mobile() {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeCellular | kNetworkTypeWimax);
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::NonVirtual() {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(~kNetworkTypeVPN);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Ethernet() {
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeEthernet);
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::WiFi() {
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeWifi);
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Cellular() {
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeCellular);
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::VPN() {
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeVPN);
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Wimax() {
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(kNetworkTypeWimax);
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern NetworkTypePattern::Primitive(
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& shill_network_type) {
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return NetworkTypePattern(ShillNetworkTypeToFlag(shill_network_type));
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NetworkTypePattern::Equals(const NetworkTypePattern& other) const {
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return pattern_ == other.pattern_;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NetworkTypePattern::MatchesType(
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& shill_network_type) const {
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return MatchesPattern(Primitive(shill_network_type));
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NetworkTypePattern::MatchesPattern(
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const NetworkTypePattern& other_pattern) const {
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(other_pattern))
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return pattern_ & other_pattern.pattern_;
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string NetworkTypePattern::ToDebugString() const {
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(Default()))
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return kPatternDefault;
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(Ethernet()))
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return kPatternEthernet;
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(Wireless()))
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return kPatternWireless;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(Mobile()))
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return kPatternMobile;
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (Equals(NonVirtual()))
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return kPatternNonVirtual;
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string str;
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(shill_type_to_flag); ++i) {
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!(pattern_ & shill_type_to_flag[i].bit_flag))
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      continue;
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!str.empty())
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      str += "|";
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    str += shill_type_to_flag[i].shill_network_type;
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return str;
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkTypePattern::NetworkTypePattern(int pattern) : pattern_(pattern) {}
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace chromeos
150