背景:队列需要设置一个变量 nofstart_ql_为non-overflow期的开始参数。新加变量,需要用TCL脚本初始化,类似于$ns queue-limit $n0 $n1 40 (设置队长为40)
实现方法:新建mydrop-tail.h和mydrop-tail.cc, 标榜 drop_front_ 和 summarystats_ 和 queue_in_bytes_ 和 mean_pktsize_ 进行效仿。
step1: 在mydrop-tail.h里面声明变量nofstart_ql_
_______________________________________________________________
mydrop-tail.h
...
~MyDropTail() {
delete q_;
}
protected:
void reset();
int command(int argc, const char*const* argv);
void enque(Packet*);
Packet* deque();
void shrink_queue(); // To shrink queue and drop excessive packets.
PacketQueue *q_;
int drop_front_;
int summarystats;
void print_summarystats();
int qib_;
int mean_pktsize_;
int nofstart_ql_;
...
_______________________________________________________________
step2: tcl变量和c++绑定
_______________________________________________________________
mydrop-tail.h
class MyDropTail : public Queue {
public:
MyDropTail() {
q_ = new PacketQueue;
pq_ = q_;
bind_bool("drop_front_", &drop_front_);
bind_bool("summarystats_", &summarystats);
bind_bool("queue_in_bytes_", &qib_); // boolean: q in bytes?
bind("mean_pktsize_", &mean_pktsize_);
bind("nofstart_ql_",&nofstart_ql_); //start of non-of queue len..
// _RENAMED("drop-front_", "drop_front_");
.....................................................................................................
step3: 修改ns-default.tcl檔,設定初始內定值。
a. cd ns-allinone-2.27/ns-2.27/tcl/lib/
b. 使用文字編輯軟體打開ns-default.tcl
c. 使用搜尋的功能找到Queue/DropTail
d. 把每個初始設定值都再設一份給Queue/myfifo
……………………………………………..
Queue/DropTail set drop_front_ false
Queue/DropTail set summarystats_ false
Queue/DropTail set queue_in_bytes_ false
Queue/DropTail set mean_pktsize_ 500
Queue/MyDropTail set drop_front_ false
Queue/MyDropTail set summarystats_ false
Queue/MyDropTail set queue_in_bytes_ false
Queue/MyDropTail set mean_pktsize_ 500
Queue/MyDropTail set nofstart_ql_ 5
……………………………………………..
step4: 在C++里面可以使用变量nofstart_ql_ (我们新增的变量)
step5: 在tcl脚本里面的使用
set q [[$ns link $n2 $n3] queue]
$q set nofstart_ql_ 5