blob: 66ee715a25c954a01291380cdfdb8b9797cfb206 [file] [log] [blame]
Davide Pesavento44deacc2014-02-19 10:48:07 +01001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (C) 2014 Named Data Networking Project
4 * See COPYING for copyright and distribution information.
5 */
6
7#ifndef NFD_FACE_ETHERNET_HPP
8#define NFD_FACE_ETHERNET_HPP
9
10#include "common.hpp"
11
12#include <boost/array.hpp>
13
14#define ETHERTYPE_NDN 0x8624
15
16namespace nfd {
17namespace ethernet {
18
19typedef std::string Endpoint;
20
21const size_t ADDR_LEN = 6; ///< Octets in one Ethernet address
22const size_t TYPE_LEN = 2; ///< Octets in Ethertype field
23const size_t HDR_LEN = 14; ///< Total octets in Ethernet header (without 802.1Q tag)
24const size_t TAG_LEN = 4; ///< Octets in 802.1Q tag (TPID + priority + VLAN)
25const size_t MIN_DATA_LEN = 46; ///< Min octets in Ethernet payload (assuming no 802.1Q tag)
26const size_t MAX_DATA_LEN = 1500; ///< Max octets in Ethernet payload
27const size_t CRC_LEN = 4; ///< Octets in Ethernet frame check sequence
28
29
30class Address : public boost::array<uint8_t, ADDR_LEN>
31{
32public:
33 /// Constructs a null Ethernet address (00-00-00-00-00-00)
34 Address();
35
36 /// Constructs a new Ethernet address with the given octets
37 Address(uint8_t a1, uint8_t a2, uint8_t a3,
38 uint8_t a4, uint8_t a5, uint8_t a6);
39
40 /// Constructs a new Ethernet address with the given octets
41 explicit
42 Address(const uint8_t octets[ADDR_LEN]);
43
44 /// Copy constructor
45 Address(const Address& address);
46
47 /// True if this is a broadcast address (FF-FF-FF-FF-FF-FF)
48 bool
49 isBroadcast() const;
50
51 /// True if this is a multicast address
52 bool
53 isMulticast() const;
54
55 std::string
56 toString(char sep = '-') const;
57};
58
59/// Returns the Ethernet broadcast address (FF-FF-FF-FF-FF-FF)
60inline Address
61getBroadcastAddress()
62{
63 static Address bcast(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
64 return bcast;
65}
66
67/// Returns the default Ethernet multicast address for NDN
68inline Address
69getDefaultMulticastAddress()
70{
71 static Address mcast(0x01, 0x00, 0x5E, 0x00, 0x17, 0xAA);
72 return mcast;
73}
74
75inline
76Address::Address()
77{
78 assign(0);
79}
80
81inline
82Address::Address(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6)
83{
84 elems[0] = a1;
85 elems[1] = a2;
86 elems[2] = a3;
87 elems[3] = a4;
88 elems[4] = a5;
89 elems[5] = a6;
90}
91
92inline
93Address::Address(const uint8_t octets[])
94{
95 std::copy(octets, octets + size(), begin());
96}
97
98inline
99Address::Address(const Address& address)
100{
101 std::copy(address.begin(), address.end(), begin());
102}
103
104inline bool
105Address::isBroadcast() const
106{
107 return elems[0] == 0xFF && elems[1] == 0xFF && elems[2] == 0xFF &&
108 elems[3] == 0xFF && elems[4] == 0xFF && elems[5] == 0xFF;
109}
110
111inline bool
112Address::isMulticast() const
113{
114 return (elems[0] & 1) != 0;
115}
116
117inline std::string
118Address::toString(char sep) const
119{
120 char s[18]; // 12 digits + 5 separators + null terminator
121 ::snprintf(s, sizeof(s), "%02x%c%02x%c%02x%c%02x%c%02x%c%02x",
122 elems[0], sep, elems[1], sep, elems[2], sep,
123 elems[3], sep, elems[4], sep, elems[5]);
124 return std::string(s);
125}
126
127static std::ostream&
128operator<<(std::ostream& o, const Address& a)
129{
130 return o << a.toString();
131}
132
133} // namespace ethernet
134} // namespace nfd
135
136#endif // NFD_FACE_ETHERNET_HPP