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