OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/network/network_state_handler.h" | 5 #include "chromeos/network/network_state_handler.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
15 #include "chromeos/network/device_state.h" | 15 #include "chromeos/network/device_state.h" |
16 #include "chromeos/network/favorite_state.h" | 16 #include "chromeos/network/favorite_state.h" |
17 #include "chromeos/network/managed_state.h" | 17 #include "chromeos/network/managed_state.h" |
18 #include "chromeos/network/network_event_log.h" | 18 #include "chromeos/network/network_event_log.h" |
19 #include "chromeos/network/network_state.h" | 19 #include "chromeos/network/network_state.h" |
20 #include "chromeos/network/network_state_handler_observer.h" | 20 #include "chromeos/network/network_state_handler_observer.h" |
21 #include "chromeos/network/shill_property_handler.h" | 21 #include "chromeos/network/shill_property_handler.h" |
| 22 #include "chromeos/network/shill_property_util.h" |
22 #include "third_party/cros_system_api/dbus/service_constants.h" | 23 #include "third_party/cros_system_api/dbus/service_constants.h" |
23 | 24 |
24 namespace chromeos { | 25 namespace chromeos { |
25 | 26 |
26 namespace { | 27 namespace { |
27 | 28 |
28 // Returns true if |network->type()| == |match_type|, or it matches one of the | |
29 // following special match types: | |
30 // * kMatchTypeDefault matches any network (i.e. the first instance) | |
31 // * kMatchTypeNonVirtual matches non virtual networks | |
32 // * kMatchTypeWireless matches wireless networks | |
33 // * kMatchTypeMobile matches cellular or wimax networks | |
34 bool ManagedStateMatchesType(const ManagedState* managed, | |
35 const std::string& match_type) { | |
36 const std::string& type = managed->type(); | |
37 if (match_type == NetworkStateHandler::kMatchTypeDefault) | |
38 return true; | |
39 if (match_type == type) | |
40 return true; | |
41 if (match_type == NetworkStateHandler::kMatchTypeNonVirtual && | |
42 type != flimflam::kTypeVPN) { | |
43 return true; | |
44 } | |
45 if (match_type == NetworkStateHandler::kMatchTypeWireless && | |
46 type != flimflam::kTypeEthernet && type != flimflam::kTypeVPN) { | |
47 return true; | |
48 } | |
49 if (match_type == NetworkStateHandler::kMatchTypeMobile && | |
50 (type == flimflam::kTypeCellular || type == flimflam::kTypeWimax)) { | |
51 return true; | |
52 } | |
53 return false; | |
54 } | |
55 | |
56 bool ConnectionStateChanged(NetworkState* network, | 29 bool ConnectionStateChanged(NetworkState* network, |
57 const std::string& prev_connection_state) { | 30 const std::string& prev_connection_state) { |
58 return (network->connection_state() != prev_connection_state) && | 31 return (network->connection_state() != prev_connection_state) && |
59 (network->connection_state() != flimflam::kStateIdle || | 32 (network->connection_state() != flimflam::kStateIdle || |
60 !prev_connection_state.empty()); | 33 !prev_connection_state.empty()); |
61 } | 34 } |
62 | 35 |
63 std::string GetManagedStateLogType(const ManagedState* state) { | 36 std::string GetManagedStateLogType(const ManagedState* state) { |
64 switch (state->managed_type()) { | 37 switch (state->managed_type()) { |
65 case ManagedState::MANAGED_TYPE_NETWORK: | 38 case ManagedState::MANAGED_TYPE_NETWORK: |
66 return "Network"; | 39 return "Network"; |
67 case ManagedState::MANAGED_TYPE_FAVORITE: | 40 case ManagedState::MANAGED_TYPE_FAVORITE: |
68 return "Favorite"; | 41 return "Favorite"; |
69 case ManagedState::MANAGED_TYPE_DEVICE: | 42 case ManagedState::MANAGED_TYPE_DEVICE: |
70 return "Device"; | 43 return "Device"; |
71 } | 44 } |
72 NOTREACHED(); | 45 NOTREACHED(); |
73 return ""; | 46 return ""; |
74 } | 47 } |
75 | 48 |
76 std::string GetManagedStateLogName(const ManagedState* state) { | 49 std::string GetManagedStateLogName(const ManagedState* state) { |
77 if (!state) | 50 if (!state) |
78 return "None"; | 51 return "None"; |
79 return base::StringPrintf("%s (%s)", state->name().c_str(), | 52 return base::StringPrintf("%s (%s)", state->name().c_str(), |
80 state->path().c_str()); | 53 state->path().c_str()); |
81 } | 54 } |
82 | 55 |
83 } // namespace | 56 } // namespace |
84 | 57 |
85 const char NetworkStateHandler::kMatchTypeDefault[] = "default"; | |
86 const char NetworkStateHandler::kMatchTypeWireless[] = "wireless"; | |
87 const char NetworkStateHandler::kMatchTypeMobile[] = "mobile"; | |
88 const char NetworkStateHandler::kMatchTypeNonVirtual[] = "non-virtual"; | |
89 const char NetworkStateHandler::kDefaultCheckPortalList[] = | 58 const char NetworkStateHandler::kDefaultCheckPortalList[] = |
90 "ethernet,wifi,cellular"; | 59 "ethernet,wifi,cellular"; |
91 | 60 |
92 NetworkStateHandler::NetworkStateHandler() { | 61 NetworkStateHandler::NetworkStateHandler() { |
93 } | 62 } |
94 | 63 |
95 NetworkStateHandler::~NetworkStateHandler() { | 64 NetworkStateHandler::~NetworkStateHandler() { |
96 STLDeleteContainerPointers(network_list_.begin(), network_list_.end()); | 65 STLDeleteContainerPointers(network_list_.begin(), network_list_.end()); |
97 STLDeleteContainerPointers(favorite_list_.begin(), favorite_list_.end()); | 66 STLDeleteContainerPointers(favorite_list_.begin(), favorite_list_.end()); |
98 STLDeleteContainerPointers(device_list_.begin(), device_list_.end()); | 67 STLDeleteContainerPointers(device_list_.begin(), device_list_.end()); |
(...skipping 30 matching lines...) Expand all Loading... |
129 network_event_log::LOG_LEVEL_DEBUG, | 98 network_event_log::LOG_LEVEL_DEBUG, |
130 "NetworkStateHandler::RemoveObserver", ""); | 99 "NetworkStateHandler::RemoveObserver", ""); |
131 } | 100 } |
132 | 101 |
133 void NetworkStateHandler::UpdateManagerProperties() { | 102 void NetworkStateHandler::UpdateManagerProperties() { |
134 NET_LOG_USER("UpdateManagerProperties", ""); | 103 NET_LOG_USER("UpdateManagerProperties", ""); |
135 shill_property_handler_->UpdateManagerProperties(); | 104 shill_property_handler_->UpdateManagerProperties(); |
136 } | 105 } |
137 | 106 |
138 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState( | 107 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState( |
139 const std::string& type) const { | 108 const NetworkTypePattern& type) const { |
140 std::string technology = GetTechnologyForType(type); | 109 std::string technology = GetTechnologyForType(type); |
141 TechnologyState state; | 110 TechnologyState state; |
142 if (shill_property_handler_->IsTechnologyEnabled(technology)) | 111 if (shill_property_handler_->IsTechnologyEnabled(technology)) |
143 state = TECHNOLOGY_ENABLED; | 112 state = TECHNOLOGY_ENABLED; |
144 else if (shill_property_handler_->IsTechnologyEnabling(technology)) | 113 else if (shill_property_handler_->IsTechnologyEnabling(technology)) |
145 state = TECHNOLOGY_ENABLING; | 114 state = TECHNOLOGY_ENABLING; |
146 else if (shill_property_handler_->IsTechnologyUninitialized(technology)) | 115 else if (shill_property_handler_->IsTechnologyUninitialized(technology)) |
147 state = TECHNOLOGY_UNINITIALIZED; | 116 state = TECHNOLOGY_UNINITIALIZED; |
148 else if (shill_property_handler_->IsTechnologyAvailable(technology)) | 117 else if (shill_property_handler_->IsTechnologyAvailable(technology)) |
149 state = TECHNOLOGY_AVAILABLE; | 118 state = TECHNOLOGY_AVAILABLE; |
150 else | 119 else |
151 state = TECHNOLOGY_UNAVAILABLE; | 120 state = TECHNOLOGY_UNAVAILABLE; |
152 VLOG(2) << "GetTechnologyState: " << type << " = " << state; | 121 VLOG(2) << "GetTechnologyState: " << type.ToDebugString() << " = " << state; |
153 return state; | 122 return state; |
154 } | 123 } |
155 | 124 |
156 void NetworkStateHandler::SetTechnologyEnabled( | 125 void NetworkStateHandler::SetTechnologyEnabled( |
157 const std::string& type, | 126 const NetworkTypePattern& type, |
158 bool enabled, | 127 bool enabled, |
159 const network_handler::ErrorCallback& error_callback) { | 128 const network_handler::ErrorCallback& error_callback) { |
160 std::string technology = GetTechnologyForType(type); | 129 std::string technology = GetTechnologyForType(type); |
161 NET_LOG_USER("SetTechnologyEnabled", | 130 NET_LOG_USER("SetTechnologyEnabled", |
162 base::StringPrintf("%s:%d", technology.c_str(), enabled)); | 131 base::StringPrintf("%s:%d", technology.c_str(), enabled)); |
163 shill_property_handler_->SetTechnologyEnabled( | 132 shill_property_handler_->SetTechnologyEnabled( |
164 technology, enabled, error_callback); | 133 technology, enabled, error_callback); |
165 // Signal Technology state changed -> ENABLING | 134 // Signal Technology state changed -> ENABLING |
166 NotifyManagerPropertyChanged(); | 135 NotifyManagerPropertyChanged(); |
167 } | 136 } |
168 | 137 |
169 const DeviceState* NetworkStateHandler::GetDeviceState( | 138 const DeviceState* NetworkStateHandler::GetDeviceState( |
170 const std::string& device_path) const { | 139 const std::string& device_path) const { |
171 return GetModifiableDeviceState(device_path); | 140 return GetModifiableDeviceState(device_path); |
172 } | 141 } |
173 | 142 |
174 const DeviceState* NetworkStateHandler::GetDeviceStateByType( | 143 const DeviceState* NetworkStateHandler::GetDeviceStateByType( |
175 const std::string& type) const { | 144 const NetworkTypePattern& type) const { |
176 for (ManagedStateList::const_iterator iter = device_list_.begin(); | 145 for (ManagedStateList::const_iterator iter = device_list_.begin(); |
177 iter != device_list_.end(); ++iter) { | 146 iter != device_list_.end(); ++iter) { |
178 ManagedState* device = *iter; | 147 ManagedState* device = *iter; |
179 if (ManagedStateMatchesType(device, type)) | 148 if (device->Matches(type)) |
180 return device->AsDeviceState(); | 149 return device->AsDeviceState(); |
181 } | 150 } |
182 return NULL; | 151 return NULL; |
183 } | 152 } |
184 | 153 |
185 bool NetworkStateHandler::GetScanningByType(const std::string& type) const { | 154 bool NetworkStateHandler::GetScanningByType( |
| 155 const NetworkTypePattern& type) const { |
186 for (ManagedStateList::const_iterator iter = device_list_.begin(); | 156 for (ManagedStateList::const_iterator iter = device_list_.begin(); |
187 iter != device_list_.end(); ++iter) { | 157 iter != device_list_.end(); ++iter) { |
188 const DeviceState* device = (*iter)->AsDeviceState(); | 158 const DeviceState* device = (*iter)->AsDeviceState(); |
189 DCHECK(device); | 159 DCHECK(device); |
190 if (ManagedStateMatchesType(device, type) && device->scanning()) | 160 if (device->Matches(type) && device->scanning()) |
191 return true; | 161 return true; |
192 } | 162 } |
193 return false; | 163 return false; |
194 } | 164 } |
195 | 165 |
196 const NetworkState* NetworkStateHandler::GetNetworkState( | 166 const NetworkState* NetworkStateHandler::GetNetworkState( |
197 const std::string& service_path) const { | 167 const std::string& service_path) const { |
198 return GetModifiableNetworkState(service_path); | 168 return GetModifiableNetworkState(service_path); |
199 } | 169 } |
200 | 170 |
201 const NetworkState* NetworkStateHandler::DefaultNetwork() const { | 171 const NetworkState* NetworkStateHandler::DefaultNetwork() const { |
202 if (network_list_.empty()) | 172 if (network_list_.empty()) |
203 return NULL; | 173 return NULL; |
204 const NetworkState* network = network_list_.front()->AsNetworkState(); | 174 const NetworkState* network = network_list_.front()->AsNetworkState(); |
205 DCHECK(network); | 175 DCHECK(network); |
206 if (!network->IsConnectedState()) | 176 if (!network->IsConnectedState()) |
207 return NULL; | 177 return NULL; |
208 return network; | 178 return network; |
209 } | 179 } |
210 | 180 |
211 const NetworkState* NetworkStateHandler::ConnectedNetworkByType( | 181 const NetworkState* NetworkStateHandler::ConnectedNetworkByType( |
212 const std::string& type) const { | 182 const NetworkTypePattern& type) const { |
213 for (ManagedStateList::const_iterator iter = network_list_.begin(); | 183 for (ManagedStateList::const_iterator iter = network_list_.begin(); |
214 iter != network_list_.end(); ++iter) { | 184 iter != network_list_.end(); ++iter) { |
215 const NetworkState* network = (*iter)->AsNetworkState(); | 185 const NetworkState* network = (*iter)->AsNetworkState(); |
216 DCHECK(network); | 186 DCHECK(network); |
217 if (!network->IsConnectedState()) | 187 if (!network->IsConnectedState()) |
218 break; // Connected networks are listed first. | 188 break; // Connected networks are listed first. |
219 if (ManagedStateMatchesType(network, type)) | 189 if (network->Matches(type)) |
220 return network; | 190 return network; |
221 } | 191 } |
222 return NULL; | 192 return NULL; |
223 } | 193 } |
224 | 194 |
225 const NetworkState* NetworkStateHandler::ConnectingNetworkByType( | 195 const NetworkState* NetworkStateHandler::ConnectingNetworkByType( |
226 const std::string& type) const { | 196 const NetworkTypePattern& type) const { |
227 for (ManagedStateList::const_iterator iter = network_list_.begin(); | 197 for (ManagedStateList::const_iterator iter = network_list_.begin(); |
228 iter != network_list_.end(); ++iter) { | 198 iter != network_list_.end(); ++iter) { |
229 const NetworkState* network = (*iter)->AsNetworkState(); | 199 const NetworkState* network = (*iter)->AsNetworkState(); |
230 DCHECK(network); | 200 DCHECK(network); |
231 if (network->IsConnectedState()) | 201 if (network->IsConnectedState()) |
232 continue; | 202 continue; |
233 if (!network->IsConnectingState()) | 203 if (!network->IsConnectingState()) |
234 break; // Connected and connecting networks are listed first. | 204 break; // Connected and connecting networks are listed first. |
235 if (ManagedStateMatchesType(network, type)) | 205 if (network->Matches(type)) |
236 return network; | 206 return network; |
237 } | 207 } |
238 return NULL; | 208 return NULL; |
239 } | 209 } |
240 | 210 |
241 const NetworkState* NetworkStateHandler::FirstNetworkByType( | 211 const NetworkState* NetworkStateHandler::FirstNetworkByType( |
242 const std::string& type) const { | 212 const NetworkTypePattern& type) const { |
243 for (ManagedStateList::const_iterator iter = network_list_.begin(); | 213 for (ManagedStateList::const_iterator iter = network_list_.begin(); |
244 iter != network_list_.end(); ++iter) { | 214 iter != network_list_.end(); ++iter) { |
245 const NetworkState* network = (*iter)->AsNetworkState(); | 215 const NetworkState* network = (*iter)->AsNetworkState(); |
246 DCHECK(network); | 216 DCHECK(network); |
247 if (ManagedStateMatchesType(network, type)) | 217 if (network->Matches(type)) |
248 return network; | 218 return network; |
249 } | 219 } |
250 return NULL; | 220 return NULL; |
251 } | 221 } |
252 | 222 |
253 std::string NetworkStateHandler::HardwareAddressForType( | 223 std::string NetworkStateHandler::HardwareAddressForType( |
254 const std::string& type) const { | 224 const NetworkTypePattern& type) const { |
255 std::string result; | 225 std::string result; |
256 const NetworkState* network = ConnectedNetworkByType(type); | 226 const NetworkState* network = ConnectedNetworkByType(type); |
257 if (network) { | 227 if (network) { |
258 const DeviceState* device = GetDeviceState(network->device_path()); | 228 const DeviceState* device = GetDeviceState(network->device_path()); |
259 if (device) | 229 if (device) |
260 result = device->mac_address(); | 230 result = device->mac_address(); |
261 } | 231 } |
262 StringToUpperASCII(&result); | 232 StringToUpperASCII(&result); |
263 return result; | 233 return result; |
264 } | 234 } |
265 | 235 |
266 std::string NetworkStateHandler::FormattedHardwareAddressForType( | 236 std::string NetworkStateHandler::FormattedHardwareAddressForType( |
267 const std::string& type) const { | 237 const NetworkTypePattern& type) const { |
268 std::string address = HardwareAddressForType(type); | 238 std::string address = HardwareAddressForType(type); |
269 if (address.size() % 2 != 0) | 239 if (address.size() % 2 != 0) |
270 return address; | 240 return address; |
271 std::string result; | 241 std::string result; |
272 for (size_t i = 0; i < address.size(); ++i) { | 242 for (size_t i = 0; i < address.size(); ++i) { |
273 if ((i != 0) && (i % 2 == 0)) | 243 if ((i != 0) && (i % 2 == 0)) |
274 result.push_back(':'); | 244 result.push_back(':'); |
275 result.push_back(address[i]); | 245 result.push_back(address[i]); |
276 } | 246 } |
277 return result; | 247 return result; |
278 } | 248 } |
279 | 249 |
280 void NetworkStateHandler::GetNetworkList(NetworkStateList* list) const { | 250 void NetworkStateHandler::GetNetworkList(NetworkStateList* list) const { |
281 GetNetworkListByType(kMatchTypeDefault, list); | 251 GetNetworkListByType(NetworkTypePattern::Default(), list); |
282 } | 252 } |
283 | 253 |
284 void NetworkStateHandler::GetNetworkListByType(const std::string& type, | 254 void NetworkStateHandler::GetNetworkListByType(const NetworkTypePattern& type, |
285 NetworkStateList* list) const { | 255 NetworkStateList* list) const { |
286 DCHECK(list); | 256 DCHECK(list); |
287 list->clear(); | 257 list->clear(); |
288 for (ManagedStateList::const_iterator iter = network_list_.begin(); | 258 for (ManagedStateList::const_iterator iter = network_list_.begin(); |
289 iter != network_list_.end(); ++iter) { | 259 iter != network_list_.end(); ++iter) { |
290 if (!(*iter)->update_received()) | 260 if (!(*iter)->update_received()) |
291 continue; | 261 continue; |
292 const NetworkState* network = (*iter)->AsNetworkState(); | 262 const NetworkState* network = (*iter)->AsNetworkState(); |
293 DCHECK(network); | 263 DCHECK(network); |
294 if (ManagedStateMatchesType(network, type)) | 264 if (network->Matches(type)) |
295 list->push_back(network); | 265 list->push_back(network); |
296 } | 266 } |
297 } | 267 } |
298 | 268 |
299 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { | 269 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { |
300 DCHECK(list); | 270 DCHECK(list); |
301 list->clear(); | 271 list->clear(); |
302 for (ManagedStateList::const_iterator iter = device_list_.begin(); | 272 for (ManagedStateList::const_iterator iter = device_list_.begin(); |
303 iter != device_list_.end(); ++iter) { | 273 iter != device_list_.end(); ++iter) { |
304 if (!(*iter)->update_received()) | 274 if (!(*iter)->update_received()) |
(...skipping 29 matching lines...) Expand all Loading... |
334 } | 304 } |
335 | 305 |
336 void NetworkStateHandler::RequestScan() const { | 306 void NetworkStateHandler::RequestScan() const { |
337 NET_LOG_USER("RequestScan", ""); | 307 NET_LOG_USER("RequestScan", ""); |
338 shill_property_handler_->RequestScan(); | 308 shill_property_handler_->RequestScan(); |
339 } | 309 } |
340 | 310 |
341 void NetworkStateHandler::WaitForScan(const std::string& type, | 311 void NetworkStateHandler::WaitForScan(const std::string& type, |
342 const base::Closure& callback) { | 312 const base::Closure& callback) { |
343 scan_complete_callbacks_[type].push_back(callback); | 313 scan_complete_callbacks_[type].push_back(callback); |
344 if (!GetScanningByType(type)) | 314 if (!GetScanningByType(NetworkTypePattern::Primitive(type))) |
345 RequestScan(); | 315 RequestScan(); |
346 } | 316 } |
347 | 317 |
348 void NetworkStateHandler::ConnectToBestWifiNetwork() { | 318 void NetworkStateHandler::ConnectToBestWifiNetwork() { |
349 NET_LOG_USER("ConnectToBestWifiNetwork", ""); | 319 NET_LOG_USER("ConnectToBestWifiNetwork", ""); |
350 WaitForScan(flimflam::kTypeWifi, | 320 WaitForScan(flimflam::kTypeWifi, |
351 base::Bind(&internal::ShillPropertyHandler::ConnectToBestServices, | 321 base::Bind(&internal::ShillPropertyHandler::ConnectToBestServices, |
352 shill_property_handler_->AsWeakPtr())); | 322 shill_property_handler_->AsWeakPtr())); |
353 } | 323 } |
354 | 324 |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 return; | 695 return; |
726 ScanCallbackList& callback_list = scan_complete_callbacks_[type]; | 696 ScanCallbackList& callback_list = scan_complete_callbacks_[type]; |
727 for (ScanCallbackList::iterator iter = callback_list.begin(); | 697 for (ScanCallbackList::iterator iter = callback_list.begin(); |
728 iter != callback_list.end(); ++iter) { | 698 iter != callback_list.end(); ++iter) { |
729 (*iter).Run(); | 699 (*iter).Run(); |
730 } | 700 } |
731 scan_complete_callbacks_.erase(type); | 701 scan_complete_callbacks_.erase(type); |
732 } | 702 } |
733 | 703 |
734 std::string NetworkStateHandler::GetTechnologyForType( | 704 std::string NetworkStateHandler::GetTechnologyForType( |
735 const std::string& type) const { | 705 const NetworkTypePattern& type) const { |
736 if (type == kMatchTypeMobile) { | 706 if (type.MatchesType(flimflam::kTypeEthernet)) |
737 if (shill_property_handler_->IsTechnologyAvailable(flimflam::kTypeWimax)) | 707 return flimflam::kTypeEthernet; |
| 708 |
| 709 if (type.MatchesType(flimflam::kTypeWifi)) |
| 710 return flimflam::kTypeWifi; |
| 711 |
| 712 if (type.Equals(NetworkTypePattern::Wimax())) |
738 return flimflam::kTypeWimax; | 713 return flimflam::kTypeWimax; |
739 else | 714 |
| 715 // Prefer Wimax over Cellular only if it's available. |
| 716 if (type.MatchesType(flimflam::kTypeWimax) && |
| 717 shill_property_handler_->IsTechnologyAvailable(flimflam::kTypeWimax)) { |
| 718 return flimflam::kTypeWimax; |
| 719 } |
| 720 |
| 721 if (type.MatchesType(flimflam::kTypeCellular)) |
740 return flimflam::kTypeCellular; | 722 return flimflam::kTypeCellular; |
741 } | 723 |
742 if (type == kMatchTypeDefault || type == kMatchTypeNonVirtual || | 724 NOTREACHED(); |
743 type == kMatchTypeWireless) { | 725 return std::string(); |
744 NOTREACHED(); | |
745 return flimflam::kTypeWifi; | |
746 } | |
747 return type; | |
748 } | 726 } |
749 | 727 |
750 } // namespace chromeos | 728 } // namespace chromeos |
OLD | NEW |