srm-ssm.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. Agent/SRM/SSM set group_scope_ 32
  2. Agent/SRM/SSM set local_scope_ 2
  3. Agent/SRM/SSM set scope_flag_  2
  4. Agent/SRM/SSM set rep_id_ 0
  5. Agent/SRM/SSM set numrep_ 0
  6. Agent/SRM/SSM set repthresh_up_ 100
  7. Agent/SRM/SSM set repthresh_low_ 7
  8. Agent/SRM/SSM set Z1_ 1.5
  9. Agent/SRM/SSM set S1_ 0.0
  10. Agent/SRM/SSM set S2_ 3.0
  11. Agent/SRM/SSM instproc init {} {
  12. $self next
  13. $self instvar numrep_ numloc_ repthresh_up_ repthresh_low_ Z1_ 
  14. S1_ S2_
  15. set numrep_ 0
  16. set numloc_ 0
  17. set repthresh_up_ [$class set repthresh_up_]
  18. set repthresh_low_ [$class set repthresh_low_]
  19. set Z1_ [$class set Z1_]
  20. set S1_ [$class set S1_]
  21. set S2_ [$class set S2_]
  22. }
  23. Agent/SRM/SSM instproc start {} {
  24. $self next 
  25. $self instvar deactivateID_ sessionDelay_ ns_
  26. set now [expr [$ns_ now]]
  27. set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] 
  28. "$self deactivate-reps $now"]
  29. }
  30. #Currently not used
  31. Agent/SRM/SSM instproc repid { rep} {
  32. $self instvar rep_id_
  33. $self set rep_id_ [$rep set addr_]
  34. $self ch-rep 
  35. }
  36. Agent/SRM/SSM instproc member-scope {scope } {
  37. $self instvar scope_flag_
  38. $self set scope_flag_ $scope
  39. # $self ch-scope scope
  40. }
  41. Agent/SRM/SSM instproc local-member? {} {
  42. $self instvar scope_flag_
  43. if {$scope_flag_ == 1 } {
  44. return 1
  45. } else {
  46. return 0
  47. }
  48. }
  49. Agent/SRM/SSM instproc global-member? {} {
  50. $self instvar scope_flag_
  51. if {$scope_flag_ == 2 } {
  52. return 1
  53. } else {
  54. return 0
  55. }
  56. }
  57. Agent/SRM/SSM instproc local-member {} {
  58. $self member-scope 1
  59. }
  60. Agent/SRM/SSM instproc global-rep {} {
  61. $self member-scope 2
  62. set rep_id_ [$self set addr_]
  63. $self ch-rep
  64. }
  65. Agent/SRM/SSM instproc set-local-scope {scope} {
  66. $self instvar local_scope_
  67. $self set local_scope_ $scope
  68. }
  69. Agent/SRM/SSM instproc set-global-scope {scope} {
  70. $self instvar global-scope
  71. $self set global-scope $scope
  72. }
  73. Agent/SRM/SSM instproc set-repid {rep} {
  74. $self instvar rep_id_
  75. $self set rep_id_ [$rep set addr_]
  76. $self ch-rep 
  77. }
  78. Agent/SRM/SSM instproc dump-reps {} {
  79. $self instvar ns_ activerep_ numrep_
  80. puts "[ft $ns_ $self] numreps: $numrep_"
  81. if [info exists activerep_] {
  82. foreach i [array names activerep_] {
  83. set rtime [$activerep_($i) set recvTime_]
  84. set ttl [$activerep_($i) set ttl_]
  85. puts "rep: $i recvtime: [ftime $rtime] ttl: $ttl"
  86. }
  87. }
  88. }
  89. Agent/SRM/SSM instproc dump-locs {} {
  90. $self instvar ns_ activeloc_ numloc_
  91. puts "[ft $ns_ $self] numlocs: $numloc_"
  92. if [info exists activeloc_] {
  93. foreach i [array names activeloc_] {
  94. set rtime [$activeloc_($i) set recvTime_]
  95. set ttl [$activeloc_($i) set ttl_]
  96. set repid [$activeloc_($i) set repid_]
  97. puts "loc: $i recvtime: [ftime $rtime] ttl: 
  98. $ttl repid: $repid"
  99. }
  100. }
  101. }
  102. Agent/SRM/SSM instproc send-session {} {
  103. $self instvar session_
  104. $session_ send-session
  105. }
  106. # Called when rep change is detected as following
  107. # a) rep sends a local session message
  108. # b) do not hear from the rep for a longtime.
  109. Agent/SRM/SSM instproc repchange-action {} {
  110. $self instvar rep_id_ tentativerep_ tentativettl_
  111. $self instvar ns_
  112. $self cur-num-reps
  113. set rep_id_ $tentativerep_
  114. puts "[ft $ns_ $self] chrep rep : $tentativerep_
  115. ttl : $tentativettl_"
  116. $self set-local-scope $tentativettl_
  117. $self local-member
  118. $self ch-rep
  119. $self send-session
  120. }
  121. Agent/SRM/SSM instproc recv-lsess {sender repid ttl} {
  122. # If it is mychild deactivate-locs will adjust the ttl
  123. $self instvar activeloc_ ns_ numloc_ sessionDelay_ deactivatelocID_
  124. $self instvar activerep_ numrep_
  125. $self instvar ch_localID_ tentativerep_ addr_ rep_id_ tentativettl_
  126. # if { $rep_id_ == $sender} {
  127. # puts "[ft $ns_ $self] lsess from myparent: $sender== $repid"
  128. # }
  129. if [info exists activeloc_($sender)] {
  130. $activeloc_($sender) recv-lsess $repid $ttl
  131. } else {
  132. set activeloc_($sender) [new SRMinfo/loc $sender]
  133. incr numloc_
  134. $activeloc_($sender) set-params $ns_ $self
  135. $activeloc_($sender) recv-lsess $repid $ttl
  136. }
  137. # if { $repid == [$self set addr_]} {
  138. # puts "[ft $ns_ $self] lsess,mychild: $sender== $repid"
  139. # }
  140. # recvd a local session message from someone who was global
  141. if [info exists activerep_($sender)] {
  142. delete $activerep_($sender)
  143. unset activerep_($sender)
  144. incr numrep_ -1
  145. if [info exists ch_localID_] {
  146. if {[info exists tentativerep_] && $tentativerep_ == $sender } {
  147. # find new rep
  148. $self cur-num-reps
  149. }
  150. if { $repid == $addr_} {
  151. $ns_ cancel $ch_localID_
  152. $self unset ch_localID_
  153. $self check-status
  154. }
  155. }
  156. # If this is my rep then
  157. if { [$self local-member?]} {
  158. if { $sender == $rep_id_} {
  159. $self repchange-action
  160. }
  161. } else {
  162. if { $sender == $rep_id_} {
  163. puts "[ft $ns_ $self] error"
  164. }
  165. }
  166. }
  167. # Currently we do this everytime session message is received
  168. set time [expr [$ns_ now] - 3 * $sessionDelay_]
  169. if [info exists deactivatelocID_] {
  170. $ns_ cancel $deactivatelocID_
  171. unset deactivatelocID_
  172. }
  173. $self deactivate-locs $time
  174. }
  175. Agent/SRM/SSM instproc recv-gsess {sender ttl} {
  176. $self instvar activerep_ ns_ numrep_ sessionDelay_
  177. $self instvar deactivateID_ local_scope_
  178. # puts "[ft $ns_ $self] gsess: $sender"
  179. $self instvar activeloc_ numloc_
  180. if [info exists activerep_($sender)] {
  181. $activerep_($sender) recv-gsess $ttl
  182. } else {
  183. set activerep_($sender) [new SRMinfo/rep $sender]
  184. incr numrep_
  185. $activerep_($sender) set-params $ns_ $self
  186. $activerep_($sender) recv-gsess $ttl
  187. }
  188. # Currently we do this everytime session message is received
  189. set time [expr [$ns_ now] - 3 * $sessionDelay_]
  190. if [info exists deactivateID_] {
  191. $ns_ cancel $deactivateID_
  192. unset deactivateID_
  193. }
  194. # recvd a global session message from someone who was local
  195. if [info exists activeloc_($sender)] {
  196. delete $activeloc_($sender)
  197. unset activeloc_($sender)
  198. incr numloc_ -1
  199. }
  200. if { [$self local-member?]} {
  201. if {$ttl < $local_scope_} {
  202. set rep_id_ $sender
  203. puts "[ft $ns_ $self] closerrep rep : $sender 
  204. ttl : $ttl"
  205. $self set-local-scope $ttl
  206. $self local-member
  207. $self ch-rep
  208. $self send-session
  209. }
  210. }
  211. $self deactivate-reps $time
  212. $self check-status
  213. }
  214. Agent/SRM/SSM instproc bias {} {
  215. $self instvar activerep_  ns_ sessionDelay_
  216. set now [expr [$ns_ now]]
  217. set biasfactor 0
  218. set time [expr $now - 1.5 * $sessionDelay_]
  219. if [info exists activerep_] {
  220. foreach i [array names activerep_] {
  221. set rtime [$activerep_($i) set recvTime_]
  222. if { $rtime >= $time} {
  223. incr biasfactor 
  224. }
  225. }
  226. }
  227. return $biasfactor
  228. }
  229. Agent/SRM/SSM instproc my-loc {} {
  230. $self instvar activeloc_
  231. set num 0
  232. if [info exists activeloc_] {
  233. foreach i [array names activeloc_] {
  234. set repid [$activeloc_($i) set repid_]
  235. if { $repid == [$self set addr_]} {
  236. incr num
  237. }
  238. }
  239. }
  240. return $num
  241. }
  242. Agent/SRM/SSM instproc cur-num-reps {} {
  243. $self instvar activerep_  ns_ sessionDelay_ tentativerep_ tentativettl_ 
  244. $self instvar Z1_
  245. set now [expr [$ns_ now]]
  246. set num 0
  247. set min_ttl 32
  248. set time [expr $now - $Z1_ * $sessionDelay_]
  249. if [info exists activerep_] {
  250. foreach i [array names activerep_] {
  251. set rtime [$activerep_($i) set recvTime_]
  252. set ttl [$activerep_($i) set ttl_]
  253. if { $rtime >= $time} {
  254. if {$min_ttl > $ttl} {
  255. set tentativerep_ $i
  256. set min_ttl $ttl
  257. }
  258. incr num
  259. }
  260. }
  261. }
  262. set tentativettl_ $min_ttl
  263. return $num
  264. }
  265. Agent/SRM/SSM instproc compute-localdelay {} {
  266.     $self instvar S1_ S2_ sessionDelay_
  267.     set num [$self my-loc]
  268.     if {$num > 0} {
  269. set rancomp [expr $S1_+ 1 + $S2_ * [uniform 0 1]]
  270.     } else {
  271. set rancomp [expr $S1_+ $S2_ * [uniform 0 1]]
  272.     }
  273. #    set delay [expr $rancomp * [$self bias] * $sessionDelay_ / 
  274. #     $repthresh_up_ ]
  275.     set delay [expr $rancomp * $sessionDelay_]
  276.     return $delay
  277. }
  278. Agent/SRM/SSM instproc compute-globaldelay {} {
  279.     $self instvar S1_ S2_ sessionDelay_
  280.     set rancomp [expr $S1_ + $S2_ * [uniform 0 1]]
  281.     set delay [expr $rancomp * $sessionDelay_]
  282.     return $delay
  283. }
  284. Agent/SRM/SSM instproc schedule-ch-local {} {
  285.     $self instvar ns_ ch_localID_
  286.     set now [$ns_ now]
  287.     set delay [$self compute-localdelay]
  288.     set fireTime [expr $now + $delay]
  289.     if [info exists ch_localID_] {
  290. puts "[new_ft $ns_ $self] scheduled called without cancel"
  291. $ns_ cancel $ch_localID_
  292. unset ch_localID_
  293.     }
  294.     set ch_localID_ [$ns_ at $fireTime "$self ch-local"]
  295.     puts "[ft $ns_ $self] schlocal [ftime $fireTime] evid : $ch_localID_"
  296. }
  297. Agent/SRM/SSM instproc schedule-ch-global {} {
  298.     $self instvar ns_ ch_globalID_
  299.     set now [$ns_ now]
  300.     set delay [$self compute-globaldelay]
  301.     set fireTime [expr $now + $delay]
  302.     if [info exists ch_globalID_] {
  303. puts "[ft $ns_ $self] glbscheduled called without cancel"
  304. $ns_ cancel $ch_globalID_
  305. unset ch_globalID_
  306.     }
  307.     set ch_globalID_ [$ns_ at $fireTime "$self ch-global"]
  308.     puts "[ft $ns_ $self] schglobal [ftime $fireTime] evid : $ch_globalID_"
  309. }
  310. Agent/SRM/SSM instproc check-status {} {
  311. $self instvar ns_ numrep_ repthresh_up_ ch_localID_
  312. $self instvar ch_globalID_ repthresh_low_
  313. if { $numrep_ > $repthresh_up_ }  {
  314. if [info exists ch_localID_] {
  315. # Already scheduled..
  316. return;
  317. }
  318. if { [$self local-member?]} {
  319. # Already a local member, cancel changing to
  320. # global if scheduled
  321. if [info exists ch_globalID_] {
  322. $ns_ cancel $ch_globalID_
  323. unset ch_globalID_
  324. }
  325. return;
  326. }
  327. $self schedule-ch-local
  328. return;
  329. }
  330. if {$numrep_ < $repthresh_low_} {
  331. if [info exists ch_globalID_] {
  332. # Already scheduled..
  333. return;
  334. }
  335. if { [$self global-member?]} {
  336. # Already a global member, cancel changing to
  337. # local if scheduled
  338. if [info exists ch_localID_] {
  339. $ns_ cancel $ch_localID_
  340. unset ch_localID_
  341. }
  342. return;
  343. }
  344. $self schedule-ch-global
  345. return;
  346. }
  347. if [info exists ch_localID_] {
  348. $ns_ cancel $ch_localID_
  349. unset ch_localID_
  350. }
  351. if [info exists ch_globalID_] {
  352. $ns_ cancel $ch_globalID_
  353. unset ch_globalID_
  354. }
  355. }
  356. Agent/SRM/SSM instproc ch-local {} {
  357. $self instvar repthresh_up_ tentativerep_ tentativettl_ ns_ rep_id_
  358. if {[$self cur-num-reps] > $repthresh_up_} {
  359. #change scope, scope status and rep
  360. set rep_id_ $tentativerep_
  361. puts "[ft $ns_ $self] chlocal rep : $tentativerep_
  362. ttl : $tentativettl_"
  363. $self local-member
  364. $self ch-rep
  365. $self send-session
  366. # Moved this so that the first local message reaches
  367. # all the children for faster detection
  368. $self set-local-scope $tentativettl_
  369. }
  370. if [info exists ch_localID_] {
  371. $ns_ cancel ch_localID_
  372. unset ch_localID_
  373. }
  374. }
  375. Agent/SRM/SSM instproc ch-global {} {
  376. $self instvar repthresh_low_ tentativerep_ tentativettl_ ns_ rep_id_
  377. if {[$self cur-num-reps] < $repthresh_low_} {
  378. #change scope, scope status and rep
  379. set rep_id_ [$self set addr_]
  380. puts "[ft $ns_ $self] chglobal rep : $rep_id_
  381. ttl : $tentativettl_"
  382. # Here currently setting the localscope to reach
  383. # nearest rep, change later..
  384. # $self set-local-scope $tentativettl_
  385. # Set to zero and modify if get lsess
  386. $self set-local-scope 0
  387. $self global-rep
  388. $self ch-rep
  389. $self send-session
  390. }
  391. if [info exists ch_globalID_] {
  392. $ns_ cancel ch_globalID_
  393. unset ch_globalID_
  394. }
  395. }
  396. Agent/SRM/SSM instproc deactivate-reps {time} {
  397. $self instvar numrep_ activerep_ deactivateID_ ns_
  398. $self instvar sessionDelay_ rep_id_
  399. if [info exists activerep_] {
  400. foreach i [array names activerep_] {
  401. set rtime [$activerep_($i) set recvTime_]
  402. if { $rtime < $time} {
  403. delete $activerep_($i)
  404. unset activerep_($i)
  405. incr numrep_ -1
  406. # have not heard from the rep for a longtime
  407. # Currently just find a new rep
  408. if { $i == $rep_id_ } {
  409. puts "[ft $ns_ $self] $i == $rep_id_" 
  410. $self repchange-action
  411. }
  412. }
  413. }
  414. if {$numrep_ <= 0} {
  415. unset activerep_
  416. }
  417. }
  418. set now [expr [$ns_ now]]
  419. set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] 
  420. "$self deactivate-reps $now"]
  421. # $self dump-reps
  422. }
  423. Agent/SRM/SSM instproc deactivate-locs {time} {
  424. $self instvar numloc_ activeloc_ deactivatelocID_ ns_
  425. $self instvar sessionDelay_ local_scope_
  426. set maxttl 0
  427. if [info exists activeloc_] {
  428. foreach i [array names activeloc_] {
  429. set rtime [$activeloc_($i) set recvTime_]
  430. if { $rtime < $time} {
  431. delete $activeloc_($i)
  432. unset activeloc_($i)
  433. incr numloc_ -1
  434. } else {
  435. # Might want to set it for own
  436. # children only
  437. if { [$self global-member?] } {
  438. set ttl [$activeloc_($i) set ttl_]
  439. if {$maxttl < $ttl} {
  440. set maxttl $ttl
  441. }
  442. set local_scope_ $maxttl
  443. }
  444. }
  445. }
  446. if {$numloc_ <= 0} {
  447. unset activeloc_
  448. }
  449. }
  450. set now [expr [$ns_ now]]
  451. set deactivatelocID_ [$ns_ at [expr $now + 3 * $sessionDelay_] 
  452. "$self deactivate-locs $now"]
  453. # $self dump-locs
  454. }
  455. Class SRMinfo
  456. SRMinfo set recvTime_ 0
  457. SRMinfo instproc init {sender} {
  458. $self next
  459. $self instvar sender_ 
  460. set sender_ $sender
  461. }
  462. SRMinfo instproc set-params {ns agent} {
  463. $self instvar ns_ agent_
  464. set ns_ $ns
  465. set agent_ $agent
  466. }
  467. Class SRMinfo/rep -superclass SRMinfo
  468. SRMinfo/rep instproc recv-gsess {ttl} {
  469. $self instvar recvTime_ ns_ ttl_
  470. set now [$ns_ now]
  471. set recvTime_ [expr $now]
  472. set ttl_ [expr $ttl]
  473. }
  474. Class SRMinfo/loc -superclass SRMinfo
  475. SRMinfo/loc instproc recv-lsess {repid ttl} {
  476. $self instvar recvTime_ ns_ ttl_ repid_
  477. set now [$ns_ now]
  478. set recvTime_ [expr $now]
  479. set ttl_ [expr $ttl]
  480. set repid_ [expr $repid]
  481. }