blob: 45ccc55d619f628cc3e6883c0061bc98f033c668 [file] [log] [blame]
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
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>
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070019 */
Alexander Afanasyev31cb4692012-08-17 13:08:20 -070020
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070021#ifndef NDN_FORWARDING_STRATEGY_H
22#define NDN_FORWARDING_STRATEGY_H
23
24#include "ns3/packet.h"
25#include "ns3/callback.h"
26#include "ns3/object.h"
27#include "ns3/traced-callback.h"
28
29namespace ns3 {
30namespace ndn {
31
32class Face;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070033
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070034class Interest;
35class ContentObject;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070036
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070037class Pit;
38namespace pit { class Entry; }
39class FibFaceMetric;
40class Fib;
Alexander Afanasyevadcccf42012-11-26 23:55:34 -080041namespace fib { class Entry; }
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070042class ContentStore;
43
44/**
45 * \ingroup ndn
46 * \brief Abstract base class for Ndn forwarding strategies
47 */
48class ForwardingStrategy :
49 public Object
50{
51public:
52 static TypeId GetTypeId (void);
53
54 /**
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080055 * @brief Helper function to retrieve logging name for the forwarding strategy
56 */
57 static std::string GetLogName ();
58
59 /**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070060 * @brief Default constructor
61 */
62 ForwardingStrategy ();
63 virtual ~ForwardingStrategy ();
64
65 /**
66 * \brief Actual processing of incoming Ndn interests. Note, interests do not have payload
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -080067 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070068 * Processing Interest packets
69 * @param face incoming face
70 * @param header deserialized Interest header
Alexander Afanasyev31cb4692012-08-17 13:08:20 -070071 * @param origPacket original packet
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070072 */
73 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -070074 OnInterest (Ptr<Face> face,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070075 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -070076 Ptr<const Packet> payload);
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070077
78 /**
79 * \brief Actual processing of incoming Ndn content objects
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -080080 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070081 * Processing ContentObject packets
82 * @param face incoming face
83 * @param header deserialized ContentObject header
84 * @param payload data packet payload
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070085 */
86 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -070087 OnData (Ptr<Face> face,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070088 Ptr<const ContentObject> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -070089 Ptr<Packet> payload);
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070090
Alexander Afanasyevea9b3e62012-08-13 19:02:54 -070091 /**
92 * @brief Event fired just before PIT entry is removed by timeout
93 * @param pitEntry PIT entry to be removed
94 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070095 virtual void
Alexander Afanasyevea9b3e62012-08-13 19:02:54 -070096 WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070097
Alexander Afanasyevea9b3e62012-08-13 19:02:54 -070098 /**
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070099 * @brief Event fired every time face is added to NDN stack
100 * @param face face to be removed
101 */
102 virtual void
103 AddFace (Ptr<Face> face);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800104
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700105 /**
Alexander Afanasyevea9b3e62012-08-13 19:02:54 -0700106 * @brief Event fired every time face is removed from NDN stack
107 * @param face face to be removed
108 *
109 * For example, when an application terminates, AppFace is removed and this method called by NDN stack.
110 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700111 virtual void
112 RemoveFace (Ptr<Face> face);
Alexander Afanasyevadcccf42012-11-26 23:55:34 -0800113
114 /**
115 * @brief Event fired every time a FIB entry is added to FIB
116 * @param fibEntry FIB entry that was added
117 */
118 virtual void
119 DidAddFibEntry (Ptr<fib::Entry> fibEntry);
120
121 /**
122 * @brief Fired just before FIB entry will be removed from FIB
123 * @param fibEntry FIB entry that will be removed
124 */
125 virtual void
126 WillRemoveFibEntry (Ptr<fib::Entry> fibEntry);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800127
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700128protected:
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700129 /**
130 * @brief An event that is fired every time a new PIT entry is created
131 *
132 * Note that if NDN node is receiving a similar interest (interest for the same name),
133 * then either DidReceiveDuplicateInterest, DidSuppressSimilarInterest, or DidForwardSimilarInterest
134 * will be called
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800135 *
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700136 * Suppression of similar Interests is controlled using ShouldSuppressIncomingInterest virtual method
137 *
138 * @param inFace incoming face
139 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700140 * @param pitEntry created PIT entry (incoming and outgoing face sets are empty)
141 *
142 * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
143 */
144 virtual void
145 DidCreatePitEntry (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700146 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700147 Ptr<const Packet> payload,
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700148 Ptr<pit::Entry> pitEntry);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800149
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700150 /**
151 * @brief An event that is fired every time a new PIT entry cannot be created (e.g., PIT container imposes a limit)
152 *
153 * Note that this call can be called only for non-similar Interest (i.e., there is an attempt to create a new PIT entry).
154 * For any non-similar Interests, either FailedToCreatePitEntry or DidCreatePitEntry is called.
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800155 *
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700156 * @param inFace incoming face
157 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700158 */
159 virtual void
160 FailedToCreatePitEntry (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700161 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700162 Ptr<const Packet> payload);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800163
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700164 /**
165 * @brief An event that is fired every time a duplicated Interest is received
166 *
167 * This even is the last action that is performed before the Interest processing is halted
168 *
169 * @param inFace incoming face
170 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700171 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
172 *
173 * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
174 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700175 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700176 DidReceiveDuplicateInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700177 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700178 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700179 Ptr<pit::Entry> pitEntry);
180
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700181 /**
182 * @brief An event that is fired every time when a similar Interest is received and suppressed (collapsed)
183 *
184 * This even is the last action that is performed before the Interest processing is halted
185 *
186 * @param inFace incoming face
187 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700188 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
189 *
190 * @see DidReceiveDuplicateInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
191 */
192 virtual void
193 DidSuppressSimilarInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700194 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700195 Ptr<const Packet> payload,
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700196 Ptr<pit::Entry> pitEntry);
197
198 /**
199 * @brief An event that is fired every time when a similar Interest is received and further forwarded (not suppressed/collapsed)
200 *
201 * This even is fired just before handling the Interest to PropagateInterest method
202 *
203 * @param inFace incoming face
204 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700205 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
206 *
207 * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, ShouldSuppressIncomingInterest
208 */
209 virtual void
210 DidForwardSimilarInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700211 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700212 Ptr<const Packet> payload,
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700213 Ptr<pit::Entry> pitEntry);
214
215 /**
216 * @brief An even that is fired when Interest cannot be forwarded
217 *
218 * Note that the event will not fire if retransmission detection is enabled (by default)
219 * and retransmitted Interest cannot by forwarded. For more details, refer to the implementation.
220 *
221 * @param inFace incoming face
222 * @param header deserialized Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700223 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
224 *
225 * @see DetectRetransmittedInterest
226 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700227 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700228 DidExhaustForwardingOptions (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700229 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700230 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700231 Ptr<pit::Entry> pitEntry);
232
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800233 /**
234 * @brief Method that implements logic to distinguish between new and retransmitted interest
235 *
236 * This method is called only when DetectRetransmissions attribute is set true (by default).
237 *
238 * Currently, the retransmission detection logic relies on the fact that list of incoming faces
239 * already has inFace (i.e., a similar interest is received on the same face more than once).
240 *
241 * @param inFace incoming face
242 * @param header deserialized Interest header
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800243 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
244 * @return true if Interest should be considered as retransmitted
245 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700246 virtual bool
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700247 DetectRetransmittedInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700248 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700249 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700250 Ptr<pit::Entry> pitEntry);
251
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800252 /**
253 * @brief Even fired just before Interest will be satisfied
254 *
255 * Note that when Interest is satisfied from the cache, incoming face will be 0
256 *
257 * @param inFace incoming face
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800258 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800259 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700260 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700261 WillSatisfyPendingInterest (Ptr<Face> inFace,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700262 Ptr<pit::Entry> pitEntry);
263
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800264 /**
265 * @brief Actual procedure to satisfy Interest
266 *
267 * Note that when Interest is satisfied from the cache, incoming face will be 0
268 *
269 * @param inFace incoming face
270 * @param header deserialized ContentObject header
271 * @param payload ContentObject payload
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800272 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
273 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700274 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700275 SatisfyPendingInterest (Ptr<Face> inFace, // 0 allowed (from cache)
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700276 Ptr<const ContentObject> header,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700277 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700278 Ptr<pit::Entry> pitEntry);
279
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800280 /**
281 * @brief Event which is fired just after data was send out on the face
282 *
Alexander Afanasyev67f4a4a2012-11-24 17:18:17 -0800283 * @param inFace incoming face of the ContentObject
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800284 * @param outFace outgoing face
285 * @param header deserialized ContentObject header
286 * @param payload ContentObject payload
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800287 * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
288 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700289 virtual void
Alexander Afanasyev67f4a4a2012-11-24 17:18:17 -0800290 DidSendOutData (Ptr<Face> inFace,
291 Ptr<Face> outFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700292 Ptr<const ContentObject> header,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700293 Ptr<const Packet> payload,
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700294 Ptr<pit::Entry> pitEntry);
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800295
296 /**
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800297 * @brief Event which is fired every time a requested (solicited) DATA packet (there is an active PIT entry) is received
298 *
299 * @param inFace incoming face
300 * @param header deserialized ContentObject header
301 * @param payload ContentObject payload
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800302 * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
303 */
304 virtual void
305 DidReceiveSolicitedData (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700306 Ptr<const ContentObject> header,
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800307 Ptr<const Packet> payload,
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800308 bool didCreateCacheEntry);
309
310 /**
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800311 * @brief Event which is fired every time an unsolicited DATA packet (no active PIT entry) is received
312 *
313 * The current implementation allows ignoring unsolicited DATA (by default), or cache it by setting
314 * attribute CacheUnsolicitedData true
315 *
316 * @param inFace incoming face
317 * @param header deserialized ContentObject header
318 * @param payload ContentObject payload
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800319 * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800320 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700321 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700322 DidReceiveUnsolicitedData (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700323 Ptr<const ContentObject> header,
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700324 Ptr<const Packet> payload,
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800325 bool didCreateCacheEntry);
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800326
327 /**
328 * @brief Method implementing logic to suppress (collapse) similar Interests
329 *
330 * In the base class implementation this method checks list of incoming/outgoing faces of the PIT entry
331 * (for new Intersets, both lists are empty before this call)
332 *
333 * For more details, refer to the source code.
334 *
335 * @param inFace incoming face
336 * @param header deserialized ContentObject header
337 * @param payload ContentObject payload
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800338 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700339 virtual bool
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700340 ShouldSuppressIncomingInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700341 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700342 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700343 Ptr<pit::Entry> pitEntry);
344
345 /**
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800346 * @brief Method to check whether Interest can be send out on the particular face or not
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700347 *
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800348 * In the base class, this method perfoms two checks:
349 * 1. If inFace is equal to outFace (when equal, Interest forwarding is prohibited)
350 * 2. Whether Interest should be suppressed (list of outgoing faces include outFace),
351 * considering (if enabled) retransmission logic
352 *
353 * @param inFace incoming face of the Interest
354 * @param outFace proposed outgoing face of the Interest
355 * @param header parsed Interest header
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800356 * @param pitEntry reference to PIT entry (reference to corresponding FIB entry inside)
357 *
358 * @see DetectRetransmittedInterest
359 */
360 virtual bool
361 CanSendOutInterest (Ptr<Face> inFace,
362 Ptr<Face> outFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700363 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700364 Ptr<const Packet> payload,
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800365 Ptr<pit::Entry> pitEntry);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800366
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800367 /**
368 * @brief Method implementing actual interest forwarding, taking into account CanSendOutInterest decision
369 *
370 * If event returns false, then there is some kind of a problem exists
371 *
372 * @param inFace incoming face of the Interest
373 * @param outFace proposed outgoing face of the Interest
374 * @param header parsed Interest header
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800375 * @param pitEntry reference to PIT entry (reference to corresponding FIB entry inside)
376 *
377 * @see CanSendOutInterest
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700378 */
379 virtual bool
Alexander Afanasyev5db92172012-08-21 16:52:07 -0700380 TrySendOutInterest (Ptr<Face> inFace,
381 Ptr<Face> outFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700382 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700383 Ptr<const Packet> payload,
Alexander Afanasyev5db92172012-08-21 16:52:07 -0700384 Ptr<pit::Entry> pitEntry);
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700385
386 /**
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800387 * @brief Event fired just after forwarding the Interest
388 *
Alexander Afanasyev67f4a4a2012-11-24 17:18:17 -0800389 * @param inFace incoming face of the Interest
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800390 * @param outFace outgoing face of the Interest
391 * @param header parsed Interest header
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800392 * @param pitEntry reference to PIT entry (reference to corresponding FIB entry inside)
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700393 */
394 virtual void
Alexander Afanasyev67f4a4a2012-11-24 17:18:17 -0800395 DidSendOutInterest (Ptr<Face> inFace,
396 Ptr<Face> outFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700397 Ptr<const Interest> header,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700398 Ptr<pit::Entry> pitEntry);
399
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700400 /**
401 * @brief Wrapper method, which performs general tasks and calls DoPropagateInterest method
402 *
403 * General tasks so far are adding face to the list of incoming face, updating
404 * PIT entry lifetime, calling DoPropagateInterest, and retransmissions (enabled by default).
405 *
406 * @param inFace incoming face
407 * @param header Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700408 * @param pitEntry reference to PIT entry (reference to corresponding FIB entry inside)
409 *
410 * @see DoPropagateInterest
411 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700412 virtual void
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700413 PropagateInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700414 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700415 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700416 Ptr<pit::Entry> pitEntry);
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800417
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700418 /**
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700419 * @brief Virtual method to perform Interest propagation according to the forwarding strategy logic
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700420 *
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700421 * In most cases, this is the call that needs to be implemented/re-implemented in order
422 * to perform forwarding of Interests according to the desired logic.
423 *
424 * There is also PropagateInterest method (generally, do not require to be overriden)
425 * which performs general tasks (adding face to the list of incoming face, updating
426 * PIT entry lifetime, calling DoPropagateInterest, as well as perform retransmissions (enabled by default).
427 *
428 * @param inFace incoming face
429 * @param header Interest header
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700430 * @param pitEntry reference to PIT entry (reference to corresponding FIB entry inside)
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700431 *
432 * @return true if interest was successfully propagated, false if all options have failed
Alexander Afanasyev6466fff2012-10-24 22:51:57 -0700433 *
434 * @see PropagateInterest
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700435 */
436 virtual bool
Alexander Afanasyev31cb4692012-08-17 13:08:20 -0700437 DoPropagateInterest (Ptr<Face> inFace,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700438 Ptr<const Interest> header,
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700439 Ptr<const Packet> payload,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700440 Ptr<pit::Entry> pitEntry) = 0;
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800441
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700442protected:
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800443 // inherited from Object class
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700444 virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
445 virtual void DoDispose (); ///< @brief Do cleanup
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800446
447protected:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700448 Ptr<Pit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800449 Ptr<Fib> m_fib; ///< \brief FIB
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700450 Ptr<ContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
451
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700452 bool m_cacheUnsolicitedDataFromApps;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700453 bool m_cacheUnsolicitedData;
454 bool m_detectRetransmissions;
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800455
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700456 TracedCallback<Ptr<const Interest>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700457 Ptr<const Face> > m_outInterests; ///< @brief Transmitted interests trace
458
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700459 TracedCallback<Ptr<const Interest>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700460 Ptr<const Face> > m_inInterests; ///< @brief trace of incoming Interests
461
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700462 TracedCallback<Ptr<const Interest>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700463 Ptr<const Face> > m_dropInterests; ///< @brief trace of dropped Interests
Alexander Afanasyeve6c07b52013-02-12 11:05:14 -0800464
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700465 ////////////////////////////////////////////////////////////////////
466 ////////////////////////////////////////////////////////////////////
467 ////////////////////////////////////////////////////////////////////
468
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700469 TracedCallback<Ptr<const ContentObject>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700470 bool /*from cache*/,
471 Ptr<const Face> > m_outData; ///< @brief trace of outgoing Data
472
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700473 TracedCallback<Ptr<const ContentObject>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700474 Ptr<const Face> > m_inData; ///< @brief trace of incoming Data
475
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700476 TracedCallback<Ptr<const ContentObject>, Ptr<const Packet>,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700477 Ptr<const Face> > m_dropData; ///< @brief trace of dropped Data
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700478
479 ////////////////////////////////////////////////////////////////////
480 ////////////////////////////////////////////////////////////////////
481 ////////////////////////////////////////////////////////////////////
482
483 TracedCallback< Ptr<const pit::Entry> > m_satisfiedInterests;
484 TracedCallback< Ptr<const pit::Entry> > m_timedOutInterests;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700485};
486
487} // namespace ndn
488} // namespace ns3
489
490#endif /* NDN_FORWARDING_STRATEGY_H */