ip_address.cc revision c74cf9cb439ef518bc00210fe5cd3b121f3079b3
1188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart// Copyright (c) 2012 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
14188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewartusing std::string;
15188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart
161d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartnamespace shill {
171d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
182aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
197355ce1937c504d836a303ac809bd436272212b3Paul Stewartconst IPAddress::Family IPAddress::kFamilyUnknown = AF_UNSPEC;
202aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
217355ce1937c504d836a303ac809bd436272212b3Paul Stewartconst IPAddress::Family IPAddress::kFamilyIPv4 = AF_INET;
222aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone// static
237355ce1937c504d836a303ac809bd436272212b3Paul Stewartconst IPAddress::Family IPAddress::kFamilyIPv6 = AF_INET6;
242aa9707f114ab8166f45df5726bf05278df2aef6Chris Masone
251d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::IPAddress(Family family, const ByteString &address)
261d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    : family_(family) ,
279e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart      address_(address),
289e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart      prefix_(0) {}
299e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart
309e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul StewartIPAddress::IPAddress(Family family,
319e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart                     const ByteString &address,
329e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart                     unsigned int prefix)
339e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart    : family_(family) ,
349e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart      address_(address),
359e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart      prefix_(prefix) {}
361d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
371d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::IPAddress(Family family)
389e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart    : family_(family),
399e3fcd7141240bc5efd0bf1513b9e78aa79d90ebPaul Stewart      prefix_(0) {}
401d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
411d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartIPAddress::~IPAddress() {}
421d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
43c74cf9cb439ef518bc00210fe5cd3b121f3079b3Eric Shienbroodsize_t IPAddress::GetAddressLength(Family family) {
441d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  switch (family) {
457355ce1937c504d836a303ac809bd436272212b3Paul Stewart  case kFamilyIPv4:
461d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return sizeof(in_addr);
477355ce1937c504d836a303ac809bd436272212b3Paul Stewart  case kFamilyIPv6:
481d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return sizeof(in6_addr);
491d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  default:
501d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return 0;
511d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
521d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
531d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
54188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewartbool IPAddress::SetAddressFromString(const string &address_string) {
55c74cf9cb439ef518bc00210fe5cd3b121f3079b3Eric Shienbrood  size_t address_length = GetAddressLength(family_);
561d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
571d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  if (!address_length) {
581d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return false;
591d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
601d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
611d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  ByteString address(address_length);
621d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  if (inet_pton(family_, address_string.c_str(), address.GetData()) <= 0) {
631d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart    return false;
641d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  }
651d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  address_ = address;
661d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  return true;
671d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
681d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
691d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartvoid IPAddress::SetAddressToDefault() {
701d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart  address_ = ByteString(GetAddressLength(family_));
711d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}
721d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart
732c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawalbool IPAddress::IntoString(string *address_string) const {
74188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  // Noting that INET6_ADDRSTRLEN > INET_ADDRSTRLEN
75188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  char address_buf[INET6_ADDRSTRLEN];
76188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  if (GetLength() != GetAddressLength(family_) ||
77188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart      !inet_ntop(family_, GetConstData(), address_buf, sizeof(address_buf))) {
78188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart    return false;
79188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  }
80188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  *address_string = address_buf;
81188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart  return true;
82188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart}
83188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart
842c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawalstring IPAddress::ToString() const {
852c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal  string out("<unknown>");
862c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal  IntoString(&out);
872c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal  return out;
882c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal}
892c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal
901d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}  // namespace shill
91