blob: 3b8c7752be8c3df188cb7ead889114d5e2fbc223 [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Alexander Afanasyev7112f482011-08-17 14:05:57 -07004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Alexander Afanasyev7112f482011-08-17 14:05:57 -07007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * 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.
Alexander Afanasyev7112f482011-08-17 14:05:57 -070011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * 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.
Alexander Afanasyev7112f482011-08-17 14:05:57 -070015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * 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 **/
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070019
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070020#ifndef NDN_L3_PROTOCOL_H
21#define NDN_L3_PROTOCOL_H
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070022
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070023#include "ns3/ndnSIM/model/ndn-common.hpp"
24
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070025#include <list>
26#include <vector>
Alexander Afanasyev4975f732011-12-20 17:52:19 -080027
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070028#include "ns3/ptr.h"
29#include "ns3/net-device.h"
Ilya Moiseenkod83eb0d2011-11-16 15:23:46 -080030#include "ns3/nstime.h"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080031#include "ns3/traced-callback.h"
32
Alexander Afanasyevdde1e812015-01-06 14:26:09 -080033#include <boost/property_tree/ptree_fwd.hpp>
34
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080035namespace nfd {
36class Forwarder;
37class FibManager;
Alexander Afanasyev59090db2020-02-21 16:37:43 -050038class FaceTable;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080039class StrategyChoiceManager;
Alexander Afanasyevdde1e812015-01-06 14:26:09 -080040typedef boost::property_tree::ptree ConfigSection;
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -080041namespace pit {
42class Entry;
43} // namespace pit
spirosmastorakis34eed982016-11-02 15:20:50 -070044namespace cs {
45class Policy;
46} // namespace cs
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -050047namespace rib {
48class Service;
49}
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080050} // namespace nfd
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070051
52namespace ns3 {
53
54class Packet;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070055class Node;
Alexander Afanasyevc74a6022011-08-15 20:01:35 -070056class Header;
Ilya Moiseenko172763c2011-10-28 13:21:53 -070057
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070058namespace ndn {
59
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070060/**
61 * \defgroup ndn ndnSIM: NDN simulation module
62 *
Alexander Afanasyevb989b122013-07-10 17:15:46 -070063 * This is a modular implementation of NDN protocol for NS-3
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070064 */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070065/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070066 * \ingroup ndn
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070067 * \brief Implementation network-layer of NDN stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070068 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070069 * This class defines the API to manipulate the following aspects of
70 * the NDN stack implementation:
71 * -# register a face (Face-derived object) for use by the NDN
72 * layer
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070074 * Each Face-derived object has conceptually a single NDN
75 * interface associated with it.
76 *
77 * In addition, this class defines NDN packet coding constants
78 *
79 * \see Face, ForwardingStrategy
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070080 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080081class L3Protocol : boost::noncopyable, public Object {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070082public:
Alexander Afanasyev7112f482011-08-17 14:05:57 -070083 /**
84 * \brief Interface ID
85 *
86 * \return interface ID
87 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080088 static TypeId
89 GetTypeId();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070090
Alexander Afanasyev016a5d82013-07-15 10:41:29 -070091 static const uint16_t ETHERNET_FRAME_TYPE; ///< @brief Ethernet Frame Type of Ndn
92 static const uint16_t IP_STACK_PORT; ///< @brief TCP/UDP port for NDN stack
93 // static const uint16_t IP_PROTOCOL_TYPE; ///< \brief IP protocol type of NDN
Alexander Afanasyev7112f482011-08-17 14:05:57 -070094
95 /**
96 * \brief Default constructor. Creates an empty stack without forwarding strategy set
97 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070098 L3Protocol();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070099
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700100 virtual ~L3Protocol();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800101
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700102 /**
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800103 * \brief Get smart pointer to nfd::Forwarder installed on the node
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700104 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800105 shared_ptr<nfd::Forwarder>
106 getForwarder();
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700107
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500108 nfd::FaceTable&
109 getFaceTable();
110
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700111 /**
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800112 * \brief Get smart pointer to nfd::FibManager, used by node's NFD
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700113 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800114 shared_ptr<nfd::FibManager>
115 getFibManager();
116
117 /**
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500118 * \brief Get nfd::StrategyChoiceManager, used by node's NFD
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800119 */
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500120 nfd::StrategyChoiceManager&
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800121 getStrategyChoiceManager();
122
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500123 ::nfd::rib::Service&
124 getRibService();
125
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800126 /**
127 * \brief Add face to NDN stack
128 *
129 * \param face smart pointer to Face-derived object (AppFace, NetDeviceFace)
130 * \return nfd::FaceId
131 *
132 * \see AppFace, NetDeviceFace
133 */
134 nfd::FaceId
135 addFace(shared_ptr<Face> face);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800136
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700137 /**
138 * \brief Get face by face ID
139 * \param face The face ID number
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800140 * \returns The Face associated with the Ndn face number.
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700141 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800142 shared_ptr<Face>
143 getFaceById(nfd::FaceId face) const;
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700144
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800145 // /**
146 // * \brief Remove face from ndn stack (remove callbacks)
147 // */
148 // virtual void
149 // removeFace(shared_ptr<Face> face);
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -0800150
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700151 /**
152 * \brief Get face for NetDevice
153 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800154 shared_ptr<Face>
155 getFaceByNetDevice(Ptr<NetDevice> netDevice) const;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700156
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800157 /**
158 * \brief Get NFD config (boost::property_tree)
159 */
160 nfd::ConfigSection&
161 getConfig();
162
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700163 /**
164 * \brief Inject interest through internal Face
165 */
166 void
167 injectInterest(const Interest& interest);
168
spirosmastorakis34eed982016-11-02 15:20:50 -0700169 typedef std::function<std::unique_ptr<nfd::cs::Policy>()> PolicyCreationCallback;
170
171 /**
172 * \brief Set the replacement policy of NFD's CS
173 */
174 void
175 setCsReplacementPolicy(const PolicyCreationCallback& policy);
176
Alexander Afanasyev6b2a3c02015-01-03 02:04:23 -0800177public: // Workaround for python bindings
178 static Ptr<L3Protocol>
179 getL3Protocol(Ptr<Object> node);
180
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -0700181public:
182 typedef void (*InterestTraceCallback)(const Interest&, const Face&);
183 typedef void (*DataTraceCallback)(const Data&, const Face&);
184
185 typedef void (*SatisfiedInterestsCallback)(const nfd::pit::Entry& pitEntry, const Face& inFace, const Data& data);
186 typedef void (*TimedOutInterestsCallback)(const nfd::pit::Entry& pitEntry);
187
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700188protected:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800189 virtual void
190 DoDispose(void); ///< @brief Do cleanup
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700191
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700192 /**
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800193 * This function will notify other components connected to the node that a new stack member is now
194 * connected
195 * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them
196 * together.
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700197 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 virtual void
199 NotifyNewAggregate();
Alexander Afanasyev98256102011-08-14 01:00:02 -0700200
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700201private:
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800202 void
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700203 initialize();
204
205 void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800206 initializeManagement();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800207
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700208 void
209 initializeRibManager();
210
Alexander Afanasyev98256102011-08-14 01:00:02 -0700211private:
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800212 class Impl;
213 std::unique_ptr<Impl> m_impl;
214
215 // These objects are aggregated, but for optimization, get them here
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700216 Ptr<Node> m_node; ///< \brief node on which ndn stack is installed
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800217
218 TracedCallback<const Interest&, const Face&>
219 m_inInterests; ///< @brief trace of incoming Interests
220 TracedCallback<const Interest&, const Face&>
221 m_outInterests; ///< @brief Transmitted interests trace
222
223 TracedCallback<const Data&, const Face&> m_outData; ///< @brief trace of outgoing Data
224 TracedCallback<const Data&, const Face&> m_inData; ///< @brief trace of incoming Data
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800225
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800226 TracedCallback<const lp::Nack&, const Face&> m_outNack; ///< @brief trace of outgoing Nack
227 TracedCallback<const lp::Nack&, const Face&> m_inNack; ///< @brief trace of incoming Nack
228
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800229 TracedCallback<const nfd::pit::Entry&, const Face&/*in face*/, const Data&> m_satisfiedInterests;
230 TracedCallback<const nfd::pit::Entry&> m_timedOutInterests;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700231};
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700232
233} // namespace ndn
234} // namespace ns3
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700235
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700236#endif /* NDN_L3_PROTOCOL_H */