刚开始看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.h,570行。
HDR_CMN(p)实际上是一个宏命令,在packet.h的53行:
#define HDR_CMN(p)
hdr_cmn::access(p)的定义在packet.h的619行能找到:
inline static hdr_cmn* access(const Packet* p) {
这里实际上是调用的类Packet的access(offset_)函数,该函数的定义在484行:
inline unsigned char* access(int off) const {
而bits_是packet类的成员变量,代表包头数据,实际上是一个无符号字符串的起始指针,定义如下:
unsigned char* 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)实际上都是返回的数据包中的数据指针,只不过偏移量不同而已,其实就是因为这两个结构体中的数据位于数据包的不同段,通过不同的偏移量取出。