blob: efe27f83a8ea5ed3d39b3cd3cf790fbea590e212 [file] [log] [blame]
Alexander Afanasyev6315ef72012-06-01 20:56:31 -07001ndnSIM helpers
2==============
3
4Helpers are very important components of ndnSIM, especially for writing simulation scenarios.
5The following summarizes helpers and their basic usage.
6
Alexander Afanasyevf6807a52012-08-10 18:11:43 -07007StackHelper
Alexander Afanasyev6315ef72012-06-01 20:56:31 -07008---------------
9
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070010:ndnsim:`StackHelper` is used to install ndnSIM network stack on requested nodes, as well to provide a simple way configure several important parameters of NDN simulation.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070011
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080012Example:
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070013
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080014.. code-block:: c++
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070015
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080016 ndn::StackHelper ndnHelper;
17 NodeContainer nodes;
18 ...
19 ndnHelper.Install (nodes);
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070020
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080021Routing
22+++++++
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070023
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080024All forwarding strategies require knowledge of where Interests can be forwarded (Forwarding Information Base).
25Unlike IP routing, this knowledge may be imprecise, but without such knowledge forwarding strategies will not be able to make any decision and will drop any Interests.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070026
27.. note::
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080028 By default, all nodes have empty FIB. You need either to manually configure routes, use global routing controller, or (not recommended) enable default routes.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070029
30Manually routes
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080031^^^^^^^^^^^^^^^
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070032
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070033Routes can be configured manually using :ndnsim:`StackHelper::AddRoute` static methods of :ndnsim:`StackHelper`.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070034
35These routes **should** be created **after** installing NDN stack on a node:
36
37 .. code-block:: c++
38
Alexander Afanasyevb8d14ad2012-08-09 13:19:37 -070039 ndnHelper.Install (nodes);
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070040 ...
41 Ptr<Node> node = ... // FIB entry will be added to FIB on this node
42 std::string prefix = ... // some prefix
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070043 Ptr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessible
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070044 int32_t metric = ... // some routing metric
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070045 ndn::StackHelper::AddRoute (node, prefix, face, metric);
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070046
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080047Global routing controller
48^^^^^^^^^^^^^^^^^^^^^^^^^
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070049
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070050To simplify FIB management in large topologies, ndnSIM contains a global routing controller (:ndnsim:`helper <GlobalRoutingHelper>` and :ndnsim:`special interface <GlobalRouter>`), similar in spirit to ``Ipv4GlobalRoutingHelper``.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070051
52There are several necessary steps, in order to take advantage of the global routing controller:
53
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070054* install :ndnsim:`special interfaces <GlobalRouter>` on nodes
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070055
56 .. code-block:: c++
57
58 NodeContainer nodes;
59 ...
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070060 ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
Alexander Afanasyevb8d14ad2012-08-09 13:19:37 -070061 ndnGlobalRoutingHelper.Install (nodes);
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070062
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070063* specify which node exports which prefix using :ndnsim:`GlobalRoutingHelper::AddOrigins`
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070064
65 .. code-block:: c++
66
67 Ptr<Node> producer; // producer node that exports prefix
68 std::string prefix; // exported prefix
69 ...
Alexander Afanasyevb8d14ad2012-08-09 13:19:37 -070070 ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070071
Alexander Afanasyevf6807a52012-08-10 18:11:43 -070072* calculate and install FIBs on every node using :ndnsim:`GlobalRoutingHelper::CalculateRoutes`
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070073
74 .. code-block:: c++
75
Alexander Afanasyevb8d14ad2012-08-09 13:19:37 -070076 cdnGlobalRoutingHelper.CalculateRoutes ();
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070077
Alexander Afanasyeve095f0f2012-11-21 17:43:32 -080078Default routes
79^^^^^^^^^^^^^^
80
81In simple topologies, like in :doc:`examples <examples>`, or when
82simulating broadcast environment, it is possible to set up *default*
83FIB entries using :ndnsim:`StackHelper::SetDefaultRoutes` call.
84More specifically, every installed NDN stack will have a FIB entry to ``/`` prefix, containing all available faces.
85
86The following should be done before installing stack on a node:
87
88 .. code-block:: c++
89
90 ndnHelper.SetDefaultRoutes (true);
91 ...
92 ndnHelper.Install (nodes);
93
94
95Content Store
96+++++++++++++
97
98ndnSIM comes with several different in-memory :ndnsim:`content store <ndn::ContentStore>` implementations, featuring different cache replacement policies.
99
100.. note:
101
102 The default content store uses LRU replacement policity and constrained with 100 cached ContentObjects.
103
104To select a particular content store and configure its capacity, use :ndnsim:`SetContentStore <ndn::StackHelper::SetContentStore>` helper method:
105
106- :ndnsim:`Least Recently Used (LRU) <ndn::cs::Lru>` (default):
107
108 .. code-block:: c++
109
110 ndnHelper.SetContentStore ("ns3::ndn::cs::Lru",
111 "MaxSize", "10000");
112 ...
113 ndnHelper.Install (nodes);
114
115- :ndnsim:`First-In-First-Out (FIFO) <ndn::cs::Fifo>`:
116
117 .. code-block:: c++
118
119 ndnHelper.SetContentStore ("ns3::ndn::cs::Fifo",
120 "MaxSize", "10000");
121 ...
122 ndnHelper.Install (nodes);
123
124- :ndnsim:`Random <ndn::cs::Random>`:
125
126 .. code-block:: c++
127
128 ndnHelper.SetContentStore ("ns3::ndn::cs::Random",
129 "MaxSize", "10000");
130 ...
131 ndnHelper.Install (nodes);
132
133.. note::
134
135 If ``MaxSize`` parameter is omitted, then will be used a default value (100).
136
137.. note::
138
139 If ``MaxSize`` is set to 0, then no limit on ContentStore will be enforced
140
141Pending Interest Table
142++++++++++++++++++++++
143
144The current version of ndnSIM provides :ndnsim:`templated realizations <ndn::pit::PitImpl>` of :ndnsim:`PIT abstraction <ndn::Pit>`, allowing optional bounding the number of PIT entries and different replacement policies (i.e., perform different actions when limit on number of PIT entries is reached).
145
146To select a particular PIT implementation and configure its policies, use :ndnsim:`SetPit <ndn::StackHelper::SetPit>` helper method:
147
148- :ndnsim:`persistent <ndn::pit::Persistent>` (default):
149
150 New entries will be rejected if PIT size reached its limit
151
152 .. code-block:: c++
153
154 ndnHelper.SetPit ("ns3::ndn::pit::Persistent",
155 "MaxSize", "0");
156 ...
157 ndnHelper.Install (nodes);
158
159- :ndnsim:`random <ndn::pit::Random>`:
160
161 when PIT reaches its limit, random entry (could be the newly created one) will be removed from PIT;
162
163 .. code-block:: c++
164
165 ndnHelper.SetPit ("ns3::ndn::pit::Random",
166 "MaxSize", "0");
167 ...
168 ndnHelper.Install (nodes);
169
170- :ndnsim:`least-recently-used <ndn::pit::Lru>`:
171
172 the least recently used entry (the oldest entry with minimum number of incoming faces) will be removed when PIT size reached its limit.
173
174 .. code-block:: c++
175
176 ndnHelper.SetPit ("ns3::ndn::pit::Lru",
177 "MaxSize", "0");
178 ...
179 ndnHelper.Install (nodes);
180
181Forwarding strategy
182+++++++++++++++++++
183
184A desired :ndnsim:`forwarding strategy <ForwardingStrategy>` parameter need to be set before installing stack on a node.
185
186 Currently, there are following forwarding strategies that can be used in simulations:
187
188 - :ndnsim:`Flooding` (default)
189
190 Interests will be forwarded to all available faces available for a route (FIB entry).
191 If there are no available GREEN or YELLOW faces, interests is dropped.
192
193 .. code-block:: c++
194
195 ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding");
196 ...
197 ndnHelper.Install (nodes);
198
199
200 - :ndnsim:`SmartFlooding`
201
202 If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
203 If not, Interest will be forwarded to all available faces available for a route (FIB entry)/
204 If there are no available GREEN or YELLOW faces, interests is dropped.
205
206 .. code-block:: c++
207
208 ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding");
209 ...
210 ndnHelper.Install (nodes);
211
212 - :ndnsim:`BestRoute`
213
214 If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
215 If not, Interest will be forwarded to the highest-ranked YELLOW face.
216 If there are no available GREEN or YELLOW faces, interests is dropped.
217
218 .. code-block:: c++
219
220 ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
221 ...
222 ndnHelper.Install (nodes);
223
224
225
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700226
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700227AppHelper
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700228---------------
229
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700230:ndnsim:`AppHelper` simplifies task of creating, configuring, and installing ndnSIM applications.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700231
232
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700233The basic usage of the :ndnsim:`AppHelper`:
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700234
235* Create helper for specific applications class:
236
237 .. code-block:: c++
238
239 // Create helper for the consumer generating Interests with constant rate
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700240 ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700241
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700242* Assign prefix on which application operates (either generating Interests using this name or satisfying Interests for this name) using :ndnsim:`AppHelper::SetPrefix`:
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700243
244 .. code-block:: c++
245
246 consumerHelper.SetPrefix (prefix);
247
Alexander Afanasyevf6807a52012-08-10 18:11:43 -0700248* Assign application-specific attributes using :ndnsim:`AppHelper::SetAttribute`:
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700249
250 .. code-block:: c++
251
252 // Set frequency parameter
253 consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
254
255* Install application on one or more nodes:
256
257 .. code-block:: c++
258
259 NodeContainer nodes;
260 ...
261 consumerHelper.Install (nodes)