加载中…
个人资料
暗夜巡视
暗夜巡视
  • 博客等级:
  • 博客积分:0
  • 博客访问:13,814
  • 关注人气:32
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-01-15 18:35:15)
分类: 计算机相关

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

这个模块是根据队列长度判断是否拥塞的一个模块。路由层要获知LL的队列长度。因此在添加完跨层后还要有所改进,因为queue length不在mac中,而是在LL中。

如何添加这个小模块(以mac802.11为例)。

1, 首先先将“Ns-2技巧第一篇”添加成功。以确保路由层(以AODV为例)可以获得MAC层的信息。

2, 在mac-802_11.h中添加:

#include <'queue.h'>

然后在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)

return TCL_ERROR;

return TCL_OK;

}

if (strcmp(argv[1], "ap") == 0) {

ap_addr = addr();

bss_id_ = addr();

infra_mode_ = 1;

mhBeacon_.start((Random::random() % cw_) * phymib_.getSlotTime()); 

return TCL_OK; }

if (strcmp(argv[1], "ScanType") == 0) {

if (strcmp(argv[2], "ACTIVE") == 0) {

ScanType_ = ACTIVE;

infra_mode_ = 1; ap_list = NULL;

mhProbe_.start(macmib_.getProbeDelay());

} else if (strcmp(argv[2], "PASSIVE") == 0) {

。。。 

} else if(strcmp(argv[1], "eventtrace") == 0) {

// command added to support event tracing by Sushmita

et_ = (EventTrace *)TclObject::lookup(argv[2]);

return (TCL_OK);

}//--------modified by liujian for getting queue lengthin  start

else if(strcmp(argv[1],"ifq")==0){

ifq_=(Queue*)TclObject::lookup(argv[2]);

if(ifq_==0) return TCL_ERROR;

return TCL_OK;

}//--------modified by liujian for getting queue lengthin mac - end

} 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中的队列长度信息。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有