1、 2011-06-28 12:28 1289人阅读 评论(8) 收藏 举报 structaccessclasstimertclmacros 在AODV协议基础上添加一种新的控制包类型,可以模仿AODV协议本身的RREQ、RREP、HELLO等来实现。这里我要在AODV协议中添加一个ISOLATE的数据包类型。 首先在aodv_packet.h中 [cpp] view plaincopy 1. #define AODVTYPE_HELLO 0x01 2. #define AODVTYPE_RREQ 0x02 3. #define AODVTYPE_R
2、REP 0x04 4. #define AODVTYPE_RERR 0x08 5. #define AODVTYPE_RREP_ACK 0x10 6. #define AODVTYPE_ISOLATE 0x20 加入AODVTYPE_ISOLATE 0x20 接着添加数据包申请内存空间的宏 [c-sharp] view plaincopy 1. /* 2. * AODV Routing Protocol Header Macros 3. */ 4.
3、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::a
4、ccess(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 plaincopy 1. struct hdr_aodv_isolate { 2. u_int8_t iso_type
5、 //类型编号 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; //源
6、节点 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. */
7、 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 plaincopy 1. // for size calculation of header-space reservation 2. union hdr_all_aodv { 3.
8、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 send
9、Isolate(Packet *p); void recvIsolate(Packet *p); 然后到aodv.cc文件中具体实现这两个函数即可。 [c-sharp] view plaincopy 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.
10、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] = ....
11、 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->directio
12、n() = 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);
13、 //printf("end sendIsolate, and iso_type= %x /n", iso->iso_type); 28. } 具体问题具体分析。 注意在完成这个步骤后,执行的时候会有错误(警告)出现,在这里还要在trace/cmu-trace.cc中添加相应的文件输出格式,也就是输出到.tr文件中该数据包的输出格式。在cmu-trace.cc/format_aodv中添加就行了。 具体什么时候要发送该数据包也是因需求而定,不过你可以设置成周期性地发送该数据包。设置周期性发送的话,你只需要添加一个时钟计数器,然后在时间到达的时候发送该数据包。 添
14、加周期时钟的过程也比较简单。如下所示 首先在aodv.h中添加一个IsolateTimer友元类: [c-sharp] view plaincopy 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. Ev
15、ent intr; 9. }; 然后把IsolateTimer设置成aodv的友元类 friend class IsolateTimer; 如: [c-sharp] view plaincopy 1. friend class aodv_rt_entry; 2. friend class BroadcastTimer; 3. friend class HelloTimer; 4. friend class NeighborTimer; 5. friend class RouteCacheTimer; 6.
16、 friend class LocalRepairTimer; 7. 8. friend class IsolateTimer; //你的Timer 接着声明一个Timer: [c-sharp] view plaincopy 1. /* 2. * Timers 3. */ 4. BroadcastTimer btimer; 5. HelloTimer htimer; 6. NeighborTimer ntimer; 7. RouteCac
17、heTimer rtimer; 8. LocalRepairTimer lrtimer; 9. IsolateTimer itimer; //adding isolate packet sending timer 在AODV::AODV的构造函数中初始化以下itimer [c-sharp] view plaincopy 1. AODV::AODV(nsaddr_t id) : Agent(PT_AODV), 2. btimer(this), htimer(this), ntimer(this), 3. r
18、timer(this), lrtimer(this), itimer(this), etimer(this), rqueue() {.............} 然后再到aodv.cc中实现IsolateTimer [c-sharp] view plaincopy 1. //Start malicious node isolate timer 2. void IsolateTimer::handle(Event *) 3. { 4. agent->isolate_malicious_node(); 5. 6. doubl
19、e 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.
20、 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、 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.
22、 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 plaincopy
23、 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
24、 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:写得有点乱...哈哈






