1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
REDPDSim instproc init { ns redpdq redpdflowmon redpdlink id enable } {
$self instvar ns_
set ns_ $ns
$self instvar last_reward_ last_detect_
# $self instvar Reward_interval_ reward_pending_
$self instvar detect_pending_
$self instvar id_
set id_ $id
#for testing identification
global testIdent_
$self instvar testIdentOnly_ counter_
set testIdentOnly_ $testIdent_
set counter_ 0
$self instvar verbose_
global verbosity_
set verbose_ $verbosity_ ; #-1 means no messages
$self instvar redpdq_ redpdflowmon_ redpdlink_
set redpdq_ $redpdq
set redpdflowmon_ $redpdflowmon
set redpdlink_ $redpdlink
# the amount of history to be kept for each monitored flow
$self instvar Hist_Max_
set Hist_Max_ 5
set MinTimeToUnmonitor_ 15
set MaxDropRateToUnmonitor_ 0.005
#maximum reduction in probability in one step
$self instvar maxPReduction_ maxPReductionUnresp_
set maxPReduction_ 0.05
set maxPReductionUnresp_ 0.05
#whether unresponsive testing is ON
$self instvar unresponsiveTestOn_
global unresponsive_test_
set unresponsiveTestOn_ $unresponsive_test_
#set MaxDropList_ to infinity (greater than total number of flows) to get infinite memory list.
$self instvar MaxDropList_
set MaxDropList_ 50
#the lists - number of lists, "regular", history
$self instvar MaxHighDRFlowHist_ XinRegular_ high_dr_flow_hist_
global listMode_
if {$testIdent_ == 1 && $listMode_ == "single"} {
set MaxHighDRFlowHist_ 1
set XinRegular_ 1
} else {
set MaxHighDRFlowHist_ 5
set XinRegular_ 3
}
#the number of elements in the drop rate history at the router
$self instvar dropRateHist_ drop_rate_list_ avg_drop_rate_
set dropRateHist_ 8
set avg_drop_rate_ -1
set detect_pending_ false
set reward_pending_ false
set last_reward_ 0.0
set last_detect_ 0.0
#all 3 quantities below in seconds
$self instvar Mintime_ Maxtime_ TargetRTT_
global target_rtt_
set TargetRTT_ $target_rtt_
set Mintime_ [expr 2*$TargetRTT_]
set Maxtime_ [expr 10*$TargetRTT_]
$self instvar BList_ Bindex_ minBtoConsider_ minTimetoConsider_
set Bindex_ 0
set minBtoConsider_ 4
set minTimetoConsider_ 0.400
for {set i 0} {$i < $MaxHighDRFlowHist_} {incr i} {
set BList_($i) 0
}
#turn to -1 to switch the test off.
$self instvar P_testTFRp_
set P_testTFRp_ [$redpdq_ set P_testFRp_]
if { $enable == "true" || $enable == 1 } {
# start detect after 11s of simulation start
$self sched-detect-reward 10.1
} else {
$self sched-print-stats 0.1
puts stderr "(red-pd disabled)"
}
}
REDPDSim instproc monitor-link {} {
$self instvar redpdlink_
set fmon [new QueueMonitor/ED/Flowmon]
set cl [new Classifier/Hash/Fid 33]
$fmon classifier $cl
$cl proc unknown-flow { src dst fid } {
set nflow [new QueueMonitor/ED/Flow]
set slot [$self installNext $nflow]
## puts "here1"
$self set-hash auto $src $dst $fid $slot
}
$cl proc no-slot slotnum {
puts stderr "classifier $self, no-slot for slotnum $slotnum"
}
$redpdlink_ attach-monitors [new SnoopQueue/In] [new SnoopQueue/Out] \
[new SnoopQueue/Drop] $fmon
return $fmon
}
REDPDSim instproc frac { num denom } {
if { $denom == 0 } {
return 0.0
}
return [expr double($num) / $denom]
}
REDPDSim instproc vprint args {
$self instvar verbose_ id_
set level [lindex $args 0]
set a [lrange $args 1 end]
if { $level <= $verbose_ } {
$self instvar ns_
puts "[$ns_ now] ($id_) $a"
flush stdout
}
}
REDPDSim instproc vprint-nonewline args {
$self instvar verbose_ id_
set level [lindex $args 0]
set a [lrange $args 1 end]
if { $level <= $verbose_ } {
$self instvar ns_
puts -nonewline "[$ns_ now] ($id_) $a"
flush stdout
}
}
#
#generic function to print a list of lists
#
REDPDSim instproc printListOfLists {level listOfLists} {
$self instvar verbose_
if { $level <= $verbose_ } {
$self instvar ns_
foreach i $listOfLists {
puts -nonewline "{ "
foreach j $i {
puts -nonewline "$j "
}
puts -nonewline " } "
}
puts ""
flush stdout
}
}
|