The question is:

Are the lines I have commented to solve the problem important or can't
affect simulations in any other way?


ns-ib.tcl:

#
# Also reset every queue
#

#foreach qn [array names link_] {
#set q [$link_($qn) queue]
#$q reset
#}

If so, there is an alternative way to solve the problem?

Regards,

2012/3/20 Teerawat@UBC <teera...@ece.ubc.ca>

> HI Richard,
>
> So, what is the question?
>
> Best Wishes,
>
> Teerawat Issariyakul
> http://www.ns2ultimate.com/
> http://www.facebook.com/pages/Teerawat-Issariyakul/358240861417
> http://twitter.com/T_Bear
> http://www.t-issariyakul.blogspot.com
> http://www.ece.ubc.ca/~teerawat
>
>
> On Mar 19, 2012, at 11:43 PM, Ricard Alegre wrote:
>
> >
> > Dear all,
> >
> > I wanted to implement a Round Robin packet scheduler just following the
> > process in the book Introduction to Network Simulator ns2 from Ekran
> > Hossain:
> >
> > According to the process I have created the following *.cc and *.h files:
> >
> > *//classifier-flow.h*
> >
> > #ifndef ns_gw_flow_classifier_h
> > #define ns_gw_flow_classifier_h
> >
> > #include "packet.h"
> > #include "ip.h"
> > #include "classifier.h"
> >
> > class FlowClassifier : public Classifier {
> > protected:
> >    int classify(Packet *p);
> > };
> >
> > #endif
> >
> >
> > *//classifier-flow.cc*
> > #include "gw_flow_classifier.h"
> > #include <stdlib.h>
> >
> >
> > static class FlowClassifierClass : public TclClass {
> > public:
> >    FlowClassifierClass() : TclClass("Classifier/Flow") {}
> >    TclObject* create(int, const char*const*) {
> >    return (new FlowClassifier());
> >    }
> > } class_flow_classifier;
> >
> >
> >
> > int FlowClassifier::classify(Packet *p) {
> >    return hdr_ip::access(p)->flowid();
> > }
> >
> >
> > *//pkt-sched.h*
> >
> > #ifndef ns_gw_pkt_sch_h
> > #define ns_gw_pkt_sch_h
> >
> > #include "packet.h"
> > #include "ip.h"
> > #include "connector.h"
> > #include "queue.h"
> >
> > #define NS 10
> >
> >
> > class PktScheduler : public Connector {
> > public:
> >    PktScheduler();
> >    virtual void handle(Event*);
> >    virtual void recv(Packet*, Handler*);
> > protected:
> >    void send(int fid, Handler* h);
> >    virtual void resume();
> >    int getFlowID(Packet* p) {return hdr_ip::access(p)->flowid();};
> >    virtual int nextID() = 0;
> >    Handler* qh_[NS];
> >    Packet* pkt_[NS];
> >    int blocked_;
> >    int active_flow_id_;
> > };
> >
> > //RR
> > class RRScheduler : public PktScheduler {
> > public:
> > RRScheduler();
> > private:
> >    virtual int nextID();
> >    int current_id_;
> > };
> >
> > #endif
> >
> >
> > *//pkt-sched.cc*
> > #include "gw_pkt_sch.h"
> >
> > PktScheduler::PktScheduler()
> > {
> >    int i;
> >    for (i=0;i<NS ;i++) {
> >        pkt_[i] = 0;
> >        qh_[i]=0;
> >    }
> >    blocked_ = 0;active_flow_id_ = -1;
> > }
> >
> > void PktScheduler::recv(Packet* p, Handler* h)
> > {
> >    int fid = getFlowID(p);
> >    pkt_[fid] = p;qh_[fid] = h;
> >    if (!blocked_) {
> >        send(fid,this);
> >        blocked_ = 1;
> >        active_flow_id_ = fid;
> >        }
> > }
> >
> >
> > void PktScheduler::send(int fid_idx, Handler* h)
> > {
> >    Connector::send(pkt_[fid_idx],h);
> >    pkt_[fid_idx] = 0;
> > }
> >
> >
> > void PktScheduler::handle(Event*) { resume(); }
> >
> > void PktScheduler::resume()
> > {
> >    qh_[active_flow_id_]->handle(0);
> >    int index = nextID();
> >    blocked_ = 0;
> >    if (index >= 0) {
> >        send(index,this);
> >        blocked_ = 1;
> >        active_flow_id_ = index;
> >    }
> > }
> >
> > //RR
> > RRScheduler::RRScheduler()
> > {
> >    current_id_ = -1;
> > }
> > static class RRSchedulerClass: public TclClass {
> > public:
> >    RRSchedulerClass() : TclClass("PktScheduler/RR") {}
> >    TclObject* create(int, const char*const*) {
> >    return (new RRScheduler());
> >    }
> > } class_rr_scheduler;
> >
> > int RRScheduler::nextID()
> > {
> >    int count = 0;
> >    current_id_++;current_id_ %= NS;
> >    while((pkt_[current_id_] == 0)&&(count < NS)){
> >        current_id_++;current_id_ %= NS;
> >        count++;
> >    }
> >    if (count == NS)
> >        return -1;
> >    else{
> >        return current_id_;
> >    }
> > }
> >
> > *And the following Otcl file:*
> >
> > *#ns-link.tcl*
> >
> > Class LinkSch -superclass Link
> >
> > LinkSch instproc init {src dst bw delay num_queues} {
> >    $self next $src $dst
> >    $self instvar link_ queue_ head_ toNode_ ttl_
> >    $self instvar drophead_
> >    $self instvar num_queues_ sch_ flow_clsfr_
> >    set ns [Simulator instance]
> >    set head_ [new Connector]
> >    set drophead_ [new Connector]
> >    set link_ [new DelayLink]
> >    set ttl_ [new TTLChecker]
> >    set flow_clsfr_ [new Classifier/Flow]
> >    set sch_ [new PktScheduler/RR]
> >    set num_queues_ $num_queues
> >    $head_ set link_ $self
> >    $drophead_ target [$ns set nullAgent_]
> >    $head_ target $flow_clsfr_
> >    for {set i 0} {$i < $num_queues_} {incr i} {
> >        set queue_($i) [new Queue/DropTail]
> >        $queue_($i) target $sch_
> >        $queue_($i) drop-target $drophead_
> >    }
> >    $sch_ target $link_
> >    $link_ target $ttl_
> >    $link_ drop-target $drophead_
> >    $link_ set bandwidth_ $bw
> >    $link_ set delay_ $delay
> >    $ttl_ target [$dst entry]
> >    $ttl_ drop-target $drophead_
> > }
> >
> > LinkSch instproc add-flow { fid } {
> >    $self instvar queue_ flow_clsfr_
> >    $flow_clsfr_ install $fid $queue_($fid)
> > }
> >
> > Simulator instproc sch-link { n1 n2 bw delay num_queues} {
> >    $self instvar link_ queueMap_ nullAgent_ useasim_
> >    set sid [$n1 id]
> >    set did [$n2 id]
> >    set link_($sid:$did) [new LinkSch $n1 $n2 $bw $delay $num_queues]
> >    set pushback 0
> >    $n1 add-neighbor $n2 $pushback
> > }
> >
> > Simulator instproc add-flow { n1 n2 prio } {
> >    $self instvar link_
> >    set sid [$n1 id]
> >    set did [$n2 id]
> >    $link_($sid:$did) add-flow $prio
> > }
> >
> > *The output of the compilation is correct. However, when I try to
> simulate
> > this tcl script:*
> >
> > set num_queues [lindex $argv 0]
> > set ns [new Simulator]
> > set f [open book.tr w]
> > $ns trace-all $f
> > set n1 [$ns node]
> > set n2 [$ns node]
> > set n3 [$ns node]
> > $ns duplex-link $n1 $n2 5Mb 2ms DropTail
> > $ns duplex-link $n2 $n3 5Mb 2ms DropTail
> > $ns sch-link $n1 $n3 5Mb 2ms 10
> > $ns simplex-link $n3 $n1 5Mb 2ms DropTail
> > for {set i 0} {$i < $num_queues} {incr i} {
> > $ns add-flow $n1 $n3 $i
> > set tcp($i) [new Agent/TCP]
> > set sink($i) [new Agent/TCPSink]
> > set ftp($i) [new Application/FTP]
> > $tcp($i) set fid_ $i
> > $ns attach-agent $n1 $tcp($i)
> > $ns attach-agent $n3 $sink($i)
> > $ftp($i) attach-agent $tcp($i)
> > $ns connect $tcp($i) $sink($i)
> > $ns at 0.0 "$ftp($i) start"
> > }
> > proc show_tcp_seqno {} {
> > global tcp num_queues
> > for {set i 0} {$i < $num_queues} {incr i} {
> > puts "The final tcp($i) sequence number is
> > [$tcp($i) set t_seqno_]"
> > }
> > }
> > $ns at 10.0 "show_tcp_seqno"
> > $ns at 10.1 "$ns halt"
> > $ns run
> >
> > *I get the following error:*
> > *
> > *
> > can't read "queue_": variable is array
> >    while executing
> > "return $queue_"
> >    (procedure "_o59" line 3)
> >    (Link queue line 3)
> >    invoked from within
> > "$link_($qn) queue"
> >    (procedure "_o3" line 20)
> >    (Simulator run line 20)
> >    invoked from within
> > "$ns run"
> >    (file "book.tcl" line 34)
> >
> > I have notice that when I comment the following lines in ns-link.tcl file
> > the error disappear but I do not know if it is correct or not to do it,
> or
> > there is a smoother way to fix the problem:
> >
> > #
> > # Also reset every queue
> > #
> >
> > foreach qn [array names link_] {
> > set q [$link_($qn) queue]
> > $q reset
> > }
> >
> >
> > I use ns2 v2.34 on Ubuntu 10.04 64 bits OS.
> > yes, I've read the FAQ, ns-problems page, and manual and I couldn't find
> > the answer there.
> >
> > Thanks,
> > --
> > Ricard Alegre
> > http://wirelessatcom.uab.es/ricardalegre.htm
> >
> >
> >
> >
> > --
> > Ricard Alegre
> > http://wirelessatcom.uab.es/ricardalegre.htm
> >
>
>


-- 
Ricard Alegre
http://wirelessatcom.uab.es/ricardalegre.htm

Reply via email to