最近在调试一个SAR协议,需要通过IFQ的长度来判断传感器节点是否发生阻塞。目前,在Agent中已经能够获取LL和MAC接口,查看了LL.h/cc代码,尝试着直接在Agent.cc中获取:Queue* ifq = (Queue*)ll->ifq(); 结果发现获得的指针总为空,目前还不知道具体原因在哪。
但是一种解决方法是通过MAC层获取到IFQ的指针,方法是参考下面Liu Jian的。
1. 因为仿真用到的是MAC 802.11协议,因此修改MAC_802-11.h/cc文件,在其中加入:
#include<queue.h>
Queue *ifq_; //定义成员变量
inline Queue *ifq() {return ifq_;}
2. 在mac-802_11.cc中修改command()函数
int Mac802_11::command(int argc, const char*const* argv)
......
else if(strcmp(argv[1],"ifq")==0){
ifq_=(Queue*)TclObject::lookup(argv[2]);
if(ifq_==0)
return TCL_ERROR;
return TCL_OK;
}
3. 随后修改tcl/lib/ns-mobilenode.tcl文件,调用上面的方法获取到IFQ的指针:
# Mac Layer
$mac netif $netif
$mac ifq $ifq
4. 至此已经可以在MAC层中获取IFQ的指针了,但是要在路由层或者Agent层获取,还得获取到MAC的指针,这一步可以同上类似实现。