1190207Srpaulo/* @(#) $Header: /tcpdump/master/tcpdump/aodv.h,v 1.3 2003-09-13 01:34:42 guy Exp $ (LBL) */
2127668Sbms/*
3127668Sbms * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org>
4127668Sbms * All rights reserved.
5127668Sbms *
6127668Sbms * Redistribution and use in source and binary forms, with or without
7127668Sbms * modification, are permitted provided that the following conditions
8127668Sbms * are met:
9127668Sbms * 1. Redistributions of source code must retain the above copyright
10127668Sbms *    notice, this list of conditions and the following disclaimer.
11127668Sbms * 2. Redistributions in binary form must reproduce the above copyright
12127668Sbms *    notice, this list of conditions and the following disclaimer in the
13127668Sbms *    documentation and/or other materials provided with the distribution.
14127668Sbms * 3. All advertising materials mentioning features or use of this software
15127668Sbms *    must display the following acknowledgement:
16127668Sbms *        This product includes software developed by Bruce M. Simpson.
17127668Sbms * 4. Neither the name of Bruce M. Simpson nor the names of co-
18127668Sbms *    contributors may be used to endorse or promote products derived
19127668Sbms *    from this software without specific prior written permission.
20127668Sbms *
21127668Sbms * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
22127668Sbms * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23127668Sbms * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24127668Sbms * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
25127668Sbms * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26127668Sbms * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27127668Sbms * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28127668Sbms * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29127668Sbms * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30127668Sbms * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31127668Sbms * POSSIBILITY OF SUCH DAMAGE.
32127668Sbms */
33127668Sbms#ifndef _AODV_H_
34127668Sbms#define _AODV_H_
35127668Sbms
36127668Sbmsstruct aodv_rreq {
37127668Sbms	u_int8_t	rreq_type;	/* AODV message type (1) */
38127668Sbms	u_int8_t	rreq_flags;	/* various flags */
39127668Sbms	u_int8_t	rreq_zero0;	/* reserved, set to zero */
40127668Sbms	u_int8_t	rreq_hops;	/* number of hops from originator */
41127668Sbms	u_int32_t	rreq_id;	/* request ID */
42127668Sbms	u_int32_t	rreq_da;	/* destination IPv4 address */
43127668Sbms	u_int32_t	rreq_ds;	/* destination sequence number */
44127668Sbms	u_int32_t	rreq_oa;	/* originator IPv4 address */
45127668Sbms	u_int32_t	rreq_os;	/* originator sequence number */
46127668Sbms};
47127668Sbms#ifdef INET6
48127668Sbmsstruct aodv_rreq6 {
49127668Sbms	u_int8_t	rreq_type;	/* AODV message type (1) */
50127668Sbms	u_int8_t	rreq_flags;	/* various flags */
51127668Sbms	u_int8_t	rreq_zero0;	/* reserved, set to zero */
52127668Sbms	u_int8_t	rreq_hops;	/* number of hops from originator */
53127668Sbms	u_int32_t	rreq_id;	/* request ID */
54127668Sbms	struct in6_addr	rreq_da;	/* destination IPv6 address */
55127668Sbms	u_int32_t	rreq_ds;	/* destination sequence number */
56127668Sbms	struct in6_addr	rreq_oa;	/* originator IPv6 address */
57127668Sbms	u_int32_t	rreq_os;	/* originator sequence number */
58127668Sbms};
59127668Sbmsstruct aodv_rreq6_draft_01 {
60127668Sbms	u_int8_t	rreq_type;	/* AODV message type (16) */
61127668Sbms	u_int8_t	rreq_flags;	/* various flags */
62127668Sbms	u_int8_t	rreq_zero0;	/* reserved, set to zero */
63127668Sbms	u_int8_t	rreq_hops;	/* number of hops from originator */
64127668Sbms	u_int32_t	rreq_id;	/* request ID */
65127668Sbms	u_int32_t	rreq_ds;	/* destination sequence number */
66127668Sbms	u_int32_t	rreq_os;	/* originator sequence number */
67127668Sbms	struct in6_addr	rreq_da;	/* destination IPv6 address */
68127668Sbms	struct in6_addr	rreq_oa;	/* originator IPv6 address */
69127668Sbms};
70127668Sbms#endif
71127668Sbms
72127668Sbms#define	RREQ_JOIN	0x80		/* join (reserved for multicast */
73127668Sbms#define	RREQ_REPAIR	0x40		/* repair (reserved for multicast */
74127668Sbms#define	RREQ_GRAT	0x20		/* gratuitous RREP */
75127668Sbms#define	RREQ_DEST	0x10		/* destination only */
76127668Sbms#define	RREQ_UNKNOWN	0x08		/* unknown destination sequence num */
77127668Sbms#define	RREQ_FLAGS_MASK	0xF8		/* mask for rreq_flags */
78127668Sbms
79127668Sbmsstruct aodv_rrep {
80127668Sbms	u_int8_t	rrep_type;	/* AODV message type (2) */
81127668Sbms	u_int8_t	rrep_flags;	/* various flags */
82127668Sbms	u_int8_t	rrep_ps;	/* prefix size */
83127668Sbms	u_int8_t	rrep_hops;	/* number of hops from o to d */
84127668Sbms	u_int32_t	rrep_da;	/* destination IPv4 address */
85127668Sbms	u_int32_t	rrep_ds;	/* destination sequence number */
86127668Sbms	u_int32_t	rrep_oa;	/* originator IPv4 address */
87127668Sbms	u_int32_t	rrep_life;	/* lifetime of this route */
88127668Sbms};
89127668Sbms#ifdef INET6
90127668Sbmsstruct aodv_rrep6 {
91127668Sbms	u_int8_t	rrep_type;	/* AODV message type (2) */
92127668Sbms	u_int8_t	rrep_flags;	/* various flags */
93127668Sbms	u_int8_t	rrep_ps;	/* prefix size */
94127668Sbms	u_int8_t	rrep_hops;	/* number of hops from o to d */
95127668Sbms	struct in6_addr	rrep_da;	/* destination IPv6 address */
96127668Sbms	u_int32_t	rrep_ds;	/* destination sequence number */
97127668Sbms	struct in6_addr	rrep_oa;	/* originator IPv6 address */
98127668Sbms	u_int32_t	rrep_life;	/* lifetime of this route */
99127668Sbms};
100127668Sbmsstruct aodv_rrep6_draft_01 {
101127668Sbms	u_int8_t	rrep_type;	/* AODV message type (17) */
102127668Sbms	u_int8_t	rrep_flags;	/* various flags */
103127668Sbms	u_int8_t	rrep_ps;	/* prefix size */
104127668Sbms	u_int8_t	rrep_hops;	/* number of hops from o to d */
105127668Sbms	u_int32_t	rrep_ds;	/* destination sequence number */
106127668Sbms	struct in6_addr	rrep_da;	/* destination IPv6 address */
107127668Sbms	struct in6_addr	rrep_oa;	/* originator IPv6 address */
108127668Sbms	u_int32_t	rrep_life;	/* lifetime of this route */
109127668Sbms};
110127668Sbms#endif
111127668Sbms
112127668Sbms#define	RREP_REPAIR		0x80	/* repair (reserved for multicast */
113127668Sbms#define	RREP_ACK		0x40	/* acknowledgement required */
114127668Sbms#define	RREP_FLAGS_MASK		0xC0	/* mask for rrep_flags */
115127668Sbms#define	RREP_PREFIX_MASK	0x1F	/* mask for prefix size */
116127668Sbms
117127668Sbmsstruct rerr_unreach {
118127668Sbms	u_int32_t	u_da;	/* IPv4 address */
119127668Sbms	u_int32_t	u_ds;	/* sequence number */
120127668Sbms};
121127668Sbms#ifdef INET6
122127668Sbmsstruct rerr_unreach6 {
123127668Sbms	struct in6_addr	u_da;	/* IPv6 address */
124127668Sbms	u_int32_t	u_ds;	/* sequence number */
125127668Sbms};
126127668Sbmsstruct rerr_unreach6_draft_01 {
127127668Sbms	struct in6_addr	u_da;	/* IPv6 address */
128127668Sbms	u_int32_t	u_ds;	/* sequence number */
129127668Sbms};
130127668Sbms#endif
131127668Sbms
132127668Sbmsstruct aodv_rerr {
133127668Sbms	u_int8_t	rerr_type;	/* AODV message type (3 or 18) */
134127668Sbms	u_int8_t	rerr_flags;	/* various flags */
135127668Sbms	u_int8_t	rerr_zero0;	/* reserved, set to zero */
136127668Sbms	u_int8_t	rerr_dc;	/* destination count */
137127668Sbms	union {
138127668Sbms		struct	rerr_unreach dest[1];
139127668Sbms#ifdef INET6
140127668Sbms		struct	rerr_unreach6 dest6[1];
141127668Sbms		struct	rerr_unreach6_draft_01 dest6_draft_01[1];
142127668Sbms#endif
143127668Sbms	} r;
144127668Sbms};
145127668Sbms
146127668Sbms#define RERR_NODELETE		0x80	/* don't delete the link */
147127668Sbms#define RERR_FLAGS_MASK		0x80	/* mask for rerr_flags */
148127668Sbms
149127668Sbmsstruct aodv_rrep_ack {
150127668Sbms	u_int8_t	ra_type;
151127668Sbms	u_int8_t	ra_zero0;
152127668Sbms};
153127668Sbms
154127668Sbmsunion aodv {
155127668Sbms	struct aodv_rreq rreq;
156127668Sbms	struct aodv_rrep rrep;
157127668Sbms	struct aodv_rerr rerr;
158127668Sbms	struct aodv_rrep_ack rrep_ack;
159127668Sbms#ifdef INET6
160127668Sbms	struct aodv_rreq6 rreq6;
161127668Sbms	struct aodv_rreq6_draft_01 rreq6_draft_01;
162127668Sbms	struct aodv_rrep6 rrep6;
163127668Sbms	struct aodv_rrep6_draft_01 rrep6_draft_01;
164127668Sbms#endif
165127668Sbms};
166127668Sbms
167127668Sbms#define	AODV_RREQ		1	/* route request */
168127668Sbms#define	AODV_RREP		2	/* route response */
169127668Sbms#define	AODV_RERR		3	/* error report */
170127668Sbms#define	AODV_RREP_ACK		4	/* route response acknowledgement */
171127668Sbms
172127668Sbms#define AODV_V6_DRAFT_01_RREQ		16	/* IPv6 route request */
173127668Sbms#define AODV_V6_DRAFT_01_RREP		17	/* IPv6 route response */
174127668Sbms#define AODV_V6_DRAFT_01_RERR		18	/* IPv6 error report */
175127668Sbms#define AODV_V6_DRAFT_01_RREP_ACK	19	/* IPV6 route response acknowledgment */
176127668Sbms
177127668Sbmsstruct aodv_ext {
178127668Sbms	u_int8_t	type;		/* extension type */
179127668Sbms	u_int8_t	length;		/* extension length */
180127668Sbms};
181127668Sbms
182127668Sbmsstruct aodv_hello {
183127668Sbms	struct	aodv_ext	eh;		/* extension header */
184127668Sbms	u_int32_t		interval;	/* expect my next hello in
185127668Sbms						 * (n) ms */
186127668Sbms};
187127668Sbms
188127668Sbms#define	AODV_EXT_HELLO	1
189127668Sbms
190127668Sbms#endif /* _AODV_H_ */
191