📄 srm-ssm.tcl
字号:
Agent/SRM/SSM set group_scope_ 32Agent/SRM/SSM set local_scope_ 2Agent/SRM/SSM set scope_flag_ 2Agent/SRM/SSM set rep_id_ 0Agent/SRM/SSM set numrep_ 0Agent/SRM/SSM set repthresh_up_ 100Agent/SRM/SSM set repthresh_low_ 7Agent/SRM/SSM set Z1_ 1.5Agent/SRM/SSM set S1_ 0.0Agent/SRM/SSM set S2_ 3.0Agent/SRM/SSM instproc init {} { $self next $self instvar numrep_ numloc_ repthresh_up_ repthresh_low_ Z1_ \ S1_ S2_ set numrep_ 0 set numloc_ 0 set repthresh_up_ [$class set repthresh_up_] set repthresh_low_ [$class set repthresh_low_] set Z1_ [$class set Z1_] set S1_ [$class set S1_] set S2_ [$class set S2_]}Agent/SRM/SSM instproc start {} { $self next $self instvar deactivateID_ sessionDelay_ ns_ set now [expr [$ns_ now]] set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-reps $now"]}#Currently not usedAgent/SRM/SSM instproc repid { rep} { $self instvar rep_id_ $self set rep_id_ [$rep set addr_] $self ch-rep }Agent/SRM/SSM instproc member-scope {scope } { $self instvar scope_flag_ $self set scope_flag_ $scope# $self ch-scope scope}Agent/SRM/SSM instproc local-member? {} { $self instvar scope_flag_ if {$scope_flag_ == 1 } { return 1 } else { return 0 }}Agent/SRM/SSM instproc global-member? {} { $self instvar scope_flag_ if {$scope_flag_ == 2 } { return 1 } else { return 0 }}Agent/SRM/SSM instproc local-member {} { $self member-scope 1 }Agent/SRM/SSM instproc global-rep {} { $self member-scope 2 set rep_id_ [$self set addr_] $self ch-rep}Agent/SRM/SSM instproc set-local-scope {scope} { $self instvar local_scope_ $self set local_scope_ $scope}Agent/SRM/SSM instproc set-global-scope {scope} { $self instvar global-scope $self set global-scope $scope}Agent/SRM/SSM instproc set-repid {rep} { $self instvar rep_id_ $self set rep_id_ [$rep set addr_] $self ch-rep }Agent/SRM/SSM instproc dump-reps {} { $self instvar ns_ activerep_ numrep_ puts "[ft $ns_ $self] numreps: $numrep_" if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] set ttl [$activerep_($i) set ttl_] puts "rep: $i recvtime: [ftime $rtime] ttl: $ttl" } }}Agent/SRM/SSM instproc dump-locs {} { $self instvar ns_ activeloc_ numloc_ puts "[ft $ns_ $self] numlocs: $numloc_" if [info exists activeloc_] { foreach i [array names activeloc_] { set rtime [$activeloc_($i) set recvTime_] set ttl [$activeloc_($i) set ttl_] set repid [$activeloc_($i) set repid_] puts "loc: $i recvtime: [ftime $rtime] ttl: \ $ttl repid: $repid" } }}Agent/SRM/SSM instproc send-session {} { $self instvar session_ $session_ send-session}# Called when rep change is detected as following# a) rep sends a local session message# b) do not hear from the rep for a longtime.Agent/SRM/SSM instproc repchange-action {} { $self instvar rep_id_ tentativerep_ tentativettl_ $self instvar ns_ $self cur-num-reps set rep_id_ $tentativerep_ puts "[ft $ns_ $self] chrep rep : $tentativerep_\ ttl : $tentativettl_" $self set-local-scope $tentativettl_ $self local-member $self ch-rep $self send-session}Agent/SRM/SSM instproc recv-lsess {sender repid ttl} { # If it is mychild deactivate-locs will adjust the ttl $self instvar activeloc_ ns_ numloc_ sessionDelay_ deactivatelocID_ $self instvar activerep_ numrep_ $self instvar ch_localID_ tentativerep_ addr_ rep_id_ tentativettl_# if { $rep_id_ == $sender} {# puts "[ft $ns_ $self] lsess from myparent: $sender== $repid"# } if [info exists activeloc_($sender)] { $activeloc_($sender) recv-lsess $repid $ttl } else { set activeloc_($sender) [new SRMinfo/loc $sender] incr numloc_ $activeloc_($sender) set-params $ns_ $self $activeloc_($sender) recv-lsess $repid $ttl }# if { $repid == [$self set addr_]} {# puts "[ft $ns_ $self] lsess,mychild: $sender== $repid"# }# recvd a local session message from someone who was global if [info exists activerep_($sender)] { delete $activerep_($sender) unset activerep_($sender) incr numrep_ -1 if [info exists ch_localID_] { if {[info exists tentativerep_] && $tentativerep_ == $sender } {# find new rep $self cur-num-reps } if { $repid == $addr_} { $ns_ cancel $ch_localID_ $self unset ch_localID_ $self check-status } } # If this is my rep then if { [$self local-member?]} { if { $sender == $rep_id_} { $self repchange-action } } else { if { $sender == $rep_id_} { puts "[ft $ns_ $self] error" } } } # Currently we do this everytime session message is received set time [expr [$ns_ now] - 3 * $sessionDelay_] if [info exists deactivatelocID_] { $ns_ cancel $deactivatelocID_ unset deactivatelocID_ } $self deactivate-locs $time}Agent/SRM/SSM instproc recv-gsess {sender ttl} { $self instvar activerep_ ns_ numrep_ sessionDelay_ $self instvar deactivateID_ local_scope_ # puts "[ft $ns_ $self] gsess: $sender" $self instvar activeloc_ numloc_ if [info exists activerep_($sender)] { $activerep_($sender) recv-gsess $ttl } else { set activerep_($sender) [new SRMinfo/rep $sender] incr numrep_ $activerep_($sender) set-params $ns_ $self $activerep_($sender) recv-gsess $ttl } # Currently we do this everytime session message is received set time [expr [$ns_ now] - 3 * $sessionDelay_] if [info exists deactivateID_] { $ns_ cancel $deactivateID_ unset deactivateID_ }# recvd a global session message from someone who was local if [info exists activeloc_($sender)] { delete $activeloc_($sender) unset activeloc_($sender) incr numloc_ -1 } if { [$self local-member?]} { if {$ttl < $local_scope_} { set rep_id_ $sender puts "[ft $ns_ $self] closerrep rep : $sender \ ttl : $ttl" $self set-local-scope $ttl $self local-member $self ch-rep $self send-session } } $self deactivate-reps $time $self check-status}Agent/SRM/SSM instproc bias {} { $self instvar activerep_ ns_ sessionDelay_ set now [expr [$ns_ now]] set biasfactor 0 set time [expr $now - 1.5 * $sessionDelay_] if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] if { $rtime >= $time} { incr biasfactor } } } return $biasfactor}Agent/SRM/SSM instproc my-loc {} { $self instvar activeloc_ set num 0 if [info exists activeloc_] { foreach i [array names activeloc_] { set repid [$activeloc_($i) set repid_] if { $repid == [$self set addr_]} { incr num } } } return $num}Agent/SRM/SSM instproc cur-num-reps {} { $self instvar activerep_ ns_ sessionDelay_ tentativerep_ tentativettl_ $self instvar Z1_ set now [expr [$ns_ now]] set num 0 set min_ttl 32 set time [expr $now - $Z1_ * $sessionDelay_] if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] set ttl [$activerep_($i) set ttl_] if { $rtime >= $time} { if {$min_ttl > $ttl} { set tentativerep_ $i set min_ttl $ttl } incr num } } } set tentativettl_ $min_ttl return $num}Agent/SRM/SSM instproc compute-localdelay {} { $self instvar S1_ S2_ sessionDelay_ set num [$self my-loc] if {$num > 0} { set rancomp [expr $S1_+ 1 + $S2_ * [uniform 0 1]] } else { set rancomp [expr $S1_+ $S2_ * [uniform 0 1]] }# set delay [expr $rancomp * [$self bias] * $sessionDelay_ / \# $repthresh_up_ ] set delay [expr $rancomp * $sessionDelay_] return $delay}Agent/SRM/SSM instproc compute-globaldelay {} { $self instvar S1_ S2_ sessionDelay_ set rancomp [expr $S1_ + $S2_ * [uniform 0 1]] set delay [expr $rancomp * $sessionDelay_] return $delay}Agent/SRM/SSM instproc schedule-ch-local {} { $self instvar ns_ ch_localID_ set now [$ns_ now] set delay [$self compute-localdelay] set fireTime [expr $now + $delay] if [info exists ch_localID_] { puts "[new_ft $ns_ $self] scheduled called without cancel" $ns_ cancel $ch_localID_ unset ch_localID_ } set ch_localID_ [$ns_ at $fireTime "$self ch-local"] puts "[ft $ns_ $self] schlocal [ftime $fireTime] evid : $ch_localID_"}Agent/SRM/SSM instproc schedule-ch-global {} { $self instvar ns_ ch_globalID_ set now [$ns_ now] set delay [$self compute-globaldelay] set fireTime [expr $now + $delay] if [info exists ch_globalID_] { puts "[ft $ns_ $self] glbscheduled called without cancel" $ns_ cancel $ch_globalID_ unset ch_globalID_ } set ch_globalID_ [$ns_ at $fireTime "$self ch-global"] puts "[ft $ns_ $self] schglobal [ftime $fireTime] evid : $ch_globalID_"}Agent/SRM/SSM instproc check-status {} { $self instvar ns_ numrep_ repthresh_up_ ch_localID_ $self instvar ch_globalID_ repthresh_low_ if { $numrep_ > $repthresh_up_ } { if [info exists ch_localID_] { # Already scheduled.. return; } if { [$self local-member?]} { # Already a local member, cancel changing to # global if scheduled if [info exists ch_globalID_] { $ns_ cancel $ch_globalID_ unset ch_globalID_ } return; } $self schedule-ch-local return; } if {$numrep_ < $repthresh_low_} { if [info exists ch_globalID_] { # Already scheduled.. return; } if { [$self global-member?]} { # Already a global member, cancel changing to # local if scheduled if [info exists ch_localID_] { $ns_ cancel $ch_localID_ unset ch_localID_ } return; } $self schedule-ch-global return; } if [info exists ch_localID_] { $ns_ cancel $ch_localID_ unset ch_localID_ } if [info exists ch_globalID_] { $ns_ cancel $ch_globalID_ unset ch_globalID_ } }Agent/SRM/SSM instproc ch-local {} { $self instvar repthresh_up_ tentativerep_ tentativettl_ ns_ rep_id_ if {[$self cur-num-reps] > $repthresh_up_} {#change scope, scope status and rep set rep_id_ $tentativerep_ puts "[ft $ns_ $self] chlocal rep : $tentativerep_\ ttl : $tentativettl_" $self local-member $self ch-rep $self send-session # Moved this so that the first local message reaches # all the children for faster detection $self set-local-scope $tentativettl_ } if [info exists ch_localID_] { $ns_ cancel ch_localID_ unset ch_localID_ }}Agent/SRM/SSM instproc ch-global {} { $self instvar repthresh_low_ tentativerep_ tentativettl_ ns_ rep_id_ if {[$self cur-num-reps] < $repthresh_low_} {#change scope, scope status and rep set rep_id_ [$self set addr_] puts "[ft $ns_ $self] chglobal rep : $rep_id_\ ttl : $tentativettl_" # Here currently setting the localscope to reach # nearest rep, change later.. # $self set-local-scope $tentativettl_ # Set to zero and modify if get lsess $self set-local-scope 0 $self global-rep $self ch-rep $self send-session } if [info exists ch_globalID_] { $ns_ cancel ch_globalID_ unset ch_globalID_ }}Agent/SRM/SSM instproc deactivate-reps {time} { $self instvar numrep_ activerep_ deactivateID_ ns_ $self instvar sessionDelay_ rep_id_ if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] if { $rtime < $time} { delete $activerep_($i) unset activerep_($i) incr numrep_ -1 # have not heard from the rep for a longtime # Currently just find a new rep if { $i == $rep_id_ } { puts "[ft $ns_ $self] $i == $rep_id_" $self repchange-action } } } if {$numrep_ <= 0} { unset activerep_ } } set now [expr [$ns_ now]] set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-reps $now"]# $self dump-reps }Agent/SRM/SSM instproc deactivate-locs {time} { $self instvar numloc_ activeloc_ deactivatelocID_ ns_ $self instvar sessionDelay_ local_scope_ set maxttl 0 if [info exists activeloc_] { foreach i [array names activeloc_] { set rtime [$activeloc_($i) set recvTime_] if { $rtime < $time} { delete $activeloc_($i) unset activeloc_($i) incr numloc_ -1 } else { # Might want to set it for own # children only if { [$self global-member?] } { set ttl [$activeloc_($i) set ttl_] if {$maxttl < $ttl} { set maxttl $ttl } set local_scope_ $maxttl } } } if {$numloc_ <= 0} { unset activeloc_ } } set now [expr [$ns_ now]] set deactivatelocID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-locs $now"]# $self dump-locs}Class SRMinfoSRMinfo set recvTime_ 0SRMinfo instproc init {sender} { $self next $self instvar sender_ set sender_ $sender}SRMinfo instproc set-params {ns agent} { $self instvar ns_ agent_ set ns_ $ns set agent_ $agent}Class SRMinfo/rep -superclass SRMinfoSRMinfo/rep instproc recv-gsess {ttl} { $self instvar recvTime_ ns_ ttl_ set now [$ns_ now] set recvTime_ [expr $now] set ttl_ [expr $ttl]}Class SRMinfo/loc -superclass SRMinfoSRMinfo/loc instproc recv-lsess {repid ttl} { $self instvar recvTime_ ns_ ttl_ repid_ set now [$ns_ now] set recvTime_ [expr $now] set ttl_ [expr $ttl] set repid_ [expr $repid]}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -