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

通讯编程

开发平台:

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-ns.tcl,v 1.1 1998/05/18 22:34:03 aswan Exp $
  32. #XXX goes in ns-lib.tcl
  33. Agent/LossMonitor set npkts_ 0
  34. Agent/LossMonitor set bytes_ 0
  35. Agent/LossMonitor set nlost_ 0
  36. Agent/LossMonitor set lastPktTime_ 0
  37. Class LossTrace -superclass Agent/LossMonitor
  38. LossTrace set expected_ -1
  39. LossTrace instproc init {} {
  40. $self next
  41. $self instvar lastTime
  42. set lastTime 0
  43. }
  44. LossTrace instproc log-loss {} {
  45. $self instvar mmg_
  46. $mmg_ log-loss
  47. global lossTraceFile lossNode
  48. if [info exists lossTraceFile] {
  49. set id [[$mmg_ node] id]
  50. if { [info exists lossNode] && $lossNode != $id } {
  51. return
  52. }
  53. #
  54. # compute intervals of arrived and lost pkts
  55. # this code assumes no pkt reordering 
  56. # (which is true in ns as of 11/96, but this
  57. # will change in the future)
  58. #
  59. set f $lossTraceFile
  60. $self instvar layerNo seqno_ expected_ lastPktTime_ 
  61.     lastSeqno lastTime
  62. if [info exists lastSeqno] {
  63. set npkt [expr $expected_ - $lastSeqno]
  64. puts $f "p $id $layerNo $lastTime $lastPktTime_ $npkt"
  65. set lastTime $lastPktTime_
  66. }
  67. set lost [expr $seqno_ - $expected_]
  68. set t [ns-now]
  69. puts $f "d $id $layerNo $lastPktTime_ $t $lost"
  70. set lastSeqno $seqno_
  71. set lastTime $t
  72. }
  73. }
  74. LossTrace instproc flush {} {
  75.         global lossTraceFile
  76. $self instvar lastSeqno expected_ layerNo lastTime 
  77.     lastPktTime_ mmg_ seqno_
  78. if [info exists lastSeqno] {
  79. set id [[$mmg_ node] id]
  80. set npkt [expr $seqno_ - $lastSeqno]
  81. if { $npkt != 0 } {
  82. puts $lossTraceFile 
  83.     "p $id $layerNo $lastTime $lastPktTime_ $npkt"
  84. }
  85. unset lastSeqno
  86. }
  87. }
  88. Class Layer/ns -superclass Layer
  89. Layer/ns instproc init {ns mmg addr layerNo} {
  90. $self next $mmg
  91. $self instvar ns_ addr_ mon_
  92. set ns_ $ns
  93. set addr_ $addr
  94. set mon_ [$ns_ create-agent [$mmg node] LossTrace 0]
  95. $mon_ set layerNo $layerNo
  96. $mon_ set mmg_ $mmg
  97. $mon_ set dst_ $addr
  98. }
  99. Layer/ns instproc join-group {} {
  100. $self instvar mon_ mmg_ addr_
  101. $mon_ clear
  102. [$mmg_ node] join-group $mon_ $addr_
  103. $self next
  104. }
  105. Layer/ns instproc leave-group {} {
  106. $self instvar mon_ mmg_ addr_
  107. [$mmg_ node] leave-group $mon_ $addr_
  108. $self next
  109. }
  110. Layer/ns instproc npkts {} {
  111. $self instvar mon_
  112. return [$mon_ set npkts_]
  113. }
  114. Layer/ns instproc nlost {} {
  115. $self instvar mon_
  116. return [$mon_ set nlost_]
  117. }
  118. #XXX get rid of this method!
  119. Layer/ns instproc mon {} {
  120. $self instvar mon_
  121. return $mon_
  122. }
  123. #
  124. # This class serves as an interface between the MMG class which
  125. # implements the RLM protocol machinery, and the objects in ns
  126. # that are involved in the RLm protocol (i.e., Node objects
  127. # join/leave multicast groups, LossMonitor objects report packet
  128. # loss, etc...).<p>
  129. #
  130. # See tcl/ex/test-rlm.tcl for an example of how to create a
  131. # simulation script that uses RLM
  132. #
  133. Class MMG/ns -superclass MMG
  134. MMG/ns instproc init {ns localNode caddr addrs} {
  135. $self instvar ns_ node_ addrs_
  136. set ns_ $ns
  137. set node_ $localNode
  138. set addrs_ $addrs
  139. $self next [llength $addrs]
  140. $self instvar ctrl_
  141. set ctrl_ [$ns create-agent $node_ Agent/Message 0]
  142. $ctrl_ set dst_ $caddr
  143. $ctrl_ proc handle msg "$self recv-ctrl $msg"
  144. $node_ join-group $ctrl_ $caddr
  145. }
  146. MMG/ns instproc create-layer {layerNo} {
  147. $self instvar ns_ addrs_
  148. return [new Layer/ns $ns_ $self [lindex $addrs_ $layerNo] $layerNo]
  149. }
  150. MMG/ns instproc now {} {
  151. $self instvar ns_
  152. return [$ns_ now]
  153. }
  154. MMG/ns instproc set_timer {which delay} {
  155. $self instvar ns_ timers_
  156. if [info exists timers_($which)] {
  157. puts "timer botched ($which)"
  158. exit 1
  159. }
  160. set time [expr [$ns_ now] + $delay]
  161. set timers_($which) [$ns_ at $time "$self trigger_timer $which"]
  162. }
  163. MMG/ns instproc trigger_timer {which} {
  164. $self instvar timers_
  165. unset timers_($which)
  166. $self trigger_$which
  167. }
  168. MMG/ns instproc cancel_timer {which} {
  169. $self instvar ns_ timers_
  170. if [info exists timers_($which)] {
  171. #XXX does this cancel the timer?
  172. $ns_ at $timers_($which)
  173. unset timers_($which)
  174. }
  175. }
  176. #######
  177. MMG/ns instproc node {} {
  178. $self instvar node_
  179. return $node_
  180. }
  181. MMG/ns instproc debug { msg } {
  182. $self instvar debug_
  183. if {!$debug_} { return }
  184. $self instvar subscription_ state_ node_
  185. set time [format %.05f [ns-now]]
  186. puts stderr "$time node [$node_ id] layer $subscription_ $state_ $msg"
  187. }
  188. MMG/ns instproc trace { trace } {
  189.         $self instvar layers_
  190.         foreach s $layers_ {
  191. [$s mon] trace $trace
  192.         }
  193. }
  194. MMG/ns instproc total_bytes_delivered {} {
  195. $self instvar layers_
  196.         set v 0
  197.         foreach s $layers_ {
  198.                 incr v [[$s mon] set bytes]
  199.         }
  200.         return $v
  201. }