aodv包头分析-上

AODV路由协议提供了一个特定的头部,在aodv_packet.h里面

/*
 * General AODV Header - shared by all formats
 */
struct hdr_aodv {
        u_int8_t        ah_type;
	/*
        u_int8_t        ah_reserved[2];
        u_int8_t        ah_hopcount;
	*/
		// Header access methods
	static int offset_; // required by PacketHeaderManager
	inline static int& offset() { return offset_; }
	inline static hdr_aodv* access(const Packet* p) {
		return (hdr_aodv*) p->access(offset_);
	}
};
在结构体hdr_aodv中,它定义了分组的类型ah_type,静态变量offset_用于在任意一个ns分组中找到AODV分组头的位置。access()方法是用来访问分组头的方法,下面的语句就是用此方法获得AODV分组头:
#define HDR_AODV(p)		((struct hdr_aodv*)hdr_aodv::access(p))
#define HDR_AODV_REQUEST(p)  	((struct hdr_aodv_request*)hdr_aodv::access(p))
#define HDR_AODV_REPLY(p)	((struct hdr_aodv_reply*)hdr_aodv::access(p))
#define HDR_AODV_ERROR(p)	((struct hdr_aodv_error*)hdr_aodv::access(p))
#define HDR_AODV_RREP_ACK(p)	((struct hdr_aodv_rrep_ack*)hdr_aodv::access(p))

offset()方法一般是被分组头管理类调用,一般很少使用。

在aodv.cc里面,定义了AODV路由协议的分组头及相应操作函数:
int hdr_aodv::offset_;
static class AODVHeaderClass : public PacketHeaderClass {
public:
        AODVHeaderClass() : PacketHeaderClass("PacketHeader/AODV",
                                              sizeof(hdr_all_aodv)) {
	  bind_offset(&hdr_aodv::offset_);
	} 
} class_rtProtoAODV_hdr;

当模拟器运行的时候,静态对象class_rtProtoAODV_hdr以’PacketHeader/AODV’和’ sizeof(hdr_all_aodv)’为参数,调用PacketHeaderClass的构造函数:

PacketHeaderClass::PacketHeaderClass(const char* classname, int hdrlen) : 
	TclClass(classname), hdrlen_(hdrlen), offset_(0)
{
}

这为AODV分组头的大小分配了空间,并在配置时刻由分组头管理器使用。bind_offset()函数在构造函数中被调用,分组头管理器知道在哪里为这个分组头存储偏移量。举个例子,当执行语句:

struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);

时,由前面介绍得知,它会调用aodv_packet.h里面的
return (hdr_aodv*) p->access(offset_);

返回分组头的位置。




posted @ 2012-06-01 13:02  应律  阅读(209)  评论(0编辑  收藏  举报