blob: d1334d0547719768be17d55301c8ed87002f1ed1 [file] [log] [blame]
Paul Stewart1d18e8c2011-07-15 11:00:31 -07001// Copyright (c) 2011 The Chromium OS 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 "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
12#include "shill/byte_string.h"
13
14namespace shill {
15
Chris Masone2aa97072011-08-09 17:35:08 -070016// static
Paul Stewart7355ce12011-09-02 10:47:01 -070017const IPAddress::Family IPAddress::kFamilyUnknown = AF_UNSPEC;
Chris Masone2aa97072011-08-09 17:35:08 -070018// static
Paul Stewart7355ce12011-09-02 10:47:01 -070019const IPAddress::Family IPAddress::kFamilyIPv4 = AF_INET;
Chris Masone2aa97072011-08-09 17:35:08 -070020// static
Paul Stewart7355ce12011-09-02 10:47:01 -070021const IPAddress::Family IPAddress::kFamilyIPv6 = AF_INET6;
Chris Masone2aa97072011-08-09 17:35:08 -070022
Paul Stewart1d18e8c2011-07-15 11:00:31 -070023IPAddress::IPAddress(Family family, const ByteString &address)
24 : family_(family) ,
Paul Stewart9e3fcd72011-08-26 15:46:16 -070025 address_(address),
26 prefix_(0) {}
27
28IPAddress::IPAddress(Family family,
29 const ByteString &address,
30 unsigned int prefix)
31 : family_(family) ,
32 address_(address),
33 prefix_(prefix) {}
Paul Stewart1d18e8c2011-07-15 11:00:31 -070034
35IPAddress::IPAddress(Family family)
Paul Stewart9e3fcd72011-08-26 15:46:16 -070036 : family_(family),
37 prefix_(0) {}
Paul Stewart1d18e8c2011-07-15 11:00:31 -070038
39IPAddress::~IPAddress() {}
40
41int IPAddress::GetAddressLength(Family family) {
42 switch (family) {
Paul Stewart7355ce12011-09-02 10:47:01 -070043 case kFamilyIPv4:
Paul Stewart1d18e8c2011-07-15 11:00:31 -070044 return sizeof(in_addr);
Paul Stewart7355ce12011-09-02 10:47:01 -070045 case kFamilyIPv6:
Paul Stewart1d18e8c2011-07-15 11:00:31 -070046 return sizeof(in6_addr);
47 default:
48 return 0;
49 }
50}
51
52bool IPAddress::SetAddressFromString(const std::string &address_string) {
53 int address_length = GetAddressLength(family_);
54
55 if (!address_length) {
56 return false;
57 }
58
59 ByteString address(address_length);
60 if (inet_pton(family_, address_string.c_str(), address.GetData()) <= 0) {
61 return false;
62 }
63 address_ = address;
64 return true;
65}
66
67void IPAddress::SetAddressToDefault() {
68 address_ = ByteString(GetAddressLength(family_));
69}
70
71} // namespace shill