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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 2001 University of Southern California.
  3. # All rights reserved.                                            
  4. #                                                                
  5. # Redistribution and use in source and binary forms are permitted
  6. # provided that the above copyright notice and this paragraph are
  7. # duplicated in all such forms and that any documentation, advertising
  8. # materials, and other materials related to such distribution and use
  9. # acknowledge that the software was developed by the University of
  10. # Southern California, Information Sciences Institute.  The name of the
  11. # University may not be used to endorse or promote products derived from
  12. # this software without specific prior written permission.
  13. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  14. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  15. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. #
  17. ##
  18. # Pragmatic General Multicast (PGM), Reliable Multicast
  19. #
  20. # ns-pgm.tcl
  21. #
  22. # Auxillary OTcl procedures required by the PGM implementation, these are
  23. # used to set up Agent/PGM on new nodes when PGM is activated.
  24. #
  25. # Code adapted from Christos Papadopoulos.
  26. #
  27. # Ryan S. Barnett, 2001
  28. #
  29. # These default values should stay here since the pgm module might be disabled when option --disable-stl is used during configuration.
  30. ################################################################
  31. # PGM
  32. ################################################################
  33. RtModule/PGM set node_  ""
  34. PGMErrorModel set rate_         0.0     ;# just to eliminate warnings
  35. PGMErrorModel set errPkt_       0
  36. PGMErrorModel set errByte_      0
  37. PGMErrorModel set errTime_      0.0
  38. PGMErrorModel set onlink_       0
  39. PGMErrorModel set delay_        0
  40. PGMErrorModel set delay_pkt_    0
  41. PGMErrorModel set enable_       0
  42. PGMErrorModel set ndrops_       0
  43. PGMErrorModel set bandwidth_    2Mb
  44. PGMErrorModel set markecn_      false
  45. PGMErrorModel set debug_        false
  46. # *** PGM AGENT ***
  47. Agent/PGM set pgm_enabled_ 1
  48. # Number of seconds to wait between retransmitting a NAK that is waiting
  49. # for a NCF packet.
  50. Agent/PGM set nak_retrans_ival_ 50ms
  51. # The length of time for which a network element will continue to repeat
  52. # NAKs while waiting for a corresponding NCF.  Once this time expires and
  53. # no NCF is received, then we remove the entire repair state.
  54. Agent/PGM set nak_rpt_ival_ 1000ms
  55. # The length of time for which a network element will wait for the
  56. # corresponding RDATA before removing the entire repair state.
  57. Agent/PGM set nak_rdata_ival_ 10000ms
  58. # Once a NAK has been confirmed, network elements must discard all
  59. # further NAKs for up to this length of time.  Should be a fraction
  60. # of nak_rdata_ival_.
  61. Agent/PGM set nak_elim_ival_ 5000ms
  62. Agent/PGM instproc done {} { }
  63. # *** PGM SENDER ***
  64. # The length of time between sending SPM packets.
  65. Agent/PGM/Sender set spm_interval_ 500ms
  66. # Time to delay sending out an RDATA in response to a NAK packet, this
  67. # is to allow slow NAKs to get processed at one time, so we don't send
  68. # out duplicate RDATA.
  69. Agent/PGM/Sender set rdata_delay_ 70ms
  70. Agent/PGM/Sender instproc done {} { }
  71. # *** PGM RECEIVER ***
  72. # Maximum number of times we can send out a NAK and time-out waiting for
  73. # an NCF reply. Once we hit this many times, we discard the NAK state
  74. # entirely and loose data.
  75. Agent/PGM/Receiver set max_nak_ncf_retries_ 5
  76. # Maximum number of times we can time-out waiting for RDATA after an
  77. # NCF confirmation for a NAK request.  Once we hit this many times, we
  78. # discard the NAK state entirely and loose data.
  79. Agent/PGM/Receiver set max_nak_data_retries_ 5
  80. # A random amount of this time period (range) that will be selected to wait
  81. # for an NCF after detecting a gap in the data stream, before sending out
  82. # a NAK.
  83. Agent/PGM/Receiver set nak_bo_ivl_ 30ms
  84. # The amount of time to wait for a NCF packet after sending out a NAK
  85. # packet to the upstream node. If no NCF is received, another random
  86. # backoff time is observed, and then the NAK is retransmitted.
  87. Agent/PGM/Receiver set nak_rpt_ivl_ 50ms
  88. # The amount of time to wait for RDATA after receiving an NCF confirmation
  89. # for a given NAK. Once this timer expires, another random backoff time
  90. # is observed, and then the NAK is retransmitted.
  91. Agent/PGM/Receiver set nak_rdata_ivl_ 1000ms
  92. Agent/PGM/Receiver instproc done {} { }
  93. #
  94. # Register this PGM agent with a node.
  95. # Create and attach an PGM classifier to node.
  96. # Redirect node input to PGM classifier and
  97. # classifier output to either PGM agent or node
  98. #
  99. #Class RtModule/PGM -superclass RtModule
  100. RtModule/PGM instproc register { node } {
  101. $self instvar node_ pgm_classifier_
  102. set node_ $node
  103. set pgm_classifier_ [new Classifier/Pgm]
  104. set pgm_agent [new Agent/PGM]
  105. $node attach $pgm_agent
  106.         $node set-pgm $pgm_agent
  107. $node insert-entry $self $pgm_classifier_ 0
  108. $pgm_classifier_ install 1 $pgm_agent
  109. }
  110. RtModule/PGM instproc get-outlink { iface } {
  111. $self instvar node_
  112. set oif [$node_ iif2oif $iface]
  113. #set outlink [$node_ oif2link $oif]
  114. return $oif    
  115. }
  116. Node instproc ifaceGetOutLink { iface } {
  117. $self instvar ns_
  118. set link [$self iif2link $iface]
  119. set outlink [$ns_ link $self [$link src]]
  120. set head [$outlink set head_]
  121. return $head
  122. }
  123. #Node instproc ifaceGetOutLink { iface } {
  124. #        $self instvar ns_ id_ neighbor_
  125. #        foreach node $neighbor_ {
  126. #                set link [$ns_ set link_([$node id]:$id_)]
  127. #            if {[[$link set ifaceout_] id] == $iface} {
  128. #                set olink [$ns_ set link_($id_:[$node id])]
  129. #                set head [$olink set head_]
  130. #                return $head
  131. #            }
  132. #        }
  133. #        return -1
  134. #}
  135. Node instproc set-switch agent {
  136. $self instvar switch_
  137. set switch_ $agent
  138. }
  139. Node instproc agent port {
  140.         $self instvar agents_
  141.         foreach a $agents_ {
  142. #puts "the agent at node [$self id] is $a"
  143.                 if { [$a set agent_port_] == $port } {
  144. #puts "node: [$self id], port:$port, agent:$a"
  145.                         return $a
  146.                 }
  147.         }
  148.         return ""
  149. }
  150. # Set the Agent/PGM for a particular node.
  151. Node instproc set-pgm agent {
  152.     $self instvar pgm_agent_
  153.     set pgm_agent_ $agent
  154. }
  155. # Retrieve the Agent/PGM from a particular node.
  156. Node instproc get-pgm {} {
  157.     $self instvar pgm_agent_
  158.     return $pgm_agent_
  159. }
  160. # Agent/LMS/Receiver instproc log-loss {} {
  161. # }
  162. #
  163. # detach a lossobj from link(from:to)
  164. #
  165. Simulator instproc detach-lossmodel {lossobj from to} {
  166. set link [$self link $from $to]
  167. set head [$link head]
  168. $head target [$lossobj target]
  169. }
  170. Agent/PGM/Sender instproc init {} {
  171.     eval $self next
  172.     set ns [Simulator instance]
  173.     $ns create-eventtrace Event $self
  174. }
  175. Agent/PGM/Receiver instproc init {} {
  176.     eval $self next
  177.     set ns [Simulator instance]
  178.     $ns create-eventtrace Event $self
  179. }
  180. Agent/PGM instproc init {} {
  181.     eval $self next
  182.     set ns [Simulator instance]
  183.     $ns create-eventtrace Event $self
  184. }
  185.