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

通讯编程

开发平台:

Visual C++

  1. #  Copyright (c) 1997 by the University of Southern California
  2. #  All rights reserved.
  3. #  This program is free software; you can redistribute it and/or
  4. #  modify it under the terms of the GNU General Public License,
  5. #  version 2, as published by the Free Software Foundation.
  6. #
  7. #  This program is distributed in the hope that it will be useful,
  8. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. #  GNU General Public License for more details.
  11. #
  12. #  You should have received a copy of the GNU General Public License along
  13. #  with this program; if not, write to the Free Software Foundation, Inc.,
  14. #  59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  15. #
  16. #  The copyright of this module includes the following
  17. #  linking-with-specific-other-licenses addition:
  18. #
  19. #  In addition, as a special exception, the copyright holders of
  20. #  this module give you permission to combine (via static or
  21. #  dynamic linking) this module with free software programs or
  22. #  libraries that are released under the GNU LGPL and with code
  23. #  included in the standard release of ns-2 under the Apache 2.0
  24. #  license or under otherwise-compatible licenses with advertising
  25. #  requirements (or modified versions of such code, with unchanged
  26. #  license).  You may copy and distribute such a system following the
  27. #  terms of the GNU GPL for this module and the licenses of the
  28. #  other code concerned, provided that you include the source code of
  29. #  that other code when and as the GNU GPL requires distribution of
  30. #  source code.
  31. #
  32. #  Note that people who make modified versions of this module
  33. #  are not obligated to grant this special exception for their
  34. #  modified versions; it is their choice whether to do so.  The GNU
  35. #  General Public License gives permission to release a modified
  36. #  version without this exception; this exception also makes it
  37. #  possible to release a modified version which carries forward this
  38. #  exception.
  39. # Source srm-debug.tcl if you want to turn on tracing of events.
  40. # Do not insert probes directly in this code unless you are sure
  41. # that what you want is not available there.
  42. #
  43. # Author: Kannan Varadhan <kannan@isi.edu>
  44. # Version Date: Mon Jun 30 15:51:33 PDT 1997
  45. #
  46. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/mcast/srm.tcl,v 1.17 2005/09/16 03:05:44 tomh Exp $ (USC/ISI)
  47. #
  48. # THis routine is a temporary hack.  It is likely to dissappear
  49. # at some point in time.
  50. #
  51. Agent instproc traffic-source agent {
  52. $self instvar tg_
  53. set tg_ $agent
  54. $tg_ target $self
  55. $tg_ set agent_addr_ [$self set agent_addr_]
  56. $tg_ set agent_port_ [$self set agent_port_]
  57. }
  58. Agent/SRM set packetSize_  1024 ;# assume default message size for repair is 1K
  59. Agent/SRM set groupSize_   0
  60. Agent/SRM set app_fid_ 0
  61. Agent/SRM set distanceCompute_ ewma
  62. Agent/SRM set C1_ 2.0
  63. Agent/SRM set C2_ 2.0
  64. Agent/SRM set requestFunction_ "SRM/request"
  65. Agent/SRM set requestBackoffLimit_ 5
  66. Agent/SRM set D1_ 1.0
  67. Agent/SRM set D2_ 1.0
  68. Agent/SRM set repairFunction_ "SRM/repair"
  69. Agent/SRM set sessionDelay_ 1.0
  70. Agent/SRM set sessionFunction_ "SRM/session"
  71. Class Agent/SRM/Deterministic -superclass Agent/SRM
  72. Agent/SRM/Deterministic set C2_ 0.0
  73. Agent/SRM/Deterministic set D2_ 0.0
  74. Class Agent/SRM/Probabilistic -superclass Agent/SRM
  75. Agent/SRM/Probabilistic set C1_ 0.0
  76. Agent/SRM/Probabilistic set D1_ 0.0
  77. Class Agent/SRM/Fixed -superclass Agent/SRM
  78. Class SRM
  79. Class SRM/request -superclass SRM
  80. Class SRM/repair -superclass SRM
  81. Class SRM/session -superclass SRM
  82. source ../mcast/srm-adaptive.tcl
  83. ###
  84. Agent/SRM instproc init {} {
  85. $self next
  86. $self instvar ns_ requestFunction_ repairFunction_
  87. set ns_ [Simulator instance]
  88. $ns_ create-eventtrace Event $self
  89. $self init-instvar sessionDelay_
  90. foreach var {C1_ C2_ D1_ D2_} {
  91. $self init-instvar $var
  92. }
  93. $self init-instvar requestFunction_
  94. $self init-instvar repairFunction_
  95. $self init-instvar sessionFunction_
  96. $self init-instvar requestBackoffLimit_
  97. $self init-instvar distanceCompute_
  98. $self array set stats_ [list
  99. dup-req -1 ave-dup-req -1
  100. dup-rep -1 ave-dup-rep -1
  101. req-delay 0.0 ave-req-delay -1
  102. rep-delay 0.0 ave-rep-delay -1
  103. ]
  104. }
  105. Agent/SRM instproc delete {} {
  106. $self instvar ns_ pending_ done_ session_ tg_
  107. foreach i [array names pending_] {
  108. $pending_($i) cancel DELETE
  109. delete $pending_($i)
  110. }
  111. $self cleanup
  112. delete $session_
  113. if [info exists tg_] {
  114. delete $tg_
  115. }
  116. }
  117. Agent/SRM instproc start {} {
  118. $self instvar node_ dst_addr_ ;# defined in Agent base class
  119. set dst_addr_ [expr $dst_addr_] ; # get rid of possibly leading 0x etc.
  120. $self cmd start
  121. $node_ join-group $self $dst_addr_
  122. $self instvar ns_ session_ sessionFunction_
  123. set session_ [new $sessionFunction_ $ns_ $self]
  124. $session_ schedule
  125. }
  126. Agent/SRM instproc start-source {} {
  127. $self instvar tg_
  128. if ![info exists tg_] {
  129. error "No source defined for agent $self"
  130. }
  131. $tg_ start
  132. }
  133. Agent/SRM instproc sessionFunction f {
  134. $self instvar sessionFunction_
  135. set sessionFunction_ $f
  136. }
  137. Agent/SRM instproc requestFunction f {
  138. $self instvar requestFunction_
  139. set requestFunction_ $f
  140. }
  141. Agent/SRM instproc repairFunction f {
  142. $self instvar repairFunction_
  143. set repairFunction_ $f
  144. }
  145. Agent/SRM instproc groupSize? {} {
  146. $self set groupSize_
  147. }
  148. global alpha
  149. if ![info exists alpha] {
  150. set alpha 0.25
  151. }
  152. proc ewma {ave cur} {
  153. if {$ave < 0} {
  154. return $cur
  155. } else {
  156. global alpha
  157. return [expr (1 - $alpha) * $ave + $alpha * $cur]
  158. }
  159. }
  160. proc instantaneous {ave cur} {
  161. set cur
  162. }
  163. Agent/SRM instproc compute-ave var {
  164. $self instvar stats_
  165. set stats_(ave-$var) [ewma $stats_(ave-$var) $stats_($var)]
  166. }
  167. ####
  168. Agent/SRM instproc recv {type args} {
  169. eval $self recv-$type $args
  170. }
  171. Agent/SRM instproc recv-data {sender msgid} {
  172. $self instvar pending_
  173. if ![info exists pending_($sender:$msgid)] {
  174. # This is a very late data of some wierd sort.
  175. # How did we get here?
  176. error "Oy vey!  How did we get here?"
  177. }
  178. if {[$pending_($sender:$msgid) set round_] == 1} {
  179. $pending_($sender:$msgid) cancel DATA
  180. $pending_($sender:$msgid) evTrace Q DATA
  181. delete $pending_($sender:$msgid)
  182. unset pending_($sender:$msgid)
  183. } else {
  184. $pending_($sender:$msgid) recv-repair
  185. }
  186. }
  187. Agent/SRM instproc mark-period period {
  188. $self compute-ave $period
  189. $self set stats_($period) 0
  190. }
  191. Agent/SRM instproc request {sender args} {
  192. # called when agent detects a lost packet
  193. $self instvar pending_ ns_ requestFunction_
  194. set newReq 0
  195. foreach msgid $args {
  196. if [info exists pending_($sender:$msgid)] {
  197. error "duplicate loss detection in agent"
  198. }
  199. set pending_($sender:$msgid) [new $requestFunction_ $ns_ $self]
  200. $pending_($sender:$msgid) set-params $sender $msgid
  201. $pending_($sender:$msgid) schedule
  202. if ![info exists old_($sender:$msgid)] {
  203. incr newReq
  204. }
  205. }
  206. if $newReq {
  207. $self mark-period dup-req
  208. }
  209. }
  210. Agent/SRM instproc update-ave {type delay} {
  211. $self instvar stats_
  212. set stats_(${type}-delay) $delay
  213. $self compute-ave ${type}-delay
  214. }
  215. Agent/SRM instproc recv-request {requestor round sender msgid} {
  216. # called when agent receives a control message for an old ADU
  217. $self instvar pending_ stats_
  218. if [info exists pending_($sender:$msgid)] {
  219. # Either a request or a repair is pending.
  220. # Possibly mark duplicates.
  221. if { $round == 1 } {
  222. incr stats_(dup-req) [$pending_($sender:$msgid)
  223. dup-request?]
  224. }
  225. $pending_($sender:$msgid) recv-request
  226. } else {
  227. # We have no events pending, only if the ADU is old, and
  228. # we have received that ADU.
  229. $self repair $requestor $sender $msgid
  230. }
  231. }
  232. Agent/SRM instproc repair {requestor sender msgid} {
  233. # called whenever agent receives a request, and packet exists
  234. $self instvar pending_ ns_ repairFunction_
  235. if [info exists pending_($sender:$msgid)] {
  236. error "duplicate repair detection in agent??  really??"
  237. }
  238. set pending_($sender:$msgid) [new $repairFunction_ $ns_ $self]
  239. $pending_($sender:$msgid) set requestor_ $requestor
  240. $pending_($sender:$msgid) set-params $sender $msgid
  241. $pending_($sender:$msgid) schedule
  242. $self mark-period dup-rep
  243. }
  244. Agent/SRM instproc recv-repair {round sender msgid} {
  245. $self instvar pending_ stats_
  246. if ![info exists pending_($sender:$msgid)] {
  247. # 1.  We didn't hear the request for the older ADU, or
  248. # 2.  This is a very late repair beyond the $3 d_{S,B}$ wait
  249. # What should we do?
  250. #if { $round == 1 } { incr stats_(dup-rep) }
  251. $self instvar trace_ ns_ node_ 
  252. if [info exists trace_] {
  253. # puts -nonewline $trace_ [format "%7.4f" [$ns_ now]]
  254. # puts $trace_ " n [$node_ id] m <$sender:$msgid> r $round X REPAIR late dup"
  255. }
  256. } else {
  257. if { $round == 1 } {
  258. incr stats_(dup-rep) [$pending_($sender:$msgid)
  259. dup-repair?]
  260. }
  261. $pending_($sender:$msgid) recv-repair
  262. }
  263. }
  264. Agent/SRM/Fixed instproc repair args {
  265. $self set D1_ [expr log10([$self set groupSize_])]
  266. $self set D2_ [expr log10([$self set groupSize_])]
  267. eval $self next $args
  268. }
  269. ####
  270. Agent/SRM instproc clear {obj s m} {
  271. $self instvar pending_ done_ old_ logfile_
  272. set done_($s:$m) $obj
  273. set old_($s:$m) [$obj set round_]
  274. if [info exists logfile_] {
  275. $obj dump-stats $logfile_
  276. }
  277. unset pending_($s:$m)
  278. if {[array size done_] > 32} {
  279. $self instvar ns_
  280. $ns_ at [expr [$ns_ now] + 0.01] "$self cleanup"
  281. }
  282. }
  283. Agent/SRM instproc round? {s m} {
  284. $self instvar old_
  285. if [info exists old_($s:$m)] {
  286. return $old_($s:$m)
  287. } else {
  288. return 0
  289. }
  290. }
  291. Agent/SRM instproc cleanup {} {
  292. # We need to do this somewhere...now seems a good time
  293. $self instvar done_
  294. if [info exists done_] {
  295. foreach i [array names done_] {
  296. delete $done_($i)
  297. }
  298. unset done_
  299. }
  300. }
  301. Agent/SRM instproc trace file {
  302. $self set trace_ $file
  303. }
  304. Agent/SRM instproc log file {
  305. $self set logfile_ $file
  306. }
  307. #
  308. #
  309. # The class definition for the following classes is at the
  310. # top of this file.
  311. # Note that the SRM event handlers are not rooted as TclObjects.
  312. #
  313. SRM instproc init {ns agent} {
  314. $self next
  315. $self instvar ns_ agent_ nid_ distf_
  316. set ns_ $ns
  317. set agent_ $agent
  318. set nid_ [[$agent_ set node_] id]
  319. set distf_ [$agent_ set distanceCompute_]
  320. if ![catch "$agent_ set trace_" traceVar] {
  321. $self set trace_ $traceVar
  322. }
  323. $self array set times_ [list
  324. startTime [$ns_ now] serviceTime -1 distance -1]
  325. }
  326. SRM instproc set-params {sender msgid} {
  327. $self next
  328. $self instvar agent_ sender_ msgid_ round_ sent_
  329. set sender_ $sender
  330. set msgid_  $msgid
  331. set round_  [$agent_ round? $sender_ $msgid_]
  332. set sent_ 0
  333. }
  334. SRM instproc cancel {} {
  335. $self instvar ns_ eventID_
  336. if [info exists eventID_] {
  337. $ns_ cancel $eventID_
  338. unset eventID_
  339. }
  340. }
  341. SRM instproc schedule {} {
  342. $self instvar round_
  343. incr round_
  344. }
  345. SRM instproc distance? node {
  346. $self instvar agent_ times_ distf_
  347. set times_(distance) [$distf_ $times_(distance)
  348. [$agent_ distance? $node]]
  349. }
  350. SRM instproc serviceTime {} {
  351. $self instvar ns_ times_
  352. set times_(serviceTime) [expr ([$ns_ now] - $times_(startTime)) / 
  353. ( 2 * $times_(distance))]
  354. }
  355. # Some routines to make SRM tracing standard
  356. SRM instproc logpfx fp {
  357. $self instvar ns_ nid_ sender_ msgid_ round_
  358. puts -nonewline $fp [format "%7.4f" [$ns_ now]]
  359. puts -nonewline $fp " n $nid_ m <$sender_:$msgid_> r $round_ "
  360. }
  361. SRM instproc nam-event-pfx fp {
  362. $self instvar ns_ nid_ sender_ msgid_ round_
  363. puts -nonewline $fp "E "
  364. puts -nonewline $fp [format "%8.6f" [$ns_ now]]
  365. puts -nonewline $fp " n $nid_ m <$sender_:$msgid_> r $round_ "
  366. }
  367. SRM instproc ns-event-pfx fp {
  368. $self instvar ns_ nid_ sender_ msgid_ round_
  369. puts -nonewline $fp "E "
  370. puts -nonewline $fp [format "%8.6f" [$ns_ now]]
  371. puts -nonewline $fp " n $nid_ m <$sender_:$msgid_> r $round_ "
  372. }
  373. SRM instproc dump-stats fp {
  374. $self instvar times_ statistics_
  375. $self logpfx $fp
  376. puts -nonewline $fp "type [string range [$self info class] 4 end] "
  377. puts $fp "[array get times_] [array get statistics_]"
  378. }
  379. SRM instproc evTrace {tag type args} {
  380. $self instvar trace_ ns_
  381. $ns_ instvar eventTraceAll_ traceAllFile_ namtraceAllFile_
  382. if [info exists eventTraceAll_] {
  383. if {$eventTraceAll_ == 1} {
  384. if [info exists traceAllFile_] {
  385. $self ns-event-pfx $traceAllFile_
  386. puts -nonewline $traceAllFile_ "$tag $type"
  387. foreach elem $args {
  388. puts -nonewline $traceAllFile_ " $elem"
  389. }
  390. puts $traceAllFile_ {}
  391. }
  392. # if [info exists namtraceAllFile_] {
  393. # $self nam-event-pfx $namtraceAllFile_
  394. # puts -nonewline $namtraceAllFile_ "$tag $type"
  395. # foreach elem $args {
  396. # puts -nonewline $namtraceAllFile_ " $elem"
  397. # }
  398. # puts $namtraceAllFile_ {}
  399. # }
  400. }
  401. }
  402. if [info exists trace_] {
  403. $self logpfx $trace_
  404. puts -nonewline $trace_ "$tag $type"
  405. foreach elem $args {
  406. puts -nonewline $trace_ " $elem"
  407. }
  408. puts $trace_ {}
  409. }
  410. }
  411. ####
  412. SRM/request instproc init args {
  413. eval $self next $args
  414. $self array set statistics_ "dupRQST 0 dupREPR 0 #sent 0 backoff 0"
  415. }
  416. SRM/request instproc set-params args {
  417. eval $self next $args
  418. $self instvar agent_ sender_
  419. foreach var {C1_ C2_} {
  420. if ![catch "$agent_ set $var" val] {
  421. $self instvar $var
  422. set $var $val
  423. }
  424. }
  425. $self distance? $sender_
  426. $self instvar backoff_ backoffCtr_ backoffLimit_
  427. set backoff_ 1
  428. set backoffCtr_ 0
  429. set backoffLimit_ [$agent_ set requestBackoffLimit_]
  430. $self evTrace Q DETECT
  431. }
  432. SRM/request instproc dup-request? {} {
  433. $self instvar ns_ round_ ignore_
  434. if {$round_ == 2 && [$ns_ now] <= $ignore_} {
  435. return 1
  436. } else {
  437. return 0
  438. }
  439. }
  440. SRM/request instproc dup-repair? {} {
  441. return 0
  442. }
  443. SRM/request instproc backoff? {} {
  444. $self instvar backoff_ backoffCtr_ backoffLimit_
  445. set retval $backoff_
  446. if {[incr backoffCtr_] <= $backoffLimit_} {
  447. incr backoff_ $backoff_
  448. }
  449. set retval
  450. }
  451. SRM/request instproc compute-delay {} {
  452. $self instvar C1_ C2_
  453. set rancomp [expr $C1_ + $C2_ * [uniform 0 1]]
  454. $self instvar sender_ backoff_
  455. set dist [$self distance? $sender_]
  456. $self evTrace Q INTERVALS C1 $C1_ C2 $C2_ d $dist i $backoff_
  457. set delay [expr $rancomp * $dist]
  458. }
  459. SRM/request instproc schedule {} {
  460. $self instvar ns_ eventID_ delay_
  461. $self next
  462. set now [$ns_ now]
  463. set delay_ [expr [$self compute-delay] * [$self backoff?]]
  464. set fireTime [expr $now + $delay_]
  465. $self evTrace Q NTIMER at $fireTime
  466. set eventID_ [$ns_ at $fireTime "$self send-request"]
  467. }
  468. SRM/request instproc cancel type {
  469. $self next
  470. if {$type == "REQUEST" || $type == "REPAIR"} {
  471. $self instvar agent_ round_
  472. if {$round_ == 1} {
  473. $agent_ update-ave req [$self serviceTime]
  474. }
  475. }
  476. }
  477. SRM/request instproc send-request {} {
  478. $self instvar agent_ round_ sender_ msgid_ sent_ round_
  479. $self evTrace Q SENDNACK
  480. $agent_ send request $round_ $sender_ $msgid_
  481. $self instvar statistics_
  482. incr statistics_(#sent)
  483. set sent_ $round_
  484. }
  485. SRM/request instproc recv-request {} {
  486. $self instvar ns_ agent_ round_ delay_ ignore_ statistics_
  487. if {[info exists ignore_] && [$ns_ now] < $ignore_} {
  488. incr statistics_(dupRQST)
  489. # $self evTrace Q NACK dup
  490. } else {
  491. $self cancel REQUEST
  492. $self schedule          ;# or rather, reschedule-rqst 
  493. set ignore_ [expr [$ns_ now] + ($delay_ / 2)]
  494. incr statistics_(backoff)
  495. $self evTrace Q NACK IGNORE-BACKOFF $ignore_
  496. }
  497. }
  498. SRM/request instproc recv-repair {} {
  499. $self instvar ns_ agent_ sender_ msgid_ ignore_ eventID_
  500. if [info exists eventID_] {
  501. $self serviceTime
  502. set ignore_ [expr [$ns_ now] + 3 * [$self distance? $sender_]]
  503. $ns_ at $ignore_ "$agent_ clear $self $sender_ $msgid_"
  504. $self cancel REPAIR
  505. $self evTrace Q REPAIR IGNORES $ignore_
  506. } else { ;# we must be in the 3dS,B holdDown interval
  507. $self instvar statistics_
  508. incr statistics_(dupREPR)
  509. # $self evTrace Q REPAIR dup
  510. }
  511. }
  512. #
  513. SRM/repair instproc init args {
  514. eval $self next $args
  515. $self array set statistics_ "dupRQST 0 dupREPR 0 #sent 0"
  516. }
  517. SRM/repair instproc set-params args {
  518. eval $self next $args
  519. $self instvar agent_ requestor_
  520. foreach var {D1_ D2_} {
  521. if ![catch "$agent_ set $var" val] {
  522. $self instvar $var
  523. set $var $val
  524. }
  525. }
  526. $self distance? $requestor_
  527. $self evTrace P NACK from $requestor_
  528. }
  529. SRM/repair instproc dup-request? {} {
  530. return 0
  531. }
  532. SRM/repair instproc dup-repair? {} {
  533. $self instvar ns_ round_
  534. if {$round_ == 1} { ;# because repairs do not reschedule
  535. return 1
  536. } else {
  537. return 0
  538. }
  539. }
  540. #
  541. SRM/repair instproc compute-delay {} {
  542. $self instvar D1_ D2_
  543. set rancomp [expr $D1_ + $D2_ * [uniform 0 1]]
  544. $self instvar requestor_
  545. set dist [$self distance? $requestor_]
  546. $self evTrace P INTERVALS D1 $D1_ D2 $D2_ d $dist
  547. set delay [expr $rancomp * $dist]
  548. }
  549. SRM/repair instproc schedule {} {
  550. $self instvar ns_ eventID_
  551. $self next
  552. set fireTime [expr [$ns_ now] + [$self compute-delay]]
  553. $self evTrace P RTIMER at $fireTime
  554. set eventID_ [$ns_ at $fireTime "$self send-repair"]
  555. }
  556. SRM/repair instproc cancel type {
  557. $self next
  558. if {$type == "REQUEST" || $type == "REPAIR"} {
  559. $self instvar agent_ round_
  560. if {$round_ == 1} {
  561. $agent_ update-ave rep [$self serviceTime]
  562. }
  563. }
  564. }
  565. SRM/repair instproc send-repair {} {
  566. $self instvar ns_ agent_ round_ sender_ msgid_ requestor_ sent_ round_
  567. $self evTrace P SENDREP
  568. $agent_ set requestor_ $requestor_
  569. $agent_ send repair $round_ $sender_ $msgid_
  570. $self instvar statistics_
  571. incr statistics_(#sent)
  572. set sent_ $round_
  573. }
  574. SRM/repair instproc recv-request {} {
  575. # duplicate (or multiple) requests
  576. $self instvar statistics_
  577. incr statistics_(dupRQST)
  578. # $self evTrace P NACK dup
  579. }
  580. SRM/repair instproc recv-repair {} {
  581. $self instvar ns_ agent_ round_ sender_ msgid_ eventID_ requestor_
  582. if [info exists eventID_] {
  583. #
  584. # holdDown is identical to the ignore_ parameter in
  585. # SRM/request::recv-repair.  However, since recv-request
  586. # for this class is very simple, we do not need an
  587. # instance variable to record the current state, and
  588. # hence only require a simple variable.
  589. #
  590. set holdDown [expr [$ns_ now] +
  591. 3 * [$self distance? $requestor_]]
  592. $ns_ at $holdDown "$agent_ clear $self $sender_ $msgid_"
  593. $self cancel REPAIR
  594. $self evTrace P REPAIR IGNORES $holdDown
  595. } else { ;# we must in the 3dS,B holdDown interval
  596. $self instvar statistics_
  597. incr statistics_(dupREPR)
  598. # $self evTrace P REPAIR dup
  599. }
  600. }
  601. #
  602. SRM/session instproc init args {
  603. eval $self next $args
  604. $self instvar agent_ sessionDelay_ round_
  605. set sessionDelay_ [$agent_ set sessionDelay_]
  606. set round_ 1
  607. $self array set statistics_ "#sent 0"
  608. $self set sender_ 0
  609. $self set msgid_  0
  610. }
  611. SRM/session instproc delete {} {
  612. $self instvar $ns_ eventID_
  613. $ns_ cancel $eventID_
  614. $self next
  615. }
  616. SRM/session instproc schedule {} {
  617. $self instvar ns_ agent_ sessionDelay_ eventID_
  618. $self next
  619. # What is a reasonable interval to schedule session messages?
  620. set sessionDelay_ [$agent_ set sessionDelay_]
  621. set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1]]
  622. # set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1] * 
  623.     # (1 + log([$agent_ set groupSize_])) ]
  624. set eventID_ [$ns_ at [expr [$ns_ now] + $fireTime]
  625. "$self send-session"]
  626. }
  627. SRM/session instproc send-session {} {
  628. $self instvar agent_ statistics_
  629. $agent_ send session
  630. $self evTrace S SESSION
  631. incr statistics_(#sent)
  632. $self schedule
  633. }
  634. SRM/session instproc evTrace args {} ;# because I don't want to trace
  635.  # session messages.
  636. Class SRM/session/log-scaled -superclass SRM/session
  637. SRM/session/log-scaled instproc schedule {} {
  638. $self instvar ns_ agent_ sessionDelay_ eventID_
  639. # What is a reasonable interval to schedule session messages?
  640. #set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1]]
  641. set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1] * 
  642. (1 + log([$agent_ set groupSize_])) ]
  643. set eventID_ [$ns_ at [expr [$ns_ now] + $fireTime]
  644. "$self send-session"]
  645. }