blob: 13f610629b1592845ab4be1d899f4a433dadee32 [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"
Alexander Afanasyev82d5ffe2014-12-30 23:55:38 -080024#include "ns3/ndnSIM/model/ndn-face.hpp"
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070025
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070026#include <list>
27#include <vector>
Alexander Afanasyev4975f732011-12-20 17:52:19 -080028
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070029#include "ns3/ptr.h"
30#include "ns3/net-device.h"
Ilya Moiseenkod83eb0d2011-11-16 15:23:46 -080031#include "ns3/nstime.h"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080032#include "ns3/traced-callback.h"
33
34namespace nfd {
35class Forwarder;
36class FibManager;
37class StrategyChoiceManager;
38} // namespace nfd
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070039
40namespace ns3 {
41
42class Packet;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070043class Node;
Alexander Afanasyevc74a6022011-08-15 20:01:35 -070044class Header;
Ilya Moiseenko172763c2011-10-28 13:21:53 -070045
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070046namespace ndn {
47
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070048/**
49 * \defgroup ndn ndnSIM: NDN simulation module
50 *
Alexander Afanasyevb989b122013-07-10 17:15:46 -070051 * This is a modular implementation of NDN protocol for NS-3
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070052 */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070053/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070054 * \ingroup ndn
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070055 * \brief Implementation network-layer of NDN stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070056 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070057 * This class defines the API to manipulate the following aspects of
58 * the NDN stack implementation:
59 * -# register a face (Face-derived object) for use by the NDN
60 * layer
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080061 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070062 * Each Face-derived object has conceptually a single NDN
63 * interface associated with it.
64 *
65 * In addition, this class defines NDN packet coding constants
66 *
67 * \see Face, ForwardingStrategy
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070068 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080069class L3Protocol : boost::noncopyable, public Object {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070070public:
Alexander Afanasyev7112f482011-08-17 14:05:57 -070071 /**
72 * \brief Interface ID
73 *
74 * \return interface ID
75 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080076 static TypeId
77 GetTypeId();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070078
Alexander Afanasyev016a5d82013-07-15 10:41:29 -070079 static const uint16_t ETHERNET_FRAME_TYPE; ///< @brief Ethernet Frame Type of Ndn
80 static const uint16_t IP_STACK_PORT; ///< @brief TCP/UDP port for NDN stack
81 // static const uint16_t IP_PROTOCOL_TYPE; ///< \brief IP protocol type of NDN
Alexander Afanasyev7112f482011-08-17 14:05:57 -070082
83 /**
84 * \brief Default constructor. Creates an empty stack without forwarding strategy set
85 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070086 L3Protocol();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080087 virtual ~L3Protocol();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070088
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070089 /**
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080090 * \brief Initialize NFD instance
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070091 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080092 void
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080093 initialize(bool shouldUseNfdCs);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080094
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070095 /**
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080096 * \brief Get smart pointer to nfd::Forwarder installed on the node
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070097 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080098 shared_ptr<nfd::Forwarder>
99 getForwarder();
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700100
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700101 /**
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800102 * \brief Get smart pointer to nfd::FibManager, used by node's NFD
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700103 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800104 shared_ptr<nfd::FibManager>
105 getFibManager();
106
107 /**
108 * \brief Get smart pointer to nfd::StrategyChoiceManager, used by node's NFD
109 */
110 shared_ptr<nfd::StrategyChoiceManager>
111 getStrategyChoiceManager();
112
113
114 /**
115 * \brief Add face to NDN stack
116 *
117 * \param face smart pointer to Face-derived object (AppFace, NetDeviceFace)
118 * \return nfd::FaceId
119 *
120 * \see AppFace, NetDeviceFace
121 */
122 nfd::FaceId
123 addFace(shared_ptr<Face> face);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800124
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700125 /**
126 * \brief Get face by face ID
127 * \param face The face ID number
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800128 * \returns The Face associated with the Ndn face number.
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700129 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800130 shared_ptr<Face>
131 getFaceById(nfd::FaceId face) const;
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700132
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800133 // /**
134 // * \brief Remove face from ndn stack (remove callbacks)
135 // */
136 // virtual void
137 // removeFace(shared_ptr<Face> face);
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -0800138
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700139 /**
140 * \brief Get face for NetDevice
141 */
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800142 shared_ptr<Face>
143 getFaceByNetDevice(Ptr<NetDevice> netDevice) const;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700144
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700145protected:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800146 virtual void
147 DoDispose(void); ///< @brief Do cleanup
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700148
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700149 /**
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800150 * This function will notify other components connected to the node that a new stack member is now
151 * connected
152 * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them
153 * together.
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700154 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800155 virtual void
156 NotifyNewAggregate();
Alexander Afanasyev98256102011-08-14 01:00:02 -0700157
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700158private:
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800159 void
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800160 initializeManagement(bool isNfd);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800161
Alexander Afanasyev98256102011-08-14 01:00:02 -0700162private:
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800163 class Impl;
164 std::unique_ptr<Impl> m_impl;
165
166 // These objects are aggregated, but for optimization, get them here
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700167 Ptr<Node> m_node; ///< \brief node on which ndn stack is installed
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800168
169 TracedCallback<const Interest&, const Face&>
170 m_inInterests; ///< @brief trace of incoming Interests
171 TracedCallback<const Interest&, const Face&>
172 m_outInterests; ///< @brief Transmitted interests trace
173
174 TracedCallback<const Data&, const Face&> m_outData; ///< @brief trace of outgoing Data
175 TracedCallback<const Data&, const Face&> m_inData; ///< @brief trace of incoming Data
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700176};
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700177
178} // namespace ndn
179} // namespace ns3
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700180
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700181#endif /* NDN_L3_PROTOCOL_H */