-
Notifications
You must be signed in to change notification settings - Fork 46
/
aodv_rreq.h
108 lines (97 loc) · 3.35 KB
/
aodv_rreq.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*****************************************************************************
*
* Copyright (C) 2001 Uppsala University and Ericsson AB.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Authors: Erik Nordström, <[email protected]>
*
*
*****************************************************************************/
#ifndef _AODV_RREQ_H
#define _AODV_RREQ_H
#ifndef NS_NO_GLOBALS
#include <endian.h>
#include "defs.h"
#include "seek_list.h"
#include "routing_table.h"
/* RREQ Flags: */
#define RREQ_JOIN 0x1
#define RREQ_REPAIR 0x2
#define RREQ_GRATUITOUS 0x4
#define RREQ_DEST_ONLY 0x8
typedef struct {
u_int8_t type;
#if defined(__LITTLE_ENDIAN)
u_int8_t res1:4;
u_int8_t d:1;
u_int8_t g:1;
u_int8_t r:1;
u_int8_t j:1;
#elif defined(__BIG_ENDIAN)
u_int8_t j:1; /* Join flag (multicast) */
u_int8_t r:1; /* Repair flag */
u_int8_t g:1; /* Gratuitous RREP flag */
u_int8_t d:1; /* Destination only respond */
u_int8_t res1:4;
#else
#error "Adjust your <bits/endian.h> defines"
#endif
u_int8_t res2;
u_int8_t hcnt;
u_int32_t rreq_id;
u_int32_t dest_addr;
u_int32_t dest_seqno;
u_int32_t orig_addr;
u_int32_t orig_seqno;
} RREQ;
#define RREQ_SIZE sizeof(RREQ)
/* A data structure to buffer information about received RREQ's */
struct rreq_record {
list_t l;
struct in_addr orig_addr; /* Source of the RREQ */
u_int32_t rreq_id; /* RREQ's broadcast ID */
struct timer rec_timer;
};
struct blacklist {
list_t l;
struct in_addr dest_addr;
struct timer bl_timer;
};
#endif /* NS_NO_GLOBALS */
#ifndef NS_NO_DECLARATIONS
RREQ *rreq_create(u_int8_t flags, struct in_addr dest_addr,
u_int32_t dest_seqno, struct in_addr orig_addr);
void rreq_send(struct in_addr dest_addr, u_int32_t dest_seqno, int ttl,
u_int8_t flags);
void rreq_forward(RREQ * rreq, int size, int ttl);
void rreq_process(RREQ * rreq, int rreqlen, struct in_addr ip_src,
struct in_addr ip_dst, int ip_ttl, unsigned int ifindex);
void rreq_route_discovery(struct in_addr dest_addr, u_int8_t flags,
struct ip_data *ipd);
void rreq_record_timeout(void *arg);
struct blacklist *rreq_blacklist_insert(struct in_addr dest_addr);
void rreq_blacklist_timeout(void *arg);
void rreq_local_repair(rt_table_t * rt, struct in_addr src_addr,
struct ip_data *ipd);
#ifdef NS_PORT
struct rreq_record *rreq_record_insert(struct in_addr orig_addr,
u_int32_t rreq_id);
struct rreq_record *rreq_record_find(struct in_addr orig_addr,
u_int32_t rreq_id);
struct blacklist *rreq_blacklist_find(struct in_addr dest_addr);
#endif /* NS_PORT */
#endif /* NS_NO_DECLARATIONS */
#endif /* AODV_RREQ_H */