| 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>`. |