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

通讯编程

开发平台:

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. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-source.tcl,v 1.25 2000/11/01 21:47:59 xuanc Exp $
  32. #
  33. #  NOTE:  Could consider renaming this file to ns-app.tcl and moving the
  34. #  backward compatible code to ns-compat.tcl
  35. #set ns_telnet(interval) 1000ms
  36. #set ns_bursty(interval) 0
  37. #set ns_bursty(burst-size) 2
  38. #set ns_message(packet-size) 40
  39. Class Application/FTP -superclass Application
  40. Application/FTP instproc init {} {
  41. $self next
  42. }
  43. Application/FTP instproc start {} {
  44. [$self agent] send -1
  45. }
  46. # Causes TCP to send no more new data.
  47. Application/FTP instproc stop {} {
  48. [$self agent] advance 0
  49. [$self agent] close
  50. }
  51. Application/FTP instproc send {nbytes} {
  52. [$self agent] send $nbytes
  53. }
  54. # For sending packets.  Sends $pktcnt packets.
  55. Application/FTP instproc produce { pktcnt } {
  56. [$self agent] advance $pktcnt
  57. }
  58. # For sending packets.  Sends $pktcnt more packets.
  59. Application/FTP instproc producemore { pktcnt } {
  60. [$self agent] advanceby $pktcnt
  61. }
  62. # Backward compatibility
  63. Application/Traffic instproc set args {
  64. $self instvar packetSize_ rate_
  65. if { [lindex $args 0] == "packet_size_" } {
  66. if { [llength $args] == 2 } {
  67. set packetSize_ [lindex $args 1]
  68. return
  69. } elseif { [llength $args] == 1 } {
  70. return $packetSize_
  71. }
  72. }
  73. eval $self next $args
  74. }
  75. # Helper function to convert rate_ into an interval_
  76. #Hicked to generate pulse UDP traffic (seperate rate_ and interval_).
  77. Application/Traffic/CBR instproc set args {
  78. $self instvar packetSize_ rate_
  79. if { [lindex $args 0] == "interval_" } {
  80. if { [llength $args] == 2 } {
  81. set ns_ [Simulator instance]
  82. set interval_ [$ns_ delay_parse [lindex $args 1]]
  83. $self set rate_ [expr $packetSize_ * 8.0/$interval_]
  84. return
  85. } elseif { [llength $args] == 1 } {
  86. return [expr $packetSize_ * 8.0/$rate_]
  87. }
  88. }
  89. eval $self next $args
  90. }
  91. #
  92. # Below are backward compatible components
  93. #
  94. Class Agent/CBR -superclass Agent/UDP
  95. Class Agent/CBR/UDP -superclass Agent/UDP
  96. Class Agent/CBR/RTP -superclass Agent/RTP
  97. Class Agent/CBR/UDP/SA -superclass Agent/SA
  98. Agent/SA instproc attach-traffic tg {
  99. $tg attach-agent $self
  100. eval $self cmd attach-traffic $tg
  101. }
  102. Agent/CBR/UDP instproc attach-traffic tg {
  103. $self instvar trafgen_
  104. $tg attach-agent $self
  105. set trafgen_ $tg
  106. }
  107. Agent/CBR/UDP instproc done {} { }
  108. Agent/CBR/UDP instproc start {} {
  109. $self instvar trafgen_
  110. $trafgen_ start
  111. }
  112. Agent/CBR/UDP instproc stop {} {
  113. $self instvar trafgen_
  114. $trafgen_ stop
  115. }
  116. Agent/CBR/UDP instproc advance args {
  117. $self instvar trafgen_
  118. eval $trafgen_ advance $args
  119. }
  120. Agent/CBR/UDP instproc advanceby args {
  121. $self instvar trafgen_
  122. eval $trafgen_ advanceby $args
  123. }
  124. Agent/CBR instproc init {} {
  125. $self next
  126. $self instvar trafgen_ interval_ random_ packetSize_ maxpkts_
  127. # The following used to be in ns-default.tcl
  128. set packetSize_ 210
  129. set random_ 0
  130. set maxpkts_ 268435456
  131. set interval_ 0.00375
  132. set trafgen_ [new Application/Traffic/CBR]
  133. $trafgen_ attach-agent $self
  134. # Convert packetSize_ and interval_ to trafgen_ rate_
  135. $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_]
  136. $trafgen_ set random_ [$self set random_]
  137. $trafgen_ set maxpkts_ [$self set maxpkts_]
  138. $trafgen_ set packetSize_ [$self set packetSize_]
  139. # The line below is needed for backward compat with v1 test scripts 
  140.         if {[Simulator set nsv1flag] == 0} { 
  141.         
  142.     puts "using backward compatible Agent/CBR; use Application/Traffic/CBR instead"
  143. }    
  144. }
  145. Agent/CBR instproc done {} { }
  146. Agent/CBR instproc start {} {
  147. $self instvar trafgen_
  148. $trafgen_ start
  149. }
  150. Agent/CBR instproc stop {} {
  151. $self instvar trafgen_
  152. $trafgen_ stop
  153. }
  154. Agent/CBR instproc advance args {
  155. $self instvar trafgen_
  156. eval $trafgen_ advance $args
  157. }
  158. Agent/CBR instproc advanceby args {
  159. $self instvar trafgen_
  160. eval $trafgen_ advanceby $args
  161. }
  162. # Catches parameter settings for overlying traffic generator object
  163. Agent/CBR instproc set args {
  164. $self instvar interval_ random_ packetSize_ maxpkts_ trafgen_
  165. if { [info exists trafgen_] } {
  166. if { [lindex $args 0] == "packetSize_" } {
  167. if { [llength $args] == 2 } {
  168. $trafgen_ set packetSize_ [lindex $args 1]
  169. set packetSize_ [lindex $args 1]
  170. # Recompute rate 
  171. $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_]
  172.                          return 
  173.                  } elseif { [llength $args] == 1 } {
  174. return $packetSize_
  175.                  }
  176. } elseif { [lindex $args 0] == "random_" } {
  177. if { [llength $args] == 2 } {
  178. $trafgen_ set random_ [lindex $args 1]
  179. set random_ [lindex $args 1]
  180. return
  181.                  } elseif { [llength $args] == 1 } {
  182. return $random_
  183. }
  184. } elseif { [lindex $args 0] == "maxpkts_" } {
  185. if { [llength $args] == 2 } {
  186. $trafgen_ set maxpkts_ [lindex $args 1]
  187. set maxpkts_ [lindex $args 1]
  188. return
  189.                  } elseif { [llength $args] == 1 } {
  190. return $maxpkts_
  191. }
  192. } elseif { [lindex $args 0] == "interval_" } {
  193. if { [llength $args] == 2 } {
  194. set ns_ [Simulator instance]
  195. set interval_ [$ns_ delay_parse [lindex $args 1]]
  196. # Convert interval_ to rate for trafgen_
  197. $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_]
  198. return
  199.                  } elseif { [llength $args] == 1 } {
  200. return $interval_
  201. }
  202. }
  203. }
  204. eval $self next $args
  205. }
  206.  
  207. Class Traffic/Expoo -superclass Application/Traffic/Exponential
  208. Class Traffic/Pareto -superclass Application/Traffic/Pareto
  209. Class Traffic/RealAudio -superclass Application/Traffic/RealAudio
  210. Class Traffic/Trace -superclass Application/Traffic/Trace
  211. # These instprocs are needed to map old Traffic/* type variables
  212. Traffic/Expoo instproc set args {
  213. $self instvar packetSize_ burst_time_ idle_time_ rate_ 
  214. if { [lindex $args 0] == "packet-size" } {
  215. if { [llength $args] == 2 } {
  216. $self set packetSize_ [lindex $args 1]
  217.                         return 
  218.                 } elseif { [llength $args] == 1 } {
  219. return $packetSize_
  220.                 }
  221. } elseif { [lindex $args 0] == "burst-time" } {
  222. if { [llength $args] == 2 } {
  223. $self set burst_time_ [lindex $args 1]
  224.                         return 
  225.                 } elseif { [llength $args] == 1 } {
  226. return $burst_time_
  227.                 }
  228. } elseif { [lindex $args 0] == "idle-time" } {
  229. if { [llength $args] == 2 } {
  230. $self set idle_time_ [lindex $args 1]
  231.                         return 
  232.                 } elseif { [llength $args] == 1 } {
  233. return $idle_time_
  234.                 }
  235. } elseif { [lindex $args 0] == "rate" } {
  236. if { [llength $args] == 2 } {
  237. $self set rate_ [lindex $args 1]
  238.                         return 
  239.                 } elseif { [llength $args] == 1 } {
  240. return $rate_
  241.                 }
  242. }
  243. eval $self next $args
  244. }
  245. Traffic/Pareto instproc set args {
  246. $self instvar packetSize_ burst_time_ idle_time_ rate_ shape_
  247. if { [lindex $args 0] == "packet-size" } {
  248. if { [llength $args] == 2 } {
  249. $self set packetSize_ [lindex $args 1]
  250.                         return 
  251.                 } elseif { [llength $args] == 1 } {
  252. return $packetSize_
  253.                 }
  254. } elseif { [lindex $args 0] == "burst-time" } {
  255. if { [llength $args] == 2 } {
  256. $self set burst_time_ [lindex $args 1]
  257.                         return 
  258.                 } elseif { [llength $args] == 1 } {
  259. return $burst_time_
  260.                 }
  261. } elseif { [lindex $args 0] == "idle-time" } {
  262. if { [llength $args] == 2 } {
  263. $self set idle_time_ [lindex $args 1]
  264.                         return 
  265.                 } elseif { [llength $args] == 1 } {
  266. return $idle_time_
  267.                 }
  268. } elseif { [lindex $args 0] == "rate" } {
  269. if { [llength $args] == 2 } {
  270. $self set rate_ [lindex $args 1]
  271.                         return 
  272.                 } elseif { [llength $args] == 1 } {
  273. return $rate_
  274.                 }
  275. } elseif { [lindex $args 0] == "shape" } {
  276. if { [llength $args] == 2 } {
  277. $self set shape_ [lindex $args 1]
  278.                         return 
  279.                 } elseif { [llength $args] == 1 } {
  280. return $shape_
  281.                 }
  282. }
  283. eval $self next $args
  284. }
  285. Traffic/RealAudio instproc set args {
  286. $self instvar packetSize_ burst_time_ idle_time_ rate_ 
  287. if { [lindex $args 0] == "packet-size" } {
  288. if { [llength $args] == 2 } {
  289. $self set packetSize_ [lindex $args 1]
  290.                         return 
  291.                 } elseif { [llength $args] == 1 } {
  292. return $packetSize_
  293.                 }
  294. } elseif { [lindex $args 0] == "burst-time" } {
  295. if { [llength $args] == 2 } {
  296. $self set burst_time_ [lindex $args 1]
  297.                         return 
  298.                 } elseif { [llength $args] == 1 } {
  299. return $burst_time_
  300.                 }
  301. } elseif { [lindex $args 0] == "idle-time" } {
  302. if { [llength $args] == 2 } {
  303. $self set idle_time_ [lindex $args 1]
  304.                         return 
  305.                 } elseif { [llength $args] == 1 } {
  306. return $idle_time_
  307.                 }
  308. } elseif { [lindex $args 0] == "rate" } {
  309. if { [llength $args] == 2 } {
  310. $self set rate_ [lindex $args 1]
  311.                         return 
  312.                 } elseif { [llength $args] == 1 } {
  313. return $rate_
  314.                 }
  315. }
  316. eval $self next $args
  317. }
  318. Class Source/FTP -superclass Application
  319. Source/FTP set maxpkts_ 268435456
  320. Source/FTP instproc attach o {
  321. $self instvar agent_
  322. set agent_ $o
  323. $self attach-agent $o
  324. }
  325. Source/FTP instproc init {} {
  326. $self next
  327. $self instvar maxpkts_ agent_
  328. set maxpkts_ 268435456
  329. }
  330. Source/FTP instproc start {} {
  331. $self instvar agent_ maxpkts_
  332. $agent_ advance $maxpkts_
  333. }
  334. Source/FTP instproc stop {} {
  335. $self instvar agent_
  336. $agent_ advance 0
  337. }
  338. Source/FTP instproc produce { pktcnt } {
  339. $self instvar agent_ 
  340. $agent_ advance $pktcnt
  341. }
  342. Source/FTP instproc producemore { pktcnt } {
  343. $self instvar agent_
  344. $agent_ advanceby $pktcnt
  345. }
  346. #
  347. # For consistency with other applications
  348. #
  349. Class Source/Telnet -superclass Application/Telnet
  350. Source/Telnet set maxpkts_ 268435456
  351. Source/Telnet instproc attach o {
  352. $self instvar agent_
  353. set agent_ $o
  354. $self attach-agent $o
  355. }