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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1995-1997 The Regents of the University of California.
  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. All advertising materials mentioning features or use of this software
  14. #    must display the following acknowledgement:
  15. # This product includes software developed by the Computer Systems
  16. # Engineering Group at Lawrence Berkeley Laboratory.
  17. # 4. Neither the name of the University nor of the Laboratory may be used
  18. #    to endorse or promote products derived from this software without
  19. #    specific prior written permission.
  20. #
  21. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. # SUCH DAMAGE.
  32. #
  33. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/test/test-suite-red.tcl,v 1.64 2007/09/25 05:30:57 sallyfloyd Exp $
  34. #
  35. # This test suite reproduces most of the tests from the following note:
  36. # Floyd, S., 
  37. # Ns Simulator Tests for Random Early Detection (RED), October 1996.
  38. # URL ftp://ftp.ee.lbl.gov/papers/redsims.ps.Z.
  39. #
  40. # To run all tests: test-all-red
  41. set dir [pwd]
  42. catch "cd tcl/test"
  43. source misc_simple.tcl
  44. remove-all-packet-headers       ; # removes all except common
  45. add-packet-header Flags IP RTP TCP  ; # hdrs reqd for validation test
  46.  
  47. # FOR UPDATING GLOBAL DEFAULTS:
  48. Agent/TCP set precisionReduce_ false ;   # default changed on 2006/1/24.
  49. Agent/TCP set rtxcur_init_ 6.0 ;      # Default changed on 2006/01/21
  50. Agent/TCP set updated_rttvar_ false ;  # Variable added on 2006/1/21
  51. Agent/TCP set tcpTick_ 0.1
  52. # The default for tcpTick_ is being changed to reflect a changing reality.
  53. Agent/TCP set rfc2988_ false
  54. # The default for rfc2988_ is being changed to true.
  55. # FOR UPDATING GLOBAL DEFAULTS:
  56. Queue/RED set bytes_ false              
  57. # default changed on 10/11/2004.
  58. Queue/RED set queue_in_bytes_ false
  59. # default changed on 10/11/2004.
  60. Queue/RED set q_weight_ 0.002
  61. Queue/RED set thresh_ 5 
  62. Queue/RED set maxthresh_ 15
  63. # The RED parameter defaults are being changed for automatic configuration.
  64. Agent/TCP set useHeaders_ false
  65. # The default is being changed to useHeaders_ true.
  66. Agent/TCP set windowInit_ 1
  67. # The default is being changed to 2.
  68. Agent/TCP set singledup_ 0
  69. # The default is being changed to 1
  70. Queue/RED set use_mark_p_ false
  71. # The default is being changed to true.
  72. catch "cd $dir"
  73. #Agent/TCP set oldCode_ true
  74. Agent/TCP set minrto_ 0
  75. # The default is being changed to minrto_ 1
  76. Agent/TCP set syn_ false
  77. Agent/TCP set delay_growth_ false
  78. # In preparation for changing the default values for syn_ and delay_growth_.
  79. Agent/TCP set SetCWRonRetransmit_ true
  80. # Changing the default value.
  81. set flowfile fairflow.tr; # file where flow data is written
  82. set flowgraphfile fairflow.xgr; # file given to graph tool 
  83. TestSuite instproc finish file {
  84. global quiet PERL
  85. $self instvar ns_ tchan_ testName_
  86.         exec $PERL ../../bin/getrc -s 2 -d 3 all.tr | 
  87.           $PERL ../../bin/raw2xg -a -s 0.01 -m 90 -t $file > temp.rands
  88. if {$quiet == "false"} {
  89.          exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
  90. }
  91.         ## now use default graphing tool to make a data file
  92.         ## if so desired
  93. if { [info exists tchan_] && $quiet == "false" } {
  94. $self plotQueue $testName_
  95. }
  96. $ns_ halt
  97. }
  98. TestSuite instproc enable_tracequeue ns {
  99. $self instvar tchan_ node_
  100. set redq [[$ns link $node_(r1) $node_(r2)] queue]
  101. set tchan_ [open all.q w]
  102. $redq trace curq_
  103. $redq trace ave_
  104. $redq attach $tchan_
  105. }
  106. Class Topology
  107. Topology instproc node? num {
  108.     $self instvar node_
  109.     return $node_($num)
  110. }
  111. Class Topology/net2 -superclass Topology
  112. Topology/net2 instproc init ns {
  113.     $self instvar node_
  114.     set node_(s1) [$ns node]
  115.     set node_(s2) [$ns node]    
  116.     set node_(r1) [$ns node]    
  117.     set node_(r2) [$ns node]    
  118.     set node_(s3) [$ns node]    
  119.     set node_(s4) [$ns node]    
  120.     $self next 
  121.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 2ms DropTail
  122.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 3ms DropTail
  123.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms RED
  124.     $ns queue-limit $node_(r1) $node_(r2) 25
  125.     $ns queue-limit $node_(r2) $node_(r1) 25
  126.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 4ms DropTail
  127.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 5ms DropTail
  128.  
  129.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  130.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  131.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  132.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  133.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  134.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  135.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  136.     # force identical behavior to ns-1.
  137.     # the recommended value for linterm is now 10
  138.     # and is placed in the default file (3/31/97)
  139.     [[$ns link $node_(r1) $node_(r2)] queue] set linterm_ 50
  140.     [[$ns link $node_(r2) $node_(r1)] queue] set linterm_ 50
  141. }   
  142. Class Topology/net3 -superclass Topology
  143. Topology/net3 instproc init ns {
  144.     $self instvar node_
  145.     set node_(s1) [$ns node]
  146.     set node_(s2) [$ns node]    
  147.     set node_(r1) [$ns node]    
  148.     set node_(r2) [$ns node]    
  149.     set node_(s3) [$ns node]    
  150.     set node_(s4) [$ns node]    
  151.     $self next 
  152.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 0ms DropTail
  153.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 1ms DropTail
  154.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 10ms RED
  155.     $ns duplex-link $node_(r2) $node_(r1) 1.5Mb 10ms RED
  156.     $ns queue-limit $node_(r1) $node_(r2) 100
  157.     $ns queue-limit $node_(r2) $node_(r1) 100
  158.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 2ms DropTail
  159.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 3ms DropTail
  160.  
  161.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  162.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  163.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  164.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  165.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  166.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  167.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  168. }   
  169. TestSuite instproc plotQueue file {
  170. global quiet
  171. $self instvar tchan_
  172. #
  173. # Plot the queue size and average queue size, for RED gateways.
  174. #
  175. set awkCode {
  176. {
  177. if ($1 == "Q" && NF>2) {
  178. print $2, $3 >> "temp.q";
  179. set end $2
  180. }
  181. else if ($1 == "a" && NF>2)
  182. print $2, $3 >> "temp.a";
  183. }
  184. }
  185. set f [open temp.queue w]
  186. puts $f "TitleText: $file"
  187. puts $f "Device: Postscript"
  188. if { [info exists tchan_] } {
  189. close $tchan_
  190. }
  191. exec rm -f temp.q temp.a 
  192. exec touch temp.a temp.q
  193. exec awk $awkCode all.q
  194. puts $f "queue
  195. exec cat temp.q >@ $f  
  196. puts $f n"ave_queue
  197. exec cat temp.a >@ $f
  198. ###puts $f n"thresh
  199. ###puts $f 0 [[ns link $r1 $r2] get thresh]
  200. ###puts $f $end [[ns link $r1 $r2] get thresh]
  201. close $f
  202. if {$quiet == "false"} {
  203. exec xgraph -bb -tk -x time -y queue temp.queue &
  204. }
  205. }
  206. TestSuite instproc tcpDumpAll { tcpSrc interval label } {
  207.     global quiet
  208.     $self instvar dump_inst_ ns_
  209.     if ![info exists dump_inst_($tcpSrc)] {
  210. set dump_inst_($tcpSrc) 1
  211. set report $label/window=[$tcpSrc set window_]/packetSize=[$tcpSrc set packetSize_]
  212. if {$quiet == "false"} {
  213. puts $report
  214. }
  215. $ns_ at 0.0 "$self tcpDumpAll $tcpSrc $interval $label"
  216. return
  217.     }
  218.     $ns_ at [expr [$ns_ now] + $interval] "$self tcpDumpAll $tcpSrc $interval $label"
  219.     set report time=[$ns_ now]/class=$label/ack=[$tcpSrc set ack_]/packets_resent=[$tcpSrc set nrexmitpack_]
  220.     if {$quiet == "false"} {
  221.      puts $report
  222.     }
  223. }       
  224. TestSuite instproc mainSim {TCPStyle {window 15} } {
  225.     $self instvar ns_ node_ testName_ 
  226.     set stoptime 10.0
  227.     
  228.     if {$TCPStyle=="Reno"} {
  229. set sourceType TCP/Reno;  
  230. set sinkType TCPSink;
  231.     } elseif {$TCPStyle=="Sack1"} {
  232. set sourceType TCP/Sack1;  
  233. set sinkType TCPSink/Sack1;
  234.     }
  235.     set tcp1 [$ns_ create-connection $sourceType $node_(s1) $sinkType $node_(s3) 0]
  236.     set tcp2 [$ns_ create-connection $sourceType $node_(s2) $sinkType $node_(s3) 1]
  237.     $tcp1 set window_ $window
  238.     $tcp2 set window_ $window
  239.     set ftp1 [$tcp1 attach-app FTP]
  240.     set ftp2 [$tcp2 attach-app FTP]
  241.     $self enable_tracequeue $ns_
  242.     $ns_ at 0.0 "$ftp1 start"
  243.     $ns_ at 3.0 "$ftp2 start"
  244.     $self tcpDump $tcp1 5.0
  245.     # trace only the bottleneck link
  246.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  247.     $ns_ at $stoptime "$self cleanupAll $testName_"
  248. }
  249. Class Test/red1 -superclass TestSuite
  250. Test/red1 instproc init {} {
  251.     $self instvar net_ test_ guide_
  252.     set net_ net2 
  253.     set test_ red1
  254.     set guide_ "RED, without ECN."
  255.     $self next
  256. }
  257. Test/red1 instproc run {} {
  258.     $self instvar ns_ node_ testName_ net_ guide_
  259.     puts "Guide: $guide_"
  260.     $self setTopo
  261.     $self mainSim Reno
  262.     $ns_ run
  263. }
  264. Class Test/ecn -superclass TestSuite
  265. Test/ecn instproc init {} {
  266.     $self instvar net_ test_ guide_
  267.     Queue/RED set setbit_ true
  268.     Agent/TCP set old_ecn_ 1
  269.     set net_ net2
  270.     set test_ ecn
  271.     set guide_ "RED with ECN."
  272.     $self next
  273. }
  274. Test/ecn instproc run {} {
  275.     $self instvar ns_ node_ testName_ guide_
  276.     puts "Guide: $guide_"
  277.     $self setTopo 
  278.     set stoptime 10.0
  279.     set redq [[$ns_ link $node_(r1) $node_(r2)] queue]
  280.     $redq set setbit_ true
  281.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  282.     $tcp1 set window_ 15
  283.     $tcp1 set ecn_ 1
  284.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s3) 1]
  285.     $tcp2 set window_ 15
  286.     $tcp2 set ecn_ 1
  287.         
  288.     set ftp1 [$tcp1 attach-app FTP]
  289.     set ftp2 [$tcp2 attach-app FTP]
  290.         
  291.     $self enable_tracequeue $ns_
  292.     $ns_ at 0.0 "$ftp1 start"
  293.     $ns_ at 3.0 "$ftp2 start"
  294.         
  295.     $self tcpDump $tcp1 5.0
  296.         
  297.     # trace only the bottleneck link
  298.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  299.     $ns_ at $stoptime "$self cleanupAll $testName_"
  300.         
  301.     $ns_ run
  302. }
  303. # "Red2" changes some of the RED gateway parameters.
  304. # This should give worse performance than "red1".
  305. Class Test/red2 -superclass TestSuite
  306. Test/red2 instproc init {} {
  307.     $self instvar net_ test_ guide_
  308.     set net_ net2
  309.     set test_ red2
  310.     set guide_ "RED, without ECN, with different parameters."
  311.     $self next
  312. }
  313. Test/red2 instproc run {} {
  314.     $self instvar ns_ node_ testName_ guide_
  315.     puts "Guide: $guide_"
  316.     $self setTopo
  317.     set stoptime 10.0
  318.     set redq [[$ns_ link $node_(r1) $node_(r2)] queue]
  319.     $redq set thresh_ 5
  320.     $redq set maxthresh_ 10
  321.     $redq set q_weight_ 0.003
  322.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  323.     $tcp1 set window_ 15
  324.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s3) 1]
  325.     $tcp2 set window_ 15
  326.     set ftp1 [$tcp1 attach-app FTP]
  327.     set ftp2 [$tcp2 attach-app FTP]
  328.     $self enable_tracequeue $ns_
  329.     $ns_ at 0.0 "$ftp1 start"
  330.     $ns_ at 3.0 "$ftp2 start"
  331.     $self tcpDump $tcp1 5.0
  332.     
  333.     # trace only the bottleneck link
  334.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  335.     $ns_ at $stoptime "$self cleanupAll $testName_"
  336.     $ns_ run
  337. }
  338. # The queue is measured in "packets".
  339. Class Test/red_twoway -superclass TestSuite
  340. Test/red_twoway instproc init {} {
  341.     $self instvar net_ test_ guide_
  342.     set net_ net2
  343.     set test_ red_twoway
  344.     set guide_ "RED, two-way traffic, queue measured in packets."
  345.     $self next
  346. }
  347. Test/red_twoway instproc run {} {
  348.     $self instvar ns_ node_ testName_ guide_
  349.     puts "Guide: $guide_"
  350.     $self setTopo
  351.     set stoptime 10.0
  352.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  353.     $tcp1 set window_ 15
  354.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s4) 1]
  355.     $tcp2 set window_ 15
  356.     set ftp1 [$tcp1 attach-app FTP]
  357.     set ftp2 [$tcp2 attach-app FTP]
  358.     set tcp3 [$ns_ create-connection TCP/Reno $node_(s3) TCPSink $node_(s1) 2]
  359.     $tcp3 set window_ 15
  360.     set tcp4 [$ns_ create-connection TCP/Reno $node_(s4) TCPSink $node_(s2) 3]
  361.     $tcp4 set window_ 15
  362.     set ftp3 [$tcp3 attach-app FTP]
  363.     set telnet1 [$tcp4 attach-app Telnet] ; $telnet1 set interval_ 0
  364.     $self enable_tracequeue $ns_
  365.     $ns_ at 0.0 "$ftp1 start"
  366.     $ns_ at 2.0 "$ftp2 start"
  367.     $ns_ at 3.5 "$ftp3 start"
  368.     $ns_ at 1.0 "$telnet1 start"
  369.     $self tcpDump $tcp1 5.0
  370.     # trace only the bottleneck link
  371.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  372.     $ns_ at $stoptime "$self cleanupAll $testName_"
  373.     $ns_ run
  374. }
  375. # The queue is measured in "bytes".
  376. Class Test/red_twowaybytes -superclass TestSuite
  377. Test/red_twowaybytes instproc init {} {
  378.     $self instvar net_ test_ guide_
  379.     set net_ net2
  380.     set test_ red_twowaybytes
  381.     set guide_ "RED, two-way traffic, queue measured in bytes."
  382.     Queue/RED set ns1_compat_ true
  383.     $self next
  384. }
  385. Test/red_twowaybytes instproc run {} {
  386.     $self instvar ns_ node_ testName_ guide_
  387.     puts "Guide: $guide_"
  388.     $self setTopo
  389.     set stoptime 10.0
  390.     set redq [[$ns_ link $node_(r1) $node_(r2)] queue]
  391.     $redq set bytes_ true
  392.     $redq set queue_in_bytes_ true
  393.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  394.     $tcp1 set window_ 15
  395.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s4) 1]
  396.     $tcp2 set window_ 15
  397.     set ftp1 [$tcp1 attach-app FTP]
  398.     set ftp2 [$tcp2 attach-app FTP]
  399.     set tcp3 [$ns_ create-connection TCP/Reno $node_(s3) TCPSink $node_(s1) 2]
  400.     $tcp3 set window_ 15
  401.     set tcp4 [$ns_ create-connection TCP/Reno $node_(s4) TCPSink $node_(s2) 3]
  402.     $tcp4 set window_ 15
  403.     set ftp3 [$tcp3 attach-app FTP]
  404.     set telnet1 [$tcp4 attach-app Telnet] ; $telnet1 set interval_ 0
  405.     $self enable_tracequeue $ns_
  406.     $ns_ at 0.0 "$ftp1 start"
  407.     $ns_ at 2.0 "$ftp2 start"
  408.     $ns_ at 3.5 "$ftp3 start"
  409.     $ns_ at 1.0 "$telnet1 start"
  410.     $self tcpDump $tcp1 5.0
  411.     # trace only the bottleneck link
  412.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  413.     $ns_ at $stoptime "$self cleanupAll $testName_"
  414.     $ns_ run
  415. }
  416. #
  417. #######################################################################
  418. TestSuite instproc create_flowstats {} {
  419. global flowfile flowchan
  420. $self instvar ns_ node_ r1fm_
  421. set r1fm_ [$ns_ makeflowmon Fid]
  422. set flowchan [open $flowfile w]
  423. $r1fm_ attach $flowchan
  424. $ns_ attach-fmon [$ns_ link $node_(r1) $node_(r2)] $r1fm_ 1
  425. }
  426. #
  427. # awk code used to produce:
  428. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  429. #       y axis: # drops for this flow+category / # drops this category [pkts]
  430. # (verified compatible for ns2 - kfall, 10/30/97)
  431. TestSuite instproc unforcedmakeawk { } {
  432.         set awkCode {
  433.             {
  434.                 if ($2 != prev) {
  435.                         print " "; print ""flow " $2;
  436. if ($13 > 0 && $14 > 0) {
  437.     print 100.0 * $9/$13, 100.0 * $10 / $14
  438. }
  439. prev = $2;
  440.                 } else if ($13 > 0 && $14 > 0) {
  441.                         print 100.0 * $9 / $13, 100.0 * $10 / $14
  442. }
  443.             }
  444.         }
  445.         return $awkCode
  446. }
  447. #
  448. # awk code used to produce:
  449. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  450. #       y axis: # drops for this flow+category / # drops this category [bytes]
  451. # (modified for compatibility with ns2 flowmon - kfall, 10/30/97)
  452. TestSuite instproc forcedmakeawk { } {
  453.         set awkCode {
  454.             BEGIN { print ""flow 0" }
  455.             {
  456.                 if ($2 != prev) {
  457.                         print " "; print ""flow " $2;
  458. if ($13 > 0 && ($17 - $15) > 0) {
  459. print 100.0 * $9/$13, 100.0 * ($19 - $11) / ($17 - $15);
  460. }
  461. prev = $2;
  462.                 } else if ($13 > 0 && ($17 - $15) > 0) {
  463.                         print 100.0 * $9 / $13, 100.0 * ($19 - $11) / ($17 - $15)
  464. }
  465.             }
  466.         }
  467.         return $awkCode
  468. }
  469. #
  470. # awk code used to produce:
  471. #      x axis: # arrivals for this flow+category / # total arrivals [bytes]
  472. #      y axis: # drops for this flow / # drops [pkts and bytes combined]
  473. TestSuite instproc allmakeawk { } {
  474.     set awkCode {
  475.         BEGIN {prev=-1; tot_bytes=0; tot_packets=0; forced_total=0; unforced_total=0}
  476.         {
  477.             if ($5 != prev) {
  478.                 print " "; print ""flow ",$5;
  479.                 prev = $5
  480.             }
  481.             tot_bytes = $19-$11;
  482.             forced_total= $16-$14;
  483.             tot_packets = $10;
  484.             tot_arrivals = $9;
  485.             unforced_total = $14;
  486.             if (unforced_total + forced_total > 0) {
  487.                 if ($14 > 0) {
  488.                     frac_packets = tot_packets/$14;
  489.                 }
  490.                 else { frac_packets = 0;}
  491.                 if ($17-$15 > 0) {
  492.                     frac_bytes = tot_bytes/($17-$15);
  493.                 }
  494.                 else {frac_bytes = 0;} 
  495.                 if ($13 > 0) {
  496.                     frac_arrivals = tot_arrivals/$13;
  497.                 }
  498.                 else {frac_arrivals = 0;}
  499.                 if (frac_packets + frac_bytes > 0) {
  500.                     unforced_total_part = frac_packets * unforced_total / ( unforced_total + forced_total)
  501.                     forced_total_part = frac_bytes * forced_total / ( unforced_total + forced_total)
  502.                     print 100.0 * frac_arrivals, 100.0 * ( unforced_total_part +forced_total_part)
  503.                 }
  504.             }
  505.         }
  506.     }
  507.     return $awkCode
  508. }
  509. TestSuite instproc create_flow_graph { graphtitle graphfile } {
  510.         global flowfile quiet
  511. $self instvar awkprocedure_
  512.         if {$quiet == "false"} {
  513. puts "awkprocedure: $awkprocedure_"
  514. }
  515.         set tmpfile1 /tmp/fg1[pid]
  516.         set tmpfile2 /tmp/fg2[pid]
  517.         exec rm -f $graphfile
  518.         set outdesc [open $graphfile w]
  519.         #
  520.         # this next part is xgraph specific
  521.         #
  522.         puts $outdesc "TitleText: $graphtitle"
  523.         puts $outdesc "Device: Postscript"
  524.         exec rm -f $tmpfile1 $tmpfile2
  525. if {$quiet == "false"} {
  526.          puts "writing flow xgraph data to $graphfile..."
  527. }
  528.         exec sort -n -k2 -k1 -o $flowfile $flowfile
  529.         exec awk [$self $awkprocedure_] $flowfile >@ $outdesc
  530.         close $outdesc
  531. }
  532. TestSuite instproc finish_flows testname {
  533. global flowgraphfile flowfile flowchan quiet
  534. $self instvar r1fm_
  535. $r1fm_ dump
  536. close $flowchan
  537. $self create_flow_graph $testname $flowgraphfile
  538. if {$quiet == "false"} {
  539. puts "running xgraph..."
  540. }
  541. exec cp $flowgraphfile temp.rands
  542. if {$quiet == "false"} {
  543. exec xgraph -bb -tk -nl -m -lx 0,100 -ly 0,100 -x "% of data bytes" -y "% of discards" $flowgraphfile &
  544. }
  545. exit 0
  546. }
  547. TestSuite instproc new_tcp { startTime source dest window fid verbose size } {
  548. $self instvar ns_
  549. set tcp [$ns_ create-connection TCP/Reno $source TCPSink $dest $fid]
  550. $tcp set window_ $window
  551. if {$size > 0}  {$tcp set packetSize_ $size }
  552. set ftp [$tcp attach-app FTP]
  553. $ns_ at $startTime "$ftp start"
  554. if {$verbose == "1"} {
  555.   $self tcpDumpAll $tcp 20.0 $fid 
  556. }
  557. }
  558. TestSuite instproc new_cbr { startTime source dest pktSize interval fid } {
  559. $self instvar ns_
  560.     set s_agent [new Agent/UDP]
  561.     set d_agent [new Agent/LossMonitor]
  562.     $s_agent set fid_ $fid 
  563.     $d_agent set fid_ $fid 
  564.     set cbr [new Application/Traffic/CBR]
  565.     $cbr attach-agent $s_agent
  566.     $ns_ attach-agent $source $s_agent
  567.     $ns_ attach-agent $dest $d_agent
  568.     $ns_ connect $s_agent $d_agent
  569.     if {$pktSize > 0} {
  570. $cbr set packetSize_ $pktSize
  571.     }
  572.     $cbr set rate_ [expr 8 * $pktSize / $interval]
  573.     $ns_ at $startTime "$cbr start"
  574. }
  575. TestSuite instproc dumpflows interval {
  576.     $self instvar dumpflows_inst_ ns_ r1fm_
  577.     $self instvar awkprocedure_ dump_pthresh_
  578.     global flowchan
  579.     if ![info exists dumpflows_inst_] {
  580.         set dumpflows_inst_ 1
  581.         $ns_ at 0.0 "$self dumpflows $interval"
  582.         return  
  583.     }
  584.     if { $awkprocedure_ == "unforcedmakeawk" } {
  585. set pcnt [$r1fm_ set epdrops_]
  586.     } elseif { $awkprocedure_ == "forcedmakeawk" } {
  587. set pcnt [expr [$r1fm_ set pdrops_] - [$r1fm_ set epdrops_]]
  588.     } elseif { $awkprocedure_ == "allmakeawk" } {
  589. set pcnt [$r1fm_ set pdrops_]
  590.     } else {
  591. puts stderr "unknown handling of flow dumps!"
  592. exit 1
  593.     }
  594.     if { $pcnt >= $dump_pthresh_ } {
  595.     $r1fm_ dump
  596.     flush $flowchan
  597.     foreach f [$r1fm_ flows] {
  598. $f reset
  599.     }
  600.     $r1fm_ reset
  601.     set interval 2.0
  602.     } else {
  603.     set interval 1.0
  604.     }
  605.     $ns_ at [expr [$ns_ now] + $interval] "$self dumpflows $interval"
  606. }   
  607. TestSuite instproc droptest { stoptime } {
  608. $self instvar ns_ node_ testName_ r1fm_ awkprocedure_
  609. set forwq [[$ns_ link $node_(r1) $node_(r2)] queue]
  610. set revq [[$ns_ link $node_(r2) $node_(r1)] queue]
  611. $forwq set mean_pktsize_ 1000
  612. $revq set mean_pktsize_ 1000
  613. $forwq set linterm_ 10
  614. $revq set linterm_ 10
  615. $forwq set limit_ 100
  616. $revq set limit_ 100
  617. $self create_flowstats 
  618. $self dumpflows 10.0
  619. $forwq set bytes_ true
  620. $forwq set queue_in_bytes_ true
  621. $forwq set wait_ false
  622.         $self new_tcp 1.0 $node_(s1) $node_(s3) 100 1 1 1000
  623. $self new_tcp 1.2 $node_(s2) $node_(s4) 100 2 1 50
  624. $self new_cbr 1.4 $node_(s1) $node_(s4) 190 0.003 3
  625. $ns_ at $stoptime "$self finish_flows $testName_"
  626. $ns_ run
  627. }
  628. Class Test/flows_unforced -superclass TestSuite
  629. Test/flows_unforced instproc init {} {
  630.     $self instvar net_ test_ guide_
  631.     set net_    net2   
  632.     set test_   flows_unforced
  633.     set guide_ "RED, sending rate vs. packet drop rate, unforced packet drops."
  634.     Queue/RED set gentle_ false
  635.     $self next noTraceFiles; # zero here means don't product all.tr
  636. }   
  637. Test/flows_unforced instproc run {} {
  638. $self instvar ns_ node_ testName_ r1fm_ awkprocedure_ guide_
  639.         puts "Guide: $guide_"
  640. $self instvar dump_pthresh_
  641. $self setTopo
  642.         set stoptime 500.0
  643. set testName_ test_flows_unforced
  644. set awkprocedure_ unforcedmakeawk
  645. set dump_pthresh_ 100
  646. $self droptest $stoptime
  647. }
  648. Class Test/flows_forced -superclass TestSuite
  649. Test/flows_forced instproc init {} {
  650.     $self instvar net_ test_ guide_
  651.     set net_    net2   
  652.     set test_   flows_forced
  653.     set guide_ "RED, sending rate vs. packet drop rate, forced packet drops."
  654.     Queue/RED set gentle_ false
  655.     $self next noTraceFiles; # zero here means don't product all.tr
  656. }   
  657. Test/flows_forced instproc run {} {
  658. $self instvar ns_ node_ testName_ r1fm_ awkprocedure_ guide_
  659.         puts "Guide: $guide_"
  660. $self instvar dump_pthresh_
  661. $self setTopo
  662.  
  663.         set stoptime 500.0
  664. set testName_ test_flows_forced
  665. set awkprocedure_ forcedmakeawk
  666. set dump_pthresh_ 100
  667. $self droptest $stoptime
  668. }
  669. Class Test/flows_combined -superclass TestSuite
  670. Test/flows_combined instproc init {} {
  671.     $self instvar net_ test_ guide_
  672.     set net_    net2   
  673.     set test_   flows_combined
  674.     set guide_ "RED, sending rate vs. packet drop rate, all packet drops."
  675.     Queue/RED set gentle_ false
  676.     $self next noTraceFiles; # zero here means don't product all.tr
  677. }   
  678. Test/flows_combined instproc run {} {
  679. $self instvar ns_ node_ testName_ r1fm_ awkprocedure_ guide_
  680. $self instvar dump_pthresh_
  681.         puts "Guide: $guide_"
  682. $self setTopo
  683.  
  684.         set stoptime 500.0
  685. set testName_ test_flows_combined
  686. set awkprocedure_ allmakeawk
  687. set dump_pthresh_ 100
  688. $self droptest $stoptime
  689. }
  690. #--------------------------------------------------------------
  691. TestSuite instproc printall { fmon } {
  692.         puts "total_drops [$fmon set pdrops_] total_packets [$fmon set pdepartures_]"
  693. }
  694. Class Test/ungentle -superclass TestSuite
  695. Test/ungentle instproc init {} {
  696.     $self instvar net_ test_ guide_
  697.     set net_ net3 
  698.     set test_ ungentle
  699.     set guide_ "RED, not gentle."
  700.     Queue/RED set gentle_ false
  701.     $self next
  702. }
  703. Test/ungentle instproc run {} {
  704.     $self instvar ns_ node_ testName_ net_ guide_
  705.     puts "Guide: $guide_"
  706.     $self setTopo
  707.     Agent/TCP set packetSize_ 1500
  708.     Agent/TCP set window_ 50
  709.     Queue/RED set bytes_ true
  710.     Agent/TCP set timerfix_ false
  711.     # The default is being changed to true.
  712.     set stoptime 40.0
  713.     set slink [$ns_ link $node_(r1) $node_(r2)]; # link to collect stats on
  714.     set fmon [$ns_ makeflowmon Fid]
  715.    #$ns_ attach-fmon $slink $fmon
  716.     $ns_ attach-fmon $slink $fmon 1
  717.     
  718.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  719.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 1]
  720.     $tcp2 set packetSize_ 1000
  721.     set tcp3 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 2]
  722.     set tcp4 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 3]
  723.     $tcp4 set packetSize_ 512
  724.     set tcp5 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 4]
  725.     set tcp6 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 5]
  726.     set tcp7 [$ns_ create-connection TCP/Sack1 $node_(s4) TCPSink/Sack1 $node_(s2) 6]
  727.     set tcp8 [$ns_ create-connection TCP/Sack1 $node_(s3) TCPSink/Sack1 $node_(s1) 7]
  728.     $tcp8 set packetSize_ 2000
  729.     set ftp1 [$tcp1 attach-app FTP]
  730.     set ftp2 [$tcp2 attach-app FTP]
  731.     set ftp3 [$tcp3 attach-app FTP]
  732.     set ftp4 [$tcp4 attach-app FTP]
  733.     set ftp5 [$tcp5 attach-app FTP]
  734.     set ftp6 [$tcp6 attach-app FTP]
  735.     set ftp7 [$tcp7 attach-app FTP]
  736.     set ftp8 [$tcp8 attach-app FTP]
  737.     $self enable_tracequeue $ns_
  738.     $ns_ at 0.0 "$ftp1 start"
  739.     $ns_ at 1.0 "$ftp2 start"
  740.     $ns_ at 5.0 "$ftp3 start"
  741.     $ns_ at 6.0 "$ftp4 start"
  742.     $ns_ at 9.0 "$ftp5 start"
  743.     $ns_ at 10.0 "$ftp6 start"
  744.     $ns_ at 13.0 "$ftp7 start"
  745.     $ns_ at 14.0 "$ftp8 start"
  746.     $ns_ at $stoptime "$self printall $fmon"
  747.     $self tcpDump $tcp1 5.0
  748.     # trace only the bottleneck link
  749.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  750.     $ns_ at $stoptime "$self cleanupAll $testName_"
  751.     $ns_ run
  752. }
  753. Class Test/gentle -superclass TestSuite
  754. Test/gentle instproc init {} {
  755.     $self instvar net_ test_ guide_
  756.     set net_ net3 
  757.     set test_ gentle
  758.     set guide_ "RED, gentle."
  759.     Queue/RED set gentle_ true
  760.     Test/gentle instproc run {} [Test/ungentle info instbody run ]
  761.     $self next
  762. }
  763. Class Test/gentleEcn -superclass TestSuite
  764. Test/gentleEcn instproc init {} {
  765.     $self instvar net_ test_ guide_
  766.     Queue/RED set setbit_ true
  767.     Agent/TCP set ecn_ 1
  768.     set net_ net3 
  769.     set test_ gentleEcn
  770.     set guide_ "RED, gentle, with ECN."
  771.     Queue/RED set gentle_ true
  772.     Test/gentleEcn instproc run {} [Test/ungentle info instbody run ]
  773.     $self next
  774. }
  775. Class Test/gentleEcn1 -superclass TestSuite
  776. Test/gentleEcn1 instproc init {} {
  777.     $self instvar net_ test_ guide_
  778.     Queue/RED set setbit_ true
  779.     Agent/TCP set ecn_ 1
  780.     set net_ net3 
  781.     set test_ gentleEcn1
  782.     set guide_ "RED, gentle, with ECN, with mark_p_ set to 0.1."
  783.     Queue/RED set gentle_ true
  784.     Queue/RED set mark_p_ 0.1
  785.     Queue/RED set use_mark_p_ true
  786.     Test/gentleEcn1 instproc run {} [Test/ungentle info instbody run ]
  787.     $self next
  788. }
  789. Class Test/ungentleBadParams -superclass TestSuite
  790. Test/ungentleBadParams instproc init {} {
  791.     $self instvar net_ test_ guide_
  792.     set net_ net3 
  793.     set test_ ungentleBadParams
  794.     set guide_ "RED, not gentle, bad RED parameters."
  795.     Queue/RED set gentle_ false
  796.     Queue/RED set linterm_ 50
  797.     Queue/RED set maxthresh_ 10
  798.     Test/ungentleBadParams instproc run {} [Test/ungentle info instbody run ]
  799.     $self next
  800. }
  801. Class Test/gentleBadParams -superclass TestSuite
  802. Test/gentleBadParams instproc init {} {
  803.     $self instvar net_ test_ guide_
  804.     set net_ net3 
  805.     set test_ gentleBadParams
  806.     Queue/RED set gentle_ true
  807.     set guide_ "RED, gentle, bad RED parameters."
  808.     Queue/RED set linterm_ 50
  809.     Queue/RED set maxthresh_ 10
  810.     Test/gentleBadParams instproc run {} [Test/ungentle info instbody run ]
  811.     $self next
  812. }
  813. Class Test/q_weight -superclass TestSuite
  814. Test/q_weight instproc init {} {
  815.     $self instvar net_ test_ guide_
  816.     set net_ net2 
  817.     set test_ q_weight
  818.     set guide_ "RED, q_weight set to 0.002."
  819.     $self next
  820. }
  821. Test/q_weight instproc run {} {
  822.     $self instvar ns_ node_ testName_ net_ guide_
  823.     puts "Guide: $guide_"
  824.     $self setTopo
  825.     $self mainSim Sack1
  826.     $ns_ run
  827. }
  828. Class Test/q_weight_auto -superclass TestSuite
  829. Test/q_weight_auto instproc init {} {
  830.     $self instvar net_ test_ guide_
  831.     set net_ net2 
  832.     set test_ q_weight_auto
  833.     Queue/RED set q_weight_ 0.0
  834.     set guide_ "RED, q_weight and maxthresh_ set automatically."
  835.     Queue/RED set maxthresh_ 0
  836.     Test/q_weight_auto instproc run {} [Test/q_weight info instbody run ]
  837.     $self next
  838. }
  839. # Class Test/q_weight1 -superclass TestSuite
  840. # Test/q_weight1 instproc init {} {
  841. #     $self instvar net_ test_ guide_
  842. #     set net_ net2 
  843. #     set test_ q_weight
  844. #     $self next
  845. # }
  846. # Test/q_weight1 instproc run {} {
  847. #     $self instvar ns_ node_ testName_ net_
  848. #     $self setTopo
  849. #     $ns_ at 0.0 "$ns_ bandwidth $node_(r1) $node_(r2) 100Mb duplex"
  850. #     $self mainSim Sack1 100
  851. #     $ns_ run
  852. # }
  853. # Class Test/q_weight1_auto -superclass TestSuite
  854. # Test/q_weight1_auto instproc init {} {
  855. #     $self instvar net_ test_ guide_
  856. #     set net_ net2 
  857. #     set test_ q_weight1_auto
  858. #     Queue/RED set q_weight_ 0.0
  859. #     Queue/RED set maxthresh_ 0
  860. #     Test/q_weight1_auto instproc run {} [Test/q_weight1 info instbody run ]
  861. #     $self next
  862. # }
  863. ##
  864. ## Packets are marked instead of dropped if the average queue is
  865. ## less than maxthresh.
  866. ##
  867. Class Test/congested -superclass TestSuite
  868. Test/congested instproc init {} {
  869.     $self instvar net_ test_ guide_
  870.     set net_ net3 
  871.     set test_ congested
  872.     set guide_ "RED, not gentle, ECN."
  873.     Queue/RED set use_mark_p_ false
  874.     $self next
  875. }
  876. Test/congested instproc run {} {
  877.     $self instvar ns_ node_ testName_ net_ guide_
  878.     puts "Guide: $guide_"
  879.     Agent/TCP set packetSize_ 1500
  880.     Agent/TCP set window_ 75
  881.     Agent/TCP set ecn_ 1
  882.     Queue/RED set bytes_ true
  883.     Queue/RED set gentle_ false
  884.     Queue/RED set setbit_ true
  885.     $self setTopo
  886.     # The default is being changed to true.
  887.     set stoptime 5.0
  888.     set slink [$ns_ link $node_(r1) $node_(r2)]; # link to collect stats on
  889.     set fmon [$ns_ makeflowmon Fid]
  890.    #$ns_ attach-fmon $slink $fmon
  891.     $ns_ attach-fmon $slink $fmon 1
  892.     
  893.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  894.     set ftp1 [$tcp1 attach-app FTP]
  895.     $self enable_tracequeue $ns_
  896.     $ns_ at 0.0 "$ftp1 start"
  897.     $ns_ at $stoptime "$self printall $fmon"
  898.     $self tcpDump $tcp1 5.0
  899.     # trace only the bottleneck link
  900.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  901.     $ns_ at $stoptime "$self cleanupAll $testName_"
  902.     $ns_ run
  903. }
  904. ##
  905. ## Packets are marked instead of dropped if the buffer is not full
  906. ##
  907. Class Test/congested_mark_p -superclass TestSuite
  908. Test/congested_mark_p instproc init {} {
  909.     $self instvar net_ test_ guide_
  910.     set net_ net3 
  911.     set test_ congested_mark_p
  912.     set guide_ "RED, not gentle, ECN.  Packets not dropped unless buffer full."
  913.     Queue/RED set mark_p_ 2.0
  914.     Queue/RED set use_mark_p_ true
  915.     Test/congested_mark_p instproc run {} [Test/congested info instbody run ]
  916.     $self next
  917. }
  918. ##
  919. ## Packets are marked instead of dropped if the drop probability
  920. ## is less than one.
  921. ##
  922. Class Test/congested1_mark_p -superclass TestSuite
  923. Test/congested1_mark_p instproc init {} {
  924.     $self instvar net_ test_ guide_
  925.     set net_ net3 
  926.     set test_ congested1_mark_p
  927.     set guide_ "RED, gentle, ECN.  Packets sometimes dropped instead of marked."
  928.     Queue/RED set mark_p_ 1.0
  929.     Queue/RED set use_mark_p_ true
  930.     $self next
  931. }
  932. Test/congested1_mark_p instproc run {} {
  933.     $self instvar ns_ node_ testName_ net_ guide_
  934.     puts "Guide: $guide_"
  935.     Agent/TCP set packetSize_ 1500
  936.     Agent/TCP set window_ 1000
  937.     Agent/TCP set ecn_ 1
  938.     Queue/RED set bytes_ true
  939.     Queue/RED set gentle_ true
  940.     Queue/RED set setbit_ true
  941.     $self setTopo
  942.     # The default is being changed to true.
  943.     set stoptime 5.0
  944.     set slink [$ns_ link $node_(r1) $node_(r2)]; # link to collect stats on
  945.     set fmon [$ns_ makeflowmon Fid]
  946.    #$ns_ attach-fmon $slink $fmon
  947.     $ns_ attach-fmon $slink $fmon 1
  948.     
  949.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  950.     set ftp1 [$tcp1 attach-app FTP]
  951.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s4) 0]
  952.     set ftp2 [$tcp2 attach-app FTP]
  953.     $self enable_tracequeue $ns_
  954.     $ns_ at 0.0 "$ftp1 start"
  955.     $ns_ at 0.2 "$ftp2 start"
  956.     $ns_ at $stoptime "$self printall $fmon"
  957.     $self tcpDump $tcp1 5.0
  958.     # trace only the bottleneck link
  959.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  960.     $ns_ at $stoptime "$self cleanupAll $testName_"
  961.     $ns_ run
  962. }
  963. ##
  964. ## Packets are marked instead of dropped if the buffer is not full.
  965. ##
  966. Class Test/congested2_mark_p -superclass TestSuite
  967. Test/congested2_mark_p instproc init {} {
  968.     $self instvar net_ test_ guide_
  969.     set net_ net3 
  970.     set test_ congested2_mark_p
  971.     set guide_ "RED, gentle, ECN.  Packets not dropped unless buffer full."
  972.     Queue/RED set mark_p_ 2.0
  973.     Queue/RED set use_mark_p_ true
  974.     Test/congested2_mark_p instproc run {} [Test/congested1_mark_p info instbody run ]
  975.     $self next
  976. }
  977. TestSuite runTest