// Copyright 2017 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.

#ifndef PATCHPANEL_MAC_ADDRESS_GENERATOR_H_
#define PATCHPANEL_MAC_ADDRESS_GENERATOR_H_

#include <stdint.h>

#include <array>
#include <functional>
#include <unordered_set>

#include <brillo/brillo_export.h>

namespace patchpanel {

using MacAddress = std::array<uint8_t, 6>;

// Generates locally managed EUI-48 MAC addresses and ensures no collisions
// with any previously generated addresses by this instance.
class BRILLO_EXPORT MacAddressGenerator {
 public:
  MacAddressGenerator() = default;
  MacAddressGenerator(const MacAddressGenerator&) = delete;
  MacAddressGenerator& operator=(const MacAddressGenerator&) = delete;

  ~MacAddressGenerator() = default;

  // Generates a new EUI-48 MAC address and ensures that there are no
  // collisions with any addresses previously generated by this instance of
  // the generator.
  MacAddress Generate();

  // Returns a stable MAC address whose first 5 octets are fixed and using |id|
  // as the sixth. The base address is itself random and was not generated from
  // any particular device, physical or virtual. Additionally, the |id| should
  // associated with any specific device either, and should be set indepedently.
  MacAddress GetStable(uint8_t id) const;

 private:
  // The standard library sadly does not provide a hash function for std::array.
  // So implement one here for MacAddress based off boost::hash_combine.
  struct MacAddressHasher {
    size_t operator()(const MacAddress& addr) const noexcept {
      std::hash<uint8_t> hasher;

      size_t hash = 0;
      for (uint8_t octet : addr) {
        hash ^= hasher(octet) + 0x9e3779b9 + (hash << 6) + (hash >> 2);
      }

      return hash;
    }
  };

  // Set of all addresses generated by this instance.  This doesn't _need_ to be
  // an unordered_set but making it one improves the performance of the
  // "Duplicates" unit test by ~33% (~150 seconds -> ~100 seconds) and it
  // doesn't have a huge impact in production use so that's why we use it here.
  std::unordered_set<MacAddress, MacAddressHasher> addrs_;
};

}  // namespace patchpanel

#endif  // PATCHPANEL_MAC_ADDRESS_GENERATOR_H_
