www.pudn.com > 802.16jModule.rar > l2handover.tcl


# Script showing a layer 2 handover in 802.16
# @author rouil
# Scenario: Communication between MN and Sink Node with MN attached to BS.
# Notes:- In order to perform layer 2 handover, the BSs must share the same channel
#       - Additional mechanisms are required in order to continue a communication after a layer 2 handover
#         This is achieved by updating the MN address to simulate layer 3 handovers and traffic redirection.
#         We will provide the code as part of our implementation of IEEE 802.21.
#
# @version 1.1 12-26-06 : added support for handover on link going down

#
# Topology scenario:
#
#
#	        |-----|          
#	        | MN0 |                 ; 1.0.1 
#	        |-----|        
#
#
#		  (^)                         (^)
#		   |                           |
#	    |--------------|            |--------------|
#           | Base Station | ; 1.0.0    | Base Station |
#           |--------------|            |--------------|
#	    	   |                           |
#	    	   |                           |
#	     |-----------|                     |
#            | Sink node |---------------------| 		
#            |-----------|  ; 0.0.0
#
#
# Explanations of scenario/information to follow the code:
# 1- Upon link going down (i.e power level decreased and crossed a
# threshold), the MS sends a scan request to its serving BS 

# 2- when the WimaxCtrlAgent located in the BS receives the scan
# request, it needs to respond to the SS. In case of no association or
# association without coordination, the BS handles the request locally
# and can respond right away. When there is coordination with other
# neighboring BSs, it cannot do that since it has to consult these
# BSs. That's why the code is commented in case 2, but you will see
# that it is sending synchronization request to the neighbor BSs. Case
# 3 as not been implemented.

# 3- When the MS receives the response, there is a delay as defined in the
# standard (note that the scanning does not start but it is set to
# PENDING). Also it checks for Association with coordination. If there
# is coordination, there are rendez-vous time that were defined by the
# serving BS (in the WimaxCtrlAgent) and we need to schedule timers so
# that we switch to the right channel at the right time.  
# After few frames the scanning will start then a serie of
# start/pause/resume/stop scanning depending on the number of scan
# iterations.

# 4- Handover: SS will send MSHO-REQ message to the serving BS:
# message type = MAC_MOB_MSHO_REQ. The data includes, id and mean RSSI
# of current serving BS; id and mean RSSI of neighbor BSs that where
# detected during scanning. The serving BS will response with MSHO-RSP
# to the SS: message type =MAC_MOB_BSHO_RSP, with a recommended target
# BS (the one with the strongest RSSI).

# 5- SS receives the response from serving BS and starts to HO
# with the recommended BS. If the recommended BS is
# different from the current serving BS, it will send a message to
# serving BS. 

#check input parameters
if {$argc != 0} {
	puts ""
	puts "Wrong Number of Arguments! No arguments in this topology"
	puts ""
	exit 
}

# set global variables
set output_dir .
set traffic_start 5
set traffic_stop  15
set simulation_stop 60

#define debug values
Mac/802_16 set debug_ 0
Mac/802_16 set print_stats_ 0
Mac/802_16 set t21_timeout_          20
#Fix: instead of using the send-scan manually, use a link going down trigger
Mac/802_16 set lgd_factor_        1.8 ;#note: the higher the value the earlier the trigger
Mac/802_16 set client_timeout_ 60 ;#to avoid BS disconnecting the SS
Agent/WimaxCtrl set adv_interval_ 1.0
Agent/WimaxCtrl set default_association_level_ 0
Agent/WimaxCtrl set synch_frame_delay_ 0.5
Agent/WimaxCtrl set debug_ 1

#define coverage area for base station: 20m coverage
Phy/WirelessPhy set Pt_ 0.025
Phy/WirelessPhy set RXThresh_ 2.90781e-09
Phy/WirelessPhy set CSThresh_ [expr 0.9 *[Phy/WirelessPhy set RXThresh_]]

# Parameter for wireless nodes
set opt(chan)           Channel/WirelessChannel    ;# channel type
set opt(prop)           Propagation/TwoRayGround   ;# radio-propagation model
set opt(netif)          Phy/WirelessPhy/OFDM       ;# network interface type
set opt(mac)            Mac/802_16                 ;# MAC type
set opt(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
set opt(ll)             LL                         ;# link layer type
set opt(ant)            Antenna/OmniAntenna        ;# antenna model
set opt(ifqlen)         50              	   ;# max packet in ifq
set opt(adhocRouting)   DSDV                       ;# routing protocol

set opt(x)		670			   ;# X dimension of the topography
set opt(y)		670			   ;# Y dimension of the topography

#defines function for flushing and closing files
proc finish {} {
        global ns tf output_dir nb_mn
        $ns flush-trace
        close $tf
	exit 0
}

#create the simulator
set ns [new Simulator]
$ns use-newtrace

#create the topography
set topo [new Topography]
$topo load_flatgrid $opt(x) $opt(y)

#open file for trace
set tf [open $output_dir/out.res w]
$ns trace-all $tf

# set up for hierarchical routing (needed for routing over a basestation)
$ns node-config -addressType hierarchical
AddrParams set domain_num_ 3          			;# domain number
lappend cluster_num 1 1 1           			;# cluster number for each domain 
AddrParams set cluster_num_ $cluster_num
lappend eilastlevel 1 2 2 ;# number of nodes for each cluster 
AddrParams set nodes_num_ $eilastlevel
puts "Configuration of hierarchical addressing done"

# Create God
create-god 3				;# nb_mn + 2 (base station and sink node)

#creates the sink node in first addressing space.
set sinkNode [$ns node 0.0.0]
puts "sink node created"

#create common channel
set channel [new $opt(chan)]

#creates the Access Point (Base station)
$ns node-config -adhocRouting $opt(adhocRouting) \
                 -llType $opt(ll) \
                 -macType Mac/802_16/BS \
                 -ifqType $opt(ifq) \
                 -ifqLen $opt(ifqlen) \
                 -antType $opt(ant) \
                 -propType $opt(prop)    \
                 -phyType $opt(netif) \
                 -channel $channel \
                 -topoInstance $topo \
                 -wiredRouting ON \
                 -agentTrace ON \
                 -routerTrace ON \
                 -macTrace ON  \
                 -movementTrace OFF
#puts "Configuration of base station"

set bstation [$ns node 1.0.0]  
$bstation random-motion 0
#provide some co-ord (fixed) to base station node
$bstation set X_ 50.0
$bstation set Y_ 50.0
$bstation set Z_ 0.0
[$bstation set mac_(0)] set-channel 0
#Fix: add MOB_SCN handler
set wimaxctrl [new Agent/WimaxCtrl]
$wimaxctrl set-mac [$bstation set mac_(0)]
$ns attach-agent $bstation $wimaxctrl
puts "Base Station 1 created"

set bstation2 [$ns node 2.0.0]  
$bstation2 random-motion 0
#provide some co-ord (fixed) to base station node
$bstation2 set X_ 65.0
$bstation2 set Y_ 50.0
$bstation2 set Z_ 0.0
[$bstation2 set mac_(0)] set-channel 1
#Fix: add MOB_SCN handler
set wimaxctrl2 [new Agent/WimaxCtrl]
$wimaxctrl2 set-mac [$bstation2 set mac_(0)]
$ns attach-agent $bstation2 $wimaxctrl2
puts "Base Station 2 created"

#Fix: Add neighbor information to the BSs
$wimaxctrl add-neighbor [$bstation2 set mac_(0)] $bstation2
$wimaxctrl2 add-neighbor [$bstation set mac_(0)] $bstation

# creation of the mobile nodes
$ns node-config -macType Mac/802_16/SS \
                -wiredRouting OFF \
                -macTrace ON  				;# Mobile nodes cannot do routing.

set wl_node [$ns node 1.0.1] 	;# create the node with given @.	
$wl_node random-motion 0			;# disable random motion
$wl_node base-station [AddrParams addr2id [$bstation node-addr]] ;#attach mn to basestation
$wl_node set X_ 45.0
$wl_node set Y_ 50.0
$wl_node set Z_ 0.0
$ns at 0.0 "$wl_node setdest 70.0 50.0 2.0"
[$wl_node set mac_(0)] set-channel 0
puts "wireless node created ..."			;# debug info

#create source traffic
#Create a UDP agent and attach it to node n0
set udp [new Agent/UDP]
$udp set packetSize_ 1500
$ns attach-agent $wl_node $udp

# Create a CBR traffic source and attach it to udp0
set cbr [new Application/Traffic/CBR]
$cbr set packetSize_ 1000
$cbr set interval_ 0.1
$cbr attach-agent $udp

#create an sink into the sink node

# Create the Null agent to sink traffic
set null [new Agent/Null] 
$ns attach-agent $sinkNode $null

# Attach the 2 agents
$ns connect $udp $null


# create the link between sink node and base station
$ns duplex-link $sinkNode $bstation 100Mb 1ms DropTail
#Fix: add missing link 
$ns duplex-link $sinkNode $bstation2 100Mb 1ms DropTail

# Traffic scenario: here the all start talking at the same time
$ns at $traffic_start "$cbr start"
$ns at $traffic_stop "$cbr stop"

$ns at $simulation_stop "finish"
puts "Running simulation"
$ns run
puts "Simulation done."