Ns-3 Tutorial Stein Kristiansen (steikr@ifi.uio.no) 09.03.2010 - - PowerPoint PPT Presentation

ns 3 tutorial
SMART_READER_LITE
LIVE PREVIEW

Ns-3 Tutorial Stein Kristiansen (steikr@ifi.uio.no) 09.03.2010 - - PowerPoint PPT Presentation

Ns-3 Tutorial Stein Kristiansen (steikr@ifi.uio.no) 09.03.2010 Outline Ns-3 Overview Installation Ns-3 Objects Scripting Step-by-Step Resources Ns-3 Overview Free and open source discrete event network simulator


slide-1
SLIDE 1

Ns-3 Tutorial

Stein Kristiansen (steikr@ifi.uio.no) 09.03.2010

slide-2
SLIDE 2

Outline

 Ns-3 Overview  Installation  Ns-3 Objects  Scripting Step-by-Step  Resources

slide-3
SLIDE 3

Ns-3 Overview

Free and open source discrete event network simulator

Intended as a replacement for the popular ns-2

  • Clean slate implementation – no reuse of ns-2 code
  • Easier to use, more facilities, faster, more accurate and flexibile

First version 3.1 in June 2008

  • Current version: 3.10
  • 3.11 planned for release spring of 2011
  • Available for Linux, OS-X and Windows w/ Cygwin

Written in C++

  • Scripts written in C++, with optional Python interface
  • Helper classes make ”scripting” in C++ easy

 Well documented

  • Manual, tutorial, Doxygen and examples
  • Examples for wireless networks: ns-3.10/examples/wireless
slide-4
SLIDE 4

Installing ns-3

Simplest approach: download tarball, extract and build

In Ubuntu, you can use build.sh:

For Mac OS X, this works:

For development, Eclipse with Mercurial provides many advantages

  • Consult your supervisor

Detailed instructions in the ns-3 tutorial

$ wget http://www.nsnam.org/releases/ns-allinone-3.10.tar.bz2 $ tar xjf ns-allinone-3.10.tar.bz2 $ cd ns-allinone-3.10 $ ./build $ cd ns-3-dev $ ./waf --run first $ wget http://www.nsnam.org/releases/ns-allinone-3.10.tar.bz2 $ tar xjf ns-allinone-3.10.tar.bz2 $ cd ns-allinone-3.10/ns-3.10 $ ./configure –d debug $ ./waf --run first

slide-5
SLIDE 5

Example Scripts

 manet-main.cc : mobile ad-hoc network, OLSR, random walk

mobility

 Presented here

 chain-main.cc : wireless ad-hoc network, chain topology, no

mobility, static routes

 Slides in the appendix

 Running the script:

1. Searches examples, samples and scratch folders for scripts 2. Compiles your script (+ any other modified files) into ns-3 3. Runs the main() method in manet-main.cc

$ cp –r manet NS3FOLDER/scratch $ cd NS3FOLDER $ ./waf --run ”manet --numnodes=16 --cols=4 --spacing=100”

slide-6
SLIDE 6

Ns-3 Objects

slide-7
SLIDE 7

Ns-3 Objects

 Most objects inherit from ns3::Object

  • … which inherits from ns3::ObjectBase

 Properties

  • Manageable via smart-pointers

 Provides “garbage-collection” via reference-counting

  • Can be aggregated

 Must implement the GetTypeId() method

  • Provides run-time information on type
  • Allows objects to be located via object paths
  • Provides objects with attributes
  • Provides objects with trace-sources
slide-8
SLIDE 8

Smart-Pointers

 Ns-3 objects are created by the CreateObject

function, returning a smart-pointer:

 Always check functions’ return-values and

parameters: Ptr<T> or not?

 Most often they are

Ptr<PacketSocketFactory> factory = CreateObject<PacketSocketFactory> (); Ptr<Node> node = nodes.Get(0);

slide-9
SLIDE 9

Object Aggregation

Object can be aggregated to access each other, and for the user to easily access individual objects in an aggregation

Object aggregation:

Avoid huge classes encompassing all possible functionality

Retrieving an aggregated object:

node->AggregateObject (mobility); node mobility node mobility Ptr<MobilityModel> mob = node->GetObject<MobilityModel> ();

slide-10
SLIDE 10

TypeId GetTypeId(void)

Returns TypeId-object to identify and characterize object

Contains object type, constructor and parent object

Defines the object’s attributes and trace-sources TypeId RoutingProtocol::GetTypeId (void) { static TypeId tid = TypeId ("ns3::olsr::RoutingProtocol") .SetParent<Ipv4RoutingProtocol> () .AddConstructor<RoutingProtocol> () .AddAttribute ("HelloInterval", "HELLO messages emission interval.", TimeValue (Seconds (2)), MakeTimeAccessor (&RoutingProtocol::m_helloInterval), MakeTimeChecker ()) … .AddTraceSource ("Rx", "Receive OLSR packet.", MakeTraceSourceAccessor (&RoutingProtocol::m_rxPacketTrace)) ; return tid; }

slide-11
SLIDE 11

Ns-3 Object Paths

 Paths define location(s) of object(s) or their attributes  Objects can be reached via paths as long as they are attributes of,

  • r aggregated to, another object reachable via paths
  • All paths through which an object can be reached listed in doxygen

 Can select sub-set of objects in lists by qualifiers  Examples (from the Tunis tutorial available at the Ns-3 web-page):

  • /NodeList/[3-5]|8|[0-1]: matches nodes index 0, 1, 3, 4, 5, 8
  • /NodeList/*: matches all nodes
  • /NodeList/3/$ns3::Ipv4: matches object of type ns3::Ipv4 aggregated to node number 3
  • /NodeList/3/DeviceList/*/$ns3::CsmaNetDevice: matches all devices of type

ns3::CsmaNetDevice in node number 3

 Can e.g., use Config::LookupMatches to access the objects directly

  • Casting achieved by GetObject<Type> ()

Config::MatchContainer m = Config::LookupMatches("NodeList/*/$ns3::olsr::RoutingProtocol”); Ptr<Olsr::RoutingProtocol> olsr = m.Get(0)->GetObject<olsr::RoutingProtocol> ();

slide-12
SLIDE 12

Attributes

Attributes represent the different parameters of the models

Attributes are defined in the class implementation

Has type with the corresponding setter-classes, as well as default values

  • All available attributes are listed in the doxygen

TypeId RoutingProtocol::GetTypeId (void) { static TypeId tid = TypeId ("ns3::olsr::RoutingProtocol") .SetParent<Ipv4RoutingProtocol> () .AddConstructor<RoutingProtocol> () .AddAttribute ("HelloInterval", "HELLO messages emission interval.", TimeValue (Seconds (2)), MakeTimeAccessor (&RoutingProtocol::m_helloInterval), MakeTimeChecker ()) … return tid; }

slide-13
SLIDE 13

Setting Attribute Values

 Default attribute values can be set via Config::SetDefault

  • Set attribute values for all subsequently instantiated objects of this

 Attributes for individual object can be set with Config::Set, or

directly on the object via SetAttribute

Config::SetDefault("ns3::YansWifiPhy::TxGain", DoubleValue (”1")); Config::Set("/NodeList/5/DeviceList/0/Phy/TxGain”, DoubleValue (”1")); phy->SetAttribute ("TxGain", DoubleValue (”1"));

slide-14
SLIDE 14

Simulation Scripts Step-by-Step

slide-15
SLIDE 15

General Structure of a Script:

1.

Handle command line arguments

2.

Set default attribute values and random seed

3.

Create nodes

4.

Configure physical and MAC layers

5.

Enable PCAP tracing

6.

Set up network stack, routing and addresses

7.

Configure and install applications

8.

Set up initial positions and mobility

9.

Connect trace sources and sinks

  • 10. Schedule user-defined events and start

simulation

slide-16
SLIDE 16

Step 1: Command line Arguments

 Allows configuration from command line

  • E.g., $ ./waf --run ”manet --spacing=100”

int main(int args, char *argv[]) { uint32_t rows =4, cols = 4, nodeSpacing = 90, duration = 900, seed = 1; std::string phyMode("DsssRate11Mbps"); CommandLine cmd; cmd.AddValue (”phymode", ”Physical transmission mode", phyMode); cmd.AddValue ("rows", "Rows of nodes", rows); cmd.AddValue ("cols", "Columns of nodes", cols); cmd.AddValue ("spacing", "Spacing between neighbouring nodes", nodeSpacing); cmd.AddValue ("duration", "Duration of simulation", duration); cmd.AddValue (”seed", ”Random seed for simulation", seed); cmd.Parse (argc,argv); uint32_t numNodes = rows * cols; …

slide-17
SLIDE 17

Step 2: Set Attribute Values and Random Seed

 Set default attribute values  Remember to set random seed to

different values between runs

Config::SetDefault("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200")); Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200")); Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue (phyMode)); Config::SetDefault("ns3::ConstantRateWifiManager::DataMode", StringValue(phyMode)); Config::SetDefault("ns3::ConstantRateWifiManager::ControlMode", StringValue(phyMode)); Config::SetDefault("ns3::YansWifiPhy::RxGain", DoubleValue(-10)); Config::SetDefault("ns3::YansWifiPhy::TxGain", DoubleValue(1)); // Set seed for pseudorandom number generator SeedManager::SetSeed (seed);

slide-18
SLIDE 18

Step 3: Create nodes

 Most components in ns-3 is managed by

containers

  • Simulations usually consist of many components
  • f the same type
  • Used by e.g, helper classes to install components

(devices, stacks, applications, mobility, etc.)

  • Individual entities accessable via the Get()-

method

NodeContainer nodes; nodes.Create (numNodes); … Ptr<Node> first = nodes.Get(0) …

numNodes - 1

nodes 1

slide-19
SLIDE 19

Steps 4-7: Configuring the Nodes

 Nodes are currently empty

Antenna and NIC Protocols Applications

slide-20
SLIDE 20

Step 4: Physical Layer

 Helpers make scripting easier  Here used to configure the physical layer

 ”Antenna”  Set capturing format (explained later)

 TxGain = 1 and RxGain = -10

 With 11 Mbps DSSS, this yields 160-190 meters range  Can be adjusted to obtain a range more realistic for a given scenario

YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); wifiPhy.Set ("RxGain", DoubleValue (-10) ); wifiPhy.SetPcapDataLinkType(YansWifiPhyHelper::DLT_IEEE802_11_RADIO);

slide-21
SLIDE 21

Step 4: Channel

 Use of helpers to

configure the channel

 Can also use e.g.,

ns3::TwoRayGroundPropagationLossModel

YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); wifiPhy.Set ("RxGain", DoubleValue (-10) ); wifiPhy.SetPcapFormat(YansWifiPhyHelper::DLT_IEEE802_11_RADIO); YansWifiChannelHelper wifiChannel ; wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel"); wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel"); wifiPhy.SetChannel (wifiChannel.Create ());

slide-22
SLIDE 22

Step 4: MAC layer

NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue(phyMode)); wifiMac.SetType ("ns3::AdhocWifiMac");

MAC

Non-QoS, 11 Mbps 802.11b used in the example

Constant rate on transmissions and retransmissions

 Many alternatives, e.g., minstrel which is

  • ften used in real life

Data mode set to ”DsssRate11Mbps”

slide-23
SLIDE 23

Step 4: MAC layer

NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue(phyMode)); wifiMac.SetType ("ns3::AdhocWifiMac"); WifiHelper wifi; wifi.SetStandard (WIFI_PHY_STANDARD_80211b); NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);

MAC

… devices

MAC MAC MAC

… nodes

Use helper to install devices

Set the wireless interface into ad-hoc mode

Select 802.11b standard

Install this MAC layer into all nodes in our container ”nodes”, and connect them with the channel

slide-24
SLIDE 24

Step 5: Enable Tracing

 Must be done after setting up MAC

 Will produce one PCAP-file per interface per node in the

current directory

  • Prefix is set to ”MANET”
  • Resulting filenames: MANET
  • X-Y.pcap

 X = node, Y = device

 Can later be analysed with e.g., tcpdump

  • r wireshark:
  • $ tcpdump –r MANET
  • X-Y.pcap

wifiPhy.EnablePcap ("MANET", devices);

slide-25
SLIDE 25

Step 6: Stack, routing and addresses

 Select routing

  • Ns-3 currently supports OLSR, AODV and DSDV
  • Explained here: OLSR
  • In the appendix: manual configuration of static routes

 Install the network stack

  • Protocols installed: IP

, TCP , UDP, ARP and ICM

OlsrHelper olsr; InternetStackHelper internet; internet.SetRoutingHelper (olsr); internet.Install (nodes); … nodes

TCP UDP ARP IP ICMP OLSR

slide-26
SLIDE 26

Step 6: Assign Network Addresses

 Nodes 1 to N get addresses 10.0.0.1 through 10.0.0.N

  • I.e., the address of node nodes.Get(X) has address 10.0.0.(X + 1)

 MAC addresses are set to 00:00:00:00:00:(X + 1)

Ipv4AddressHelper address; address.SetBase ("10.0.0.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = address.Assign (devices);

slide-27
SLIDE 27

Step 7: Configure and Install Applications

 This tutorial: UDP trace-client and –server

  • For specific applications, consult supervisors

 Set attributes, and start and stop applications

according to duration of simulation

// Server/Receiver UdpServerHelper server (4000); ApplicationContainer apps = server.Install (nodes.Get(1)); apps.Start (Seconds (1.0)); apps.Stop (Seconds (10.0)); // Client/Sender UdpClientHelper client (interfaces.GetAddress (1), 4000); client.SetAttribute ("MaxPackets", UintegerValue (320)); client.SetAttribute ("Interval", TimeValue (Seconds(0.05))); client.SetAttribute ("PacketSize", UintegerValue (1024)); apps = client.Install (nodes.Get (0)); apps.Start (Seconds (2.0)); apps.Stop (Seconds (9.0));

slide-28
SLIDE 28

The Ns-3 Node

 Node provides methods to retrieve

pointers to devices and applications

 Aggregated with stack, mobility and

energy-model

Ptr<Application> app = node->GetApplication(0); Ptr<NetDevice> nic = node->GetDevice(0);

Ptr<Ipv4> ip = nodes.Get(0)->GetObject<Ipv4>(); Ipv4Address addr = ip->GetAddress(1,0).GetLocal();

slide-29
SLIDE 29

Step 8: Set up Initial Positions

 Several options available, including grid,

disc, random placement and user-defined locations

  • Explained here: grid
  • In the appendix: user-defined locations
  • For the usage of other alternatives, consult

manual, tutorial and doxygen

slide-30
SLIDE 30

Step 8: The Grid

MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (nodeSpacing), "DeltaY", DoubleValue (nodeSpacing), "GridWidth", UintegerValue (cols));

nodeSpacing nodeSpacing

1

Cols

Rows * Cols

slide-31
SLIDE 31

Step 8: Set up Mobility

 Several alternatives

  • Random mobility: random waypoint, random walk, …
  • User-defined: constant position/velocity/acceleration
  • Explained here: random walk
  • In the appendix: constant position (no mobility)
slide-32
SLIDE 32

Step 8: Random Walk

X Y

Uniform:2:0

MobilityHelper mobility; // Set positions mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (0, 500, 0, 500)), "Speed", StringValue(”Uniform:2:0"), ”Distance”, DoubleValue(30)); mobility.Install(nodes);

Random walk:

  • Walk in random direction for

fixed time/distance + reflect

  • n boundaries
  • Upon arrival, select new

random direction

  • Select speed with a random

variable

Default: ”Uniform:2:4”

  • Select traveling distance or

time

slide-33
SLIDE 33

Step 9: Connecting Trace Sources and Sinks

TypeId RoutingProtocol::GetTypeId (void) { .AddTraceSource ("RoutingTableChanged", "The OLSR routing table has changed.", MakeTraceSourceAccessor (&RoutingProtocol::m_routingTableChanged)) ; return tid; }

  • lsr-routing-protocol.cc

Ns-3 Objects can have a set of trace-sources

  • All listed in the doxygen

Invoked by methods in the object upon certain events

  • E.g., for the routing protocol, whenever there is a change in the route table

User can connect sources to their own sinks

  • Sinks: functions defined by the user
  • Use Config::Connect with paths
  • Invoked each time the source-object invokes the corresponding source
  • Function prototype of source and sink must match

 Fist argument a text string identifying the trace-sink

slide-34
SLIDE 34

Step 9: Connecting Trace Sources and Sinks

class RoutingProtocol : public Ipv4RoutingProtocol { public: … TracedCallback <uint32_t> m_routingTableChanged; };

  • lsr-routing-protocol.h

Ns-3 Objects can have a set of trace-sources

  • All listed in the doxygen

Invoked by methods in the object upon certain events

  • E.g., for the routing protocol, whenever there is a change in the route table

User can connect sources to their own sinks

  • Sinks: functions defined by the user
  • Use Config::Connect with paths
  • Invoked each time the source-object invokes the corresponding source
  • Function prototype of source and sink must match

 Fist argument a text string identifying the trace-sink

slide-35
SLIDE 35

Step 9: Connecting Trace Sources and Sinks

Ns-3 Objects can have a set of trace-sources

  • All listed in the doxygen

Invoked by methods in the object upon certain events

  • E.g., for the routing protocol, whenever there is a change in the route table

User can connect sources to their own sinks

  • Sinks: functions defined by the user
  • Use Config::Connect with paths
  • Invoked each time the source-object invokes the corresponding source
  • Function prototype of source and sink must match

 Fist argument a text string identifying the trace-sink

void RouteChange(std::string source, uint32_t size) { std::cout << "Routechange at " << source << ", new size: " << size << std::endl; } int main(int argc, char *argv[]) { … Config::Connect("/NodeList/*/$ns3::olsr::RoutingProtocol/RoutingTableChanged", MakeCallback (&RouteChange)); routingTableObject->TraceConnect(“RoutingTableChanged”, MakeCallback(&RouteChange)); simulation-script.cc

slide-36
SLIDE 36

Step 9: Connecting Trace Sources and Sinks

Ns-3 Objects can have a set of trace-sources

  • All listed in the doxygen

Invoked by methods in the object upon certain events

  • E.g., for the routing protocol, whenever there is a change in the route table

User can connect sources to their own sinks

  • Sinks: functions defined by the user
  • Use Config::Connect with paths
  • Invoked each time the source-object invokes the corresponding source
  • Function prototype of source and sink must match

 Fist argument a text string identifying the trace-sink

… Routechange at /NodeList/1/$ns3::olsr::RoutingProtocol/RoutingTableChanged, new size: 4 Routechange at /NodeList/6/$ns3::olsr::RoutingProtocol/RoutingTableChanged, new size: 8 … sample output:

slide-37
SLIDE 37

Step 10: Schedule Events and Start Simulation

 Can schedule your own events before

execution

  • Event: run a function w/ arguments at a given time
  • Can schedule new events

 Duration of simulation set by Simulator::Stop

void printTime(int interval) { std::cout << Simulator::Now() << std::endl; Simulator::Schedule(Seconds(interval), &printTime, interval); } int main(int argc, char *argv[]) { … Simulator::Schedule(Seconds(1), &printTime, 1); Simulator::Stop (Seconds (duration)); Simulator::Run (); Simulator::Destroy (); return 0; } // End of main()

slide-38
SLIDE 38

Step 10: Enabling Bienvisto-Tracing

 Bienvisto: Extensible MANET visualizer developed as a master

project by Miguel Santirso

 Flash (web)application taking as input a trace from Ns-3

  • Consult supervisor to get a copy
  • Based on the trace source/sink mechanism
  • Currently traces events related to mobility, routing and data-

transmission

 Put visualizer-trace-helper.cc/h into folder with script

#include ”visualizer-trace-helper.h” int main(int argc, char *argv[]) { … Simulator::Schedule(Seconds(1), &printTime, 1); Simulator::Stop (Seconds (duration)); VisualizerTraceHelper traceHelper(duration*1000, nodes); traceHelper.StartWritingFile("tracefile.txt"); Simulator::Run (); traceHelper.EndWritingFile(); Simulator::Destroy (); return 0; } // End of main()

slide-39
SLIDE 39

Resources

 The Ns-3 Website: http://www.nsnam.org

  • Wiki
  • Manual
  • Tutorials
  • Presentations
  • Doxygen

 Ns-3 examples

  • <ns3 folder>/examples
  • <ns3 folder>/samples
  • chain and manet
slide-40
SLIDE 40

That’s All

Questions? Good luck with the assignments!

slide-41
SLIDE 41

 Static routes  User defined locations  Constant positions  The Ns-3 logging facility

Appendix

slide-42
SLIDE 42

Step 6: Static Routing

 Setting static routes

  • Use Ipv4StaticRoutingHelper

 We provide a function to manipulate table

Ipv4StaticRoutingHelper staticRouting; InternetStackHelper internet; internet.SetRoutingHelper(staticRouting); internet.Install (nodes);

slide-43
SLIDE 43

Step 6: Static Routing

 Setting static routes

  • Use Ipv4StaticRoutingHelper

 We provide a function to manipulate table

void SetStaticRoute(Ptr<Node> n, const char* destination, const char* nextHop, uint32_t interface) { Ipv4StaticRoutingHelper staticRouting; Ptr<Ipv4> ipv4 = n->GetObject<Ipv4> (); Ptr<Ipv4StaticRouting> a = staticRouting.GetStaticRouting (ipv4); a->AddHostRouteTo (Ipv4Address (destination), Ipv4Address (nextHop), interface); }

slide-44
SLIDE 44

Step 6: Configuring Static Routes

 Setting static routes:

// Set addresses SetStaticRoute(nodes.Get(0), "10.0.0.3", "10.0.0.2", 1); SetStaticRoute(nodes.Get(0), "10.0.0.2", "10.0.0.2 ,1); SetStaticRoute(nodes.Get(1), "10.0.0.1", "10.0.0.1", 1); SetStaticRoute(nodes.Get(1), "10.0.0.3", "10.0.0.3", 1); SetStaticRoute(nodes.Get(2), "10.0.0.1", "10.0.0.2", 1); SetStaticRoute(nodes.Get(2), "10.0.0.2", "10.0.0.2", 1);

10.0.0.1 10.0.0.2 10.0.0.3

10.0.0.3 -> 10.0.0.2 10.0.0.2 -> 10.0.0.2

slide-45
SLIDE 45

Step 6: Configuring Static Routes

 Setting static routes:

// Set addresses SetStaticRoute(nodes.Get(0), "10.0.0.3", "10.0.0.2", 1); SetStaticRoute(nodes.Get(0), "10.0.0.2", "10.0.0.2", 1); SetStaticRoute(nodes.Get(1), "10.0.0.1", "10.0.0.1", 1); SetStaticRoute(nodes.Get(1), "10.0.0.3", "10.0.0.3", 1); SetStaticRoute(nodes.Get(2), "10.0.0.1", "10.0.0.2", 1); SetStaticRoute(nodes.Get(2), "10.0.0.2", "10.0.0.2", 1);

10.0.0.1 10.0.0.2 10.0.0.3

10.0.0.1 -> 10.0.0.1 10.0.0.3 -> 10.0.0.3

slide-46
SLIDE 46

Step 6: Configuring Static Routes

 Setting static routes:

10.0.0.1 10.0.0.2 10.0.0.3

10.0.0.1 -> 10.0.0.2 10.0.0.2 -> 10.0.0.2

// Set addresses SetStaticRoute(nodes.Get(0), "10.0.0.3", "10.0.0.2", 1); SetStaticRoute(nodes.Get(0), "10.0.0.2", "10.0.0.2", 1); SetStaticRoute(nodes.Get(1), "10.0.0.1", "10.0.0.1", 1); SetStaticRoute(nodes.Get(1), "10.0.0.3", "10.0.0.3", 1); SetStaticRoute(nodes.Get(2), "10.0.0.1", "10.0.0.2", 1); SetStaticRoute(nodes.Get(2), "10.0.0.2", "10.0.0.2", 1);

slide-47
SLIDE 47

Step 8: Explicit Locations and Constant Positions

MobilityHelper mobility; Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>(); positionAlloc->Add(Vector(0.0, 0.0, 0.0)); positionAlloc->Add(Vector(0.0, nodeSpacing, 0.0)); mobility.SetPositionAllocator(positionAlloc);

nodeSpacing

[0,0,0] [nodeSpacing,0,0]

MobilityHelper mobility; // Set positions mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install(nodes);

slide-48
SLIDE 48

The logging facility

 Ns-3 has an extensive logging facility  Seven levels: error, warn, debug, info, function,

logic, all

 Can activate component from script or from

shell

 LogComponentEnable (”MANET", LOG_LEVEL_INFO);  $ export NS_LOG=”MANET=level_info”

NS_LOG_COMPONENT_DEFINE ("MANET"); … NS_LOG_INFO("Area width: " << (rows - 1) * nodeSpacing); NS_LOG_INFO("Area height: " << (cols - 1) * nodeSpacing);