blob: c2fa296ce6d824bb7f111c1d57909cb9cb8347cf [file] [log] [blame]
Alexander Afanasyev4aac5572012-08-09 10:49:55 -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>
19 * Ilya Moiseenko <iliamo@cs.ucla.edu>
20 */
21#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 {
30
31class NdnFace;
32class NdnInterestHeader;
33class NdnContentObjectHeader;
34class NdnPit;
35class NdnPitEntry;
36class NdnFibFaceMetric;
37class NdnFib;
38class NdnContentStore;
39
40/**
41 * \ingroup ndn
42 * \brief Abstract base class for Ndn forwarding strategies
43 */
44class NdnForwardingStrategy :
45 public Object
46{
47public:
48 static TypeId GetTypeId (void);
49
50 /**
51 * @brief Default constructor
52 */
53 NdnForwardingStrategy ();
54 virtual ~NdnForwardingStrategy ();
55
56 /**
57 * \brief Actual processing of incoming Ndn interests. Note, interests do not have payload
58 *
59 * Processing Interest packets
60 * @param face incoming face
61 * @param header deserialized Interest header
62 * @param packet original packet
63 */
64 virtual void
65 OnInterest (const Ptr<NdnFace> &face,
66 Ptr<NdnInterestHeader> &header,
67 const Ptr<const Packet> &p);
68
69 /**
70 * \brief Actual processing of incoming Ndn content objects
71 *
72 * Processing ContentObject packets
73 * @param face incoming face
74 * @param header deserialized ContentObject header
75 * @param payload data packet payload
76 * @param packet original packet
77 */
78 virtual void
79 OnData (const Ptr<NdnFace> &face,
80 Ptr<NdnContentObjectHeader> &header,
81 Ptr<Packet> &payload,
82 const Ptr<const Packet> &packet);
83
84 virtual void
85 WillErasePendingInterest (Ptr<NdnPitEntry> pitEntry);
86
87 virtual void
88 RemoveFace (Ptr<NdnFace> face);
89
90protected:
91 // events
92 virtual void
93 DidReceiveDuplicateInterest (const Ptr<NdnFace> &face,
94 Ptr<NdnInterestHeader> &header,
95 const Ptr<const Packet> &packet,
96 Ptr<NdnPitEntry> pitEntry);
97
98 virtual void
99 DidExhaustForwardingOptions (const Ptr<NdnFace> &incomingFace,
100 Ptr<NdnInterestHeader> header,
101 const Ptr<const Packet> &packet,
102 Ptr<NdnPitEntry> pitEntry);
103
104 virtual void
105 FailedToCreatePitEntry (const Ptr<NdnFace> &incomingFace,
106 Ptr<NdnInterestHeader> header,
107 const Ptr<const Packet> &packet);
108
109 virtual void
110 DidCreatePitEntry (const Ptr<NdnFace> &incomingFace,
111 Ptr<NdnInterestHeader> header,
112 const Ptr<const Packet> &packet,
113 Ptr<NdnPitEntry> pitEntry);
114
115 virtual bool
116 DetectRetransmittedInterest (const Ptr<NdnFace> &incomingFace,
117 Ptr<NdnPitEntry> pitEntry);
118
119 // makes sense only for data received from network
120 // When Interest is satisfied from the cache, incoming face is 0
121 virtual void
122 WillSatisfyPendingInterest (const Ptr<NdnFace> &incomingFace,
123 Ptr<NdnPitEntry> pitEntry);
124
125 // for data received both from network and cache
126 virtual void
127 SatisfyPendingInterest (const Ptr<NdnFace> &incomingFace, // 0 allowed (from cache)
128 Ptr<const NdnContentObjectHeader> header,
129 Ptr<const Packet> payload,
130 const Ptr<const Packet> &packet,
131 Ptr<NdnPitEntry> pitEntry);
132
133 virtual void
134 DidSendOutData (const Ptr<NdnFace> &face,
135 Ptr<const NdnContentObjectHeader> header,
136 Ptr<const Packet> payload,
137 const Ptr<const Packet> &packet);
138
139 virtual void
140 DidReceiveUnsolicitedData (const Ptr<NdnFace> &incomingFace,
141 Ptr<const NdnContentObjectHeader> header,
142 Ptr<const Packet> payload);
143
144 virtual bool
145 ShouldSuppressIncomingInterest (const Ptr<NdnFace> &incomingFace,
146 Ptr<NdnPitEntry> pitEntry);
147
148 /**
149 * @brief Event fired before actually sending out an interest
150 *
151 * If event returns false, then there is some kind of a problem (e.g., per-face limit reached)
152 */
153 virtual bool
154 WillSendOutInterest (const Ptr<NdnFace> &outgoingFace,
155 Ptr<NdnInterestHeader> header,
156 Ptr<NdnPitEntry> pitEntry);
157
158 /**
159 * @brief Event fired just after sending out an interest
160 */
161 virtual void
162 DidSendOutInterest (const Ptr<NdnFace> &outgoingFace,
163 Ptr<NdnInterestHeader> header,
164 const Ptr<const Packet> &packet,
165 Ptr<NdnPitEntry> pitEntry);
166
167 virtual void
168 PropagateInterest (const Ptr<NdnFace> &incomingFace,
169 Ptr<NdnInterestHeader> header,
170 const Ptr<const Packet> &packet,
171 Ptr<NdnPitEntry> pitEntry);
172
173 /**
174 * @brief Base method to propagate the interest according to the forwarding strategy
175 *
176 * @param pitEntry Reference to PIT entry (reference to corresponding FIB entry inside)
177 * @param incomingFace Incoming face
178 * @param header NdnInterestHeader
179 * @param packet Original Interest packet
180 * @param sendCallback Send callback
181 *
182 * @return true if interest was successfully propagated, false if all options have failed
183 */
184 virtual bool
185 DoPropagateInterest (const Ptr<NdnFace> &incomingFace,
186 Ptr<NdnInterestHeader> header,
187 const Ptr<const Packet> &packet,
188 Ptr<NdnPitEntry> pitEntry) = 0;
189
190
191 // virtual void
192 // OnDataDelayed (Ptr<const NdnContentObjectHeader> header,
193 // Ptr<const Packet> payload,
194 // const Ptr<const Packet> &packet);
195
196protected:
197 // inherited from Object class
198 virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
199 virtual void DoDispose (); ///< @brief Do cleanup
200
201protected:
202 Ptr<NdnPit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
203 Ptr<NdnFib> m_fib; ///< \brief FIB
204 Ptr<NdnContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
205
206 bool m_cacheUnsolicitedData;
207 bool m_detectRetransmissions;
208
209 TracedCallback<Ptr<const NdnInterestHeader>,
210 Ptr<const NdnFace> > m_outInterests; ///< @brief Transmitted interests trace
211
212 TracedCallback<Ptr<const NdnInterestHeader>,
213 Ptr<const NdnFace> > m_inInterests; ///< @brief trace of incoming Interests
214
215 TracedCallback<Ptr<const NdnInterestHeader>,
216 Ptr<const NdnFace> > m_dropInterests; ///< @brief trace of dropped Interests
217
218 ////////////////////////////////////////////////////////////////////
219 ////////////////////////////////////////////////////////////////////
220 ////////////////////////////////////////////////////////////////////
221
222 TracedCallback<Ptr<const NdnContentObjectHeader>, Ptr<const Packet>,
223 bool /*from cache*/,
224 Ptr<const NdnFace> > m_outData; ///< @brief trace of outgoing Data
225
226 TracedCallback<Ptr<const NdnContentObjectHeader>, Ptr<const Packet>,
227 Ptr<const NdnFace> > m_inData; ///< @brief trace of incoming Data
228
229 TracedCallback<Ptr<const NdnContentObjectHeader>, Ptr<const Packet>,
230 Ptr<const NdnFace> > m_dropData; ///< @brief trace of dropped Data
231};
232
233} //namespace ns3
234
235#endif /* NDN_FORWARDING_STRATEGY_H */