blob: 17880d279bf42b3d90479f3d76c91fd0cb749a63 [file] [log] [blame]
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Eric Newberry8821d3e2018-07-04 16:42:01 -04002/*
3 * Copyright (c) 2011-2018 Regents of the University of California.
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -08004 *
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
Eric Newberry8821d3e2018-07-04 16:42:01 -040030#include "ns3/queue.h"
31
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080032NS_LOG_COMPONENT_DEFINE("ndn.NetDeviceTransport");
33
34namespace ns3 {
35namespace ndn {
36
37NetDeviceTransport::NetDeviceTransport(Ptr<Node> node,
38 const Ptr<NetDevice>& netDevice,
39 const std::string& localUri,
40 const std::string& remoteUri,
41 ::ndn::nfd::FaceScope scope,
42 ::ndn::nfd::FacePersistency persistency,
43 ::ndn::nfd::LinkType linkType)
44 : m_netDevice(netDevice)
45 , m_node(node)
46{
47 this->setLocalUri(FaceUri(localUri));
48 this->setRemoteUri(FaceUri(remoteUri));
49 this->setScope(scope);
50 this->setPersistency(persistency);
51 this->setLinkType(linkType);
Spyridon Mastorakiscb9be5c2018-02-20 11:22:27 -080052 this->setMtu(m_netDevice->GetMtu()); // Use the MTU of the netDevice
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080053
Eric Newberry8821d3e2018-07-04 16:42:01 -040054 // Get send queue capacity for congestion marking
55 PointerValue txQueueAttribute;
56 if (m_netDevice->GetAttributeFailSafe("TxQueue", txQueueAttribute)) {
57 Ptr<ns3::QueueBase> txQueue = txQueueAttribute.Get<ns3::QueueBase>();
58 // must be put into bytes mode queue
59 this->setSendQueueCapacity(txQueue->GetMaxBytes());
60 }
61
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080062 NS_LOG_FUNCTION(this << "Creating an ndnSIM transport instance for netDevice with URI"
63 << this->getLocalUri());
64
65 NS_ASSERT_MSG(m_netDevice != 0, "NetDeviceFace needs to be assigned a valid NetDevice");
66
67 m_node->RegisterProtocolHandler(MakeCallback(&NetDeviceTransport::receiveFromNetDevice, this),
68 L3Protocol::ETHERNET_FRAME_TYPE, m_netDevice,
69 true /*promiscuous mode*/);
70}
71
72NetDeviceTransport::~NetDeviceTransport()
73{
74 NS_LOG_FUNCTION_NOARGS();
75}
76
Eric Newberry8821d3e2018-07-04 16:42:01 -040077ssize_t
78NetDeviceTransport::getSendQueueLength()
79{
80 PointerValue txQueueAttribute;
81 if (m_netDevice->GetAttributeFailSafe("TxQueue", txQueueAttribute)) {
82 Ptr<ns3::QueueBase> txQueue = txQueueAttribute.Get<ns3::QueueBase>();
83 return txQueue->GetNBytes();
84 }
85 else {
86 return nfd::face::QUEUE_UNSUPPORTED;
87 }
88}
89
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080090void
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080091NetDeviceTransport::doClose()
92{
93 NS_LOG_FUNCTION(this << "Closing transport for netDevice with URI"
94 << this->getLocalUri());
95
96 // set the state of the transport to "CLOSED"
97 this->setState(nfd::face::TransportState::CLOSED);
98}
99
100void
101NetDeviceTransport::doSend(Packet&& packet)
102{
103 NS_LOG_FUNCTION(this << "Sending packet from netDevice with URI"
104 << this->getLocalUri());
105
106 // convert NFD packet to NS3 packet
107 BlockHeader header(packet);
108
109 Ptr<ns3::Packet> ns3Packet = Create<ns3::Packet>();
110 ns3Packet->AddHeader(header);
111
112 // send the NS3 packet
113 m_netDevice->Send(ns3Packet, m_netDevice->GetBroadcast(),
114 L3Protocol::ETHERNET_FRAME_TYPE);
115}
116
117// callback
118void
119NetDeviceTransport::receiveFromNetDevice(Ptr<NetDevice> device,
120 Ptr<const ns3::Packet> p,
121 uint16_t protocol,
122 const Address& from, const Address& to,
123 NetDevice::PacketType packetType)
124{
125 NS_LOG_FUNCTION(device << p << protocol << from << to << packetType);
126
127 // Convert NS3 packet to NFD packet
128 Ptr<ns3::Packet> packet = p->Copy();
129
130 BlockHeader header;
131 packet->RemoveHeader(header);
132
133 auto nfdPacket = Packet(std::move(header.getBlock()));
134
135 this->receive(std::move(nfdPacket));
136}
137
138Ptr<NetDevice>
139NetDeviceTransport::GetNetDevice() const
140{
141 return m_netDevice;
142}
143
144} // namespace ndn
145} // namespace ns3