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

通讯编程

开发平台:

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/rlm/rlm-cmn.tcl,v 1.1 1998/02/20 20:46:46 bajaj Exp $
  32. #
  33. Class MMG
  34. MMG instproc addr {} {
  35. $self instvar addr
  36. return $addr
  37. }
  38. MMG instproc node {} {
  39. $self instvar node
  40. return $node
  41. }
  42. MMG instproc subscription {} {
  43. $self instvar subscription
  44. return $subscription
  45. }
  46. #XXX
  47. MMG instproc state {} {
  48. $self instvar state
  49. return $state
  50. }
  51. Class Layer
  52. #XXX goes in ns-lib.tcl
  53. Agent/LossMonitor set npkts_ 0
  54. Agent/LossMonitor set bytes_ 0
  55. Agent/LossMonitor set nlost_ 0
  56. Agent/LossMonitor set lastPktTime_ 0
  57. Class LossTrace -superclass Agent/LossMonitor
  58. LossTrace instproc log-loss {} {
  59. $self instvar mmg
  60. #XXX
  61. $mmg log-loss
  62. global lossTraceFile lossNode
  63. if [info exists lossTraceFile] {
  64. set id [[$mmg node] id]
  65. if { [info exists lossNode] && $lossNode != $id } {
  66. return
  67. }
  68. #
  69. # compute intervals of arrived and lost pkts
  70. # this code assumes no pkt reordering 
  71. # (which is true in ns as of 11/96, but this
  72. # will change in the future)
  73. #
  74. set f $lossTraceFile
  75. $self instvar layerNo seqno_ expected_ lastPktTime_ 
  76.     lastSeqno lastTime
  77. if [info exists lastSeqno] {
  78. set npkt [expr $expected_ - $lastSeqno]
  79. puts $f "p $id $layerNo $lastTime $lastPktTime_ $npkt"
  80. set lastTime $lastPktTime_
  81. }
  82. set lost [expr $seqno_ - $expected_]
  83. set t [ns-now]
  84. puts $f "d $id $layerNo $lastPktTime_ $t $lost"
  85. set lastSeqno $seqno_
  86. set lastTime $t
  87. }
  88. }
  89. LossTrace instproc flush {} {
  90.         global lossTraceFile
  91. $self instvar lastSeqno expected_ layerNo lastTime lastPktTime_ mmg seqno_
  92. if [info exists lastSeqno] {
  93. set id [[$mmg node] id]
  94. set npkt [expr $seqno_ - $lastSeqno]
  95. if { $npkt != 0 } {
  96. puts $lossTraceFile 
  97.     "p $id $layerNo $lastTime $lastPktTime_ $npkt"
  98. }
  99. unset lastSeqno
  100. }
  101. }
  102. LossTrace instproc init {} {
  103. $self next
  104. $self instvar lastTime seqno_
  105. set lastTime 0
  106. }
  107. LossTrace set expected_ -1
  108. Layer instproc init { ns m addr layerNo } {
  109. $self next
  110. $self instvar mon TJ mmg npkts_
  111. global rlm_param
  112. set mmg $m
  113. set TJ $rlm_param(init-tj)
  114. #XXX subscribe to all groups
  115. set mon [$ns create-agent [$mmg node] LossTrace 0]
  116. $mon set layerNo $layerNo
  117. $mon set mmg $mmg
  118. $mon set dst_ $addr
  119. set npkts_ 0
  120. global allMon
  121. lappend allMon $mon
  122. }
  123. #Layer should relax by beta and not alpha
  124. Layer instproc relax {} {
  125. global rlm_param
  126. $self instvar TJ
  127. set TJ [expr $TJ * $rlm_param(beta)]
  128. if { $TJ <= $rlm_param(init-tj) } {
  129. set TJ $rlm_param(init-tj)
  130. }
  131. }
  132. Layer instproc backoff alpha {
  133. global rlm_param
  134. $self instvar TJ
  135. set TJ [expr $TJ * $alpha]
  136. if { $TJ >= $rlm_param(max) } {
  137. set TJ $rlm_param(max)
  138. }
  139. }
  140. Layer instproc peg-backoff L {
  141. $self instvar TJ
  142. set t [$L set TJ]    
  143. if { $t >= $TJ } {
  144. set TJ $t
  145. }
  146. }
  147. Layer instproc timer {} {
  148. $self instvar TJ
  149. return $TJ
  150. }
  151. #XXX get rid of this method!
  152. Layer instproc mon { } {
  153. $self instvar mon
  154. return $mon
  155. }
  156. Layer instproc last-add {} {
  157. $self instvar add_time
  158. return $add_time
  159. }
  160. Layer instproc join-group {} {
  161. $self instvar mon mmg npkts_ add_time
  162. $mon clear
  163. [$mmg node] join-group $mon [$mon set dst_]
  164. puts stderr "[$mmg node] join-group $mon [$mon set dst_]"
  165. set npkts_ [$mon set npkts_]
  166. set add_time [ns-now]
  167. }
  168. Layer instproc leave-group {} {
  169. $self instvar mon mmg
  170. [$mmg node] leave-group $mon [$mon set dst_]
  171. }
  172. Layer instproc getting-pkts {} {
  173. $self instvar mon npkts_
  174. return [expr [$mon set npkts_] != $npkts_]
  175. }
  176. MMG instproc init { ns localNode baseGroup n } {
  177. $self next
  178. global rlm_param
  179. $self instvar node addr maxlevel TD TDVAR ctrl 
  180.     total_bits subscription state layer
  181. set node $localNode
  182. set addr $baseGroup
  183. set maxlevel $n
  184. set TD $rlm_param(init-td)
  185. set TDVAR $rlm_param(init-td-var)
  186. set ctrl [$ns create-agent $node Agent/Message 0]
  187. $ctrl proc handle msg "recv_ctrl $self $msg"
  188. #XXX
  189. set caddr [expr $baseGroup + 0x1000]
  190. $node join-group $ctrl $caddr
  191. $ctrl set dst_ $caddr
  192. #
  193. # we number the subscription level starting at 1.
  194. # level 0 means no groups are subscribed to.
  195. set i 1
  196. while { $i <= $n } {
  197. set layerNo [expr $i - 1]
  198. set dst [expr $baseGroup + $layerNo]
  199. set layer($i) [new Layer $ns $self $dst $layerNo]
  200. $self instvar layers
  201. lappend layers $layer($i)
  202. incr i
  203. }
  204. set total_bits 0
  205. set state /S
  206. #
  207. # set the subscription level to 0 and call add_layer
  208. # to start out with at least one group
  209. #
  210. set subscription 0
  211. $self add-layer
  212. #XXX reset start state to SS (from AL) 
  213. set state /S
  214. #
  215. # Schedule the initial join-timer.
  216. #
  217. $self set_TJ_timer
  218. }
  219. #
  220. # set up the data structures so that the $n consecutive addresses
  221. # starting with $baseGroup will act as an MMG set at $node.
  222. #
  223. proc build_loss_monitors { ns node baseGroup n } {
  224. global rlm_param
  225. set mmg [new MMG $ns $node $baseGroup $n]
  226. global allmmg
  227. lappend allmmg $mmg
  228. return $mmg
  229. }
  230. MMG instproc total_bits {} {
  231. $self instvar total_bits
  232. return $total_bits
  233. }
  234. MMG instproc add-bits bits {
  235. $self instvar total_bits
  236. set total_bits [expr $total_bits + $bits]
  237. }
  238. MMG instproc total_bytes_delivered {} {
  239. $self instvar layers
  240.         set v 0
  241.         foreach s $layers {
  242.                 incr v [[$s mon] set bytes]
  243.         }
  244.         return $v
  245. }
  246. MMG instproc trace { trace } {
  247.         $self instvar layers
  248.         foreach s $layers {
  249. [$s mon] trace $trace
  250.         }
  251. }
  252. proc rlm_init { rectFileName nlevel runtime } {
  253. #XXX
  254. global NLEVEL
  255. set NLEVEL $nlevel
  256. if { $rectFileName != "" } {
  257. global rect_file
  258. set rect_file [open $rectFileName "w"]
  259. set h [expr $nlevel * 10 + 10]
  260. puts $rect_file "bbox 0 0 $runtime $h"
  261. }
  262. }
  263. proc rlm_finish { } {
  264. global allmmg rect_file
  265. foreach mmg $allmmg {
  266. set s [$mmg subscription]
  267. while { $s >= 1 } {
  268. incr s -1
  269. }
  270. }
  271. if [info exists rect_file] {
  272. close $rect_file
  273. }
  274. #XXX
  275. global lossTraceFile
  276. if [info exists lossTraceFile] {
  277. global allMon
  278. foreach m $allMon {
  279. $m flush
  280. }
  281. }
  282. }
  283. proc rlm_debug msg {
  284. global rlm_debug_flag
  285. if $rlm_debug_flag {
  286. puts stderr "[format %.05f [ns-now]] $msg"
  287. }
  288. }
  289. #XXX should have debug flag on each obj
  290. MMG instproc debug msg {
  291. $self instvar addr subscription state node
  292. rlm_debug "nd [$node id] $addr layer $subscription $state $msg"
  293. }
  294. MMG instproc set-state s {
  295. $self instvar state node
  296. set old $state
  297. set state $s
  298. $self debug "FSM: $old -> $s"
  299. }
  300. proc rect_write { f mmg x0 x1 n } {
  301. set addr [[$mmg node] id]
  302. set base [expr [$mmg addr] & 0x7fff]
  303. puts $f "r $addr $base $x0 $x1 $n"
  304. }
  305. proc rect_add { mmg n } {
  306. global rect_start
  307. set rect_start($mmg:$n) [ns-now]
  308. }
  309. proc rect_del { mmg n } {
  310.      global rect_start rect_file src_rate
  311. set mmgAddr [$mmg addr]
  312. set x $rect_start($mmg:$n)
  313. set rate $src_rate([expr $mmgAddr + $n - 1])
  314. set bits [expr ([ns-now] - $x) * $rate]
  315. $mmg add-bits $bits
  316. if [info exists rect_file] {
  317. rect_write $rect_file $mmg $x [ns-now] $n
  318. }
  319. }
  320. MMG instproc dumpLevel {} {
  321. global rlmTraceFile rates
  322. if [info exists rlmTraceFile] {
  323. $self instvar subscription node rateMap
  324. #XXX
  325. if ![info exists rateMap] {
  326. set s 0
  327. set rateMap "0"
  328. foreach r $rates {
  329. set s [expr $s + $r]
  330. lappend rateMap $s
  331. }
  332. }
  333. set r [lindex $rateMap $subscription]
  334. puts $rlmTraceFile "[$node id] [ns-now] $r"
  335. }
  336. }
  337. MMG instproc drop-layer {} {
  338. $self dumpLevel
  339. $self instvar subscription layer
  340. set n $subscription
  341. #
  342. # if we have an active layer, drop it
  343. #
  344. if { $n > 0 } {
  345. $self debug "DRP-LAYER $n"
  346. # rect_del $self $n
  347. $layer($n) leave-group 
  348. incr n -1
  349. set subscription $n
  350. }
  351. $self dumpLevel
  352. }
  353. MMG instproc add-layer {} {
  354. $self dumpLevel
  355. $self instvar maxlevel subscription layer
  356. set n $subscription
  357. if { $n < $maxlevel } {
  358. $self debug "ADD-LAYER"
  359. incr n
  360. set subscription $n
  361. $layer($n) join-group
  362. rect_add $self $n
  363. }
  364. $self dumpLevel
  365. }
  366. MMG instproc current_layer_getting_packets {} {
  367. global rlm_pkts
  368. $self instvar subscription layer TD
  369. set n $subscription
  370. if { $n == 0 } {
  371. return 0
  372. }
  373. $self debug "npkts [[$layer($subscription) mon ] set npkts_]"
  374. if [$layer($subscription) getting-pkts] {
  375. return 1
  376. }
  377. #XXX hack to adjust TD for large latency case
  378. global add_time
  379. set delta [expr [ns-now] - [$layer($subscription) last-add]]
  380. if { $delta > $TD } {
  381. set TD [expr 1.2 * $delta]
  382. }
  383. return 0
  384. }
  385. #
  386. # return the amount of loss across all the groups of the given mmg
  387. #
  388. MMG instproc mmg_loss {} {
  389. $self instvar layers
  390. set loss 0
  391. foreach s $layers {
  392. incr loss [[$s mon] set nlost_]
  393. }
  394. return $loss
  395. }
  396. #
  397. # return the number of packets received across all the groups of the given mmg
  398. #
  399. MMG instproc mmg_pkts {} {
  400. $self instvar layers
  401. set npkts_ 0
  402. foreach s $layers {
  403. incr npkts_ [[$s mon] set npkts_]
  404. }
  405. return $npkts_
  406. }