blob: 32abaa6e02bd7e863edce1a2fbbcf10314aa1657 [file] [log] [blame]
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2016 Regents of the University of California.
4 *
5 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
7 *
8 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
19
20#include "ndn-net-device-transport.hpp"
21
22#include "../helper/ndn-stack-helper.hpp"
23#include "ndn-block-header.hpp"
24#include "../utils/ndn-ns3-packet-tag.hpp"
25
26#include <ndn-cxx/encoding/block.hpp>
27#include <ndn-cxx/interest.hpp>
28#include <ndn-cxx/data.hpp>
29
30NS_LOG_COMPONENT_DEFINE("ndn.NetDeviceTransport");
31
32namespace ns3 {
33namespace ndn {
34
35NetDeviceTransport::NetDeviceTransport(Ptr<Node> node,
36 const Ptr<NetDevice>& netDevice,
37 const std::string& localUri,
38 const std::string& remoteUri,
39 ::ndn::nfd::FaceScope scope,
40 ::ndn::nfd::FacePersistency persistency,
41 ::ndn::nfd::LinkType linkType)
42 : m_netDevice(netDevice)
43 , m_node(node)
44{
45 this->setLocalUri(FaceUri(localUri));
46 this->setRemoteUri(FaceUri(remoteUri));
47 this->setScope(scope);
48 this->setPersistency(persistency);
49 this->setLinkType(linkType);
Spyridon Mastorakiscb9be5c2018-02-20 11:22:27 -080050 this->setMtu(m_netDevice->GetMtu()); // Use the MTU of the netDevice
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080051
52 NS_LOG_FUNCTION(this << "Creating an ndnSIM transport instance for netDevice with URI"
53 << this->getLocalUri());
54
55 NS_ASSERT_MSG(m_netDevice != 0, "NetDeviceFace needs to be assigned a valid NetDevice");
56
57 m_node->RegisterProtocolHandler(MakeCallback(&NetDeviceTransport::receiveFromNetDevice, this),
58 L3Protocol::ETHERNET_FRAME_TYPE, m_netDevice,
59 true /*promiscuous mode*/);
60}
61
62NetDeviceTransport::~NetDeviceTransport()
63{
64 NS_LOG_FUNCTION_NOARGS();
65}
66
67void
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080068NetDeviceTransport::doClose()
69{
70 NS_LOG_FUNCTION(this << "Closing transport for netDevice with URI"
71 << this->getLocalUri());
72
73 // set the state of the transport to "CLOSED"
74 this->setState(nfd::face::TransportState::CLOSED);
75}
76
77void
78NetDeviceTransport::doSend(Packet&& packet)
79{
80 NS_LOG_FUNCTION(this << "Sending packet from netDevice with URI"
81 << this->getLocalUri());
82
83 // convert NFD packet to NS3 packet
84 BlockHeader header(packet);
85
86 Ptr<ns3::Packet> ns3Packet = Create<ns3::Packet>();
87 ns3Packet->AddHeader(header);
88
89 // send the NS3 packet
90 m_netDevice->Send(ns3Packet, m_netDevice->GetBroadcast(),
91 L3Protocol::ETHERNET_FRAME_TYPE);
92}
93
94// callback
95void
96NetDeviceTransport::receiveFromNetDevice(Ptr<NetDevice> device,
97 Ptr<const ns3::Packet> p,
98 uint16_t protocol,
99 const Address& from, const Address& to,
100 NetDevice::PacketType packetType)
101{
102 NS_LOG_FUNCTION(device << p << protocol << from << to << packetType);
103
104 // Convert NS3 packet to NFD packet
105 Ptr<ns3::Packet> packet = p->Copy();
106
107 BlockHeader header;
108 packet->RemoveHeader(header);
109
110 auto nfdPacket = Packet(std::move(header.getBlock()));
111
112 this->receive(std::move(nfdPacket));
113}
114
115Ptr<NetDevice>
116NetDeviceTransport::GetNetDevice() const
117{
118 return m_netDevice;
119}
120
121} // namespace ndn
122} // namespace ns3