blob: 8dda5720004e89f6b0ffbb8821b560474aab5645 [file] [log] [blame]
Paul Stewart188a84a2012-01-20 16:28:15 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewart1d18e8c2011-07-15 11:00:31 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/ip_address.h"
6
Chris Masone2aa97072011-08-09 17:35:08 -07007#include <arpa/inet.h>
Paul Stewart1d18e8c2011-07-15 11:00:31 -07008#include <netinet/in.h>
9
10#include <string>
11
Darin Petkov14c29ec2012-03-02 11:34:19 +010012#include <base/logging.h>
13
Paul Stewart1d18e8c2011-07-15 11:00:31 -070014#include "shill/byte_string.h"
15
Paul Stewart188a84a2012-01-20 16:28:15 -080016using std::string;
17
Paul Stewart1d18e8c2011-07-15 11:00:31 -070018namespace shill {
19
Chris Masone2aa97072011-08-09 17:35:08 -070020// static
Paul Stewart7355ce12011-09-02 10:47:01 -070021const IPAddress::Family IPAddress::kFamilyUnknown = AF_UNSPEC;
Chris Masone2aa97072011-08-09 17:35:08 -070022// static
Paul Stewart7355ce12011-09-02 10:47:01 -070023const IPAddress::Family IPAddress::kFamilyIPv4 = AF_INET;
Chris Masone2aa97072011-08-09 17:35:08 -070024// static
Paul Stewart7355ce12011-09-02 10:47:01 -070025const IPAddress::Family IPAddress::kFamilyIPv6 = AF_INET6;
Chris Masone2aa97072011-08-09 17:35:08 -070026
Paul Stewart1d18e8c2011-07-15 11:00:31 -070027IPAddress::IPAddress(Family family, const ByteString &address)
28 : family_(family) ,
Paul Stewart9e3fcd72011-08-26 15:46:16 -070029 address_(address),
30 prefix_(0) {}
31
32IPAddress::IPAddress(Family family,
33 const ByteString &address,
34 unsigned int prefix)
35 : family_(family) ,
36 address_(address),
37 prefix_(prefix) {}
Paul Stewart1d18e8c2011-07-15 11:00:31 -070038
39IPAddress::IPAddress(Family family)
Paul Stewart9e3fcd72011-08-26 15:46:16 -070040 : family_(family),
41 prefix_(0) {}
Paul Stewart1d18e8c2011-07-15 11:00:31 -070042
43IPAddress::~IPAddress() {}
44
Eric Shienbroodc74cf9c2012-03-02 15:00:35 -050045size_t IPAddress::GetAddressLength(Family family) {
Paul Stewart1d18e8c2011-07-15 11:00:31 -070046 switch (family) {
Paul Stewart7355ce12011-09-02 10:47:01 -070047 case kFamilyIPv4:
Paul Stewart1d18e8c2011-07-15 11:00:31 -070048 return sizeof(in_addr);
Paul Stewart7355ce12011-09-02 10:47:01 -070049 case kFamilyIPv6:
Paul Stewart1d18e8c2011-07-15 11:00:31 -070050 return sizeof(in6_addr);
51 default:
52 return 0;
53 }
54}
55
Darin Petkov14c29ec2012-03-02 11:34:19 +010056// static
57int IPAddress::GetPrefixLengthFromMask(Family family, const string &mask) {
58 switch (family) {
59 case kFamilyIPv4: {
60 in_addr_t mask_val = inet_network(mask.c_str());
61 int subnet_cidr = 0;
62 while (mask_val) {
63 subnet_cidr++;
64 mask_val <<= 1;
65 }
66 return subnet_cidr;
67 }
68 case kFamilyIPv6:
69 NOTIMPLEMENTED();
70 break;
71 default:
72 LOG(WARNING) << "Unexpected address family: " << family;
73 break;
74 }
75 return 0;
76}
77
Paul Stewart188a84a2012-01-20 16:28:15 -080078bool IPAddress::SetAddressFromString(const string &address_string) {
Eric Shienbroodc74cf9c2012-03-02 15:00:35 -050079 size_t address_length = GetAddressLength(family_);
Paul Stewart1d18e8c2011-07-15 11:00:31 -070080
81 if (!address_length) {
82 return false;
83 }
84
85 ByteString address(address_length);
86 if (inet_pton(family_, address_string.c_str(), address.GetData()) <= 0) {
87 return false;
88 }
89 address_ = address;
90 return true;
91}
92
93void IPAddress::SetAddressToDefault() {
94 address_ = ByteString(GetAddressLength(family_));
95}
96
mukesh agrawal2c15d2c2012-02-21 16:09:21 -080097bool IPAddress::IntoString(string *address_string) const {
Paul Stewart188a84a2012-01-20 16:28:15 -080098 // Noting that INET6_ADDRSTRLEN > INET_ADDRSTRLEN
99 char address_buf[INET6_ADDRSTRLEN];
100 if (GetLength() != GetAddressLength(family_) ||
101 !inet_ntop(family_, GetConstData(), address_buf, sizeof(address_buf))) {
102 return false;
103 }
104 *address_string = address_buf;
105 return true;
106}
107
mukesh agrawal2c15d2c2012-02-21 16:09:21 -0800108string IPAddress::ToString() const {
109 string out("<unknown>");
110 IntoString(&out);
111 return out;
112}
113
Paul Stewart1d18e8c2011-07-15 11:00:31 -0700114} // namespace shill