1aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski/****************************************************************************** 2aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 3aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * Copyright (C) 2017 The Android Open Source Project 4aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 5aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * Licensed under the Apache License, Version 2.0 (the "License"); 6aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * you may not use this file except in compliance with the License. 7aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * You may obtain a copy of the License at: 8aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 9aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * http://www.apache.org/licenses/LICENSE-2.0 10aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 11aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * Unless required by applicable law or agreed to in writing, software 12aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * distributed under the License is distributed on an "AS IS" BASIS, 13aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * See the License for the specific language governing permissions and 15aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * limitations under the License. 16aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 17aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski ******************************************************************************/ 18aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 19aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include "raw_address.h" 20aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 21aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include <base/strings/string_split.h> 22aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include <base/strings/stringprintf.h> 23aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include <stdint.h> 24aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include <algorithm> 25aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski#include <vector> 26aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 27aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskistatic_assert(sizeof(RawAddress) == 6, "RawAddress must be 6 bytes long!"); 28aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 29aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskiconst RawAddress RawAddress::kAny{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}; 30aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskiconst RawAddress RawAddress::kEmpty{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; 31aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 32aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub PawlowskiRawAddress::RawAddress(const uint8_t (&addr)[6]) { 33aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski std::copy(addr, addr + kLength, address); 34aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski}; 35aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 36aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskistd::string RawAddress::ToString() const { 37aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski return base::StringPrintf("%02x:%02x:%02x:%02x:%02x:%02x", address[0], 38aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski address[1], address[2], address[3], address[4], 39aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski address[5]); 40aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski} 41aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 42aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskibool RawAddress::FromString(const std::string& from, RawAddress& to) { 43aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski RawAddress new_addr; 44aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski if (from.length() != 17) return false; 45aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 46aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski std::vector<std::string> byte_tokens = 47aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski base::SplitString(from, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 48aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 49aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski if (byte_tokens.size() != 6) return false; 50aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 51aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski for (int i = 0; i < 6; i++) { 52aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski const auto& token = byte_tokens[i]; 53aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 54aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski if (token.length() != 2) return false; 55aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 56aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski char* temp = nullptr; 57aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski new_addr.address[i] = strtol(token.c_str(), &temp, 16); 58aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski if (*temp != '\0') return false; 59aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski } 60aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 61aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski to = new_addr; 62aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski return true; 63aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski} 64aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski 65aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowskibool RawAddress::IsValidAddress(const std::string& address) { 66aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski RawAddress tmp; 67aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski return RawAddress::FromString(address, tmp); 68aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski} 69