如何在NS-2 AODV协议中添加一种新的数据包类型[转载]

原文地址:http://blog.csdn.net/qinleopard/article/details/6572175

---------------------------------------


在AODV协议基础上添加一种新的控制包类型,可以模仿AODV协议本身的RREQ、RREP、HELLO等来实现。这里我要在AODV协议中添加一个ISOLATE的数据包类型。

首先在aodv_packet.h中

[cpp]  view plain copy
  1. #define AODVTYPE_HELLO      0x01  
  2. #define AODVTYPE_RREQ       0x02  
  3. #define AODVTYPE_RREP       0x04  
  4. #define AODVTYPE_RERR       0x08  
  5. #define AODVTYPE_RREP_ACK   0x10  
  6. #define AODVTYPE_ISOLATE        0x20    

加入AODVTYPE_ISOLATE                           0x20

接着添加数据包申请内存空间的宏

[c-sharp]  view plain copy
  1. /* 
  2.  * AODV Routing Protocol Header Macros 
  3.  */  
  4. #define HDR_AODV(p)     ((struct hdr_aodv*)hdr_aodv::access(p))  
  5. #define HDR_AODV_REQUEST(p)     ((struct hdr_aodv_request*)hdr_aodv::access(p))  
  6. #define HDR_AODV_REPLY(p)   ((struct hdr_aodv_reply*)hdr_aodv::access(p))  
  7. #define HDR_AODV_ERROR(p)   ((struct hdr_aodv_error*)hdr_aodv::access(p))  
  8. #define HDR_AODV_RREP_ACK(p)    ((struct hdr_aodv_rrep_ack*)hdr_aodv::access(p))  
  9. #define HDR_AODV_ISOLATE(p)   ((struct hdr_aodv_isolate*) hdr_aodv::access(p))   

接着要具体定义新的数据包格式了。我这里定义的AODV的格式如下所示:

[c-sharp]  view plain copy
  1. struct hdr_aodv_isolate {  
  2. u_int8_t iso_type;  //类型编号  
  3. u_int8_t reserved[3]; //保留字,没用到  
  4. u_int8_t mal_count;   //Malicious node number        u_int32_t       iso_bcast_id;    // Broadcast ID   
  5. nsaddr_t malicious_node_addr[AODV_MAX_ISOLATE]; //malicious  
  6. double   obs[AODV_MAX_ISOLATE];  
  7. nsaddr_t src_addr;            //源节点  
  8. inline int size() //计算数据包的大小  
  9. {  
  10.     int sz = 0;  
  11.     /* 
  12.      sz = sizeof(u_int8_t) //type 
  13.           + sizeof(nsaddr_t) //malicious_node_addr 
  14.           + sizeof(nsaddr_t) //src_addr 
  15.                      + sizeof(u_int32_t) //iso_bcast_id 
  16.     */  
  17.         sz = (2*mal_count+3) *sizeof(u_int32_t);  
  18.         assert(sz);  
  19.         return sz;  
  20.     }     
  21. };  


然后是在hdr_all_aodv添加hdr_aodv_isolate,如下所示:

[c-sharp]  view plain copy
  1. // for size calculation of header-space reservation  
  2. union hdr_all_aodv {  
  3.   hdr_aodv          ah;  
  4.   hdr_aodv_request  rreq;  
  5.   hdr_aodv_reply    rrep;  
  6.   hdr_aodv_error    rerr;  
  7.   hdr_aodv_rrep_ack rrep_ack;  
  8.   hdr_aodv_isolate  iso_err;  
  9. };  

 

添加完数据包的头部之后,接下来的主要工作则是在aodv.cc中如何进行发送和接收ISOLATE数据包的问题了。

首先在aodv.h中添加两个函数:

void            sendIsolate(Packet *p);

 void            recvIsolate(Packet *p);

 

然后到aodv.cc文件中具体实现这两个函数即可。

[c-sharp]  view plain copy
  1. void AODV::sendIsolate(Packet *p)  
  2. {  
  3.     //Packet *p = Packet::alloc();  
  4.     struct hdr_cmn *ch = HDR_CMN(p);  
  5.     struct hdr_ip  *ih = HDR_IP(p);  
  6.     struct hdr_aodv_isolate * iso = HDR_AODV_ISOLATE(p);  
  7.   
  8.     iso->iso_type = AODVTYPE_ISOLATE;  
  9.     //iso->malicious_node_addr = malicious_addr;  
  10.     iso->src_addr            = index;  
  11.     iso->iso_bcast_id        = bid++; //骞挎挱ID  
  12.     //iso->reserved[0,1,2] = ....  
  13.   
  14.     ch->ptype()     = PT_AODV;  
  15.     ch->size()      = IP_HDR_LEN + iso->size();  
  16.     ch->iface()       = -2;  
  17.     ch->error()       = 0;  
  18.     ch->addr_type() = NS_AF_NONE;  
  19.     ch->next_hop_   = 0;  
  20.     ch->prev_hop_   = index;  
  21.     ch->direction() = hdr_cmn::DOWN; //important: change the packet's direction  
  22.   
  23.     ih->saddr() = index; //源地址  
  24.     ih->daddr() = IP_BROADCAST; //广播分组  
  25.     ih->sport() = RT_PORT; //源端口号  
  26.     ih->dport() = RT_PORT; //目的端口号  
  27.     Scheduler::instance().schedule(target_, p, 0.0);    //printf("end sendIsolate, and iso_type= %x /n", iso->iso_type);  
  28. }  

 

具体问题具体分析。

注意在完成这个步骤后,执行的时候会有错误(警告)出现,在这里还要在trace/cmu-trace.cc中添加相应的文件输出格式,也就是输出到.tr文件中该数据包的输出格式。在cmu-trace.cc/format_aodv中添加就行了。

 

具体什么时候要发送该数据包也是因需求而定,不过你可以设置成周期性地发送该数据包。设置周期性发送的话,你只需要添加一个时钟计数器,然后在时间到达的时候发送该数据包。

添加周期时钟的过程也比较简单。如下所示

首先在aodv.h中添加一个IsolateTimer友元类:

[c-sharp]  view plain copy
  1. //Start malicious node isolate  
  2. class IsolateTimer :public Handler{  
  3.  public:  
  4.   IsolateTimer(AODV *a):agent(a){}  
  5.                 void handle(Event*);  
  6.  private:  
  7.   AODV *agent;  
  8.   Event intr;  
  9. };  

然后把IsolateTimer设置成aodv的友元类

friend class IsolateTimer;

如:

[c-sharp]  view plain copy
  1. friend class aodv_rt_entry;  
  2.     friend class BroadcastTimer;  
  3.     friend class HelloTimer;  
  4.     friend class NeighborTimer;  
  5.     friend class RouteCacheTimer;  
  6.     friend class LocalRepairTimer;  
  7.           
  8.          friend class IsolateTimer; //你的Timer  

接着声明一个Timer:

[c-sharp]  view plain copy
  1. /* 
  2.      * Timers 
  3.      */  
  4.     BroadcastTimer  btimer;  
  5.     HelloTimer      htimer;  
  6.     NeighborTimer   ntimer;  
  7.     RouteCacheTimer rtimer;  
  8.     LocalRepairTimer lrtimer;  
  9.     IsolateTimer     itimer; //adding isolate packet sending timer  

在AODV::AODV的构造函数中初始化以下itimer

[c-sharp]  view plain copy
  1. AODV::AODV(nsaddr_t id) : Agent(PT_AODV),  
  2.         btimer(this), htimer(this), ntimer(this),  
  3.         rtimer(this), lrtimer(this), itimer(this), etimer(this), rqueue() {.............}  

然后再到aodv.cc中实现IsolateTimer

[c-sharp]  view plain copy
  1. //Start malicious node isolate timer  
  2. void IsolateTimer::handle(Event *)  
  3. {  
  4.     agent->isolate_malicious_node();  
  5.           
  6.     double interval = MinIsolateInterval +   
  7.                      (MaxIsolateInterval-MinIsolateInterval)*Random::uniform();  
  8.     assert(interval >=0);  
  9.     Scheduler::instance().schedule(this, &intr, interval);  
  10. }  
  11.   
  12. void AODV::isolate_malicious_node(void)  
  13. {  
  14.     int flags = 0;  
  15.     malicious *ma = watchdog->mal_List->list;  
  16.     neighbour *nb =watchdog->neigs->neigs->group;  
  17.     if(watchdog->mal_List->howmany > 0)  
  18.     {  
  19.         Packet *p = Packet::alloc();  
  20.         struct hdr_aodv_isolate * iso = HDR_AODV_ISOLATE(p);  
  21.         iso->mal_count = 0;  //  
  22.         while(ma != NULL)  
  23.         {        
  24.             iso->malicious_node_addr[iso->mal_count] = ma->ip;  
  25.                 iso->obs[iso->mal_count] = nb->reputation->obs;  
  26.               
  27.             iso->mal_count++;  
  28.             watchdog->delete_malicious_node(ma);  
  29.             flags = 1;  
  30.             ma = ma->next;  
  31.         }  
  32.         if(flags==1)//瀛樺湪鏈骞挎挱鐨刴alicious node  
  33.              sendIsolate(p);  
  34.     }  
  35. }  


接下来你调用一下itimer,我是在这里进行调用的:

[c-sharp]  view plain copy
  1. int  
  2. AODV::command(int argc, const char*const* argv) {  
  3. ...................  
  4. ..................  
  5. ....................  
  6. else if (strcmp(argv[1], "install-tap") == 0) {  
  7.             printf("鎵цinstall-tap /n");  
  8.             itimer.handle((Event*) 0); //这里调用了  
  9.                             mac_ = (Mac*)TclObject::lookup(argv[2]);  
  10.             if (mac_ == 0) return TCL_ERROR;  
  11.             mac_->installTap(this);  
  12.             watchdog->updateMAC(mac_->addr());  
  13.             return TCL_OK;  
  14.         }  
  15. }  

 这样就可以完成了。

ps:写得有点乱...哈哈

你可能感兴趣的:(NS-2)