#ifndef AODV_H #define AODV_H #include #include #define AODVPORT 654 #define TRUE 1 #define FALSE 0 #define MAX(a,b) (((a)>(b))?(a):(b)) #define ACTIVE_ROUTE_TIMEOUT 3000 #define ALLOWED_HELLO_LOSS 3 #define DELETE_PERIOD MAX((ACTIVE_ROUTE_TIMEOUT),((ALLOWED_HELLO_LOSS)*(HELLO_INTERVAL))) #define HELLO_INTERVAL 1000 #define MY_ROUTE_TIMEOUT 2 * (ACTIVE_ROUTE_TIMEOUT) #define NET_DIAMETER 35 #define NET_TRAVERSAL_TIME 3 * NODE_TRAVERSAL_TIME * NET_DIAMETER / 2 #define NEXT_HOP_WAIT (NODE_TRAVERSAL_TIME) + 10 #define NODE_TRAVERSAL_TIME 50 #define PATH_TRAVERSAL_TIME 2 * NET_TRAVERSAL_TIME #define RREQ_RETRIES 2 #define TTL_START 1 #define TTL_INCREMENT 2 #define TTL_THRESHOLD 7 #define RREQ 1 #define RREP 2 #define RERR 3 #define EVENT_RREQ 1 #define EVENT_RREP 2 #define EVENT_RERR 3 #define EVENT_RREP_ACK 4 #define EVENT_REBROADCAST 5 #define EVENT_HELLO 102 #define EVENT_CLEANUP 101 #define EVENT_NEIGHBOR 103 #define FLAGS_ALL 255 extern u_int8_t USE_LO; extern struct metric monitor; extern char g_block_dev[8]; extern char g_aodv_dev[8]; extern u_int32_t g_aodv_subnet; struct metric { u_int32_t bytes; u_int32_t packets; u_int32_t routing_packets; u_int16_t rreq; u_int16_t rrep; u_int16_t rrer; u_int64_t last_read; }; // Route table struct route_table_entry { u_int32_t dst_ip; u_int32_t dst_seq; u_int32_t old_dst_seq; u_int8_t hop_count; u_int32_t next_hop; struct precursor_entry *precursors; u_int64_t lifetime; struct net_device *dev; u_int8_t link; u_int8_t route_valid:1; u_int8_t route_seq_valid:1; struct route_table_entry *next; struct route_table_entry *prev; u_int32_t rreq_id; u_int8_t self_route:1; }; struct precursor_entry { u_int32_t ip; struct precursor_entry *next; struct precursor_entry *prev; int ishead; }; // Used to stores a list of the different interfaces struct interface_list_entry { struct net_device * dev; struct route_table_entry *route_entry; int index; u_int32_t ip; char name[IFNAMSIZ]; struct interface_list_entry *next; struct socket *sock; u_int64_t last_hello; u_int64_t last_broadcast; }; struct neighbor_list_entry { u_int32_t ip; u_int64_t lifetime; unsigned char hw_addr[ETH_ALEN]; struct net_device *dev; struct route_table_entry *route_entry; u_int8_t link; struct neighbor_list_entry *next; }; struct flood_id_queue_entry { u_int32_t src_ip; u_int32_t dst_ip; u_int32_t flood_id; u_int64_t lifetime; struct flood_id_queue_entry *next; }; //Used to queue events which Aodv Thread has to act on struct event_queue_entry { u_int32_t dst_ip; u_int32_t src_ip; struct net_device *dev; int type; unsigned int size; int id; u_int8_t ttl; void *data; u_int64_t time; unsigned char src_hw_addr[ETH_ALEN]; struct event_queue_entry *next; struct event_queue_entry *prev; }; struct rebroadcast_queue_entry { u_int32_t dst_ip; unsigned int size; u_int8_t ttl; void *data; u_int64_t time; struct rebroadcast_queue_entry *next; struct rebroadcast_queue_entry *prev; }; struct timer_queue_entry { u_int64_t tv; /* Time the event should happend in ms since 1 jan 1970 */ int size; u_int32_t id; /* An id used to match one or a group of entrys */ u_int8_t ttl; u_int16_t retries; unsigned char flags; /* Flag which represents what's in the dataportion */ struct timer_queue_entry *next; /* A pointer to the next entry in the list */ void *data; /* Data stored in the entry */ }; //Route reply message type struct rrep_ack { u_int8_t type; u_int8_t reserved; }; struct rrep { u_int8_t type; #if defined(__BIG_ENDIAN_BITFIELD) unsigned int r:1; unsigned int a:1; unsigned int reserved1:6; unsigned int reserved2:3; unsigned int prefix_sz:5; #elif defined(__LITTLE_ENDIAN_BITFIELD) unsigned int reserved1:6; unsigned int r:1; unsigned int a:1; unsigned int prefix_sz:5; unsigned int reserved2:3; #else #error "Please fix " #endif u_int8_t hop_count; u_int32_t dst_ip; u_int32_t dst_seq; u_int32_t src_ip; u_int32_t lifetime; }; //Endian handling based on DSR implemetation by Alex Song s369677@student.uq.edu.au struct rreq { u_int8_t type; #if defined(__BIG_ENDIAN_BITFIELD) u_int8_t j:1; u_int8_t r:1; u_int8_t g:1; u_int8_t d:1; u_int8_t u:1; u_int8_t reserved:3; #elif defined(__LITTLE_ENDIAN_BITFIELD) u_int8_t reserved:3; u_int8_t u:1; u_int8_t d:1; u_int8_t g:1; u_int8_t r:1; u_int8_t j:1; #else #error "Please fix " #endif u_int8_t second_reserved; u_int8_t hop_count; u_int32_t rreq_id; u_int32_t dst_ip; u_int32_t dst_seq; u_int32_t src_ip; u_int32_t src_seq; }; // An unreacable destination, contained in an RERR struct rerr_unr_dst { u_int32_t unr_dst_ip; u_int32_t unr_dst_seq; struct rerr_unr_dst *next; }; struct rerrhdr { u_int8_t type; unsigned int dst_count; struct rerr_unr_dst *unr_dst; }; struct rerr { u_int8_t type; #if defined(__BIG_ENDIAN_BITFIELD) unsigned int n:1; unsigned int reserved:15; #elif defined(__LITTLE_ENDIAN_BITFIELD) unsigned int reserved:15; unsigned int n:1; #else #error "Please fix " #endif unsigned int dst_count:8; }; struct rerrdst { u_int32_t unr_dst_ip; u_int32_t unr_dst_seq; }; #endif