⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aodvsec.h

📁 本文件是基于NS2的AODVSEC协议的仿真源代码
💻 H
字号:
#ifndef __aodvsec_h__
#define __aodvsec_h__

#include <cmu-trace.h>
#include <priqueue.h>
#include <aodvsec/aodvsec_rtable.h>
#include <aodvsec/aodvsec_rqueue.h>
#include <classifier/classifier-port.h>

/*
  Allows local repair of routes 
*/
#define AODVSEC_LOCAL_REPAIR

/*
  Allows AODVSEC to use link-layer (802.11) feedback in determining when
  links are up/down.
*/
#define AODVSEC_LINK_LAYER_DETECTION

/*
  Causes AODVSEC to apply a "smoothing" function to the link layer feedback
  that is generated by 802.11.  In essence, it requires that RT_MAX_ERROR
  errors occurs within a window of RT_MAX_ERROR_TIME before the link
  is considered bad.
*/
#define AODVSEC_USE_LL_METRIC

/*
  Only applies if AODVSEC_USE_LL_METRIC is defined.
  Causes AODVSEC to apply omniscient knowledge to the feedback received
  from 802.11.  This may be flawed, because it does not account for
  congestion.
*/
//#define AODVSEC_USE_GOD_FEEDBACK


class AODVSEC;

#define MY_ROUTE_TIMEOUT        10                      	// 100 seconds
#define ACTIVE_ROUTE_TIMEOUT    10				// 50 seconds
#define REV_ROUTE_LIFE          6				// 5  seconds
#define BCAST_ID_SAVE           6				// 3 seconds


// No. of times to do network-wide search before timing out for 
// MAX_RREQ_TIMEOUT sec. 
#define RREQ_RETRIES            3  
// timeout after doing network-wide search RREQ_RETRIES times
#define MAX_RREQ_TIMEOUT	10.0 //sec

/* Various constants used for the expanding ring search */
#define TTL_START     3
#define TTL_THRESHOLD 4
#define TTL_INCREMENT 1 

// This should be somewhat related to arp timeout
#define NODE_TRAVERSAL_TIME     0.03             // 30 ms
#define LOCAL_REPAIR_WAIT_TIME  0.15 //sec

// Should be set by the user using best guess (conservative) 
#define NETWORK_DIAMETER        4            // 30 hops

// Must be larger than the time difference between a node propagates a route 
// request and gets the route reply back.

//#define RREP_WAIT_TIME     (3 * NODE_TRAVERSAL_TIME * NETWORK_DIAMETER) // ms
//#define RREP_WAIT_TIME     (2 * REV_ROUTE_LIFE)  // seconds
#define RREP_WAIT_TIME         1.0  // sec

#define ID_NOT_FOUND    0x00
#define ID_FOUND        0x01
//#define INFINITY        0xff

// The followings are used for the forward() function. Controls pacing.
#define DELAY 1.0           // random delay
#define NO_DELAY -1.0       // no delay 

// think it should be 30 ms
#define ARP_DELAY 0.01      // fixed delay to keep arp happy


#define HELLO_INTERVAL          1               // 1000 ms
#define ALLOWED_HELLO_LOSS      3               // packets
#define BAD_LINK_LIFETIME       3               // 3000 ms
#define MaxHelloInterval        (1.25 * HELLO_INTERVAL)
#define MinHelloInterval        (0.75 * HELLO_INTERVAL)

/*
  Timersecs (Broadcast ID, Hello, Neighbor Cache, Route Cache)
*/
class BroadcastTimersec : public Handler {
public:
        BroadcastTimersec(AODVSEC* a) : agent(a) {}
        void	handle(Event*);
private:
        AODVSEC    *agent;
	Event	intr;
};

class HelloTimersec : public Handler {
public:
        HelloTimersec(AODVSEC* a) : agent(a) {}
        void	handle(Event*);
private:
        AODVSEC    *agent;
	Event	intr;
};

class NeighborTimersec : public Handler {
public:
        NeighborTimersec(AODVSEC* a) : agent(a) {}
        void	handle(Event*);
private:
        AODVSEC    *agent;
	Event	intr;
};

class RouteCacheTimersec : public Handler {
public:
        RouteCacheTimersec(AODVSEC* a) : agent(a) {}
        void	handle(Event*);
private:
        AODVSEC    *agent;
	Event	intr;
};

class LocalRepairTimersec : public Handler {
public:
        LocalRepairTimersec(AODVSEC* a) : agent(a) {}
        void	handle(Event*);
private:
        AODVSEC    *agent;
	Event	intr;
};


/*
  Broadcast ID Cache
*/
class BroadcastID {
        friend class AODVSEC;
 public:
        BroadcastID(nsaddr_t i, u_int32_t b) { src = i; id = b;  }
 protected:
        LIST_ENTRY(BroadcastID) link;
        nsaddr_t        src;
        u_int32_t       id;
        double          expire;         // now + BCAST_ID_SAVE s
};

LIST_HEAD(aodvsec_bcache, BroadcastID);


/*
  The Routing Agent
*/
class AODVSEC: public Agent {

  /*
   * make some friends first 
   */

        friend class aodvsec_rt_entry;
        friend class BroadcastTimersec;
        friend class HelloTimersec;
        friend class NeighborTimersec;
        friend class RouteCacheTimersec;
        friend class LocalRepairTimersec;

 public:
        AODVSEC(nsaddr_t id);

        void		recv(Packet *p, Handler *);

 protected:
        int             command(int, const char *const *);
        int             initialized() { return 1 && target_; }

        /*
         * Route Table Management
         */
        void            rt_resolve(Packet *p);
        void            rt_update(aodvsec_rt_entry *rt, u_int32_t seqnum,
		     	  	u_int16_t metric, nsaddr_t nexthop,
		      		double expire_time);
        void            rt_down(aodvsec_rt_entry *rt);
        void            local_rt_repair(aodvsec_rt_entry *rt, Packet *p);
 public:
        void            rt_ll_failed(Packet *p);
        void            handle_link_failure(nsaddr_t id);
 protected:
        void            rt_purge(void);

        void            enque(aodvsec_rt_entry *rt, Packet *p);
        Packet*         deque(aodvsec_rt_entry *rt);

        /*
         * Neighbor Management
         */
        void            nb_insert(nsaddr_t id);
        AODVSEC_Neighbor*       nb_lookup(nsaddr_t id);
        void            nb_delete(nsaddr_t id);
        void            nb_purge(void);

        /*
         * Broadcast ID Management
         */

        void            id_insert(nsaddr_t id, u_int32_t bid);
        bool	        id_lookup(nsaddr_t id, u_int32_t bid);
        void            id_purge(void);

        /*
         * Packet TX Routines
         */
        void            forward(aodvsec_rt_entry *rt, Packet *p, double delay);
        void            sendHello(void);
        void            sendRequest(nsaddr_t dst);

        void            sendReply(nsaddr_t ipdst, u_int32_t hop_count,
                                  nsaddr_t rpdst, u_int32_t rpseq,
                                  u_int32_t lifetime, double timestamp);
        void            sendError(Packet *p, bool jitter = true);
                                          
        /*
         * Packet RX Routines
         */
        void            recvAODVSEC(Packet *p);
        void            recvHello(Packet *p);
        void            recvRequest(Packet *p);
        void            recvReply(Packet *p);
        void            recvError(Packet *p);

	/*
	 * History management
	 */
	
	double 		PerHopTime(aodvsec_rt_entry *rt);


        nsaddr_t        index;                  // IP Address of this node
        u_int32_t       seqno;                  // Sequence Number
        int             bid;                    // Broadcast ID

        aodvsec_rtable         rthead;                 // routing table
        aodvsec_ncache         nbhead;                 // Neighbor Cache
        aodvsec_bcache          bihead;                 // Broadcast ID Cache

        /*
         * Timersecs
         */
        BroadcastTimersec  btimersec;
        HelloTimersec      htimersec;
        NeighborTimersec   ntimersec;
        RouteCacheTimersec rtimersec;
        LocalRepairTimersec lrtimersec;

        /*
         * Routing Table
         */
        aodvsec_rtable          rtable;
        /*
         *  A "drop-front" queue used by the routing layer to buffer
         *  packets to which it does not have a route.
         */
        aodvsec_rqueue         rqueue;

        /*
         * A mechanism for logging the contents of the routing
         * table.
         */
        Trace           *logtarget;

        /*
         * A pointer to the network interface queue that sits
         * between the "classifier" and the "link layer".
         */
        PriQueue        *ifqueue;

        /*
         * Logging stuff
         */
        void            log_link_del(nsaddr_t dst);
        void            log_link_broke(Packet *p);
        void            log_link_kept(nsaddr_t dst);

	/* for passing packets up to agents */
	PortClassifier *dmux_;

};

#endif /* __aodvsec_h__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -