NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
ethernet-protocol.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014-2022, Regents of the University of California,
4  * Arizona Board of Regents,
5  * Colorado State University,
6  * University Pierre & Marie Curie, Sorbonne University,
7  * Washington University in St. Louis,
8  * Beijing Institute of Technology,
9  * The University of Memphis.
10  *
11  * This file is part of NFD (Named Data Networking Forwarding Daemon).
12  * See AUTHORS.md for complete list of NFD authors and contributors.
13  *
14  * NFD is free software: you can redistribute it and/or modify it under the terms
15  * of the GNU General Public License as published by the Free Software Foundation,
16  * either version 3 of the License, or (at your option) any later version.
17  *
18  * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20  * PURPOSE. See the GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License along with
23  * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24  */
25 
26 #include "ethernet-protocol.hpp"
27 
28 #include <boost/endian/conversion.hpp>
29 
30 namespace nfd {
31 namespace ethernet {
32 
33 std::tuple<const ether_header*, std::string>
34 checkFrameHeader(span<const uint8_t> packet, const Address& localAddr, const Address& destAddr)
35 {
36  if (packet.size() < HDR_LEN + MIN_DATA_LEN)
37  return {nullptr, "Received frame too short: " + to_string(packet.size()) + " bytes"};
38 
39  const ether_header* eh = reinterpret_cast<const ether_header*>(packet.data());
40 
41  // in some cases VLAN-tagged frames may survive the BPF filter,
42  // make sure we do not process those frames (see #3348)
43  uint16_t ethertype = boost::endian::big_to_native(eh->ether_type);
44  if (ethertype != ETHERTYPE_NDN)
45  return {nullptr, "Received frame with wrong ethertype: " + to_string(ethertype)};
46 
47 #ifdef _DEBUG
48  Address shost(eh->ether_shost);
49  if (shost == localAddr)
50  return {nullptr, "Received frame sent by this host"};
51 
52  Address dhost(eh->ether_dhost);
53  if (dhost != destAddr)
54  return {nullptr, "Received frame addressed to another host or multicast group: " + dhost.toString()};
55 #endif
56 
57  return {eh, ""};
58 }
59 
60 } // namespace ethernet
61 } // namespace nfd
const size_t MIN_DATA_LEN
Min octets in Ethernet payload (assuming no 802.1Q tag)
Definition: ethernet.hpp:45
std::string to_string(const T &val)
Definition: backports.hpp:86
std::string toString(char sep=':') const
Converts the address to a human-readable string.
Definition: ethernet.cpp:78
Copyright (c) 2011-2015 Regents of the University of California.
Definition: ndn-common.hpp:39
std::tuple< const ether_header *, std::string > checkFrameHeader(span< const uint8_t > packet, const Address &localAddr, const Address &destAddr)
const size_t HDR_LEN
Total octets in Ethernet header (without 802.1Q tag)
Definition: ethernet.hpp:43
const uint16_t ETHERTYPE_NDN
Definition: ethernet.hpp:39
represents an Ethernet hardware address
Definition: ethernet.hpp:52