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

通讯编程

开发平台:

Visual C++

  1. Class REDPDSim
  2. #
  3. # routine which inserts high dr flows into history
  4. #
  5. REDPDSim instproc insert-high-dr-flows {} {
  6.     $self instvar high_dr_flow_hist_ 
  7.     $self instvar redpdflowmon_
  8.     $self instvar MaxDropList_ MaxHighDRFlowHist_
  9.     
  10.     lappend drop_list
  11.     set total_flows 0
  12.     
  13.     foreach flow [$redpdflowmon_ flows] {
  14. set flow_monbdrops [$flow set mon_ebdrops_]
  15. set flow_bdrops [expr [$flow set bdrops_] - $flow_monbdrops]
  16. set flow_monpdrops [$flow set mon_epdrops_]
  17. set flow_pdrops [expr [$flow set pdrops_] - $flow_monpdrops]
  18. # if one or more packets dropped - then record the number of bytes dropped.
  19. if { $flow_pdrops > 0 } {
  20.     lappend drop_list [list $flow $flow_bdrops]
  21. }
  22. if { $flow_pdrops != 0 } {
  23.     incr total_flows
  24. }
  25. #memory
  26. unset flow_monbdrops flow_bdrops flow_monpdrops flow_pdrops
  27.     }
  28.     if { [llength $drop_list] > $MaxDropList_ } {
  29. set sorted_drop_list [lsort -decreasing -integer -index 1 $drop_list]
  30. set drop_list [lrange $sorted_drop_list 0 [expr $MaxDropList_- 1]]
  31. #memory problems
  32. unset sorted_drop_list
  33.     }
  34.     
  35.     # $self printListOfLists $drop_list
  36.     
  37.     lappend high_dr_flow_hist_ $drop_list
  38.     
  39.     #memory 
  40.     unset drop_list
  41.     
  42.     if { [llength $high_dr_flow_hist_] > $MaxHighDRFlowHist_ } {
  43. #set temp_list [lrange $high_dr_flow_hist_ 1 end]
  44. #set high_dr_flow_hist_ $temp_list
  45. #unset temp_list
  46. set high_dr_flow_hist_ [lrange $high_dr_flow_hist_ 1 end]
  47.     }
  48.     
  49.     $self vprint-nonewline 2 "High DR History "
  50.     $self printListOfLists 2 $high_dr_flow_hist_
  51.     
  52.     #unset total_flows
  53.     #return $total_flows
  54. }
  55. #
  56. # routine to check if some flow is a regular visitor to the high-dr-flow-hist
  57. # regular for time being is 3 occurences (we maintain a history of max 5)
  58. #
  59. REDPDSim instproc check-regular {} {
  60.     
  61.     $self instvar high_dr_flow_hist_
  62.     $self instvar redpdflowmon_
  63.     $self instvar ret_list
  64.     $self instvar XinRegular_
  65.     
  66.     if {[info exists ret_list]} {
  67. unset ret_list
  68.     }
  69.     
  70.     lappend ret_list 
  71.     
  72.     foreach flow [$redpdflowmon_ flows] {
  73. #$self vprint 2 "Checking flow $flow"
  74. set flow_count 0
  75. set drop_count 0
  76. foreach drop_list $high_dr_flow_hist_ {
  77.     # $self printListOfLists $drop_list
  78.     set exist [lsearch -regexp $drop_list "$flow [0-9]*"]
  79.     if { $exist == -1 } {
  80. # puts "Not Found"
  81.     } else {
  82. # puts "Found at $exist"
  83. incr flow_count
  84. incr drop_count [lindex [lindex $drop_list $exist] 1]
  85.     }
  86.     #memory
  87.     unset exist
  88. }
  89. if { $flow_count >= $XinRegular_ } {
  90.     $self vprint 2 "Putting flow $flow in retlist"
  91.     lappend ret_list [list $flow $drop_count] 
  92. }
  93. #memory 
  94. unset flow_count drop_count
  95.     }
  96.     $self vprint-nonewline 2 "Regular List "
  97.     $self printListOfLists 2 $ret_list
  98.     return $ret_list
  99. }
  100. #
  101. # routing used to check if a flow should be loosened
  102. # if a flow has no occurences in the high drop list for then let the flow go.
  103. #
  104. REDPDSim instproc check-irregular {} {
  105.     
  106.     $self instvar high_dr_flow_hist_
  107.     $self instvar redpdflowmon_
  108.     $self instvar ret_list
  109.     
  110.     if {[info exists ret_list]} {
  111. unset ret_list
  112.     }
  113.     
  114.     lappend ret_list 
  115.     
  116.     foreach flow [$redpdflowmon_ flows] {
  117. if { [$flow set monitored_] == 1 } {
  118.     
  119.     set flow_count 0
  120.     foreach drop_list $high_dr_flow_hist_ {
  121. set exist [lsearch -regexp $drop_list "$flow [0-9]*"]
  122. if { $exist != -1 } {
  123.     incr flow_count
  124. }
  125. #memory
  126. unset exist
  127.     }
  128.     
  129.     if { $flow_count == 0 } {
  130. #$self vprint 2 "Putting flow $flow in negative retlist"
  131. lappend ret_list $flow
  132.     }
  133.     
  134.     unset flow_count
  135. }
  136.     }
  137.     return $ret_list
  138. }
  139. #
  140. # calculates average of enities at index "idx" of each list of the given "listOfLists"
  141. #
  142. REDPDSim instproc calculateAverage {listOfLists idx} {
  143.     set count 0
  144.     set sum 0
  145.     foreach sublist $listOfLists {
  146. incr count
  147. set sum [expr $sum + [lindex $sublist $idx]]
  148.     }
  149.     
  150.     if { $count == 0 } {
  151. return -1
  152.     }
  153.     
  154.     set avg [expr $sum / $count.0]
  155.     
  156.     #memory
  157.     unset count sum
  158.     
  159.     return $avg
  160. }
  161. #
  162. # 1. inserts the current drop rate into the drop rate history
  163. # 2. calculate the average drop rate
  164. #
  165. REDPDSim instproc insertNCalDropRate {currDropRate} {
  166. $self instvar dropRateHist_ drop_rate_list_ avg_drop_rate_
  167. #  #the tfrc method
  168. #  lappend drop_rate_list_ $currDropRate
  169.  
  170. #  if { [llength $drop_rate_list_] > $dropRateHist_ } {
  171. #  set drop_rate_list_ [lrange $drop_rate_list_ 1 end]
  172. #  } else {
  173. #  #dirty short cut for initial periods.
  174. # # puts "length of drop_rate_list_ = [llength $drop_rate_list_]"
  175. #  return $currDropRate
  176. #  }
  177. #  set denom [expr {($dropRateHist_/2) + 1}]
  178. #  set sum 0
  179. #  set sigmaW 0
  180. #  for {set i 0} {$i < $dropRateHist_} {incr i} {
  181. #  set dr [lindex $drop_rate_list_ $i]
  182. #  if {$i >= [expr $dropRateHist_/2] } {
  183. #  set w 1
  184. #  } else {
  185. #  set w [expr {($i+1)/$denom}]
  186. #  }
  187. #  set sum [expr {$sum + $w*$dr}]
  188. #  set sigmaW [expr {$sigmaW + $w}]
  189. #  }
  190. #  set avgDropRate [expr {$sum/$sigmaW}]
  191. #  return $avgDropRate
  192. #ewma
  193. if {$avg_drop_rate_ == -1} {
  194.     set avg_drop_rate_ $currDropRate
  195.     return $avg_drop_rate_
  196. } else {
  197. #     set alpha 0.1
  198.     set alpha 0.5
  199.     set avg_drop_rate_ [expr {$alpha*$currDropRate + (1-$alpha)*$avg_drop_rate_}]
  200.     return $avg_drop_rate_
  201. }
  202. }
  203. REDPDSim instproc sched-print-stats {time} {
  204.     $self instvar redpdflowmon_ ns_
  205.     # calculate the current drop rate
  206.     set bdrops [expr [$redpdflowmon_ set bdrops_] - [$redpdflowmon_ set mon_ebdrops_]]
  207.     set barrivals [expr [$redpdflowmon_ set barrivals_] - [$redpdflowmon_ set mon_ebdrops_]]
  208.     
  209.     if { $barrivals == 0 } {
  210. set currDropRate 0
  211.     } else {
  212. set currDropRate [expr $bdrops.0/$barrivals.0]
  213.     }
  214.     
  215.     set avgDropRate [$self insertNCalDropRate $currDropRate]
  216.     
  217.     $self vprint 1 "currDropRate: $currDropRate avgDropRate: $avgDropRate avg_drop_count: disabled disabled bdrops: $bdrops barrivals: $barrivals"
  218.     
  219.     $redpdflowmon_ reset
  220.     $ns_ at [expr [$ns_ now]+0.200] "$self sched-print-stats 0" 
  221. }
  222.     
  223. REDPDSim instproc sched-detect-reward { timeAfter } {
  224.     $self instvar detect_pending_
  225.     $self instvar ns_ Mintime_ Maxtime_
  226.     
  227.     if { $detect_pending_ == "true" } {
  228. $self vprint 2 "SCHEDULING DETECT (NO, ALREADY PENDING)"
  229. return
  230.     }
  231.     
  232.     set now [$ns_ now]
  233.     set then_detect [expr $now + $timeAfter]
  234.     set then_reward [expr $then_detect + 0.001]
  235.     set detect_pending_ true
  236.     $ns_ at $then_detect "$self do_detect"
  237.     $ns_ at $then_reward "$self do_reward"
  238.     
  239.     $self vprint 3 "SCHEDULING DETECT for $then_detect"
  240.     
  241.     #memory
  242.     unset now then_detect then_reward
  243. }
  244. #
  245. # main routine to determine if there are bad flows to penalize
  246. #
  247. REDPDSim instproc do_detect {} {
  248.     $self instvar ns_
  249.     $self instvar last_detect_
  250.     $self instvar redpdflowmon_ redpdq_
  251.     $self instvar target_drop_rate_ 
  252.     $self instvar detect_pending_
  253.     $self instvar mon_flow_hist_
  254.     $self instvar Mintime_
  255.     $self instvar Hist_Max_
  256.     $self instvar Bandwidth_
  257.   
  258.     set Bandwidth_ 1500000
  259.     set detect_pending_ false
  260.     set now [$ns_ now]
  261.     $self vprint 3 "DO_DETECT started at time $now, last: $last_detect_"
  262.     set elapsed [expr $now - $last_detect_]
  263.     set last_detect_ $now
  264.     # calculate the current drop rate
  265.     set bdrops [expr [$redpdflowmon_ set bdrops_] - [$redpdflowmon_ set mon_ebdrops_]]
  266.     set barrivals [expr [$redpdflowmon_ set barrivals_] - [$redpdflowmon_ set mon_ebdrops_]]
  267.     
  268.     if { $barrivals == 0 } {
  269. set currDropRate 0
  270.     } else {
  271. set currDropRate [expr $bdrops.0/$barrivals.0]
  272.     }
  273.     
  274.     set avgDropRate [$self insertNCalDropRate $currDropRate]
  275.     
  276.     if {$currDropRate <= $avgDropRate} {
  277. set usableDropRate $currDropRate
  278.     } else {
  279. set usableDropRate $avgDropRate
  280.     }
  281. #    set usableDropRate $avgDropRate
  282.     
  283.     $self insert-high-dr-flows
  284.     set regular_list [$self check-regular]
  285.     set avg_drop_count [$self calculateAverage $regular_list 1]
  286.     
  287.     $self vprint 1 "currDropRate: $currDropRate avgDropRate: $avgDropRate avg_drop_count: $avg_drop_count [llength $regular_list] bdrops: $bdrops barrivals: $barrivals mon_drops: [$redpdflowmon_ set mon_ebdrops_]"
  288.     # only for proving identification works 
  289.     $self instvar testIdentOnly_
  290.     if {$testIdentOnly_ == 1} {
  291. $self testIdent $barrivals $bdrops $avgDropRate $regular_list
  292. return
  293.     }
  294.     if { $currDropRate > 0.001 } {
  295. # monitor all flows which are regular
  296. foreach flow_drop_list $regular_list {
  297.     
  298.     set flow [lindex $flow_drop_list 0]
  299.     set drop_count [lindex $flow_drop_list 1]
  300.     set fid [$flow set flowid_]
  301.     
  302.     if { [info exists mon_flow_hist_($fid,lastChange)] } {
  303. set lastChange $mon_flow_hist_($fid,lastChange)
  304.     } else {
  305. set lastChange 0
  306.     }
  307.     
  308.     # puts " $flow $lastChange" 
  309.     if { [$ns_ now] - $lastChange >= [$self minLastChange 4] } {
  310. #don't punish a flow if he had zero drops in the last interval
  311. # minor engineering. no major effect.
  312. if { [$flow set bdrops_] != 0 } {
  313.     
  314.     set pre_drop_rate [expr ($usableDropRate*$drop_count)/$avg_drop_count]
  315.     if { [$flow set monitored_] == 1 } {
  316. set oldTarget [$flow set targetBW_]
  317. set oldDropP [expr {1 - $oldTarget}]
  318. if { [$flow set unresponsive_] != 1} { 
  319.     set unresponsive [$self check-unresponsive $flow]
  320.     if { $unresponsive == 1 } {
  321. $self vprint 2 "Monitor: Declaring unresponsive flow $flow $fid"
  322. #$flow set auto_ true
  323. $redpdq_ unresponsive-flow $flow
  324.     }
  325. }
  326. if {[$flow set unresponsive_] != 1 } {
  327.     $self vprint 2 "$flow $pre_drop_rate $oldDropP $drop_count"  
  328.     if { $pre_drop_rate > $oldDropP } {
  329. set newDropP [expr {2*$oldDropP}]
  330.     } else {
  331. set newDropP [expr {$oldDropP + $pre_drop_rate}]
  332.     }
  333.     set newTarget [expr {1 - $newDropP}]
  334.     
  335.     if {$newTarget < 0} {
  336. set newTarget [expr {$oldTarget/2.0}]
  337.     }
  338.     
  339.     $flow set targetBW_ $newTarget
  340.     $self vprint 2 "Monitor: Strangling $flow $fid $oldTarget -> $newTarget"
  341. } else {
  342.     $self vprint 2 "$flow $pre_drop_rate $oldDropP"  
  343.     if { $pre_drop_rate > $oldDropP } {
  344. set newDropP [expr {3*$oldDropP}]
  345.     } else {
  346. set newDropP [expr {$oldDropP + 2*$pre_drop_rate}]
  347.     }
  348.     
  349.     set newTarget [expr {1 - $newDropP}]
  350.     
  351.     if {$newTarget < 0} {
  352. set newTarget [expr {$oldTarget/3.0}]
  353.     }
  354.     
  355.     $flow set targetBW_ $newTarget
  356.     $self vprint 2 "Monitor: Strangling unresponsive $flow $fid $oldTarget -> $newTarget"
  357. }
  358. #memory
  359. unset oldTarget newTarget newDropP oldDropP
  360.     } else {
  361. if { $pre_drop_rate > 2*$usableDropRate } {
  362.     set newDropP [expr {2*$usableDropRate}]
  363. } else {
  364.     set newDropP $pre_drop_rate
  365. }
  366. set newTarget [expr {1 - $newDropP}]
  367. if { $newTarget < 0.5 } {
  368.     set newTarget 0.5
  369. }
  370. $self vprint 2 "Monitor: Monitoring $flow $fid $newTarget"
  371. $redpdq_ monitor-flow $flow $newTarget 1 
  372. #memory
  373. unset newTarget newDropP
  374.     }
  375.     
  376.     set mon_flow_hist_($fid,lastChange) [$ns_ now]
  377.     set new_hist [list [expr [$flow set barrivals_].0/$elapsed] 
  378.       [expr [$flow set bdrops_].0/[$flow set barrivals_].0]] 
  379.     lappend mon_flow_hist_($fid,hist) $new_hist
  380.     
  381.     if { [llength $mon_flow_hist_($fid,hist)] > $Hist_Max_ } {
  382. $self vprint 2 "Curtailing the history for $flow $fid"
  383. set mon_flow_hist_($fid,hist) [lrange $mon_flow_hist_($fid,hist) 1 end]
  384.     }
  385.     
  386.     $self vprint-nonewline 2 "History of $flow $fid "
  387.     $self printListOfLists 2 $mon_flow_hist_($fid,hist)
  388.     
  389.     #memory
  390.     unset pre_drop_rate new_hist
  391. }
  392.     }
  393.     
  394.     #memory
  395.     unset flow drop_count fid lastChange
  396. }
  397.     }
  398.     
  399.     #memory
  400.     unset regular_list
  401.         
  402.     $self sched-detect-reward [$self calculateB $avgDropRate]
  403.     
  404.     foreach f [$redpdflowmon_ flows] {
  405. $f reset
  406.     }
  407.     $redpdflowmon_ reset
  408.     $self vprint 3 "do_detect complete..."
  409. }
  410. #
  411. # to calculate B, the list compilation interval
  412. #
  413. REDPDSim instproc calculateB { p } {
  414.     $self instvar TargetRTT_
  415.     $self instvar Mintime_ Maxtime_
  416.     $self instvar MaxHighDRFlowHist_ XinRegular_
  417.     $self instvar BList_ Bindex_
  418.     $self instvar P_testTFRp_
  419.     if {$P_testTFRp_ != -1} {
  420. set p $P_testTFRp_
  421.     }
  422.     if {$p == 0 } {
  423. return $Maxtime_
  424.     }
  425.     
  426.     set sqrt1_5p [expr {sqrt(1.5*$p)}]  
  427.     set x_by_yR [expr {[$self frac $XinRegular_ $MaxHighDRFlowHist_]*$TargetRTT_}]
  428.     
  429.     #deterministic model computation
  430.     set time1 [expr {$x_by_yR / $sqrt1_5p}]
  431.     
  432.     set plusTerm [expr {1 + 9*$p*(1+32*$p*$p)}]
  433.     
  434.     #the newer model
  435.     #set time2 [expr {$time1 * $plusTerm}]
  436.     #set ns [Simulator instance]
  437.     #puts "[$ns now] timeAfter: $p $time1 $time2"
  438.     
  439.     set timeAfter $time1
  440.     #    set timeAfter $time2
  441.     if { $timeAfter > $Maxtime_ } {
  442. set timeAfter $Maxtime_
  443.     }
  444.     if { $timeAfter < $Mintime_ } {
  445. set timeAfter $Mintime_
  446.     }
  447.     
  448.     set BList_($Bindex_) $timeAfter
  449.     incr Bindex_
  450.     set Bindex_ [expr {$Bindex_ % $MaxHighDRFlowHist_}]
  451.     return $timeAfter
  452. }
  453. #
  454. # Gives the total time for last noB intervals.
  455. #
  456. REDPDSim instproc minLastChange { noB } {
  457.     $self instvar BList_ Bindex_
  458.     $self instvar minBtoConsider_ minTimetoConsider_
  459.     set index [expr {$Bindex_ - 1}] 
  460.     set sum 0
  461.     for {set i 0} {$i < $noB} {incr i} {
  462. if {$index == -1} {
  463.     set index 4
  464. }
  465. set sum [expr {$sum + $BList_($index)}]
  466. incr index -1
  467.     }
  468.     if {$sum < $minTimetoConsider_} {
  469. return $minTimetoConsider_
  470.     } else {
  471. return $sum
  472.     }
  473. }
  474. REDPDSim instproc do_reward {} {
  475.     $self instvar ns_
  476.     $self instvar last_reward_ reward_pending_
  477.     $self instvar Mintime_
  478.     $self instvar redpdflowmon_ redpdq_
  479.     $self instvar mon_flow_hist_
  480.     $self instvar maxPReduction_ maxPReductionUnresp_
  481.     
  482.     # $redpdflowmon_ dump
  483.     set reward_pending_ false
  484.     set now [$ns_ now]
  485.     $self vprint 3 "DO_REWARD starting at $now, last: $last_reward_"
  486.     set elapsed [expr $now - $last_reward_]
  487.     set last_reward_ $now
  488. #    if { $elapsed < $Mintime_ } {
  489. # puts "ERROR: do_reward: elapsed: $elapsed, min: $Mintime_"
  490. # exit 1
  491. #    }
  492.     
  493.     
  494.     foreach flow [$self check-irregular] {
  495. set fid [$flow set flowid_]
  496. set lastChange $mon_flow_hist_($fid,lastChange)
  497. set oldTarget [$flow set targetBW_]
  498. if { [$flow set unresponsive_] != 1 && 
  499.  ([$ns_ now] - $lastChange) >= [$self minLastChange 3] } {
  500.     if { $oldTarget >= 0.995 } {
  501. $self vprint 2 "Monitor: Unmonitoring $flow $fid "
  502. $redpdq_ unmonitor-flow $flow
  503. unset mon_flow_hist_($fid,hist)
  504.     } else {
  505. set dropP [expr  {1 - $oldTarget}]
  506. if { $dropP >  2*$maxPReduction_ } {
  507.     set newTarget [expr {1 - ($dropP - $maxPReduction_)}]
  508. } else {
  509.     set newTarget [expr {1 - ($dropP/2.0)}]
  510. $flow set targetBW_ $newTarget
  511. $self vprint 2 "Monitor: Loosening $flow $fid $oldTarget -> $newTarget "
  512.     }
  513.     set mon_flow_hist_($fid,lastChange) [$ns_ now]
  514.  
  515. } elseif  { [$flow set unresponsive_] == 1 && 
  516. ([$ns_ now] - $lastChange) >= [$self minLastChange 5] } {
  517.     if { $oldTarget >= 0.9975 } {
  518. $self vprint 2 "Monitor: Unmonitoring unresponsive flow $flow $fid "
  519. $redpdq_ unmonitor-flow $flow
  520. unset mon_flow_hist_($fid,hist)
  521.     } else {
  522. set dropP [expr  {1 - $oldTarget}]
  523. #  set target1 [expr {1 - ($dropP/1.2)}]
  524. #  set target2 [expr {1.2*$oldTarget}]
  525. #  if { $target1 <= $target2 } {
  526. #      set newTarget $target1
  527. #  } else {
  528. #      set newTarget $target2
  529. #  }
  530. if { $dropP > 1.5*$maxPReductionUnresp_ } {
  531.     set newTarget [expr {1 - ($dropP - $maxPReductionUnresp_)}]
  532. } else {
  533.     set newTarget [expr {1 - ($dropP/1.5)}]
  534. }
  535. $flow set targetBW_ $newTarget
  536. $self vprint 2 "Monitor: Loosening unresponsive $flow $fid $oldTarget -> $newTarget"
  537.     }
  538.     set mon_flow_hist_($fid,lastChange) [$ns_ now]
  539. }
  540.     }
  541.     $self vprint 3 "do_reward complete..."
  542. }
  543. REDPDSim instproc check-unresponsive {flow} {
  544. $self instvar mon_flow_hist_ unresponsiveTestOn_
  545. #see if unresponsive test is ON
  546. if { $unresponsiveTestOn_ == 0} {
  547.     return 0
  548. }
  549. set target [$flow set targetBW_] 
  550. # goal is to catch just high-bw unresponsive flows. 
  551. #  if { $target > 0.79 } {
  552. #  return 0
  553. #  }
  554. set fid [$flow set flowid_]
  555. set flow_hist [lsort -real -index 1 $mon_flow_hist_($fid,hist)]
  556. $self vprint-nonewline 2 "checking unresponsiveness $flow $fid "
  557. $self printListOfLists 2 $flow_hist
  558. set good 0
  559. set bad 0
  560. foreach histItem1 $flow_hist {
  561. foreach histItem2 $flow_hist {
  562. set bw1 [lindex $histItem1 0] 
  563. set p1  [lindex $histItem1 1]
  564. set bw2 [lindex $histItem2 0]
  565. set p2  [lindex $histItem2 1]
  566. if { $p1 < $p2 && $p1/$p2 > 0.1 } { 
  567. set x [expr {$p1/$p2}]
  568. set y [expr {$bw2/$bw1}]
  569. } else {
  570. # we don't care about too small differences
  571. # and the reverse case will be taken care of anyway
  572. continue
  573. }
  574. set rootx [expr {sqrt($x)}]
  575. # y = rootx ideally.
  576. $self vprint 2 "unresp $histItem1 $histItem2 $x $y $rootx"
  577. if { $y > $rootx } {
  578. incr bad
  579. } elseif  { $y <= $rootx } {
  580. incr good
  581. }
  582. }
  583. }
  584. #memory
  585. unset flow_hist
  586. $self vprint 2 "unresponsive check $flow [$flow set flowid_] $bad $good"
  587. if { ($good == 0 && $bad >= 3) || ($good == 1 && $bad>=4) || ($good >= 2 && $bad >= 4*$good) } {
  588. return 1
  589. }
  590. return 0
  591. }
  592. REDPDSim instproc testIdent {barrivals bdrops avgDropRate regular_list} {
  593.     $self instvar barrT bdrT
  594.     $self instvar MaxHighDRFlowHist_
  595.     $self instvar counter_
  596.     $self instvar redpdflowmon_
  597.     
  598.     set j [expr $counter_ % $MaxHighDRFlowHist_]
  599.     foreach f [$redpdflowmon_ flows] {
  600. set fid [$f set flowid_]
  601. set i [expr $fid*$MaxHighDRFlowHist_ + $j]
  602. set barrT($i) [$f set barrivals_];
  603. set bdrT($i) [$f set bdrops_];
  604.     }
  605.     set barrT($j) $barrivals
  606.     set bdrT($j) $bdrops
  607.     incr counter_
  608.     
  609.     lappend temp_flow_list
  610.     unset temp_flow_list
  611.     lappend temp_flow_list
  612.     if { $counter_ %  $MaxHighDRFlowHist_ == 0 } {
  613. set count [llength $regular_list]
  614. foreach flow_drop_list $regular_list {
  615.     set flow [lindex $flow_drop_list 0]
  616.     set fid [$flow set flowid_]
  617.     
  618.     set flow_arr 0
  619.     set flow_dr 0
  620.     set cum_arr 0
  621.     set cum_dr 0
  622.     for {set j 0} {$j < $MaxHighDRFlowHist_} {incr j} {
  623. set i [expr $fid*$MaxHighDRFlowHist_ + $j]
  624. incr flow_arr $barrT($i)
  625. incr flow_dr  $bdrT($i)
  626. incr cum_arr $barrT($j)
  627. incr cum_dr $bdrT($j)
  628.     }
  629.     if { $MaxHighDRFlowHist_ != 1 || $flow_dr>=3000 } {
  630. puts "3:5-identified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  631. lappend temp_flow_list $flow
  632. puts "1:1-3-identified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  633.     }
  634.     if { $flow_dr >= 4000 } {
  635. puts "1:1-4-identified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  636.     } else {
  637. puts "1:1-4-nodentified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  638.     }
  639. }
  640. foreach flow [$redpdflowmon_ flows] {
  641.     if { [lsearch $temp_flow_list $flow] == -1} {
  642. set fid [$flow set flowid_] 
  643. set flow_arr 0
  644. set flow_dr 0
  645. set cum_arr 0
  646. set cum_dr 0
  647. for {set j 0} {$j < $MaxHighDRFlowHist_} {incr j} {
  648.     set i [expr $fid*$MaxHighDRFlowHist_ + $j]
  649.     incr flow_arr $barrT($i)
  650.     incr flow_dr  $bdrT($i)
  651.     incr cum_arr $barrT($j)
  652.     incr cum_dr $bdrT($j)
  653. }
  654. puts "3:5-nodentified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  655. if { $flow_dr >= 3000 } {
  656.     puts "1:1-3-identified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  657. } else {
  658.     puts "1:1-3-nodentified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  659. }
  660. if { $flow_dr >= 4000 } {
  661.     puts "1:1-4-identified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  662. } else {
  663.     puts "1:1-4-nodentified $counter_ $fid $flow_arr $cum_arr $flow_dr $cum_dr"
  664. }
  665.     }
  666. }
  667.     }
  668.     if { $MaxHighDRFlowHist_ == 1 } {
  669. $self sched-detect-reward [expr 5*[$self calculateB $avgDropRate]]
  670.     } else {
  671.      $self sched-detect-reward [$self calculateB $avgDropRate]
  672.     }
  673. #    $self sched-detect 0.200
  674.     foreach f [$redpdflowmon_ flows] {
  675. $f reset
  676.     }
  677.     $redpdflowmon_ reset
  678.     
  679.     return
  680. }