如何在AODV(NS-2)中实现混杂模式并且实现邻居监测功能[转载]

来源:互联网 发布:js字符串转数字相加 编辑:程序博客网 时间:2024/04/24 14:21

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

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


首先,我们知道在NS2 AODV协议中,希望某个节点侦听到其邻居节点间通信信息时。不能直接在AODV协议中获取邻居节点之间的数据。所以要设置成混在模式下的监听过程。下面具体介绍如何添加该过程:

1.修改aodv/aodv.h

Make AODV agent a child class of Tap (you should have a member function tap), and define the Mac variable

[cpp] view plaincopy
  1. #include <mac.h>  
  2. class AODV: public Tap, public Agent {  
  3. public:  
  4. void tap(const Packet *p);  
  5. ......  
  6. protected:  
  7. Mac *mac_;  
  8. ......  
  9. }  
 

2.修改aodv/aodv.cc

首先定义一个TCL command “install-tap” 并实现AODV::tap()函数

[cpp] view plaincopy
  1. int  
  2. AODV::command(int argc, const char*const* argv) {  
  3. ......  
  4. else if(argc == 3) {  
  5. ......  
  6. else if (strcmp(argv[1], "install-tap") == 0) {  
  7. mac_ = (Mac*)TclObject::lookup(argv[2]);  
  8. if (mac_ == 0) return TCL_ERROR;  
  9. mac_->installTap(this);  
  10. return TCL_OK;  
  11. }  
  12. }  
  13. return Agent::command(argc, argv);  
  14. }  
  15. void  
  16. AODV::tap(const Packet *p) {  
  17. // put your code here  
  18. }   

3.Modify tcl/lib/ns-mobilenode.tcl

[cpp] view plaincopy
  1. Node/MobileNode instproc add-target { agent port } {  
  2. $self instvar dmux_ imep_ toraDebug_ mac_  
  3. ......  
  4. # Special processing for AODV  
  5. set aodvonly [string first "AODV" [$agent info class]]  
  6. if {$aodvonly != -1 } {  
  7. $agent if-queue [$self set ifq_(0)] ; # ifq between LL and MAC  
  8. $agent install-tap $mac_(0)  
  9. ......  
  10. }  

具体参见:

4.在tcl脚本中调用Install-tap

在你定义的节点后面添加这样两行代码:

set tapagent [$node_($i) agent 255]$tapagent install-tap [$node_($i) set mac_(0)]

这样节点node_($i)就可以监听到其邻居节点之间的通信数据报。

 

下面简要介绍在Ad hoc 中添加一些IDS的过程:

根据上面提供的步骤,我们已经可以建立OADV的混杂模式(Promiscumus Mode)

首先我们得先建立一种攻击模式(如blackhole attack, greyhole attack, wormhole attack等),下一篇介绍如何添加

一个blackhole attack。

接下来我们就是要添加几个IDS监测节点。具体步骤如下(过程和上面所描述的基本一样):


1.修改aodv/aodv.h(同上)

2.修改aodv/aodv.cc

在command()函数中添加这一项:

[c-sharp] view plaincopy
  1. else if (strcmp(argv[1], "install-tap") == 0) {  
  2.     printf("执行install-tap /n");  
  3.               
  4.     mac_ = (Mac*)TclObject::lookup(argv[2]);  
  5.     if (mac_ == 0) return TCL_ERROR;  
  6.        mac_->installTap(this);  
  7.     return TCL_OK;  
  8. }  

实现AODV::tap()函数

[cpp] view plaincopy
  1. void  
  2. AODV::tap(const Packet *p) {      
  3.       
  4.     struct hdr_cmn *ch = HDR_CMN(p);  
  5.     struct hdr_ip *ih  = HDR_IP(p);  
  6.       
  7.     //sendToWatchdog(p);  
  8.     if(ch->ptype() == PT_AODV) //为AODV Packet  
  9.     {  
  10.         struct hdr_aodv *ah = HDR_AODV(p);  
  11.         switch(ah->ah_type)  
  12.         {  
  13.             case AODVTYPE_RREQ:  
  14.                 Sniffer_readRREQ(p);  
  15.                 break;  
  16.             case AODVTYPE_RREP:  
  17.                 Sniffer_readRREP(p);  
  18.                 break;  
  19.             default:  
  20.                 break;  
  21.         }  
  22.     }  
  23. }  

这里面的我只监测邻居节点的件的RREQ和RREP数据包,并且对监测到的RREQ和RREP数据包之后作相应的处理

如函数Sniffer_readRREQ(p)和Sniffer_readRREP(p).这个两个函数可以根据你自己的需求来实现。这里不给出这两个函数的实现了。

这里我们也可以侦听数据报文,而不仅仅是控制报文。也就是说根据你自己的具体需求来定制。

接下来就是按照上面说的那样,定义你的IDS节点,并在你需要设置成为IDS节点的tcl脚本后面添加上

set tapagent [$node_($i) agent 255]$tapagent install-tap [$node_($i) set mac_(0)]

$i就是你要定义的IDS节点ID。