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


首先,在NS2 AODV协议中,希望某个节点侦听到其邻居节点间通信信息时。不能直接在AODV协议中获取邻居节点之间的数据。所以要设置成混杂模式来监听过程。下面具体介绍如何添加该过程:
 1.修改aodv/aodv.h
 Make AODV agent a child class of Tap, and define the Mac variable

 #include <mac.h>  
    class AODV: public Tap, public Agent {  
    public:  
    void tap(const Packet *p);  
    ......  
    protected:  
    Mac *mac_;  
    ......  
    }


 2.修改aodv/aodv.cc
 首先定义一个TCL command “install-tap” 并实现AODV::tap()函数
 
int  AODV::command(int argc, const char*const* argv) {
    ......
    else if(argc == 3) {
    ......
    else if (strcmp(argv[1], "install-tap") == 0) {
    mac_ = (Mac*)TclObject::lookup(argv[2]);
    if (mac_ == 0) return TCL_ERROR;
    mac_->installTap(this);
    return TCL_OK;
    }
    }
    return Agent::command(argc, argv);
    }
    void
    AODV::tap(const Packet *p) {
    // put your code here
    }


 
 
 3.修改 tcl/lib/ns-mobilenode.tcl
 
Node/MobileNode instproc add-target { agent port } {
    $self instvar dmux_ imep_ toraDebug_ mac_
    ......
    # Special processing for AODV
    set aodvonly [string first "AODV" [$agent info class]]
    if {$aodvonly != -1 } {
    $agent if-queue [$self set ifq_(0)] ; # ifq between LL and MAC
    $agent install-tap $mac_(0)
    ......
    }


 4.在tcl脚本中调用Install-tap
 在你定义的节点后面添加这样两行代码:
 set tapagent [$node_($i) agent 255]
 $tapagent install-tap [$node_($i) set mac_(0)]
 这样节点node_($i)就可以监听到其邻居节点之间的通信数据报。
  
 下面简要介绍在Ad hoc 中添加一些IDS的过程:
 根据上面提供的步骤,我们已经可以建立AODV的混杂模式(Promiscumus Mode)
 首先我们得先建立一种攻击模式(如blackhole attack, greyhole attack, wormhole attack等)。接下来我们就是要添加几个IDS监测节点。具体步骤如下(过程和上面所描述的基本一样):
 
 1.修改aodv/aodv.h(同上)
 2.修改aodv/aodv.cc
 在command()函数中添加这一项:
 else if (strcmp(argv[1], "install-tap") == 0) {
    	printf("执行install-tap /n");		
    	mac_ = (Mac*)TclObject::lookup(argv[2]);
    	if (mac_ == 0) return TCL_ERROR;
    	   mac_->installTap(this);
    	return TCL_OK;
    }


 
 实现AODV::tap()函数
 
void  AODV::tap(const Packet *p) {	
        
    	struct hdr_cmn *ch = HDR_CMN(p);
    	struct hdr_ip *ih  = HDR_IP(p);
    	//sendToWatchdog(p);
    	if(ch->ptype() == PT_AODV) //为AODV Packet
    	{
    		struct hdr_aodv *ah = HDR_AODV(p);
    		switch(ah->ah_type)
    		{
    			case AODVTYPE_RREQ:
    				Sniffer_readRREQ(p);
    				break;
    			case AODVTYPE_RREP:
    				Sniffer_readRREP(p);
    				break;
    			default:
    				break;
    		}
    	}
    }


 
 各种包中只监测邻居节点的件的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。



 

  
  
  
  
 





























      
      
      
      





      
      
      
      





      
      
      
      

   
0
0
 
 

你可能感兴趣的:(ns-2,混杂模式,邻居监测功能,AODV)