blob: 573ea56006dc2323eded287adcc4ed86ea332f48 [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
Davide Pesavento248d6bd2014-03-09 10:24:08 +010055 /// True if this is a null address (00-00-00-00-00-00)
56 bool
57 isNull() const;
58
Davide Pesavento56fb5972014-03-12 06:18:37 +010059 /**
60 * @brief Converts the address to a human-readable string
61 *
62 * @param sep A character used to visually separate the octets,
63 * usually a dash (the default value) or a colon
64 */
Davide Pesavento44deacc2014-02-19 10:48:07 +010065 std::string
66 toString(char sep = '-') const;
Davide Pesavento56fb5972014-03-12 06:18:37 +010067
68 /**
69 * @brief Creates an Address from a string containing an Ethernet address
70 * in hexadecimal notation, with colons or dashes as separators
71 *
72 * @param str The string to be parsed
73 * @return Always an instance of Address, which will be null
74 * if the parsing fails
75 */
76 static Address
77 fromString(const std::string& str);
Davide Pesavento44deacc2014-02-19 10:48:07 +010078};
79
80/// Returns the Ethernet broadcast address (FF-FF-FF-FF-FF-FF)
81inline Address
82getBroadcastAddress()
83{
84 static Address bcast(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
85 return bcast;
86}
87
88/// Returns the default Ethernet multicast address for NDN
89inline Address
90getDefaultMulticastAddress()
91{
92 static Address mcast(0x01, 0x00, 0x5E, 0x00, 0x17, 0xAA);
93 return mcast;
94}
95
96inline
97Address::Address()
98{
99 assign(0);
100}
101
102inline
103Address::Address(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6)
104{
105 elems[0] = a1;
106 elems[1] = a2;
107 elems[2] = a3;
108 elems[3] = a4;
109 elems[4] = a5;
110 elems[5] = a6;
111}
112
113inline
114Address::Address(const uint8_t octets[])
115{
116 std::copy(octets, octets + size(), begin());
117}
118
119inline
120Address::Address(const Address& address)
121{
122 std::copy(address.begin(), address.end(), begin());
123}
124
125inline bool
126Address::isBroadcast() const
127{
128 return elems[0] == 0xFF && elems[1] == 0xFF && elems[2] == 0xFF &&
129 elems[3] == 0xFF && elems[4] == 0xFF && elems[5] == 0xFF;
130}
131
132inline bool
133Address::isMulticast() const
134{
135 return (elems[0] & 1) != 0;
136}
137
Davide Pesavento248d6bd2014-03-09 10:24:08 +0100138inline bool
139Address::isNull() const
140{
141 return elems[0] == 0x0 && elems[1] == 0x0 && elems[2] == 0x0 &&
142 elems[3] == 0x0 && elems[4] == 0x0 && elems[5] == 0x0;
143}
144
Davide Pesavento56fb5972014-03-12 06:18:37 +0100145std::ostream&
146operator<<(std::ostream& o, const Address& a);
Davide Pesavento44deacc2014-02-19 10:48:07 +0100147
148} // namespace ethernet
149} // namespace nfd
150
151#endif // NFD_FACE_ETHERNET_HPP