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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996-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. # Created May 98 by Ahmed Helmy; updated June 98
  31. # agent generator class
  32. Class AgentGen
  33. proc agent-usage { } {
  34. puts stderr {usage: agents [options]
  35. where options are given as: -key value
  36. example options:
  37. -outfile f -transport TCP/Reno -num 20 -src FTP -sink TCPSink 
  38. -start 1-3 -stop 6-8 
  39. "agents -h" for help
  40. }
  41. return
  42. }
  43. proc detailed-usage { } {
  44. puts {usage: agents [-<key 1> <value 1> -<key n> <value n>]
  45. example1:
  46. agents -outfile f -transport TCP -num 20 -src FTP -sink TCPSink -srcstub 4-7,12
  47. -deststub 8-11,15 
  48. example2:
  49. agents -outfile f -transport SRM -num 50 -src Telnet -srcstub 1,3 -deststub 2,4-20 
  50. -srcnum 10%
  51. Keys:
  52. -outfile: the filename to which the generated script will be
  53. written.
  54. -transport: [now supports only TCP and SRM and their variants]
  55.  values: 
  56.   tcp types:
  57.  TCP [TCP Tahoe], TCP/Reno, TCP/NewReno, TCP/Sack1, 
  58.  TCP/Vegas, TCP/Fack
  59.   srm types:
  60. SRM, SRM/Deterministic , SRM/Probabilistic, SRM/Adaptive
  61. details:
  62. SRM: C1 = C2 = 2 (request param), D1 = D2 = 1 (repair param)
  63. Deterministic: C2 = 0, D2 = 0
  64. Probabilistic: C1 = D1 = 0
  65. -src: FTP [default with TCPs], Telnet, CBR, CBR/UDP.
  66. CBR is a constant bit rate source,
  67. CBR/UDP same as CBR but with ability to use traffic 
  68. models [such as pareto and exponential, described next]
  69. -traffic: [the traffic model, may be used with CBR/UDP]
  70. Expoo: Exponential on/off model
  71. Pareto: Pareto on/off model
  72. -sink: [now used for sinks of tcp connections]
  73.  values:
  74.  TCPSink,TCPSink/DelAck,TCPSink/Sack1,TCPSink/Sack1/DelAck,FullTcp 
  75. details:
  76. one way rxvg agents: TCPSink (1 ack per packet) , 
  77. TCPSink/DelAck (w/ delay per ack), TCPSink/Sack1 (selective ack
  78. sink rcf2018), TCPSink/Sack1/DelAck (sack1 with DelAck)
  79. 2 way "FullTcp": Reno sender
  80. -num: number of tcp connections or total srm agents.
  81. Given as either absolute value indicating number of
  82. nodes, or as percentage of the total number of nodes in
  83. the topology (e.g. 60%).
  84. [for srm the default is all nodes are agents]
  85. -srcstub: the stubs from the sources are going to originate. stubs can be
  86.         defined as a number, percentage or as a range. Nodes in the stub are selected 
  87.         randomly. 
  88.         e.g -srcstub <10> (indicates simply stub 10) or
  89.         -srcstub <1-6,8,10-15> (meaning all stubs between 1 to 6 and 10 to 15 and stub 8 
  90. shall have n (as defined) number of source nodes or
  91.         -srcstub <1-6> , includes all stubs only from 1 to 6.
  92.         Stubs are used to determine membership/flow distribution for a given topology
  93.         and can be used to control dense or sparse mode simulation.
  94.         Defaults to all stubs in topology.
  95. -deststub: Stubs from which the destination nodes are going to originate. deststubs are
  96.         also defined as absolute numbers, percentages or as range. 
  97.         e.g -deststub <10> or
  98.         -deststub <1-5,8-10> or
  99. -destnode <1-6>. 
  100.         Defaults to all stubs in topology.
  101. -srcnum: the number of srm agents that are also sources
  102. [defaults to 10% of total nodes]
  103. -start: starting time of the tcp connections, or srm sources. May
  104. be given as a range x1-x2, in which different random
  105. starting times from the range will be assigned to
  106. different agents, or may be given as value x at which 
  107. all agents start (default is 0)
  108. -stop: (format similar to start) stop the sources
  109. -join: (format similar to start) when srm agents join the group
  110. -leave: (format similar to start) when srm agents leave
  111. [not support by srm yet!]
  112. -totalnodes: the number of nodes to be used by the agent
  113. generator as the total # nodes in the topology.
  114. [if left out, the agent generator asks the
  115. topology generator for this info.]
  116.   }
  117. }
  118. proc agents { args } {
  119. set len [llength $args]
  120. if { $len } {
  121.     set key [lindex $args 0]
  122.             if {$key == "-?" || $key == "--help" || $key == "-help" 
  123. || $key == "-h" } {
  124. detailed-usage
  125. return
  126.                 }
  127. }
  128.         if { !$len || [expr $len % 2] } {
  129.                 # if number is odd => error !
  130.                 puts "fewer number of arguments than needed in "$args""
  131. agent-usage
  132. return
  133.         }
  134. if { [catch {set ag [AgentGen info instances]}] } {
  135. puts "can't create AgentGen ..!!"
  136. agent-usage
  137. return
  138. }
  139. if { $ag == "" } {
  140. set ag [new AgentGen]
  141. }
  142. $ag create $args
  143. }
  144. AgentGen instproc init { } {
  145. $self next
  146. }
  147. AgentGen instproc default_options { } {
  148. $self instvar opt_info
  149. set opt_info {
  150. # init file to -1, must be supplied by input
  151. outfile -1
  152. transport -1
  153. src -1
  154. sink -1
  155. num -1
  156. srcstub -1
  157. deststub -1
  158. # may add location same_stub/other_stub later
  159. # start range either a number x or range x1-x2
  160. start 0
  161. stop 0
  162. # srm srcnum
  163. srcnum 10%
  164. traffic -1
  165. join  0
  166. leave 0
  167. totalnodes 0
  168. }
  169. $self parse_opts
  170. }
  171. AgentGen instproc parse_opts { } {
  172. $self instvar opts opt_info
  173. while { $opt_info != ""} {
  174. # parse line by line
  175.                 if {![regexp "^[^n]*n" $opt_info line]} {
  176.                         break  
  177.                 }
  178. # remove the parsed line
  179.                 regsub "^[^n]*n" $opt_info {} opt_info
  180. # remove leading spaces and tabs using trim
  181.                 set line [string trim $line]
  182. # skip comment lines beginning with #
  183.                 if {[regexp "^[ t]*#" $line]} {
  184.                         continue
  185.                 }
  186. # skip empty lines
  187.                 if {$line == ""} {
  188.                         continue
  189.                 } elseif {[regexp {^([^ ]+)[ ]+([^ ]+)$} $line dummy key value]} {
  190.                         set opts($key) $value
  191.                 } 
  192. }
  193. }
  194. AgentGen instproc parse_input { args } {
  195. # remove the list brackets from the args list
  196.         set args [lindex $args 0]
  197.         set len [llength $args]
  198. $self instvar opts
  199. for { set i 0 } { $i < $len } { incr i } {
  200. set key [lindex $args $i]
  201. regsub {^-} $key {} key
  202.                 if {![info exists opts($key)]} {
  203. puts stderr "unrecognized option $key"
  204. agent-usage
  205. return -1
  206. }
  207. incr i
  208. puts "changing $key from $opts($key) to [lindex $args $i]"
  209. set opts($key) [lindex $args $i]
  210. }
  211. # puts "end of parsing... "
  212. return 0
  213. }
  214. AgentGen instproc create { args } {
  215.         # remove the list brackets from the args list
  216.         set args [lindex $args 0]
  217.         set len [llength $args]
  218.         # puts "calling create with args $args, len $len"
  219. $self default_options
  220. if { $len } {
  221. if { [$self parse_input $args] == -1 } {
  222. return 
  223. }
  224. }
  225. # check that the filename is provided
  226. $self instvar opts
  227. if { $opts(outfile) == -1 } {
  228.  puts {you must provide outfile. Use "agents -h" for help}
  229. return
  230. }
  231. $self save-command $opts(outfile) $args
  232. $self create-agents
  233. }
  234. # we save the commands to append them to the end of the file
  235. AgentGen instproc save-command { file command } {
  236. global AllCommandLines
  237. # XXX clear the commands if this is a new file
  238. if { ![file exists $file] } {
  239. set f [open $file w]
  240. # XXX complete
  241. # puts $f "header info... "
  242. puts $f "n proc generate-agents { sim nodes } { n"
  243. puts $f "t upvar $nodes n; upvar $sim ns n"
  244. # initialize the fid to 0
  245. puts $f "t set fid 0nn"
  246. flush $f; close $f
  247. set AllCommandLines ""
  248. }
  249. $self instvar commandLine
  250. set commandLine "agents $command"
  251. lappend AllCommandLines $commandLine
  252. }
  253. AgentGen instproc create-agents { } {
  254. $self instvar opts
  255. # puts "transport $opts(transport)"
  256. set transport -1
  257. regexp {^([a-zA-Z]+)} $opts(transport) all transport
  258. switch $transport {
  259. "TCP" {
  260. if { [$self check-tcp $opts(transport)] == -1 || 
  261.  [$self check-tcp-sink $opts(sink)] == -1 } {
  262. puts "invalid or unsupported tcp or sink option"
  263. return -1
  264. }
  265. set tcp $opts(transport)
  266. set sink $opts(sink)
  267. set src $opts(src)
  268. if { $src == -1 } {
  269. puts "you left out the source..!! using FTP"
  270. set src FTP
  271. }
  272. # check location of stubs (src and dest)
  273. $self check-TCP-location 
  274. set num [$self calc-num $opts(num)]
  275. # we open the file in append mode since we allow 
  276. # multiple agents commands in one script...
  277. set f [open $opts(outfile) a]
  278. set str [$self preamble-tcp]
  279. puts $f "$str"
  280. # may add topological semantics for src,dst
  281. # placemnt .. later.. for now use all (i.e.
  282. # randomize over all nodes)
  283. # set str [$self generate-tcp-agents $tcp $src 
  284.     # $sink $num all]
  285. set str [$self generate-tcp-agents $tcp $src $sink $num]
  286. puts $f "$str"
  287.   
  288.   set start $opts(start)
  289.   set stop $opts(stop)
  290.   set str [$self generate-src-start $start $stop $num]
  291.   puts $f "$str"
  292.   flush $f
  293.   close $f
  294. }
  295. # can merge the checks in check-$type proc..later
  296. "SRM" {
  297. # may want to add a check on multicast and
  298. # either assign default mrouting, or flag an
  299. # error if mrouting is not enabled
  300.   # if left out, use SRM default
  301.   if { [$self check-srm $opts(transport)] == -1 } {
  302. puts "invalid or unsupported srm option"
  303. return -1
  304.   }
  305.   set srm $opts(transport)
  306.   set num [$self calc-num $opts(num)]
  307.   set srcnum [$self calc-num $opts(srcnum)]
  308.   $self check-SRM-location
  309.   
  310.   set f [open $opts(outfile) a]
  311.   set str [$self preamble-srm]
  312.   puts $f "$str"
  313.   set src $opts(src)
  314.   set traffic $opts(traffic)
  315.   #set str [$self generate-srm-agents $srm $num $srcnum $src $traffic all]
  316.   set str [$self generate-srm-agents $srm $num 
  317.        $srcnum $src $traffic]
  318.   puts $f "$str"
  319.   # may want to check on these values.. later X
  320.   set join $opts(join)
  321.   set leave $opts(leave)
  322.   set start $opts(start)
  323.   set stop $opts(stop)
  324.   set str [$self generate-srm-patterns $join 
  325. $leave $num $start $stop $srcnum]
  326.   puts $f "$str"
  327.   flush $f
  328.   close $f
  329.   
  330. }
  331. "-1" {
  332.  puts "transport was not specified !!"
  333.  # should we return for now
  334.  return -1
  335. }
  336. default { 
  337.   puts "unknown or unsupported transport "$opts(transport)""
  338.   return -1
  339. }
  340. }
  341. }
  342. AgentGen instproc check-tcp { type } {
  343. set tcps { "" /Reno /NewReno /Sack1 /Vegas /Fack /FullTcp }
  344. foreach tcp $tcps {
  345. if { $type == "TCP$tcp" } {
  346. return 1
  347. }
  348. }
  349. return -1
  350. }
  351. AgentGen instproc check-tcp-sink { sink } {
  352. set sinks { TCPSink TCPSink/DelAck TCPSink/Sack1 
  353.   TCP/Sink/Sack1/DelAck FullTcp }
  354. foreach snk $sinks {
  355. if { $snk == $sink } {
  356. return 1
  357. }
  358. }
  359. return -1
  360. }
  361. AgentGen instproc create-stub-location { type } {
  362. $self instvar opts
  363. set loc $opts($type)
  364. if {$loc == -1} {
  365.       puts "nLocation not specified: using randomized distribution for $typen"
  366. } else {
  367. foreach L [split $loc ,] {
  368. set S [split $L -]
  369. if {[llength $S] == 2} {
  370. for {set x [lindex $S 0]} {$x <= [lindex $S 1]} {incr x} {
  371. lappend opts($type-list) $x
  372. }
  373. } else {
  374. lappend opts($type-list) [lindex $S 0]
  375. }
  376. }
  377. #puts "list of $type - [list $opts($type-list)]"
  378. }
  379. }
  380. AgentGen instproc check-TCP-location { } {
  381. $self instvar opts
  382. $self create-stub-location srcstub
  383. $self create-stub-location deststub
  384. if {$opts(srcstub) != $opts(deststub)} {
  385. if {[llength $opts(srcstub-list)] != [llength $opts(deststub-list)]} {
  386. puts "Error: #srcstubs donot match with #deststubs - all stubs are now being considered"
  387. set opts(srcstub) -1
  388. set opts(deststub) -1
  389. }
  390. }
  391. }
  392. AgentGen instproc check-srm { type } {
  393. set types { "" /Deterministic /Probabilistic /Adaptive }
  394. foreach srmtype $types {
  395. if { $type == "SRM$srmtype" } {
  396. return 1
  397. }
  398. }
  399. return -1
  400. }
  401. AgentGen instproc check-SRM-location { } {
  402. $self instvar opts
  403. $self create-stub-location srcstub
  404. $self create-stub-location deststub
  405. }
  406. # XXX testing hack
  407. # Class TG
  408. # TG proc get-total-nodes { } {
  409. # return 25
  410. # }
  411. AgentGen instproc getNodes { range } {
  412. $self instvar opts
  413. if { $range == "all" && $opts(totalnodes)} {
  414. # total nodes provided at cmd line
  415. return $opts(totalnodes)
  416. } else {
  417. #
  418. # total nodes was not provided at cmd line so ask
  419. # topology generator. and for all other topology
  420. # semantics query topology generator as follows:
  421. # all (all nodes), total-stubs (total # stubs),
  422. # transit<num> (node number for that transit, e.g transit4 will return
  423. # 3) , stub<num> (range of nodes in the stub, e.g stub2 returns the range
  424. # 11-18).
  425. #
  426. if {[catch {set tg [ScenGen getTG]}]} {
  427. puts stderr {Can't find topology generator..quiting!
  428. Either run the topology generator first, or provide the total
  429. number of nodes using the "totalnodes" option.
  430. Use "agents -h" for more help.}
  431. exit
  432. }
  433. return [$tg getNodes $range]
  434. }
  435. }
  436. # should there be an SRMGen class (and TCPGen class..etc) !
  437. AgentGen instproc calc-num { num } {
  438. set totalNodes [$self getNodes all]
  439. if { $num == -1 } {
  440. # if num is left out, assign a number
  441. # equal to the number of nodes
  442. set number $totalNodes
  443. } elseif { [regexp {^([0-9]+)(%)$} $num all num per] } {
  444. #
  445. # check for percentage 
  446. #
  447. set number [expr $totalNodes * $num / 100]
  448. } else { set number $num }
  449.  #puts "num $number"
  450. return $number
  451. }
  452. AgentGen instproc get-tcp-stubs { num } {
  453. $self instvar opts
  454. set pairs ""
  455. for {set i 0} {$i < [llength $opts(srcstub-list)]} {incr i} {
  456. set p [lindex $opts(srcstub-list) $i]
  457. set sr [split [$self getNodes stub$p] :]
  458. set q [lindex $opts(deststub-list) $i]
  459. set dr [split [$self getNodes stub$q] :]
  460. set temp [$self randomize-agent-pairs [lindex $sr 0] 
  461.    [lindex $sr 1] [lindex $dr 0] [lindex $dr 1] $num]
  462. set pairs [ concat $pairs $temp]
  463. }
  464. puts "pairs = $pairs"
  465. return $pairs
  466. }
  467. AgentGen instproc get-srm-stubs { num srcnum } {
  468. $self instvar opts
  469. set srcnodes ""
  470. set destnodes ""
  471. for {set i 0} {$i < [llength $opts(srcstub-list)]} {incr i} {
  472. set p [lindex $opts(srcstub-list) $i]
  473. set sr [split [$self getNodes stub$p] :]
  474. set src [$self randomize-agents [lindex $sr 0] [lindex $sr 1] 
  475.       $srcnum]
  476. set srcnodes [concat $scrnodes $src]
  477. }
  478. for {set i 0} {$i < [llength $opts(deststub-list)]} {incr i} {
  479. set q [lindex $opts(deststub-list) $i]
  480. set dr [split [$self getNodes stub$q] :]
  481. set dest [$self randomize-agents [lindex $dr 0] 
  482.        [lindex $dr 1] [expr $num - $srcnum]]
  483. set destnodes [concat $destnodes $dest]
  484. }
  485. set opts(srcstub-list) $srcnodes
  486. set opts(deststub-list) $destnodes
  487. }
  488. # should have SRMGen/TCPGen/'transport'Gen generate-agents...etc.
  489. AgentGen instproc generate-srm-agents { srm num srcnum src traffic } {
  490. $self instvar opts
  491. # puts "generate srm agents $srm $num $srcnum $src $traffic"
  492. set totalNodes [$self getNodes all]
  493. if { $opts(srcstub) == -1 || $opts(deststub) == -1} {
  494. # we assume that num is less that totalNodes..X
  495. # and  incase totalNodes < num, more than one srm src/recvr agent shall
  496. # be attached to nodes.
  497. set nodes [$self randomize-agents 0 $totalNodes $num]
  498. set srcNodes [lrange $nodes 0 [expr $srcnum -1]]
  499. set rcvrNodes [lrange $nodes $srcnum end]
  500. } else {
  501. $self get-srm-stubs $num $srcnum
  502. set srcNodes $opts(srcstub-list)
  503. set rcvrNodes $opts(deststub-list)
  504. }
  505. set a_5 "n # generate $num $srm agents, $srcnum of which are n"
  506. set a_4 "# srcs $src/$traffic. Distribute randomly. n"
  507. set a_1 "n set group [Node allocaddr] n"
  508. # create agents assume 1 srm agent per node
  509. # if we are going to use array names and array size, then
  510. # use unset to remove any left over arrays from previous commands
  511. # check that we don't need those arrays again
  512. # e.g. unset srm, unset srmsrc, unset s, unset src... etc XXX
  513. # may create one loop for both srmsrc and srm .. later X
  514. set a "foreach i {$rcvrNodes} { n"
  515. set b "t set srm($i) [new Agent/$srm] n"
  516. # set the group ... and other params.. XXX
  517. set c "t $srm($i) set dst_addr_ $group n"
  518. set d "t $ns attach-agent $n($i) $srm($i) n } n"
  519. set str1 "$a_5 $a_4 $a_1 $a $b $c $d"
  520. set ba "foreach i {$srcNodes} { n"
  521. set bb "t set srmsrc($i) [new Agent/$srm] n"
  522. # set the group ... and other params.. XXX
  523. set bc "t $srmsrc($i) set dst_addr_ $group n"
  524. set bd "t $ns attach-agent $n($i) $srmsrc($i) n"
  525. # assign the srcs
  526. set f "t set s($i) [new Agent/$src] n"
  527. # traffic is only used with CBR UDP
  528. if { $src == "CBR/UDP" } {
  529.  set g "t set traffic($i) [new Traffic/$traffic] n"
  530.  # assign the trfc params. later... burst, idle, rate..XXX
  531.  set h "t $s($i) attach-traffic $traffic($i) n"
  532. } else { set g ""; set h ""; }
  533. set i "t $srmsrc($i) traffic-source $s($i) n } n"
  534. set str2 "$ba $bb $bc $bd $f $g $h $i"
  535. set str "$str1 $str2"
  536. # puts "generate srm done"
  537. return $str
  538. }
  539. AgentGen instproc commandLine { } {
  540. $self instvar commandLine
  541. return $commandLine
  542. }
  543. AgentGen instproc preamble-tcp { } {
  544. set separator {#################}
  545. set a "n $separator n"
  546. set ab "# The command line generating this part of the script is: n"
  547. set ac "# [$self commandLine]"
  548. set ae "nn #XXX cuz we use [array names src], we unset it first.n"
  549. set b "catch {unset src} n"
  550. return "$a $ab $ac $a $ae $b"
  551. }
  552. AgentGen instproc preamble-srm { } {
  553. set separator "#################"
  554. set a "n $separator n"
  555. set ab "# The command line generating this part of the script is: n"
  556. set ac "# [$self commandLine]"
  557. #set ad $a
  558. set ae "nn # XXX cuz we use array names of srm and srmsrc, we unset.n"
  559. set b "catch {unset srmsrc} n"
  560. set c "catch {unset srm} n"
  561. return "$a $ab $ac $a $ae $b $c"
  562. }
  563. # node-ranges to be extended to capture topological semantics
  564. AgentGen instproc generate-tcp-agents { tcp src sink num } {
  565. $self instvar opts
  566. #
  567. # puts "generate tcp $tcp $src $sink $num $node_ranges"
  568. #
  569. set totalNodes [$self getNodes all]
  570. #
  571. # assume there's an API to get the total num of nodes in 
  572. # the topology simulated, also we may need an API to 
  573. # get ranges of topological significance (like stub
  574. # ranges..etc), topology type.. so on..
  575. #
  576. if { $opts(srcstub) == -1 || $opts(deststub) == -1 } {
  577. #
  578. # no specific stub given for src/dest location.
  579. #
  580. set pairs [$self randomize-agent-pairs 0 $totalNodes 
  581.        0 $totalNodes $num]
  582. } else {
  583. #
  584.   # may use topology info (e.g. stubs) to get
  585. # the pairs
  586. #
  587. set pairs [$self get-tcp-stubs $num]
  588. #puts "tcp pairs = [list $pairs]"
  589. }
  590. set a_5 "n # generate $num connections of $tcp, using $sink n"
  591. set a_4 "# sink types, and $src sources. Distribute randomly. n"
  592. set a_1 "n set i 0 n"
  593. set a "foreach pair {$pairs} { n"
  594. set b "t set sorc [lindex $pair 0] n"
  595. set c "t set dst [lindex $pair 1] n"
  596. # set the fid
  597. set d_1 "t incr fid n"
  598. set d "t set tcp($i) [$ns create-connection $tcp $n($sorc) $sink $n($dst) $fid] n"
  599. set e "t set src($i) [$tcp($i) attach-source $src] n"
  600. set f "t incr i n }"
  601. set str "$a_5 $a_4 $a_1 $a $b $c $d_1 $d $e $f"
  602. return $str
  603. }
  604. # check for commonalities bet this and generate-src-start.. X
  605. AgentGen instproc generate-srm-patterns { join leave num 
  606. start stop srcnum } {
  607. #puts "generate srm patterns $join $leave $num $start 
  608. # $stop $srcnum"
  609. # for now ignore the leave and stop until I know if
  610. # if they apply to srm agents or not !! XXX
  611. set ex {regexp {^([0-9]+)[-]([0-9]+)$}}
  612. set strstart "" ;
  613. set done(start) 0;
  614. set ext "-source"
  615. foreach event { start } {
  616.   if { [eval "$ex [set $event] all begin end"] } {
  617. set str [$self randomize-time $begin $end $srcnum]
  618. set a_5 "n # randomize $event times in the [$begin,$end] rangen"
  619. set a_4 "# for $srcnum srm sources. n"
  620. set a "n set i 0 n"
  621. set ab "set times {$str} n"
  622. set b "foreach j [array names srmsrc] { n"
  623. set bb "t set time [lindex $times $i] n"
  624. set c "t $ns at $time "$srmsrc($j) $event$ext" n"
  625. set d "t incr i n } n"
  626. set str$event "$a_5 $a_4 $a $ab $b $bb $c $d"
  627. set done($event) 1
  628.   } 
  629. }
  630. if { !$done(start) } {
  631. set a_1 " # start all $srcnum srm sources at $start. n"
  632. set a "foreach i [array names srmsrc] { n"
  633. set b "t $ns at $start "$srmsrc($i) start-source" n } n"
  634. set strstart "$a_1 $a $b"
  635. }
  636. if { [eval "$ex $join all begin end"] } {
  637. set str [$self randomize-time $begin $end $num]
  638. set srcNodes [lrange $str 0 
  639. [expr [array size srmsrc] -1]]
  640. set rcvrNodes [lrange $str [array size srmsrc] end]
  641. set a_1 "n # randomize the join times for $num srm agents inn" 
  642. set a_2 "# the range [$begin,$end] n"
  643. set a "n set i 0 n"
  644. set ab "set times {$str} n"
  645. set b "foreach j [array names srmsrc] { n"
  646. set bb "t set time [lindex $times $i] n"
  647. set c "t $ns at $time "$srmsrc($j) start" n"
  648. set d "t incr i n } n"
  649. set e "foreach j [array names srm] { n"
  650. set f "t set time [lindex $times $i] n"
  651. set g "t $ns at $time "$srm($j) start" n"
  652. set h "t incr i n } n"
  653. set strjoin "$a_1 $a_2 $a $ab $b $bb $c $d $e $f $g $h"
  654. } else {
  655. set a_1 "# srm agents join at $joinn"
  656. set a "foreach j [array names srm] { n"
  657. set b "t $ns at $join "$srm($j) start" n } n"
  658. set c "foreach j [array names srmsrc] { n"
  659. set d "t $ns at $join "$srmsrc($j) start" n } n"
  660. set strjoin "$a_1 $a $b $c $d"
  661. }
  662. return "$strstart $strjoin"
  663. }
  664. AgentGen instproc generate-src-start { start stop num } {
  665. # puts "generate src $start $stop $num"
  666. set ex {regexp {^([0-9]+)[-]([0-9]+)$}}
  667. set strstart "" ; set strstop ""
  668. set done(start) 0; set done(stop) 0
  669. # assume the start and stop intervals don't overlap,
  670. # we do not check if start is before stop for an agent XXX
  671. foreach event { start stop } {
  672.   if { [eval "$ex [set $event] all begin end"] } {
  673. set str [$self randomize-time $begin $end $num]
  674. set a_2 "n # randomize the $event time for the $num sources inn" 
  675. set a_1 "# the range [$begin,$end]n"
  676. set a "n set i 0 n"
  677. set b "foreach time {$str} { n"
  678. set c "t $ns at $time "$src($i) $event" n"
  679. set d "t incr i n } n"
  680. set str$event "$a_2 $a_1 $a $b $c $d"
  681. set done($event) 1
  682.   } 
  683. }
  684. if { $done(start) && ($done(stop) || !$stop) } {
  685. return "$strstart $strstop"
  686. }
  687. # may want to clear up the src array before this run of
  688. # code generation... to avoid left overs.. XXX
  689. set a "foreach i [array names src] { n"
  690. set a_1 ""; set a_2 ""
  691. if { !$done(start) } {
  692. set a_2 "# start the sources at $start n"
  693. set b "t $ns at $start "$src($i) start" n"
  694. } else { set b "" }
  695. if { !$done(stop) && $stop } {
  696. set a_1 "# stop the sources at $stop n"
  697. set c "t $ns at $stop "$src($i) stop" n"
  698. } else { set c "" }
  699. set d "}"
  700. set str "$a_2 $a_1 $a $b $c $d"
  701. return "$strstart $strstop $str"
  702. }
  703. # the following takes as input the interval (first, last) from
  704. # which distinct 'number' of ints are randomly chosen and returned.
  705. # It is assumed that number <= interval
  706. AgentGen instproc randomize-agents { first last number } {
  707. set interval [expr $last - $first]
  708. set result ""
  709. #
  710. # code below that checked for duplication of nodes 
  711. # resulted in infinite loops where "interval" was much smaller than 
  712. # "number". Hence will generate a warning instead, changing "number" 
  713. # to value of "interval". -Padma (July 15, '98).
  714. #
  715. if {$number > [expr $interval * 2]} {
  716. puts "tinterval = $interval is much larger than number = $number
  717. Changing number from $number to $interval"
  718. set number $interval
  719. }
  720. set maxrval [expr pow(2,31)]
  721. set intrval [expr $interval/$maxrval]
  722. for { set i 0 } { $i < $number } { incr i } {
  723. set randval [expr [ns-random] * $intrval]
  724. set randNode [expr int($randval) + $first]
  725.  if { [info exists done($randNode)] } {
  726.   set i [expr $i - 1]
  727.  #puts "do again, $randNode exists -> i = $i"
  728.   } else {
  729.   set done($randNode) 1
  730.   lappend result $randNode
  731.   #puts "result = $result"
  732.   }
  733. }
  734. #puts "result = $result"
  735. return $result
  736. }
  737. #### may need to check if 'number' of connections exceed the interval range.
  738. # takes in src and dst ranges (first,last) from which 'number' of
  739. # distinct [i.e. src != dst] src,dst pairs are chosen
  740. # the result is a list of pairs
  741. AgentGen instproc randomize-agent-pairs { srcfirst srclast 
  742. dstfirst dstlast number } {
  743. set srcinterval [expr $srclast - $srcfirst]
  744. set dstinterval [expr $dstlast - $dstfirst]
  745. set result ""
  746. set maxrval [expr pow(2,31)]
  747. set srcintrval [expr $srcinterval/$maxrval]
  748. set dstintrval [expr $dstinterval/$maxrval]
  749. for { set i 0 } { $i < $number } { incr i } {
  750. set srcrandval [expr [ns-random] * $srcintrval]
  751. set srcrandNode [expr int($srcrandval) + $srcfirst]
  752. while { 1 } {
  753.   set dstrandval [expr [ns-random] * $dstintrval]
  754.   set dstrandNode [expr int($dstrandval) + $dstfirst]
  755.   if { $srcrandNode != $dstrandNode } {
  756. break
  757.   }
  758. }
  759. lappend result [list $srcrandNode $dstrandNode]
  760. }
  761. return $result
  762. }
  763. AgentGen instproc randomize-time { first last number } {
  764. set times ""
  765. set interval [expr $last - $first]
  766. set maxrval [expr pow(2,31)]
  767. set intrval [expr $interval/$maxrval]
  768. for { set i 0 } { $i < $number } { incr i } {
  769. set randtime [expr ([ns-random] * $intrval) + $first]
  770. # XXX include only 6 decimals (i.e. usec)
  771. lappend times [format "%.6f" $randtime]
  772. }
  773. return $times
  774. }
  775. proc mark-end { file } {
  776. global AllCommandLines
  777. # puts "mark end of file $file"
  778. if { [catch {set f [open $file a]}] } {
  779. puts "can't append to file $file"
  780. }
  781. set a_1 " n } ; # ending the generate-agents proc.nn"
  782. set a "############## End of file marker ##########n"
  783. set b "# Following are the command lines used:"
  784. puts $f "$a_1 $a $b"
  785. foreach cmdLine $AllCommandLines {
  786. puts $f " # $cmdLine"
  787. }
  788. flush $f
  789. close $f
  790. }