⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrmcast.tcl

📁 NS-2.28的802.11e协议扩展源代码
💻 TCL
字号:
## tcl/ctr-mcast/CtrMcast.tcl## Copyright (C) 1997 by USC/ISI# All rights reserved.                                            #                                                                # Redistribution and use in source and binary forms are permitted# provided that the above copyright notice and this paragraph are# duplicated in all such forms and that any documentation, advertising# materials, and other materials related to such distribution and use# acknowledge that the software was developed by the University of# Southern California, Information Sciences Institute.  The name of the# University may not be used to endorse or promote products derived from# this software without specific prior written permission.# # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.# # Contributed by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang# ########### CtrMcast Class: Individual Node join-group, leave-group, etc #####Class CtrMcast -superclass McastProtocolCtrMcast instproc init { sim node } {	$self next $sim $node	$self instvar ns_ node_	$self instvar agent_ defaultTree_ decapagent_	$self instvar c_rp_ c_bsr_ priority_	set agent_ [$ns_ set MrtHandle_]	set defaultTree_ "RPT"	set decapagent_ [new Agent/Decapsulator]	$ns_ attach-agent $node_ $decapagent_	### config PIM nodes	set c_rp_      1	set c_bsr_     1	set priority_  0}CtrMcast instproc join-group  { group } {	$self next $group	$self instvar node_ ns_ agent_	$self instvar defaultTree_	if { [$agent_ treetype? $group] == "" } {		$agent_ treetype $group $defaultTree_		$agent_ add-new-group $group	}	$agent_ add-new-member $group $node_	foreach src [$agent_ sources? $group] {		$agent_ compute-branch $src $group $node_	}}CtrMcast instproc leave-group  { group } {	$self next $group	$self instvar node_ ns_ agent_ defaultTree_	$agent_ remove-member $group $node_	foreach src [$agent_ sources? $group] {		$agent_ prune-branch $src $group $node_	}}CtrMcast instproc handle-cache-miss { srcID group iface } {	$self instvar ns_ agent_ node_	$self instvar defaultTree_	if { [$agent_ treetype? $group] == "" } {		$agent_ treetype $group $defaultTree_		#$agent_ add-new-member $group $node_	}	if { [$node_ id] == $srcID } {		set RP [$self get_rp $group]		if {[$agent_ treetype? $group] == "RPT" && $srcID != [$RP id]} {			set encapagent [new Agent/Encapsulator]			$ns_ attach-agent $node_ $encapagent			set ctrmcast [[$RP getArbiter] getType "CtrMcast"]			$ns_ connect $encapagent [$ctrmcast set decapagent_]			### create (S,G,iif=-1) entry			$node_ add-mfc-reg $srcID $group -1 $encapagent		}				if [$agent_ new-source? $group $node_] {			$agent_ compute-tree $node_ $group		}	} elseif [SessionSim set MixMode_] {	    set srcnode [$ns_ get-node-by-id $srcID]	    if [$agent_ new-source? $group $srcnode] {		$agent_ compute-tree $srcnode $group	    }	}	return 1 ;#call again}CtrMcast instproc drop  { replicator src group iface } {	#packets got dropped only due to null oiflist}CtrMcast instproc handle-wrong-iif { srcID group iface } {	warn "$self: $proc for <S: $srcID, G: $group, if: $iface>?"	return 0 ;#call once}CtrMcast instproc notify { dummy } {}##### Two functions to help get RP for a group ########## get_rp {group}                            ########## hash {rp group}                          #####CtrMcast instproc get_rp group {	$self instvar rpset_ agent_	if ![info exists rpset_] {		[$agent_ set ctrrpcomp] compute-rpset		assert [info exists rpset_]	}	set returnrp -1	set hashval -1	foreach rp $rpset_ {	        if {[$self hash $rp $group] > $hashval} {		        set hashval [$self hash $rp $group]		        set returnrp $rp		}	}	set returnrp		;# return}CtrMcast instproc hash {rp group} {	$rp id}CtrMcast instproc set-rpset args {	eval $self set rpset_ "$args"}CtrMcast instproc get_bsr {} {	warn "$self: CtrMcast doesn't require a BSR"}CtrMcast instproc set_c_bsr { prior } {	$self instvar c_bsr_ priority_	set c_bsr_ 1	set priority_ $prior}CtrMcast instproc set_c_rp {} {	$self instvar c_rp_	set c_rp_ 1}CtrMcast instproc unset_c_rp {} {	$self instvar c_rp_	set c_rp_ 0}##################### MultiNode: add-mfc-reg ################Node instproc add-mfc-reg { src group iif oiflist } {	$self instvar multiclassifier_ Regreplicator_	#XXX node addr is in upper 24 bits	if [info exists Regreplicator_($group)] {		foreach oif $oiflist {			$Regreplicator_($group) insert $oif		}		return 1	}	set r [new Classifier/Replicator/Demuxer]	$r set node_ $self	$r set srcID_ $src	set Regreplicator_($group) $r	foreach oif $oiflist {		$r insert $oif	}	# Install the replicator.  We do this only once and leave	# it forever.  Since prunes are data driven, we want to	# leave the replicator in place even when it's empty since	# the replicator::drop callback triggers the prune.	#	$multiclassifier_ add-rep $r $src $group $iif}Node instproc getRegreplicator group {	$self instvar Regreplicator_	if [info exists Regreplicator_($group)] {		return $Regreplicator_($group)	} else {		return -1	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -