AOMDV is a multi-path extension of the well-known Ad hoc On Distance Vector (AODV) protocol.
Here i have given a tcl code for creation of MANET using AOMDV as a routing protocol.
#------------------------------------------------------------------------------
# Marco Fiore's Patch
# ------------------------------------------------------------------------------
#remove-all-packet-headers ;# removes all except common
#add-packet-header IP LL Mac AODV AOMDV ATR DSDV DSR OLSR UDP TCP CBR FTP ;# needed headers
Mac/802_11 set CWMin_ 31
Mac/802_11 set CWMax_ 1023
Mac/802_11 set SlotTime_ 0.000020 ;# 20us
Mac/802_11 set SIFS_ 0.000010 ;# 10us
Mac/802_11 set PreambleLength_ 144 ;# 144 bit
Mac/802_11 set ShortPreambleLength_ 72 ;# 72 bit
Mac/802_11 set PreambleDataRate_ 1.0e6 ;# 1Mbps
Mac/802_11 set PLCPHeaderLength_ 48 ;# 48 bits
Mac/802_11 set PLCPDataRate_ 1.0e6 ;# 1Mbps
Mac/802_11 set ShortPLCPDataRate_ 2.0e6 ;# 2Mbps
Mac/802_11 set RTSThreshold_ 3000 ;# bytes
Mac/802_11 set ShortRetryLimit_ 7 ;# retransmissions
Mac/802_11 set LongRetryLimit_ 4 ;# retransmissions
Mac/802_11 set newchipset_ false ;# use new chipset, allowing a more recent packet to be correctly received in place of the first sensed packet
Mac/802_11 set dataRate_ 11Mb ;# 802.11 data transmission rate
Mac/802_11 set basicRate_ 1Mb ;# 802.11 basic transmission rate
Mac/802_11 set aarf_ false ;# 802.11 Auto Rate Fallback
#------------------------------------------------------------------------------
# Defining options
# ------------------------------------------------------------------------------
set val(chan) Channel/WirelessChannel ;# channel type
set val(ant) Antenna/OmniAntenna ;# antenna type
set val(propagation) Shado ;# propagation model
set val(netif) Phy/WirelessPhy ;# network interface type
set val(ll) LL ;# link layer type
set val(ifq) Queue/DropTail/PriQueue ;# interface queue type
set val(ifqlen) 50 ;# max packet in ifq
set val(mac) Mac/802_11 ;# MAC type
set val(rp) AOMDV ;# routing protocol
set val(n) 16.0 ;# node number
set val(density) 4096 ;# node density [node/km^2]
set val(end) 2060.0 ;# simulation time [s]
set val(mobility) Static ;# mobility model
set val(minSpeed) 0.5 ;# movement minimum speed [m/s]
set val(maxSpeed) 1.5 ;# movement maximum speed [m/s]
set val(minPause) 0.0 ;# movement minimum pause time [s]
set val(maxPause) 0.0 ;# movement maximum pause time [s]
set val(movementStart) 950.0 ;# movement start time [s]
set val(traffic) Node-UDP ;# data pattern
set val(dataStart) 1000.0 ;# data start time [s]
set val(dataStop) [expr $val(end) - 60.0] ;# data stop time [s]
set val(seed) 1 ;# general pseudo-random sequence generator
set val(macFailed) true ;# ATR protocol: ns2 MAC failed callback
set val(etxMetric) true ;# ATR protocol: ETX route metric
set val(throughput) 5.4 ;# CBR rate (<= 5.4Mb/s)
set val(flow) 100 ;# number of concurrent data flow for FLOW-**P data pattern
set val(nodes) $val(n) ;# number of concurrent transmitting nodes for NODE-**P data pattern
# ------------------------------------------------------------------------------
# Fixing DSR bug
# ------------------------------------------------------------------------------
if {$val(rp) == "DSR"} {
set val(ifq) CMUPriQueue
}
# ------------------------------------------------------------------------------
# Channel model
# ------------------------------------------------------------------------------
Antenna/OmniAntenna set X_ 0
Antenna/OmniAntenna set Y_ 0
Antenna/OmniAntenna set Z_ 1.5
Antenna/OmniAntenna set Gt_ 1 ;# transmitter antenna gain
Antenna/OmniAntenna set Gr_ 1 ;# receiver antenna gain
Phy/WirelessPhy set L_ 1.0 ;# system loss factor (mostly 1.0)
if {$val(propagation) == "TwoRay"} { ;# range tx = 250m
set val(prop) Propagation/TwoRayGround
set prop [new $val(prop)]
Phy/WirelessPhy set CPThresh_ 10.0 ;# capture threshold in Watt
Phy/WirelessPhy set CSThresh_ 1.559e-11 ;# Carrier Sensing threshold
Phy/WirelessPhy set RXThresh_ 3.652e-10 ;# receiver signal threshold
Phy/WirelessPhy set freq_ 2.4e9 ;# channel frequency (Hz)
Phy/WirelessPhy set Pt_ 0.28 ;# transmitter signal power (Watt)
}
if {$val(propagation) == "Shado"} {
set val(prop) Propagation/Shadowing
set prop [new $val(prop)]
$prop set pathlossExp_ 3.8 ;# path loss exponent
$prop set std_db_ 2.0 ;# shadowing deviation (dB)
$prop set seed_ 1 ;# seed for RNG
$prop set dist0_ 1.0 ;# reference distance (m)
$prop set CPThresh_ 10.0 ;# capture threshold in Watt
$prop set RXThresh_ 2.37e-13 ;# receiver signal threshold
$prop set CSThresh_ [expr 2.37e-13 * 0.0427] ;# Carrier Sensing threshold
$prop set freq_ 2.4e9 ;# channel frequency (Hz)
Phy/WirelessPhy set Pt_ 0.28
}
# ------------------------------------------------------------------------------
# Topology definition
# ------------------------------------------------------------------------------
#Creazione dello scenario in funzione della densita' di nodo scelta
set val(dim) [expr $val(n) / $val(density)]
set val(x) [expr [expr sqrt($val(dim))] * 1000]
set val(y) [expr [expr sqrt($val(dim))] * 1000]
# ------------------------------------------------------------------------------
# Pseudo-random sequence generator
# ------------------------------------------------------------------------------
# General pseudo-random sequence generator
set genSeed [new RNG]
$genSeed seed $val(seed)
set randomSeed [new RandomVariable/Uniform]
$randomSeed use-rng $genSeed
$randomSeed set min_ 1.0
$randomSeed set max_ 100.0
# Mobility model: x node position [m]
set genNodeX [new RNG]
$genNodeX seed [expr [$randomSeed value]]
set randomNodeX [new RandomVariable/Uniform]
$randomNodeX use-rng $genNodeX
$randomNodeX set min_ 1.0
$randomNodeX set max_ [expr $val(x) - 1.0]
# Mobility model: y node position [m]
set posNodeY [new RNG]
$posNodeY seed [expr [$randomSeed value]]
set randomNodeY [new RandomVariable/Uniform]
$randomNodeY use-rng $posNodeY
$randomNodeY set min_ 1.0
$randomNodeY set max_ [expr $val(y) - 1.0]
# Mobility model: node speed [m/s]
set genNodeSpeed [new RNG]
$genNodeSpeed seed [expr [$randomSeed value]]
set randomNodeSpeed [new RandomVariable/Uniform]
$randomNodeSpeed use-rng $genNodeSpeed
$randomNodeSpeed set min_ $val(minSpeed)
$randomNodeSpeed set max_ $val(maxSpeed)
# Mobility model: node movement pause [s]
set genNodePause [new RNG]
$genNodePause seed [expr [$randomSeed value]]
set randomNodePause [new RandomVariable/Uniform]
$randomNodePause use-rng $genNodePause
$randomNodePause set min_ $val(minPause)
$randomNodePause set max_ $val(maxPause)
# Data pattern: node
set genNode [new RNG]
$genNode seed [expr [$randomSeed value]]
set randomNode [new RandomVariable/Uniform]
$randomNode use-rng $genNode
$randomNode set min_ 0
$randomNode set max_ [expr $val(n) - 1]
# Data pattern "Random": flow start time [s]
set genStartData [new RNG]
$genStartData seed [expr [$randomSeed value]]
set randomStartData [new RandomVariable/Uniform]
$randomStartData use-rng $genStartData
$randomStartData set min_ $val(dataStart)
$randomStartData set max_ $val(dataStop)
# Data pattern "Full: flow start time [s]
set genStartDataFull [new RNG]
$genStartDataFull seed [expr [$randomSeed value]]
set randomStartDataFull [new RandomVariable/Uniform]
$randomStartDataFull use-rng $genStartDataFull
$randomStartDataFull set min_ 0
$randomStartDataFull set max_ [expr ($val(n) * ($val(n) - 1)) - 1]
# Data pattern: flow end time [s]
set genEndData [new RNG]
$genEndData seed [expr [$randomSeed value]]
set randomEndData [new RandomVariable/Uniform]
$randomEndData use-rng $genEndData
$randomEndData set min_ 0.0
$randomEndData set max_ [expr $val(end) - $val(dataStart) - 20]
# ------------------------------------------------------------------------------
# General definition
# ------------------------------------------------------------------------------
;#Instantiate the simulator
set ns [new Simulator]
;#Define topology
set topo [new Topography]
$topo load_flatgrid $val(x) $val(y)
;#Create channel
set chan [new $val(chan)]
$prop topography $topo
;#Create God
create-god $val(n)
;#Global node setting
$ns node-config -adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(ant) \
-propInstance $prop \
-phyType $val(netif) \
-channel $chan \
-topoInstance $topo \
-agentTrace ON \
-routerTrace ON \
-macTrace OFF \
-movementTrace OFF
# ------------------------------------------------------------------------------
# Trace file definition
# ------------------------------------------------------------------------------
#New format for wireless traces
$ns use-newtrace
#Create trace object for ns, nam, monitor and Inspect
set nsTrc [open ns.trc w]
$ns trace-all $nsTrc
set namTrc [open nam.trc w]
$ns namtrace-all-wireless $namTrc $val(x) $val(y)
set scenarioTrc [open scenario.trc w]
proc fileTrace {} {
global ns nsTrc namTrc
global ns nsTrc scenarioTrc
$ns flush-trace
close $nsTrc
close $scenarioTrc
close $namTrc
exec nam nam.trc &
}
# ------------------------------------------------------------------------------
# Nodes definition
# ------------------------------------------------------------------------------
;# Create the specified number of nodes [$val(n)] and "attach" them to the channel.
for {set i 0} {$i < $val(n) } {incr i} {
set node($i) [$ns node]
$node($i) random-motion 0 ;# disable random motion
}
# ------------------------------------------------------------------------------
# Nodes mobility
# ------------------------------------------------------------------------------
#parameters for trace Inspect
puts $scenarioTrc "# nodes: $val(n), max time: $val(end)"
puts $scenarioTrc "# nominal range: 250"
if {$val(mobility) == "Static"} {
for {set i 0} {$i < $val(n)} {incr i} {
set X [expr [$randomNodeX value] ]
$node($i) set X_ $X
set Y [expr [$randomNodeY value] ]
$node($i) set Y_ $Y
$node($i) set Z_ 0.0
$ns initial_node_pos $node($i) 20
puts $scenarioTrc "\$node_($i) set X_ $X"
puts $scenarioTrc "\$node_($i) set Y_ $Y"
puts $scenarioTrc "\$node_($i) set Z_ 0.0"
}
}
# ------------------------------------------------------------------------------
# Data load
# ------------------------------------------------------------------------------
if {$val(traffic) == "Node-UDP"} {
for {set i 0} {$i < $val(nodes)} {incr i} {
set udp($i) [new Agent/UDP]
$ns attach-agent $node($i) $udp($i)
set dest [expr round([$randomNode value])]
while {$dest == $i} {
set dest [expr round([$randomNode value])]
}
set monitor($dest) [new Agent/LossMonitor]
$ns attach-agent $node($dest) $monitor($dest)
$ns connect $udp($i) $monitor($dest)
set cbr($i) [new Application/Traffic/CBR]
$cbr($i) attach-agent $udp($i)
$cbr($i) set packetSize_ 1000
$cbr($i) set random_ false
$cbr($i) set rate_ [expr $val(throughput) / [expr $val(n) * sqrt($val(n))]]Mb
# $cbr($i) set rate_ [expr $val(throughput)]Mb
$ns at [expr $val(dataStart) + [$randomSeed value]] "$cbr($i) start"
$ns at $val(dataStop) "$cbr($i) stop"
# $ns at [expr [$randomStartData value]] "$cbr($i) start"
# set endData [expr [$randomStartData value] + [$randomEndData value]]
# if {$endData > $val(dataStop)} {
# set endData $val(dataStop)
# }
# $ns at $endData "$cbr($i) stop"
}
}
# ------------------------------------------------------------------------------
# Tracing
# ------------------------------------------------------------------------------
# printing simulation time
proc timeTrace { tracePause} {
global ns
set now [$ns now]
$ns at [expr $now + $tracePause] "timeTrace $tracePause"
puts "$now simulation seconds"
}
$ns at 10.0 "timeTrace 10.0"
#$ns at 500 "[$node(0) agent 255] storeInfo id1 tex#t1"
#$ns at 500 "[$node(0) agent 255] storeInfo id2 text2"
#$ns at 520 "[$node(0) agent 255] requestInfo id1"
# ------------------------------------------------------------------------------
# Starting & ending
# ------------------------------------------------------------------------------
for {set i 0} {$i < $val(n) } {incr i} {
$ns at $val(end) "$node($i) reset";
}
$ns at $val(end) "fileTrace"
$ns at $val(end) "$ns halt"
$ns run
the output of the above code is,