Optical Networking Research GroupInformation Network Lab, USTC 2
Outline
Part I: NS Programming Basics Object oriented mechanisms Overview of NS Simulator The Lamp Example Packet Handling in NS—from a transport protocol’s
perspectivePart II: Build in NS a platform for RWA Simulation Network Model Architectural Overview Internals…
Optical Networking Research GroupInformation Network Lab, USTC 3
What’s Object Oriented…
Object An object is a software bundle of variables and r
elated methods. [java.sun.com] Variable => State Methods => Behavior
OOP. A software design method that models the charact
eristics of abstract or real objects using classes. [java.sun.com]
Optical Networking Research GroupInformation Network Lab, USTC 4
Why Object Oriented…
Modularity Easy for maintenance Easy for code Reuse
Information hiding Transparency Security
Inheritance Structuring and Organizing Software
Optical Networking Research GroupInformation Network Lab, USTC 5
Object Oriented Programming
struct astruct a Class aClass a
member v1;member v2;method m1;method m2;…
member v1;member v2;method m1;method m2;…
variable v1;variable v2;…
variable v1;variable v2;…
procedure pprocedure p
Some operation on instances of struct a
Some operation on instances of struct a
Class b base class aClass b base class a
member v2b;method m2b;…
member v2b;method m2b;…
Optical Networking Research GroupInformation Network Lab, USTC 6
NS – A Schematic Overview
C++Compiled Hierarchy
OTclInterpreted Hierarchy
Optical Networking Research GroupInformation Network Lab, USTC 7
NS – A Schematic Overview
C++ /OTcl ImplementationC++ and OTcl InteractionOTcl Object Implementation Simulation Scripts
What to do? For ordinary users For Advanced users
Optical Networking Research GroupInformation Network Lab, USTC 8
An Example -- Lamp
May change ON/OFF Status
May change brightness
Status and Brightness may be monitored
Optical Networking Research GroupInformation Network Lab, USTC 9
From this example,
You will know how to…
Implement a class in C++
Implement a class in OTcl
Combine OTcl and C++ codes
Write simple simulation scripts
Optical Networking Research GroupInformation Network Lab, USTC 10
An Example: Lamp
Interfaces:switch: switch the ON/OFF status of the lamp objectshow_status: Show the current ON/OFF status of the lamp objectbrighten: make the lamp object brighterdarken: make the lamp object darker
Member variablesstatus: current status of the lamp object, {ON, OFF}brightness: current brightness of the lamp object in integervoltage, current, resistance: electro. character. of the lamp object
OTcl
C++
OTcl
C++
Optical Networking Research GroupInformation Network Lab, USTC 11
Lamp Implementation in C++
class Lamp_C: public TclObject {private:
real resistance, current, voltage;int brightness;
public: Lamp_C(real r) {resistance = r;}void brighten(int step);void darken(int step);
}void Lamp_C::brighten(int step) {
resistance -= log(step); //need check here!!!current = voltage/resistance;brightness = C*pow (current, 2);
}void Lamp_C::darken(int step) {
resistance +=log(step); //need check here!!!current = voltage/resistance;brightness = C*pow (current, 2);
}
class Lamp_C: public TclObject {private:
real resistance, current, voltage;int brightness;
public: Lamp_C(real r) {resistance = r;}void brighten(int step);void darken(int step);
}void Lamp_C::brighten(int step) {
resistance -= log(step); //need check here!!!current = voltage/resistance;brightness = C*pow (current, 2);
}void Lamp_C::darken(int step) {
resistance +=log(step); //need check here!!!current = voltage/resistance;brightness = C*pow (current, 2);
}
…
Lamp_C mylamp = new Lamp_C(50.0);
mylamp.brighten(10);
mylamp.darken(30);
…
…
Lamp_C mylamp = new Lamp_C(50.0);
mylamp.brighten(10);
mylamp.darken(30);
…
Optical Networking Research GroupInformation Network Lab, USTC 12
Lamp Implementation in OTcl
Class Lamp_TCLLamp_TCL set status OFFLamp_TCL set brightness 0
Lamp_TCL instproc switch { state } {$self instvar statusif {$state != “”} {
set status $state} return $status
}
Lamp_TCL instproc show_status { } {$self instvar statusputs “Current status is :$status”puts “Current brightness is :$brightness”
}
Class Lamp_TCLLamp_TCL set status OFFLamp_TCL set brightness 0
Lamp_TCL instproc switch { state } {$self instvar statusif {$state != “”} {
set status $state} return $status
}
Lamp_TCL instproc show_status { } {$self instvar statusputs “Current status is :$status”puts “Current brightness is :$brightness”
}
C:\ns-2.1b8win\ns↲%% set mylamp [new Lamp_TCL]% $mylamp show_status% $mylamp switch ON% $mylamp show_status
Result:Current status is :OFFCurrent brightness is : 0Current status is :ONCurrent brightness is : 0
C:\ns-2.1b8win\ns↲%% set mylamp [new Lamp_TCL]% $mylamp show_status% $mylamp switch ON% $mylamp show_status
Result:Current status is :OFFCurrent brightness is : 0Current status is :ONCurrent brightness is : 0
Optical Networking Research GroupInformation Network Lab, USTC 13
Comparing C++ and OTcl
• class Lamp_C: public TclObject {• private:• real resistance, current,
voltage;• int brightness;• public: • Lamp_C(real r) {resistance =
r;}• void brighten(int step);• void darken(int step);• }• void Lamp_C::brighten(int step) {• // …• }• void Lamp_C::darken(int step) {• //…• }
• class Lamp_C: public TclObject {• private:• real resistance, current,
voltage;• int brightness;• public: • Lamp_C(real r) {resistance =
r;}• void brighten(int step);• void darken(int step);• }• void Lamp_C::brighten(int step) {• // …• }• void Lamp_C::darken(int step) {• //…• }
• Class Lamp_TCL• Lamp_TCL set status OFF• Lamp_TCL set brightness 0
• Lamp_TCL instproc switch { state } {• #...• }
• Lamp_TCL instproc show_status { } {• #...• }
• Class Lamp_TCL• Lamp_TCL set status OFF• Lamp_TCL set brightness 0
• Lamp_TCL instproc switch { state } {• #...• }
• Lamp_TCL instproc show_status { } {• #...• }
Optical Networking Research GroupInformation Network Lab, USTC 14
NS: OTcl and C++ Combined
Static class LampClass:public TclClass{
public:LampClass::TclClass(“Lamp_TCL”) {}TclObject * create(int, const char * const *){ return (new Lamp_C( ));}
}class_Lamp;
Int Lamp_C::init( ){…bind(“brightness”,&brightness);…
}
Static class LampClass:public TclClass{
public:LampClass::TclClass(“Lamp_TCL”) {}TclObject * create(int, const char * const *){ return (new Lamp_C( ));}
}class_Lamp;
Int Lamp_C::init( ){…bind(“brightness”,&brightness);…
}
int Lamp_C::command(int ac, const char*const* av){
if (strcmp(av[1], “brighten") == 0){
int step = atoi(av[2]);
brighten(step);
return TCL_OK;
}
if (strcmp(av[1], “darken”) == 0) {
int step = atoi(av[2]);
darken(step);
return TCL_OK;
}
return TclObject::command(ac,av);
}
int Lamp_C::command(int ac, const char*const* av){
if (strcmp(av[1], “brighten") == 0){
int step = atoi(av[2]);
brighten(step);
return TCL_OK;
}
if (strcmp(av[1], “darken”) == 0) {
int step = atoi(av[2]);
darken(step);
return TCL_OK;
}
return TclObject::command(ac,av);
}
Optical Networking Research GroupInformation Network Lab, USTC 15
NS: OTcl and C++ Combined
if (strcmp(av[1], “darken”) == 0) {
int step = atoi(av[2]);
Tcl & tcl = Tcl::instance();
char cmd[50],ret[10];
sprintf(cmd, “%s switch”, name());
tcl.eval(cmd);
if(strcmp(tcl.result(), “OFF”)){
return TCL_OK;
}
darken(step);
return TCL_OK;
}
if (strcmp(av[1], “darken”) == 0) {
int step = atoi(av[2]);
Tcl & tcl = Tcl::instance();
char cmd[50],ret[10];
sprintf(cmd, “%s switch”, name());
tcl.eval(cmd);
if(strcmp(tcl.result(), “OFF”)){
return TCL_OK;
}
darken(step);
return TCL_OK;
}
Optical Networking Research GroupInformation Network Lab, USTC 16
NS: OTcl and C++ Combined
C:\NetSim\ns-2.1b8a-win\ns↲ %%set mylamp [new Lamp_TCL]% $mylamp show_status% $mylamp switch ON% $mylamp brighten 100% $mylamp show_status%
Result:Current status is :OFFCurrent brightness is : 0Current status is :ONCurrent brightness is : 32
C:\NetSim\ns-2.1b8a-win\ns↲ %%set mylamp [new Lamp_TCL]% $mylamp show_status% $mylamp switch ON% $mylamp brighten 100% $mylamp show_status%
Result:Current status is :OFFCurrent brightness is : 0Current status is :ONCurrent brightness is : 32
Use OTcl –magic of manipulating:
Configuration, setup and one-time stuff
Manipulating existing C++ objects
Use C++ –power of Computing:
Packet processing
Computational complex jobs
Anything you like !
Optical Networking Research GroupInformation Network Lab, USTC 17
Lamp Conclusion
Interfaces:switch, show_status, brighten, darkenbrighten, darken
Member variablesstatusbrightness, voltage, current, resistance
Implementation C++/OTcl OTcl Invocation in C++ : tcl.eval(...), tcl.result(...); C++ Invocation in OTcl : Lamp::command(...); Variable binding: bind(...);
Optical Networking Research GroupInformation Network Lab, USTC 18
Packet Handling in NS:From A Protocol’s Perspective
int RWAAgent::command(int argc, const char * const * argv){
…
if (strcmp(argv[1],”get-connect-request”) = = 0){
Packet *pkt = allocpkt();
hdr_rwa *hdrrwa = hdr_rwa::access(pkt);
hdrrwa->msg_type = CONNECTION_REQUEST;
…
send(pkt,0);
}
…
}
int RWAAgent::command(int argc, const char * const * argv){
…
if (strcmp(argv[1],”get-connect-request”) = = 0){
Packet *pkt = allocpkt();
hdr_rwa *hdrrwa = hdr_rwa::access(pkt);
hdrrwa->msg_type = CONNECTION_REQUEST;
…
send(pkt,0);
}
…
}
>>>
Optical Networking Research GroupInformation Network Lab, USTC 19
Packet Handling in NS:From A Protocol’s Perspective
void RWAAgent::recv(Packet* pkt, Handler*){hdr_rwa *hdrrwa = hdr_rwa::access(pkt);int msgtype = hdrrwa->msg_type; …switch (msgtype){
case CONNECTION_REQUEST://process this packet…break;…
}Packet::free(pkt);
}
void RWAAgent::recv(Packet* pkt, Handler*){hdr_rwa *hdrrwa = hdr_rwa::access(pkt);int msgtype = hdrrwa->msg_type; …switch (msgtype){
case CONNECTION_REQUEST://process this packet…break;…
}Packet::free(pkt);
}
Optical Networking Research GroupInformation Network Lab, USTC 20
Build in NS a platform for RWA Simulation
Extensions to Class SimulatorExtensions to Class NodeRWA Agents new!
Connection Request Generator new!
Optical Networking Research GroupInformation Network Lab, USTC 21
Network Model
OXC
OXC
OXC
OXC
OXC
OXC
OXC
Connecti onrequest
Client Network A
Client Network B
Client Network CClient Network D
Optical Networking Research GroupInformation Network Lab, USTC 22
Components
DWDM Node Interfaces , Fibers, Wavelengths Wavelength Converter
RWA Agent Simple Signaling(Connection Setup/Teardown) Routing (Fixed, Explicit Routing)
Connection Request Generator Arrival Rate Hold Time
Optical Networking Research GroupInformation Network Lab, USTC 23
Architectural OverviewSimulator
DWDM Node
RWA Agent
node_ Traffic Generator peer_node_
Link 1 ... Link MLink 2 Link 3
Agent 1(default)
...Agent 2 Agent 3 Agent x
Node1 Node2 Node3 ... NodeNLinked_DWDM_nodes_
Linked_interfaces_
Linked_RWA_Agents_
Optical Networking Research GroupInformation Network Lab, USTC 24
Architectural Overview
RWA Agent
DWDM Node Edge Node Transit Node
Connect Request Generator
Edge Node
RWA Peer
Optical Networking Research GroupInformation Network Lab, USTC 25
Internals of Connection Request Generator
Descriptions Base Class: TrafficGenerator Functionality: generating connection request
Hold time … Destination node… Wavelength change allowed ? “$agent get-connect-request $ht $dst $change_allow”
Configurable Parameters: Mean arrival rate Mean hold time
Optical Networking Research GroupInformation Network Lab, USTC 26
Internals of RWA Agent
Descriptions: Base Class: Agent Functionality:
Packet processing Connection request/setup/release Route lookups Change node status
A list of timers Connection timeouts …
Optical Networking Research GroupInformation Network Lab, USTC 27
Internals of RWA Agent
OTcl part Route lookups Interfacing with Node
C++ Part Receiving/processing/sending packets Connection timeouts
Optical Networking Research GroupInformation Network Lab, USTC 28
Structure of A RWA Packet
struct hdr_rwa{int src, dst;int sid;int msg_type;int fid, lambda;char er[MAX_HOPS*5];int rtptr;…
}
struct hdr_rwa{int src, dst;int sid;int msg_type;int fid, lambda;char er[MAX_HOPS*5];int rtptr;…
}
Message Types:
•CONNECTION_REQUEST_MSG
•CONNECTION_RELEASE_MSG
•CONNECTION_CONFIRM_MSG
•CONNECTION_BLOCKED_MSG
•EXPLICIT_ROUTE_MSG
Global Session ID:NODEID * CONST + local_sid …
Message Processing In RWA Agentsrecv( )
msg_type?EXPLICIT_ROUTE_REQUEST_MSG
CONNECTION_REQUEST_MSG
CONNECTION_RELEASE_MSG
1.Find Next Hop2.Find IncomingInterface index
DestinationReached?
Setup ConnectionEntry on node,
Successful?
Find upstream RWA peer
Send ConfirmMessage Upstrean
Send BlockedMessage Upstrean
return return
Find OutgoingInterface index
Lock Resource,Successful?
Send Blocked Message Upstrean
return
Send Request MessageDownstream
return
... ...
Find upstreamRWA peer
Find downstreamRWA peer
YES NO
YES NOYES
NO
Agent C++
Agent OTcl
Node
Optical Networking Research GroupInformation Network Lab, USTC 30
Finding RWA Peers
Node/DWDM instproc get-rwa-agent {peer_node} {$self instvar linked_rwa_agents_set na [llength $linked_rwa_agents_]
for {set i 0} {$i < $na } {incr i} {set rwa_agent [lindex $linked_rwa_agents_ $i]if {[$rwa_agent set peer_node_] == $peer_node} {
return $rwa_agent}
}return -1
}
Node/DWDM instproc get-rwa-agent {peer_node} {$self instvar linked_rwa_agents_set na [llength $linked_rwa_agents_]
for {set i 0} {$i < $na } {incr i} {set rwa_agent [lindex $linked_rwa_agents_ $i]if {[$rwa_agent set peer_node_] == $peer_node} {
return $rwa_agent}
}return -1
}
Optical Networking Research GroupInformation Network Lab, USTC 31
Internals of DWDM Node
Descriptions Base class: Node Functionality
Management of physical resources Data structures
Lambda_table Converter_table ER_routing_table Connection_table
Optical Networking Research GroupInformation Network Lab, USTC 32
Internals of DWDM Node
OTcl part Attaching RWA agents/Traffic generator Interfacing with RWA Physical interface mapping (objectindex)
C++ Part A Lambda table /converter table /connection table Connection query interface Nodal statistics Static Routes
Optical Networking Research GroupInformation Network Lab, USTC 33
Connection Table Structure
struct connect_struct{
short src, dst;
int global_sid_;
short in_lambda, out_lambda;
short in_inf, out_inf;
short in_fid, out_fid;
short prevhop;
int holdtime;
int er_entry;
entry_status status;
};
struct connect_struct{
short src, dst;
int global_sid_;
short in_lambda, out_lambda;
short in_inf, out_inf;
short in_fid, out_fid;
short prevhop;
int holdtime;
int er_entry;
entry_status status;
};
BUSY
BUSY 100012 ...
BUSY 700001 ...
FREE - ...
1
2
3
.....
FREE - ...N-1
300083 ...N
# status sid other
sid = NODEID * CONST + local_sid
[Prefix] [local]
[Globally Unique]
sid = NODEID * CONST + local_sid
[Prefix] [local]
[Globally Unique]
new-connection(from RWA Agent)
Allocate a lambdaSuccessful?
Generate sid
Lock wavelength
Lock connectiontable entry
returnsid,lambda,fid
return -1
Confirm-setup(from RWA Agent)
Find ConnectionEntry by sid
ConfigureWavelength TableConverter Table
return
NO
YES
Agent OTcl
Node C++
Connection Initiation and confirmation on Nodes
Connection Request Processing on Nodesnew-request
(from RWA Agent)
Lock incomingwavelength,Successful?
Lock outgoingwavelength,Successful?
Conversion allow?
return -1
Lock ConnectionTable Entry
Lock Converter,Successful?
Unlock incomingwavelength
return -1returnout fid,
out wavelength
NO
YES
YES
NO
NO
YES
YES NO
Agent OTcl
Node C++
Optical Networking Research GroupInformation Network Lab, USTC 36
To Start Simulation…
Create Network Topology• Create DWDM Nodes• Build Links between Nodes
Configure RWA Agents on every nodeInstall Traffic Generator on Edge Nodes
Configure Traffic Generators
Install Static Routes On Edge NodesStart Traffic and do an “$ns run”