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 "net/base/ip_address_number.h" | 5 #include "net/base/ip_address_number.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 address.begin() + arraysize(kIPv4MappedPrefix), | 211 address.begin() + arraysize(kIPv4MappedPrefix), |
212 kIPv4MappedPrefix); | 212 kIPv4MappedPrefix); |
213 } | 213 } |
214 | 214 |
215 IPAddressNumber ConvertIPv4MappedToIPv4(const IPAddressNumber& address) { | 215 IPAddressNumber ConvertIPv4MappedToIPv4(const IPAddressNumber& address) { |
216 DCHECK(IsIPv4Mapped(address)); | 216 DCHECK(IsIPv4Mapped(address)); |
217 return IPAddressNumber(address.begin() + arraysize(kIPv4MappedPrefix), | 217 return IPAddressNumber(address.begin() + arraysize(kIPv4MappedPrefix), |
218 address.end()); | 218 address.end()); |
219 } | 219 } |
220 | 220 |
221 bool ParseCIDRBlock(const std::string& cidr_literal, | |
222 IPAddressNumber* ip_number, | |
223 size_t* prefix_length_in_bits) { | |
224 // We expect CIDR notation to match one of these two templates: | |
225 // <IPv4-literal> "/" <number of bits> | |
226 // <IPv6-literal> "/" <number of bits> | |
227 | |
228 std::vector<base::StringPiece> parts = base::SplitStringPiece( | |
229 cidr_literal, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | |
230 if (parts.size() != 2) | |
231 return false; | |
232 | |
233 // Parse the IP address. | |
234 if (!ParseIPLiteralToNumber(parts[0], ip_number)) | |
235 return false; | |
236 | |
237 // Parse the prefix length. | |
238 int number_of_bits = -1; | |
239 if (!base::StringToInt(parts[1], &number_of_bits)) | |
240 return false; | |
241 | |
242 // Make sure the prefix length is in a valid range. | |
243 if (number_of_bits < 0 || | |
244 number_of_bits > static_cast<int>(ip_number->size() * 8)) | |
245 return false; | |
246 | |
247 *prefix_length_in_bits = static_cast<size_t>(number_of_bits); | |
248 return true; | |
249 } | |
250 | |
251 bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number, | 221 bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number, |
252 const IPAddressNumber& ip_prefix, | 222 const IPAddressNumber& ip_prefix, |
253 size_t prefix_length_in_bits) { | 223 size_t prefix_length_in_bits) { |
254 // Both the input IP address and the prefix IP address should be | 224 // Both the input IP address and the prefix IP address should be |
255 // either IPv4 or IPv6. | 225 // either IPv4 or IPv6. |
256 DCHECK(ip_number.size() == 4 || ip_number.size() == 16); | 226 DCHECK(ip_number.size() == 4 || ip_number.size() == 16); |
257 DCHECK(ip_prefix.size() == 4 || ip_prefix.size() == 16); | 227 DCHECK(ip_prefix.size() == 4 || ip_prefix.size() == 16); |
258 | 228 |
259 DCHECK_LE(prefix_length_in_bits, ip_prefix.size() * 8); | 229 DCHECK_LE(prefix_length_in_bits, ip_prefix.size() * 8); |
260 | 230 |
(...skipping 28 matching lines...) Expand all Loading... |
289 } | 259 } |
290 return a1.size() * CHAR_BIT; | 260 return a1.size() * CHAR_BIT; |
291 } | 261 } |
292 | 262 |
293 unsigned MaskPrefixLength(const IPAddressNumber& mask) { | 263 unsigned MaskPrefixLength(const IPAddressNumber& mask) { |
294 IPAddressNumber all_ones(mask.size(), 0xFF); | 264 IPAddressNumber all_ones(mask.size(), 0xFF); |
295 return CommonPrefixLength(mask, all_ones); | 265 return CommonPrefixLength(mask, all_ones); |
296 } | 266 } |
297 | 267 |
298 } // namespace net | 268 } // namespace net |
OLD | NEW |