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

通讯编程

开发平台:

Visual C++

  1. # scheduling disciplines for Agent/TCP/Session
  2. set FINE_ROUND_ROBIN 1
  3. set COARSE_ROUND_ROBIN 2
  4. set RANDOM 3
  5. # configure RED parameters
  6. Queue/RED set setbit_ true
  7. Queue/RED set drop_tail_ false
  8. Queue/RED set fracthresh_ true
  9. Queue/RED set fracminthresh_ 0.15
  10. Queue/RED set fracmaxthresh_ 0.6
  11. Queue/RED set q_weight_ 0.01
  12. Queue/RED set wait_ false
  13. Queue/RED set linterm_ 10
  14. #Queue/RED set linterm_ 5
  15. Queue set interleave_ false
  16. Queue set acksfirst_ false
  17. Queue set filteracks_ false
  18. Queue set replace_head_ false
  19. Queue set ackfromfront_ false
  20. Queue set priority_drop_ false
  21. Queue set random_drop_ false
  22. Agent/TCP set disable_ecn_ 0
  23. Agent/TCP set restart_bugfix_ true
  24. Agent/TCP/Fack set ss-div4 0
  25. Agent/TCP/Fack set rampdown 0
  26. Agent/TCP set timestamps_ true
  27. Agent/TCP set fast_loss_recov_ true
  28. Agent/TCP set fast_reset_timer_ true
  29. Agent/TCP set count_bytes_acked_ true
  30. Agent/TCP set windowOption_ 0
  31. Agent/TCP/Int set rightEdge_ 0
  32. Agent/TCP/Int set uniqTS_ 1
  33. Agent/TCP/Int set winInc_ 1
  34. Agent/TCP/Int set winMult_ 0.5
  35. Agent/TCP/Session set ownd_ 0
  36. Agent/TCP/Session set owndCorr_ 0
  37. Agent/TCP/Session set proxyopt_ false
  38. Agent/TCP/Session set fixedIw_ false
  39. Agent/TCP/Session set count_bytes_acked_ false
  40. Agent/TCP/Session set schedDisp_ $FINE_ROUND_ROBIN
  41. Agent/TCP/Session set fs_enable_ false
  42. Agent/TCP/Session set disableIntLossRecov_ false
  43. Agent/TCP/Newreno/FS set fs_enable_ false
  44. Agent/TCPSink set ts_echo_bugfix_ true
  45. proc processtrace { midtime turnontime turnofftime { qtraceflag false } { dir "." } } {
  46. exec gawk --lint -v dir=$dir -f ../../../ex/asym/tcp-trace.awk $dir/tcp-raw.tr
  47. exec gawk --lint -v dir=$dir -f ../../../ex/asym/seq.awk $dir/out.tr
  48. exec gawk --lint -v dir=$dir -v mid=$midtime -v turnon=$turnontime -v turnoff=$turnofftime -f ../../../ex/asym/tcp.awk $dir/tcp.tr
  49. exec gawk --lint -v dir=$dir -f ../../../ex/asym/tcp-burst.awk $dir/tcp.tr
  50. if { $qtraceflag } {
  51. exec gawk --lint -f ../../../ex/asym/queue.awk $dir/q.tr
  52. }
  53. }
  54. proc plotgraph {graph connGraphFlag midtime turnontime turnofftime { qtraceflag false } { dir "." } } {
  55. global env
  56. upvar $connGraphFlag graphFlag
  57. set if [open seq-index.out r]
  58. while {[gets $if i] >= 0} {
  59. if {$graph || $graphFlag($i)} {
  60. set seqfile [format "%s/seq-%s.out" $dir $i]
  61. set ackfile [format "%s/ack-%s.out" $dir $i]
  62. exec xgraph -display $env(DISPLAY) -bb -tk -m -x time -y seqno $seqfile $ackfile &
  63. }
  64. }
  65. close $if
  66. set if [open index.out r]
  67. while {[gets $if i] >= 0} {
  68. if {$graph || $graphFlag($i)} {
  69. set cwndfile [format "%s/cwnd-%s.out" $dir $i]
  70. set ssthreshfile [format "%s/ssthresh-%s.out" $dir $i]
  71. set owndfile [format "%s/ownd-%s.out" $dir $i]
  72. set owndcorrfile [format "%s/owndcorr-%s.out" $dir $i]
  73. set srttfile [format "%s/srtt-%s.out" $dir $i]
  74. set rttvarfile [format "%s/rttvar-%s.out" $dir $i]
  75. set cwnd_meaningful [exec gawk {BEGIN {flag=0;} {if (NR > 2 && $2 != 1) {flag=1; exit;}} END {print flag;}} $cwndfile]
  76. if {$cwnd_meaningful == 1} {
  77. exec xgraph -display $env(DISPLAY) -bb -tk -m -x time -y window $cwndfile $owndfile $owndcorrfile &
  78. }
  79. }
  80. }
  81. close $if
  82. if { $qtraceflag } {
  83. set qif [open qindex.out r]
  84. while {[gets $qif i] >= 0} {
  85. exec xgraph -display $env(DISPLAY) -bb -tk -m -x time -y "# packets" $i &
  86. }
  87. close $qif
  88. }
  89. }
  90. proc monitor_queue {ns n0 n1 queuetrace sampleInterval} {
  91. if {$queuetrace == 0} {
  92. return
  93. }
  94. set id0 [$n0 id]
  95. set id1 [$n1 id]
  96. set l01 [$ns set link_($id0:$id1)]
  97. $ns monitor-queue $n0 $n1 $queuetrace $sampleInterval
  98. $l01 set qBytesEstimate_ 0
  99. $ns at [$ns now] "$l01 queue-sample-timeout"
  100. }
  101. proc trace_queue {ns n0 n1 queuetrace} {
  102. set id0 [$n0 id]
  103. set id1 [$n1 id]
  104. set l01 [$ns set link_($id0:$id1)]
  105. $ns monitor-queue $n0 $n1 $queuetrace
  106. $ns at [$ns now] "$l01 start-tracing"
  107. }
  108. proc createTcpSource { type { maxburst 0 } { tcpTick 0.1 } { window 100 } { slow_start_restart false } { fs_enable false } {ssthresh 0} {flr true} {frt true} } {
  109. set tcp0 [new Agent/$type]
  110. $tcp0 set class_ 1
  111. $tcp0 set maxburst_ $maxburst
  112. $tcp0 set tcpTick_ $tcpTick
  113. $tcp0 set window_ $window
  114. $tcp0 set maxcwnd_ $window
  115. $tcp0 set ecn_ 1
  116. $tcp0 set g_ 0.125
  117. $tcp0 set slow_start_restart_ $slow_start_restart
  118. if {$fs_enable} {
  119. $tcp0 set fs_enable_ $fs_enable
  120. }
  121. if {$ssthresh > 0} {
  122. $tcp0 set ssthresh_ $ssthresh
  123. }
  124. $tcp0 set fast_loss_recov_ $flr
  125. $tcp0 set fast_reset_timer_ $frt
  126. return $tcp0
  127. proc enableTcpTracing { tcp tcptrace } {
  128. if {$tcptrace == 0} {
  129. return
  130. }
  131. $tcp attach $tcptrace
  132. $tcp trace "t_seqno_" 
  133. $tcp trace "rtt_" 
  134. $tcp trace "srtt_" 
  135. $tcp trace "rttvar_" 
  136. $tcp trace "backoff_" 
  137. $tcp trace "dupacks_" 
  138. $tcp trace "ack_" 
  139. $tcp trace "cwnd_"
  140. $tcp trace "ssthresh_" 
  141. $tcp trace "maxseq_" 
  142. $tcp trace "seqno_"
  143. # $tcp trace "exact_srtt_"
  144. # $tcp trace "avg_win_"
  145. $tcp trace "nrexmit_"
  146. }
  147. proc setupTcpTracing { tcp tcptrace { sessionFlag false } } {
  148. if {$tcptrace == 0} {
  149. return
  150. }
  151. enableTcpTracing $tcp $tcptrace
  152. if { $sessionFlag } {
  153. set dst [$tcp set dst_addr_]
  154. set session [[$tcp set node_] createTcpSession $dst]
  155. enableTcpTracing $session $tcptrace
  156. $session trace "ownd_"
  157. $session trace "owndCorr_"
  158. }
  159. }
  160. proc setupGraphing { tcp connGraph connGraphFlag {sessionFlag false} } {
  161. upvar $connGraphFlag graphFlag
  162. set saddr $tcp set agent_addr_]
  163. set sport [$tcp set agent_port_]
  164. set daddr [$tcp set dst_addr]
  165. set dport [$tcp set dst_port_]
  166. set conn [format "%d,%d-%d,%d" $saddr $sport $daddr $dport]
  167. set graphFlag($conn) $connGraph
  168. if { $sessionFlag } {
  169. set dst [expr ([$tcp set dst_addr]
  170. set session [[$tcp set node_] createTcpSession $dst]
  171. set sport [expr [$session set agent_port_]
  172. set dport 0
  173. set conn [format "%d,%d-%d,%d" $saddr $sport $daddr $dport]
  174. set graphFlag($conn) $connGraph
  175. }
  176. }
  177. proc createTcpSink { type {sinktrace 0} { ackSize 40 } { maxdelack 25 } } {
  178. set sink0 [new Agent/$type]
  179. $sink0 set packetSize_ $ackSize
  180. if {[string first "Asym" $type] != -1} { 
  181. $sink0 set maxdelack_ $maxdelack
  182. }
  183. if {$sinktrace != 0} {
  184. $sink0 attach $sinktrace
  185. }
  186. return $sink0
  187. }
  188. proc setupTcpSession { tcp { count_bytes_acked false } { schedDisp $FINE_ROUND_ROBIN} {fs_enable false} {disableIntLossRecov false} } {
  189. set dst [$tcp set dst_addr_]
  190. if {![[$tcp set node_] existsTcpSession $dst]} {
  191. set session [[$tcp set node_] createTcpSession $dst]
  192. $session set maxburst_ [$tcp set maxburst_]
  193. $session set slow_start_restart_ [$tcp set slow_start_restart_]
  194. $session set fs_enable_ $fs_enable
  195. $session set restart_bugfix_ [$tcp set restart_bugfix_]
  196. $session set packetSize_ [$tcp set packetSize_]
  197. $session set ecn_ [$tcp set ecn_]
  198. $session set window_ [$tcp set window_]
  199. $session set maxcwnd_ [$tcp set maxcwnd_]
  200. $session set count_bytes_acked_ $count_bytes_acked
  201. $session set schedDisp_ $schedDisp
  202. $session set disableIntLossRecov_ $disableIntLossRecov
  203. return true
  204. }
  205. return false
  206. }
  207. proc createFtp { ns n0 tcp0 n1 sink0 } {
  208. $ns attach-agent $n0 $tcp0
  209. $ns attach-agent $n1 $sink0
  210. $ns connect $tcp0 $sink0
  211. set ftp0 [new Source/FTP]
  212. $ftp0 attach $tcp0
  213. return $ftp0
  214. }
  215. proc configQueue { ns n0 n1 type {qtrace 0} { size -1 } { nonfifo 0 } { acksfirst false } { filteracks false } { replace_head false } { priority_drop false } { random_drop false } { random_ecn false } { reconsacks false } } { 
  216. # proc configQueue { ns n0 n1 type qtrace rtrace { size -1 } { nonfifo 0 } { acksfirst false } { filteracks false } { replace_head false } { priority_drop false } { random_drop false } { reconsacks false } }  
  217. if { $size >= 0 } {
  218. $ns queue-limit $n0 $n1 $size
  219. }
  220. set id0 [$n0 id]
  221. set id1 [$n1 id]
  222. set l01 [$ns set link_($id0:$id1)]
  223. set q01 [$l01 set queue_]
  224. if {$nonfifo} {
  225. set spq [new PacketQueue/Semantic]
  226. $spq set acksfirst_ $acksfirst
  227. $spq set filteracks_ $filteracks
  228. $spq set replace_head_ $replace_head
  229. $spq set priority_drop_ $priority_drop
  230. $spq set random_drop_ $random_drop
  231. $spq set random_ecn_ $random_ecn
  232. if { $reconsacks == "true"} {
  233. set recons [new AckReconsControllerClass]
  234. # Set queue_ of controller.  This is 
  235. # used by the individual reconstructors
  236. $recons set queue_ $q01
  237. $spq set reconsAcks_ 1
  238. $spq ackrecons $recons
  239. }
  240. $q01 packetqueue-attach $spq
  241. }
  242. # if {[string first "RED" $type] != -1} {
  243. # configREDQueue $ns $n0 $n1 [$q01 set q_weight_] 1
  244. # }
  245. # $q01 trace $trace
  246. # if { $qtrace != 0 } {
  247. trace_queue $ns $n0 $n1 $qtrace
  248. # }
  249. $q01 reset
  250. }
  251. proc configREDQueue { ns n0 n1 { redtrace } { q_weight -1 } { fracthresh 0 } { fracminthresh 0.4 } { fracmaxthresh 0.8} } {
  252. set id0 [$n0 id]
  253. set id1 [$n1 id]
  254. set l01 [$ns set link_($id0:$id1)]
  255. set q01 [$l01 set queue_]
  256. if {$redtrace != 0} {
  257. $q01 attach $redtrace
  258. }
  259. if {$q_weight >= 0} {
  260. $q01 set q_weight_ $q_weight
  261. }
  262. if { $fracthresh } {
  263. set lim [$q01 set limit_]
  264. $q01 set thresh_ [expr $fracminthresh*$lim]
  265. $q01 set maxthresh_ [expr $fracmaxthresh*$lim]
  266. }
  267. $q01 set setbit_ true
  268. }