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

通讯编程

开发平台:

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. # Input Parameters #
  31. ####################
  32. if {$argc == 0} {
  33.     set numUserPairs 4 
  34.     set XMAX 10
  35.     set PHYDataRate Mode6Mb
  36.     set run 1
  37. } elseif {$argc < 4} {
  38.     puts ""
  39.     puts "USAGE:  ns $argv0  numUserPairs scenarioWidth  PHYDataRate replicationNumber"  
  40.     puts ""
  41.     puts "All parameters are numeric, except PHYDataRate which is a string in the form 'ModeXXMb',"
  42.     puts " with XX being one of the 802.11b/g phy modes (e.g., 'Mode1Mb, 'Mode5_5Mb', 'Mode18Mb', etc.)"
  43.     puts ""
  44.     exit 0
  45. } else {
  46.     set numUserPairs  [lindex $argv 0]
  47.     set XMAX [lindex $argv 1]
  48.     set PHYDataRate [lindex $argv 2]
  49.     set run [lindex $argv 3]
  50. }
  51. set ns [new Simulator]
  52. # sensing threshold in dB above noise power
  53. set sensingTreshdB 5
  54. #####################
  55. # End of Parameters #
  56. #####################
  57. set resultdir "/tmp"
  58. set tracedir "/tmp"
  59. set machine_name [exec uname -n]
  60. set system_type [exec uname -s]
  61. # Libraries have different names in some operating systems
  62. if {[string match "CYGWIN*" "$system_type"] == 1} {
  63.     load ../src/.libs/cygdei80211mr-0.dll
  64. } else {
  65.     load ../src/.libs/libdei80211mr.so
  66. set opt(chan)          Channel/WirelessChannel/PowerAware
  67. set opt(prop)          Propagation/FreeSpace/PowerAware
  68. set opt(netif)         Phy/WirelessPhy/PowerAware
  69. set opt(mac)           Mac/802_11/Multirate
  70. set opt(ifq)           Queue/DropTail/PriQueue
  71. set opt(ll)            LL
  72. set opt(ant)           Antenna/OmniAntenna
  73. set opt(ifqlen)        10
  74. set opt(seed)          0.0
  75. set opt(rp)            AODV
  76. set opt(x)             1000
  77. set opt(y)             1000
  78. set duration           10
  79. set opt(nn)            [expr 2 * $numUserPairs]  
  80. set fstr ${numUserPairs}_${XMAX}_${PHYDataRate}_${duration}s.${machine_name}
  81. set traceFilename "${tracedir}/trace_${fstr}.tr"
  82. set statsFilename       "${resultdir}/stats_${fstr}.log"
  83. LL set mindelay_ 1us
  84. LL set delay_ 1us
  85. LL set bandwidth_ 0 ;# not used
  86. Node/MobileNode instproc getIfq { param0} {
  87.     $self instvar ifq_    
  88.     return $ifq_($param0) 
  89. }
  90. Node/MobileNode instproc getPhy { param0} {
  91.     $self instvar netif_    
  92.     return $netif_($param0) 
  93. }
  94. set noisePower 7e-11
  95. set per [new PER]
  96. $per loadPERTable80211gTrivellato
  97. $per set noise_ $noisePower
  98. set opt(CSThresh) [expr $noisePower *  pow ( 10 , $sensingTreshdB / 10.0 ) ]
  99. set opt(AffectThresh) [expr $noisePower ]
  100. Phy/WirelessPhy set Pt_ 0.01
  101. Phy/WirelessPhy set freq_ 2437e6
  102. Phy/WirelessPhy set L_ 1.0
  103. Mac/802_11 set bSyncInterval_ 20e-6
  104. Mac/802_11 set gSyncInterval_ 10e-6
  105. Mac/802_11 set ShortRetryLimit_ 3
  106. Mac/802_11 set LongRetryLimit_ 5
  107. Mac/802_11/Multirate set RTSThreshold_ 100000
  108. Mac/802_11/Multirate set dump_interf_ 0
  109. $per set debug_ 0
  110. PowerProfile set debug_ 0
  111. Phy/WirelessPhy set debug_ 0
  112. Mac/802_11/Multirate set debug_ 0
  113. Phy/WirelessPhy set CSThresh_ $opt(CSThresh)
  114. set chan_               [new $opt(chan)]
  115. set topo                [new Topography]
  116. set traceFilePtr        [open  $traceFilename w]
  117. set startrng [new RNG]
  118. set positionrng [new RNG]
  119. if {$run > 1 } {
  120.     puts "replication number: $run"
  121.     for {set j 1} {$j < $run} {incr j} {
  122. $startrng next-substream
  123. $positionrng next-substream
  124.     }
  125. }
  126. set startinterval [expr $opt(nn) * 0.02]
  127. set minstarttime 1
  128. set rvstart [new RandomVariable/Uniform]
  129. $rvstart set min_ $minstarttime
  130. $rvstart set max_ [expr $minstarttime + $startinterval]
  131. $rvstart use-rng $startrng
  132. set rvposition [new RandomVariable/Uniform]
  133. $rvposition set min_ 0
  134. $rvposition set max_ $XMAX
  135. $rvposition use-rng $positionrng
  136. $ns trace-all $traceFilePtr
  137. $topo load_flatgrid $opt(x) $opt(y)
  138. set god_ [create-god [expr $opt(nn)] ]
  139. $ns node-config -adhocRouting $opt(rp) 
  140.             -llType $opt(ll) 
  141.             -macType $opt(mac) 
  142.             -ifqType $opt(ifq) 
  143.             -ifqLen $opt(ifqlen) 
  144.             -antType $opt(ant) 
  145.             -propType $opt(prop) 
  146.     -phyType $opt(netif) 
  147.     -topoInstance $topo 
  148.     -agentTrace OFF 
  149.             -routerTrace OFF 
  150.     -macTrace ON 
  151.             -ifqTrace OFF 
  152.     -channel $chan_
  153. # Creating nodes
  154. for {set i 0} {$i < [expr $opt(nn)]} {incr i} {
  155.     set n($i)  [$ns node]
  156.     
  157.     #   This is replaced below by '$mac_ nodes'
  158.     # $n($i) initMultirateWifi 0 
  159.     $n($i) setPowerProfile 0 [new PowerProfile]
  160.     set mac($i) [$n($i) getMac 0]
  161.     set ifq($i) [$n($i) getIfq 0]
  162.     set phy($i) [$n($i) getPhy 0]
  163.     $mac($i) dataMode_ $PHYDataRate
  164.     $mac($i) basicMode_ Mode6Mb
  165.     $mac($i) nodes $opt(nn)
  166.     $phy($i) set CSTresh_ $opt(CSThresh) 
  167.     $n($i) setPER 0 $per
  168.     $n($i) random-motion 0
  169. }
  170. for {set i 0} {$i < $opt(nn)} {incr i} {
  171.     $n($i) set X_ [$rvposition value]
  172.     $n($i) set Y_ [$rvposition value]
  173.     $n($i) set Z_ 0
  174.     # output to screen
  175.     set xstr [format "%7.4f" [$n($i) set X_]]
  176.     set ystr [format "%7.4f" [$n($i) set Y_]]
  177.     puts " node $i is at   X = $xstr   Y = $ystr "
  178. }
  179. # configuring agents for all nodes
  180. for {set i 0} {$i < $numUserPairs } {incr i} {
  181.     # node $i is the TCP source
  182.     set tcp($i)     [new Agent/TCP/Reno ]
  183.     $tcp($i) set fid_ $i
  184.     $ns attach-agent $n($i) $tcp($i)
  185.     set ftp($i) [new Application/FTP]
  186.     $ftp($i) attach-agent $tcp($i)
  187.     # node $i + $numUserPairs is the other peer
  188.     set j [expr $numUserPairs + $i ]
  189.     set partner($i) $j
  190.     set partner($j) $i
  191.     set tcpsink($j) [new Agent/TCPSink]
  192.     $ns attach-agent $n($j) $tcpsink($j)
  193.     
  194.     $ns connect $tcp($i) $tcpsink($j)
  195.     set starttime($i) [$rvstart value ]
  196.     set stoptime($i) [expr $starttime($i) + $duration]
  197.     $ns at  $starttime($i)  "$ftp($i) start"
  198.     $ns at  $stoptime($i)  "$ftp($i) stop"
  199. }
  200. proc stats {} {
  201.     global ns n opt statsFilename satagent numUserPairs sensingTreshdB starttime stoptime mac partner run 
  202.     global XMAX duration PHYDataRate tcp 
  203.     puts "printing stats"
  204.     set statsFilePtr  [open  $statsFilename a]
  205.     for {set i 0} {$i < $numUserPairs} {incr i} {
  206. set thrtcp [ expr [ $tcp($i) set ack_  ] * [$tcp($i) set packetSize_] *8 / [expr  $stoptime($i) - $starttime($i)] ]
  207. set j $partner($i)
  208. set outputstr " TCP throughput node $i --> node $j : $thrtcp bps" 
  209. puts $statsFilePtr ${outputstr}
  210. puts ${outputstr}
  211.     }
  212.     close  $statsFilePtr
  213.     puts ""
  214.     puts "statsfile: $statsFilename"
  215.     
  216. }
  217. proc finish {} {
  218.     global ns opt traceFilePtr traceFilename
  219.     stats
  220.     $ns flush-trace
  221.     close $traceFilePtr
  222.     for {set i 1} {$i < $opt(nn)} {incr i} {
  223.     }
  224.     puts ""
  225.     puts "Tracefile: $traceFilename"
  226.     puts ""
  227.     exit 0
  228. }
  229. # This is  just to fake wireless channel into considering more nodes
  230. # $ns at 0 "$phy(1) set CSThresh_ $opt(AffectThresh)"
  231. # $ns at 0.0001 "$satagent(1) ping"
  232. # $ns at 0.001 "$phy(1) set CSThresh_ $opt(CSThresh)"
  233. $ns at [expr $duration + 2 + $numUserPairs] "finish"
  234. flush stdout
  235. $ns run