/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2014-2023 Regents of the University of California,
 *                         Arizona Board of Regents,
 *                         Colorado State University,
 *                         University Pierre & Marie Curie, Sorbonne University,
 *                         Washington University in St. Louis,
 *                         Beijing Institute of Technology,
 *                         The University of Memphis.
 *
 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
 *
 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 *
 * You should have received copies of the GNU General Public License and GNU Lesser
 * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
 */

#ifndef NDN_CXX_NET_ETHERNET_HPP
#define NDN_CXX_NET_ETHERNET_HPP

#include <array>
#include <cstdint>
#include <functional>
#include <string>

namespace ndn::ethernet {

inline constexpr uint16_t ETHERTYPE_NDN = 0x8624; ///< The NDN Ethertype

inline constexpr size_t ADDR_LEN     = 6;    ///< Octets in one Ethernet address
inline constexpr size_t TYPE_LEN     = 2;    ///< Octets in Ethertype field
inline constexpr size_t HDR_LEN      = 14;   ///< Total octets in Ethernet header (without 802.1Q tag)
inline constexpr size_t TAG_LEN      = 4;    ///< Octets in 802.1Q tag (TPID + priority + VLAN)
inline constexpr size_t MIN_DATA_LEN = 46;   ///< Min octets in Ethernet payload (assuming no 802.1Q tag)
inline constexpr size_t MAX_DATA_LEN = 1500; ///< Max octets in Ethernet payload
inline constexpr size_t CRC_LEN      = 4;    ///< Octets in Ethernet frame check sequence

/**
 * \brief Represents an Ethernet hardware address.
 */
class Address : public std::array<uint8_t, ADDR_LEN>
{
public:
  /// Constructs a null Ethernet address (`00:00:00:00:00:00`).
  Address();

  /// Constructs a new Ethernet address with the given octets.
  Address(uint8_t a1, uint8_t a2, uint8_t a3,
          uint8_t a4, uint8_t a5, uint8_t a6);

  /// Constructs a new Ethernet address with the given octets.
  explicit
  Address(const uint8_t octets[ADDR_LEN]);

  /// True if this is a broadcast address (`ff:ff:ff:ff:ff:ff`).
  bool
  isBroadcast() const;

  /// True if this is a multicast address.
  bool
  isMulticast() const;

  /// True if this is a null address (`00:00:00:00:00:00`).
  bool
  isNull() const;

  /**
   * \brief Converts the address to a human-readable string.
   *
   * \param sep A character used to visually separate the octets,
   *            usually ':' (the default value) or '-'
   */
  std::string
  toString(char sep = ':') const;

  /**
   * \brief Creates an Address from a string containing an Ethernet address
   *        in hexadecimal notation, with colons or hyphens as separators.
   *
   * \param str The string to be parsed
   * \return Always an instance of Address, which will be null if parsing fails
   */
  static Address
  fromString(const std::string& str);
};

/**
 * @brief Returns the Ethernet broadcast address (`ff:ff:ff:ff:ff:ff`).
 */
Address
getBroadcastAddress();

/**
 * @brief Returns the default Ethernet multicast address for NDN.
 */
Address
getDefaultMulticastAddress();

std::ostream&
operator<<(std::ostream& o, const Address& a);

} // namespace ndn::ethernet

namespace std {

// specialize std::hash<> for ethernet::Address
template<>
struct hash<ndn::ethernet::Address>
{
  size_t
  operator()(const ndn::ethernet::Address& a) const noexcept;
};

} // namespace std

#endif // NDN_CXX_NET_ETHERNET_HPP
