| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <string> |
| #include <vector> |
| |
| #include "crypto/random.h" |
| #include "shill/device.h" |
| #include "shill/mac_address.h" |
| |
| namespace shill { |
| |
| void MACAddress::Clear() { |
| is_set_ = false; |
| // Reset expiration time. |
| expiration_time_ = kNotExpiring; |
| } |
| |
| bool MACAddress::IsExpired(base::Time now) const { |
| // We assume == is still not expired to be on the safe side. |
| return (expiration_time_ != kNotExpiring) && (now > expiration_time_); |
| } |
| |
| bool MACAddress::Load(const StoreInterface* storage, const std::string& id) { |
| std::string mac_str; |
| if (storage->GetString(id, kStorageMACAddress, &mac_str)) { |
| if (!Set(mac_str)) { |
| return false; |
| } |
| uint64_t expiration_time; |
| if (storage->GetUint64(id, kStorageMACAddressExpiry, &expiration_time)) { |
| expiration_time_ = base::Time::FromDeltaSinceWindowsEpoch( |
| base::TimeDelta::FromMicroseconds(expiration_time)); |
| } |
| } |
| return true; |
| } |
| |
| void MACAddress::Randomize() { |
| crypto::RandBytes(address_.data(), address_.size()); |
| |
| address_[0] &= ~kMulicastMacBit; // Set unicast address. |
| address_[0] |= kLocallyAdministratedMacBit; |
| is_set_ = true; |
| // Reset expiration time. |
| expiration_time_ = kNotExpiring; |
| } |
| |
| bool MACAddress::Set(const std::string& str) { |
| const auto addr = Device::MakeHardwareAddressFromString(str); |
| if (addr.size() != address_.size()) { |
| return false; |
| } |
| std::copy_n(addr.begin(), address_.size(), address_.begin()); |
| is_set_ = true; |
| return true; |
| } |
| |
| bool MACAddress::Save(StoreInterface* storage, const std::string& id) const { |
| if (!is_set_) { |
| return false; |
| } |
| storage->SetString(id, kStorageMACAddress, ToString()); |
| storage->SetUint64( |
| id, kStorageMACAddressExpiry, |
| expiration_time_.ToDeltaSinceWindowsEpoch().InMicroseconds()); |
| return true; |
| } |
| |
| std::string MACAddress::ToString() const { |
| if (!is_set_) { |
| return "<UNSET>"; |
| } |
| const std::vector<uint8_t> addr(address_.begin(), address_.end()); |
| return Device::MakeStringFromHardwareAddress(addr); |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const MACAddress& addr) { |
| os << addr.ToString(); |
| return os; |
| } |
| |
| } // namespace shill |