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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 2001  International Computer Science Institute
  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 ACIRI, the AT&T
  16. #      Center for Internet Research at ICSI (the International Computer
  17. #      Science Institute).
  18. # 4. Neither the name of ACIRI nor of ICSI may be used
  19. #    to endorse or promote products derived from this software without
  20. #    specific prior written permission.
  21. #
  22. # THIS SOFTWARE IS PROVIDED BY ICSI AND CONTRIBUTORS ``AS IS'' AND
  23. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. # ARE DISCLAIMED.  IN NO EVENT SHALL ICSI OR CONTRIBUTORS BE LIABLE
  26. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32. # SUCH DAMAGE.
  33. #
  34. # To run all tests: test-all-pi
  35. set dir [pwd]
  36. catch "cd tcl/test"
  37. source misc_simple.tcl
  38. remove-all-packet-headers       ; # removes all except common
  39. add-packet-header Flags IP TCP  ; # hdrs reqd for validation test
  40.  
  41. # FOR UPDATING GLOBAL DEFAULTS:
  42. Agent/TCP set precisionReduce_ false ;   # default changed on 2006/1/24.
  43. Agent/TCP set rtxcur_init_ 6.0 ;      # Default changed on 2006/01/21
  44. Agent/TCP set updated_rttvar_ false ;  # Variable added on 2006/1/21
  45. Agent/TCP set tcpTick_ 0.1
  46. # The default for tcpTick_ is being changed to reflect a changing reality.
  47. Agent/TCP set rfc2988_ false
  48. # The default for rfc2988_ is being changed to true.
  49. Agent/TCP set useHeaders_ false
  50. # The default is being changed to useHeaders_ true.
  51. Agent/TCP set windowInit_ 1
  52. # The default is being changed to 2.
  53. Agent/TCP set singledup_ 0
  54. # The default is being changed to 1
  55. catch "cd $dir"
  56. #Agent/TCP set oldCode_ true
  57. Agent/TCP set minrto_ 0
  58. # The default is being changed to minrto_ 1
  59. Agent/TCP set syn_ false
  60. Agent/TCP set delay_growth_ false
  61. # In preparation for changing the default values for syn_ and delay_growth_.
  62. Agent/TCP set exitFastRetrans_ false
  63. set flowfile fairflow.tr; # file where flow data is written
  64. set flowgraphfile fairflow.xgr; # file given to graph tool 
  65. TestSuite instproc finish file {
  66. global quiet PERL
  67. $self instvar ns_ tchan_ testName_
  68.         exec $PERL ../../bin/getrc -s 2 -d 3 all.tr | 
  69.           $PERL ../../bin/raw2xg -a -s 0.01 -m 90 -t $file > temp.rands
  70. if {$quiet == "false"} {
  71.          exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
  72. }
  73.         ## now use default graphing tool to make a data file
  74.         ## if so desired
  75. if { [info exists tchan_] && $quiet == "false" } {
  76. $self plotQueue $testName_
  77. }
  78. $ns_ halt
  79. }
  80. TestSuite instproc enable_tracequeue ns {
  81. $self instvar tchan_ node_
  82. set piq [[$ns link $node_(r1) $node_(r2)] queue]
  83. set tchan_ [open all.q w]
  84. $piq trace curq_
  85. $piq attach $tchan_
  86. }
  87. Class Topology
  88. Topology instproc node? num {
  89.     $self instvar node_
  90.     return $node_($num)
  91. }
  92. Class Topology/net2 -superclass Topology
  93. Topology/net2 instproc init ns {
  94.     $self instvar node_
  95.     set node_(s1) [$ns node]
  96.     set node_(s2) [$ns node]    
  97.     set node_(r1) [$ns node]    
  98.     set node_(r2) [$ns node]    
  99.     set node_(s3) [$ns node]    
  100.     set node_(s4) [$ns node]    
  101.     $self next 
  102.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 2ms DropTail
  103.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 3ms DropTail
  104.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms PI
  105.     $ns queue-limit $node_(r1) $node_(r2) 25
  106.     $ns queue-limit $node_(r2) $node_(r1) 25
  107.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 4ms DropTail
  108.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 5ms DropTail
  109.  
  110.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  111.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  112.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  113.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  114.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  115.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  116.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  117. }   
  118. Class Topology/net3 -superclass Topology
  119. Topology/net3 instproc init ns {
  120.     $self instvar node_
  121.     set node_(s1) [$ns node]
  122.     set node_(s2) [$ns node]    
  123.     set node_(r1) [$ns node]    
  124.     set node_(r2) [$ns node]    
  125.     set node_(s3) [$ns node]    
  126.     set node_(s4) [$ns node]    
  127.     $self next 
  128.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 0ms DropTail
  129.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 1ms DropTail
  130.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 10ms PI
  131.     $ns queue-limit $node_(r1) $node_(r2) 100
  132.     $ns queue-limit $node_(r2) $node_(r1) 100
  133.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 2ms DropTail
  134.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 3ms DropTail
  135.  
  136.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  137.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  138.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  139.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  140.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  141.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  142.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  143. }   
  144. TestSuite instproc plotQueue file {
  145. global quiet
  146. $self instvar tchan_
  147. #
  148. # Plot the queue size and average queue size, for PI gateways.
  149. #
  150. set awkCode {
  151. {
  152. if ($1 == "Q" && NF>2) {
  153. print $2, $3 >> "temp.q";
  154. set end $2
  155. }
  156. }
  157. }
  158. set f [open temp.queue w]
  159. puts $f "TitleText: $file"
  160. puts $f "Device: Postscript"
  161. if { [info exists tchan_] } {
  162. close $tchan_
  163. }
  164. exec rm -f temp.q
  165. exec touch temp.q
  166. exec awk $awkCode all.q
  167. puts $f "queue
  168. exec cat temp.q >@ $f  
  169. close $f
  170. if {$quiet == "false"} {
  171. exec xgraph -bb -tk -x time -y queue temp.queue &
  172. }
  173. }
  174. TestSuite instproc tcpDumpAll { tcpSrc interval label } {
  175.     global quiet
  176.     $self instvar dump_inst_ ns_
  177.     if ![info exists dump_inst_($tcpSrc)] {
  178. set dump_inst_($tcpSrc) 1
  179. set report $label/window=[$tcpSrc set window_]/packetSize=[$tcpSrc set packetSize_]
  180. if {$quiet == "false"} {
  181. puts $report
  182. }
  183. $ns_ at 0.0 "$self tcpDumpAll $tcpSrc $interval $label"
  184. return
  185.     }
  186.     $ns_ at [expr [$ns_ now] + $interval] "$self tcpDumpAll $tcpSrc $interval $label"
  187.     set report time=[$ns_ now]/class=$label/ack=[$tcpSrc set ack_]/packets_resent=[$tcpSrc set nrexmitpack_]
  188.     if {$quiet == "false"} {
  189.      puts $report
  190.     }
  191. }       
  192. Class Test/pi1 -superclass TestSuite
  193. Test/pi1 instproc init {} {
  194.     $self instvar net_ test_
  195.     set net_ net2 
  196.     set test_ pi1
  197.     $self next pktTraceFile
  198. }
  199. Test/pi1 instproc run {} {
  200.     $self instvar ns_ node_ testName_ net_
  201.     $self setTopo
  202.     set piq [[$ns_ link $node_(r1) $node_(r2)] queue]
  203. $piq set a_ 0.00743488595689 
  204. $piq set b_ 0.00736090699216 
  205. $piq set w_ 4.353741496598639e+02 
  206. $piq set qref_ 6 
  207.     set stoptime 10.0
  208.     
  209.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  210.     $tcp1 set window_ 15
  211.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s3) 1]
  212.     $tcp2 set window_ 15
  213.     set ftp1 [$tcp1 attach-app FTP]
  214.     set ftp2 [$tcp2 attach-app FTP]
  215.     $self enable_tracequeue $ns_
  216.     $ns_ at 0.0 "$ftp1 start"
  217.     $ns_ at 3.0 "$ftp2 start"
  218.     $self tcpDump $tcp1 5.0
  219.     # trace only the bottleneck link
  220.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  221.     $ns_ at $stoptime "$self cleanupAll $testName_"
  222.     $ns_ run
  223. }
  224. Class Test/ecn -superclass TestSuite
  225. Test/ecn instproc init {} {
  226.     $self instvar net_ test_
  227.     Queue/PI set setbit_ true
  228.     Agent/TCP set old_ecn_ 1
  229.     set net_ net2
  230.     set test_ ecn
  231.     $self next pktTraceFile
  232. }
  233. Test/ecn instproc run {} {
  234.     $self instvar ns_ node_ testName_
  235.     $self setTopo 
  236.     set stoptime 10.0
  237.     set piq [[$ns_ link $node_(r1) $node_(r2)] queue]
  238. $piq set a_ 0.00743488595689 
  239. $piq set b_ 0.00736090699216 
  240. $piq set w_ 4.353741496598639e+02 
  241. $piq set qref_ 6 
  242.     $piq set setbit_ true
  243.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  244.     $tcp1 set window_ 15
  245.     $tcp1 set ecn_ 1
  246.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s3) 1]
  247.     $tcp2 set window_ 15
  248.     $tcp2 set ecn_ 1
  249.         
  250.     set ftp1 [$tcp1 attach-app FTP]
  251.     set ftp2 [$tcp2 attach-app FTP]
  252.         
  253.     $self enable_tracequeue $ns_
  254.     $ns_ at 0.0 "$ftp1 start"
  255.     $ns_ at 3.0 "$ftp2 start"
  256.         
  257.     $self tcpDump $tcp1 5.0
  258.         
  259.     # trace only the bottleneck link
  260.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  261.     $ns_ at $stoptime "$self cleanupAll $testName_"
  262.         
  263.     $ns_ run
  264. }
  265. Class Test/pi2 -superclass TestSuite
  266. Test/pi2 instproc init {} {
  267.     $self instvar net_ test_
  268.     set net_ net3
  269.     set test_ pi2
  270.     $self next pktTraceFile
  271. }
  272. Test/pi2 instproc run {} {
  273.     $self instvar ns_ node_ testName_
  274.     $self setTopo
  275.     set stoptime 10.0
  276.     set piq [[$ns_ link $node_(r1) $node_(r2)] queue]
  277. $piq set a_ 0.11086249861225 
  278. $piq set b_ 0.10975938917335 
  279. $piq set w_ 2.370370370370370e+03 
  280. $piq set qref_ 50
  281.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  282.     $tcp1 set window_ 100 
  283.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s3) 1]
  284.     $tcp2 set window_ 100
  285.     set ftp1 [$tcp1 attach-app FTP]
  286.     set ftp2 [$tcp2 attach-app FTP]
  287.     $self enable_tracequeue $ns_
  288.     $ns_ at 0.0 "$ftp1 start"
  289.     $ns_ at 3.0 "$ftp2 start"
  290.     $self tcpDump $tcp1 5.0
  291.     
  292.     # trace only the bottleneck link
  293.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  294.     $ns_ at $stoptime "$self cleanupAll $testName_"
  295.     $ns_ run
  296. }
  297. # The queue is measupi in "packets".
  298. Class Test/pi_twoway -superclass TestSuite
  299. Test/pi_twoway instproc init {} {
  300.     $self instvar net_ test_
  301.     set net_ net3
  302.     set test_ pi_twoway
  303.     $self next pktTraceFile
  304. }
  305. Test/pi_twoway instproc run {} {
  306.     $self instvar ns_ node_ testName_
  307.     $self setTopo
  308.     set stoptime 10.0
  309.     set piq [[$ns_ link $node_(r1) $node_(r2)] queue]
  310. $piq set a_ 0.01198611957431 
  311. $piq set b_ 0.01186685470289 
  312. $piq set w_ 5.925925925925926e+02 
  313. $piq set qref_ 20
  314.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  315.     $tcp1 set window_ 100 
  316.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s4) 1]
  317.     $tcp2 set window_ 100 
  318.     set ftp1 [$tcp1 attach-app FTP]
  319.     set ftp2 [$tcp2 attach-app FTP]
  320.     set tcp3 [$ns_ create-connection TCP/Reno $node_(s3) TCPSink $node_(s1) 2]
  321.     $tcp3 set window_ 100 
  322.     set tcp4 [$ns_ create-connection TCP/Reno $node_(s4) TCPSink $node_(s2) 3]
  323.     $tcp4 set window_ 100 
  324.     set ftp3 [$tcp3 attach-app FTP]
  325.     set telnet1 [$tcp4 attach-app Telnet] ; $telnet1 set interval_ 0
  326.     $self enable_tracequeue $ns_
  327.     $ns_ at 0.0 "$ftp1 start"
  328.     $ns_ at 2.0 "$ftp2 start"
  329.     $ns_ at 3.5 "$ftp3 start"
  330.     $ns_ at 1.0 "$telnet1 start"
  331.     $self tcpDump $tcp1 5.0
  332.     # trace only the bottleneck link
  333.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  334.     $ns_ at $stoptime "$self cleanupAll $testName_"
  335.     $ns_ run
  336. }
  337. # The queue is measupi in "bytes".
  338. Class Test/pi_twowaybytes -superclass TestSuite
  339. Test/pi_twowaybytes instproc init {} {
  340.     $self instvar net_ test_
  341.     set net_ net2
  342.     set test_ pi_twowaybytes
  343.     $self next pktTraceFile
  344. }
  345. Test/pi_twowaybytes instproc run {} {
  346.     $self instvar ns_ node_ testName_
  347.     $self setTopo
  348.     set stoptime 10.0
  349.     set piq [[$ns_ link $node_(r1) $node_(r2)] queue]
  350.     $piq set bytes_ true
  351.     $piq set queue_in_bytes_ true
  352. $piq set a_ 0.00743488595689 
  353. $piq set b_ 0.00736090699216 
  354. $piq set w_ 4.353741496598639e+02 
  355. $piq set qref_ 6 
  356.     set tcp1 [$ns_ create-connection TCP/Reno $node_(s1) TCPSink $node_(s3) 0]
  357.     $tcp1 set window_ 15
  358.     set tcp2 [$ns_ create-connection TCP/Reno $node_(s2) TCPSink $node_(s4) 1]
  359.     $tcp2 set window_ 15
  360.     set ftp1 [$tcp1 attach-app FTP]
  361.     set ftp2 [$tcp2 attach-app FTP]
  362.     set tcp3 [$ns_ create-connection TCP/Reno $node_(s3) TCPSink $node_(s1) 2]
  363.     $tcp3 set window_ 15
  364.     set tcp4 [$ns_ create-connection TCP/Reno $node_(s4) TCPSink $node_(s2) 3]
  365.     $tcp4 set window_ 15
  366.     set ftp3 [$tcp3 attach-app FTP]
  367.     set telnet1 [$tcp4 attach-app Telnet] ; $telnet1 set interval_ 0
  368.     $self enable_tracequeue $ns_
  369.     $ns_ at 0.0 "$ftp1 start"
  370.     $ns_ at 2.0 "$ftp2 start"
  371.     $ns_ at 3.5 "$ftp3 start"
  372.     $ns_ at 1.0 "$telnet1 start"
  373.     $self tcpDump $tcp1 5.0
  374.     # trace only the bottleneck link
  375.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  376.     $ns_ at $stoptime "$self cleanupAll $testName_"
  377.     $ns_ run
  378. }
  379. #
  380. #######################################################################
  381. TestSuite instproc create_flowstats {} {
  382. global flowfile flowchan
  383. $self instvar ns_ node_ r1fm_
  384. set r1fm_ [$ns_ makeflowmon Fid]
  385. set flowchan [open $flowfile w]
  386. $r1fm_ attach $flowchan
  387. $ns_ attach-fmon [$ns_ link $node_(r1) $node_(r2)] $r1fm_ 1
  388. }
  389. #
  390. # awk code used to produce:
  391. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  392. #       y axis: # drops for this flow+category / # drops this category [pkts]
  393. # (verified compatible for ns2 - kfall, 10/30/97)
  394. TestSuite instproc unforcedmakeawk { } {
  395.         set awkCode {
  396.             {
  397.                 if ($2 != prev) {
  398.                         print " "; print ""flow " $2;
  399. if ($13 > 0 && $14 > 0) {
  400.     print 100.0 * $9/$13, 100.0 * $10 / $14
  401. }
  402. prev = $2;
  403.                 } else if ($13 > 0 && $14 > 0) {
  404.                         print 100.0 * $9 / $13, 100.0 * $10 / $14
  405. }
  406.             }
  407.         }
  408.         return $awkCode
  409. }
  410. #
  411. # awk code used to produce:
  412. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  413. #       y axis: # drops for this flow+category / # drops this category [bytes]
  414. # (modified for compatibility with ns2 flowmon - kfall, 10/30/97)
  415. TestSuite instproc forcedmakeawk { } {
  416.         set awkCode {
  417.             BEGIN { print ""flow 0" }
  418.             {
  419.                 if ($2 != prev) {
  420.                         print " "; print ""flow " $2;
  421. if ($13 > 0 && ($17 - $15) > 0) {
  422. print 100.0 * $9/$13, 100.0 * ($19 - $11) / ($17 - $15);
  423. }
  424. prev = $2;
  425.                 } else if ($13 > 0 && ($17 - $15) > 0) {
  426.                         print 100.0 * $9 / $13, 100.0 * ($19 - $11) / ($17 - $15)
  427. }
  428.             }
  429.         }
  430.         return $awkCode
  431. }
  432. #
  433. # awk code used to produce:
  434. #      x axis: # arrivals for this flow+category / # total arrivals [bytes]
  435. #      y axis: # drops for this flow / # drops [pkts and bytes combined]
  436. TestSuite instproc allmakeawk { } {
  437.     set awkCode {
  438.         BEGIN {prev=-1; tot_bytes=0; tot_packets=0; forced_total=0; unforced_total=0}
  439.         {
  440.             if ($5 != prev) {
  441.                 print " "; print ""flow ",$5;
  442.                 prev = $5
  443.             }
  444.             tot_bytes = $19-$11;
  445.             forced_total= $16-$14;
  446.             tot_packets = $10;
  447.             tot_arrivals = $9;
  448.             unforced_total = $14;
  449.             if (unforced_total + forced_total > 0) {
  450.                 if ($14 > 0) {
  451.                     frac_packets = tot_packets/$14;
  452.                 }
  453.                 else { frac_packets = 0;}
  454.                 if ($17-$15 > 0) {
  455.                     frac_bytes = tot_bytes/($17-$15);
  456.                 }
  457.                 else {frac_bytes = 0;} 
  458.                 if ($13 > 0) {
  459.                     frac_arrivals = tot_arrivals/$13;
  460.                 }
  461.                 else {frac_arrivals = 0;}
  462.                 if (frac_packets + frac_bytes > 0) {
  463.                     unforced_total_part = frac_packets * unforced_total / ( unforced_total + forced_total)
  464.                     forced_total_part = frac_bytes * forced_total / ( unforced_total + forced_total)
  465.                     print 100.0 * frac_arrivals, 100.0 * ( unforced_total_part +forced_total_part)
  466.                 }
  467.             }
  468.         }
  469.     }
  470.     return $awkCode
  471. }
  472. TestSuite instproc create_flow_graph { graphtitle graphfile } {
  473.         global flowfile quiet
  474. $self instvar awkprocedure_
  475.         if {$quiet == "false"} {
  476. puts "awkprocedure: $awkprocedure_"
  477. }
  478.         set tmpfile1 /tmp/fg1[pid]
  479.         set tmpfile2 /tmp/fg2[pid]
  480.         exec rm -f $graphfile
  481.         set outdesc [open $graphfile w]
  482.         #
  483.         # this next part is xgraph specific
  484.         #
  485.         puts $outdesc "TitleText: $graphtitle"
  486.         puts $outdesc "Device: Postscript"
  487.         exec rm -f $tmpfile1 $tmpfile2
  488. if {$quiet == "false"} {
  489.          puts "writing flow xgraph data to $graphfile..."
  490. }
  491.         exec sort -n -k2 -o $flowfile $flowfile
  492.         exec awk [$self $awkprocedure_] $flowfile >@ $outdesc
  493.         close $outdesc
  494. }
  495. TestSuite instproc finish_flows testname {
  496. global flowgraphfile flowfile flowchan quiet
  497. $self instvar r1fm_
  498. $r1fm_ dump
  499. close $flowchan
  500. $self create_flow_graph $testname $flowgraphfile
  501. if {$quiet == "false"} {
  502. puts "running xgraph..."
  503. }
  504. exec cp $flowgraphfile temp.rands
  505. if {$quiet == "false"} {
  506. exec xgraph -bb -tk -nl -m -lx 0,100 -ly 0,100 -x "% of data bytes" -y "% of discards" $flowgraphfile &
  507. }
  508. exit 0
  509. }
  510. TestSuite instproc new_tcp { startTime source dest window fid verbose size } {
  511. $self instvar ns_
  512. set tcp [$ns_ create-connection TCP/Reno $source TCPSink $dest $fid]
  513. $tcp set window_ $window
  514. if {$size > 0}  {$tcp set packetSize_ $size }
  515. set ftp [$tcp attach-app FTP]
  516. $ns_ at $startTime "$ftp start"
  517. if {$verbose == "1"} {
  518.   $self tcpDumpAll $tcp 20.0 $fid 
  519. }
  520. }
  521. TestSuite instproc new_cbr { startTime source dest pktSize interval fid } {
  522. $self instvar ns_
  523.     set s_agent [new Agent/UDP]
  524.     set d_agent [new Agent/LossMonitor]
  525.     $s_agent set fid_ $fid 
  526.     $d_agent set fid_ $fid 
  527.     set cbr [new Application/Traffic/CBR]
  528.     $cbr attach-agent $s_agent
  529.     $ns_ attach-agent $source $s_agent
  530.     $ns_ attach-agent $dest $d_agent
  531.     $ns_ connect $s_agent $d_agent
  532.     if {$pktSize > 0} {
  533. $cbr set packetSize_ $pktSize
  534.     }
  535.     $cbr set rate_ [expr 8 * $pktSize / $interval]
  536.     $ns_ at $startTime "$cbr start"
  537. }
  538. TestSuite instproc dumpflows interval {
  539.     $self instvar dumpflows_inst_ ns_ r1fm_
  540.     $self instvar awkprocedure_ dump_pthresh_
  541.     global flowchan
  542.     if ![info exists dumpflows_inst_] {
  543.         set dumpflows_inst_ 1
  544.         $ns_ at 0.0 "$self dumpflows $interval"
  545.         return  
  546.     }
  547.     if { $awkprocedure_ == "unforcedmakeawk" } {
  548. set pcnt [$r1fm_ set epdrops_]
  549.     } elseif { $awkprocedure_ == "forcedmakeawk" } {
  550. set pcnt [expr [$r1fm_ set pdrops_] - [$r1fm_ set epdrops_]]
  551.     } elseif { $awkprocedure_ == "allmakeawk" } {
  552. set pcnt [$r1fm_ set pdrops_]
  553.     } else {
  554. puts stderr "unknown handling of flow dumps!"
  555. exit 1
  556.     }
  557.     if { $pcnt >= $dump_pthresh_ } {
  558.     $r1fm_ dump
  559.     flush $flowchan
  560.     foreach f [$r1fm_ flows] {
  561. $f reset
  562.     }
  563.     $r1fm_ reset
  564.     set interval 2.0
  565.     } else {
  566.     set interval 1.0
  567.     }
  568.     $ns_ at [expr [$ns_ now] + $interval] "$self dumpflows $interval"
  569. }   
  570. TestSuite instproc droptest { stoptime } {
  571. $self instvar ns_ node_ testName_ r1fm_ awkprocedure_
  572. set forwq [[$ns_ link $node_(r1) $node_(r2)] queue]
  573. set revq [[$ns_ link $node_(r2) $node_(r1)] queue]
  574. $forwq set mean_pktsize_ 1000
  575. $revq set mean_pktsize_ 1000
  576. $forwq set linterm_ 10
  577. $revq set linterm_ 10
  578. $forwq set limit_ 100
  579. $revq set limit_ 100
  580. $self create_flowstats 
  581. $self dumpflows 10.0
  582. $forwq set bytes_ true
  583. $forwq set queue_in_bytes_ true
  584. $forwq set wait_ false
  585.         $self new_tcp 1.0 $node_(s1) $node_(s3) 100 1 1 1000
  586. $self new_tcp 1.2 $node_(s2) $node_(s4) 100 2 1 50
  587. $self new_cbr 1.4 $node_(s1) $node_(s4) 190 0.003 3
  588. $ns_ at $stoptime "$self finish_flows $testName_"
  589. $ns_ run
  590. }
  591. TestSuite runTest