资源描述
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_RREP 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. #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 plaincopy
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 plaincopy
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 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. 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 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. Event 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. 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. RouteCacheTimer 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. rtimer(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. 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 plaincopy
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:写得有点乱...哈哈
展开阅读全文