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