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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. #Maintainer: Padma Haldar (haldar@isi.edu)
  32. # This class shall hold different traffic models
  33. Class TrafficGen/ManyTCP
  34. TrafficGen/ManyTCP instproc set_raw_opt {} {
  35.     $self instvar raw_opt_info_
  36.     set raw_opt_info_ {
  37. # how long to run the sim?
  38. duration 30
  39. # initilization: just start n clients at time 0
  40. # NEEDSWORK:  a more realistic ramp-up model
  41. # or some kind of autodetection on when we've reached
  42. # steady state would be nice.
  43. initial-client-count 10
  44. #
  45. # BASIC TOPOLOGY:
  46. # TOPO1 :
  47. # (The basic n clients on the left and right going through a
  48. # bottleneck.)
  49. #
  50. # cl_1                                                   cr_1
  51. # ...     ---- bottleneck_left ---- bottleneck_right --- ...
  52. # cl_n                                                   cr_n
  53. #
  54. # node-number 0 specifies a new pair of nodes
  55. # on the left and right for each new client
  56. node-number 0
  57. # NEEDSWORK:
  58. # The number of agents attached to a node cannot exceed
  59. # the port-field length (255 bits).  There is currently
  60. # no check or warning message for this.
  61. #
  62. # Currently all data traffic flows left-to-right.
  63. # NEEDSWORK: relax this assumption (but Poduri and Nichols
  64. # I-D suggests that relaxing it won't change things much).
  65. #
  66. client-nodes-l -1
  67. client-nodes-r -1
  68. #NEEDSWORK :
  69. # TOPO2: connect client nodes from a set A to set B
  70. # TOPO3: N% nodes from stubs or total nodes in topology.--this
  71. # has been implemented already in the topology generator and 
  72. # needs to be hooked here.
  73. #
  74. #Bottleneck link
  75. bottle_link_l -1
  76. bottle_link_r -1
  77. #
  78. #
  79. # CLIENT TRAFFIC MODEL:
  80. #
  81. # arrival rate per second (arrival is poisson)
  82. client-arrival-rate 1
  83. # Currently clients are either mice or elephants.
  84. # NEEDSWORK:  should better model http-like traffic patterns.
  85. # In particular, netscape's 4-connection model makes
  86. # a *big* difference in traffic patterns
  87. # and is not currently modeled at all.
  88. client-mouse-chance 90
  89. client-mouse-packets 10
  90. client-elephant-packets 100
  91. # For traffic in the reverse direction.
  92. client-reverse-chance 0
  93. # Pkt size in bytes.
  94. # NEEDSWORK:  should check that everything is uniformly
  95. # specified (router queues are in packets of 1000B length?).
  96. client-pkt-size 576
  97. #
  98. # CLIENT NETWORK CONNECTION:
  99. #
  100. client-bw 56kb
  101. # client-server rtt is uniform over this range (currently)
  102. # NEEDSWORK:  does this need to be modeled more accurately?
  103. client-delay random
  104. client-delay-range 100ms
  105. client-queue-method DropTail
  106. # Insure that client routers are never a bottleneck.
  107. client-queue-length 100
  108. #
  109. # CLIENT/SERVER TCP IMPLEMENTATION:
  110. #
  111. # NEEDSWORK: should add HTTP model over TCP.
  112. source-tcp-method TCP/Reno
  113. sink-ack-method TCPSink/DelAck
  114. # Set init-win to 1 for initial windows of size 1.
  115. # Set init-win to 10 for initial windows of 10 packets.
  116. # Set init-win to 0 for initial windows per internet-draft.
  117. init-win 1
  118. #
  119. # BOTTLENECK LINK MODEL:
  120. #
  121. bottle-bw 10Mb
  122. bottle-delay 4ms
  123. bottle-queue-method RED
  124. # bottle-queue-length is either in packets or
  125. # is "bw-delay-product" which does the currently
  126. # expected thing.
  127. bottle-queue-length bw-delay-product
  128. #
  129. # OUTPUT OPTIONS:
  130. #
  131. graph-results 0
  132. # Set graph-scale to 2 for "rows" for each flow.
  133. graph-scale 1
  134. graph-join-queueing 1
  135. gen-map 0
  136. mem-trace 0
  137. print-drop-rate 0
  138. title none
  139. # set test-suite to write the graph to opts_(test-suite-file)
  140. test-suite 0
  141. test-suite-file temp.rands
  142.    
  143. # Random number seed; default is 0, so ns will give a 
  144. # diff. one on each invocation.
  145. ns-random-seed 0
  146. # Animation options; complete traces are useful
  147. # for nam only, so do those only when a tracefile
  148. # is being used for nam
  149. # Set trace-filename to "none" for no tracefile.
  150. trace-filename out
  151. trace-all 0
  152. namtrace-some 0
  153. namtrace-all 0
  154. # Switch to generate the nam tcl file from here
  155. # itself
  156. nam-generate-cmdfile 0
  157.     }
  158. }
  159. TrafficGen/ManyTCP instproc default_options {} {
  160.     $self instvar opts_ opt_wants_arg_ raw_opt_info_
  161.     set cooked_opt_info $raw_opt_info_
  162.     while {$cooked_opt_info != ""} {
  163. if {![regexp "^[^n]*n" $cooked_opt_info line]} {
  164.     break
  165. }
  166. regsub "^[^n]*n" $cooked_opt_info {} cooked_opt_info
  167. set line [string trim $line]
  168. if {[regexp "^[ t]*#" $line]} {
  169.     continue
  170. }
  171. if {$line == ""} {
  172.     continue
  173. } elseif [regexp {^([^ ]+)[ ]+([^ ]+)$} $line dummy key value] {
  174.     set opts_($key) $value
  175.     set opt_wants_arg_($key) 1
  176. } else {
  177.     set opt_wants_arg_($key) 0
  178.     # die "unknown stuff in raw_opt_info_n"
  179. }
  180.     }
  181. }
  182. TrafficGen/ManyTCP instproc process_args {av} {
  183.     $self instvar opts_ opt_wants_arg_
  184.     $self default_options
  185.     for {set i 0} {$i < [llength $av]} {incr i} {
  186. set key [lindex $av $i]
  187. if {$key == "-?" || $key == "--help" || $key == "-help" || $key == "-h"} {
  188.     usage
  189. }
  190. regsub {^-} $key {} key
  191. if {![info exists opt_wants_arg_($key)]} {
  192.     puts stderr "unknown option $key";
  193.     usage
  194. }
  195. if {$opt_wants_arg_($key)} {
  196.     incr i
  197.     set opts_($key) [lindex $av $i]
  198. } else {
  199.     set opts_($key) [expr !opts_($key)]
  200. }
  201.     }
  202. }
  203. TrafficGen/ManyTCP instproc get_list {list name} {
  204.     $self instvar opts_
  205.     for {set i 0} {$i < [llength $list]} {incr i} {
  206. set $opts_($name:$i) [lindex $list $i]
  207.     }
  208. }
  209. TrafficGen/ManyTCP instproc readin_client_nodes {} {
  210.     $self instvar opts_
  211.     if {$opts_(client-nodes-l) != -1} {
  212. set temp [split $opts_(client-nodes-l) ,]
  213. $self get_list $temp client-nodes-l
  214.     }
  215.     if {$opts_(client-nodes-r) != -1} {
  216. set temp [split $opts_(client-nodes-r) ,]
  217. $self get_list $temp client-nodes-r
  218.     }
  219. }
  220. proc my-duplex-link {ns n1 n2 bw delay queue_method queue_length} {
  221.     
  222.     $ns duplex-link $n1 $n2 $bw $delay $queue_method
  223.     $ns queue-limit $n1 $n2 $queue_length
  224.     $ns queue-limit $n2 $n1 $queue_length
  225. }
  226. TrafficGen/ManyTCP instproc init_network {} {
  227.     $self instvar opts_ fmon_ bottle_l_ bottle_r_ cs_l_ cs_r_ ns_ 
  228.     cs_count_ ns_ clients_started_ clients_finished_
  229.     
  230.     #
  231.     # Figure supported load.
  232.     #
  233.     set expected_load_per_client_in_bps [expr ($opts_(client-mouse-chance)/100.0)*$opts_(client-mouse-packets)*$opts_(client-pkt-size)*8 + (1.0-$opts_(client-mouse-chance)/100.0)*$opts_(client-elephant-packets)*$opts_(client-pkt-size)*8]
  234.     if {$opts_(debug)} {
  235. set max_clients_per_second [expr [bw_parse $opts_(bottle-bw)]/$expected_load_per_client_in_bps]
  236. puts [format "maximum clients per second: %.3f" $max_clients_per_second]
  237.     }
  238.     
  239.     # Compute optimal (?) bottleneck queue size
  240.     # as the bw-delay product.
  241.     if {$opts_(bottle-queue-length) == "bw-delay-product"} {
  242. set opts_(bottle-queue-length) [expr ([bw_parse $opts_(bottle-bw)] * ([time_parse $opts_(bottle-delay)] + [time_parse $opts_(client-delay-range)]) + $opts_(client-pkt-size)*8 - 1)/ ($opts_(client-pkt-size) * 8)]
  243. puts "optimal bw queue size: $opts_(bottle-queue-length)"
  244.     }
  245.     
  246.     # Do our own routing with expanded addresses (21 bits nodes).
  247.     # (Basic routing limits us to 128 nodes == 64 clients).
  248.     # $ns_ rtproto Manual
  249.     # $ns_ set-address-format expanded
  250.     # set up the bottleneck
  251.     if {$opts_(bottle_link_l) != -1 || $opts_(bottle_link_r) != -1} {
  252. set bottle_l_ $opts_(bottle_link_l)
  253. set bottle_r_ $opts_(bottle_link_r)
  254.     } else {
  255. $ns_ rtproto Manual
  256. $ns_ set-address-format expanded
  257. set bottle_l_ [$ns_ node]
  258. set bottle_r_ [$ns_ node]
  259.     }
  260.     my-duplex-link $ns_ $bottle_l_ $bottle_r_ $opts_(bottle-bw) $opts_(bottle-delay) $opts_(bottle-queue-method) $opts_(bottle-queue-length)
  261.     if {$opts_(print-drop-rate)} {
  262. set slink [$ns_ link $bottle_l_ $bottle_r_]
  263. set fmon_ [$ns_ makeflowmon Fid]
  264. $ns_ attach-fmon $slink $fmon_
  265.     }
  266.     # Bottlenecks need large routing tables.
  267.     # [$bottle_l_ set classifier_] resize 511
  268.     # [$bottle_r_ set classifier_] resize 511
  269.     
  270.     # Default routes to the other.
  271.     $bottle_l_ add-route-to-adj-node -default $bottle_r_
  272.     $bottle_r_ add-route-to-adj-node -default $bottle_l_
  273.     
  274.     # Clients are built dynamically.
  275.     set cs_count_ 0
  276.     set clients_started_ 0
  277.     set clients_finished_ 0
  278. }
  279. TrafficGen/ManyTCP instproc init {args} {
  280.     $self instvar opts_ ns_ rng_
  281.     set ns_ [Simulator instance]
  282.     $self set_raw_opt
  283.     $self process_args $args
  284.     
  285.     # Seed random no. generator; ns-random with arg of 0 heuristically
  286.     # chooses a random number that changes on each invocation.
  287.     $self instvar rng_
  288.     set rng_ [new RNG]
  289.     $rng_ seed $opts_(ns-random-seed)
  290.     $rng_ next-random
  291.     $self init_network
  292. }
  293. # create a new pair of end nodes
  294. TrafficGen/ManyTCP instproc create_client_nodes {node} {
  295.     $self instvar opts_ bottle_l_ bottle_r_ cs_l_ cs_r_ sources_ 
  296.     cs_count_ ns_ rng_
  297.     set now [$ns_ now]
  298.     if {![info exists opts_(client-nodes-l:$node)]} {
  299. set cs_l_($node) [$ns_ node]
  300.     } else {
  301. set cs_l_($node) $opts(client-nodes-l:$node)
  302.     }
  303.     if {![info exists opts_(client-nodes-r:$node)]} {
  304. set cs_r_($node) [$ns_ node]
  305.     } else {
  306. set cs_r_($node) $opts(client-nodes-r:$node)
  307.     }
  308.     # Set delay.
  309.     set delay $opts_(client-delay)
  310.     if {$delay == "random"} {
  311. set delay [$rng_ exponential [time_parse $opts_(client-delay-range)]]
  312.     }
  313.     # Now divide the delay into the two haves and set up the network.
  314.     set ldelay [$rng_ uniform 0 $delay]
  315.     set rdelay [expr $delay - $ldelay]
  316.     
  317.     my-duplex-link $ns_ $cs_l_($node) $bottle_l_ $opts_(client-bw) $ldelay $opts_(client-queue-method) $opts_(client-queue-length)
  318.     my-duplex-link $ns_ $cs_r_($node) $bottle_r_ $opts_(client-bw) $rdelay $opts_(client-queue-method) $opts_(client-queue-length)
  319.     
  320.     # Add routing in all directions
  321.     $cs_l_($node) add-route-to-adj-node -default $bottle_l_
  322.     $cs_r_($node) add-route-to-adj-node -default $bottle_r_
  323.     $bottle_l_ add-route-to-adj-node $cs_l_($node)
  324.     $bottle_r_ add-route-to-adj-node $cs_r_($node)
  325.     
  326.     if {$opts_(debug)} {
  327. # puts "t=[format %.3f $now]: node pair $node created"
  328. # puts "delay $delay ldelay $ldelay"
  329.     }
  330. }
  331. # Get the number of the node pair
  332. TrafficGen/ManyTCP instproc get_node_number { client_number } {
  333.         $self instvar opts_
  334.     if {$opts_(node-number) > 0} {
  335. set node [expr $client_number % $opts_(node-number)]
  336.     } else {
  337. set node $client_number
  338.     }
  339.     return $node
  340. }
  341. # return the client index
  342. TrafficGen/ManyTCP instproc create_a_client {} {
  343.     $self instvar opts_ cs_l_ cs_r_ sources_ cs_count_ ns_ rng_
  344.     # Get the client number for the new client.
  345.     set now [$ns_ now]
  346.     set i $cs_count_
  347.     incr cs_count_
  348.     set node $i
  349.     if {[expr $i % 100] == 0} {
  350. puts "t=[format %.3f $now]: client $i created"
  351.     }
  352.     # Get the source and sink nodes.
  353.     if {$opts_(node-number) > 0} {
  354. if {$node < $opts_(node-number) } {
  355.     $self create_client_nodes $node
  356. } else {
  357.     set node [$self get_node_number $i]
  358. }
  359.     } else {
  360. $self create_client_nodes $node
  361.     }
  362.     if {$opts_(debug)} {
  363. # puts "t=[format %.3f $now]: client $i uses node pair $node"
  364.     }
  365.     
  366.     # create sources and sinks in both directions
  367.     # (actually, only one source per connection, for now)
  368.     if {[$rng_ integer 100] < $opts_(client-reverse-chance)} {
  369. set sources_($i) [$ns_ create-connection-list $opts_(source-tcp-method) $cs_r_($node) $opts_(sink-ack-method) $cs_l_($node) $i]
  370.     } else {
  371. set sources_($i) [$ns_ create-connection-list $opts_(source-tcp-method) $cs_l_($node) $opts_(sink-ack-method) $cs_r_($node) $i]
  372.     }
  373.     [lindex $sources_($i) 0] set maxpkts_ 0
  374.     [lindex $sources_($i) 0] set packetSize_ $opts_(client-pkt-size)
  375.     
  376.     # Set up a callback when this client ends.
  377.     [lindex $sources_($i) 0] proc done {} "$self finish_a_client $i"
  378.     
  379.     if {$opts_(debug)} {
  380. # puts "t=[$ns_ now]: client $i created"
  381.     }
  382.     
  383. return $i
  384. }
  385. #
  386. # Make a batch of clients to amortize the cost of routing recomputation
  387. # (actually no longer improtant).
  388. #
  389. TrafficGen/ManyTCP instproc create_some_clients {} {
  390.     $self instvar opts_ idle_clients_ ns_ cs_count_
  391.     set now [$ns_ now]
  392.     set step 16
  393.     if {$opts_(debug)} {
  394. puts "t=[format %.3f $now]: creating clients $cs_count_ to [expr $cs_count_ + $step - 1]"
  395.     }
  396.     
  397.     for {set i 0} {$i < $step} {incr i} {
  398. lappend idle_clients_ [$self create_a_client]
  399.     }
  400.     
  401.     # debugging:
  402.     # puts "after client_create:"
  403.     # $ns_ gen-map
  404.     # $self instvar bottle_l_ bottle_r_
  405.     # puts "bottle_l_ classifier_:"
  406.     # [$bottle_l_ set classifier_] dump
  407.     # puts "bottle_r_ classifier_:"
  408.     # [$bottle_r_ set classifier_] dump
  409. }
  410. TrafficGen/ManyTCP instproc start_a_client {} {
  411.     $self instvar opts_ idle_clients_ ns_ sources_ rng_ 
  412.     source_start_ source_size_ clients_started_
  413. set i ""
  414. set now [$ns_ now]
  415. # can we reuse a dead client?
  416. if {![info exists idle_clients_]} {
  417. set idle_clients_ ""
  418. }
  419. while {$idle_clients_ == ""} {
  420. $self create_some_clients
  421. }
  422. set i [lindex $idle_clients_ 0]
  423. set idle_clients_ [lrange $idle_clients_ 1 end]
  424. # Reset the connection.
  425. [lindex $sources_($i) 0] reset
  426. [lindex $sources_($i) 1] reset 
  427. # Start traffic for that client.
  428. if {[$rng_ integer 100] < $opts_(client-mouse-chance)} {
  429. set len $opts_(client-mouse-packets)
  430. } else {
  431. set len $opts_(client-elephant-packets)
  432. }
  433. [lindex $sources_($i) 0] advanceby $len
  434. set source_start_($i) $now
  435. set source_size_($i) $len
  436. if {$opts_(debug)} {
  437.  # puts "t=[$ns_ now]: client $i started, ldelay=[format %.6f $ldelay], rdelay=[format %.6f $rdelay]"
  438. puts "t=[format %.3f $now]: client $i started"
  439. }
  440. incr clients_started_
  441. }
  442. TrafficGen/ManyTCP instproc finish_a_client {i} {
  443.     $self instvar opts_ ns_ idle_clients_ source_start_ source_size_ 
  444.     clients_finished_
  445.     set now [$ns_ now]
  446.     if {$opts_(debug)} {
  447. set delta [expr $now - $source_start_($i)]
  448. puts "t=[format %.3f $now]: client $i finished ($source_size_($i) pkts, $delta s)"
  449.     }
  450.     
  451.     lappend idle_clients_ $i
  452.     incr clients_finished_
  453. }
  454. TrafficGen/ManyTCP instproc schedule_continuing_traffic {} {
  455.     $self instvar opts_ ns_ rng_
  456.     $self start_a_client
  457.     # schedule the next one
  458.     set next [expr [$ns_ now]+([$rng_ exponential]/$opts_(client-arrival-rate))]
  459.     if {$opts_(debug)} {
  460. # puts "t=[$ns_ now]: next continuing traffic at $next"
  461.     }
  462.     $ns_ at $next "$self schedule_continuing_traffic"
  463. }
  464. TrafficGen/ManyTCP instproc schedule_initial_traffic {} {
  465.     $self instvar opts_ idle_clients_
  466.     
  467.     # Start with no pending clients.
  468.     
  469.     # Start initial clients.
  470.     for {set i 0} {$i < $opts_(initial-client-count)} {incr i} {
  471. $self start_a_client
  472.     }
  473. }
  474. TrafficGen/ManyTCP instproc open_trace { stop_time } {
  475.     $self instvar opts_ ns_ trace_file_ nam_trace_file_ 
  476.     trace_filename_
  477.     set trace_filename_ $opts_(trace-filename)
  478.     exec rm -f "$trace_filename_.tr"
  479.     set trace_file_ [open "$trace_filename_.tr" w]
  480.     set stop_actions "close $trace_file_"
  481.     if {$opts_(namtrace-some) || $opts_(namtrace-all)} {
  482. exec rm -f "$trace_filename_.nam"
  483. set nam_trace_file_ [open "$trace_filename_.nam" w]
  484. set $stop_actions "$stop_actions; close $nam_trace_file_"
  485.     } else {
  486. set nam_trace_file_ ""
  487.     }
  488.     $ns_ at $stop_time "$stop_actions; $self finish"
  489.     return "$trace_file_ $nam_trace_file_"
  490. }
  491. # There seems to be a problem with the foll function, so quit plotting 
  492. # with -a -q, use just -a.
  493. TrafficGen/ManyTCP instproc finish {} {
  494.     $self instvar opts_ fmon_ trace_filename_ ns_ cs_count_ 
  495.     clients_started_ clients_finished_
  496.     puts "total clients started: $clients_started_"
  497.     puts "total clients finished: $clients_finished_"
  498.     if {$opts_(print-drop-rate)} {
  499. set drops [$fmon_ set pdrops_]
  500. set pkts [$fmon_ set parrivals_]
  501. puts "total_drops $drops total_packets $pkts"
  502. set droprate [expr 100.0*$drops / $pkts ]
  503. puts [format "drop_percentage %7.4f" $droprate]
  504.     }
  505.     if {$opts_(trace-filename) != "none"} {
  506. set title $opts_(title)
  507. set flow_factor 1
  508. if {$opts_(graph-scale) == "2"} {
  509.     set flow_factor 100
  510.                 }
  511. # Make sure that we run in place even without raw2xg in our path
  512. # (for the test suites).
  513. set raw2xg raw2xg
  514. if [file exists ../../bin/raw2xg] {
  515. set raw2xg ../../bin/raw2xg
  516. }
  517. set raw2xg_opts ""
  518. if {$opts_(graph-join-queueing)} {
  519. set raw2xg_opts "$raw2xg_opts -q"
  520. }
  521. # always run raw2xg because maybe we need the output
  522. set cmd "$raw2xg -a $raw2xg_opts -n $flow_factor < $trace_filename_.tr >$trace_filename_.xg"
  523. eval "exec $cmd"
  524. if {$opts_(graph-results)} {
  525. if {$opts_(graph-join-queueing)} {
  526. exec xgraph -t $title  < $trace_filename_.xg &
  527. } else {
  528. exec xgraph -tk -nl -m -bb -t $title < $trace_filename_.xg &
  529. }
  530. }
  531. if {$opts_(test-suite)} {
  532. exec cp $trace_filename_.xg $opts_(test-suite-file)
  533. }
  534. # exec raw2xg -a < out.tr | xgraph -t "$opts_(server-tcp-method)" &
  535. }
  536. if {$opts_(mem-trace)} {
  537. $ns_ clearMemTrace
  538. }
  539. exit 0
  540. }
  541. TrafficGen/ManyTCP instproc trace_stuff {} {
  542.     $self instvar opts_ bottle_l_ bottle_r_ ns_ trace_file_ 
  543.     nam_trace_file_
  544. $self open_trace $opts_(duration)
  545. if {$opts_(trace-all)} {
  546. $ns_ trace-all $trace_file_
  547. }
  548. if {$opts_(namtrace-all)} {
  549. $ns_ namtrace-all $nam_trace_file_
  550. } elseif {$opts_(namtrace-some)} {
  551. # xxx
  552. $bottle_l_ dump-namconfig
  553. $bottle_r_ dump-namconfig
  554. [$ns_ link $bottle_l_ $bottle_r_] dump-namconfig
  555. $ns_ namtrace-queue $bottle_l_ $bottle_r_ $nam_trace_file_
  556. $ns_ namtrace-queue $bottle_r_ $bottle_l_ $nam_trace_file_
  557. }
  558. # regular tracing.
  559. # trace left-to-right only
  560.         $ns_ trace-queue $bottle_l_ $bottle_r_ $trace_file_
  561.         $ns_ trace-queue $bottle_r_ $bottle_l_ $trace_file_
  562. # Currently tracing is somewhat broken because
  563. # of how the plumbing happens.
  564. }
  565. TrafficGen/ManyTCP instproc start {} {
  566.     $self instvar ns_ opts_
  567.     if {$opts_(trace-filename) == "none"} {
  568. $ns_ at $opts_(duration) "$self finish"
  569.     } else {
  570. $self trace_stuff
  571.     }
  572.     if {$opts_(gen-map)} {
  573. $ns_ gen-map
  574.     }
  575.     
  576.     $self schedule_initial_traffic
  577.     if {$opts_(client-arrival-rate) != 0} {
  578. $self schedule_continuing_traffic
  579.     }
  580.     
  581.     if {$opts_(gen-map)} {
  582. $ns_ gen-map
  583.     }       
  584.     Agent/TCP set syn_ true
  585.     Agent/TCP set delay_growth_ true
  586.     Agent/TCP set windowInit_ 1
  587.     Agent/TCP set windowInitOption_ 1
  588.     if {$opts_(init-win) == "0"} {
  589. Agent/TCP set windowInitOption_ 2
  590.     } elseif {$opts_(init-win) == "10"} {
  591. Agent/TCP set windowInitOption_ 1
  592. Agent/TCP set windowInit_ 10
  593.     } elseif {$opts_(init-win) == "20"} {
  594. Agent/TCP set windowInitOption_ 1
  595. Agent/TCP set windowInit_ 20
  596. puts "init-win 20"
  597.     }
  598. }