#Route# NS2技巧第二篇:MAC层和路由层获得队列长度

分类: 计算机相关 |
这个模块是根据队列长度判断是否拥塞的一个模块。路由层要获知LL的队列长度。因此在添加完跨层后还要有所改进,因为queue
length不在mac中,而是在LL中。
如何添加这个小模块(以mac802.11为例)。
1, 首先先将“Ns-2技巧第一篇”添加成功。以确保路由层(以AODV为例)可以获得MAC层的信息。
2, 在mac-802_11.h中添加:
#include
然后在802_11类中定义成员变量:
Queue *ifq_;
定义一个内联函数 inline Queue *ifq() {return ifq_;}
3,在mac-802_11.cc中修改command()函数
intMac802_11::command(int argc, const char*const* argv){
if (argc == 3) {if (strcmp(argv[1], "eot-target") == 0) {
EOTtarget_ = (NsObject*) TclObject::lookup(argv[2]);
if (EOTtarget_ == 0)
r
。。。
else if(strcmp(argv[1],"ifq")==0){
ifq_=(Queue*)TclObject::lookup(argv[2]);
if(ifq_==0)
return TCL_OK;
}
} return Mac::command(argc, argv);
}
4,然后修改ll.cc文件,修改command()函数:
int LL::command(int argc, const char*const* argv){
Tcl& tcl = Tcl::instance();
if (argc == 3) {
if (strcmp(argv[1], "ifq") == 0) {
ifq_ = (Queue*) TclObject::lookup(argv[2]);
return (TCL_OK);
} if(strcmp(argv[1], "arptable") == 0) {
arptable_ = (ARPTable*)TclObject::lookup(argv[2]);
assert(arptable_); return TCL_OK;
} if(strcmp(argv[1], "varp") == 0) {
varp_ = (VARPTable*)TclObject::lookup(argv[2]);
assert(varp_); return TCL_OK;
} if (strcmp(argv[1], "mac") == 0) {
mac_ = (Mac*) TclObject::lookup(argv[2]); assert(mac_);
return (TCL_OK);
} if (strcmp(argv[1], "down-target") == 0) {
downtarget_ = (NsObject*) TclObject::lookup(argv[2]);
//------------modified by liujian for getting queue
lengh in mac - start
ifq_ = (Queue*)TclObject::lookup(argv[2]);
//------------modified by liujian for getting queue lengh in mac - end
return (TCL_OK);
} if (strcmp(argv[1], "up-target") == 0) {
。。。。
}
} else if (argc == 2) {
。。。
}
return LinkDelay::command(argc, argv);
}
5. 在ns-mobilenode.tcl中进行初始化工作:
# The following setups up link layer, mac layer, network interface
# and physical layer structures for the mobile node.
#
Node/MobileNode instproc add-interface {
channel pmodel lltype mactype qtype qlen iftype anttype topo inerrproc outerrproc fecproc
}
{ $self instvar arptable_ nifs_ netif_ mac_ ifq_ ll_ imep_ inerr_ outerr_ fec_。。。
# Mac Layer#
$mac netif $netif
#----modified by liujian for getting queue lengh in mac - start
$mac ifq $ifq
#----modified by liujian for getting queue lengh in mac - end
$mac up-target $ll
6,此时MAC中就可以调用queue length了,通过ifq()->length()可以获取。
但是为了在路由中获得该信息。
在mac-802_11.h中Mac802_11类中添加
inline int getqlen() {return ifq()->length();}内敛函数。
此时路由层aodv.cc中可以利用mymac->getqlen()来获取LL中的队列长度信息。