network_util.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/stringprintf.h" 8#include "base/strings/string_tokenizer.h" 9 10namespace chromeos { 11 12SMS::SMS() : validity(0), msgclass(0) { 13} 14 15SMS::~SMS() { 16} 17 18WifiAccessPoint::WifiAccessPoint() 19 : signal_strength(0), 20 signal_to_noise(0), 21 channel(0) { 22} 23 24WifiAccessPoint::~WifiAccessPoint() { 25} 26 27namespace network_util { 28 29std::string PrefixLengthToNetmask(int32 prefix_length) { 30 std::string netmask; 31 // Return the empty string for invalid inputs. 32 if (prefix_length < 0 || prefix_length > 32) 33 return netmask; 34 for (int i = 0; i < 4; i++) { 35 int remainder = 8; 36 if (prefix_length >= 8) { 37 prefix_length -= 8; 38 } else { 39 remainder = prefix_length; 40 prefix_length = 0; 41 } 42 if (i > 0) 43 netmask += "."; 44 int value = remainder == 0 ? 0 : 45 ((2L << (remainder - 1)) - 1) << (8 - remainder); 46 netmask += base::StringPrintf("%d", value); 47 } 48 return netmask; 49} 50 51int32 NetmaskToPrefixLength(const std::string& netmask) { 52 int count = 0; 53 int prefix_length = 0; 54 base::StringTokenizer t(netmask, "."); 55 while (t.GetNext()) { 56 // If there are more than 4 numbers, then it's invalid. 57 if (count == 4) 58 return -1; 59 60 std::string token = t.token(); 61 // If we already found the last mask and the current one is not 62 // "0" then the netmask is invalid. For example, 255.224.255.0 63 if (prefix_length / 8 != count) { 64 if (token != "0") 65 return -1; 66 } else if (token == "255") { 67 prefix_length += 8; 68 } else if (token == "254") { 69 prefix_length += 7; 70 } else if (token == "252") { 71 prefix_length += 6; 72 } else if (token == "248") { 73 prefix_length += 5; 74 } else if (token == "240") { 75 prefix_length += 4; 76 } else if (token == "224") { 77 prefix_length += 3; 78 } else if (token == "192") { 79 prefix_length += 2; 80 } else if (token == "128") { 81 prefix_length += 1; 82 } else if (token == "0") { 83 prefix_length += 0; 84 } else { 85 // mask is not a valid number. 86 return -1; 87 } 88 count++; 89 } 90 if (count < 4) 91 return -1; 92 return prefix_length; 93} 94 95} // namespace network_util 96} // namespace chromeos 97