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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) Xerox Corporation 1997. All rights reserved.
  3. #
  4. # This program is free software; you can redistribute it and/or modify it
  5. # under the terms of the GNU General Public License as published by the
  6. # Free Software Foundation; either version 2 of the License, or (at your
  7. # option) any later version.
  8. # This program is distributed in the hope that it will be useful, but
  9. # WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. # General Public License for more details.
  12. # You should have received a copy of the GNU General Public License along
  13. # with this program; if not, write to the Free Software Foundation, Inc.,
  14. # 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  15. # Linking this file statically or dynamically with other modules is making
  16. # a combined work based on this file.  Thus, the terms and conditions of
  17. # the GNU General Public License cover the whole combination.
  18. # In addition, as a special exception, the copyright holders of this file
  19. # give you permission to combine this file with free software programs or
  20. # libraries that are released under the GNU LGPL and with code included in
  21. # the standard release of ns-2 under the Apache 2.0 license or under
  22. # otherwise-compatible licenses with advertising requirements (or modified
  23. # versions of such code, with unchanged license).  You may copy and
  24. # distribute such a system following the terms of the GNU GPL for this
  25. # file and the licenses of the other code concerned, provided that you
  26. # include the source code of that other code when and as the GNU GPL
  27. # requires distribution of source code.
  28. # Note that people who make modified versions of this file are not
  29. # obligated to grant this special exception for their modified versions;
  30. # it is their choice whether to do so.  The GNU General Public License
  31. # gives permission to release a modified version without this exception;
  32. # this exception also makes it possible to release a modified version
  33. # which carries forward this exception.
  34. #
  35. # updated to use -multicast on by Lloyd Wood
  36. proc uniform01 {} {
  37. return [expr double(([ns-random] % 10000000) + 1) / 1e7]
  38. }
  39. proc uniform { a b } {
  40. return [expr ($b - $a) * [uniform01] + $a]
  41. }
  42. proc exponential mean {
  43. return [expr - $mean * log([uniform01])]
  44. }
  45. proc trunc_exponential lambda {
  46. while 1 {
  47. set u [exponential $lambda]
  48. if { $u < [expr 4 * $lambda] } {
  49. return $u
  50. }
  51. }
  52. }
  53. set packetSize 1000
  54. set runtime 600
  55. set scenario 0
  56. set rlm_debug_flag 1
  57. set seed 1
  58. set rates "32e3 64e3 128e3 256e3 512e3 1024e3 2048e3"
  59. #set rates "32e3 64e3 128e3 256e3"
  60. set level [llength $rates]
  61. set proto rlm
  62. set run_nam 0
  63. #XXX
  64. Queue/DropTail set limit_ 15
  65. Simulator instproc create-agent { node type pktClass } {
  66. $self instvar Agents PortID 
  67. set agent [new $type]
  68. $agent set fid_ $pktClass
  69. $self attach-agent $node $agent
  70. $agent proc get var {
  71. return [$self set $var]
  72. }
  73. return $agent
  74. }
  75. Simulator instproc cbr_flow { node fid addr bw } {
  76. global packetSize
  77. set agent [$self create-agent $node Agent/UDP $fid]
  78. set cbr [new Application/Traffic/CBR]
  79. $cbr attach-agent $agent
  80. #XXX abstraction violation
  81. $agent set dst_addr_ $addr
  82. $agent set dst_port_ 0
  83. $cbr set packetSize_ $packetSize
  84. $cbr set interval_ [expr $packetSize * 8. / $bw]
  85. $cbr set random_ 1
  86. return $cbr
  87. }
  88. Simulator instproc build_source_set { mmgName rates addrs baseClass node when } {
  89. global src_mmg src_rate
  90. set n [llength $rates]
  91. for {set i 0} {$i<$n} {incr i} {
  92. set r [lindex $rates $i]
  93. set addr [expr [lindex $addrs $i]]
  94. set src_rate($addr) $r
  95. set k $mmgName:$i
  96. set src_mmg($k) [$self cbr_flow $node $baseClass $addr $r]
  97. $self at $when "$src_mmg($k) start"
  98. incr baseClass
  99. }
  100. }
  101. Simulator instproc finish {} {
  102. #XXX
  103. global rcvrMMG  proto scenario lossTraceFile debugfile run_nam
  104. puts finish
  105. #XXX
  106. #flush_all_trace
  107. if [info exists plots] {
  108. close $plots
  109. }
  110. #XXX
  111. if [info exists lossTraceFile] {
  112. close $lossTraceFile
  113. }
  114. if [info exists debugfile] {
  115. close $debugfile
  116. }
  117. if [info exists rcvrMMG] {
  118. set br [expr [total_bits $rcvrMMG] / 8.]
  119. set bd [total_bytes_delivered $rcvrMMG]
  120. puts "loss-frac [expr 1024. * [node_loss $rcvrMMG] / $bd] 
  121. goodput [expr $bd / [optimal_bytes]]"
  122. }
  123. if {$run_nam} {
  124. puts "running nam..."
  125. exec nam -g 600x700 -f dynamic-nam.conf out.nam &
  126. }
  127. exit 0
  128. }
  129. Simulator instproc tick {} {
  130. puts stderr [$self now]
  131. $self at [expr [$self now] + 30.] "$self tick"
  132. }
  133. Class Topology
  134. Topology instproc init { simulator } {
  135. $self instvar ns id
  136. set ns $simulator
  137. set id 0
  138. }
  139. Topology instproc mknode nn {
  140. $self instvar node ns
  141. if ![info exists node($nn)] {
  142. set node($nn) [$ns node]
  143. }
  144. }
  145. #
  146. # build a link between nodes $a and $b
  147. # if either node doesn't exist, create it as a side effect.
  148. # (we don't build any sources)
  149. #
  150. Topology instproc build_link { a b delay bw } {
  151. global buffers packetSize 
  152. if { $a == $b } {
  153. puts stderr "link from $a to $b?"
  154. exit 1
  155. }
  156. $self instvar node ns
  157. $self mknode $a
  158. $self mknode $b
  159. $ns duplex-link $node($a) $node($b) $bw $delay DropTail
  160. }
  161. #
  162. # build a new source (by allocating a new address) and
  163. # place it at node $nn.  start it up at random time 
  164. #
  165. Topology instproc place_source { nn when } {
  166. #XXX
  167. global rates 
  168. $self instvar node ns id addrs caddrs
  169. incr id
  170. set caddrs($id) [Node allocaddr]
  171. set addrs($id) {}
  172. foreach r $rates {
  173. lappend addrs($id) [Node allocaddr]
  174. }
  175. $ns build_source_set s$id $rates $addrs($id) 1 $node($nn) $when
  176. return $id
  177. }
  178. Topology instproc place_receiver { nn id when } {
  179. $self instvar ns
  180. $ns at $when "$self build_receiver $nn $id"
  181. }
  182. #
  183. # build a new receiver for source $id and
  184. # place it at node $nn.
  185. #
  186. Topology instproc build_receiver { nn id } {
  187. $self instvar node ns addrs caddrs
  188. set rcvr [new MMG/ns $ns $node($nn) $caddrs($id) $addrs($id)]
  189. global rlm_debug_flag
  190. $rcvr set debug_ $rlm_debug_flag
  191. }
  192. Class Scenario0 -superclass Topology
  193. Scenario0 instproc init args {
  194. #Create the following topology
  195. #             _____ R1
  196. #            /100kb
  197. #     1000kb/
  198. #   S------N1-------N2------R2
  199. #            1000kb   250kb
  200. #                     
  201.         #               1000kb 
  202. #                       N3____R3
  203. #                         50kb
  204. #
  205. eval $self next $args
  206. $self instvar ns node
  207. $self build_link 0 1 200ms  1000e3
  208. $self build_link 1 2 200ms  100e3
  209. $self build_link 1 3 200ms  1000e3
  210. $self build_link 3 4 200ms 250e3
  211. $self build_link 3 5 200ms 1000e3
  212. $self build_link 5 6 200ms 50e3
  213. $ns duplex-link-op $node(0) $node(1) orient right
  214. $ns duplex-link-op $node(1) $node(2) orient right
  215. $ns duplex-link-op $node(1) $node(3) orient right-down
  216. $ns duplex-link-op $node(3) $node(4) orient right
  217. $ns duplex-link-op $node(3) $node(5) orient  right-down
  218. $ns duplex-link-op $node(5) $node(6) orient  right
  219. $ns duplex-link-op $node(0) $node(1) queuePos 0.5
  220. $ns duplex-link-op $node(1) $node(2) queuePos 0.5
  221. $ns duplex-link-op $node(1) $node(3) queuePos 0.5
  222. $ns duplex-link-op $node(3) $node(4) queuePos 0.5
  223. $ns duplex-link-op $node(3) $node(5) queuePos 0.5
  224. $ns duplex-link-op $node(5) $node(6) queuePos 0.5
  225. set time [expr  double([ns-random] % 10000000) / 1e7 * 60]
  226. set addr [$self place_source 0 $time]
  227. $self place_receiver 2 $addr $time
  228. $self place_receiver 4 $addr $time
  229. $self place_receiver 6 $addr $time
  230. #mcast set up
  231. DM set PruneTimeout 1000
  232. set mproto DM
  233. set mrthandle [$ns mrtproto $mproto {} ]
  234. }
  235. Class Scenario1 -superclass Topology
  236. Scenario1 instproc init args {
  237. eval $self next $args
  238. $self instvar ns node
  239. $self build_link 0 1 200ms  100e3
  240. $ns duplex-link-op $node(0) $node(1) orient right
  241. $ns duplex-link-op $node(0) $node(1) queuePos 0.5
  242. set time [expr  double([ns-random] % 10000000) / 1e7 * 60]
  243. set id [$self place_source 0 $time]
  244. $self place_receiver 1 $id $time
  245. #mcast set up
  246. DM set PruneTimeout 1000
  247. set mproto DM
  248. set mrthandle [$ns mrtproto $mproto {} ]
  249. }
  250. foreach a $argv {
  251. set L [split $a =]
  252. if {[llength $L] != 2} { continue }
  253. set var [lindex $L 0]
  254. set val [lindex $L 1]
  255. set $var $val
  256. }
  257. #Clean up rectFile
  258. #rlm_init $rectFile $level $runtime  
  259. set ns [new Simulator -multicast on]
  260. #XXXX
  261. proc ns-now {} "return [$ns now]"
  262. $ns color 1 blue
  263. $ns color 2 green
  264. $ns color 3 red
  265. $ns color 4 white
  266. # prunes, grafts
  267. $ns color 30 orange
  268. $ns color 31 yellow
  269. $ns trace-all [open out.tr w]
  270. $ns namtrace-all [open out.nam w]
  271. set scn [new Scenario$scenario $ns]
  272. $ns at [expr $runtime +1] "$ns finish"
  273. $ns run