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

通讯编程

开发平台:

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-rio.tcl,v 1.19 2006/01/24 23:00:07 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 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. Queue/RED set bytes_ false              
  56. # default changed on 10/11/2004.
  57. Queue/RED set queue_in_bytes_ false
  58. # default changed on 10/11/2004.
  59. Queue/RED set q_weight_ 0.002
  60. Queue/RED set thresh_ 5 
  61. Queue/RED set maxthresh_ 15
  62. # The RED parameter defaults are being changed for automatic configuration.
  63. Agent/TCP set useHeaders_ false
  64. # The default is being changed to useHeaders_ true.
  65. Agent/TCP set windowInit_ 1
  66. # The default is being changed to 2.
  67. Agent/TCP set singledup_ 0
  68. # The default is being changed to 1
  69. catch "cd $dir"
  70. Agent/TCP set oldCode_ true
  71. Agent/TCP set minrto_ 0
  72. # The default is being changed to minrto_ 1
  73. Agent/TCP set syn_ false
  74. Agent/TCP set delay_growth_ false
  75. # In preparation for changing the default values for syn_ and delay_growth_.
  76. set flowfile fairflow.tr; # file where flow data is written
  77. set flowgraphfile fairflow.xgr; # file given to graph tool 
  78. TestSuite instproc finish file {
  79. global quiet PERL
  80. $self instvar ns_ tchan_ testName_
  81.         exec $PERL ../../bin/getrc -s 2 -d 3 all.tr | 
  82.           $PERL ../../bin/raw2xg -a -s 0.01 -m 90 -t $file > temp.rands
  83. if {$quiet == "false"} {
  84.          exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
  85. }
  86.         ## now use default graphing tool to make a data file
  87.         ## if so desired
  88. if { [info exists tchan_] && $quiet == "false" } {
  89. $self plotQueue $testName_
  90. }
  91. $ns_ halt
  92. }
  93. TestSuite instproc enable_tracequeue ns {
  94. $self instvar tchan_ node_
  95. set redq [[$ns link $node_(r1) $node_(r2)] queue]
  96. set tchan_ [open all.q w]
  97. $redq trace curq_
  98. $redq trace ave_
  99. $redq attach $tchan_
  100. }
  101. Class Topology
  102. Topology instproc node? num {
  103.     $self instvar node_
  104.     return $node_($num)
  105. }
  106. Class Topology/net2 -superclass Topology
  107. Topology/net2 instproc init ns {
  108.     $self instvar node_
  109.     set node_(s1) [$ns node]
  110.     set node_(s2) [$ns node]    
  111.     set node_(r1) [$ns node]    
  112.     set node_(r2) [$ns node]    
  113.     set node_(s3) [$ns node]    
  114.     set node_(s4) [$ns node]    
  115.     $self next 
  116.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 2ms DropTail
  117.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 3ms DropTail
  118.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms RED/RIO
  119.     #$ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms RED
  120.     $ns queue-limit $node_(r1) $node_(r2) 100
  121.     $ns queue-limit $node_(r2) $node_(r1) 100
  122.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 4ms DropTail
  123.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 5ms DropTail
  124.  
  125.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  126.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  127.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  128.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  129.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  130.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  131.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  132. }   
  133. TestSuite instproc plotQueue file {
  134. global quiet
  135. $self instvar tchan_
  136. #
  137. # Plot the queue size and average queue size, for RED gateways.
  138. #
  139. set awkCode {
  140. {
  141. if ($1 == "Q" && NF>2) {
  142. print $2, $3 >> "temp.q";
  143. set end $2
  144. }
  145. else if ($1 == "a" && NF>2)
  146. print $2, $3 >> "temp.a";
  147. }
  148. }
  149. set f [open temp.queue w]
  150. puts $f "TitleText: $file"
  151. puts $f "Device: Postscript"
  152. if { [info exists tchan_] } {
  153. close $tchan_
  154. }
  155. exec rm -f temp.q temp.a 
  156. exec touch temp.a temp.q
  157. exec awk $awkCode all.q
  158. puts $f "queue
  159. exec cat temp.q >@ $f  
  160. puts $f n"ave_queue
  161. exec cat temp.a >@ $f
  162. ###puts $f n"thresh
  163. ###puts $f 0 [[ns link $r1 $r2] get thresh]
  164. ###puts $f $end [[ns link $r1 $r2] get thresh]
  165. close $f
  166. if {$quiet == "false"} {
  167. exec xgraph -bb -tk -x time -y queue temp.queue &
  168. }
  169. }
  170. TestSuite instproc tcpDumpAll { tcpSrc interval label } {
  171.     global quiet
  172.     $self instvar dump_inst_ ns_
  173.     if ![info exists dump_inst_($tcpSrc)] {
  174. set dump_inst_($tcpSrc) 1
  175. set report $label/window=[$tcpSrc set window_]/packetSize=[$tcpSrc set packetSize_]
  176. if {$quiet == "false"} {
  177. puts $report
  178. }
  179. $ns_ at 0.0 "$self tcpDumpAll $tcpSrc $interval $label"
  180. return
  181.     }
  182.     $ns_ at [expr [$ns_ now] + $interval] "$self tcpDumpAll $tcpSrc $interval $label"
  183.     set report time=[$ns_ now]/class=$label/ack=[$tcpSrc set ack_]/packets_resent=[$tcpSrc set nrexmitpack_]
  184.     if {$quiet == "false"} {
  185.      puts $report
  186.     }
  187. }       
  188. #
  189. # This test uses priority_method_ 1, so that flows with FlowID 0 have
  190. # priority over other flows.
  191. # OUT packets are dropped before any IN packets are dropped.
  192. #
  193. Class Test/strict -superclass TestSuite
  194. Test/strict instproc init {} {
  195.     $self instvar net_ test_
  196.     set net_ net2 
  197.     set test_ strict
  198.     Queue/RED/RIO set in_thresh_ 10
  199.     Queue/RED/RIO set in_maxthresh_ 20
  200.     Queue/RED/RIO set out_thresh_ 3
  201.     Queue/RED/RIO set out_maxthresh_ 9
  202.     Queue/RED/RIO set in_linterm_ 10
  203.     Queue/RED/RIO set linterm_ 10
  204.     Queue/RED/RIO set priority_method_ 1
  205.     #Queue/RED/RIO set debug_ true
  206.     Queue/RED/RIO set debug_ false
  207.     $self next pktTraceFile
  208. }
  209. Test/strict instproc run {} {
  210.     $self instvar ns_ node_ testName_ net_
  211.     $self setTopo
  212.     set stoptime 20.0
  213.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  214.     $tcp1 set window_ 50
  215.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 1]
  216.     $tcp2 set window_ 50
  217.     set ftp1 [$tcp1 attach-app FTP]
  218.     set ftp2 [$tcp2 attach-app FTP]
  219.     $self enable_tracequeue $ns_
  220.     $ns_ at 0.0 "$ftp1 start"
  221.     $ns_ at 1.0 "$ftp2 start"
  222.     $self tcpDump $tcp1 5.0
  223.     # trace only the bottleneck link
  224.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  225.     $ns_ at $stoptime "$self cleanupAll $testName_"
  226.     $ns_ run
  227. }
  228. #
  229. # OUT packets are four times more likely to be dropped than IN packets. 
  230. #
  231. Class Test/proportional -superclass TestSuite
  232. Test/proportional instproc init {} {
  233.     $self instvar net_ test_
  234.     set net_ net2 
  235.     set test_ proportional
  236.     Queue/RED/RIO set in_thresh_ 3
  237.     Queue/RED/RIO set in_maxthresh_ 15
  238.     Queue/RED/RIO set out_thresh_ 3
  239.     Queue/RED/RIO set out_maxthresh_ 15
  240.     Queue/RED/RIO set in_linterm_ 3
  241.     Queue/RED/RIO set linterm_ 12
  242.     Queue/RED/RIO set priority_method_ 1
  243.     Test/proportional instproc run {} [Test/strict info instbody run]
  244.     $self next pktTraceFile
  245. }
  246. #
  247. # OUT packets are four times more likely to be dropped than IN packets. 
  248. #
  249. Class Test/gentle -superclass TestSuite
  250. Test/gentle instproc init {} {
  251.     $self instvar net_ test_
  252.     set net_ net2 
  253.     set test_ gentle
  254.     Queue/RED/RIO set in_thresh_ 3
  255.     Queue/RED/RIO set in_maxthresh_ 15
  256.     Queue/RED/RIO set out_thresh_ 3
  257.     Queue/RED/RIO set out_maxthresh_ 15
  258.     Queue/RED/RIO set in_linterm_ 50
  259.     Queue/RED/RIO set linterm_ 200
  260.     Queue/RED/RIO set priority_method_ 1
  261.     Queue/RED/RIO set gentle_ false
  262.     Queue/RED/RIO set in_gentle_ true
  263.     Queue/RED/RIO set out_gentle_ true
  264.     Test/gentle instproc run {} [Test/strict info instbody run]
  265.     $self next pktTraceFile
  266. }
  267. #
  268. # OUT packets are four times more likely to be dropped than IN packets. 
  269. #
  270. Class Test/notGentle -superclass TestSuite
  271. Test/notGentle instproc init {} {
  272.     $self instvar net_ test_
  273.     set net_ net2 
  274.     set test_ notGentle
  275.     Queue/RED/RIO set in_thresh_ 3
  276.     Queue/RED/RIO set in_maxthresh_ 15
  277.     Queue/RED/RIO set out_thresh_ 3
  278.     Queue/RED/RIO set out_maxthresh_ 15
  279.     Queue/RED/RIO set in_linterm_ 50
  280.     Queue/RED/RIO set linterm_ 200
  281.     Queue/RED/RIO set priority_method_ 1
  282.     Queue/RED/RIO set gentle_ false
  283.     Queue/RED/RIO set in_gentle_ false
  284.     Queue/RED/RIO set out_gentle_ false
  285.     Test/notGentle instproc run {} [Test/strict info instbody run]
  286.     $self next pktTraceFile
  287. }
  288. #
  289. # This test uses priority_method_ 0, with token bucket policing
  290. # and tagging.
  291. #
  292. Class Test/tagging -superclass TestSuite
  293. Test/tagging instproc init {} {
  294.     $self instvar net_ test_
  295.     set net_ net2 
  296.     set test_ tagging
  297.     Queue/RED/RIO set in_thresh_ 10
  298.     Queue/RED/RIO set in_maxthresh_ 20
  299.     Queue/RED/RIO set out_thresh_ 3
  300.     Queue/RED/RIO set out_maxthresh_ 9
  301.     Queue/RED/RIO set in_linterm_ 10
  302.     Queue/RED/RIO set linterm_ 10
  303.     Queue/RED/RIO set priority_method_ 0
  304.     $self next pktTraceFile
  305. }
  306. Test/tagging instproc run {} {
  307.     $self instvar ns_ node_ testName_ net_
  308.     $self setTopo
  309.     set stoptime 20.0
  310.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  311.     $tcp1 set window_ 50
  312.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 1]
  313.     $tcp2 set window_ 50
  314.     set ftp1 [$tcp1 attach-app FTP]
  315.     set ftp2 [$tcp2 attach-app FTP]
  316.     # make token bucket limiter for flow 0
  317.     # Fill rate 100000 Bps, or 100 packets per second.
  318.     set link1 [$ns_ link $node_(s1) $node_(r1)]
  319.     set tcm1 [$ns_ maketbtagger Fid]
  320.     $ns_ attach-tagger $link1 $tcm1
  321.     set fcl1 [$tcm1 classifier]; # flow classifier
  322.     $fcl1 set-flowrate 0 100000 10000 1
  323.     #target_rate_ (fill rate, in Bps), 
  324.     #bucket_depth_, 
  325.     #tbucket_ (current bucket size, in bytes) 
  326.     
  327.     # make token bucket limiter for flow 1
  328.     # Fill rate 1000000 Bps, or 1000 packets per second.
  329.     set link2 [$ns_ link $node_(s2) $node_(r1)]
  330.     set tcm2 [$ns_ maketbtagger Fid]
  331.     $ns_ attach-tagger $link2 $tcm2
  332.     set fcl2 [$tcm2 classifier]; # flow classifier
  333.     $fcl2 set-flowrate 1 1000000 10000 1
  334.     $self enable_tracequeue $ns_
  335.     $ns_ at 0.0 "$ftp1 start"
  336.     $ns_ at 1.0 "$ftp2 start"
  337.     $self tcpDump $tcp1 5.0
  338.     # trace only the bottleneck link
  339.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  340.     $ns_ at $stoptime "$self cleanupAll $testName_"
  341.     $ns_ run
  342. }
  343. TestSuite runTest