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

📄 dynamicdm.tcl

📁 CBRP协议(移动adhoc中基于分簇的路由协议)ns2下的源码
💻 TCL
字号:
 # # tcl/mcast/dynamicDM.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 #  #Class dynamicDM -superclass DMdynamicDM set ReportRouteTimeout 1dynamicDM instproc init { sim node } {	$self instvar ns Node type	set ns $sim	set Node $node	set type "dynamicDM"	$self initialize        set tracefile [$ns gettraceAllFile]        if { $tracefile != 0 } {	    $self trace $ns $tracefile $node	}	set tracefile [$ns getnamtraceAllFile]	if { $tracefile != 0 } {		$self trace $ns $tracefile $node "nam"	}}dynamicDM instproc start { } {        $self periodic-check}dynamicDM instproc periodic-check {} {        $self instvar ns        $self check-downstream-list        $ns at [expr [$ns now] + [dynamicDM set ReportRouteTimeout]] "$self periodic-check"}dynamicDM instproc notify changes {	$self check-downstream-list}dynamicDM instproc check-downstream-list { } {        $self instvar ns DownstreamList_ Node PruneTimer_ iif_        # puts "[$ns now] check downstream list"	set neighbor [$Node set neighbor_]	set id [$Node set id_]        foreach Anode [$ns all-nodes-list] {	    set oiflist ""	    set n1 [$Anode set id_]	    foreach node $neighbor {		set nbr [$node id]		set oifInfo [$Node RPF-interface $n1 $id $nbr]		if { $oifInfo != "" } {		    set oif [lindex $oifInfo 1]		    set k [lsearch -exact $oiflist $oif]		    if { $k < 0 } {			lappend oiflist $oif		    }		}	    }	    #update iif	    if {$Anode != $Node} {		if [info exists iif_($n1)] {		    set oldiface $iif_($n1)		}		set upstream [$ns upstream-node $id $n1]			if { $upstream != ""} {		    set iilink [$ns RPF-link $n1 [$upstream id] $id]		    set iif_($n1) [[$iilink set dest_] id]		}		if [info exists oldiface] {		    foreach pair [$Node getRepBySource $n1] {			set pair [split $pair :]			set group [lindex $pair 0]			set r [lindex $pair 1]			if {$oldiface != $iif_($n1)} {			    $r change-iface $n1 $group $oldiface $iif_($n1)			}		    }		}	    }	    	    if [info exists DownstreamList_($n1)] {		set oldlist $DownstreamList_($n1)		# puts "$oldlist"	    }	    set DownstreamList_($n1) [lsort -increasing $oiflist]	    # puts "$DownstreamList_($n1)"	    if [info exists oldlist] {		set m [llength $oldlist]		set n [llength $DownstreamList_($n1)]		# puts "$m, $n"		set j 0		set k 0		while { $j < $m || $k < $n} {		    set old [lindex $oldlist $j]		    set new [lindex $DownstreamList_($n1) $k]		    if {($n == $k) || (($m != $j) && ($old < $new))} {			foreach pair [$Node getRepBySource $n1] {			    set pair [split $pair :]			    set group [lindex $pair 0]			    set r [lindex $pair 1]			    if [$r exists $old] {				if [$r set active_($old)] {				    $r disable $old				} else {				    $ns cancel $PruneTimer_($n1:$group:$old)				}			    } else {				puts "panic: why $old not in old downstream list"			    }			}			incr j		    } elseif {$m == $j || ($n != $k && $old > $new)} {			foreach pair [$Node getRepBySource $n1] {			    set pair [split $pair :]			    set r [lindex $pair 1]			    $r insert $new			}			incr k		    } else {			incr j			incr k		    }		}	    }	}}dynamicDM instproc handle-cache-miss { argslist } {        set srcID [lindex $argslist 0]        set group [lindex $argslist 1]        set iface [lindex $argslist 2]        # puts "$self handel-cache-miss $srcID $group $iface"        $self instvar Node ns	set neighbor [$Node set neighbor_]        # init a list of lan indexes        set indexList ""	set oiflist ""	set id [$Node id]        # in the future this should be foreach iface $interfaces        foreach node $neighbor {           set nbr [$node id]           set oifInfo [$Node RPF-interface $srcID $id $nbr]           if { $oifInfo != "" } {                set index [lindex $oifInfo 0]                set oif [lindex $oifInfo 1]                set k [lsearch -exact $indexList $index]                if { $k < 0 } {                        lappend indexList $index                        lappend oiflist $oif                }           }        }	# got to find iface	if {$srcID == $id} {	    set iif -2	} else {	    set upstream [$ns upstream-node $id $srcID]		    set iilink [$ns RPF-link $srcID [$upstream id] $id]	    set iif [[$iilink set dest_] id]	}	$Node add-mfc $srcID $group $iif $oiflist}

⌨️ 快捷键说明

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