network_util.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 3// found in the LICENSE file. 4 5#include "chromeos/network/network_util.h" 6 7#include "base/strings/string_tokenizer.h" 8#include "base/strings/stringprintf.h" 9#include "third_party/cros_system_api/dbus/service_constants.h" 10 11namespace chromeos { 12 13WifiAccessPoint::WifiAccessPoint() 14 : signal_strength(0), 15 signal_to_noise(0), 16 channel(0) { 17} 18 19WifiAccessPoint::~WifiAccessPoint() { 20} 21 22CellularScanResult::CellularScanResult() { 23} 24 25CellularScanResult::~CellularScanResult() { 26} 27 28namespace network_util { 29 30std::string PrefixLengthToNetmask(int32 prefix_length) { 31 std::string netmask; 32 // Return the empty string for invalid inputs. 33 if (prefix_length < 0 || prefix_length > 32) 34 return netmask; 35 for (int i = 0; i < 4; i++) { 36 int remainder = 8; 37 if (prefix_length >= 8) { 38 prefix_length -= 8; 39 } else { 40 remainder = prefix_length; 41 prefix_length = 0; 42 } 43 if (i > 0) 44 netmask += "."; 45 int value = remainder == 0 ? 0 : 46 ((2L << (remainder - 1)) - 1) << (8 - remainder); 47 netmask += base::StringPrintf("%d", value); 48 } 49 return netmask; 50} 51 52int32 NetmaskToPrefixLength(const std::string& netmask) { 53 int count = 0; 54 int prefix_length = 0; 55 base::StringTokenizer t(netmask, "."); 56 while (t.GetNext()) { 57 // If there are more than 4 numbers, then it's invalid. 58 if (count == 4) 59 return -1; 60 61 std::string token = t.token(); 62 // If we already found the last mask and the current one is not 63 // "0" then the netmask is invalid. For example, 255.224.255.0 64 if (prefix_length / 8 != count) { 65 if (token != "0") 66 return -1; 67 } else if (token == "255") { 68 prefix_length += 8; 69 } else if (token == "254") { 70 prefix_length += 7; 71 } else if (token == "252") { 72 prefix_length += 6; 73 } else if (token == "248") { 74 prefix_length += 5; 75 } else if (token == "240") { 76 prefix_length += 4; 77 } else if (token == "224") { 78 prefix_length += 3; 79 } else if (token == "192") { 80 prefix_length += 2; 81 } else if (token == "128") { 82 prefix_length += 1; 83 } else if (token == "0") { 84 prefix_length += 0; 85 } else { 86 // mask is not a valid number. 87 return -1; 88 } 89 count++; 90 } 91 if (count < 4) 92 return -1; 93 return prefix_length; 94} 95 96bool ParseCellularScanResults(const base::ListValue& list, 97 std::vector<CellularScanResult>* scan_results) { 98 scan_results->clear(); 99 scan_results->reserve(list.GetSize()); 100 for (base::ListValue::const_iterator it = list.begin(); 101 it != list.end(); ++it) { 102 if (!(*it)->IsType(base::Value::TYPE_DICTIONARY)) 103 return false; 104 CellularScanResult scan_result; 105 const base::DictionaryValue* dict = 106 static_cast<const base::DictionaryValue*>(*it); 107 // If the network id property is not present then this network cannot be 108 // connected to so don't include it in the results. 109 if (!dict->GetStringWithoutPathExpansion(shill::kNetworkIdProperty, 110 &scan_result.network_id)) 111 continue; 112 dict->GetStringWithoutPathExpansion(shill::kStatusProperty, 113 &scan_result.status); 114 dict->GetStringWithoutPathExpansion(shill::kLongNameProperty, 115 &scan_result.long_name); 116 dict->GetStringWithoutPathExpansion(shill::kShortNameProperty, 117 &scan_result.short_name); 118 dict->GetStringWithoutPathExpansion(shill::kTechnologyProperty, 119 &scan_result.technology); 120 scan_results->push_back(scan_result); 121 } 122 return true; 123} 124 125} // namespace network_util 126} // namespace chromeos 127