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

通讯编程

开发平台:

Visual C++

  1. Class ScenLib/RM
  2. proc usage {prog} {
  3. switch $prog {
  4. "rmcc-1" {
  5. puts stderr "usage: ns rmcc-1.tcl -test 1 
  6. <or 2 or 3 indicating the 
  7. testnum> [other options]
  8. See rmcc-1.tcl for description of each test
  9. conditionsn"
  10. exit 1
  11. }
  12. "rmcc-2" {
  13. puts stderr "usage: ns rmcc-2.tcl 
  14. [other options]"
  15. exit 1
  16. }
  17. "rmcc-3" {
  18. puts stderr "usage: ns rmcc-3.tcl 
  19. [other options]"
  20. exit 1
  21. }
  22. "rmcc-4" {
  23. puts stderr "usage: ns rmcc-4.tcl 
  24. [other options]"
  25. exit 1
  26. }
  27. }
  28. }
  29. proc default_options {prog} {
  30. # check here for other options that may be set for the diffrent
  31. # experiments
  32. global opts
  33. set opts(routingProto) CtrMcast
  34. set opts(srmSimType) SRM
  35. set opts(rmSrcType) CBR
  36. set opts(tcpSrcType) FTP
  37. set opts(pktSize) 1000
  38. switch $prog {
  39. rmcc-1 {
  40. set opts(test) -1
  41. set opts(tcpType) TCP
  42. set opts(sinkType) TCPSink
  43. }
  44. rmcc-2 {
  45. set opts(tcpType) TCP/Reno
  46. set opts(sinkType) TCPSink/DelAck
  47. set opts(bottleneckBW) 1Mbps
  48.     set opts(bottleneckDelay) 20ms
  49. set opts(bottleneckQSize) 60
  50. }
  51. rmcc-3 {
  52. set opts(tcpType) TCP
  53. set opts(sinkType) TCPSink
  54. set opts(bottleneckBW) 1Mbps
  55. set opts(bottleneckDelay) 20ms
  56. set opts(bottleneckQSize) 30
  57. }
  58. rmcc-4 {
  59. set opts(tcpType) TCP/Sack1
  60. set opts(sinkType) TCPSink/Sack1
  61. set opts(bottleneckDelay) 20ms
  62. set opts(clientNum) 10
  63. # other options 
  64. }
  65. }
  66. }
  67. proc process_args {argv } {
  68. global prog
  69. default_options $prog
  70. global opts
  71. for {set i 0} {$i < [llength $argv]} {incr i} {
  72. set key [lindex $argv $i]
  73. regsub {^-} $key {} key
  74. if {![info exists opts($key)]} {
  75. puts stderr "unknown option "$key""
  76. }
  77. incr i
  78. set opts($key) [lindex $argv $i]
  79. }
  80. }
  81. ScenLib/RM instproc set_traces {} {
  82. global prog opts ns srmStats srmEvents t
  83. $ns trace-all [open out-$t.tr w]
  84. $ns namtrace-all [open out-$t.nam w]
  85. #set srmStats [open srmStats-$t.tr w]
  86. #set srmEvents [open srmEvents-$t.tr w]
  87. }
  88. ScenLib/RM instproc init {} {
  89. $self instvar fid_
  90. set fid_ 0
  91. global prog opts ns n
  92. set ns [new Simulator]
  93. Simulator set EnableMcast_ 1
  94. Simulator set NumberInterfaces_ 1
  95. #Node expandaddr
  96. $ns color 0 white ;# data packets
  97. $ns color 40 blue ;# session
  98. $ns color 41 red ;# request
  99. $ns color 42 green         ;# repair
  100. $ns color 1 azure ;# source node
  101. $ns color 2 lavender        ;# recvr node
  102. $ns color 3 navy            ;# traffic
  103. $ns color 4 SeaGreen
  104. $ns color 5 green
  105. $ns color 6 DarkGreen
  106. $ns color 7 coral
  107. $ns color 8 OrangeRed
  108. $ns color 9 maroon
  109. $ns color 10 DarkBlue
  110. $self set_traces
  111. return $self
  112. }
  113. proc set_flowMonitor {flowmon output_chan} {
  114. $flowmon attach $output_chan
  115. set bytesInt_ [new Integrator]
  116. set pktsInt_ [new Integrator]
  117. $flowmon set-bytes-integrator $bytesInt_
  118. $flowmon set-pkts-integrator  $pktsInt_
  119. return $flowmon
  120. }
  121. ScenLib/RM instproc make_flowmon { time args } {
  122. global ns 
  123.     $self instvar flowmon_
  124. #puts "time = $time"
  125. #puts "args = $args"
  126. if {[expr [llength $args] % 3] != 0} {
  127. puts stderr {Error: Incomplete arguments for make_flowmon..}
  128. }
  129. #set c 0
  130. for {set i 0} {$i < [llength $args]} {incr i} {
  131. set node1 [lindex $args $i]
  132. incr i
  133. set node2 [lindex $args $i]
  134. incr i
  135. set fout [lindex $args $i]
  136.     set a [$node1 id]
  137.     set b [$node2 id]
  138. set flow_stat($a:$b) [open $fout w]    
  139. set flowmon_($a:$b) [$ns makeflowmon Fid]
  140. $ns attach-fmon [$ns link $node1 $node2] $flowmon_($a:$b) 0
  141. set_flowMonitor $flowmon_($a:$b) $flow_stat($a:$b)
  142.     #$ns at $time  "$flowmon_($a:$b) dump"
  143.     #incr c
  144. }
  145. }
  146. ScenLib/RM instproc dump_flowmon {n1 n2 time} {
  147.     $self instvar flowmon_
  148.     global ns n
  149.     $ns at $time "$flowmon_([$n1 id]:[$n2 id]) dump"
  150. }
  151. ScenLib/RM instproc make_nodes num {
  152. global ns n
  153. # setup the nodes
  154. for {set i 0} {$i < $num} {incr i} {
  155. set n($i) [$ns node]
  156. #puts "node($i) -> $n($i)"
  157. }
  158. }
  159. ScenLib/RM instproc create_mcast {srcnode switch addgrp time args} {
  160. global ns n opts srmStats srmEvents mflag
  161. $self instvar mrthandle_ fid_
  162. if {$mflag == 0} {
  163. set mrthandle_ [$ns mrtproto $opts(routingProto) {}]
  164. #puts "setting the mcastproto- $opts(routingProto)"
  165. set mflag 1
  166. }
  167. set dest [Node allocaddr]
  168. puts "mcast grp = $dest"
  169. $ns at $switch "$mrthandle_ switch-treetype $dest"
  170. #puts "ns at $switch $mrthandle_ switch-treetype $dest"
  171. set src [new Agent/$opts(srmSimType)]
  172. $src set dst_ $dest
  173. $src set fid_ [incr fid_]
  174. #puts "srcnode $srcnode fid -> [$src set fid_]"
  175. #$src trace $srmEvents
  176. #$src log $srmStats
  177. #$ns at 1.0 "$src start"
  178. $ns at $addgrp "$src start"
  179. # puts "ns at $addgrp src start"
  180. $ns attach-agent $n($srcnode) $src
  181. for {set i 0} {$i < [llength $args]} {incr i} {
  182. set j [lindex $args $i]
  183. set rcvr($j) [new Agent/$opts(srmSimType)]
  184. $rcvr($j) set dst_ $dest
  185. $rcvr($j) set fid_ [incr fid_]
  186. #puts "Srm-recr $j fid -> [$rcvr($j) set fid_]"
  187. #$rcvr($j) trace $srmEvents
  188. #$rcvr($j) log $srmStats
  189. $ns attach-agent $n($j) $rcvr($j)
  190. #$ns at 1.0 "$rcvr($j) start"
  191. $ns at $addgrp "$rcvr($j) start"
  192. # puts "ns at$addgrp rcvr($j) start"
  193. }
  194. #setup source
  195. set cbr [new Agent/$opts(rmSrcType)]
  196. $cbr set packetSize_ $opts(pktSize)
  197. $src traffic-source $cbr
  198. $src set packetSize_ $opts(pktSize)    ;#so repairs are correct
  199. $cbr set fid_ [incr fid_]
  200. #puts "cbr fid = [$cbr set fid_]"
  201. $ns at $time "$src start-source"
  202. }
  203. ScenLib/RM instproc create_cbr { args } {
  204. if {[expr [llength $args] % 5] != 0} {
  205. puts stderr {uneven number of tcp endpoints}
  206. }
  207. global ns n opts
  208. $self instvar fid_
  209. # Attach a CBR source and connect between a sender and recr 
  210. # node at the given time
  211. for {set i 0} {$i < [llength $args]} {incr i} {
  212. set k [lindex $args $i]
  213. set cbr($k) [new Agent/CBR]
  214. $cbr($k) set fid_ [incr fid_]
  215. $cbr($k) set packetSize_ $opts(pktSize)
  216. incr i
  217. $cbr($k) set interval_ [lindex $args $i]
  218. $ns attach-agent $n($k) $cbr($k)
  219. incr i
  220. set null($k) [new Agent/Null]
  221. $ns attach-agent $n([lindex $args $i]) $null($k)
  222. $ns connect $cbr($k) $null($k)
  223. incr i
  224. $ns at [lindex $args $i] "$cbr($k) start"
  225. incr i
  226. $ns at [lindex $args $i] "$cbr($k) stop"
  227. }
  228. }
  229. proc loss-model10 {} {
  230. global ns
  231. #setup loss model
  232. #set loss_module [new ErrorModel]
  233. #$loss_module set rate_ 0.1
  234. set loss_module [new SRMErrorModel]
  235. $loss_module set rate_ 0.1
  236. #$loss_module drop-packet 2 200 1
  237. $loss_module drop-target [$ns set nullAgent_]
  238. return $loss_module
  239. }
  240. proc loss-model5 {} {
  241. global ns
  242. set loss_module [new SRMErrorModel]
  243. $loss_module set rate_ 0.05
  244. #$loss_module drop-packet 2 200 1
  245. $loss_module drop-target [$ns set nullAgent_]
  246. return $loss_module
  247. }
  248. ScenLib/RM instproc loss-model-case1 {time a b} {
  249. global ns n
  250. set loss_module [loss-model10]
  251. $ns at $time "$ns lossmodel $loss_module $n($a) $n($b)"
  252. }
  253. ScenLib/RM instproc loss-model-case2 {time1 time2 a b c d} {
  254. global ns n
  255. set loss_module1 [loss-model10]
  256. set loss_module2 [loss-model10]
  257. $ns at $time1 "$ns lossmodel $loss_module1 $n($a) $n($b)"
  258. $ns at $time2 "$ns lossmodel $loss_module2 $n($c) $n($d)"
  259. }
  260. ScenLib/RM instproc loss-model-case3 {time1 time2 a b c d} {
  261. global ns n
  262. set loss_module1 [loss-model5]
  263. set loss_module2 [loss-model10]
  264. $ns at $time1 "$ns lossmodel $loss_module1 $n($a) $n($b)"
  265. $ns at $time2 "$ns lossmodel $loss_module2 $n($c) $n($d)"
  266. }
  267. ScenLib/RM instproc create_tcp {args} {
  268. if {[expr [llength $args] % 3] != 0} {
  269. puts stderr {uneven number of tcp endpoints}
  270. }
  271. global ns n opts
  272. $self instvar fid_
  273. #Attach a TCP flow between each src and recvr pair
  274. for {set i 0} {$i < [llength $args]} {incr i} {
  275. set k [lindex $args $i]
  276. set tcp($k) [new Agent/$opts(tcpType)]
  277. $tcp($k) set fid_ [incr fid_]
  278. $tcp($k) set packetSize_ $opts(pktSize)
  279. $ns attach-agent $n($k) $tcp($k)
  280. #puts "ns attach-agent n($k) tcp (fid [$tcp($k) set fid_]"
  281. incr i
  282. set tcp_sink($k) [new Agent/$opts(sinkType)]
  283. $ns attach-agent $n([lindex $args $i]) $tcp_sink($k)
  284. #puts "dest=[lindex $args $i]"
  285. $ns connect $tcp($k) $tcp_sink($k)
  286. incr i
  287. set ftp($k) [new Application/$opts(tcpSrcType)]
  288. $ftp($k) attach-agent $tcp($k)
  289. set time [lindex $args $i]
  290. $ns at $time "$ftp($k) start"
  291. #puts "At $time, tcp (from node$k) starts.. "
  292. }
  293. }
  294. proc finish {} {
  295. global prog ns opts srmEvents srmStats t
  296. #$src stop
  297. puts "Running finish.."
  298. $ns flush-trace
  299. #close $srmStats
  300. #close $srmEvents
  301. #XXX
  302. #puts "Filtering ..."
  303. #exec tclsh8.0 ../../../../nam-1/bin/namfilter.tcl out-$t.nam
  304. puts "running nam..."
  305. exec nam out-$t.nam &
  306. exit 0
  307. }