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

通讯编程

开发平台:

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. #
  7. # Copyright (c)1996 Regents of the University of California.
  8. # All rights reserved.
  9. # Redistribution and use in source and binary forms, with or without
  10. # modification, are permitted provided that the following conditions
  11. # are met:
  12. # 1. Redistributions of source code must retain the above copyright
  13. #    notice, this list of conditions and the following disclaimer.
  14. # 2. Redistributions in binary form must reproduce the above copyright
  15. #    notice, this list of conditions and the following disclaimer in the
  16. #    documentation and/or other materials provided with the distribution.
  17. # 3. All advertising materials mentioning features or use of this software
  18. #    must display the following acknowledgement:
  19. #  This product includes software developed by the MASH Research
  20. #  Group at the University of California Berkeley.
  21. # 4. Neither the name of the University nor of the Research Group may be
  22. #    used to endorse or promote products derived from this software without
  23. #    specific prior written permission.
  24. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34. # SUCH DAMAGE.
  35. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/plm/plm-topo.tcl,v 1.1 2000/07/19 21:37:54 haoboy Exp $
  36. Simulator instproc PLMcreate-agent { node type pktClass } {
  37. $self instvar Agents PortID 
  38. set agent [new $type]
  39. $agent set fid_ $pktClass
  40. $self attach-agent $node $agent
  41. $agent proc get var {
  42. return [$self set $var]
  43. }
  44. return $agent
  45. }
  46. Simulator instproc PLMcbr_flow_PP { node fid addr bw } {
  47. global packetSize PP_burst_length
  48. set agent [$self PLMcreate-agent $node Agent/UDP $fid]
  49. set cbr [new Application/Traffic/CBR_PP]
  50. $cbr attach-agent $agent
  51. #XXX abstraction violation
  52.         $agent set dst_addr_ $addr
  53.         $agent set dst_port_ 0
  54. $cbr set packet_size_ $packetSize
  55. $cbr set rate_ $bw
  56. $cbr set random_ 1
  57.         $cbr set PBM_ $PP_burst_length
  58. return $cbr
  59. }
  60. #create a set fo layers for a given PLM source.
  61. Simulator instproc PLMbuild_source_set { plmName rates addrs baseClass node when } {
  62.     global src_plm src_rate
  63.     set n [llength $rates]
  64.     #mise en place de la layer de base avec PP
  65.     set r [lindex $rates 0]
  66.     set addr [expr [lindex $addrs 0]]
  67.     set src_rate($addr) $r
  68.     set k $plmName:0
  69.     set src_plm($k) [$self PLMcbr_flow_PP $node $baseClass $addr $r]
  70.     $self at 0 "$src_plm($k) set maxpkts_ 1; $src_plm($k) start"
  71.     $self at $when "$src_plm($k) set maxpkts_ 268435456; $src_plm($k) start"
  72.     #incr baseClass    
  73.     
  74.     for {set i 1} {$i<$n} {incr i} {
  75. set r [lindex $rates $i]
  76. set addr [expr [lindex $addrs $i]]
  77. set src_rate($addr) $r
  78. set k $plmName:$i
  79. set src_plm($k) [$self PLMcbr_flow_PP $node $baseClass $addr $r]
  80. $self at 0 "$src_plm($k) set maxpkts_ 1; $src_plm($k) start"
  81. $self at $when "$src_plm($k) set maxpkts_ 268435456; $src_plm($k) start"
  82. #$self at $when "$src_plm($k) start"
  83. #incr baseClass
  84.     }
  85. }
  86. Class PLMTopology
  87. PLMTopology instproc init { simulator } {
  88. $self instvar ns id
  89. set ns $simulator
  90.     #id determine de fid de chaque session PLM, faire attention aux
  91.     #interactions avec les fid d'autres flows pour FQ.
  92. set id 0
  93. }
  94. PLMTopology instproc mknode nn {
  95. $self instvar node ns
  96. if ![info exists node($nn)] {
  97. set node($nn) [$ns node]
  98. }
  99. }
  100. #
  101. # build a link between nodes $a and $b
  102. # if either node doesn't exist, create it as a side effect.
  103. # (we don't build any sources)
  104. #
  105. PLMTopology instproc build_link { a b delay bw } {
  106. global buffers packetSize Queue_sched_
  107. if { $a == $b } {
  108. puts stderr "link from $a to $b?"
  109. exit 1
  110. }
  111. $self instvar node ns
  112. $self mknode $a
  113. $self mknode $b
  114. $ns duplex-link $node($a) $node($b) $bw $delay $Queue_sched_
  115. }
  116. PLMTopology instproc build_link-simple { a b delay bw f} {
  117. global buffers packetSize Queue_sched_ 
  118. if { $a == $b } {
  119. puts stderr "link from $a to $b?"
  120. exit 1
  121. }
  122. $self instvar node ns
  123. $self mknode $a
  124. $self mknode $b
  125. $ns duplex-link-trace $node($a) $node($b) $bw $delay $Queue_sched_ $f
  126. }
  127. #
  128. # build a new source (by allocating a new address) and
  129. # place it at node $nn.  start it up at $when.
  130. #
  131. PLMTopology instproc place_source { nn when } {
  132. #XXX
  133. global rates 
  134. $self instvar node ns id addrs
  135. incr id
  136. set addrs($id) {}
  137. foreach r $rates {
  138. lappend addrs($id) [Node allocaddr]
  139. }
  140. $ns PLMbuild_source_set s$id $rates $addrs($id) $id $node($nn) $when
  141. return $id
  142. }
  143. #by default nb=1 does not give any functionality, the instance of the last
  144. #PLM receiver is in PLMrcvr(1)
  145. #If one specifies nb when one create the receiver, PLMrcvr($nb) contains
  146. #the PLM instance of each PLM receiver. One must specifies a different nb per receiver.
  147. PLMTopology instproc place_receiver { nn id when check_estimate {nb 1}} {
  148. $self instvar ns  
  149. $ns at $when "$self build_receiver $nn $id $check_estimate $nb"
  150. }
  151. #
  152. # build a new receiver for source $id and
  153. # place it at node $nn.
  154. #
  155. PLMTopology instproc build_receiver { nn id check_estimate nb} {
  156.     $self instvar node ns addrs
  157.     global PLMrcvr
  158.     set PLMrcvr($nb) [new PLM/ns $ns $node($nn) $addrs($id) $check_estimate $nn]
  159.     
  160.     global plm_debug_flag
  161.     $PLMrcvr($nb) set debug_ $plm_debug_flag
  162. }