blob: fb2b4fbde9fd17fae240f915b9d3b5ceb57af64e [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
135Example
136^^^^^^^
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700137
138The following code shows how a simple ndnSIM application can be created. For details refer to API documentation of ndnSIM and NS-3.
139
140.. code-block:: c++
141
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700142 class CustomApp : public ndn::App
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700143 {
144 public:
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700145 // overridden from ndn::App
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700146
147 // Processing upon start of the application
148 virtual void
149 StartApplication ()
150 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700151 // initialize ndn::App
152 ndn::App::StartApplication ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700153
154 // Create a name components object for name ``/prefix/sub``
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700155 Ptr<ndn::NameComponents> prefix = Create<ndn::NameComponents> (); // now prefix contains ``/``
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700156 prefix->Add ("prefix"); // now prefix contains ``/prefix``
157 prefix->Add ("sub"); // now prefix contains ``/prefix/sub``
158
159 /////////////////////////////////////////////////////////////////////////////
160 // Creating FIB entry that ensures that we will receive incoming Interests //
161 /////////////////////////////////////////////////////////////////////////////
162
163 // Get FIB object
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700164 Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700165
166 // Add entry to FIB
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700167 // Note that ``m_face`` is cretaed by ndn::App
168 ndn::fib::EntryContainer::type::iterator fibEntry = fib->Add (*prefix, m_face, 0);
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700169
170 /////////////////////////////////////
171 // Sending one Interest packet out //
172 /////////////////////////////////////
173
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700174 // Create and configure ndn::InterestHeader
175 ndn::InterestHeader interestHeader;
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700176 UniformVariable rand (0,std::numeric_limits<uint32_t>::max ());
177 interestHeader.SetNonce (rand.GetValue ());
178 interestHeader.SetName (prefix);
179 interestHeader.SetInterestLifetime (Seconds (1.0));
180
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700181 // Create packet and add ndn::InterestHeader
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700182 Ptr<Packet> packet = Create<Packet> ();
183 packet->AddHeader (interestHeader);
184
185 // Forward packet to lower (network) layer
186 m_protocolHandler (packet);
187
188 // Call trace (for logging purposes)
189 m_transmittedInterests (&interestHeader, this, m_face);
190 }
191
192 // Processing when application is stopped
193 virtual void
194 StopApplication ()
195 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700196 // cleanup ndn::App
197 ndn::App::StopApplication ();
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700198 }
199
200 // Callback that will be called when Interest arrives
201 virtual void
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700202 OnInterest (const Ptr<const ndn::InterestHeader> &interest, Ptr<Packet> packet)
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700203 {
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700204 // Create and configure ndn::ContentObjectHeader and ndn::ContentObjectTail
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700205 // (header is added in front of the packet, tail is added at the end of the packet)
206
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700207 ndn::ContentObjectHeader data;
208 data.SetName (Create<ndn::NameComponents> (interest->GetName ())); // data will have the same name as Interests
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700209
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700210 ndn::ContentObjectTail trailer; // doesn't require any configuration
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700211
212 // Create packet and add header and trailer
213 Ptr<Packet> packet = Create<Packet> (1024);
214 packet->AddHeader (data);
215 packet->AddTrailer (trailer);
216
217 // Forward packet to lower (network) layer
218 m_protocolHandler (packet);
219
220 // Call trace (for logging purposes)
221 m_transmittedInterests (&interestHeader, this, m_face);
222 m_transmittedContentObjects (&data, packet, this, m_face);
223 }
224
225 // Callback that will be called when Data arrives
226 virtual void
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700227 OnContentObject (const Ptr<const ndn::ContentObjectHeader> &contentObject,
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700228 Ptr<Packet> payload)
229 {
230 std::cout << "DATA received for name " << contentObject->GetName () << std::endl;
231 }
232 };