152 lines
3.6 KiB
C++
152 lines
3.6 KiB
C++
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
/**
|
|
* Copyright (C) 2014 Named Data Networking Project
|
|
* See COPYING for copyright and distribution information.
|
|
*/
|
|
|
|
#ifndef NFD_FACE_ETHERNET_HPP
|
|
#define NFD_FACE_ETHERNET_HPP
|
|
|
|
#include "common.hpp"
|
|
|
|
#include <boost/array.hpp>
|
|
|
|
#define ETHERTYPE_NDN 0x8624
|
|
|
|
namespace nfd {
|
|
namespace ethernet {
|
|
|
|
typedef std::string Endpoint;
|
|
|
|
const size_t ADDR_LEN = 6; ///< Octets in one Ethernet address
|
|
const size_t TYPE_LEN = 2; ///< Octets in Ethertype field
|
|
const size_t HDR_LEN = 14; ///< Total octets in Ethernet header (without 802.1Q tag)
|
|
const size_t TAG_LEN = 4; ///< Octets in 802.1Q tag (TPID + priority + VLAN)
|
|
const size_t MIN_DATA_LEN = 46; ///< Min octets in Ethernet payload (assuming no 802.1Q tag)
|
|
const size_t MAX_DATA_LEN = 1500; ///< Max octets in Ethernet payload
|
|
const size_t CRC_LEN = 4; ///< Octets in Ethernet frame check sequence
|
|
|
|
|
|
class Address : public boost::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]);
|
|
|
|
/// Copy constructor
|
|
Address(const Address& address);
|
|
|
|
/// 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 a dash (the default value) or a colon
|
|
*/
|
|
std::string
|
|
toString(char sep = '-') const;
|
|
|
|
/**
|
|
* @brief Creates an Address from a string containing an Ethernet address
|
|
* in hexadecimal notation, with colons or dashes as separators
|
|
*
|
|
* @param str The string to be parsed
|
|
* @return Always an instance of Address, which will be null
|
|
* if the parsing fails
|
|
*/
|
|
static Address
|
|
fromString(const std::string& str);
|
|
};
|
|
|
|
/// Returns the Ethernet broadcast address (FF-FF-FF-FF-FF-FF)
|
|
inline Address
|
|
getBroadcastAddress()
|
|
{
|
|
static Address bcast(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
|
|
return bcast;
|
|
}
|
|
|
|
/// Returns the default Ethernet multicast address for NDN
|
|
inline Address
|
|
getDefaultMulticastAddress()
|
|
{
|
|
static Address mcast(0x01, 0x00, 0x5E, 0x00, 0x17, 0xAA);
|
|
return mcast;
|
|
}
|
|
|
|
inline
|
|
Address::Address()
|
|
{
|
|
assign(0);
|
|
}
|
|
|
|
inline
|
|
Address::Address(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6)
|
|
{
|
|
elems[0] = a1;
|
|
elems[1] = a2;
|
|
elems[2] = a3;
|
|
elems[3] = a4;
|
|
elems[4] = a5;
|
|
elems[5] = a6;
|
|
}
|
|
|
|
inline
|
|
Address::Address(const uint8_t octets[])
|
|
{
|
|
std::copy(octets, octets + size(), begin());
|
|
}
|
|
|
|
inline
|
|
Address::Address(const Address& address)
|
|
{
|
|
std::copy(address.begin(), address.end(), begin());
|
|
}
|
|
|
|
inline bool
|
|
Address::isBroadcast() const
|
|
{
|
|
return elems[0] == 0xFF && elems[1] == 0xFF && elems[2] == 0xFF &&
|
|
elems[3] == 0xFF && elems[4] == 0xFF && elems[5] == 0xFF;
|
|
}
|
|
|
|
inline bool
|
|
Address::isMulticast() const
|
|
{
|
|
return (elems[0] & 1) != 0;
|
|
}
|
|
|
|
inline bool
|
|
Address::isNull() const
|
|
{
|
|
return elems[0] == 0x0 && elems[1] == 0x0 && elems[2] == 0x0 &&
|
|
elems[3] == 0x0 && elems[4] == 0x0 && elems[5] == 0x0;
|
|
}
|
|
|
|
std::ostream&
|
|
operator<<(std::ostream& o, const Address& a);
|
|
|
|
} // namespace ethernet
|
|
} // namespace nfd
|
|
|
|
#endif // NFD_FACE_ETHERNET_HPP
|