ip_address.cc revision 2aa9707f114ab8166f45df5726bf05278df2aef6
11d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
21d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart// Use of this source code is governed by a BSD-style license that can be
31d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart// found in the LICENSE file.
41d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
51d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include "shill/ip_address.h"
61d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
72aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone#include <arpa/inet.h>
81d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include <netinet/in.h>
91d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
101d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include <string>
111d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
121d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include "shill/byte_string.h"
131d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
141d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartnamespace shill {
151d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
162aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
172aa9707f114ab8166f45df5726bf05278df2aef6Chris Masoneconst IPAddress::Family IPAddress::kAddressFamilyUnknown = AF_UNSPEC;
182aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
192aa9707f114ab8166f45df5726bf05278df2aef6Chris Masoneconst IPAddress::Family IPAddress::kAddressFamilyIPv4 = AF_INET;
202aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
212aa9707f114ab8166f45df5726bf05278df2aef6Chris Masoneconst IPAddress::Family IPAddress::kAddressFamilyIPv6 = AF_INET6;
222aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone
231d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::IPAddress(Family family, const ByteString &address)
241d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    : family_(family) ,
251d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart      address_(address) {}
261d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
271d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::IPAddress(Family family)
281d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    : family_(family) {}
291d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
301d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::~IPAddress() {}
311d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
321d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartint IPAddress::GetAddressLength(Family family) {
331d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  switch (family) {
341d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  case kAddressFamilyIPv4:
351d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return sizeof(in_addr);
361d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  case kAddressFamilyIPv6:
371d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return sizeof(in6_addr);
381d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  default:
391d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return 0;
401d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
411d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
421d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
431d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartbool IPAddress::SetAddressFromString(const std::string &address_string) {
441d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  int address_length = GetAddressLength(family_);
451d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
461d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  if (!address_length) {
471d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return false;
481d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
491d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
501d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  ByteString address(address_length);
511d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  if (inet_pton(family_, address_string.c_str(), address.GetData()) <= 0) {
521d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return false;
531d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
541d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  address_ = address;
551d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  return true;
561d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
571d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
581d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartvoid IPAddress::SetAddressToDefault() {
591d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  address_ = ByteString(GetAddressLength(family_));
601d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
611d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
621d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}  // namespace shill
63