Q & A

 

Q1: I want to know the differece among flow_id, packet_sequeue_num, packet_id in file "trace.tr".

A1:

flow_id: 為了在模擬結束後,能更容易的去區分不同flow的資訊,則可以在模擬過程設定不同的flow有不同的id.若是沒有設定flow id,這樣所有的flow_id都會是0

 

packet_sequence_number: 對於同一條flow而言,這個flow所產生的第一個packet,它的sequence number就是0,第二flow所產生的packet,就是1,以此類推

 

packet_id: 這是對於整個系統而言,整個系統中所產生的第一個packet,它的packet id 就是0,第二packet,就是1,以此類推

 

 

Q2: 為何當我安裝完NS2,還是沒辦法執行ns example2.exe ?

A2:

1.      當你全部都裝完NS2,請先去檢查你的ns-allinone-2.27/ns-2.27目錄下是否有沒有ns.exe,若有產生ns.exe,則表示你已經成功的編譯出ns.另外,請順便檢查看看ns-allinone-2.27/nam-1.10目錄下是否有沒有nam.exe,有的話,也表示你已經成功的編譯出nam.

2.      若是你沒有看到ns.exe或者是nam.exe,請重新安裝一次

3.      當步驟1做完後,設定.bashrc,設定完後,請記得一定要再重新開啟一次cygwinwindow,這樣路徑設定才會生效

4.      若是還是不行,那我的建議是採用另一種方法,(我有發現在某些情況下,不管怎樣設定.bashrc,路徑設定都是沒用的),這個方法就是請直接把ns.exenam.exe拷貝到要模擬的tcl同一目錄下,再執行模擬的時後,使用./ns.exe,例如 ./ns.exe example2.tcl 再試看.

 

Q3: 我可以在cygwin下同時安裝多個版本的ns?

A3: 可以的.當不同版本編譯後,ns-2.2x目錄下會產生ns.exe,只要把想要用的ns.exe版本拷貝到和想要模擬的tcl同一目錄下,然後執行./ns.exe abc.tcl就可以了.(這裡的abc.tcl是想要模擬的tcl)

 

Q4: 當我直接從網頁copyTCL的程式碼時(一個簡單的802.11b ad-hoc無線網路實驗),但在執行過程卻有錯誤,為什麼?

A4: 從網頁直接copy程式碼,然後存到檔案中時,會讓原本每行程式碼間多一行空白,:

網頁的內容:

$ns_ node-config -adhocRouting $val(rp) \

                         -llType $val(ll) \

                         -macType $val(mac) \

                         …………………

拷貝到檔案中:

$ns_ node-config -adhocRouting $val(rp) \

 

                         -llType $val(ll) \

 

                         -macType $val(mac) \

 

                         …………………

因此,這個空白就會讓程式執行時,發生錯誤….請移除空白,再執行就可以了

 

Q5: 無線節點如何獲取當前的佇列長度?

A5: (感謝Huang Lin的來信,修正我的程式碼: )

1.      修改queue/priqueue.h

#include "trace.h"

 

class PriQueue : public DropTail {

public:

        PriQueue();

 

        int     command(int argc, const char*const* argv);

        void    recv(Packet *p, Handler *h);

 

        void    recvHighPriority(Packet *, Handler *);

        // insert packet at front of queue

 

        void filter(PacketFilter filter, void * data);

        // apply filter to each packet in queue,

        // - if filter returns 0 leave packet in queue

        // - if filter returns 1 remove packet from queue

 

        Packet* filter(nsaddr_t id);

 

  void  Terminate(void);

 

  //added by smallko

  Tcl_Channel tchan_;      /* place to write trace records */

  TracedInt curq_;    /* current qlen seen by arrivals */

  void trace(TracedVar*); /* routine to write trace records */

…………………….

1.      修改queue/ priqueue.cc

PriQueue::PriQueue() : DropTail()

{

        bind("curq_",&curq_);

        tchan_=0;

        bind("Prefer_Routing_Protocols", &Prefer_Routing_Protocols);

                LIST_INSERT_HEAD(&prhead, this, link);

}

 

void PriQueue::recv(Packet *p, Handler *h)

{

    struct hdr_cmn *ch = HDR_CMN(p);

      curq_ = q_->length();

   

        if(Prefer_Routing_Protocols) {

    ……………………………

}

 

void PriQueue::trace(TracedVar* v)

{

        char wrk[500], *p;

 

        if (((p = strstr(v->name(), "curq")) == NULL) ) {

                fprintf(stderr, "PriQueue:unknown trace var %s\n", v->name());

                return;

        }

 

        if (tchan_) {

                int n;

                double t = Scheduler::instance().clock();

               

                if (strstr(v->name(), "curq") != NULL) {

                        sprintf(wrk, "Q %g %d", t, int(*((TracedInt*) v)));

                }

               

                n = strlen(wrk);

                wrk[n] = '\n';

                wrk[n+1] = 0;

                (void)Tcl_Write(tchan_, wrk, n+1);

        }

        return;

}

 

2.      修改tcl/lib/ns-default.tcl

加入 Queue/DropTail/PriQueue set curq_ 0

 

3.      make clean ; make

4.      修改要模擬的tcl檔案 (底下是一個簡單的範例,說明如何去量測Base Station的佇列長度)

............................................................................................

set opt(chan)          Channel/WirelessChannel    ;# channel type

set opt(prop)          Propagation/TwoRayGround   ;# radio-propagation model

set opt(netif)           Phy/WirelessPhy            ;# network interface type

set opt(mac)           Mac/802_11                 ;# MAC type

set opt(ifq)            Queue/DropTail/PriQueue    ;# interface queue type

set opt(ifqlen)          50

set opt(ll)             LL                         ;# link layer type

set opt(ant)           Antenna/OmniAntenna        ;# antenna model

set opt(adhocRouting)   DSDV                       ;# routing protocol

set opt(x)          500          ;# X dimension of the topography

set opt(y)          500          ;# Y dimension of the topography

............................................................................................

set chan    [new $opt(chan)]

set topo    [new Topography]

$topo load_flatgrid $opt(x) $opt(y)

 

$ns node-config -adhocRouting $opt(adhocRouting) \

                 -llType $opt(ll) \

                 -macType $opt(mac) \

                 -ifqType $opt(ifq) \

                 -ifqLen $opt(ifqlen) \

                 -antType $opt(ant) \

                 -propType $opt(prop)    \

                 -phyType $opt(netif) \

                 -channel $chan      \

                 -topoInstance $topo \

                 -wiredRouting ON \

                 -agentTrace OFF \

                 -routerTrace OFF \

                 -macTrace OFF    \

                 -movementTrace OFF

 

set BS(0) [$ns node 1.0.0]

$BS(0) random-motion 0

set bs_ifq [$BS(0) set ifq_(0)]

 

set queuechan [open qlen.tr w]

$bs_ifq trace curq_

$bs_ifq attach $queuechan
............................................................................................

6. 模擬結束後,您就可以發現多一個檔案qlen.tr,當中就有queue length的變化情況.