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

通讯编程

开发平台:

Visual C++

  1. # ----------------------- Test XCP Performance ------------------------------#
  2. #
  3. # Author: Dina Katabi, dina@ai.mit.edu
  4. # Last Update : 7/16/2002
  5. #
  6. #-------------------------------------------------------------------------------#
  7. #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Utility Functions -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  8. #--------- Creating the TOPOLOGY --------------------#
  9. #       n0                             
  10. #       :    Bottleneck            
  11. #       :  R0-----------------------R1
  12. #         /                            
  13. #       ni                         
  14. #
  15. Agent/TCP set minrto_ 1
  16. proc set-red-params { qsize } {
  17. Queue/RED set thresh_ [expr 0.6 * $qsize]
  18. Queue/RED set maxthresh_ [expr 0.8 * $qsize]
  19. Queue/RED set q_weight_ 0.001
  20. Queue/RED set linterm_ 10
  21. Queue/RED set bytes_ false ;
  22. Queue/RED set queue_in_bytes_ false ;
  23. Agent/TCP set old_ecn_ true
  24. Queue/RED set setbit_     true
  25. }
  26. proc create-topology2 { BW delay qtype qsize numSideLinks deltaDelay } {
  27.     global ns 
  28.     
  29.     #Set the queue size to the pipe's size assuming the packet size is 1000 KByte
  30.     if { $qsize == 0 } { set qsize [expr round([expr ($BW / 8) * 2 * $delay])] }
  31.     set i 0
  32.     while { $i < 2 } {
  33. global R$i
  34. set R$i [$ns node]
  35. incr i
  36.     }
  37.     
  38.     $ns duplex-link $R0 $R1 [set BW]Mb [set delay]ms $qtype
  39.     $ns queue-limit $R0 $R1 $qsize
  40.     $ns queue-limit $R1 $R0 $qsize
  41.     # Give a global handle to the Bottleneck Queue to allow 
  42.     # setting the RED paramters
  43.     global Bottleneck rBottleneck
  44.     set  Bottleneck  [[$ns link $R0 $R1] queue] 
  45.     set  rBottleneck [[$ns link $R1 $R0] queue]
  46.     global l rl
  47.     set  l  [$ns link $R0 $R1]  
  48.     set  rl [$ns link $R1 $R0]
  49.     global all_links 
  50.     set all_links "$l $rl "
  51.     # The side links  have the same BW as the Bottleneck
  52.     set i 0
  53.     while { $i < $numSideLinks } {
  54. global n$i q$i rq$i l$i rl$i
  55. set n$i  [$ns node]
  56. $ns duplex-link [set n$i]  $R0  [set BW]Mb [expr $delay + $i * $deltaDelay]ms $qtype
  57. $ns queue-limit [set n$i]  $R0  $qsize
  58. $ns queue-limit $R0 [set n$i]   $qsize
  59. set  q$i   [[$ns link [set n$i]  $R0] queue] 
  60. set  rq$i  [[$ns link $R0 [set n$i]] queue]
  61. set  l$i    [$ns link [set n$i]  $R0] 
  62. set  rl$i   [$ns link $R0 [set n$i]]
  63. set all_links "$all_links [set l$i] [set rl$i] "
  64. incr i
  65.     }
  66. }
  67. #------- Sender Class :
  68. # This is essentially an ftp sender
  69. Class GeneralSender  -superclass Agent 
  70. # otherparams are "startTime TCPclass .."
  71. GeneralSender instproc init { id node rcvrTCP otherparams } {
  72.     global  ns
  73.     $self next
  74.     $self instvar tcp_ id_ ftp_ node_ tcp_rcvr_ tcp_type_
  75.     set id_ $id
  76.     set node_ $node
  77.     if { [llength $otherparams] > 1 } {
  78. set TCP [lindex $otherparams 1]
  79.     } else { 
  80. set TCP "TCP/Reno"
  81.     }
  82.     set   tcp_type_ $TCP
  83.     set   tcp_ [new Agent/$TCP]
  84.     $tcp_ set  packetSize_ 1000   
  85.     $tcp_ set  class_  $id
  86.     set   ftp_ [new Source/FTP]
  87.     $ftp_ set agent_ $tcp_
  88.     $ns   attach-agent $node $tcp_
  89.     $ns   connect $tcp_  $rcvrTCP
  90.     set   tcp_rcvr_ $rcvrTCP
  91.     set   startTime [lindex $otherparams 0]
  92.     $ns   at $startTime "$ftp_ start"
  93.     puts  "initialized Sender $id_ at $startTime"
  94. }
  95. GeneralSender instproc trace-xcp parameters {
  96.     $self instvar tcp_ id_ tcpTrace_
  97.     global ftracetcp$id_ 
  98.     set ftracetcp$id_ [open  xcp$id_.tr  w]
  99.     set tcpTrace_ [set ftracetcp$id_]
  100.     $tcp_ attach-trace [set ftracetcp$id_]
  101.     if { -1 < [lsearch $parameters cwnd]  } { $tcp_ tracevar cwnd_ }
  102.     if { -1 < [lsearch $parameters seqno] } { $tcp_ tracevar t_seqno_ }
  103. }
  104. #--- Command line arguments
  105. proc  set-cmd-line-args { list_args } {
  106.     global argv
  107.     set i 0
  108.     foreach a $list_args {
  109. global $a
  110. set $a  [lindex $argv $i]
  111. puts "$a = [set $a]"
  112. incr i
  113.     }
  114. }
  115. #-------------- Plotting functions -----------#
  116. # plot a xcp traced var
  117. proc plot-xcp { TraceName nXCPs  PlotTime what } {
  118.     if {[string compare $what "cwnd_"] == 0} {
  119. exec rm -f xgraph_cwnd.tcp
  120. set f [open xgraph_cwnd.tcp w]
  121. set a cwnd
  122.     } else {
  123. exec rm -f xgraph_seqno.tcp
  124. set f [open xgraph_seqno.tcp w]
  125. set a seqno
  126.     }
  127.     puts $f "TitleText: $TraceName"
  128.     puts $f "Device: Postscript"
  129.     foreach i $nXCPs {
  130. #the TCP traces are flushed when the sources are stopped
  131. exec rm -f temp.tcp 
  132.         exec touch temp.tcp
  133. global ftracetcp$i 
  134. if [info exists ftracetcp$i] { flush [set ftracetcp$i] }
  135. set packetsize [expr 100 * ($i +10)]
  136.         set result [exec awk -v PlotTime=$PlotTime -v what=$what -v s=$packetsize {
  137.     {
  138. if (( $6 == what ) && ($1 > PlotTime)) {
  139. tmp=$7*s
  140. print $1, tmp >> "temp.tcp";
  141. }
  142.     }
  143. } xcp$i.tr]
  144.  
  145. puts "$i : $result"
  146. puts $f "$what$i 
  147. exec cat temp.tcp >@ $f
  148. puts $f "n"
  149. flush $f
  150.     }
  151.     close $f
  152.     exec xgraph  -nl -m  -x time -y $what xgraph_$a.tcp &
  153.     return 
  154. }
  155. # Takes as input the the label on the Y axis, the time it starts plotting, and the trace file tcl var
  156. proc plot-red-queue { TraceName PlotTime traceFile } {
  157.     
  158.     exec rm -f xgraph.red_queue
  159.     exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  160.     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  161.     
  162.     exec awk -v PT=$PlotTime {
  163. {
  164.     if (($1 == "q" && NF>2) && ($2 > PT)) {
  165. print $2, $3 >> "temp.q"
  166.     }
  167.     else if (($1 == "a" && NF>2) && ($2 > PT)){
  168. print $2, $3 >> "temp.a"
  169.     }
  170.     else if (($1 == "p" && NF>2) && ($2 > PT)){
  171. print $2, $3 >> "temp.p"
  172.     }
  173. }
  174.     }  $traceFile
  175.     set ff [open xgraph.red_queue w]
  176.     puts $ff "TitleText: $TraceName"
  177.     puts $ff "Device: Postscript n"
  178.     puts $ff "queue
  179.     exec cat temp.q >@ $ff  
  180.     puts $ff n"ave_queue
  181.     exec cat temp.a >@ $ff
  182.     puts $ff n"prob_drop
  183.     exec cat temp.p >@ $ff
  184.     close $ff
  185.     exec xgraph  -P -x time -y queue xgraph.red_queue &
  186. }
  187. proc plot-red {varname filename PlotTime} {
  188.     
  189.     exec rm -f temp.$filename
  190.     exec touch temp.$filename
  191.     
  192.     set result [exec awk -v PlotTime=$PlotTime -v what=$varname -v file=temp.$filename {
  193. {
  194.     if (( $1 == what ) && ($2 > PlotTime)) {
  195. print $2, $3 >> file ;
  196.     }  
  197. }
  198.     } ft_red_Bottleneck.tr]
  199.     exec xgraph -P -x time -y $filename temp.$filename
  200. }
  201. #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Initializing Simulator -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  202. # BW is in Mbs and delay is in ms
  203. #set-cmd-line-args "seed qType BW nXCPs delay "
  204. set seed   472904
  205. set qType  XCP
  206. set BW     20; # in Mb/s
  207. set nXCPs  3; # Number of flows
  208. set delay  10; # in ms
  209. set ns          [new Simulator]
  210. $ns             use-scheduler Heap
  211. set rtg         [new RNG]
  212. $rtg seed       $seed
  213. set f_all [open out.tr w]
  214. $ns trace-all $f_all
  215. set  qSize  [expr round([expr ($BW / 8.0) * 4 * $delay * 1.0])];#set buffer to the pipe size
  216. set tracedXCPs       "0 1 2"
  217. set SimStopTime      30
  218. set PlotTime         0
  219. #---------- Create the simulation --------------------#
  220. # Create topology
  221. create-topology2 $BW $delay $qType $qSize $nXCPs 0.0
  222. foreach link $all_links {
  223.     set queue [$link queue]
  224.     switch $qType {
  225. "XCP" {
  226. $queue set-link-capacity [[$link set link_] set bandwidth_];
  227. }
  228. "DropTail/XCP" {
  229.     $queue set-link-capacity-Kbytes [expr [[$link set link_] set bandwidth_] / 8000];
  230. }
  231. default {
  232. puts "Incorrect qType $qType"
  233. exit 0
  234. }
  235.     }
  236. }
  237. # Create sources:
  238. set i 0
  239. while { $i < $nXCPs  } {
  240.     set StartTime [expr [$rtg integer 1000] * 0.001 * (0.01 * $delay) + $i  * 6.0] 
  241.     set rcvr_XCP      [new Agent/TCPSink/XCPSink]
  242.     $ns attach-agent  $R1 $rcvr_XCP
  243.     set src$i         [new GeneralSender $i [set n$i] $rcvr_XCP "$StartTime TCP/Reno/XCP"]
  244.     [[set src$i] set tcp_]  set  packetSize_ [expr 100 * ($i +10)]
  245.     [[set src$i] set tcp_]  set  window_     [expr $qSize * 10]
  246.     incr i
  247. }
  248. #---------- Trace --------------------#
  249. # Trace sources
  250. foreach i $tracedXCPs {
  251. [set src$i] trace-xcp "cwnd seqno"
  252. }
  253. # Trace Queues
  254. foreach queue_name "Bottleneck rBottleneck" {
  255.     set queue [set "$queue_name"]
  256.     switch $qType {
  257.     "XCP" {
  258.     global "ft_red_$queue_name"
  259.     set "ft_red_$queue_name" [open ft_red_[set queue_name].tr w]
  260.     
  261.     set xcpq $queue ;#[$queue set vq_(0)]
  262.     $xcpq attach       [set ft_red_$queue_name]
  263.     }
  264.     "DropTail/XCP" {}
  265.     }
  266. }
  267. #---------------- Run the simulation ------------------------#
  268. proc flush-files {} {
  269.     set files "f_all ft_red_Bottleneck ft_red_rBottleneck"
  270.     global tracedXCPs
  271.     foreach file $files {
  272.         global $file
  273.         if {[info exists $file]} {
  274.             flush [set $file]
  275.             close [set $file]
  276.         }   
  277.     }
  278.     foreach i $tracedXCPs {
  279. global src$i
  280. set file [set src$i tcpTrace_]
  281. if {[info exists $file]} {
  282.             flush [set $file]
  283.             close [set $file]
  284.         }   
  285.     }
  286. }
  287. proc finish {} {
  288.     global ns 
  289.     if {[info exists f]} {
  290. $ns flush-trace
  291. close $f
  292.     }   
  293.     $ns halt
  294. }
  295. $ns at $SimStopTime "finish"
  296. $ns run
  297. flush-files
  298. #------------ Post Processing ---------------#
  299. set PostProcess 1
  300. if { $PostProcess } {
  301.     #--- Traced TCPs
  302.     set TraceName "Flows --$qType-QS$qSize"
  303.     plot-xcp      $TraceName  $tracedXCPs  0.0  "cwnd_"
  304.  #   plot-xcp      $TraceName  $tracedXCPs  0.0  "t_seqno_"
  305. #    plot-red-queue  $TraceName  $PlotTime   ft_red_Bottleneck.tr
  306.     plot-red "u" util 0.0
  307. }