ns2中AODV协议HDR_CMN(p)的含义

来源:互联网 发布:网络玄幻小说书名大全 编辑:程序博客网 时间:2024/04/29 20:05

刚开始看AODV协议就被两个函数难到:HDR_CMN(p)HDR_IP(p),经查功能都差不多,以HDR_CMN(p)为例说明。
代码:


struct hdr_cmn *ch =HDR_CMN(p);


结构体hdr_cmn的定义在:/ns-allinone-2.34/ns-2.34/common/packet.h570行。
HDR_CMN(p)
实际上是一个宏命令,在packet.h53行:


#defineHDR_CMN(p)     (hdr_cmn::access(p))


hdr_cmn::access(p)
的定义在packet.h619行能找到:


inline static hdr_cmn*access(const Packet* p) {
        return(hdr_cmn*) p->access(offset_);
    }


这里实际上是调用的类Packetaccess(offset_)函数,该函数的定义在484行:


inline unsigned char*access(int off) const {
       if (off< 0)
         abort();
       return(&bits_[off]);
   }


bits_packet类的成员变量,代表包头数据,实际上是一个无符号字符串的起始指针,定义如下:


unsigned char*bits_;    //header bits


因此,&bits_[off]就好理解了,它应该是相对于包头off个字节地址偏移之后的指针。

这样看来,HDR_CMN(p)执行的结果应该是将包头数据偏移offset_个字节之后的指针强制转换成hdr_cmn*类型之后返回,offset_在结构体hdr_cmn中定义。

而同样的,HDR_IP(p)返回的也是packet中的偏移offset_字节的指针,只不过强制转换成了hdr_ip*类型,同时偏移量offset_在结构体hdr_ip中定义,与HDR_CMN(p)不同。

综上所述,HDR_CMN(p)HDR_IP(p)实际上都是返回的数据包中的数据指针,只不过偏移量不同而已,其实就是因为这两个结构体中的数据位于数据包的不同段,通过不同的偏移量取出。

 

原创粉丝点击