EMANE  1.0.1
ethernettransport.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013,2016 - Adjacent Link LLC, Bridgewater, New Jersey
3  * Copyright (c) 2009-2012 - DRS CenGen, LLC, Columbia, Maryland
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in
14  * the documentation and/or other materials provided with the
15  * distribution.
16  * * Neither the name of DRS CenGen, LLC nor the names of its
17  * contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef ETHERNETTRANSPORT_HEADER_
35 #define ETHERNETTRANSPORT_HEADER_
36 
37 #include "emane/transport.h"
38 #include "emane/utils/netutils.h"
39 
40 #include <mutex>
41 #include <map>
42 
43 namespace EMANE
44 {
45  namespace Transports
46  {
47  namespace Ethernet
48  {
56  {
57  public:
59 
61 
62  protected:
63  virtual int parseFrame(const Utils::EtherHeader *pEthHeader,
64  EMANE::NEMId & dst,
65  std::uint8_t & dscp);
66 
67  virtual int verifyFrame(const void * buf, size_t len);
68 
69  void updateArpCache(const Utils::EtherHeader *pEthHeader, EMANE::NEMId nemId);
70 
71  void addEntry(const Utils::EtherAddr& addr, EMANE::NEMId nemId);
72 
74 
77 
78  private:
79  std::mutex mutex_;
80 
85  struct ltmacaddr
86  {
95  bool operator()(const Utils::EtherAddr& a1, const Utils::EtherAddr& a2) const
96  {
97  return memcmp(&a1, &a2, Utils::ETH_ALEN) < 0;
98  }
99  };
100 
101  using EthAddrMap = std::map<Utils::EtherAddr, EMANE::NEMId, ltmacaddr>;
102 
103  EthAddrMap macCache_;
104  };
105  }
106  }
107 }
108 
109 #endif //ETHERNETTRANSPORT_HEADER_
Base class for all transports.
Definition: transport.h:49
union EtherAddr dst
Definition: netutils.h:390
virtual int parseFrame(const Utils::EtherHeader *pEthHeader, EMANE::NEMId &dst, std::uint8_t &dscp)
The PlatformServiceProvider interface provides access to emulator services.
std::uint16_t NEMId
Definition: types.h:52
Definition of the ethernet frame address as an array of 6 bytes or set of 3 words.
Definition: netutils.h:422
EMANE::NEMId lookupArpCache(const Utils::EtherAddr *pEthAddr)
void addEntry(const Utils::EtherAddr &addr, EMANE::NEMId nemId)
const std::uint16_t ETH_ALEN
Ethernet hardware address length.
Definition: netutils.h:335
virtual int verifyFrame(const void *buf, size_t len)
EthernetTransport(EMANE::NEMId id, EMANE::PlatformServiceProvider *pPlatformService)
Definition of the ethernet frame header.
Definition: netutils.h:434
void updateArpCache(const Utils::EtherHeader *pEthHeader, EMANE::NEMId nemId)
Definition: agent.h:43