3 - 한국기술교육대학교

advertisement
NS-3 Tutorial 및 프로토콜 구현 방법
한국기술교육대학교 컴퓨터공학부 - 한연희 교수
yhhan@kut.ac.kr
고려대학교 융합소프트웨어 전문대학원 - 최현영 연구교수
neongas@korea.ac.kr
2011년도 한국통신학회 단기강좌
NS-3 Introduction
2
NS-3
What is NS-3?
NS-3 is a discrete-event network simulator for Internet
systems



http://www.nsnam.org
targeted primarily for research and educational use.
intended to eventually replace the ns-2 simulator
 not backwards-compatible with ns-2



a free, open source software project organized
around research community development and maintenance
NS-3 is a GNU GPLv2-licensed project
Open mailing lists
 http://www.nsnam.org/developers/tools/mailing-lists

3
~30 maintainers worldwide
NS-3
What is NS-3?
Main Groups


University of Washington (Tom Henderson), Georgia Tech (George
Riley), Bucknell (Felipe Perrone)
Financial Support
 U.S. National Science Foundation (NSF) & INRIA
 Project timeline: 2010-14
All code for merge to ns-3 is openly reviewed by
maintainers



Syntactic (style) reviews
Design reviews
Documentation and tests
Papers using NS-3 starting to appear

4
http://www.nsnam.org/overview/publications
NS-3
Language: NS-2 vs. NS-3
Language aspect

ns-2
 simulator core: c++ and Otcl
 script: Otcl

ns-3
 simulator core: NS-3 core is written entirely in C++
 script: user code - protocols and scenarios - also in C++
 Python wrappers for user code also exist, but can run ns-3
without any knowledge of Python
5
NS-3
NS-3 Progress Report
Current Release

ns-3.12.1 (Aug 31, 2011)
Progress Report (1/3)

6
ns-3.1 : June 2008
NS-3
NS-3 Progress Report
Progress Report (2/3)

ns-3-3.9 (August 20, 2010)
 Spectrum Modeling
 OFDM
 Underwater Acoustic Network
 WiFi patches for bugs, etc.
 See the page: http://www.nsnam.org/wiki/index.php/Ns-3.9

ns-3-3.10 (Jan., 2011)
 DSDV (Destination Sequenced Distance Vector) routing
 Initial support for the 802.11g PHY
 Consolidate Wi-Fi MAC high functionality
 Energy model WiFi additions
 New TCP
 3GPP LTE support, etc.
 See the page: http://www.nsnam.org/wiki/index.php/Ns-3.10
7
NS-3
NS-3 Progress Report
Progress Report (3/3)

ns-3-3.11 (May, 2011)
 The build system has been modularized, and the source code
reorganized

Python bindings have also been modularized
 An interface to an OpenFlow software implementation distribution has
been added
 Click Modular Routing

ns-3-3.12.1 (Aug 31, 2011)
 SpectrumChannel models now support the usage of single-frequency
propagation loss models based on the PropagationLossModel class
 Support for IPv4 fragmentation has been added
8
NS-3
Available modules (NS-3.11 May 2011)
devices
bridge
csma
emu
spectrum
tap-bridge
protocols
applications
internet
energy
uan
utilities
aodv
configstore
dsdv
flowmonitor
olsr
netanim
click
stats
mpi
point-topoint
virtualnet-device
mobility
lte
wifi
nix-vectorrouting
network
topologyread
propagation
mesh
9
wimax
core
visualizer
NS-3
NS-3 Features
Features (1/3)


Clean slate design from ns2, aiming to be easier to use and more
ready for extension
Alignment with real systems
 BSD-lookalike - sockets, device driver interfaces

Standard input/output formats so that other tools can be reused.
 e.g., PCAP (tcpdump/wireshark) trace output

ns-3 is adding “running implementation code”
 e.g., Linux TCP code
10
NS-3
NS-3 Features
Features (2/3)

Looks just like IP architecture stack
Application
Application
Application
Application
Sockets-like
API
Protocol
stack
Protocol
stack
Packet(s)
Node
NetDevice
NetDevice
Node
Channel
NetDevice
NetDevice
Channel
11
NS-3 basic simulation model
NS-3
NS-3 Features
Features (3/3)

Nodes have “network devices,” e.g. WiFi, CSMA
 NetDevices transfer packets over Channels
 Incorporating Layer 1 (Physical) & Layer 2 (Link)
 A node can be equipped with multiple network interfaces.
 Wireless Support




WiFi, WiMAX, UMTS (PPP)
Devices interface with Layer 3 (Network: IP, ARP)
Layer 3 supports Layer 4 (Transport: UDP, TCP)
Layer 4 is used by Layer 5 (Application) objects
 Can run real implementation of applications.

Various Network Access Types
 P2P link, shared link with CSMA.

12
Support (nearly) complete IPv6
NS-3
NS-3 Features
Extensively documented API (doxygen):

13
http://www.nsnam.org/documentation
NS-3
Key Abstractions
Node



basic computing device abstraction
Node class provides methods for managing computing devices
An ns-3 Node is a husk of a computer to which applications,
stacks, and NICs are added
Application
Application
Application
14
NS-3
Network Emulation
Network Emulation
real machine
virtual
machine
ns-3
virtual
machine
ns-3
ns-3
real
machine
real
machine
Testbed
1) ns-3 interconnects virtual
machines
Added in ns-3.5
15
2) testbeds interconnect ns-3
stacks
Added in ns-3.3
NS-3
NS-3 attribute system
Researchers want to know all of the values in effect in
their simulations

and configure them easily
In NS-3

Each ns-3 object has a set of attributes:
 A name, help text
 A type
 An initial value
 Object attributes are organized and
documented in the Doxygen




16
Control all simulation parameters for static objects
Dump and read them all in configuration files
Visualize them in a GUI
Makes it easy to verify the parameters of a simulation
NS-3
Key Abstractions
Application


user’s program to be simulated
Application class provides methods for managing user-level
applications
Channel



medium connected by nodes
Channel class provides methods for managing communication
media and connecting nodes to them.
Specialized Channel
 CsmaChannel: Ethernet
 PointToPointChannel
 WifiChannel
17
NS-3
Key Abstractions
Net device


like Network Interface Cards (NICs)
NICs are controlled using network device drivers collectively
known as “net devices”
 In Linux, you refer to these “net devices” by names such as eth0
 In NS-3, “net device” abstraction covers both the software driver and
the simulated hardware


It enables a node to communicate with other nodes in simulation
via channels
NetDevice class provides methods for managing connections to
Node and Channel objects
 a Node may be connected to more than one Channel via multiple
NetDevices.

Specialized Channel
 CsmaNetDevice
 PointToPointNetDevice
 WifiNetDevice
18
NS-3
Key Abstractions
Topology helpers


19
In a large simulated network you will need to arrange many
connections between Nodes, NetDevices and Channels.
By using “Topology helper” object, we can connect NetDevices to
Nodes, NetDevices to Channels, and assign IP addresses to
NetDevices
NS-3
Additional third-party project releases
PhySim: high-fidelity physical layer model for 5 GHz OFDM
 http://dsn.tm.uni-karlsruhe.de/english/ns3-physim.php
SliceTime: time synchronization between Xen PVMs and ns-3
 http://www.comsys.rwth-aachen.de/research/projects/slicetime
Multipath TCP: IETF TCP extensions
 http://code.google.com/p/mptcp-ns3
LENA project: LTE/EPC network simulator
 http://www.ubiquisys.com/femtocell-media-press-releases-id-203.htm
ns-3 DCE: Direct Code Execution environment
 http://www-sop.inria.fr/members/Mathieu.Lacage/dce.html
LTE: Univ. of Padua, HARQ and MOBILITY modules
 https://sourceforge.net/projects/ns3-lte
Content Addressable Networks DHT
 http://mailman.isi.edu/pipermail/ns-developers/201020
November/008460.html
NS-3
Course usage
Georgia Tech (George Riley)
 ECE 6110; http://users.ece.gatech.edu/~riley/ece6110
University of Kansas (James Sterbenz)
 EECS 882; http://www.ittc.ku.edu/~jpgs/courses/mwnets
University of Pennsylvania (Boon Thau Loo)
 CIS553; http://netdb.cis.upenn.edu/cis553projects
21
NS-3
Challenges for ns-3
NS-3 lacks an integrated development/visualization
environment (IDE)
NS-3 needs participation from the research community



22
1) improving simulation credibility
2) contributed and supported models
3) maintainers
NS-3
NS-3 Installation and Programming
23
NS-3
NS-3 Installation
Environment Recommendation  Ubuntu in VirtualBox
Download ns-3.11 (all-in-one package recommended)

Download directly from http://www.nsnam.org
home~$ wget http://www.nsnam.org/releases/ns-allinone-3.11.tar.bz2
home~$ tar xvfj ns-allinone-3.11.tar.bz2
Or using mercurial tool (Ubuntu)
home~$ sudo apt-get install mercurial
home~$ mkdir repos
home~$ cd repos
home~$ hg clone http://code.nsnam.org/ns-3-allinone
home~$ ls
ns-3-allinone
home~$ cd ns-3-allinone
home~$ ls
build.py* constants.py dist.py* download.py* README util.py
home~$ ./download.py -n ns-3.11

24
NS-3
NS-3 Installation
Build NS-3.11 (all-in-one) version
ns-allinone-3.11$ ./build.py --enable-examples --enable-tests
Setting environment
ns-allinone-3.11$ cd ns-3.11
ns-3.11$ ./waf -d optimized configure
ns-3.11$ ./waf -d debug configure
ns-3.11$ ./waf
ns-3.11$ ./test.py -c core
Hello Simulator example
ns-3.11$ ./waf --run hello-simulator
Waf: Entering Directory ‘/home/ns-allinone-3.11/ns-3.11/build’
Waf: Leaving Directory ‘/home/ns-allinone-3.11/ns-3.11/build’
‘build’ finished successfully (0.677s)
Hello Simulator
25
NS-3
waf
Python-based framework, meta-build system

waf [command] [options]
waf commands





build (default)
configure
clean
distclean
install
waf options



- -run=program
- -pyrun=python-program
- -command-template=“template”
 e.g.: - -command-template=“gdb - -args %s”
26
NS-3
How to Browse Codes (NS-3.11)
ns-allinone-3.11
ns-3.11
nsc-0.5.2
pybindgen0.15.0.785
...
...
src
build
examples
core
bindings
animation
network
model
csma
helper
...
internet
...
27
bindings
test
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (1/6)
int main (int argc, char *argv[])
{
LogComponentEnable (“UdpEchoClientApplication”, LOG_LEVEL_INFO);
LogComponentEnable (“UdpEchoServerApplication”, LOG_LEVEL_INFO);
CommandLine cmd;
cmd.Parse (argc, argv);
NodeContainer nodes;
nodes.Create (2);
nodes: NodeContainer
Node 0
28
Node 1
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (2/6)
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
devices: NetDeviceContainer
Node 0
5Mbit/s, 2ms
Node 1
PointToPointNetDevice
29
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (3/6)
InternetStackHelper stack;
stack.Install (nodes);
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);
interfaces: Ipv4InterfaceContainer
10.1.1.1
Ipv4Interface
Node 0
10.1.1.1
Node 1
PointToPointNetDevice
30
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (4/6)
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
serverApps: ApplicationContainer
UdpEchoServer
Node 0
31
Node 1
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (5/6)
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute (“MaxPackets”, UintegerValue (1));
echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.)));
echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
clientApps: ApplicationContainer
UdpEchoClient
Node 0
32
Dest: 10.1.1.2, port 9
1 packet, 1024 bytes
UdpEchoServer
Node 1
NS-3
Tutorial #1 – UDP Echo System
examples/tutorial/first.cc (6/6)
[...]
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
UdpEchoClient
UdpEchoServer
Node 0
(10.1.1.1)
Node 1
(10.1.1.2)
1
UDP Packet
2
3
UDP Packet
$ ./waf --run first
[...]
Sent 1024 bytes to 10.1.1.2 1
Received 1024 bytes from 10.1.1.1 2
Received 1024 bytes from 10.1.1.2 3
33
NS-3
Internal API Overview
Simulator Core
Random Variables
Memory Management
Object Aggregation
NS-3 Type System
Debugging support
Tracing
Callback Objects
Nodes
Packets
Packet: Headers and Trailers
NS-3 Sockets
34
NS-3
Simulator Core
Time is not manipulated directly: the Time class

Time class supports high precision 128 bit time values
(nanosecond precision)
Time t1 = Seconds (10);
Time t2 = t1 + MilliSeconds (100);
std::cout << t2.GetSeconds () << std::endl; //t2 = 10.1
Get current time:

Time now = Simulator::Now ();
Schedule an event to happen in 3 seconds:


35
void MyCallback (T1 param1, T2 param2) {…}
….
Simulator::Schedule (Seconds (3), MyCallback, param1, param2);
Also works with instance methods:
Simulator::Schedule (Seconds (3), &MyClass::Method, instancePtr,
param1, param2);
NS-3
Random Variables
Currently implemented distributions








Uniform: values uniformly distributed in an interval
Constant: values is always the same (not really random)
Sequential: return a sequential list of predefined values
Exponential: exponential distribution (poisson process)
Normal (gaussian)
Log-normal
pareto, weibull, triangular,
…
import pylab
import NS-3
rng = NS-3.NormalVariable(10.0, 5.0)
x = [rng.GetValue() for t in range(100000)]
pylab.hist(x, 100)
pylab.show()
36
NS-3
Memory Management
Many NS-3 objects use automatic garbage collection
Reference counting

Packet *p = new Packet; // refcount initialized to 1
p->Ref (); // refcount becomes 2
p->Unref (); // refcount becomes 1
p->Unref (); // refcount becomes 0, packet is freed
Smart Pointers

Manual reference counting is error prone
 Can easily lead to memory errors

Smart Pointers
 Take care of all the reference counting work
 Otherwise they behave like normal pointers

37
Example:
void MyFunction ()
{
Ptr<Packet> p = Create<Packet> (10);
std::cerr << “Packet size: “ << p->GetSize () << std::endl;
} //Packet is released (smart pointer goes out of scope)
NS-3
Object Aggregation
A circular singly linked-list
AggregateObject() is a constant-time operation
GetObject() is a O(n) operation
Node
Aggregate contains only one
object of each type
MobilityModel
Node
Ptr<Node> node=CreateObject<Node>();
Ptr<MobilityModel> mm=CreateObject<MobilityModel>();
node->AggregateObject (mm);
MobilityModel
Ipv4
Ptr<Ipv4> ipv4 = CreateObject<Ipv4>();
node->AggregateObject(ipv4);
//Query
Ptr<Ipv4> ipv4=node->GetObject<Ipv4>();
38
Node
MobilityModel
Ipv4
NS-3
NS-3 Type System
The aggregation mechanism needs information about the
type of objects at runtime
The attribute mechanism needs information about the
attributes supported by a specific object
The tracing mechanism needs information about the trace
sources supported by a specific object
All this information is stored in NS-3::TypeId;




39
The parent type
The name of the type
The list of attributes (their name, their type, etc.)
The list of trace sources (their name, their type, etc.)
NS-3
NS-3 Type System (cont.)
Derive from the NS-3::Object base class
Define a GetTypeId static method:
class MyClass : public Object {
public:
static TypeId GetTypeId();
};
Define the features of the object:
TypeId MyClass::GetTypeId() {
static TypeId tid = TypeId(“NS-3::MyClass”)
.SetParent<Object>()
.SetAttribute(“Name”, “Help”, ...)
.AddTraceSource (“Name”, “Help”, ...);
return tid;
}
call NS_OBJECT_ENSURE_REGISTERED macro in source code
NS_OBJECT_ENSURE_REGISTERED (MyClass);
40
NS-3
Debugging Support
Assertions: NS_ASSERT (expression);


Aborts the program if expression evaluates to false
Includes source file name and line number
Unconditional Breakpoints: NS_BREAKPOINT ();

Forces an unconditional breakpoint, compiled in
Debug Logging (not to be confused with tracing!)

Purpose
 Used to trace code execution logic
 For debugging, not to extract results!

properties
 NS_LOG* macros work with C++ IO streams
 e.g.: NS_LOG_LOGIC (“I have received ” << p->GetSize() << “bytes”);
 NS_LOG* macros evaluate to nothing in optimized builds
 When debugging is done, logging does not get in the way of execution
performance
41
NS-3
Debugging Support (cont.)

Logging levels:
 NS_LOG_ERROR (…): serious error messages only
 NS_LOG_WARN (…): warning messages
 NS_LOG_DEBUG (…): rare ad-hoc debug messages
 NS_LOG_INFO (…): informational messages (e.g. banners)
 NS_LOG_FUNCTION (…): function tracing
 NS_LOG_PARAM (…): parameters to functions
 NS_LOG_LOGIC (…): control flow tracing within functions

Logging “components”
 Logging messages organized by components
 Usually one component is one .cc source file
 NS_LOG_COMPONENT_DEFINE (“OslrAgent”);

Displaying log messages. Two ways:
 Programatically:

LogComponentEnable (“OslrAgent”, LOG_LEVEL_ALL);
 From the environment:
42

NS_LOG=“OslrAgent” ./my-program
NS-3
Tracing (by example)
uint64_t g_packetDrops = 0;
uint64_t g_packetDropBytes = 0;
void TraceDevQueueDrop (std::string context,
Ptr<const Packet> droppedPacket)
{
g_packetDrops += 1;
g_packetDropBytes += droppedPacket->GetSize ();
}
NodeList
0..*
Node
0..*
int main (int argc, char *argv[])
{
[…]
Config::Connect (“/NodeList/*/DeviceList/*/TxQueue/Drop”,
MakeCallback (&TraceDevQueueDrop));
[…]
}
43
NodeList
DeviceList
CsmaNetDevice
1
TxQueue
Queue
NS-3
Callback Objects
NS-3 Callback class implements function objects

Type safe callbacks, manipulated by value
 used for example in sockets and tracing
Example
double MyFunc (int x, float y) {
return double (x+y)/2;
}
Callback<double, int, float> cb1;
cb1 = MakeCallback (MyFunc);
double result = cb1 (2, 3); //result receives 2.5
------------------------------------------------------------------------------------------------class MyClass {
public: double MyMethod (int x, float y) {
return double (x+y)/2;
}};
Callback<double, int, float> cb1;
MyClass myobj;
cb1 = MakeCallback (&MyClass::MyMethod, &myObj);
double result = cb1 (2, 3); //result receives 2.5
44
NS-3
Nodes
Node class


Represents a network element
May have an IPv4 stack object
Application
May have a mobility model
 But it is optional


Contains a list of NetDevices
Contains a list of Applications
1
0..*
 But it is completely optional!

NodeList
Aggregates
IPv4
0..*
1
Node
MobilityModel
1
0..*
NodeList class (singleton)


45
NetDevice
Tracks all nodes ever created
Node index  Ptr conversions
NS-3
Packets
Packet objects used vertically in NS-3 to represent:



Units of information sent and received by applications
Information chunks of what will becomes a real packet (similar
sk_buff in Linux kernel)
Simulated packets and L2/L1 frames being transmitted
Basic Usage

Create empty packet
 Ptr<Packet> packet = Create<Packet> ();

Create packet with 10 “dummy” bytes
 Ptr<Packet> packet = Create<Packet> (10);

Create packet with user data
 Ptr<Packet> packet = Create<Packet> (“hello”, 5);

Copy a packet
 Ptr<Packet> packet2 = packet1->Copy ();
 Note: packet copy is usually cheap (copy-on-write)
46
NS-3
Packet: Headers and Trailers
Packets support headers and trailers

Headers and trailers are implemented as classes that
 Implement a Serialize method:

Writes the header information as a byte stream;
 Implement a Deserialize method:



Reads the header information from a byte stream;
Headers and trailers used to implement protocols
Packets contain exact byte contents
 They are not just structure as in NS-2
 Allows writing pcap trace files, readable from wireshark
47
NS-3
Packet: Headers and Trailers (cont.)
LLC/SNAP header example
uint32_t LlcSnapHeader::GetSerializedSize (void) const
{
return 8;
}
void LlcSnapHeader::Serialize (Buffer::Iterator start) const
{
Buffer::Iterator i = start;
uint8_t buf[] = { 0xaa, 0xaa, 0x03, 0, 0, 0};
i.Write (buf, 6);
i.WriteHtonU16 (m_etherType);
}
uint32_t LlcSnapHeader::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
i.Next (5+1);
m_etherType = i.ReadNtohU16 ();
return GetSerializedSize ();
}
Adding a header
LlcSnapHeader llcsnap;
llcsnap.SetType (0x0800); //IPv4
packet->AddHeader (llcsnap);
DSAP SSAP Ctrl. 00
LLC(3bytes)
00
00 Ethertype
SNAP(5bytes)
Removing a header
LlcSnapHeader llcsnap;
packet->RemoveHeader (llcsnap);
48
NS-3
NS-3 Sockets
Plain C sockets
int sk;
sk = socket (PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in src;
inet_pton(AF_INET, “0.0.0.0”, &src.sin_addr);
src.sin_port = htons(80);
bind(sk, (struct sockaddr *)&src, sizeof(src));
NS-3 sockets
Ptr<SocketFactory> udpFactory=node->
GetObject<UdpSocketFactory> ();
Ptr<Socket> sk = udpFactory->CreateSocket ();
InetSocketAddress src = InetSocketAddress
(Ipv4Address::GetAny(), 80);
sk->Bind (src);
struct sockaddr_in dest;
inet_pton(AF_INET, “10.0.0.1”, &dest.sin_addr);
dest.sin_port = htons(80);
sendto(sk, “hello”, 6, 0, (struct sockaddr *)&dest,
sizeof(dest));
InetSocketAddress dest = InetSocketAddress
(Ipv4Address(“10.0.0.1”), 80);
sk->SendTo (dest, Create<Packet> (“hello”, 6));
char buf[6];
recv(sk, buf, 6, 0);
sk->SetReceiveCallback (MakeCallback
(MySocketReceive));
49
void MySocketReceive (Ptr<Socket> sk) {
char buf[6];
sk->Recv (buf, 6, 0);
}
NS-3
Tutorial #2
Making a new agent called “MyAgent”


It communicates each other using IPv4 with protocol number
(250)
New packet header “MyHeader” is used for information exchange
 source IP, destnation IP, and sequence
0
32
source IP
destination IP
sequence
MyAgent
Node1
50
MyHeader
IPv4
PPP
MyAgent
Node2
NS-3
Tutorial #2 - Where to put source codes
Create new folder “myagent” and sub-folders
ns-3.11
scratch
myagent-test.cc
src
myagent
wscript
bindings
51
helper
myagent-helper.h, myagent-helper.cc
model
myagent.h, myagent.cc, myheader.h,
myheader.cc
test
NS-3
Tutorial #2 - Module dependency
Add “myagent” module to ns-3.11

ns-3.11/src/wscript file
all_modules = {
……
‘template’,
‘myagent’,
};
Create “wscript” file in ns-3.11/src/myagent folder
52
def build(bld):
myagent = bld.create_NS-3_module(‘myagent’, [‘network’, ‘internet’])
myagent.source = [
‘model/myagent.cc’,
‘model/myheader.cc’,
‘helper/myagent-helper.cc’,
]
headers = bld.new_task_gen(‘NS-3header’)
headers.module = ‘myagent’
headers.source = [
‘model/myagent.h’,
‘model/myheader.h’,
‘helper/myagent-helper.h’,
]
NS-3
Tutorial #2 - MyHeader class
MyHeader class definition
class MyHeader : public Header
{
public:
MyHeader ();
[……]
virtual
virtual
virtual
virtual
void Print (std::ostream &os) const;
uint32_t GetSerializedSize (void) const;
void Serialize (Buffer::Iterator start) const;
uint32_t Deserialize (Buffer::Iterator start);
private:
Ipv4Address m_source;
Ipv4Address m_destination;
uint32_t m_sequence;
}
53
NS-3
Tutorial #2 - MyHeader class(cont.)
MyHeader codes
uint32_t
MyHeader::GetSerializedSize (void) const
{
return 12;
}
void
MyHeader::Serialize (Buffer::Iterator start) const
{
Buffer::Iterator i = start;
uint8_t buf[4];
uint32_t
MyHeader::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
uint8_t buf[4];
i.Read (buf, 4);
m_source = Ipv4Address::Deserialize (buf);
i.Read (buf, 4);
m_destination = Ipv4Address::Deserialize (buf);
m_source.Serialize (buf);
i.Write (buf, 4);
m_destination.Serialize (buf);
i.Write (buf, 4);
}
54
m_sequence = i.ReadNtohU32 ();
}
return GetSerializedSize ();
i.WriteHtonU32 (m_sequence);
NS-3
Tutorial #2 - MyAgent class
MyAgent class definition
class MyAgent : public Ipv4L4Protocol
{
public:
static TypeId GetTypeId (void);
static uint16_t PROT_NUMBER;
[……]
virtual int GetProtocolNumber (void) const;
virtual enum Ipv4L4Protocol::RxStatus Receive (Ptr<Packet> p, Ipv4Header const &header,
Ptr<Ipv4Interface> incomingInterface);
[……]
void SendMyInfo ();
protected:
virtual void NotifyNewAggregate ();
private:
Ptr<Node> m_node;
uint32_t m_sequence;
Ipv4Address m_localAddress;
Ipv4Address m_peerAddress;
};
55
NS-3
Tutorial #2 - MyAgent class (cont.)
MyAgent class codes

NotifyNewAggregate() : called whenever an object is aggregated
void MyAgent::NotifyNewAggregate ()
{
if (m_node == 0)
{
Ptr<Node>node = this->GetObject<Node> ();
if (node != 0)
{
this->SetNode (node);
Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
ipv4->Insert (this);
}
}
Object::NotifyNewAggregate ();
}
56
MyAgent
1) Insert()
2)
List
Ipv4L3Protocol
NS-3
Tutorial #2 - MyAgent class
MyAgent class codes
Sending Information

void MyAgent::SendMyInfo ()
{
NS_LOG_FUNCTION_NOARGS ();
MyAgent
Ptr<Packet> packet = Create<Packet>();
MyHeader myh;
myh.SetDestination (m_peerAddress);
myh.SetSource (m_localAddress);
myh.SetSequence (m_sequence++);
packet->AddHeader (myh);
Send()
Ipv4L3Protocol
NS_LOG_INFO ("Sending information : " << myh);
Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
}
57
ipv4->Send (packet, m_localAddress, m_peerAddress,
PROT_NUMBER, 0);
NS-3
Tutorial #2 - MyAgent class (cont.)
MyAgent class codes
Receiving Information

enum Ipv4L4Protocol::RxStatus MyAgent::Receive (Ptr<Packet> p,
Ipv4Header const &header,
Ptr<Ipv4Interface> incomingInterface)
{
NS_LOG_FUNCTION (this << p << header);
MyHeader myh;
p->RemoveHeader (myh);
MyAgent
NS_LOG_INFO ("Received information : " << myh);
}
return Ipv4L4Protocol::RX_OK;
uint16_t MyAgent::PROT_NUMBER = 250;
58
int MyAgent::GetProtocolNumber (void) const
{
NS_LOG_FUNCTION_NOARGS ();
return PROT_NUMBER;
}
2) Receive()
1)GetProtocolNumber()
Ipv4L3Protocol
NS-3
Tutorial #2 - MyAgentHelper class
MyAgentHelper class definition & code
class MyAgentHelper
{
public:
MyAgentHelper (void);
virtual ~MyAgentHelper (void);
void Install (Ptr<Node> node, Ipv4Address local, Ipv4Address peer) const;
private:
};
void MyAgentHelper::Install (Ptr<Node> node, Ipv4Address local, Ipv4Address peer) const
{
NS_LOG_FUNCTION (this << node << local << peer);
Ptr<MyAgent> myagent = CreateObject<MyAgent> ();
myagent->SetLocalAddress (local);
myagent->SetPeerAddress (peer);
}
59
node->AggregateObject (myagent);
NS-3
Tutorial #2 - Simulation Script
The same script from Tutorial #1 except MyAgent related
codes
void SendInfo (Ptr<Node> node)
{
Ptr<MyAgent> myagent = node->GetObject<MyAgent> ();
myagent->SendMyInfo ();
}
int main (int argc, char *argv[])
{
[……]
MyAgentHelper myHelper;
myHelper.Install (nodes.Get (0), Ipv4Address ("10.1.1.1"), Ipv4Address ("10.1.1.2"));
myHelper.Install (nodes.Get (1), Ipv4Address ("10.1.1.2"), Ipv4Address ("10.1.1.1"));
}
60
Simulator::Schedule (Seconds (1.0), SendInfo, nodes.Get (0));
NS-3
Tutorial #2 - Simulation Results
Results
ns-3.11$ ./waf --run myagent-test
Sending information : ( SourceIP: 10.1.1.1, DestinationIP: 10.1.1.2, Sequence: 0)
Received information : ( SourceIP: 10.1.1.1, DestinationIP: 10.1.1.2, Sequence: 0)
61
NS-3
Tutorial #2 - Simulation Results
0xfa=250
source IP:10.1.1.1
dest. IP:10.1.1.2
62
NS-3
Thank you
Q&A
63
NS-3
Download