blob: 03618d5b5d02ed4eff2b77e772bb540d8cd896b2 [file] [log] [blame]
Alexander Afanasyevc74a6022011-08-15 20:01:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev7112f482011-08-17 14:05:57 -07002/*
3 * Copyright (c) 2011 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070020
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070021#ifndef NDN_L3_PROTOCOL_H
22#define NDN_L3_PROTOCOL_H
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070023
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070024#include "ns3/ndnSIM/model/ndn-common.hpp"
Alexander Afanasyev82d5ffe2014-12-30 23:55:38 -080025#include "ns3/ndnSIM/model/ndn-face.hpp"
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070026
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070027#include <list>
28#include <vector>
Alexander Afanasyev4975f732011-12-20 17:52:19 -080029
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070030#include "ns3/ptr.h"
31#include "ns3/net-device.h"
Ilya Moiseenkod83eb0d2011-11-16 15:23:46 -080032#include "ns3/nstime.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070033
34namespace ns3 {
35
36class Packet;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070037class Node;
Alexander Afanasyevc74a6022011-08-15 20:01:35 -070038class Header;
Ilya Moiseenko172763c2011-10-28 13:21:53 -070039
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070040namespace ndn {
41
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070042/**
43 * \defgroup ndn ndnSIM: NDN simulation module
44 *
Alexander Afanasyevb989b122013-07-10 17:15:46 -070045 * This is a modular implementation of NDN protocol for NS-3
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070046 */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070047/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070048 * \ingroup ndn
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070049 * \brief Implementation network-layer of NDN stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070050 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070051 * This class defines the API to manipulate the following aspects of
52 * the NDN stack implementation:
53 * -# register a face (Face-derived object) for use by the NDN
54 * layer
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080055 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070056 * Each Face-derived object has conceptually a single NDN
57 * interface associated with it.
58 *
59 * In addition, this class defines NDN packet coding constants
60 *
61 * \see Face, ForwardingStrategy
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070062 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080063class L3Protocol : public Object {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070064public:
Alexander Afanasyev7112f482011-08-17 14:05:57 -070065 /**
66 * \brief Interface ID
67 *
68 * \return interface ID
69 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070 static TypeId
71 GetTypeId();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070072
Alexander Afanasyev016a5d82013-07-15 10:41:29 -070073 static const uint16_t ETHERNET_FRAME_TYPE; ///< @brief Ethernet Frame Type of Ndn
74 static const uint16_t IP_STACK_PORT; ///< @brief TCP/UDP port for NDN stack
75 // static const uint16_t IP_PROTOCOL_TYPE; ///< \brief IP protocol type of NDN
Alexander Afanasyev7112f482011-08-17 14:05:57 -070076
77 /**
78 * \brief Default constructor. Creates an empty stack without forwarding strategy set
79 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070080 L3Protocol();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081 virtual ~L3Protocol();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070082
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070083 /**
84 * \brief Add face to Ndn stack
85 *
86 * \param face smart pointer to NdnFace-derived object
87 * (NdnLocalFace, NdnNetDeviceFace, NdnUdpFace) \returns the
88 * index of the Ndn interface added.
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080089 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070090 * \see NdnLocalFace, NdnNetDeviceFace, NdnUdpFace
91 */
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -070092 virtual uint32_t
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -070093 AddFace(const shared_ptr<Face>& face);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080094
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070095 /**
96 * \brief Get current number of faces added to Ndn stack
97 *
98 * \returns the number of faces
99 */
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700100 virtual uint32_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800101 GetNFaces() const;
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700102
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700103 /**
104 * \brief Get face by face index
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700105 * \param face The face number (number in face list)
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700106 * \returns The NdnFace associated with the Ndn face number.
107 */
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700108 virtual shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800109 GetFace(uint32_t face) const;
110
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700111 /**
112 * \brief Get face by face ID
113 * \param face The face ID number
114 * \returns The NdnFace associated with the Ndn face number.
115 */
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700116 virtual shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800117 GetFaceById(uint32_t face) const;
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700118
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700119 /**
120 * \brief Remove face from ndn stack (remove callbacks)
121 */
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700122 virtual void
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700123 RemoveFace(shared_ptr<Face> face);
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -0800124
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700125 /**
126 * \brief Get face for NetDevice
127 */
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700128 virtual shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800129 GetFaceByNetDevice(Ptr<NetDevice> netDevice) const;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700130
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700131protected:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800132 virtual void
133 DoDispose(void); ///< @brief Do cleanup
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700134
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700135 /**
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800136 * This function will notify other components connected to the node that a new stack member is now
137 * connected
138 * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them
139 * together.
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700140 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800141 virtual void
142 NotifyNewAggregate();
Alexander Afanasyev98256102011-08-14 01:00:02 -0700143
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700144private:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800145 L3Protocol(const L3Protocol&); ///< copy constructor is disabled
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700146
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800147 L3Protocol&
148 operator=(const L3Protocol&); ///< copy operator is disabled
149
Alexander Afanasyev98256102011-08-14 01:00:02 -0700150private:
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700151 Ptr<Node> m_node; ///< \brief node on which ndn stack is installed
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700152};
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700153
154} // namespace ndn
155} // namespace ns3
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700156
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700157#endif /* NDN_L3_PROTOCOL_H */