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

通讯编程

开发平台:

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, PROCUGKENT 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. # To run all tests: test-all-gk
  34. set dir [pwd]
  35. catch "cd tcl/test"
  36. source misc_simple.tcl
  37. catch "cd $dir"
  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 singledup_ 0
  50. # The default is being changed to 1
  51. Agent/TCP set overhead_ 0.001
  52. Agent/TCP set minrto_ 1
  53. # default changed on 10/14/2004.
  54. Agent/TCP set useHeaders_ false
  55. # The default is being changed to useHeaders_ true.
  56. set flowfile fairflow.tr; # file where flow data is written
  57. set flowgraphfile fairflow.xgr; # file given to graph tool 
  58. TestSuite instproc finish file {
  59. global quiet PERL
  60. $self instvar ns_ tchan_ testName_
  61.         exec $PERL ../../bin/getrc -s 2 -d 3 all.tr | 
  62.           $PERL ../../bin/raw2xg -a -s 0.01 -m 90 -t $file > temp.rands
  63. if {$quiet == "false"} {
  64.          exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
  65. }
  66.         ## now use default graphing tool to make a data file
  67.         ## if so desired
  68. if { [info exists tchan_] && $quiet == "false" } {
  69. $self plotQueue $testName_
  70. }
  71. $ns_ halt
  72. }
  73. TestSuite instproc enable_tracequeue ns {
  74. $self instvar tchan_ node_
  75. set gkq [[$ns link $node_(r1) $node_(r2)] queue]
  76. set tchan_ [open all.q w]
  77. $gkq trace curq_
  78. $gkq attach $tchan_
  79. }
  80. Class Topology
  81. Topology instproc node? num {
  82.     $self instvar node_
  83.     return $node_($num)
  84. }
  85. Class Topology/net2 -superclass Topology
  86. Topology/net2 instproc init ns {
  87.     $self instvar node_
  88.     set node_(s1) [$ns node]
  89.     set node_(s2) [$ns node]    
  90.     set node_(r1) [$ns node]    
  91.     set node_(r2) [$ns node]    
  92.     set node_(s3) [$ns node]    
  93.     set node_(s4) [$ns node]    
  94.     $self next 
  95.     $ns duplex-link $node_(s1) $node_(r1) 10Mb 2ms DropTail
  96.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 3ms DropTail
  97.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms GK
  98.     $ns queue-limit $node_(r1) $node_(r2) 25
  99.     $ns queue-limit $node_(r2) $node_(r1) 25
  100.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 4ms DropTail
  101.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 5ms DropTail
  102.  
  103.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  104.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  105.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  106.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  107.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  108.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  109.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  110. }   
  111. Class Topology/net3 -superclass Topology
  112. Topology/net3 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 0ms DropTail
  122.     $ns duplex-link $node_(s2) $node_(r1) 10Mb 1ms DropTail
  123.     $ns duplex-link $node_(r1) $node_(r2) 1.5Mb 10ms GK
  124.     $ns duplex-link $node_(r2) $node_(r1) 1.5Mb 10ms GK
  125.     $ns queue-limit $node_(r1) $node_(r2) 100
  126.     $ns queue-limit $node_(r2) $node_(r1) 100
  127.     $ns duplex-link $node_(s3) $node_(r2) 10Mb 2ms DropTail
  128.     $ns duplex-link $node_(s4) $node_(r2) 10Mb 3ms DropTail
  129.  
  130.     $ns duplex-link-op $node_(s1) $node_(r1) orient right-down
  131.     $ns duplex-link-op $node_(s2) $node_(r1) orient right-up
  132.     $ns duplex-link-op $node_(r1) $node_(r2) orient right
  133.     $ns duplex-link-op $node_(r1) $node_(r2) queuePos 0
  134.     $ns duplex-link-op $node_(r2) $node_(r1) queuePos 0
  135.     $ns duplex-link-op $node_(s3) $node_(r2) orient left-down
  136.     $ns duplex-link-op $node_(s4) $node_(r2) orient left-up
  137. }   
  138. TestSuite instproc plotQueue file {
  139. global quiet
  140. $self instvar tchan_
  141. #
  142. # Plot the queue size and average queue size, for GK gateways.
  143. #
  144. set awkCode {
  145. {
  146. if ($1 == "Q" && NF>2) {
  147. print $2, $3 >> "temp.q";
  148. set end $2
  149. }
  150. }
  151. }
  152. set f [open temp.queue w]
  153. puts $f "TitleText: $file"
  154. puts $f "Device: Postscript"
  155. if { [info exists tchan_] } {
  156. close $tchan_
  157. }
  158. exec rm -f temp.q
  159. exec touch temp.q
  160. exec awk $awkCode all.q
  161. puts $f "queue
  162. exec cat temp.q >@ $f  
  163. close $f
  164. if {$quiet == "false"} {
  165. exec xgraph -bb -tk -x time -y queue temp.queue &
  166. }
  167. }
  168. TestSuite instproc tcpDumpAll { tcpSrc interval label } {
  169.     global quiet
  170.     $self instvar dump_inst_ ns_
  171.     if ![info exists dump_inst_($tcpSrc)] {
  172. set dump_inst_($tcpSrc) 1
  173. set report $label/window=[$tcpSrc set window_]/packetSize=[$tcpSrc set packetSize_]
  174. if {$quiet == "false"} {
  175. puts $report
  176. }
  177. $ns_ at 0.0 "$self tcpDumpAll $tcpSrc $interval $label"
  178. return
  179.     }
  180.     $ns_ at [expr [$ns_ now] + $interval] "$self tcpDumpAll $tcpSrc $interval $label"
  181.     set report time=[$ns_ now]/class=$label/ack=[$tcpSrc set ack_]/packets_resent=[$tcpSrc set nrexmitpack_]
  182.     if {$quiet == "false"} {
  183.      puts $report
  184.     }
  185. }       
  186. Class Test/gk1 -superclass TestSuite
  187. Test/gk1 instproc init {} {
  188.     $self instvar net_ test_
  189.     Agent/TCP set ecn_ 1
  190.     set net_ net2
  191.     set test_ ecn
  192.     $self next pktTraceFile
  193. }
  194. Test/gk1 instproc run {} {
  195.     $self instvar ns_ node_ testName_
  196.     $self setTopo 
  197.     set stoptime 10.0
  198.     set gkq [[$ns_ link $node_(r1) $node_(r2)] queue]
  199.     $gkq set ecnlim_ 0.8 
  200.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  201.     $tcp1 set window_ 50
  202.     $tcp1 set ecn_ 1
  203.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 1]
  204.     $tcp2 set window_ 50
  205.     $tcp2 set ecn_ 1
  206.         
  207.     set ftp1 [$tcp1 attach-app FTP]
  208.     set ftp2 [$tcp2 attach-app FTP]
  209.         
  210.     $self enable_tracequeue $ns_
  211.     $ns_ at 0.0 "$ftp1 start"
  212.     $ns_ at 3.0 "$ftp2 start"
  213.         
  214.     $self tcpDump $tcp1 5.0
  215.         
  216.     # trace only the bottleneck link
  217.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  218.     $ns_ at $stoptime "$self cleanupAll $testName_"
  219.         
  220.     $ns_ run
  221. }
  222. Class Test/gk2 -superclass TestSuite
  223. Test/gk2 instproc init {} {
  224.     $self instvar net_ test_
  225.     set net_ net3
  226.     set test_ gk2
  227.     $self next pktTraceFile
  228. }
  229. Test/gk2 instproc run {} {
  230.     $self instvar ns_ node_ testName_
  231.     $self setTopo
  232.     set stoptime 10.0
  233.     set gkq [[$ns_ link $node_(r1) $node_(r2)] queue]
  234.     $gkq set ecnlim_ 0.6 
  235.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  236.     $tcp1 set window_ 100 
  237.     $tcp1 set ecn_ 1
  238.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s3) 1]
  239.     $tcp2 set window_ 100
  240.     $tcp2 set ecn_ 1
  241.     set ftp1 [$tcp1 attach-app FTP]
  242.     set ftp2 [$tcp2 attach-app FTP]
  243.     $self enable_tracequeue $ns_
  244.     $ns_ at 0.0 "$ftp1 start"
  245.     $ns_ at 3.0 "$ftp2 start"
  246.     $self tcpDump $tcp1 5.0
  247.     
  248.     # trace only the bottleneck link
  249.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  250.     $ns_ at $stoptime "$self cleanupAll $testName_"
  251.     $ns_ run
  252. }
  253. Class Test/gk_twoway -superclass TestSuite
  254. Test/gk_twoway instproc init {} {
  255.     $self instvar net_ test_
  256.     set net_ net3
  257.     set test_ gk_twoway
  258.     $self next pktTraceFile
  259. }
  260. Test/gk_twoway instproc run {} {
  261.     $self instvar ns_ node_ testName_
  262.     $self setTopo
  263.     set stoptime 10.0
  264.     set gkq [[$ns_ link $node_(r1) $node_(r2)] queue]
  265.     $gkq set ecnlim_ 0.8 
  266.     set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) TCPSink/Sack1 $node_(s3) 0]
  267.     $tcp1 set window_ 100
  268.     $tcp1 set ecn_ 1
  269.     set tcp2 [$ns_ create-connection TCP/Sack1 $node_(s2) TCPSink/Sack1 $node_(s4) 1]
  270.     $tcp2 set window_ 100
  271.     $tcp2 set ecn_ 1
  272.     set ftp1 [$tcp1 attach-app FTP]
  273.     set ftp2 [$tcp2 attach-app FTP]
  274.     set tcp3 [$ns_ create-connection TCP/Sack1 $node_(s3) TCPSink/Sack1 $node_(s1) 2]
  275.     $tcp3 set window_ 100
  276.     $tcp3 set ecn_ 1
  277.     set tcp4 [$ns_ create-connection TCP/Sack1 $node_(s4) TCPSink/Sack1 $node_(s2) 3]
  278.     $tcp4 set window_ 100
  279.     $tcp4 set ecn_ 1
  280.     set ftp3 [$tcp3 attach-app FTP]
  281.     set telnet1 [$tcp4 attach-app Telnet] ; $telnet1 set interval_ 0
  282.     $self enable_tracequeue $ns_
  283.     $ns_ at 0.0 "$ftp1 start"
  284.     $ns_ at 2.0 "$ftp2 start"
  285.     $ns_ at 3.5 "$ftp3 start"
  286.     $ns_ at 1.0 "$telnet1 start"
  287.     $self tcpDump $tcp1 5.0
  288.     # trace only the bottleneck link
  289.     #$self traceQueues $node_(r1) [$self openTrace $stoptime $testName_]
  290.     $ns_ at $stoptime "$self cleanupAll $testName_"
  291.     $ns_ run
  292. }
  293. #
  294. #######################################################################
  295. TestSuite instproc create_flowstats {} {
  296. global flowfile flowchan
  297. $self instvar ns_ node_ r1fm_
  298. set r1fm_ [$ns_ makeflowmon Fid]
  299. set flowchan [open $flowfile w]
  300. $r1fm_ attach $flowchan
  301. $ns_ attach-fmon [$ns_ link $node_(r1) $node_(r2)] $r1fm_ 1
  302. }
  303. #
  304. # awk code used to produce:
  305. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  306. #       y axis: # drops for this flow+category / # drops this category [pkts]
  307. # (verified compatible for ns2 - kfall, 10/30/97)
  308. TestSuite instproc unforcedmakeawk { } {
  309.         set awkCode {
  310.             {
  311.                 if ($2 != prev) {
  312.                         print " "; print ""flow " $2;
  313. if ($13 > 0 && $14 > 0) {
  314.     print 100.0 * $9/$13, 100.0 * $10 / $14
  315. }
  316. prev = $2;
  317.                 } else if ($13 > 0 && $14 > 0) {
  318.                         print 100.0 * $9 / $13, 100.0 * $10 / $14
  319. }
  320.             }
  321.         }
  322.         return $awkCode
  323. }
  324. #
  325. # awk code used to produce:
  326. #       x axis: # arrivals for this flow+category / # total arrivals [bytes]
  327. #       y axis: # drops for this flow+category / # drops this category [bytes]
  328. # (modified for compatibility with ns2 flowmon - kfall, 10/30/97)
  329. TestSuite instproc forcedmakeawk { } {
  330.         set awkCode {
  331.             BEGIN { print ""flow 0" }
  332.             {
  333.                 if ($2 != prev) {
  334.                         print " "; print ""flow " $2;
  335. if ($13 > 0 && ($17 - $15) > 0) {
  336. print 100.0 * $9/$13, 100.0 * ($19 - $11) / ($17 - $15);
  337. }
  338. prev = $2;
  339.                 } else if ($13 > 0 && ($17 - $15) > 0) {
  340.                         print 100.0 * $9 / $13, 100.0 * ($19 - $11) / ($17 - $15)
  341. }
  342.             }
  343.         }
  344.         return $awkCode
  345. }
  346. #
  347. # awk code used to produce:
  348. #      x axis: # arrivals for this flow+category / # total arrivals [bytes]
  349. #      y axis: # drops for this flow / # drops [pkts and bytes combined]
  350. TestSuite instproc allmakeawk { } {
  351.     set awkCode {
  352.         BEGIN {prev=-1; tot_bytes=0; tot_packets=0; forced_total=0; unforced_total=0}
  353.         {
  354.             if ($5 != prev) {
  355.                 print " "; print ""flow ",$5;
  356.                 prev = $5
  357.             }
  358.             tot_bytes = $19-$11;
  359.             forced_total= $16-$14;
  360.             tot_packets = $10;
  361.             tot_arrivals = $9;
  362.             unforced_total = $14;
  363.             if (unforced_total + forced_total > 0) {
  364.                 if ($14 > 0) {
  365.                     frac_packets = tot_packets/$14;
  366.                 }
  367.                 else { frac_packets = 0;}
  368.                 if ($17-$15 > 0) {
  369.                     frac_bytes = tot_bytes/($17-$15);
  370.                 }
  371.                 else {frac_bytes = 0;} 
  372.                 if ($13 > 0) {
  373.                     frac_arrivals = tot_arrivals/$13;
  374.                 }
  375.                 else {frac_arrivals = 0;}
  376.                 if (frac_packets + frac_bytes > 0) {
  377.                     unforced_total_part = frac_packets * unforced_total / ( unforced_total + forced_total)
  378.                     forced_total_part = frac_bytes * forced_total / ( unforced_total + forced_total)
  379.                     print 100.0 * frac_arrivals, 100.0 * ( unforced_total_part +forced_total_part)
  380.                 }
  381.             }
  382.         }
  383.     }
  384.     return $awkCode
  385. }
  386. TestSuite instproc create_flow_graph { graphtitle graphfile } {
  387.         global flowfile quiet
  388. $self instvar awkprocedure_
  389.         if {$quiet == "false"} {
  390. puts "awkprocedure: $awkprocedure_"
  391. }
  392.         set tmpfile1 /tmp/fg1[pid]
  393.         set tmpfile2 /tmp/fg2[pid]
  394.         exec rm -f $graphfile
  395.         set outdesc [open $graphfile w]
  396.         #
  397.         # this next part is xgraph specific
  398.         #
  399.         puts $outdesc "TitleText: $graphtitle"
  400.         puts $outdesc "Device: Postscript"
  401.         exec rm -f $tmpfile1 $tmpfile2
  402. if {$quiet == "false"} {
  403.          puts "writing flow xgraph data to $graphfile..."
  404. }
  405.         exec sort -n -k2 -o $flowfile $flowfile
  406.         exec awk [$self $awkprocedure_] $flowfile >@ $outdesc
  407.         close $outdesc
  408. }
  409. TestSuite instproc finish_flows testname {
  410. global flowgraphfile flowfile flowchan quiet
  411. $self instvar r1fm_
  412. $r1fm_ dump
  413. close $flowchan
  414. $self create_flow_graph $testname $flowgraphfile
  415. if {$quiet == "false"} {
  416. puts "running xgraph..."
  417. }
  418. exec cp $flowgraphfile temp.rands
  419. if {$quiet == "false"} {
  420. exec xgraph -bb -tk -nl -m -lx 0,100 -ly 0,100 -x "% of data bytes" -y "% of discards" $flowgraphfile &
  421. }
  422. exit 0
  423. }
  424. TestSuite instproc new_tcp { startTime source dest window fid verbose size } {
  425. $self instvar ns_
  426. set tcp [$ns_ create-connection TCP/Sack1 $source TCPSink/Sack1 $dest $fid]
  427. $tcp set window_ $window
  428. if {$size > 0}  {$tcp set packetSize_ $size }
  429. set ftp [$tcp attach-app FTP]
  430. $ns_ at $startTime "$ftp start"
  431. if {$verbose == "1"} {
  432.   $self tcpDumpAll $tcp 20.0 $fid 
  433. }
  434. }
  435. TestSuite instproc new_cbr { startTime source dest pktSize interval fid } {
  436. $self instvar ns_
  437.     set s_agent [new Agent/UDP]
  438.     set d_agent [new Agent/LossMonitor]
  439.     $s_agent set fid_ $fid 
  440.     $d_agent set fid_ $fid 
  441.     set cbr [new Application/Traffic/CBR]
  442.     $cbr attach-agent $s_agent
  443.     $ns_ attach-agent $source $s_agent
  444.     $ns_ attach-agent $dest $d_agent
  445.     $ns_ connect $s_agent $d_agent
  446.     if {$pktSize > 0} {
  447. $cbr set packetSize_ $pktSize
  448.     }
  449.     $cbr set rate_ [expr 8 * $pktSize / $interval]
  450.     $ns_ at $startTime "$cbr start"
  451. }
  452. TestSuite instproc dumpflows interval {
  453.     $self instvar dumpflows_inst_ ns_ r1fm_
  454.     $self instvar awkprocedure_ dump_pthresh_
  455.     global flowchan
  456.     if ![info exists dumpflows_inst_] {
  457.         set dumpflows_inst_ 1
  458.         $ns_ at 0.0 "$self dumpflows $interval"
  459.         return  
  460.     }
  461.     if { $awkprocedure_ == "unforcedmakeawk" } {
  462. set pcnt [$r1fm_ set epdrops_]
  463.     } elseif { $awkprocedure_ == "forcedmakeawk" } {
  464. set pcnt [expr [$r1fm_ set pdrops_] - [$r1fm_ set epdrops_]]
  465.     } elseif { $awkprocedure_ == "allmakeawk" } {
  466. set pcnt [$r1fm_ set pdrops_]
  467.     } else {
  468. puts stderr "unknown handling of flow dumps!"
  469. exit 1
  470.     }
  471.     if { $pcnt >= $dump_pthresh_ } {
  472.     $r1fm_ dump
  473.     flush $flowchan
  474.     foreach f [$r1fm_ flows] {
  475. $f reset
  476.     }
  477.     $r1fm_ reset
  478.     set interval 2.0
  479.     } else {
  480.     set interval 1.0
  481.     }
  482.     $ns_ at [expr [$ns_ now] + $interval] "$self dumpflows $interval"
  483. }   
  484. TestSuite runTest