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

📄 pim-recvr.tcl

📁 在Linux下做的QuadTree的程序
💻 TCL
📖 第 1 页 / 共 2 页
字号:
                        $self add-oif $MRTArray($source:$group) $origin "SG"                        return 1                }                "WW" {                        # process *,*,RP join                }                default { return 0 }        }}PIM instproc recv-prune { msg } {        $self instvar Node MRTArray        set dst [lindex $msg 0]        set code [lindex $msg 1]        set source [lindex $msg 2]        set group [lindex $msg 3]        set origin [lindex $msg 4]        #puts "node [$Node id] recv-prune msg $msg"        if { [$Node id] != $dst } {                #puts "node [$Node id] rxvd prune destined to $dst"                # perform prune overrides here.. !           if { [set ent [$self longest_match $source $group]] == 0 } {                return 0           }           #puts "found longest match"           set iif [$self get-iif-label $origin]           #puts "incom i/f is $iif, ent iif [$ent getiif]"           if { [$ent getiif] != $iif } {               return 0           }           if { [$self compute-oifs $ent] == "" &&                ![$Node check-local $group] } {                return 0           }           # XXX check this further.. !! later !           #puts "sending prune overrides.. !!"#          set sendcode [expr {($code == "SG_RP") ? "SG" : "WC"}]# XXX temp hack... only *,Gs..           set sendcode "WC"           $self send-join $sendcode $source $group           return 1        }        switch $code {                "SG_RP" {                   set longest [$self longest_match $source $group]                   if { $longest == 0 } {                        #puts "Rxvd prune and no longest match !!!"                       return 0                   }                   #puts "node [$Node id] got SG RP prune"                   $self findSG $source $group 1 [PIM set RP]                   set ent $MRTArray($source:$group)                   $self del-oif $ent $origin "SG_RP"                   if { [$self compute-oifs $ent] == "" &&                                        ![$Node check-local $group] } {                        $self send-prune "SG_RP" $source $group                     }                   if { $longest != 0 } {                        $ent setiif [$longest getiif]                   }                }        }}PIM instproc recv-assert { msg } {        $self instvar Node MRTArray ns                                set dst [lindex $msg 0]        set code [lindex $msg 1]        set source [lindex $msg 2]        set group [lindex $msg 3]        set origin [lindex $msg 4]                           #puts "node [$Node id] rxvd Assert code $code, src $source, group $group"                                # XXX process asserts as in pim spec.. !        # XXX note that the following may break when same nodes are        # connected by multiple links & i/fs.. !XXXX         set link [$ns set link_([$Node id]:$origin)]        set oifInfo [$Node get-oif $link]        set index [lindex $oifInfo 0]        set iif [lindex $oifInfo 1]        # puts "_node [$Node id] got assert on iif $iif, index $index"        # if no longest match, do nothing        set longest [$self longest_match $source $group]        if { $longest == 0 } {                 #puts "_node [$Node id] got assert,.. no longest match!"                return 0        }                set flags [$longest getflags]        set winner -1           # check if iif belongs to oif        set oifs [$self compute-oif-ids $longest]        #puts "iif is $iif and oiflist $oifs index $index"        if { [set idx [$self index $oifs $index]] != -1 } {                set mycode [expr {($flags & [PIM set SG]) ? "SG" : "WC"}]                if { $code != $mycode } {                        if { $code == "SG" } {                                set winner 0                        } else {                                set winner 1                        }                } else {                   # compare addresses                   if { [$Node id] > $origin } {                        set winner 1                   } else {                        set winner 0                    }                }                        # if I am the winner then Assert, o.w. remove oif                if $winner {                   # XXX this is a fix to the spec bug.. !! XXX                   if { [$longest getType] != "SGEnt" ||                                ! [expr $flags & [PIM set CACHE]] } {                      #puts "_node [$Node id] won't assert, inactive matchXXX"                      return 0                   }                                                   #puts "_node [$Node id] Assert winner... asserting !"                   $self send-assert $source $group $mycode $iif                   return 1                } else {                   if { $mycode == "WC" && $code == "SG" } {                        #puts "_node [$Node id] lost assert, creating SG_RP"                        # create SG_RP; i.e. prune oif, and set RP bit                        set msg [list [$Node id] "SG_RP" $source $group $origin]                        $self recv-prune $msg                        $MRTArray($source:$group) setflags [PIM set RP]                   } elseif { $mycode == "WC" } {                        #puts "code WC lost assert deleting oif"                        $self del-oif $MRTArray($group) $origin "WC"                   } else {                        #puts "code SG lost assert... TBD.."                   }                }        } elseif { $index == [$longest getiif] } {                #puts "_node [$Node id] downstream router rxvd ASSERT... !!!"               if { $code == "WC" } {                   if [info exists MRTArray($group)] {                        $MRTArray($group) setNextHop $origin                        $MRTArray($group) setflags [PIM set ASSERTED]                   }                } else {                        $MRTArray($source:$group) setNextHop $origin                          $MRTArray($source:$group) setflags [PIM set ASSERTED]                   }        } else {                #puts "not upstream nor downstream.. !!"        }}PIM instproc reg-stop { srcAdd group drAdd } {	$self instvar regStopAgent	if { ! [info exists regStopAgent] } {		set regStopAgent [new Agent/Message/regStop $self]	}	$regStopAgent set dst_ $drAdd	# construct the reg stop msg.. etc}PIM instproc recv-register { msg } {	$self instvar Node MRTArray decapAgent regVif regVifNum	# puts "node [$Node id] recv register"	# format "$type/$mysrcAdd/$origsrcAdd/$group/$nullBit/$borderBit/$msg"	# type is removed in handle	set drAdd [lindex $msg 0]	set origAdd [lindex $msg 1]	set group [lindex $msg 2]	set mesg [lindex $msg 5]	# puts "drAdd $drAdd origAdd $origAdd group $group"	# process null and border bits	# if no longest match, send reg stop..to mysrcAdd or drAdd	if { ! [info exists MRTArray($group)] } { 		# send registerStop.. need regStopAgent for this.. !!XXXchk		return 0	}	set srcID [expr $origAdd >> 8]	$self findSG $srcID $group 1 0	set ent $MRTArray($srcID:$group)	$ent setflags [PIM set IIF_REG]	# if no cache, chk oifs, if null, chck if there is local agent.. 	if { [$self compute-oifs $ent] == "" && ![$Node check-local $group] } {		# puts " null oif src $srcID grp $group, should send reg stop"		# XXX send reg-stop.. to do		return 0	}	if { ! [info exists decapAgent] } {		set decapAgent [new Agent/Message]		# check how to include the pkt label.. target a reg_vif		# reg_vif targets the node entry.. XXXXXXXX chk chk		# install the reg_vif number as iif...		set regVif [$Node get-vif]		set regVifNum [expr { 			([$regVif info class] == "NetInterface") ? 				[$regVif id] : -1}]                $ent setiif $regVifNum		$decapAgent target [$regVif entry]	}	if { ! [expr [$ent getflags] & [PIM set CACHE]] } {	  # puts "installing cache w/iif register"	  $self change-cache $srcID $group "SG" $regVifNum	}	$decapAgent set addr_ $origAdd	$decapAgent set dst_ $group	# XXX see if we should include the cls in the msg and set it	# XXX	$decapAgent set class_ 2	$decapAgent send "$mesg"}

⌨️ 快捷键说明

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