<div dir="ltr">is there anyone who can help me in understanding tcl code of codel(given below)<div>This one is quite complex for me.</div><div>please help if you can.</div><div>Thanks in advance.</div><div><br></div><div><div>###################################################################<br></div><div><br></div><div><br></div><div># ns codel.tcl f w c {b}Mb s d r</div><div># where:</div><div>#<span class="" style="white-space:pre">      </span>f = # ftps</div><div>#<span class="" style="white-space:pre">        </span>w = # PackMime connections per second</div><div>#<span class="" style="white-space:pre">     </span>c = # CBRs</div><div>#<span class="" style="white-space:pre">        </span>b = bottleneck bandwidth in Mbps</div><div>#<span class="" style="white-space:pre">  </span>s = filesize for ftp, -1 for infinite</div><div>#<span class="" style="white-space:pre">     </span>d = dynamic bandwidth, if non-zero, changes (kind of kludgey)</div><div>#<span class="" style="white-space:pre">             </span>have to set the specific change ratios in this file (below)</div><div>#<span class="" style="white-space:pre">       </span>r = number of "reverse" ftps</div><div><br></div><div>set stopTime 300</div><div>set ns [new Simulator]</div><div><br></div><div># These are defaults if values not set on command line</div><div><br></div><div>set num_ftps 1</div><div>set web_rate 0</div><div>set revftp 0</div><div>set num_cbrs 0</div><div>#rate and packetSize set in build_cbr</div><div>set bottleneck 3Mb</div><div>#for a 10MB ftp</div><div>set filesize 10000000</div><div>set dynamic_bw 0</div><div>set greedy 0</div><div><br></div><div># Parse command line</div><div><br></div><div>if {$argc >= 1} {</div><div>    set num_ftps [lindex $argv 0]</div><div>    if {$argc >= 2} {</div><div>        set web_rate [lindex $argv 1]</div><div>        if {$argc >= 3} {</div><div>            set num_cbrs [lindex $argv 2]</div><div>            if {$argc >= 4} {</div><div>            <span class="" style="white-space:pre">       </span>set bottleneck [lindex $argv 3]</div><div><span class="" style="white-space:pre">    </span>    <span class="" style="white-space:pre">    </span>if {$argc >= 5} {</div><div><span class="" style="white-space:pre">                       </span>set filesize [lindex $argv 4]</div><div><span class="" style="white-space:pre">      </span>   <span class="" style="white-space:pre">      </span> <span class="" style="white-space:pre"> </span>if {$argc >= 6} {</div><div><span class="" style="white-space:pre">                               </span>set dynamic_bw [lindex $argv 5]</div><div><span class="" style="white-space:pre">    </span>   <span class="" style="white-space:pre">      </span> <span class="" style="white-space:pre">         </span>if {$argc >= 7} {</div><div><span class="" style="white-space:pre">                                       </span>set revftp [lindex $argv 6]</div><div><span class="" style="white-space:pre">        </span>    <span class="" style="white-space:pre">                    </span>}</div><div><span class="" style="white-space:pre">  </span>    <span class="" style="white-space:pre">            </span>}</div><div>        <span class="" style="white-space:pre">      </span>}</div><div>    <span class="" style="white-space:pre">    </span>     }</div><div><span class="" style="white-space:pre">   </span>}</div><div>    }</div><div>}</div><div><br></div><div>set bw [bw_parse $bottleneck]</div><div>if { $revftp >= 1} {</div><div><span class="" style="white-space:pre"> </span>set num_revs $revftp</div><div>} else {</div><div><span class="" style="white-space:pre">        </span>set num_revs 0</div><div>}</div><div>puts "ftps $num_ftps webrate $web_rate cbrs $num_cbrs bw $bw filesize $filesize reverse $num_revs"</div><div><br></div><div># experiment settings</div><div>set psize 1500</div><div>if { $bw < 1000000} { set psize 500 }</div><div>set nominal_rtt [delay_parse 100ms]</div><div>set accessdly 20</div><div>set bdelay 10 </div><div>set realrtt [expr 2*(2*$accessdly + $bdelay)]</div><div>puts "accessdly $accessdly bneckdly $bdelay realrtt $realrtt bneckbw $bw"</div><div><br></div><div># CoDel values</div><div># interval to keep min over</div><div>set interval [delay_parse 100ms]</div><div># target in ms.</div><div>set target [delay_parse 5ms]</div><div><br></div><div>global defaultRNG</div><div>$defaultRNG seed 0</div><div>ns-random 0</div><div>#$defaultRNG seed 54321</div><div>#ns-random 23145</div><div><br></div><div># ------- config info is all above this line ----------</div><div><br></div><div>#bdp in packets, based on the nominal rtt</div><div>set bdp [expr round($bw*$nominal_rtt/(8*$psize))]</div><div><br></div><div>Trace set show_tcphdr_ 1</div><div>set startTime 0.0</div><div><br></div><div>#TCP parameters - have to set both for FTPs and PackMime</div><div><br></div><div>Agent/TCP set window_ [expr $bdp*16]</div><div>Agent/TCP set segsize_ [expr $psize-40]</div><div>Agent/TCP set packetSize_ [expr $psize-40]</div><div>Agent/TCP set windowInit_ 4</div><div>Agent/TCP set segsperack_ 1</div><div>Agent/TCP set timestamps_ true</div><div>set delack 0.4</div><div>Agent/TCP set interval_ $delack</div><div><br></div><div>Agent/TCP/FullTcp set window_ [expr $bdp*16]</div><div>Agent/TCP/FullTcp set segsize_ [expr $psize-40]</div><div>Agent/TCP/FullTcp set packetSize_ [expr $psize-40]</div><div>Agent/TCP/FullTcp set windowInit_ 4</div><div>Agent/TCP/FullTcp set segsperack_ 1</div><div>Agent/TCP/FullTcp set timestamps_ true</div><div>Agent/TCP/FullTcp set interval_ $delack</div><div><br></div><div><br></div><div>Agent/TCP/Linux instproc done {} {</div><div><span class="" style="white-space:pre">       </span>global ns filesize</div><div>#this doesn't seem to work, had to hack tcp-linux.cc to do repeat ftps</div><div><span class="" style="white-space:pre">        </span>$self set closed_ 0</div><div>#needs to be delayed by at least .3sec to slow start</div><div><span class="" style="white-space:pre">     </span>puts "[$ns now] TCP/Linux proc done called"</div><div><span class="" style="white-space:pre">      </span>$ns at [expr [$ns now] + 0.3] "$self send $filesize"</div><div>}</div><div><br></div><div># problem is that idle() in tcp.cc never seems to get called...</div><div>Application/FTP instproc resume {} {</div><div>puts "called resume"</div><div>        global filesize</div><div>        $self send $filesize</div><div>#<span class="" style="white-space:pre">    </span>$ns at [expr [$ns now] + 0.5] "[$self agent] reset"</div><div><span class="" style="white-space:pre">      </span>$ns at [expr [$ns now] + 0.5] "[$self agent] send $filesize"</div><div>}</div><div><br></div><div>Application/FTP instproc fire {} {</div><div>        global filesize</div><div>        $self instvar maxpkts_</div><div>        set maxpkts_ $filesize</div><div><span class="" style="white-space:pre">       </span>[$self agent] set maxpkts_ $filesize</div><div>        $self send $maxpkts_</div><div><span class="" style="white-space:pre">        </span>puts "fire() FTP"</div><div>}</div><div><br></div><div>#buffersizes</div><div>set buffersize [expr $bdp]</div><div>set buffersize1 [expr $bdp*10]</div><div><br></div><div>Queue/CoDel set target_ $target</div><div>Queue/CoDel set interval_ $interval</div><div><br></div><div>#set Flow_id 1</div><div><br></div><div>proc build_topology { ns } {</div><div>    # nodes n0 and n1 are the server and client side gateways and</div><div>    # the link between them is the congested slow link. n0 -> n1</div><div>    # handles all the server to client traffic.</div><div>    #</div><div>    # if the web_rate is non-zero, node n2 will be the packmime server cloud</div><div>    # and node n3 will be the client cloud.</div><div>    #</div><div>    # num_ftps server nodes and client nodes are created for the ftp sessions.</div><div>    # the first client node is n{2+w} and the first server node is n{2+f+w}</div><div>    # where 'f' is num_ftps and 'w' is 1 if web_rate>0 and 0 otherwise.</div><div>    # servers will be even numbered nodes, clients odd</div><div>    # Warning: the numbering here is ridiculously complicated</div><div><br></div><div>    global bw bdelay accessdly buffersize buffersize1 filesize node_cnt</div><div>    set node_cnt 2</div><div><br></div><div>    # congested link</div><div>    global n0 n1</div><div>    set n0 [$ns node]</div><div>    set n1 [$ns node]</div><div>    $ns duplex-link $n0 $n1 $bw ${bdelay}ms CoDel</div><div>    $ns duplex-link-op $n0 $n1 orient right</div><div>    $ns duplex-link-op $n0 $n1 queuePos 0.5</div><div>    $ns duplex-link-op $n1 $n0 queuePos 1.5</div><div>    $ns queue-limit $n0 $n1 $buffersize</div><div>    $ns queue-limit $n1 $n0 $buffersize</div><div>    set node_cnt 2</div><div><br></div><div>    #dynamic bandwidth</div><div>    # these are the multipliers for changing bw, times initial set bw</div><div>    # edit these values to get different patterns</div><div>    global stopTime dynamic_bw</div><div>    array names bw_changes</div><div>    set bw_changes(1) 0.1</div><div>    set bw_changes(2) 0.01</div><div>    set bw_changes(3) 0.5</div><div>    set bw_changes(4) 0.01</div><div>    set bw_changes(5) 1.0</div><div><br></div><div>    puts "bottleneck starts at [[[$ns link $n0 $n1] link] set bandwidth_]bps"</div><div>    for {set k 1} {$k <= $dynamic_bw} {incr k 1} {</div><div><span class="" style="white-space:pre">        </span>set changeTime [expr $k*$stopTime/($dynamic_bw+1)]</div><div><span class="" style="white-space:pre"> </span>set f $bw_changes($k)</div><div><span class="" style="white-space:pre">      </span>set newBW [expr $f*$bw]</div><div><span class="" style="white-space:pre">    </span>puts "change at $changeTime to [expr $newBW/1000000.]Mbps"</div><div><span class="" style="white-space:pre">       </span>$ns at $changeTime "[[$ns link $n0 $n1] link] set bandwidth_ $newBW"</div><div><span class="" style="white-space:pre">     </span>$ns at $changeTime "[[$ns link $n1 $n0] link] set bandwidth_ $newBW"</div><div><span class="" style="white-space:pre">     </span>$ns at $changeTime "puts $newBW"</div><div>    }</div><div><br></div><div>    set li_10 [[$ns link $n1 $n0] queue]</div><div>    set li_01 [[$ns link $n0 $n1] queue]</div><div><br></div><div>    set tchan_ [open /tmp/<a href="http://redqvar.tr">redqvar.tr</a> w]</div><div>    $li_01 trace curq_</div><div>    $li_01 trace d_exp_</div><div>    $li_01 attach $tchan_</div><div><br></div><div>    global num_ftps web_rate num_cbrs greedy num_revs</div><div>    set linkbw [expr $bw*10]</div><div><br></div><div>    set w [expr $web_rate > 0]</div><div>    if {$w} {</div><div>        global n2 n3</div><div><span class="" style="white-space:pre">    </span>#server</div><div>        set n2 [$ns node]</div><div>        $ns duplex-link $n2 $n0 $linkbw ${accessdly}ms DropTail</div><div>        $ns queue-limit $n2 $n0 $buffersize1</div><div>        $ns queue-limit $n0 $n2 $buffersize1</div><div><br></div><div><span class="" style="white-space:pre">       </span>#client</div><div>        set n3 [$ns node]</div><div>        $ns duplex-link $n1 $n3 $linkbw ${accessdly}ms DropTail</div><div>        $ns queue-limit $n1 $n3 $buffersize1</div><div>        $ns queue-limit $n3 $n1 $buffersize1</div><div><span class="" style="white-space:pre">        </span>set node_cnt 4</div><div>    }</div><div>#need to fix the angles if use nam</div><div>    for {set k 0} {$k < $num_ftps} {incr k 1} {</div><div>        # servers</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div><span class="" style="white-space:pre">   </span>if {$greedy > 0 && $k == 0} {</div><div>         $ns duplex-link [set n$j] $n0 $linkbw 1ms DropTail</div><div><span class="" style="white-space:pre">    </span>} else {</div><div>         $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail</div><div><span class="" style="white-space:pre"> </span>}</div><div>        $ns queue-limit [set n$j] $n0 $buffersize1</div><div>        $ns queue-limit $n0 [set n$j] $buffersize1</div><div>        set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1]</div><div>        $ns duplex-link-op $n0 [set n$j] orient $angle</div><div><span class="" style="white-space:pre">   </span>incr node_cnt</div><div><br></div><div>        # clients</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div>        set dly [expr ${accessdly} +($k+1)]</div><div>        $ns duplex-link $n1 [set n$j] $linkbw  ${dly}ms  DropTail</div><div>        $ns queue-limit $n1 [set n$j] $buffersize1</div><div>        $ns queue-limit [set n$j] $n1 $buffersize1</div><div>        set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]</div><div>        $ns duplex-link-op $n1 [set n$j] orient $angle</div><div><span class="" style="white-space:pre"> </span>incr node_cnt</div><div>    }</div><div>    for {set k 0} {$k < $num_cbrs} {incr k 1} {</div><div>        # servers</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div>        $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail</div><div>        $ns queue-limit [set n$j] $n0 $buffersize1</div><div>        $ns queue-limit $n0 [set n$j] $buffersize1</div><div>#        set angle [expr $num_cbrs>1? 0.75+($k-1)*.5/($num_cbrs-1) : 1]</div><div>        $ns duplex-link-op $n0 [set n$j] orient $angle</div><div><span class="" style="white-space:pre">     </span>incr node_cnt</div><div><br></div><div>        # clients</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div>        $ns duplex-link $n1 [set n$j] $linkbw  ${accessdly}ms  DropTail</div><div>        $ns queue-limit $n1 [set n$j] $buffersize1</div><div>        $ns queue-limit [set n$j] $n1 $buffersize1</div><div>#        set angle [expr $num_cbrs>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]</div><div>        $ns duplex-link-op $n1 [set n$j] orient $angle</div><div><span class="" style="white-space:pre">        </span>incr node_cnt</div><div>    }</div><div>#reverse direction ftps</div><div>    for {set k 0} {$k < $num_revs} {incr k 1} {</div><div>        # clients</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div>        $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail</div><div>        $ns queue-limit [set n$j] $n0 $buffersize1</div><div>        $ns queue-limit $n0 [set n$j] $buffersize1</div><div>        set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1]</div><div>        $ns duplex-link-op $n0 [set n$j] orient $angle</div><div><span class="" style="white-space:pre">        </span>incr node_cnt</div><div><br></div><div>        # servers</div><div>        set j $node_cnt</div><div>        global n$j</div><div>        set n$j [$ns node]</div><div>        set dly [expr ($accessdly)*1.1 +($k+1)]</div><div>        $ns duplex-link $n1 [set n$j] $linkbw  ${dly}ms  DropTail</div><div>        $ns queue-limit $n1 [set n$j] $buffersize1</div><div>        $ns queue-limit [set n$j] $n1 $buffersize1</div><div>        set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]</div><div>        $ns duplex-link-op $n1 [set n$j] orient $angle</div><div><span class="" style="white-space:pre">     </span>incr node_cnt</div><div>    }</div><div>}</div><div><br></div><div>proc build_cbr {cnd snd startTime timeToStop Flow_id} {</div><div>    global ns</div><div>    set udp [$ns create-connection UDP $snd LossMonitor $cnd $Flow_id]</div><div>    set cbr [new Application/Traffic/CBR]</div><div>    $cbr attach-agent $udp</div><div>    # change these for different types of CBRs</div><div>    $cbr set packetSize_ 100</div><div>    $cbr set rate_ 0.064Mb</div><div>    $ns at $startTime "$cbr start"</div><div>    $ns at $timeToStop "$cbr stop"</div><div>}</div><div><br></div><div># cnd is client node, snd is server node</div><div>proc build_ftpclient {cnd snd startTime timeToStop Flow_id} {</div><div>    </div><div>    global ns filesize greedy revftp</div><div>    set ctcp [$ns create-connection TCP/Linux $snd TCPSink/Sack1 $cnd $Flow_id]</div><div>    $ctcp select_ca cubic</div><div>    set ftp [$ctcp attach-app FTP]</div><div>    $ftp set enableResume_ true</div><div>    $ftp set type_ FTP </div><div><br></div><div>#set up a single infinite ftp with smallest RTT</div><div>    if {$greedy > 0 || $filesize < 0} {</div><div>     $ns at $startTime "$ftp start"</div><div>     set greedy 0</div><div>    } else {</div><div>     $ns at $startTime "$ftp send $filesize"</div><div>    }</div><div>    $ns at $timeToStop "$ftp stop"</div><div>}</div><div><br></div><div>proc build_webs {cnd snd rate startTime timeToStop} {</div><div>    set CLIENT 0</div><div>    set SERVER 1</div><div><br></div><div>    # SETUP PACKMIME</div><div>    set pm [new PackMimeHTTP]</div><div>    $pm set-TCP Sack</div><div>    $pm set-client $cnd</div><div>    $pm set-server $snd</div><div>    $pm set-rate $rate;                    # new connections per second</div><div>    $pm set-http-1.1;                      # use HTTP/1.1</div><div><br></div><div>    # create RandomVariables</div><div>    set flow_arrive [new RandomVariable/PackMimeHTTPFlowArrive $rate]</div><div>    set req_size [new RandomVariable/PackMimeHTTPFileSize $rate $CLIENT]</div><div>    set rsp_size [new RandomVariable/PackMimeHTTPFileSize $rate $SERVER]</div><div><br></div><div>    # assign RNGs to RandomVariables</div><div>    $flow_arrive use-rng [new RNG]</div><div>    $req_size use-rng [new RNG]</div><div>    $rsp_size use-rng [new RNG]</div><div><br></div><div>    # set PackMime variables</div><div>    $pm set-flow_arrive $flow_arrive</div><div>    $pm set-req_size $req_size</div><div>    $pm set-rsp_size $rsp_size</div><div><br></div><div>    global ns</div><div>    $ns at $startTime "$pm start"</div><div>    $ns at $timeToStop "$pm stop"</div><div>}</div><div><br></div><div>proc uniform {a b} {</div><div><span class="" style="white-space:pre">        </span>expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff))</div><div>}</div><div><br></div><div>proc finish {} {</div><div>        global ns</div><div><span class="" style="white-space:pre">    </span>$ns halt</div><div>        $ns flush-trace</div><div>        exit 0</div><div>}</div><div><br></div><div># $ns namtrace-all [open out.nam w]</div><div># $ns color 2 blue</div><div># $ns color 3 red</div><div># $ns color 4 yellow</div><div># $ns color 5 green</div><div><br></div><div>build_topology $ns</div><div><br></div><div>#$ns trace-queue $n0 $n1 [open <a href="http://out_n0ton1.tr">out_n0ton1.tr</a> w]</div><div>#set fname f${num_ftps}w${web_rate}b${bottleneck}.tr</div><div>set fname <a href="http://f.tr">f.tr</a></div><div>puts $fname</div><div>$ns trace-queue $n0 $n1 [open /tmp/$fname w]</div><div>#reverse direction</div><div>#$ns trace-queue $n1 $n0 [open /tmp/$fname w]</div><div><br></div><div>set node_cnt 2</div><div>if {$web_rate > 0} {</div><div>        build_webs $n3 $n2 $web_rate 0 $stopTime</div><div><span class="" style="white-space:pre">    </span>set node_cnt 4</div><div>}</div><div><br></div><div>for {set k 1} {$k <= $num_ftps} {incr k 1} {</div><div>    set j $node_cnt</div><div>    incr node_cnt</div><div>    set i $node_cnt</div><div>    build_ftpclient [set n$i] [set n$j]  \</div><div> <span class="" style="white-space:pre">              </span>$startTime $stopTime $i</div><div># <span class="" style="white-space:pre">          </span>[expr 1.0*($k-1)] $stopTime $i</div><div># <span class="" style="white-space:pre">           </span>[expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i</div><div>    incr node_cnt</div><div>}</div><div><br></div><div>for {set k 1} {$k <= $num_cbrs} {incr k 1} {</div><div>    set j $node_cnt</div><div>    incr node_cnt</div><div>    set i $node_cnt</div><div>    build_cbr [set n$i] [set n$j]  \</div><div> <span class="" style="white-space:pre">         </span>[expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i</div><div>    incr node_cnt</div><div>}</div><div><br></div><div>#for reverse direction, give client smaller number</div><div>for {set k 1} {$k <= $num_revs} {incr k 1} {</div><div>    set j $node_cnt</div><div>    incr node_cnt</div><div>    set i $node_cnt</div><div>    build_ftpclient [set n$j] [set n$i] $startTime $stopTime $j</div><div>    incr node_cnt</div><div>}</div><div><br></div><div>$ns at [expr $stopTime ] "finish"</div><div>$ns run</div><div>exit 0</div></div><div>###################################################################</div></div>