aodv包头分析-上

原文地址:http://blog.csdn.net/ise_gaoyue1990/article/details/7623073

 

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

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

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

在aodv.cc里面,定义了AODV路由协议的分组头及相应操作函数:
[cpp] view plain copy print ?
  1. int hdr_aodv::offset_;  
  2. static class AODVHeaderClass : public PacketHeaderClass {  
  3. public:  
  4.         AODVHeaderClass() : PacketHeaderClass("PacketHeader/AODV",  
  5.                                               sizeof(hdr_all_aodv)) {  
  6.       bind_offset(&hdr_aodv::offset_);  
  7.     }   
  8. } class_rtProtoAODV_hdr;  

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

[cpp] view plain copy print ?
  1. PacketHeaderClass::PacketHeaderClass(const char* classname, int hdrlen) :   
  2.     TclClass(classname), hdrlen_(hdrlen), offset_(0)  
  3. {  
  4. }  

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

[cpp] view plain copy print ?
  1. struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);  

时,由前面介绍得知,它会调用aodv_packet.h里面的
[cpp] view plain copy print ?
  1. return (hdr_aodv*) p->access(offset_);  

返回分组头的位置。




你可能感兴趣的:(aodv包头分析-上)