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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1997 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. # This file was contributed by Curtis Villamizar <curtis@ans.net>, May 1997.
  32. # Maintainer: John Heidemann <johnh@isi.edu>.
  33. #
  34. #
  35. # WARNING:  This code uses the compatibility library and so should not
  36. # be used as an example.  Hopefully at some time in the future it will
  37. # be updated.
  38. #
  39. #
  40. # Start with the idea of a four node test environment.
  41. #
  42. #  cN -------- ispN -------- nsp1 -------- nsp2 -------- sN
  43. #      28.8kb        1.54mb        44.2mb        1.54mb
  44. #     modemdelay    ispdelay      netdelay      taildelay
  45. #
  46. # Assume there are http N clients c(n) and N servers s(n) and
  47. # each of the clients is served by a different providers isp(n).  The
  48. # delay from the modem is fixes at modemdelay.  There is a random
  49. # delay in the range of zero to ispdelay between the ISP and the
  50. # bottleneck link nsp1-nsp2.  The bottleneck has a delay of netdelay.
  51. # There is also a random delay between the bottleneck link and each
  52. # server in the range of taildelay_lo to taildelay_hi.
  53. #
  54. proc create_testnet {} {
  55.     global testnet flows background
  56.     # use a fixed seed - change if multiple tests needed
  57.     ns-random $testnet(seed)
  58.     set testnet(nsp1) [ns node]
  59.     set testnet(nsp2) [ns node]
  60.     if {$testnet(verbose)} {
  61. puts "ttestnet(nsp1)t$testnet(nsp1)"
  62. puts "ttestnet(nsp2)t$testnet(nsp2)"
  63.     }
  64.     set netlink [ns_duplex $testnet(nsp1) $testnet(nsp2) 
  65.     $testnet(netspeed) $testnet(netdelay) $testnet(netqtype)]
  66.     if {$testnet(netqtype) == "red"} {
  67. set redlink [ns link $testnet(nsp1) $testnet(nsp2)]
  68. $redlink set thresh [expr $testnet(netqueue) * 0.25]
  69. $redlink set maxthresh [expr $testnet(netqueue) * 0.85]
  70. $redlink set q_weight 0.001
  71. $redlink set wait_ 1
  72. $redlink set dropTail_ 1
  73.     } elseif {$testnet(netqtype) == "sfq"} {
  74. set sfqlink [ns link $testnet(nsp1) $testnet(nsp2)]
  75. $sfqlink set limit $testnet(netqueue)
  76. $sfqlink set buckets [expr $testnet(netqueue) >> 2]
  77.     } else {
  78. [lindex $netlink 0] set queue-limit $testnet(netqueue)
  79. [lindex $netlink 1] set queue-limit $testnet(netqueue)
  80.     }
  81.     if {$testnet(quiet) == 0} {
  82. puts [format "creating %d links for clickers" $testnet(clickers)]
  83.     }
  84.     for {set pair 0} {$pair < $testnet(numisp)} {incr pair} {
  85. set ispdelay [format "%dms" 
  86. [expr ( $testnet(ispdelay) * ( [ns-random] >> 16 ) ) >> 16]]
  87. set isp [format "isp%d" $pair]
  88. set testnet($isp) [ns node]
  89. if {$testnet(verbose) != 0} {
  90.     puts "ttestnet(isp=$isp)t$testnet($isp)"
  91. }
  92.     }
  93.     for {set pair 0} {$pair < $testnet(clickers)} {incr pair} {
  94. set client [format "c%d" $pair]
  95. set server [format "s%d" $pair]
  96. set testnet($server) [ns node]
  97. if {$testnet(verbose) != 0} {
  98.     puts "ttestnet(server=$server)t$testnet($isp)"
  99. }
  100. set isp [format "isp%d" [expr $pair % $testnet(numisp)]]
  101. set dest [format "d%d" $pair]
  102. set taildelay [format "%dms" 
  103. [expr $testnet(taildelay_lo) + 
  104. ( ( ( $testnet(taildelay_hi) - $testnet(taildelay_lo) ) 
  105. * ( [ns-random] >> 16 ) ) >> 16 )]]
  106. if {$testnet(doproxy) == 0} {
  107.     set testnet($client) [ns node]
  108.     if {$testnet(verbose) != 0} {
  109. puts "ttestnet(client=$client)t$testnet($client)"
  110.     }
  111.     set modemlink 
  112.     [ns_duplex $testnet($client) $testnet($isp) 
  113.     $testnet(modemspeed) $testnet(modemdelay) 
  114.     $testnet(modemqtype)]
  115.     [lindex $modemlink 0] set queue-limit $testnet(modemqueue)
  116.     [lindex $modemlink 1] set queue-limit $testnet(modemqueue)
  117.     ns_duplex $testnet($isp) $testnet(nsp1) 
  118.     $testnet(ispspeed) $ispdelay $testnet(netqtype)
  119.     set testnet($dest) $testnet($client)
  120. } else {
  121.     # this is a hack - make the isp the actual client
  122.     ns_duplex $testnet($isp) $testnet(nsp1) 
  123.     $testnet(ispspeed) $ispdelay $testnet(netqtype)
  124.     set testnet($dest) $testnet($isp)
  125. }
  126. ns_duplex $testnet(nsp2) $testnet($server) 
  127. $testnet(ispspeed) $taildelay $testnet(netqtype)
  128.     }
  129.     if {$testnet(quiet) == 0} {
  130. puts [format "creating %d links for background" $background(nflows)]
  131.     }
  132.     set ident [expr $testnet(clickers) * (1 + $flows(inlines_needed))]
  133.     for {set pair 0} {$pair < $background(numisp)} {incr pair} {
  134. set client [format "c%d" $ident]
  135. set server [format "s%d" $ident]
  136. set isp [format "isp%d" $ident]
  137. incr ident;
  138. set testnet($client) [ns node]
  139. set testnet($server) [ns node]
  140. if {$testnet(verbose) != 0} {
  141.     puts "ttestnet(client=$client)t$testnet($client)"
  142.     puts "ttestnet(server=$server)t$testnet($server)"
  143. }
  144. set ispdelay [format "%dms" 
  145. [expr ( $testnet(ispdelay) * ( [ns-random] >> 16 ) ) >> 16]]
  146. set taildelay [format "%dms" 
  147. [expr $testnet(taildelay_lo) + 
  148. ( ( ( $testnet(taildelay_hi) - $testnet(taildelay_lo) ) 
  149. * ( [ns-random] >> 16 ) ) >> 16 )]]
  150. if {$testnet(bkgproxy) == 0} {
  151.     set testnet($isp) [ns node]
  152.     if {$testnet(verbose) != 0} {
  153. puts "ttestnet(isp=$isp)t$testnet($isp)"
  154.     }
  155.     set modemlink 
  156.     [ns_duplex $testnet($client) $testnet($isp) 
  157.     $testnet(modemspeed) $testnet(modemdelay) 
  158.     $testnet(modemqtype)]
  159.     [lindex $modemlink 0] set queue-limit $testnet(modemqueue)
  160.     [lindex $modemlink 1] set queue-limit $testnet(modemqueue)
  161.     ns_duplex $testnet($isp) $testnet(nsp1) 
  162.     $testnet(ispspeed) $ispdelay $testnet(netqtype)
  163. } else {
  164.     ns_duplex $testnet($client) $testnet(nsp1) 
  165.     $testnet(ispspeed) $ispdelay $testnet(netqtype)
  166. }
  167. ns_duplex $testnet(nsp2) $testnet($server) 
  168. $testnet(ispspeed) $taildelay $testnet(netqtype)
  169.     }
  170.     if {$testnet(quiet) == 0} {
  171. puts "testnet topology completed"
  172.     }
  173. }
  174. proc trigger { xresults } {
  175.     global testnet flows
  176.     # NEEDSWORK:  should we really indirect once down results like this?
  177.     set results "[lindex $xresults 0]"
  178.     set type [lindex $results 0]
  179.     if { $type != "-" && $type != "d" } {
  180. return;
  181.     }
  182.     set id [lindex $results 7]
  183.     if {$id > $testnet(clickers) * (1 + $flows(inlines_needed))} {
  184. return;
  185.     }
  186.     set counter [format "count%d" $id]
  187.     if { [info exists flows($counter)] } {
  188. incr flows($counter)
  189.     } else {
  190. set flows($counter) 1
  191.     }
  192.     set last last$id
  193.     set flows($last) [ns now]
  194.     if { $type != "-" } {
  195. return;
  196.     }
  197.     set base [expr $id - ( $id % $flows(flows_per) )]
  198.     set got [expr 1 + [lindex $results 10]]
  199.     set isrunning isrunning$id
  200.     if {$flows($isrunning)} {
  201. if { $id == $base } {
  202.     if { $got == $testnet(httpsize) } {
  203. if {$testnet(quiet) == 0} {
  204.     puts [format "http flow completed at %s" 
  205.     [lindex $results 1]]
  206. }
  207. set flows_running [format "flows_running%d" $base]
  208. incr flows($flows_running) -1
  209. incr flows(total_running) -1
  210. set flows($isrunning) 0
  211.     }
  212. } else {
  213.     if { $got == $testnet(inlinesize) } {
  214. if {$testnet(quiet) == 0} {
  215.     puts [format "inline%d completed at %s" 
  216.     $id [lindex $results 1]]
  217. }
  218. set flows_running [format "flows_running%d" $base]
  219. incr flows($flows_running) -1
  220. set inlines_running [format "inlines_running%d" $base]
  221. incr flows($inlines_running) -1
  222. incr flows(total_running) -1
  223. set flows($isrunning) 0
  224.     }
  225. }
  226.     }
  227.     set basecount count$base
  228.     if { $flows($basecount) > 1 } {
  229. set inlines_started [format "inlines_started%d" $base]
  230. set flows_running [format "flows_running%d" $base]
  231. set inlines_running [format "inlines_running%d" $base]
  232. while {$flows($inlines_started) < $flows(inlines_needed) 
  233. && $flows($flows_running) < $flows(flows_allowed) 
  234. && $flows($inlines_running) < $flows(inlines_allowed) } {
  235.     incr flows($inlines_started)
  236.     incr flows($flows_running)
  237.     incr flows($inlines_running)
  238.     incr flows(total_running)
  239.     set ident [expr $base + $flows($inlines_started)]
  240.     set nextflow [format "tcp%d" $ident]
  241.     if {$testnet(quiet) == 0} {
  242. puts [format "at %7.3f start %s : %d running" 
  243. [lindex $results 1] $nextflow $flows(total_running)]
  244.     }
  245.     if {$flows(persist)} {
  246. for {set j $base} {$j < $ident} {incr j} {
  247.     set isrunning isrunning$j
  248.     if {$flows($isrunning) == 0} {
  249. set thisflow flow$ident
  250. set otherflow flow$j
  251. $flows($thisflow) persist $flows($otherflow)
  252. break
  253.     }
  254. }
  255.     }
  256.     $flows($nextflow) start
  257.     incr testnet(needed) $testnet(inlinesize)
  258.     set isrunning isrunning$ident
  259.     set flows($isrunning) 1
  260.     set first first$ident
  261.     set flows($first) [ns now]
  262.     set last last$ident
  263.     set flows($last) flows($first)
  264. }
  265.     }
  266. }
  267. proc openTrace { stopTime testName } {
  268.     exec rm -f out.tr
  269.     set traceFile [open out.tr w]
  270.     ns at $stopTime "stopsource $traceFile $testName"
  271.     set T [ns trace]
  272.     $T attach $traceFile
  273.     return $T
  274. }
  275. proc stopsource { traceFile testName } {
  276.     global flows testnet
  277.     set flows(startnew) 0
  278.     if {$flows(total_running) == 0} {
  279. close $traceFile
  280. finish $testName"
  281.     # "  hack for emacs fontification
  282. exit 0
  283.     } else {
  284. if {$testnet(quiet) == 0} {
  285.     puts [format "at [ns now] %d flows still running" 
  286.     $flows(total_running)]
  287. }
  288. ns at [expr [ns now] + 100] "stopsource $traceFile $testName"
  289.     }
  290. }
  291. proc finish file {
  292.     global testnet flows
  293.     set total 0
  294.     set ident 0
  295.     for {set pair 0} {$pair < $testnet(clickers)} {incr pair} {
  296. set first first$ident
  297. set firstpkt $flows($first)
  298. set lastpkt $firstpkt
  299. set lastimg $firstpkt
  300. for { set i 0 } { $i <= $flows(inlines_needed) } { incr i } {
  301.     set counter [format "count%d" $ident]
  302.     set got $flows($counter)
  303.     incr total $got
  304.     set last last$ident
  305.     set elapsed [expr $flows($last) - $firstpkt]
  306.     if {$testnet(quiet) == 0} {
  307. puts [format "flow %3d %d : %3d packets, elapsed %7.3f" 
  308. $ident $i $got $elapsed]
  309.     }
  310.     if {$flows($last) > $lastpkt} {
  311. set lastpkt $flows($last)
  312.     }
  313.     if {$i <= 1 && $flows($last) > $lastimg} {
  314. set lastimg $flows($last)
  315.     }
  316.     incr ident
  317. }
  318. set elapsed [expr $lastpkt - $firstpkt]
  319. set elapsimg [expr $lastimg - $firstpkt]
  320. if {$testnet(quiet) == 0} {
  321.     puts [format "clicker %3d : elapsed %7.3f %7.3f" 
  322.     $pair $elapsimg $elapsed]
  323. }
  324. set bucket [expr int((10 * $elapsed) + 0.999)]
  325. if {[info exists histogram($bucket)]} {
  326.     incr histogram($bucket)
  327. } else {
  328.     set histogram($bucket) 1
  329. }
  330. set bucket [expr int((10 * $elapsimg) + 0.999)]
  331. if {[info exists histimg($bucket)]} {
  332.     incr histimg($bucket)
  333. } else {
  334.     set histimg($bucket) 1
  335. }
  336.     }
  337.     set needed $testnet(needed)
  338.     set discard [expr $total - $needed]
  339.     puts [format "%d sent : %d needed : %d discarded : %d %%" 
  340.     $total $needed $discard [expr 100 * $discard / $needed]]
  341.     puts "histogram of http plus first image times"
  342.     foreach bucket [lsort -integer [array names histimg]] {
  343. puts [format "1st image  seconds:occurances  %6.1f : %4d" 
  344. [expr 0.1 * $bucket] $histimg($bucket)]
  345.     }
  346.     puts "histogram of complete clicker transfer time"
  347.     foreach bucket [lsort -integer [array names histogram]] {
  348. puts [format "clicker  seconds:occurances  %6.1f : %4d" 
  349. [expr 0.1 * $bucket] $histogram($bucket)]
  350.     }
  351. }
  352. proc init_tcp_flow {size pair ident} {
  353.     global testnet flows
  354.     set taskid [format "tcp%d" $ident ]
  355.     set flowid [format "flow%d" $ident]
  356.     set dest [format "d%d" $pair]
  357.     set server [format "s%d" $pair]
  358.     set flow [ns_create_connection tcp-reno 
  359.     $testnet($server) tcp-sink $testnet($dest) $ident]
  360.     $flow set window $testnet(window)
  361.     $flow set packet-size $testnet(mss)
  362.     $flow set maxcwnd $testnet(window)
  363.     set flows($flowid) $flow 
  364.     set flows($taskid) [$flow source ftp]
  365.     $flows($taskid) set maxpkts_ $size
  366. }
  367. proc setup_http_test {} {
  368.     global testnet flows background
  369.     create_testnet
  370.     set trigger $testnet(starttime)
  371.     for {set pair 0} {$pair < $testnet(clickers)} {incr pair} {
  372. set base [expr $pair * $flows(flows_per)]
  373. set ident $base
  374. set inlines_started [format "inlines_started%d" $base]
  375. set flows_running [format "flows_running%d" $base]
  376. set inlines_running [format "inlines_running%d" $base]
  377. set counter [format "count%d" $ident]
  378. set flows($inlines_started) 0
  379. set flows($flows_running) 0
  380. set flows($inlines_running) 0
  381. init_tcp_flow $testnet(httpsize) $pair $ident
  382. set flows($counter) 0
  383. for { set i 1 } { $i <= $flows(inlines_needed) } { incr i } {
  384.     incr ident
  385.     init_tcp_flow $testnet(inlinesize) $pair $ident
  386. }
  387. ns at $trigger "start_http $base"
  388. set addms [expr ($testnet(clickdelay) * ([ns-random] >> 16)) >> 16]
  389. set trigger [expr $trigger + (0.001 * $addms)]
  390.     }
  391.     set testnet(needed) 0
  392.     set flows(total_running) 0
  393.     set trigger $background(start)
  394.     set offset [expr $testnet(clickers) * (1 + $flows(inlines_needed))]
  395.     for {set pair 0} {$pair < $background(nflows)} {incr pair} {
  396. set ident [expr $offset + ($pair % $background(numisp))]
  397. set client [format "c%d" $ident]
  398. set server [format "s%d" $ident]
  399. set isp [format "isp%d" $ident]
  400. set ident [expr $offset + $pair + 1]
  401. set flow [ns_create_connection tcp-reno 
  402. $testnet($server) tcp-sink $testnet($client) $ident]
  403. $flow set window $background(window)
  404. $flow set packet-size $background(mss)
  405. $flow set maxcwnd $background(window)
  406. set tcp_id [$flow source ftp]
  407. set bkgsize [expr $background(minsize) 
  408. + ((($background(maxsize) - $background(minsize)) 
  409. * ([ns-random] >> 16)) >> 16)]
  410. $tcp_id set maxpkts_ $bkgsize
  411. if {$testnet(quiet) == 0} {
  412.     puts [format "at %7.3f start background flow %d - %d" 
  413.     $trigger $pair $bkgsize]
  414. }
  415. ns at $trigger "$tcp_id start"
  416. set addms [expr ($background(delay) * ([ns-random] >> 16)) >> 16]
  417. set trigger [expr $trigger + (0.001 * $addms)]
  418.     }
  419.     # trace only the NSP bottleneck link
  420.     set traceme [openTrace $testnet(testlimit) test_http]
  421.     set bottleneck [ns link $testnet(nsp2) $testnet(nsp1)]
  422.     $bottleneck trace $traceme
  423.     $bottleneck callback { trigger }
  424.     if {$testnet(gen_map)} {
  425. ns gen-map
  426.     }
  427. }
  428. proc start_http { base } {
  429.     global testnet flows
  430.     set flows_running [format "flows_running%d" $base]
  431.     incr flows($flows_running)
  432.     set flow tcp$base
  433.     if {$testnet(quiet) == 0} {
  434. puts [format "at %7.3f start http%d" [ns now] $base]
  435.     }
  436.     $flows($flow) start
  437.     incr testnet(needed) $testnet(httpsize)
  438.     incr flows(total_running)
  439.     set isrunning isrunning$base
  440.     set flows($isrunning) 1
  441.     set first first$base
  442.     set flows($first) [ns now]
  443.     set last last$base
  444.     set flows($last) flows($first)
  445. }
  446. proc set_globals {} {
  447.     global testnet flows background
  448.     set testnet(starttime) 10.0
  449.     set testnet(netdelay) 35ms
  450.     set testnet(modemdelay) 50ms
  451.     set testnet(ispdelay) 25
  452.     set testnet(taildelay_lo) 1
  453.     set testnet(taildelay_hi) 25
  454.     set testnet(netspeed) 512kb
  455.     set testnet(modemspeed) 28.8kb
  456.     set testnet(ispspeed) 1.54mb
  457.     set testnet(window) 64
  458.     set testnet(mss) 512
  459.     set testnet(httpsize) 6
  460.     set testnet(inlinesize) 40
  461.     set testnet(modemqueue) 24
  462.     set testnet(netqueue) 40
  463.     set testnet(clickers) 10
  464.     set testnet(clickdelay) 500
  465.     set testnet(testlimit) 500.0
  466.     set testnet(quiet) 0
  467.     set testnet(verbose) 1
  468.     set testnet(seed) 1
  469.     set testnet(netqtype) drop-tail
  470.     set testnet(modemqtype) drop-tail
  471.     set testnet(doproxy) 0
  472.     set testnet(bkgproxy) 0
  473.     set testnet(numisp) 2
  474.     set testnet(gen_map) 0
  475.     set flows(inlines_started) 0
  476.     set flows(inlines_needed) 3
  477.     set flows(flows_running) 0
  478.     set flows(flows_allowed) 4
  479.     set flows(inlines_running) 0
  480.     set flows(inlines_allowed) $flows(flows_allowed)
  481.     set flows(flows_per) [expr $flows(inlines_needed) + 1]
  482.     set flows(persist) 0
  483.     set background(nflows) 150
  484.     set background(start) 0.0
  485.     set background(window) 64
  486.     set background(mss) 512
  487.     set background(minsize) 2
  488.     set background(maxsize) 120
  489.     set background(delay) 2000
  490.     set background(numisp) [expr $background(nflows) >> 4]
  491. }
  492. proc process_args {} {
  493.     global argc argv testnet flows background
  494.     for {set i 0} {$i < $argc} {incr i} {
  495. set arg [lindex $argv $i]
  496. switch x$arg {
  497.     x-delayN {
  498. incr i
  499. set testnet(netdelay) [lindex $argv $i]
  500.     }
  501.     x-delayM {
  502. incr i
  503. set testnet(modemdelay) [lindex $argv $i]
  504.     }
  505.     x-delayI {
  506. incr i
  507. set testnet(ispdelay) [lindex $argv $i]
  508.     }
  509.     x-delayTlo {
  510. incr i
  511. set testnet(taildelay_lo) [lindex $argv $i]
  512.     }
  513.     x-delayThi {
  514. incr i
  515. set testnet(taildelay_hi) [lindex $argv $i]
  516.     }
  517.     x-delayT {
  518. incr i
  519. set testnet(taildelay_hi) [lindex $argv $i]
  520. set testnet(taildelay_lo) 0
  521.     }
  522.     x-netspeed {
  523. incr i
  524. set testnet(netspeed) [lindex $argv $i]
  525.     }
  526.     x-ispspeed {
  527. incr i
  528. set testnet(ispspeed) [lindex $argv $i]
  529.     }
  530.     x-modemspeed {
  531. incr i
  532. set testnet(modemspeed) [lindex $argv $i]
  533.     }
  534.     x-window {
  535. incr i
  536. set testnet(window) [lindex $argv $i]
  537. if {$testnet(bkgproxy)} {
  538.     set background(window) [lindex $argv $i]
  539. }
  540.     }
  541.     x-mss {
  542. incr i
  543. set testnet(mss) [lindex $argv $i]
  544.     }
  545.     x-httpsize {
  546. incr i
  547. set testnet(httpsize) [lindex $argv $i]
  548.     }
  549.     x-inlinesize {
  550. incr i
  551. set testnet(inlinesize) [lindex $argv $i]
  552.     }
  553.     x-modemqueue {
  554. incr i
  555. set testnet(modemqueue) [lindex $argv $i]
  556.     }
  557.     x-netqueue {
  558. incr i
  559. set testnet(netqueue) [lindex $argv $i]
  560.     }
  561.     x-testlimit {
  562. incr i
  563. set testnet(testlimit) [lindex $argv $i]
  564.     }
  565.     x-clickers {
  566. incr i
  567. set testnet(clickers) [lindex $argv $i]
  568.     }
  569.     x-clickdelay {
  570. incr i
  571. set testnet(clickdelay) [lindex $argv $i]
  572.     }
  573.     x-inlines {
  574. incr i
  575. set flows(inlines_needed) [lindex $argv $i]
  576.     }
  577.     x-maxflow {
  578. incr i
  579. set flows(flows_allowed) [lindex $argv $i]
  580.     }
  581.     x-maxinline {
  582. incr i
  583. set flows(inlines_allowed) [lindex $argv $i]
  584.     }
  585.     x-bkg-flows {
  586. incr i
  587. set background(nflows) [lindex $argv $i]
  588.     }
  589.     x-bkg-window {
  590. incr i
  591. set background(window) [lindex $argv $i]
  592.     }
  593.     x-bkg-mss {
  594. incr i
  595. set background(mss) [lindex $argv $i]
  596.     }
  597.     x-bkg-minsize {
  598. incr i
  599. set background(minsize) [lindex $argv $i]
  600.     }
  601.     x-bkg-maxsize {
  602. incr i
  603. set background(maxsize) [lindex $argv $i]
  604.     }
  605.     x-bkg-delay {
  606. incr i
  607. set background(delay) [lindex $argv $i]
  608.     }
  609.     x-start {
  610. incr i
  611. set testnet(starttime) [lindex $argv $i]
  612.     }
  613.     x-bkg-start {
  614. incr i
  615. set background(start) [lindex $argv $i]
  616.     }
  617.     x-numisp {
  618. incr i
  619. set testnet(numisp) [lindex $argv $i]
  620.     }
  621.     x-bkgisp {
  622. incr i
  623. set background(numisp) [lindex $argv $i]
  624.     }
  625.     x-seed {
  626. incr i
  627. set testnet(seed) [lindex $argv $i]
  628.     }
  629.     x-modemred {
  630. set testnet(modemqtype) red
  631.     }
  632.     x-netred {
  633. set testnet(netqtype) red
  634.     }
  635.     x-red {
  636. set testnet(netqtype) red
  637. set testnet(modemqtype) red
  638.     }
  639.     x-sfq {
  640. set testnet(netqtype) sfq
  641.     }
  642.     x-proxy {
  643. set testnet(doproxy) 1
  644.     }
  645.     x-bkgproxy {
  646. set testnet(bkgproxy) 1
  647. set background(window) 16
  648.     }
  649.     x-allproxy {
  650. set testnet(doproxy) 1
  651. set testnet(bkgproxy) 1
  652. set background(window) 16
  653.     }
  654.     x-tail {
  655. set testnet(netqtype) drop-tail
  656. set testnet(modemqtype) drop-tail
  657.     }
  658.     x-persist {
  659. set flows(persist) 1
  660.     }
  661.     x-nopersist {
  662. set flows(persist) 0
  663.     }
  664.     x-quiet {
  665. set testnet(quiet) 1
  666.     }
  667.     x-ns-gen-map {
  668. set testnet(gen_map) 1
  669.     }
  670.     default {
  671. puts [format "unrecognized argument: %s" [lindex $argv $i]]
  672. exit 1
  673.     }
  674. }
  675.     }
  676. }
  677. proc report_conditions {} {
  678.     global testnet flows background
  679.     if {$flows(inlines_allowed) > $flows(flows_allowed)} {
  680. set flows(inlines_allowed) $flows(flows_allowed)
  681.     }
  682.     puts [format "delays: net %s, modem %s, isp 0-%dms, tail %d-%dms" 
  683.     $testnet(netdelay) $testnet(modemdelay) $testnet(ispdelay) 
  684.     $testnet(taildelay_lo) $testnet(taildelay_hi)]
  685.     puts [format "link speeds: net %s, modem %s, isp %s" 
  686.     $testnet(netspeed) $testnet(modemspeed) $testnet(ispspeed)]
  687.     puts [format "queues: modem %d, net %d, (isp and tail not congested)" 
  688.     $testnet(modemqueue) $testnet(netqueue)]
  689.     if {$flows(persist)} {
  690. set ispersistant "HTTP 1.1 (persistent)"
  691.     } else {
  692. set ispersistant "pre- HTTP 1.1"
  693.     }
  694.     puts [format "window %d, mss %d, %s, http %d(%d), inline %d(%d)" 
  695.     $testnet(window) $testnet(mss) $ispersistant 
  696.     $testnet(httpsize) [expr $testnet(mss) * $testnet(httpsize)] 
  697.     $testnet(inlinesize) [expr $testnet(mss) * $testnet(inlinesize)]]
  698.     puts [format "sources: %d clickers, spaced 0-%dms, seed for random= %d" 
  699.     $testnet(clickers) $testnet(clickdelay) $testnet(seed)]
  700.     puts [format 
  701.     "%d inlines per page, %d flows per client, %d inlines running" 
  702.     $flows(inlines_needed) $flows(flows_allowed) 
  703.     $flows(inlines_allowed)]
  704.     puts [format 
  705.     "%d bkg flows, window %d, mss %d, size %d-%d pkts, every 0-%dms" 
  706.     $background(nflows) $background(window) $background(mss) 
  707.     $background(minsize) $background(maxsize) $background(delay)]
  708.     puts [format "start bkg at %s, test at %s, run test for %s seconds" 
  709.     $background(start) $testnet(starttime) $testnet(testlimit)]
  710.     if {$testnet(doproxy)} {
  711. set doingproxy "proxy HTTP"
  712.     } else {
  713. set doingproxy "no proxy HTTP"
  714.     }
  715.     if {$testnet(bkgproxy) > 1} {
  716. set dobkgproxy "bkg proxy HTTP"
  717.     } else {
  718. set dobkgproxy "no bkg proxy"
  719.     }
  720.     puts [format "queue: modem= %s, net= %s, %s, %s" 
  721.     $testnet(modemqtype) $testnet(netqtype) $doingproxy $dobkgproxy]
  722. }
  723. set_globals
  724. process_args
  725. report_conditions
  726. setup_http_test
  727. ns run