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

通讯编程

开发平台:

Visual C++

  1. #
  2. # tcl/ctr-mcast/CtrMcast.tcl
  3. #
  4. # Copyright (C) 1997 by USC/ISI
  5. # All rights reserved.                                            
  6. #                                                                
  7. # Redistribution and use in source and binary forms are permitted
  8. # provided that the above copyright notice and this paragraph are
  9. # duplicated in all such forms and that any documentation, advertising
  10. # materials, and other materials related to such distribution and use
  11. # acknowledge that the software was developed by the University of
  12. # Southern California, Information Sciences Institute.  The name of the
  13. # University may not be used to endorse or promote products derived from
  14. # this software without specific prior written permission.
  15. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  16. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18. # Contributed by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang
  19. #
  20. ########## CtrMcast Class: Individual Node join-group, leave-group, etc #####
  21. Class CtrMcast -superclass McastProtocol
  22. CtrMcast instproc init { sim node } {
  23. $self next $sim $node
  24. $self instvar ns_ node_
  25. $self instvar agent_ defaultTree_ decapagent_
  26. $self instvar c_rp_ c_bsr_ priority_
  27. set agent_ [$ns_ set MrtHandle_]
  28. set defaultTree_ "RPT"
  29. set decapagent_ [new Agent/Decapsulator]
  30. $ns_ attach-agent $node_ $decapagent_
  31. ### config PIM nodes
  32. set c_rp_      1
  33. set c_bsr_     1
  34. set priority_  0
  35. }
  36. CtrMcast instproc join-group  { group } {
  37. $self next $group
  38. $self instvar node_ ns_ agent_
  39. $self instvar defaultTree_
  40. if { [$agent_ treetype? $group] == "" } {
  41. $agent_ treetype $group $defaultTree_
  42. $agent_ add-new-group $group
  43. }
  44. $agent_ add-new-member $group $node_
  45. foreach src [$agent_ sources? $group] {
  46. $agent_ compute-branch $src $group $node_
  47. }
  48. }
  49. CtrMcast instproc leave-group  { group } {
  50. $self next $group
  51. $self instvar node_ ns_ agent_ defaultTree_
  52. $agent_ remove-member $group $node_
  53. foreach src [$agent_ sources? $group] {
  54. $agent_ prune-branch $src $group $node_
  55. }
  56. }
  57. CtrMcast instproc handle-cache-miss { srcID group iface } {
  58. $self instvar ns_ agent_ node_
  59. $self instvar defaultTree_
  60. if { [$agent_ treetype? $group] == "" } {
  61. $agent_ treetype $group $defaultTree_
  62. #$agent_ add-new-member $group $node_
  63. }
  64. if { [$node_ id] == $srcID } {
  65. set RP [$self get_rp $group]
  66. if {[$agent_ treetype? $group] == "RPT" && $srcID != [$RP id]} {
  67. set encapagent [new Agent/Encapsulator]
  68. $ns_ attach-agent $node_ $encapagent
  69. set ctrmcast [[$RP getArbiter] getType "CtrMcast"]
  70. $ns_ connect $encapagent [$ctrmcast set decapagent_]
  71. ### create (S,G,iif=-1) entry
  72. $node_ add-mfc-reg $srcID $group -1 $encapagent
  73. }
  74. if [$agent_ new-source? $group $node_] {
  75. $agent_ compute-tree $node_ $group
  76. }
  77. } elseif [SessionSim set MixMode_] {
  78.     set srcnode [$ns_ get-node-by-id $srcID]
  79.     if [$agent_ new-source? $group $srcnode] {
  80. $agent_ compute-tree $srcnode $group
  81.     }
  82. }
  83. return 1 ;#call again
  84. }
  85. CtrMcast instproc drop  { replicator src group iface } {
  86. #packets got dropped only due to null oiflist
  87. }
  88. CtrMcast instproc handle-wrong-iif { srcID group iface } {
  89. warn "$self: $proc for <S: $srcID, G: $group, if: $iface>?"
  90. return 0 ;#call once
  91. }
  92. CtrMcast instproc notify { dummy } {
  93. }
  94. ##### Two functions to help get RP for a group #####
  95. ##### get_rp {group}                            #####
  96. ##### hash {rp group}                          #####
  97. CtrMcast instproc get_rp group {
  98. $self instvar rpset_ agent_
  99. if ![info exists rpset_] {
  100. [$agent_ set ctrrpcomp] compute-rpset
  101. assert [info exists rpset_]
  102. }
  103. set returnrp -1
  104. set hashval -1
  105. foreach rp $rpset_ {
  106.         if {[$self hash $rp $group] > $hashval} {
  107.         set hashval [$self hash $rp $group]
  108.         set returnrp $rp
  109. }
  110. }
  111. set returnrp ;# return
  112. }
  113. CtrMcast instproc hash {rp group} {
  114. $rp id
  115. }
  116. CtrMcast instproc set-rpset args {
  117. eval $self set rpset_ "$args"
  118. }
  119. CtrMcast instproc get_bsr {} {
  120. warn "$self: CtrMcast doesn't require a BSR"
  121. }
  122. CtrMcast instproc set_c_bsr { prior } {
  123. $self instvar c_bsr_ priority_
  124. set c_bsr_ 1
  125. set priority_ $prior
  126. }
  127. CtrMcast instproc set_c_rp {} {
  128. $self instvar c_rp_
  129. set c_rp_ 1
  130. }
  131. CtrMcast instproc unset_c_rp {} {
  132. $self instvar c_rp_
  133. set c_rp_ 0
  134. }
  135. # #################### MultiNode: add-mfc-reg ################
  136. Node instproc add-mfc-reg { src group iif oiflist } {
  137. $self instvar multiclassifier_ Regreplicator_
  138. #XXX node addr is in upper 24 bits
  139. if [info exists Regreplicator_($group)] {
  140. foreach oif $oiflist {
  141. $Regreplicator_($group) insert $oif
  142. }
  143. return 1
  144. }
  145. set r [new Classifier/Replicator/Demuxer]
  146. $r set node_ $self
  147. $r set srcID_ $src
  148. set Regreplicator_($group) $r
  149. foreach oif $oiflist {
  150. $r insert $oif
  151. }
  152. # Install the replicator.  We do this only once and leave
  153. # it forever.  Since prunes are data driven, we want to
  154. # leave the replicator in place even when it's empty since
  155. # the replicator::drop callback triggers the prune.
  156. #
  157. $multiclassifier_ add-rep $r $src $group $iif
  158. }
  159. Node instproc getRegreplicator group {
  160. $self instvar Regreplicator_
  161. if [info exists Regreplicator_($group)] {
  162. return $Regreplicator_($group)
  163. } else {
  164. return -1
  165. }
  166. }