NS2跨层设计

来源:互联网 发布:剑三成男捏脸数据图片 编辑:程序博客网 时间:2024/05/18 03:55

    NS2的仿真中经常会遇到不同层之间信息的访问问题,因此就涉及到跨层设计的一些概念,本文参考网络上的一些资源,并结合自己的想法给出跨层设计的简单步骤。

    首先,来看看路由层和MAC层之间的信息如何交互,在这里主要是路由层访问MAC层的一些信息。以AODV协议为例,简述跨层设计的步骤。

    (1)在aodv.h中增加头文件

#include "mac/mac-802_11.h"
    紧接着,在AODV类里面定义一个Mac802_11的对象指针,如下所示:
Mac802_11*  clmac;
    (2)修改aodv.cc文件中的command()函数,增加以下代码

int AODV::command(int argc, const char*const* argv) {………else if(argc == 3) {if (strcmp(argv[1], "cl-mac") == 0){clmac = (Mac802_11 *) TclObject::lookup(argv[2]);if (clmac == 0){fprintf(stderr, "MESPAgent: %s lookup %s failed.\n", argv[1], argv[2]);return TCL_ERROR;}printf("Get Node mac bss_id:%d \n", clmac->bss_id());return TCL_OK;} else if (……) {…………….}
    (3)在tcl脚本中初始化

set rt($i) [$node_($i) agent 255] # 获得路由层协议$rt($i) cl-mac [$node_($i) set mac_(0)] #初始化 mac 对象
    (4)至此,就可以在AODV中通过clmac对象访问mac的信息

    其次,来看看路由层与Queue(LL的队列)的交互,该步需要完成之前一步的工作,简要步骤如下:

    (1)在mac-802_11.h中添加如下头文件

#include<queue.h>
    紧接着,在802_11类中定义:Queue*  ifq_;和inlineQueue *ifq() {return ifq_;}

    (2)在mac-802_11.cc中修改command()函数

int Mac802_11::command(int argc, const char*const* argv){…………………if (argc == 3) {if(strcmp(argv[1],"ifq")==0){ifq_=(Queue*)TclObject::lookup(argv[2]);if(ifq_==0)return TCL_ERROR;return TCL_OK;} else if (…) {…………………
    (3) 修改ll.cc文件的command()函数
int LL::command(int argc, const char*const* argv){……………………if (strcmp(argv[1], "down-target") == 0) {downtarget_ = (NsObject*) TclObject::lookup(argv[2]);ifq_ = (Queue*)TclObject::lookup(argv[2]);return (TCL_OK);}………………….
    (4)修改ns-mobilenode.tcl文件

Node/MobileNode instprocadd-interface { ……… } {………………………$mac netif$netif$mac ifq $ifq$mac up-target$ll……………………….

    (5)在mac-802_11.h中Mac802_11类中添加函数inline int getqlen(){return ifq()->length();}

    按照如上步骤添加完之后,就可以在路由层aodv.cc中利用clmac-> getqlen()来获取队列的信息。