blob: ac4150f2b5743e24379af8df4c47e5fdd1b94cc7 [file] [log] [blame]
Alexander Afanasyev6315ef72012-06-01 20:56:31 -07001ndnSIM applications
2===================
3
4ndnSIM includes a few reference applications that can be used as a base for NDN simulations.
5
6Reference applications
7++++++++++++++++++++++
8
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -07009ConsumerCbr
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070010^^^^^^^^^^^^^^^
11
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070012:ndnsim:`ConsumerCbr` an application that generates Interest traffic with predefined pattern (constant frequency, constant average rate with inter-Interest gap distributed uniformly at random, exponentially at random, etc.).
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070013
14.. code-block:: c++
15
16 // Create application using the app helper
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070017 ndn::AppHelper helper ("ns3::ndn::ConsumerCbr");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070018
19This applications has the following attributes:
20
21* Frequency
22
23 .. note::
24 default: ``1.0`` (1 per second)
25
26 Either exact (for contant version) or expected (for randomized version) frequency with which Interests are generated
27
28 .. code-block:: c++
29
30 // Set attribute using the app helper
31 helper.SetAttribute ("Frequency", DoubleValue (1.0));
32
33* Randomize
34
35 .. note::
36 default: ``"none"``
37
38 Specify whether to do randomization for inter-Interest gap or not. The following variants are currently supported:
39
40 - ``"none"``: no randomization
41
42 - ``"uniform"``: uniform distribution in range (0, 1/Frequency)
43
44 - ``"exponential"``: exponential distribution with mean 1/Frequency
45
46 .. code-block:: c++
47
48 // Set attribute using the app helper
49 helper.SetAttribute ("Randomize", StringValue ("uniform"));
50
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070051ConsumerBatches
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070052^^^^^^^^^^^^^^^^^^^
53
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070054:ndnsim:`ConsumerBatches` is an on-off-style application gen- erating a specified number of Interests at specified points of simulation.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070055
56.. code-block:: c++
57
58 // Create application using the app helper
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070059 ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerBatches");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070060
61This applications has the following attributes:
62
63* Batches
64
65 .. note::
66 default: Empty
67
68 Specify exact pattern of Interest packets, specifying when and how many Interest packets should be sent.
69 The following example defines that 1 Interest should be requested at time 1s, 5 Interests at time 5s, and 2 Interests at time 10s.:
70
71 .. code-block:: c++
72
73 // Set attribute using the app helper
74 helper.SetAttribute ("Batches", StringValue ("1s 1 2s 5 10s 2"));
75
76
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070077ConsumerWindow
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070078^^^^^^^^^^^^^^^^^^
79
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070080:ndnsim:`ConsumerWindow` is an application generating a variable rate Interest traffic. It relies on an optional NACK-Interest feature and implements a simple sliding-window-based Interest generation mechanism.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070081
82.. code-block:: c++
83
84 // Create application using the app helper
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070085 ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerWindow");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070086
87
88This applications has the following attributes:
89
90* Window
91
92 .. note::
93 default: ``1``
94
95 Initial number of Interests that will be send out without waiting for the data (number of outstanding Interests)
96
97* PayloadSize
98
99 .. note::
100 default: ``1040``
101
102 Expected size of the Data payload (necessary only when Size is specified)
103
104* Size
105
106 .. note::
107 default: ``-1``
108
109 Amount of data to be requested (will stop issuing Interests after ``Size`` data is received)
110
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700111 If ``Size`` is set to -1, Interests will be requested till the end of the simulation.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700112
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700113Producer
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700114^^^^^^^^^^^^
115
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700116:ndnsim:`Producer` a simple Interest-sink application, which replying every incoming Interest with Data packet with a specified size and name same as in Interest.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700117
118.. code-block:: c++
119
120 // Create application using the app helper
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700121 ndn::AppHelper consumerHelper ("ns3::ndn::Producer");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700122
123
124Custom applications
125+++++++++++++++++++
126
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700127Applications interact with the core of the system using :ndnsim:`AppFace` realization of Face abstraction.
128To simplify implementation of specific NDN application, ndnSIM provides a base :ndnsim:`App` class that takes care of creating :ndnsim:`AppFace` and registering it inside the NDN protocol stack, as well as provides default processing for incoming Interest and Data packets.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700129
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700130.. Base App class
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700131.. ^^^^^^^^^^^^^^^^^^
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700132
133
134
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700135Customer example
136^^^^^^^^^^^^^^^^
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700137
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700138The following code shows how a simple ndnSIM application can be created.
139For details refer to API documentation of ndnSIM and NS-3.
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700140
141.. code-block:: c++
142
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700143 class CustomApp : public ndn::App
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700144 {
145 public:
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700146 // overridden from ndn::App
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700147
148 // Processing upon start of the application
149 virtual void
150 StartApplication ()
151 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700152 // initialize ndn::App
153 ndn::App::StartApplication ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700154
155 // Create a name components object for name ``/prefix/sub``
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700156 Ptr<ndn::NameComponents> prefix = Create<ndn::NameComponents> (); // now prefix contains ``/``
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700157 prefix->Add ("prefix"); // now prefix contains ``/prefix``
158 prefix->Add ("sub"); // now prefix contains ``/prefix/sub``
159
160 /////////////////////////////////////////////////////////////////////////////
161 // Creating FIB entry that ensures that we will receive incoming Interests //
162 /////////////////////////////////////////////////////////////////////////////
163
164 // Get FIB object
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700165 Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700166
167 // Add entry to FIB
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700168 // Note that ``m_face`` is cretaed by ndn::App
169 ndn::fib::EntryContainer::type::iterator fibEntry = fib->Add (*prefix, m_face, 0);
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700170
171 /////////////////////////////////////
172 // Sending one Interest packet out //
173 /////////////////////////////////////
174
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700175 // Create and configure ndn::InterestHeader
176 ndn::InterestHeader interestHeader;
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700177 UniformVariable rand (0,std::numeric_limits<uint32_t>::max ());
178 interestHeader.SetNonce (rand.GetValue ());
179 interestHeader.SetName (prefix);
180 interestHeader.SetInterestLifetime (Seconds (1.0));
181
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700182 // Create packet and add ndn::InterestHeader
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700183 Ptr<Packet> packet = Create<Packet> ();
184 packet->AddHeader (interestHeader);
185
186 // Forward packet to lower (network) layer
187 m_protocolHandler (packet);
188
189 // Call trace (for logging purposes)
190 m_transmittedInterests (&interestHeader, this, m_face);
191 }
192
193 // Processing when application is stopped
194 virtual void
195 StopApplication ()
196 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700197 // cleanup ndn::App
198 ndn::App::StopApplication ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700199 }
200
201 // Callback that will be called when Interest arrives
202 virtual void
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700203 OnInterest (const Ptr<const ndn::InterestHeader> &interest, Ptr<Packet> packet)
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700204 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700205 // Create and configure ndn::ContentObjectHeader and ndn::ContentObjectTail
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700206 // (header is added in front of the packet, tail is added at the end of the packet)
207
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700208 ndn::ContentObjectHeader data;
209 data.SetName (Create<ndn::NameComponents> (interest->GetName ())); // data will have the same name as Interests
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700210
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700211 ndn::ContentObjectTail trailer; // doesn't require any configuration
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700212
213 // Create packet and add header and trailer
214 Ptr<Packet> packet = Create<Packet> (1024);
215 packet->AddHeader (data);
216 packet->AddTrailer (trailer);
217
218 // Forward packet to lower (network) layer
219 m_protocolHandler (packet);
220
221 // Call trace (for logging purposes)
222 m_transmittedInterests (&interestHeader, this, m_face);
223 m_transmittedContentObjects (&data, packet, this, m_face);
224 }
225
226 // Callback that will be called when Data arrives
227 virtual void
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700228 OnContentObject (const Ptr<const ndn::ContentObjectHeader> &contentObject,
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700229 Ptr<Packet> payload)
230 {
231 std::cout << "DATA received for name " << contentObject->GetName () << std::endl;
232 }
233 };
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700234
235Producer example (Interest hijacker)
236^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
237
238The following code demonstrates how to implement a basic producer application that "hijacks" all incoming Interests.
239
240.. code-block:: c++
241
242 #include "ns3/core-module.h"
243 #include "ns3/network-module.h"
244 #include "ns3/ndnSIM-module.h"
245
246 using namespace ns3;
247
248 class Hijacker : public ndn::App
249 {
250 public:
251 static TypeId
252 GetTypeId ();
253
254 Hijacker ()
255 {
256 }
257
258 // inherited from NdnApp
259 void OnInterest (const Ptr<const ndn::InterestHeader> &interest, Ptr<Packet> packet)
260 {
261 ndn::App::OnInterest (interest, packet); // forward call to perform app-level tracing
262 // do nothing else (hijack interest)
263 }
264
265 protected:
266 // inherited from Application base class.
267 virtual void
268 StartApplication ()
269 {
270 App::StartApplication ();
271
272 // equivalent to setting interest filter for "/" prefix
273 Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
274 Ptr<ndn::fib::Entry> fibEntry = fib->Add ("/", m_face, 0);
275 fibEntry->UpdateStatus (m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
276 }
277
278 virtual void
279 StopApplication ()
280 {
281 App::StopApplication ();
282 }
283 };
284
285 // Necessary if you are planning to use ndn::AppHelper
286 NS_OBJECT_ENSURE_REGISTERED (Hijacker);
287
288 TypeId
289 Hijacker::GetTypeId ()
290 {
291 static TypeId tid = TypeId ("ndn::Hijacker")
292 .SetParent<ndn::App> ()
293 .AddConstructor<Hijacker> ()
294 ;
295
296 return tid;
297 }
298
299
300After defining this class, you can use it with :ndnsim:`ndn::AppHelper`. For example:
301
302.. code-block:: c++
303
304 ...
305 ndn::AppHelper producerHelper ("ndn::Hijacker");
306 producerHelper.Install (producerNode);
307 ...
308