blob: 38c2f745d2e7a67c170d3ed140302312ee52f6d9 [file] [log] [blame]
Alexander Afanasyevc74a6022011-08-15 20:01:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -07002/*
Alexander Afanasyev7112f482011-08-17 14:05:57 -07003 * Copyright (c) 2011 University of California, Los Angeles
Alexander Afanasyev08d984e2011-08-13 19:20:22 -07004 *
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 *
Alexander Afanasyev7112f482011-08-17 14:05:57 -070018 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070019 */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070020
Alexander Afanasyev7112f482011-08-17 14:05:57 -070021#ifndef _CCNX_H_
22#define _CCNX_H_
23
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070024#include "ns3/object.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070025#include "ns3/callback.h"
26
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070027namespace ns3 {
28
29class Node;
30class NetDevice;
31class Packet;
Alexander Afanasyevc74a6022011-08-15 20:01:35 -070032class CcnxForwardingStrategy;
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070033class CcnxFace;
Alexander Afanasyevcf133f02011-09-06 12:13:48 -070034class CcnxContentObjectHeader;
35class CcnxInterestHeader;
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070036
37/**
38 * \internal
39 * \brief Private namespace for CCNx content store implementation
40 */
41namespace __ccnx_private
42{
43class i_face {};
44class i_metric {};
45class i_nth {};
46class i_prefix {};
47class i_ordered {}; ///< tag for Boost.MultiIndex container (ordered by prefix)
48class i_mru {};
49}
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070050
Ilya Moiseenkobdf78d62011-10-28 13:20:10 -070051// default data size
Alexander Afanasyeva5bbe0e2011-11-22 17:28:39 -080052// #define NDN_DEFAULT_DATA_SIZE 1024
53// #define NDN_INTEREST_RESET_PERIOD (10*MILLI_SECOND)
54
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070055/**
Alexander Afanasyev7112f482011-08-17 14:05:57 -070056 * \defgroup ccnx NDN abstraction
57 *
58 * This is an abstract implementation of NDN protocol
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070059 */
60/**
61 * \ingroup ccnx
Alexander Afanasyev7112f482011-08-17 14:05:57 -070062 * \brief Interface to manage Ccnx stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070063 *
64 * This class defines the API to manipulate the following aspects of
Alexander Afanasyev7112f482011-08-17 14:05:57 -070065 * the Ccnx stack implementation:
66 * -# register a face (CcnxFace-derived object) for use by the Ccnx
67 * layer
68 * -# register forwarding strategy (CcnxForwardingStrategy-derived
69 * object) to use by Ccnx stack
70 * -# export Ccnx configuration attributes
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070071 *
Alexander Afanasyev7112f482011-08-17 14:05:57 -070072 * Each CcnxFace-derived object has conceptually a single Ccnx
73 * interface associated with it.
74 *
75 * In addition, this class defines CCNx packet coding constants
76 *
77 * \see CcnxFace, CcnxForwardingStrategy
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070078 */
79class Ccnx : public Object
80{
81public:
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080082 enum ForwardingStrategy
Ilya Moiseenko2b4e1492011-09-29 18:55:14 -070083 {
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080084 NDN_FLOODING = 1,
85 NDN_BESTROUTE = 2,
86 NDN_RANKING = 3
Ilya Moiseenko2b4e1492011-09-29 18:55:14 -070087 };
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080088
Alexander Afanasyev7112f482011-08-17 14:05:57 -070089 /**
90 * \brief Interface ID
91 *
92 * \return interface ID
93 */
94 static TypeId GetTypeId ();
Alexander Afanasyev4fa5e842011-11-21 13:38:39 -080095 virtual ~Ccnx ();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070096
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080097 // /**
98 // * \brief Send an Interest packet to a specified face
99 // *
100 // * \param face face where to send this packet
101 // * \param header Interest header
102 // * \param packet fully prepared CCNx packet to send
103 // *
104 // * Higher-level layers (forwarding strategy in particular) call this
105 // * method to send a packet down the stack to the MAC and PHY layers.
106 // */
107 // virtual void
108 // SendInterest (const Ptr<CcnxFace> &face,
109 // const Ptr<const CcnxInterestHeader> &header,
110 // const Ptr<Packet> &packet) = 0;
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700111
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800112 // /**
113 // * \brief Send a ContentObject packet to a specified face
114 // *
115 // * \param face face where to send this packet
116 // * \param header ContentObject header
117 // * \param packet fully prepared CCNx packet to send
118 // *
119 // * Higher-level layers (forwarding strategy in particular) call this
120 // * method to send a packet down the stack to the MAC and PHY layers.
121 // */
122 // virtual void
123 // SendContentObject (const Ptr<CcnxFace> &face,
124 // const Ptr<const CcnxContentObjectHeader> &header,
125 // const Ptr<Packet> &packet) = 0;
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700126
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800127 // /**
128 // * \brief Lower layers calls this method after demultiplexing
129 // *
130 // * Lower-layer-dependent implementation of CcnxFace will do actual work
131 // * to set up demultiplexing and call this function as a callback
132 // *
133 // * \param face face from which packet came from
134 // * \param p the packet
135 // */
136 // virtual void
137 // Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p) = 0;
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700138
139 /**
140 * \brief Register a new forwarding strategy to be used by this Ccnx
141 * stack
142 *
143 * This call will replace any forwarding strategy that has been
144 * previously registered.
145 *
146 * \param forwardingStrategy smart pointer to CcnxForwardingStrategy
147 * object
148 */
149 virtual void
150 SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy) = 0;
151
152 /**
153 * \brief Get the forwarding strategy being used by this Ccnx stack
154 *
155 * \returns smart pointer to CcnxForwardingStrategy object, or null
156 * pointer if none
157 */
158 virtual Ptr<CcnxForwardingStrategy>
159 GetForwardingStrategy (void) const = 0;
160
161 /**
162 * \brief Add face to CCNx stack
163 *
164 * \param face smart pointer to CcnxFace-derived object
165 * (CcnxLocalFace, CcnxNetDeviceFace, CcnxUdpFace) \returns the
166 * index of the Ccnx interface added.
167 *
168 * \see CcnxLocalFace, CcnxNetDeviceFace, CcnxUdpFace
169 */
170 virtual uint32_t
171 AddFace (const Ptr<CcnxFace> &face) = 0;
172
173 /**
174 * \brief Get current number of faces added to CCNx stack
175 *
176 * \returns the number of faces
177 */
178 virtual uint32_t
179 GetNFaces (void) const = 0;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700180
181 /**
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700182 * \brief Get face by face index
Alexander Afanasyev98256102011-08-14 01:00:02 -0700183 * \param face The face number of an Ccnx interface.
184 * \returns The CcnxFace associated with the Ccnx face number.
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700185 */
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700186 virtual Ptr<CcnxFace>
187 GetFace (uint32_t face) const = 0;
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700188
189 /**
190 * \brief Remove face from ccnx stack (remove callbacks)
191 */
192 virtual void
193 RemoveFace (Ptr<CcnxFace> face) = 0;
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -0800194
195 /**
196 * Get face for NetDevice
197 */
198 virtual Ptr<CcnxFace>
199 GetFaceByNetDevice (Ptr<NetDevice> netDevice) const = 0;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700200};
201
202} // namespace ns3
203
Alexander Afanasyev7112f482011-08-17 14:05:57 -0700204#endif /* _CCNX_H_ */