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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1995 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-oddBehaviors.tcl,v 1.16 2007/10/24 02:13:50 sallyfloyd Exp $
  34. #
  35. # To view a list of available tests to run with this script:
  36. # ns test-suite-tcpVariants.tcl
  37. #
  38. source misc_simple.tcl
  39. remove-all-packet-headers       ; # removes all except common
  40. add-packet-header Flags IP TCP  ; # hdrs reqd for validation test
  41.  
  42. # FOR UPDATING GLOBAL DEFAULTS:
  43. Agent/TCP set singledup_ 0
  44. Trace set show_tcphdr_ 1
  45. set wrap 90
  46. set wrap1 [expr 90 * 512 + 40]
  47. Class Topology
  48. Topology instproc node? num {
  49.     $self instvar node_
  50.     return $node_($num)
  51. }
  52. #
  53. # Links1 uses 8Mb, 5ms feeders, and a 800Kb 10ms bottleneck.
  54. # Queue-limit on bottleneck is 2 packets.
  55. #
  56. Class Topology/net4 -superclass Topology
  57. Topology/net4 instproc init ns {
  58.     $self instvar node_
  59.     set node_(s1) [$ns node]
  60.     set node_(s2) [$ns node]
  61.     set node_(r1) [$ns node]
  62.     set node_(k1) [$ns node]
  63.     $self next
  64.     $ns duplex-link $node_(s1) $node_(r1) 8Mb 0ms DropTail
  65.     $ns duplex-link $node_(s2) $node_(r1) 8Mb 0ms DropTail
  66.     $ns duplex-link $node_(r1) $node_(k1) 800Kb 100ms DropTail
  67.     $ns queue-limit $node_(r1) $node_(k1) 8
  68.     $ns queue-limit $node_(k1) $node_(r1) 8
  69.     $self instvar lossylink_
  70.     set lossylink_ [$ns link $node_(r1) $node_(k1)]
  71.     set em [new ErrorModule Fid]
  72.     set errmodel [new ErrorModel/Periodic]
  73.     $errmodel unit pkt
  74.     $lossylink_ errormodule $em
  75. }
  76. TestSuite instproc finish file {
  77. global quiet wrap PERL
  78.         exec $PERL ../../bin/set_flow_id -s all.tr | 
  79.           $PERL ../../bin/getrc -s 2 -d 3 | 
  80.           $PERL ../../bin/raw2xg -s 0.01 -m $wrap -t $file > temp.rands
  81.          exec $PERL ../../bin/set_flow_id -d all.tr | 
  82.           $PERL ../../bin/getrc -s 3 -d 2 | 
  83.           $PERL ../../bin/raw2xg -a -s 0.01 -m $wrap -t $file > temp1.rands
  84. if {$quiet == "false"} {
  85. exec xgraph -bb -tk -nl -m -x time -y packets temp.rands 
  86. temp1.rands &
  87. }
  88.         ## now use default graphing tool to make a data file
  89. ## if so desired
  90.         exit 0
  91. }
  92. TestSuite instproc printtimers { tcp time} {
  93. global quiet
  94. if {$quiet == "false"} {
  95.          puts "time: $time sRTT(in ticks): [$tcp set srtt_]/8 RTTvar(in ticks): [$tcp set rttvar_]/4 backoff: [$tcp set backoff_]"
  96. }
  97. }
  98. TestSuite instproc printtimersAll { tcp time interval } {
  99.         $self instvar dump_inst_ ns_
  100.         if ![info exists dump_inst_($tcp)] {
  101.                 set dump_inst_($tcp) 1
  102.                 $ns_ at $time "$self printtimersAll $tcp $time $interval"
  103.                 return
  104.         }
  105. set newTime [expr [$ns_ now] + $interval]
  106. $ns_ at $time "$self printtimers $tcp $time"
  107.         $ns_ at $newTime "$self printtimersAll $tcp $newTime $interval"
  108. }
  109. TestSuite instproc emod {} {
  110.         $self instvar topo_
  111.         $topo_ instvar lossylink_
  112.         set errmodule [$lossylink_ errormodule]
  113.         return $errmodule
  114. TestSuite instproc drop_pkts pkts {
  115.     $self instvar ns_
  116.     set emod [$self emod]
  117.     set errmodel1 [new ErrorModel/List]
  118.     $errmodel1 droplist $pkts
  119.     $emod insert $errmodel1
  120.     $emod bind $errmodel1 1
  121. }
  122. TestSuite instproc setup {tcptype list} {
  123. global wrap wrap1
  124.         $self instvar ns_ node_ testName_ guide_
  125. $self setTopo
  126.         Agent/TCP set bugFix_ false
  127.         puts "Guide: $guide_"
  128. set fid 1
  129.         # Set up TCP connection
  130.      if {$tcptype == "Tahoe"} {
  131.        set tcp1 [$ns_ create-connection TCP $node_(s1) 
  132.            TCPSink $node_(k1) $fid]
  133.      } elseif {$tcptype == "Sack1"} {
  134.        set tcp1 [$ns_ create-connection TCP/Sack1 $node_(s1) 
  135.            TCPSink/Sack1  $node_(k1) $fid]
  136.      } elseif {$tcptype == "Fack"} {
  137.        set tcp1 [$ns_ create-connection TCP/Fack $node_(s1) 
  138.            TCPSink/Sack1  $node_(k1) $fid]
  139.      } elseif {$tcptype == "SackRH"} {
  140.        set tcp1 [$ns_ create-connection TCP/SackRH $node_(s1) 
  141.            TCPSink/Sack1 $node_(k1) $fid]
  142.      } elseif {$tcptype == "FullTcp"} {
  143. set wrap $wrap1
  144.         set tcp1 [new Agent/TCP/FullTcp]
  145.         set sink [new Agent/TCP/FullTcp]
  146.         $ns_ attach-agent $node_(s1) $tcp1
  147.         $ns_ attach-agent $node_(k1) $sink
  148.         $tcp1 set fid_ $fid
  149.         $sink set fid_ $fid
  150.         $ns_ connect $tcp1 $sink
  151.         # set up TCP-level connections
  152.         $sink listen ; # will figure out who its peer is
  153.      } elseif {$tcptype == "FullTcpTahoe"} {
  154. set wrap $wrap1
  155.         set tcp1 [new Agent/TCP/FullTcp/Tahoe]
  156.         set sink [new Agent/TCP/FullTcp/Tahoe]
  157.         $ns_ attach-agent $node_(s1) $tcp1
  158.         $ns_ attach-agent $node_(k1) $sink
  159.         $tcp1 set fid_ $fid
  160.         $sink set fid_ $fid
  161.         $ns_ connect $tcp1 $sink
  162.         # set up TCP-level connections
  163.         $sink listen ; # will figure out who its peer is
  164.      } elseif {$tcptype == "FullTcpNewreno"} {
  165. set wrap $wrap1
  166.         set tcp1 [new Agent/TCP/FullTcp/Newreno]
  167.         set sink [new Agent/TCP/FullTcp/Newreno]
  168.         $ns_ attach-agent $node_(s1) $tcp1
  169.         $ns_ attach-agent $node_(k1) $sink
  170.         $tcp1 set fid_ $fid
  171.         $sink set fid_ $fid
  172.         $ns_ connect $tcp1 $sink
  173.         # set up TCP-level connections
  174.         $sink listen ; # will figure out who its peer is
  175.      } elseif {$tcptype == "FullTcpSack1"} {
  176. set wrap $wrap1
  177.         set tcp1 [new Agent/TCP/FullTcp/Sack]
  178.         set sink [new Agent/TCP/FullTcp/Sack]
  179.         $ns_ attach-agent $node_(s1) $tcp1
  180.         $ns_ attach-agent $node_(k1) $sink
  181.         $tcp1 set fid_ $fid
  182.         $sink set fid_ $fid
  183.         $ns_ connect $tcp1 $sink
  184.         # set up TCP-level connections
  185.         $sink listen ; # will figure out who its peer is
  186.      } else {
  187.        set tcp1 [$ns_ create-connection TCP/$tcptype $node_(s1) 
  188.            TCPSink $node_(k1) $fid]
  189.      }
  190.         $tcp1 set window_ 50
  191.         set ftp1 [$tcp1 attach-app FTP]
  192.         $ns_ at 0.0 "$ftp1 start"
  193.         $self tcpDump $tcp1 2.0
  194.         $self drop_pkts $list
  195.         #$self traceQueues $node_(r1) [$self openTrace 2.0 $testName_]
  196. $ns_ at 2.0 "$self cleanupAll $testName_"
  197.         $ns_ run
  198. }
  199. # Definition of test-suite tests
  200. ###################################################
  201. ## One drop, numdupacks
  202. ###################################################
  203. # cwnd is 4 when a packet is dropped.
  204. # When three dup acks come in, cwnd in halved to 2.  
  205. # dupwnd_ is set # to three, 
  206. # so the sender retransmits the lost packet, 
  207. # and also sends a new packet off the top, because
  208. # cwnd has been "inflated" by the three dup acks.
  209. # This occurs, appropriately, with both Reno and Newreno.
  210. # This does not occur for Sack, because Sack only sends one packet
  211. # in response to the third dup ack.
  212. #
  213. Class Test/onedrop_reno -superclass TestSuite
  214. Test/onedrop_reno instproc init {} {
  215. $self instvar net_ test_ guide_
  216. set net_ net4
  217. set test_ onedrop_reno
  218.         set guide_      "Reno, inflated congestion window after Fast Retransmit."
  219. $self next pktTraceFile
  220. }
  221. Test/onedrop_reno instproc run {} {
  222.         $self setup Reno {3}
  223. }
  224. Class Test/onedrop_sack -superclass TestSuite
  225. Test/onedrop_sack instproc init {} {
  226. $self instvar net_ test_ guide_
  227. set net_ net4
  228. set test_ onedrop_sack
  229.         set guide_      "Sack, no inflated congestion window after Fast Retransmit."
  230. $self next pktTraceFile
  231. }
  232. Test/onedrop_sack instproc run {} {
  233.         $self setup Sack1 {3}
  234. }
  235. Class Test/onedrop_sack1 -superclass TestSuite
  236. Test/onedrop_sack1 instproc init {} {
  237. $self instvar net_ test_ guide_
  238. set net_ net4
  239. set test_ onedrop_sack1
  240. Agent/TCP set singledup_ 1
  241.         set guide_      "Sack, Limited Transmit, inflated congestion window."
  242. $self next pktTraceFile
  243. }
  244. Test/onedrop_sack1 instproc run {} {
  245.         $self setup Sack1 {3}
  246. }
  247. TestSuite runTest