📄 pim-recvr.tcl
字号:
$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 + -