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

通讯编程

开发平台:

Visual C++

  1. #This code is a contribution of Arnaud Legout, Institut Eurecom, France.
  2. #As the basis, for writing my scripts, I use the RLM scripts included in 
  3. #ns. Therefore I gratefully thanks Steven McCanne who makes its scripts
  4. #publicly available and the various ns team members who clean and
  5. #maintain the RLM scripts.
  6. #The following copyright is the original copyright included in the RLM scripts.
  7. #
  8. # Copyright (c)1996 Regents of the University of California.
  9. # All rights reserved.
  10. # Redistribution and use in source and binary forms, with or without
  11. # modification, are permitted provided that the following conditions
  12. # are met:
  13. # 1. Redistributions of source code must retain the above copyright
  14. #    notice, this list of conditions and the following disclaimer.
  15. # 2. Redistributions in binary form must reproduce the above copyright
  16. #    notice, this list of conditions and the following disclaimer in the
  17. #    documentation and/or other materials provided with the distribution.
  18. # 3. All advertising materials mentioning features or use of this software
  19. #    must display the following acknowledgement:
  20. #  This product includes software developed by the MASH Research
  21. #  Group at the University of California Berkeley.
  22. # 4. Neither the name of the University nor of the Research Group may be
  23. #    used to endorse or promote products derived from this software without
  24. #    specific prior written permission.
  25. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35. # SUCH DAMAGE.
  36. #
  37. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/plm/plm-ns.tcl,v 1.1 2000/07/19 21:37:54 haoboy Exp $
  38. Application/Traffic/CBR_PP instproc set args {
  39. $self instvar packet_size_ rate_ 
  40. if { [lindex $args 0] == "interval_" } {
  41. puts "Cannot use CBR_PP with interval_, specify rate_ instead"
  42. }
  43. eval $self next $args
  44. }
  45. Agent/LossMonitor/PLM instproc log-PP {} {
  46. }
  47. Class PLMLossTrace -superclass Agent/LossMonitor/PLM
  48. PLMLossTrace set expected_ -1
  49. PLMLossTrace instproc init {} {
  50.     $self next
  51.     $self instvar lastTime measure debug_
  52.     set lastTime 0
  53.     #set PP_estimate {}
  54.     set measure -1
  55.     global plm_debug_flag
  56.     if [info exists plm_debug_flag] {
  57. set debug_ $plm_debug_flag
  58.     }
  59. }
  60. PLMLossTrace instproc log-loss {} {
  61.     $self instvar plm_
  62. #    puts stderr [$self set nlost_]
  63.     $plm_ log-loss
  64. }
  65. #variables
  66. #PP_burst_length : number of packets in a PP burst
  67. #PP_value : a single PP estimate.
  68. #PP_estimate : array of the single PPs estimate (array size: PP_estimate_length)
  69. #PP_estimate_value: global estimate: mean over all the single PP estimate contained in PP_estimate.
  70. #PP_estimation_length : minimum number of PP used to calculate the global estimate
  71. #Each time a packet is received log-PP check if this packet if the first packet 
  72. #of a PP (flag_PP_=128). If log_PP see burst_length packets in sequence after
  73. #the first packet of the PP, it calculates an estimate PP_value of the available 
  74. #bandwidth based on this PP (of length PP_burst_length).
  75. PLMLossTrace instproc log-PP {} {
  76.     $self instvar plm_ PP_first measure next_pkt debug_
  77.     global PP_burst_length packetSize
  78.    
  79.     #check if this is the first packet of a PP
  80.     if {[$self set flag_PP_] == 128} {
  81. set measure 1
  82. set next_pkt [expr [$self set seqno_] + 1]
  83. set PP_first [$self set packet_time_PP_]
  84. if {$debug_>=2} {
  85.     trace_annotate "[$plm_ node]:  first PP [$self set seqno_], next: $next_pkt"
  86.     } elseif {$measure>-1} {
  87. #Only accept packets in sequence
  88. if {[$self set seqno_]==$next_pkt} {
  89.     set measure [expr $measure + 1]
  90.     set next_pkt [expr [$self set seqno_] + 1]
  91.     if {$debug_>=2} {
  92. trace_annotate "[$plm_ node]:   pending measurement : $measure, next $next_pkt"
  93.     }
  94.     #if we receive PP_burst_length packets in sequence (and the first packet
  95.     #of the sequence has flag_PP_=128), i.e. a full PP, we calculate the 
  96.     #estimate
  97.     if {$measure==$PP_burst_length} {
  98. set PP_value [expr $packetSize*8.*($PP_burst_length - 1)/([$self set packet_time_PP_] - $PP_first)]
  99. set measure -1
  100. if {$debug_>=2} {
  101.     trace_annotate "[$plm_ node]:  measure : $PP_value"
  102. }
  103. #call the PLM machinery
  104. $plm_ make_estimate $PP_value
  105.     } 
  106. #if a packet if received out of sequence, we restart the estimation process 
  107. } else {
  108.     if {$debug_>=2} {
  109. trace_annotate "[$plm_ node]:  out of sequence : [$self set seqno_], next: $next_pkt"
  110.     }
  111.     set measure -1
  112. }
  113.     }
  114. }
  115. Class PLMLayer/ns -superclass PLMLayer
  116. PLMLayer/ns instproc init {ns plm addr layerNo} {
  117.     $self next $plm
  118.     
  119.     $self instvar ns_ addr_ mon_
  120.     set ns_ $ns
  121.     set addr_ $addr
  122.     set mon_ [$ns_ PLMcreate-agent [$plm node] PLMLossTrace 0]
  123.     #layerNo : numero de la layer pour chaque PLM
  124.     $mon_ set layerNo $layerNo
  125.     $mon_ set plm_ $plm
  126.     $mon_ set dst_addr_ $addr
  127.     $mon_ set dst_port_ 0
  128. }
  129. #add a layer
  130. PLMLayer/ns instproc join-group {} {
  131. $self instvar mon_ plm_ addr_
  132. $mon_ clear
  133. [$plm_ node] join-group $mon_ $addr_
  134. $self next
  135. }
  136. #drop a layer
  137. PLMLayer/ns instproc leave-group {} {
  138. $self instvar mon_ plm_ addr_
  139. [$plm_ node] leave-group $mon_ $addr_
  140. $self next
  141. }
  142. #number of packets received for that layer
  143. PLMLayer/ns instproc npkts {} {
  144. $self instvar mon_
  145. return [$mon_ set npkts_]
  146. }
  147. #number of packets lost for that layer
  148. PLMLayer/ns instproc nlost {} {
  149. $self instvar mon_
  150. return [$mon_ set nlost_]
  151. }
  152. #allow to get statistics (number of packets received and lost) for a layer.
  153. PLMLayer/ns instproc mon {} {
  154. $self instvar mon_
  155. return $mon_
  156. }
  157. #
  158. # This class serves as an interface between the PLM class which
  159. # implements the PLM protocol machinery, and the objects in ns
  160. # that are involved in the PLM protocol (i.e., Node objects
  161. # join/leave multicast groups, LossMonitor objects report packet
  162. # loss, etc...).<p>
  163. #
  164. # See tcl/ex/test-plm.tcl for an example of how to create a
  165. # simulation script that uses PLM
  166. #
  167. Class PLM/ns -superclass PLM
  168. PLM/ns instproc init {ns localNode addrs check_estimate nn} {
  169. $self instvar ns_ node_ addrs_
  170. set ns_ $ns
  171. set node_ $localNode
  172. set addrs_ $addrs
  173. $self next [llength $addrs] $check_estimate $nn
  174. }
  175. PLM/ns instproc create-layer {layerNo} {
  176. $self instvar ns_ addrs_
  177. return [new PLMLayer/ns $ns_ $self [lindex $addrs_ $layerNo] $layerNo]
  178. }
  179. PLM/ns instproc now {} {
  180. $self instvar ns_
  181. return [$ns_ now]
  182. }
  183. #######
  184. PLM/ns instproc node {} {
  185. $self instvar node_
  186. return $node_
  187. }
  188. PLM/ns instproc debug { msg } {
  189. $self instvar debug_ ns_
  190. if {$debug_ <1} { return }
  191. $self instvar subscription_ node_
  192. set time [format %.05f [$ns_ now]]
  193. # puts stderr "PLM/ns: $time node [$node_ id] layer $subscription_ $msg"
  194. }
  195. PLM/ns instproc trace { trace } {
  196.         $self instvar layers_
  197.         foreach s $layers_ {
  198. [$s mon] trace $trace
  199.         }
  200. }
  201. PLM/ns instproc total_bytes_delivered {} {
  202. $self instvar layers_
  203.         set v 0
  204.         foreach s $layers_ {
  205.                 incr v [[$s mon] set bytes]
  206.         }
  207.         return $v
  208. }