infrastruct_rate_adaptation.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 2007 Regents of the SIGNET lab, University of Padova.
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in the
  12. #    documentation and/or other materials provided with the distribution.
  13. # 3. Neither the name of the University of Padova (SIGNET lab) nor the 
  14. #    names of its contributors may be used to endorse or promote products 
  15. #    derived from this software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
  18. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
  19. # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  20. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  21. # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  22. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  23. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  24. # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  25. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  26. # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  27. # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. #
  29.  
  30. ########################################
  31. # Command-line parameters
  32. ########################################
  33. if {$argc == 0} {
  34.     # default parameters if none passed on the command line
  35.     set opt(nn) 5 
  36.     set opt(xdist) 100
  37.     set opt(raname) arf
  38.     set opt(run) 1
  39. } elseif {$argc != 4 } {
  40.     puts " invalid argc ($argc)"
  41.     puts " usage: $argv0 numnodes xdist RateAdapter replicationnumber"
  42.     exit
  43. } else {
  44.     set opt(nn)      [lindex $argv 0]       
  45.     set opt(xdist)   [lindex $argv 1]
  46.     set opt(raname)  [lindex $argv 2]
  47.     set opt(run)     [lindex $argv 3]
  48. }
  49. if { $opt(raname) == "snr" } {
  50.     set opt(ra) "SNR"
  51. } elseif { $opt(raname) == "arf" } {
  52.     set opt(ra) "ARF"    
  53. } else {
  54.     puts "unknown rate adaptation scheme "$opt(raname)""
  55.     exit
  56. ########################################
  57. # Scenario Configuration
  58. ########################################
  59. # duration of each transmission
  60. set opt(duration)     50
  61. # starting time of each transmission
  62. set opt(startmin)     1
  63. set opt(startmax)     1.20
  64. set opt(resultdir) "/tmp"
  65. set opt(tracedir) "/tmp"
  66. set machine_name [exec uname -n]
  67. set opt(fstr)        ${argv0}_${opt(nn)}_${opt(raname)}.${machine_name}
  68. set opt(resultfname) "${opt(resultdir)}/stats_${opt(fstr)}.log"
  69. set opt(tracefile)   "${opt(tracedir)}/${argv0}.tr"
  70. ########################################
  71. # Module Libraries
  72. ########################################
  73. # The following lines must be before loading libraries
  74. # and before instantiating the ns Simulator
  75. #
  76. remove-all-packet-headers
  77. set system_type [exec uname -s]
  78. if {[string match "CYGWIN*" "$system_type"] == 1} {
  79.     load ../src/.libs/cygdei80211mr-0.dll
  80. } else {
  81. #if {string match Linux* $system_type} 
  82.     load ../src/.libs/libdei80211mr.so
  83. ########################################
  84. # Simulator instance
  85. ########################################
  86. set ns [new Simulator]
  87. ########################################
  88. # Random Number Generators
  89. ########################################
  90. global defaultRNG
  91. set startrng [new RNG]
  92. set rvstart [new RandomVariable/Uniform]
  93. $rvstart set min_ $opt(startmin)
  94. $rvstart set max_ $opt(startmax)
  95. $rvstart use-rng $startrng
  96. # seed random number generator according to replication number
  97. for {set j 1} {$j < $opt(run)} {incr j} {
  98.     $defaultRNG next-substream
  99.     $startrng next-substream
  100. }
  101. ########################################
  102. # Some procedures 
  103. ########################################
  104. proc finish {} {
  105.     global ns tf opt 
  106.     puts "done!"
  107.     $ns flush-trace
  108.     close $tf
  109.     print_stats
  110.     $ns halt 
  111.     puts " "
  112.     puts "Tracefile     : $opt(tracefile)"
  113.     puts "Results file  : $opt(resultfname)"
  114.     
  115.     set title "node moving from 0m at [expr int($opt(startmoving))]s to $opt(xdist)m at [expr int($opt(endmoving))]s, [expr $opt(nn) - 1] interferers, $opt(ra) scheme"    
  116. }
  117. proc print_stats  {} {
  118.     global fh_cbr opt me_mac me_phy peerstats 
  119.     set resultsFilePtr [open $opt(resultfname) w]
  120.     #for {set id 1} {$id <= 1 } {incr id} 
  121.     for {set id 1} {$id <= $opt(nn) } {incr id}  {
  122. set snr [$me_mac($id) getAPSnr ]
  123. set peerstatsstr [$peerstats getPeerStats $id 0]
  124. set mestatsstr   [$me_mac($id) getMacCounters]
  125. set logstr "$opt(run) $opt(nn) $opt(duration) $id $snr  $mestatsstr $peerstatsstr "
  126. #puts $logstr
  127.   puts $resultsFilePtr $logstr
  128.     }
  129.     close $resultsFilePtr
  130. }
  131. Node/MobileNode instproc getIfq { param0} {
  132.     $self instvar ifq_    
  133.     return $ifq_($param0) 
  134. }
  135. Node/MobileNode instproc getPhy { param0} {
  136.     $self instvar netif_    
  137.     return $netif_($param0) 
  138. }
  139. ########################################
  140. # Override Default Module Configuration
  141. ########################################
  142. PeerStatsDB set VerboseCounters_ 1
  143. PeerStatsDB/Static set debug_ 0
  144. Mac/802_11/Multirate set VerboseCounters_ 1
  145. Mac/802_11 set RTSThreshold_ 50000
  146. Mac/802_11 set ShortRetryLimit_ 8
  147. Mac/802_11 set LongRetryLimit_  5
  148. Mac/802_11/Multirate set useShortPreamble_ true
  149. Mac/802_11/Multirate set gSyncInterval_ 0.000005
  150. Mac/802_11/Multirate set bSyncInterval_ 0.00001
  151. Mac/802_11 set CWMin_         32
  152. Mac/802_11 set CWMax_         1024
  153. Phy/WirelessPhy set Pt_ 0.01
  154. Phy/WirelessPhy set freq_ 2437e6
  155. Phy/WirelessPhy set L_ 1.0
  156. Queue/DropTail/PriQueue set Prefer_Routing_Protocols    1
  157. Queue/DropTail/PriQueue set size_ 10
  158. set noisePower 7e-11
  159. Phy/WirelessPhy set CSTresh_ [expr $noisePower * 1.1]
  160. Channel/WirelessChannel/PowerAware set distInterference_ 200
  161. ###############################
  162. # Global allocations
  163. ###############################
  164. set tf [open $opt(tracefile) w]
  165. $ns trace-all $tf
  166. set channel   [new Channel/WirelessChannel/PowerAware]
  167. set topo      [new Topography]
  168. $topo load_flatgrid [expr $opt(xdist) + 1] [expr $opt(xdist) + 1]
  169. set god       [create-god [expr $opt(nn) + 1]]
  170. set per       [new PER]
  171. $per set noise_ $noisePower
  172. $per loadPERTable80211gTrivellato
  173. set peerstats [new PeerStatsDB/Static]
  174. $peerstats numpeers [expr $opt(nn) + 1]
  175. ###############################
  176. # Node Configuration
  177. ###############################
  178. $ns node-config -adhocRouting DumbAgent 
  179.             -llType  LL    
  180.             -macType Mac/802_11/Multirate 
  181.             -ifqType Queue/DropTail/PriQueue 
  182.             -ifqLen 10 
  183.             -antType Antenna/OmniAntenna 
  184.             -propType Propagation/FreeSpace/PowerAware 
  185.     -phyType Phy/WirelessPhy/PowerAware 
  186.     -topoInstance $topo 
  187.     -agentTrace OFF 
  188.             -routerTrace OFF 
  189.     -macTrace ON 
  190.             -ifqTrace OFF 
  191.     -channel $channel
  192. #######################################
  193. #  Create Base Station (Access Point) #
  194. #######################################
  195. set bs_node        [$ns node]
  196. set bs_mac [$bs_node getMac 0]
  197. set bs_ifq [$bs_node getIfq 0]
  198. set bs_phy [$bs_node getPhy 0]
  199. $bs_mac nodes [expr $opt(nn) + 1]
  200. $bs_mac  basicMode_ Mode6Mb
  201. $bs_mac  dataMode_ Mode6Mb
  202. $bs_mac  per $per
  203. $bs_mac  PeerStatsDB $peerstats
  204. set bs_pp  [new PowerProfile]
  205. $bs_mac  powerProfile $bs_pp
  206. $bs_phy   powerProfile $bs_pp
  207. set bs_macaddr [$bs_mac id]
  208. $bs_mac     bss_id $bs_macaddr
  209. $bs_node random-motion 0
  210. $bs_node set X_ 0
  211. $bs_node set Y_ 0
  212. $bs_node set Z_ 0
  213. ###############################
  214. #  Create Mobile Equipments 
  215. ###############################
  216. for {set id 1} {$id <= $opt(nn)} {incr id} {
  217.     set me_node($id)   [$ns node]
  218.     set me_mac($id) [$me_node($id) getMac 0]
  219.     set me_ifq($id) [$me_node($id) getIfq 0]
  220.     set me_phy($id) [$me_node($id) getPhy 0]
  221.     
  222.     $me_mac($id) nodes [expr $opt(nn) + 1]
  223.     $me_mac($id)   basicMode_ Mode6Mb
  224.     $me_mac($id)   dataMode_ Mode54Mb
  225.     $me_mac($id)   per $per
  226.     $me_mac($id)   PeerStatsDB $peerstats
  227.     set me_pp($id)   [new PowerProfile]
  228.     $me_mac($id)   powerProfile $me_pp($id) 
  229.     $me_phy($id)    powerProfile $me_pp($id) 
  230.     $me_mac($id)  bss_id $bs_macaddr
  231.     $me_node($id) set X_ 0
  232.     $me_node($id) set Y_ 0
  233.     $me_node($id) set Z_ 0
  234.     $me_node($id) random-motion 0
  235.     # Create Protocol Stack 
  236.     set me_tran($id)   [new Agent/UDP]
  237.     $ns attach-agent   $me_node($id) $me_tran($id)
  238.     set me_cbr($id)    [new Application/Traffic/CBR]
  239.     $me_cbr($id)    attach-agent $me_tran($id)
  240.     # For each agent at the ME  we also need a corresponding one at the BS
  241.     set bs_tran($id)   [new Agent/Null]
  242.     $ns attach-agent $bs_node $bs_tran($id)
  243.     $ns connect $me_tran($id) $bs_tran($id) 
  244.     # setup socket connection between ME and BS
  245.     $ns connect $me_tran($id) $bs_tran($id) 
  246.     # schedule data transfer
  247.     set cbr_start($id) [$rvstart value]
  248.     set cbr_stop($id) [expr $cbr_start($id) + $opt(duration)]
  249.     # set traffic type
  250.     if {$id == 1} {
  251. # Test node (id==1) generates CBR traffic station using PHY rate adaptation
  252. $me_cbr($id) set packetSize_      1000
  253. $me_cbr($id) set rate_            1200000
  254. $me_cbr($id) set random_          0
  255.   set speed($id) [expr int ( ($opt(xdist) + 0.0) / ($opt(duration)/2.0) )]
  256.   puts "Speed of test node: $speed($id) m/s"
  257. set opt(startmoving) [expr $cbr_start($id) + $opt(duration) / 2.0]
  258. set opt(endmoving)   [expr $cbr_start($id) + $opt(duration) ]
  259.   $ns at $opt(startmoving) "$me_node($id) setdest $opt(xdist) 0.001 $speed($id)"
  260. set pktsize [expr [$me_cbr($id) set packetSize_] + 0.0]
  261. set me_ra($id) [new RateAdapter/$opt(ra)]
  262. if { $opt(ra) == "SNR" } {
  263.     $me_ra($id) set pktsize_ $pktsize
  264. $me_ra($id) attach2mac $me_mac($id)
  265. $me_ra($id) use80211g
  266. $me_ra($id) setmodeatindex 0
  267.     } else {
  268. # All other nodes (id!=1) are in saturation and use a fixed PHY rate
  269. # Saturated station
  270. $me_cbr($id) set packetSize_      1500
  271. $me_cbr($id) set rate_            [ expr 54000000 / ( $opt(nn) - 1) ]
  272. # These are needed to match Bianchi Model
  273. $me_mac($id) set ShortRetryLimit_ 100
  274. $me_mac($id) set LongRetryLimit_  100
  275.     }
  276.     $ns at $cbr_start($id)  "$me_cbr($id) start"
  277.     $ns at $cbr_stop($id)   "$me_cbr($id) stop"
  278. }
  279. ###############################
  280. #  Start Simulation
  281. ###############################
  282. puts -nonewline "Simulating"
  283. for {set i 1} {$i < 40} {incr i} {
  284.     $ns at [expr $opt(startmax) + (($opt(duration) * $i)/ 40.0) ] "puts -nonewline . ; flush stdout"
  285. }
  286. $ns at [expr $opt(startmax) + $opt(duration) + 5] "finish"
  287. $ns run