blob: 9ffa3b7dbddb5c5ab4648291849966f2efd953e1 [file] [log] [blame]
ndnSIM helpers
==============
Helpers are very important components of ndnSIM, especially for writing simulation scenarios.
The following summarizes helpers and their basic usage.
StackHelper
---------------
: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.
Example:
.. code-block:: c++
ndn::StackHelper ndnHelper;
NodeContainer nodes;
...
ndnHelper.Install (nodes);
Routing
+++++++
All forwarding strategies require knowledge of where Interests can be forwarded (Forwarding Information Base).
Unlike 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.
.. note::
By default, all nodes have empty FIB. You need either to manually configure routes, use global routing controller, or (not recommended) enable default routes.
Manually routes
^^^^^^^^^^^^^^^
Routes can be configured manually using :ndnsim:`StackHelper::AddRoute` static methods of :ndnsim:`StackHelper`.
These routes **should** be created **after** installing NDN stack on a node:
.. code-block:: c++
ndnHelper.Install (nodes);
...
Ptr<Node> node = ... // FIB entry will be added to FIB on this node
std::string prefix = ... // some prefix
Ptr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessible
int32_t metric = ... // some routing metric
ndn::StackHelper::AddRoute (node, prefix, face, metric);
Global routing controller
^^^^^^^^^^^^^^^^^^^^^^^^^
To 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``.
There are several necessary steps, in order to take advantage of the global routing controller:
* install :ndnsim:`special interfaces <GlobalRouter>` on nodes
.. code-block:: c++
NodeContainer nodes;
...
ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
ndnGlobalRoutingHelper.Install (nodes);
* specify which node exports which prefix using :ndnsim:`GlobalRoutingHelper::AddOrigins`
.. code-block:: c++
Ptr<Node> producer; // producer node that exports prefix
std::string prefix; // exported prefix
...
ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
* calculate and install FIBs on every node using :ndnsim:`GlobalRoutingHelper::CalculateRoutes`
.. code-block:: c++
cdnGlobalRoutingHelper.CalculateRoutes ();
Default routes
^^^^^^^^^^^^^^
In simple topologies, like in :doc:`examples <examples>`, or when
simulating broadcast environment, it is possible to set up *default*
FIB entries using :ndnsim:`StackHelper::SetDefaultRoutes` call.
More specifically, every installed NDN stack will have a FIB entry to ``/`` prefix, containing all available faces.
The following should be done before installing stack on a node:
.. code-block:: c++
ndnHelper.SetDefaultRoutes (true);
...
ndnHelper.Install (nodes);
Content Store
+++++++++++++
ndnSIM comes with several different in-memory :ndnsim:`content store <ndn::ContentStore>` implementations, featuring different cache replacement policies.
To select a particular content store and configure its capacity, use :ndnsim:`SetContentStore <ndn::StackHelper::SetContentStore>` helper method:
.. code-block:: c++
ndnHelper.SetContentStore ("<content store implementation>",
["<optional parameter>", "<optional parameter's value>" [, ...]]);
...
ndnHelper.Install (nodes);
In simulation scenarios it is possible to select one of :ref:`the existing implementations of the content store or implement your own <content store>`.
Pending Interest Table
++++++++++++++++++++++
The 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).
To select a particular PIT implementation and configure its policies, use :ndnsim:`SetPit <ndn::StackHelper::SetPit>` helper method:
- :ndnsim:`persistent <ndn::pit::Persistent>` (default):
New entries will be rejected if PIT size reached its limit
.. code-block:: c++
ndnHelper.SetPit ("ns3::ndn::pit::Persistent",
"MaxSize", "0");
...
ndnHelper.Install (nodes);
- :ndnsim:`random <ndn::pit::Random>`:
when PIT reaches its limit, random entry (could be the newly created one) will be removed from PIT;
.. code-block:: c++
ndnHelper.SetPit ("ns3::ndn::pit::Random",
"MaxSize", "0");
...
ndnHelper.Install (nodes);
- :ndnsim:`least-recently-used <ndn::pit::Lru>`:
the least recently used entry (the oldest entry with minimum number of incoming faces) will be removed when PIT size reached its limit.
.. code-block:: c++
ndnHelper.SetPit ("ns3::ndn::pit::Lru",
"MaxSize", "0");
...
ndnHelper.Install (nodes);
Forwarding strategy
+++++++++++++++++++
A desired :ndnsim:`forwarding strategy <ForwardingStrategy>` parameter need to be set before installing stack on a node.
To select a particular forwarding strategy implementation and configure its parameters, use :ndnsim:`SetForwardingStrategy <ndn::StackHelper::SetContentStore>` helper method:
.. code-block:: c++
ndnHelper.SetForwardingStrategy ("<forwarding strategy implementation>",
["<optional parameter>", "<optional parameter's value>" [, ...]]);
...
ndnHelper.Install (nodes);
In simulation scenarios it is possible to select one of :ref:`the existing implementations of the forwarding strategy or implement your own <forwarding strategies>`.
.. Currently, there are following forwarding strategies that can be used in simulations:
.. - :ndnsim:`Flooding` (default)
.. Interests will be forwarded to all available faces available for a route (FIB entry).
.. If there are no available GREEN or YELLOW faces, interests is dropped.
.. .. code-block:: c++
.. ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding");
.. ...
.. ndnHelper.Install (nodes);
.. - :ndnsim:`SmartFlooding`
.. If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
.. If not, Interest will be forwarded to all available faces available for a route (FIB entry)/
.. If there are no available GREEN or YELLOW faces, interests is dropped.
.. .. code-block:: c++
.. ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::SmartFlooding");
.. ...
.. ndnHelper.Install (nodes);
.. - :ndnsim:`BestRoute`
.. If GREEN face is available, Interest will be sent to the highest-ranked GREEN face.
.. If not, Interest will be forwarded to the highest-ranked YELLOW face.
.. If there are no available GREEN or YELLOW faces, interests is dropped.
.. .. code-block:: c++
.. ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
.. ...
.. ndnHelper.Install (nodes);
AppHelper
---------------
:ndnsim:`AppHelper` simplifies task of creating, configuring, and installing ndnSIM applications.
The basic usage of the :ndnsim:`AppHelper`:
* Create helper for specific applications class:
.. code-block:: c++
// Create helper for the consumer generating Interests with constant rate
ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
* Assign prefix on which application operates (either generating Interests using this name or satisfying Interests for this name) using :ndnsim:`AppHelper::SetPrefix`:
.. code-block:: c++
consumerHelper.SetPrefix (prefix);
* Assign application-specific attributes using :ndnsim:`AppHelper::SetAttribute`:
.. code-block:: c++
// Set frequency parameter
consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
* Install application on one or more nodes:
.. code-block:: c++
NodeContainer nodes;
...
consumerHelper.Install (nodes)
In simulation scenarios it is possible to select one of :ref:`the existing applications or implement your own <applications>`.