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