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

📄 ctrmcastcomp.tcl

📁 对IEEE 802.11e里的分布式信道接入算法EDCA进行改进
💻 TCL
字号:
## tcl/ctr-mcast/CtrMcastComp.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# ########### CtrMcastComp Class ############################################ init {}########## compute-tree {src group Ttype}########## compute-branch {src group member Ttype}Class CtrMcastCompCtrMcastComp instproc init sim {	$self instvar ns_	set ns_ $sim	$self init-groups	$ns_ maybeEnableTraceAll $self {}}CtrMcastComp instproc id {} {	return 0}CtrMcastComp instproc trace { f nop {op ""} } {        $self instvar ns_ dynT_	if {$op == "nam" && [info exists dynT_]} {		foreach tr $dynT_ {			$tr namattach $f		}	} else {		lappend dynT_ [$ns_ create-trace Generic $f $self $self $op]	}}##### Main computation functions #####CtrMcastComp instproc reset-mroutes {} {	$self instvar ns_	foreach node [$ns_ all-nodes-list] {		foreach group [$self groups?] {		    set class_info [$node info class]		    if {$class_info != "LanNode"} {			$node clearReps * $group		    }#			*,G match catches all sources.# 			foreach src [$self sources? $group] {# 				$node clearReps [$src id] $group# 			}		}	}}CtrMcastComp instproc compute-mroutes {} {	$self reset-mroutes	foreach group [$self groups?] {		foreach src [$self sources? $group] {			$self compute-tree $src $group		}	}}CtrMcastComp instproc compute-tree { src group } {	foreach mem [$self members? $group] {		$self compute-branch $src $group $mem	}}CtrMcastComp instproc compute-branch { src group nodeh } {	$self instvar ns_	### set (S,G) join target	set tt [$self treetype? $group]	if { $tt == "SPT" } {		set target $src	} elseif { $tt == "RPT" } {		set target [$self get_rp $nodeh $group]	}	for {		set downstreamtmp ""		set tmp $nodeh	} { $downstreamtmp != $target } {		set downstreamtmp $tmp		set tmp [$tmp rpf-nbr $target]	} {		if {[SessionSim set MixMode_] && $downstreamtmp != "" && ![$ns_ detailed-link? [$tmp id] [$downstreamtmp id]]} {		    # puts "joining into session area"		    break		}		### set iif : RPF link interface label		if {$tmp == $target} {		    # at src or RP		    set iif -1		} else {		    set rpfl [$ns_ link [$tmp rpf-nbr $target] $tmp]		    if {[SessionSim set MixMode_] && $rpfl == ""} {			# in mix mode: default -1 unless find a 			# detailed link on the rpf path			set iif -1			set ttmp $tmp			while {$ttmp != $target} {			    set rpfl [$ns_ link [$ttmp rpf-nbr $target] $ttmp]			    if {$rpfl != ""} {				set iif [$rpfl if-label?]				break			    }			    set ttmp [$ttmp rpf-nbr $target]			}		    } else {			# in regular detailed mode			set iif [$rpfl if-label?]		    }		}		### set oif : RPF link		set oiflist ""		if { $downstreamtmp != "" } {			set rpfnbr [$downstreamtmp rpf-nbr $target]			if { $rpfnbr == $tmp } {			    set rpflink [$ns_ link $tmp $downstreamtmp]			    if {$rpflink != ""} {				set oiflist [$tmp link2oif $rpflink]			    } 			}		}		if { [set r [$tmp getReps [$src id] $group]] != "" } {			if [$r is-active] {				# puts "reach merging point, $group [$src id] [$target id] [$tmp id] [$nodeh id], iif $iif, oif $oiflist"				if { $oiflist != "" } {					$r insert [lindex $oiflist 0]				}				break			} else {				# puts "hasn't reached merging point, $group [$src id] [$target id] [$tmp id] [$nodeh id], iif $iif, oif $oiflist"				# so continue to insert the oif				if { $oiflist != "" } {					$r insert [lindex $oiflist 0]				}			}		} else {			# hasn't reached merging point,			# puts "so keep creating (S,G) like a graft, $group [$src id] [$target id] [$tmp id] [$nodeh id], iif $iif, oif $oiflist"			$tmp add-mfc [$src id] $group $iif $oiflist		}	}}CtrMcastComp instproc prune-branch { src group nodeh } {	$self instvar ns_	### set (S,G) prune target	set tt [$self treetype? $group]	if { $tt == "SPT" } {		set target $src	} elseif { $tt == "RPT" } {		set target [$self get_rp $nodeh $group]	}	for {		set downstreamtmp ""		set tmp $nodeh	} { $downstreamtmp != $target } {		set downstreamtmp $tmp		set tmp [$tmp rpf-nbr $target]	} {		set iif -1		set oif ""		if { $downstreamtmp != "" } {			set rpfnbr [$downstreamtmp rpf-nbr $target]			if { $rpfnbr == $tmp } {				set oif [$tmp link2oif [$ns_ link $tmp $downstreamtmp]]			}		}		if { [set r [$tmp getReps [$src id] $group]] != "" } {			if { $oif != "" } {				$r disable $oif			}			if [$r is-active] {				break			}		} else {			break		}	}    }# notify(): adapt to rtglib dynamicsCtrMcastComp instproc notify {} {	$self instvar ctrrpcomp	### need to add a delay before recomputation	$ctrrpcomp compute-rpset	$self compute-mroutes}## utility functions to track Source, Group, and Member State #CtrMcastComp instproc init-groups {} {	$self set Glist_ ""}CtrMcastComp instproc add-new-group group {    $self instvar Glist_     set group [expr $group]    if ![info exist Glist_] {        set Glist_ ""    }    if {[lsearch $Glist_ $group] < 0} {        lappend Glist_ $group    }}CtrMcastComp instproc add-new-member {group node} {    $self instvar Mlist_     set group [expr $group]    $self add-new-group $group    if ![info exist Mlist_($group)] {        set Mlist_($group) ""    }    if {[lsearch $Mlist_($group) $node] < 0} {        lappend Mlist_($group) $node    }}CtrMcastComp instproc new-source? {group node} {    $self instvar Slist_     set group [expr $group]    $self add-new-group $group    if ![info exist Slist_($group)] {        set Slist_($group) ""    }    if {[lsearch $Slist_($group) $node] < 0} {        lappend Slist_($group) $node        return 1    } else {        return 0    }}CtrMcastComp instproc groups? {} {	$self set Glist_}CtrMcastComp instproc members? group {	$self instvar Mlist_	set group [expr $group]	if ![info exists Mlist_($group)] {		set Mlist_($group) ""	}	set Mlist_($group)}CtrMcastComp instproc sources? group {	$self instvar Slist_	set group [expr $group]	if ![info exists Slist_($group)] {		set Slist_($group) ""	}	set Slist_($group)}CtrMcastComp instproc remove-member {group node} {    $self instvar Mlist_ Glist_    set group [expr $group]    set k [lsearch $Mlist_($group) $node]    if {$k < 0} {	puts "warning: removing non-member"    } else {	set Mlist_($group) [lreplace $Mlist_($group) $k $k]    }    if { $Mlist_($group) == "" } {	set k [lsearch $Glist_ $group]	if {$k < 0} {	    puts "warning: removing non-existing group"	} else {	    set Glist_ [lreplace $Glist_ $k $k]	}    }}CtrMcastComp instproc treetype? group {	$self instvar treetype_	set group [expr $group]	if [info exists treetype_($group)] {		return $treetype_($group)	} else {		return ""	}}CtrMcastComp instproc treetype {group tree} {	$self set treetype_([expr $group]) $tree}CtrMcastComp instproc switch-treetype group {	$self instvar treetype_ dynT_	set group [expr $group]	if [info exists dynT_] {		foreach tr $dynT_ {			$tr annotate "$group switch tree type"		}	}	set treetype_($group) "SPT"	$self add-new-group $group	$self compute-mroutes}CtrMcastComp instproc set_c_rp args {	$self instvar ns_        	foreach n [$ns_ all-nodes-list] {		set arbiter [$n getArbiter]		#NS creates a virtual node per LAN.  This node does		#not have any the multicast features set.		if {$arbiter != ""} {			set ctrmcast [$arbiter getType "CtrMcast"]			$ctrmcast instvar c_rp_			$ctrmcast unset_c_rp		}	}	foreach node $args {		set arbiter [$node getArbiter]	   		set ctrmcast [$arbiter getType "CtrMcast"]		$ctrmcast set_c_rp	}}CtrMcastComp instproc set_c_bsr args {	foreach node $args {		set tmp [split $node :]		set node [lindex $tmp 0]		set prior [lindex $tmp 1]		set arbiter [$node getArbiter]		set ctrmcast [$arbiter getType "CtrMcast"]		$ctrmcast set_c_bsr $prior	}}CtrMcastComp instproc get_rp { node group } {	set ctrmcast [[$node getArbiter] getType "CtrMcast"]	$ctrmcast get_rp $group}CtrMcastComp instproc get_bsr { node } {	set arbiter [$node getArbiter]	set ctrmcast [$arbiter getType "CtrMcast"]	$ctrmcast get_bsr}

⌨️ 快捷键说明

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