Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 1 | ndnSIM helpers |
| 2 | ============== |
| 3 | |
| 4 | Helpers are very important components of ndnSIM, especially for writing simulation scenarios. |
| 5 | The following summarizes helpers and their basic usage. |
| 6 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 7 | StackHelper |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 8 | --------------- |
| 9 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 10 | :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 Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 11 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 12 | Example: |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 13 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 14 | .. code-block:: c++ |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 15 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 16 | ndn::StackHelper ndnHelper; |
| 17 | NodeContainer nodes; |
| 18 | ... |
| 19 | ndnHelper.Install (nodes); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 20 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 21 | Routing |
| 22 | +++++++ |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 23 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 24 | All forwarding strategies require knowledge of where Interests can be forwarded (Forwarding Information Base). |
| 25 | 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. |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 26 | |
| 27 | .. note:: |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 28 | 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 Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 29 | |
| 30 | Manually routes |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 31 | ^^^^^^^^^^^^^^^ |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 32 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 33 | Routes can be configured manually using :ndnsim:`StackHelper::AddRoute` static methods of :ndnsim:`StackHelper`. |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 34 | |
| 35 | These routes **should** be created **after** installing NDN stack on a node: |
| 36 | |
| 37 | .. code-block:: c++ |
| 38 | |
Alexander Afanasyev | b8d14ad | 2012-08-09 13:19:37 -0700 | [diff] [blame] | 39 | ndnHelper.Install (nodes); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 40 | ... |
| 41 | Ptr<Node> node = ... // FIB entry will be added to FIB on this node |
| 42 | std::string prefix = ... // some prefix |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 43 | Ptr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessible |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 44 | int32_t metric = ... // some routing metric |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 45 | ndn::StackHelper::AddRoute (node, prefix, face, metric); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 46 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 47 | Global routing controller |
| 48 | ^^^^^^^^^^^^^^^^^^^^^^^^^ |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 49 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 50 | 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``. |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 51 | |
| 52 | There are several necessary steps, in order to take advantage of the global routing controller: |
| 53 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 54 | * install :ndnsim:`special interfaces <GlobalRouter>` on nodes |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 55 | |
| 56 | .. code-block:: c++ |
| 57 | |
| 58 | NodeContainer nodes; |
| 59 | ... |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 60 | ndn::GlobalRoutingHelper ndnGlobalRoutingHelper; |
Alexander Afanasyev | b8d14ad | 2012-08-09 13:19:37 -0700 | [diff] [blame] | 61 | ndnGlobalRoutingHelper.Install (nodes); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 62 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 63 | * specify which node exports which prefix using :ndnsim:`GlobalRoutingHelper::AddOrigins` |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 64 | |
| 65 | .. code-block:: c++ |
| 66 | |
| 67 | Ptr<Node> producer; // producer node that exports prefix |
| 68 | std::string prefix; // exported prefix |
| 69 | ... |
Alexander Afanasyev | b8d14ad | 2012-08-09 13:19:37 -0700 | [diff] [blame] | 70 | ndnGlobalRoutingHelper.AddOrigins (prefix, producer); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 71 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 72 | * calculate and install FIBs on every node using :ndnsim:`GlobalRoutingHelper::CalculateRoutes` |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 73 | |
| 74 | .. code-block:: c++ |
| 75 | |
Alexander Afanasyev | b8d14ad | 2012-08-09 13:19:37 -0700 | [diff] [blame] | 76 | cdnGlobalRoutingHelper.CalculateRoutes (); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 77 | |
Alexander Afanasyev | e095f0f | 2012-11-21 17:43:32 -0800 | [diff] [blame] | 78 | Default routes |
| 79 | ^^^^^^^^^^^^^^ |
| 80 | |
| 81 | In simple topologies, like in :doc:`examples <examples>`, or when |
| 82 | simulating broadcast environment, it is possible to set up *default* |
| 83 | FIB entries using :ndnsim:`StackHelper::SetDefaultRoutes` call. |
| 84 | More specifically, every installed NDN stack will have a FIB entry to ``/`` prefix, containing all available faces. |
| 85 | |
| 86 | The 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 | |
| 95 | Content Store |
| 96 | +++++++++++++ |
| 97 | |
| 98 | ndnSIM 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 | |
| 104 | To 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 | |
| 141 | Pending Interest Table |
| 142 | ++++++++++++++++++++++ |
| 143 | |
| 144 | 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). |
| 145 | |
| 146 | To 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 | |
| 181 | Forwarding strategy |
| 182 | +++++++++++++++++++ |
| 183 | |
| 184 | A 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 Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 226 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 227 | AppHelper |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 228 | --------------- |
| 229 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 230 | :ndnsim:`AppHelper` simplifies task of creating, configuring, and installing ndnSIM applications. |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 231 | |
| 232 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 233 | The basic usage of the :ndnsim:`AppHelper`: |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 234 | |
| 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 Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 240 | ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr"); |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 241 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 242 | * Assign prefix on which application operates (either generating Interests using this name or satisfying Interests for this name) using :ndnsim:`AppHelper::SetPrefix`: |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 243 | |
| 244 | .. code-block:: c++ |
| 245 | |
| 246 | consumerHelper.SetPrefix (prefix); |
| 247 | |
Alexander Afanasyev | f6807a5 | 2012-08-10 18:11:43 -0700 | [diff] [blame] | 248 | * Assign application-specific attributes using :ndnsim:`AppHelper::SetAttribute`: |
Alexander Afanasyev | 6315ef7 | 2012-06-01 20:56:31 -0700 | [diff] [blame] | 249 | |
| 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) |