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

通讯编程

开发平台:

Visual C++

  1. #
  2. # tcl/mcast/McastProto.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. # Ported by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang
  19. #
  20. Class McastProtocol
  21. McastProtocol instproc init {sim node} {
  22. $self next
  23. $self instvar ns_ node_ status_ type_ id_
  24. set ns_   $sim
  25. set node_ $node
  26. set status_ "down"
  27. set type_   [$self info class]
  28. set id_ [$node id]
  29. $ns_ maybeEnableTraceAll $self $node_
  30. }
  31. McastProtocol instproc getType {} { $self set type_ }
  32. McastProtocol instproc start {} { $self set status_ "up"   }
  33. McastProtocol instproc stop {} { $self set status_ "down" }
  34. McastProtocol instproc getStatus {} { $self set status_    }
  35. McastProtocol instproc upcall {code args} {
  36. # currently expects to handle cache-miss and wrong-iif
  37. eval $self handle-$code $args
  38. }
  39.  
  40. McastProtocol instproc handle-wrong-iif { srcID group iface } {
  41. # return values: 
  42. #   0 : do not call classify on this packet again
  43. #   1 : changed iif for the corresponding mfc-entry, classify again
  44. return 0
  45. }
  46. McastProtocol instproc handle-cache-miss { srcID group iface } {
  47. # return values: 
  48. #   0 : do not call classify on this packet again
  49. #   1 : changed iif for the corresponding mfc-entry, classify again
  50. return 0
  51. }
  52. McastProtocol instproc annotate args {
  53. $self instvar dynT_ node_ ns_
  54. set s "[$ns_ now] [$node_ id] $args" ;#nam wants uinique first arg???
  55. if [info exists dynT_] {
  56. foreach tr $dynT_ {
  57. $tr annotate $s
  58. }
  59. }
  60. }
  61. McastProtocol instproc join-group arg { 
  62. $self annotate $proc $arg 
  63. }
  64. McastProtocol instproc leave-group arg { 
  65. $self annotate $proc $arg
  66. }
  67. McastProtocol instproc trace { f src {op ""} } {
  68.         $self instvar ns_ dynT_
  69. if {$op == "nam" && [info exists dynT_] > 0} {
  70. foreach tr $dynT_ {
  71. $tr namattach $f
  72. }
  73. } else {
  74. lappend dynT_ [$ns_ create-trace Generic $f $src $src $op]
  75. }
  76. }
  77. # This method is called when a change in routing occurs.
  78. McastProtocol instproc notify { dummy } {
  79.         $self instvar ns_ node_ PruneTimer_
  80. #build list of current sources
  81.         foreach r [$node_ getReps "*" "*"] {
  82. set src_id [$r set srcID_]
  83. set sources($src_id) 1
  84. }
  85. set sourceIDs [array names sources]
  86. foreach src_id $sourceIDs {
  87. set src [$ns_ get-node-by-id $src_id]
  88. if {$src != $node_} {
  89. set upstream [$node_ rpf-nbr $src]
  90. if { $upstream != ""} {
  91. set inlink [$ns_ link $upstream $node_]
  92. set newiif [$node_ link2iif $inlink]
  93. set reps [$node_ getReps $src_id "*"]
  94. foreach r $reps {
  95. set oldiif [$node_ lookup-iface $src_id [$r set grp_]]
  96. if { $oldiif != $newiif } {
  97. $node_ change-iface $src_id [$r set grp_] $oldiif $newiif
  98. }
  99. }
  100. }
  101. }
  102. #next update outgoing interfaces
  103. set oiflist ""
  104. foreach nbr [$node_ neighbors] {
  105. set nbr_id [$nbr id]
  106. set nh [$nbr rpf-nbr $src] 
  107. if { $nh != $node_ } {
  108. # are we ($node_) the next hop from ($nbr) to 
  109. # the source ($src)
  110. continue
  111. }
  112. set oif [$node_ link2oif [$ns_ link $node_ $nbr]]
  113. # oif to such neighbor
  114. set oifs($oif) 1
  115. }
  116. set oiflist [array names oifs]
  117. set reps [$node_ getReps $src_id "*"]
  118. foreach r $reps {
  119. set grp [$r set grp_]
  120. set oldoifs [$r dump-oifs]
  121. set newoifs $oiflist
  122. foreach old $oldoifs {
  123. if [catch "$node_ oif2link $old" ] {
  124. # this must be a local agent, not an oif
  125. continue
  126. }
  127. set idx [lsearch $newoifs $old]
  128. if { $idx < 0} {
  129. $r disable $old
  130. if [info exists PruneTimer_($src_id:$grp:$old)] {
  131. delete $PruneTimer_($src_id:$grp:$old)
  132. unset PruneTimer_($src_id:$grp:$old)
  133. }
  134. } else {
  135. set newoifs [lreplace $newoifs $idx $idx]
  136. }
  137. }
  138. foreach new $newoifs {
  139. foreach r $reps {
  140. $r insert $new
  141. }
  142. }
  143. }
  144. }
  145. }
  146. McastProtocol instproc dump-routes {chan {grp ""} {src ""}} {
  147. $self instvar ns_ node_
  148. if { $grp == "" } {
  149. # dump all replicator entries
  150. array set reps [$node_ getReps-raw * *]
  151. } elseif { $src == "" } {
  152. # dump entries for group
  153. array set reps [$node_ getReps-raw * $grp]  ;# actually, more than *,g
  154. } else {
  155. # dump entries for src, group.
  156. array set reps [$node_ getReps-raw $src $grp]
  157. }
  158. puts $chan [concat "Node:t${node_}([$node_ id])tat t ="
  159. [format "%4.2f" [$ns_ now]]]
  160. puts $chan "trepTagtActivettsrctgrouptiifNodettdest_nodes"
  161. foreach ent [lsort [array names reps]] {
  162. set sg [split $ent ":"]
  163. if { [$reps($ent) is-active] } {
  164. set active Y
  165. } else {
  166. set active N
  167. }
  168. # translate each oif to a link and then the neighbor node
  169. set dest ""
  170. foreach oif [$reps($ent) dump-oifs] {
  171. if ![catch { set nbr [[$node_ oif2link $oif] dst] } ] {
  172. set nbrid [$nbr id]
  173. if [$nbr is-lan?] {
  174. set nbrid ${nbrid}(L)
  175. }
  176. lappend dest $nbrid
  177. }
  178. }
  179. set s [lindex $sg 0]
  180. set g [lindex $sg 1]
  181. set iif [$node_ lookup-iface $s $g]
  182. set iif_node_id $iif
  183. catch {
  184. # catch: iif can be negative for senders
  185. set iif_node [[$node_ iif2link $iif] src]
  186. if [$iif_node is-lan?] {
  187. set iif_node_id [$iif_node id](L)
  188. } else {
  189. set iif_node_id [$iif_node id]
  190. }
  191. }
  192. puts $chan [format "t%5st  %stt%dt0x%xt%stt%s"
  193. $reps($ent) $active $s $g $iif_node_id $dest]
  194. }
  195. }
  196. ###################################################
  197. Class mrtObject
  198. #XXX well-known groups (WKG) with local multicast/broadcast
  199. mrtObject set mask-wkgroups 0xfff0
  200. mrtObject set wkgroups(Allocd) [mrtObject set mask-wkgroups]
  201. mrtObject proc registerWellKnownGroups name {
  202. set newGroup [mrtObject set wkgroups(Allocd)]
  203. mrtObject set wkgroups(Allocd) [expr $newGroup + 1]
  204. mrtObject set wkgroups($name)  $newGroup
  205. }
  206. mrtObject proc getWellKnownGroup name {
  207. assert ""$name" != "Allocd""
  208. mrtObject set wkgroups($name)
  209. }
  210. mrtObject registerWellKnownGroups ALL_ROUTERS
  211. mrtObject registerWellKnownGroups ALL_PIM_ROUTERS
  212. mrtObject proc expandaddr {} {
  213. # extend the space to 32 bits
  214. mrtObject set mask-wkgroups 0x7fffffff
  215. foreach {name group} [mrtObject array get wkgroups] {
  216. mrtObject set wkgroups($name) [expr $group | 0x7fffffff]
  217. }
  218. }
  219. mrtObject instproc init { node } {
  220.         $self next
  221. $self set node_      $node
  222. }
  223. mrtObject instproc addproto { proto { iiflist "" } } {
  224.         $self instvar node_ protocols_
  225. # if iiflist is empty, protocol runs on all iifs
  226. if { $iiflist == "" } {
  227. set iiflist [$node_ get-all-iifs]
  228. lappend iiflist -1 ;#for local packets
  229. }
  230. foreach iif $iiflist {
  231. set protocols_($iif) $proto
  232. }
  233. }
  234. mrtObject instproc getType { protocolType } {
  235.         $self instvar protocols_
  236.         foreach iif [array names protocols_] {
  237.                 if { [$protocols_($iif) getType] == $protocolType } {
  238.                         return $protocols_($iif)
  239.                 }
  240.         }
  241.         return ""
  242. }
  243. mrtObject instproc all-mprotos {op args} {
  244. $self instvar protocols_
  245. foreach iif [array names protocols_] {
  246. set p $protocols_($iif)
  247. if ![info exists protos($p)] {
  248. set protos($p) 1
  249. eval $p $op $args
  250. }
  251. }
  252. }
  253. mrtObject instproc start {} { $self all-mprotos start }
  254. mrtObject instproc stop {} { $self all-mprotos stop }
  255. mrtObject instproc notify dummy { $self all-mprotos notify $dummy }
  256. mrtObject instproc dump-routes args {
  257. $self all-mprotos dump-routes $args
  258. }
  259. # similar to membership indication by igmp.. 
  260. mrtObject instproc join-group { grp src } {
  261. eval $self all-mprotos join-group $grp $src
  262. }
  263. mrtObject instproc leave-group { grp src } {
  264. eval $self all-mprotos leave-group $grp $src
  265. }
  266. mrtObject instproc upcall { code source group iface } {
  267.   # check if the group is local multicast to well-known group
  268. set wkgroup [expr [$class set mask-wkgroups]]
  269. if { [expr ( $group & $wkgroup ) == $wkgroup] } {
  270.                 $self instvar node_
  271. $node_ add-mfc $source $group -1 {}
  272. return 1
  273.         } else {
  274. $self instvar protocols_
  275. $protocols_($iface) upcall $code $source $group $iface
  276. }
  277. }
  278. mrtObject instproc drop { replicator src dst {iface -1} } {
  279. $self instvar protocols_
  280. $protocols_($iface) drop $replicator $src $dst $iface
  281. }