收藏 分销(赏)

NS2-AODV协议添加新的数据包类型.docx

上传人:仙人****88 文档编号:11987967 上传时间:2025-08-25 格式:DOCX 页数:7 大小:46.89KB 下载积分:10 金币
下载 相关 举报
NS2-AODV协议添加新的数据包类型.docx_第1页
第1页 / 共7页
NS2-AODV协议添加新的数据包类型.docx_第2页
第2页 / 共7页


点击查看更多>>
资源描述
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:写得有点乱...哈哈
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服