2 * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by Bruce M. Simpson.
16 * 4. Neither the name of Bruce M. Simpson nor the names of co-
17 * contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
34 static const char rcsid
[] _U_
=
35 "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.11 2004-03-24 00:30:19 guy Exp $ (LBL)";
42 #include <tcpdump-stdinc.h>
49 #include "interface.h"
50 #include "addrtoname.h"
51 #include "extract.h" /* must come after interface.h */
56 aodv_extension(const struct aodv_ext
*ep
, u_int length
)
59 const struct aodv_hello
*ah
;
63 if (snapend
< (u_char
*) ep
) {
67 i
= min(length
, (u_int
)(snapend
- (u_char
*)ep
));
68 if (i
< sizeof(struct aodv_hello
)) {
72 i
-= sizeof(struct aodv_hello
);
74 printf("\n\text HELLO %ld ms",
75 (unsigned long)EXTRACT_32BITS(&ah
->interval
));
79 printf("\n\text %u %u", ep
->type
, ep
->length
);
85 aodv_rreq(const struct aodv_rreq
*ap
, const u_char
*dat
, u_int length
)
93 i
= min(length
, (u_int
)(snapend
- dat
));
94 if (i
< sizeof(*ap
)) {
99 printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
100 "\tdst %s seq %lu src %s seq %lu", length
,
101 ap
->rreq_type
& RREQ_JOIN
? "[J]" : "",
102 ap
->rreq_type
& RREQ_REPAIR
? "[R]" : "",
103 ap
->rreq_type
& RREQ_GRAT
? "[G]" : "",
104 ap
->rreq_type
& RREQ_DEST
? "[D]" : "",
105 ap
->rreq_type
& RREQ_UNKNOWN
? "[U] " : " ",
107 (unsigned long)EXTRACT_32BITS(&ap
->rreq_id
),
108 ipaddr_string(&ap
->rreq_da
),
109 (unsigned long)EXTRACT_32BITS(&ap
->rreq_ds
),
110 ipaddr_string(&ap
->rreq_oa
),
111 (unsigned long)EXTRACT_32BITS(&ap
->rreq_os
));
112 if (i
>= sizeof(struct aodv_ext
))
113 aodv_extension((void *)(ap
+ 1), i
);
117 aodv_rrep(const struct aodv_rrep
*ap
, const u_char
*dat
, u_int length
)
125 i
= min(length
, (u_int
)(snapend
- dat
));
126 if (i
< sizeof(*ap
)) {
131 printf(" rrep %u %s%sprefix %u hops %u\n"
132 "\tdst %s dseq %lu src %s %lu ms", length
,
133 ap
->rrep_type
& RREP_REPAIR
? "[R]" : "",
134 ap
->rrep_type
& RREP_ACK
? "[A] " : " ",
135 ap
->rrep_ps
& RREP_PREFIX_MASK
,
137 ipaddr_string(&ap
->rrep_da
),
138 (unsigned long)EXTRACT_32BITS(&ap
->rrep_ds
),
139 ipaddr_string(&ap
->rrep_oa
),
140 (unsigned long)EXTRACT_32BITS(&ap
->rrep_life
));
141 if (i
>= sizeof(struct aodv_ext
))
142 aodv_extension((void *)(ap
+ 1), i
);
146 aodv_rerr(const struct aodv_rerr
*ap
, const u_char
*dat
, u_int length
)
149 const struct rerr_unreach
*dp
;
155 i
= min(length
, (u_int
)(snapend
- dat
));
156 if (i
< sizeof(*ap
)) {
161 printf(" rerr %s [items %u] [%u]:",
162 ap
->rerr_flags
& RERR_NODELETE
? "[D]" : "",
163 ap
->rerr_dc
, length
);
164 dp
= (struct rerr_unreach
*)(void *)(ap
+ 1);
165 for (dc
= ap
->rerr_dc
; dc
!= 0 && i
>= sizeof(*dp
);
166 ++dp
, --dc
, i
-= sizeof(*dp
)) {
167 printf(" {%s}(%ld)", ipaddr_string(&dp
->u_da
),
168 (unsigned long)EXTRACT_32BITS(&dp
->u_ds
));
170 if ((i
% sizeof(*dp
)) != 0)
176 aodv_v6_rreq(const struct aodv_rreq6
*ap
, const u_char
*dat
, u_int length
)
178 aodv_v6_rreq(const struct aodv_rreq6
*ap _U_
, const u_char
*dat _U_
, u_int length
)
188 i
= min(length
, (u_int
)(snapend
- dat
));
189 if (i
< sizeof(*ap
)) {
194 printf(" v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
195 "\tdst %s seq %lu src %s seq %lu", length
,
196 ap
->rreq_type
& RREQ_JOIN
? "[J]" : "",
197 ap
->rreq_type
& RREQ_REPAIR
? "[R]" : "",
198 ap
->rreq_type
& RREQ_GRAT
? "[G]" : "",
199 ap
->rreq_type
& RREQ_DEST
? "[D]" : "",
200 ap
->rreq_type
& RREQ_UNKNOWN
? "[U] " : " ",
202 (unsigned long)EXTRACT_32BITS(&ap
->rreq_id
),
203 ip6addr_string(&ap
->rreq_da
),
204 (unsigned long)EXTRACT_32BITS(&ap
->rreq_ds
),
205 ip6addr_string(&ap
->rreq_oa
),
206 (unsigned long)EXTRACT_32BITS(&ap
->rreq_os
));
207 if (i
>= sizeof(struct aodv_ext
))
208 aodv_extension((void *)(ap
+ 1), i
);
210 printf(" v6 rreq %u", length
);
216 aodv_v6_rrep(const struct aodv_rrep6
*ap
, const u_char
*dat
, u_int length
)
218 aodv_v6_rrep(const struct aodv_rrep6
*ap _U_
, const u_char
*dat _U_
, u_int length
)
228 i
= min(length
, (u_int
)(snapend
- dat
));
229 if (i
< sizeof(*ap
)) {
234 printf(" rrep %u %s%sprefix %u hops %u\n"
235 "\tdst %s dseq %lu src %s %lu ms", length
,
236 ap
->rrep_type
& RREP_REPAIR
? "[R]" : "",
237 ap
->rrep_type
& RREP_ACK
? "[A] " : " ",
238 ap
->rrep_ps
& RREP_PREFIX_MASK
,
240 ip6addr_string(&ap
->rrep_da
),
241 (unsigned long)EXTRACT_32BITS(&ap
->rrep_ds
),
242 ip6addr_string(&ap
->rrep_oa
),
243 (unsigned long)EXTRACT_32BITS(&ap
->rrep_life
));
244 if (i
>= sizeof(struct aodv_ext
))
245 aodv_extension((void *)(ap
+ 1), i
);
247 printf(" rrep %u", length
);
253 aodv_v6_rerr(const struct aodv_rerr
*ap
, const u_char
*dat
, u_int length
)
255 aodv_v6_rerr(const struct aodv_rerr
*ap _U_
, const u_char
*dat
, u_int length
)
260 const struct rerr_unreach6
*dp6
;
266 i
= min(length
, (u_int
)(snapend
- dat
));
267 if (i
< sizeof(*ap
)) {
272 printf(" rerr %s [items %u] [%u]:",
273 ap
->rerr_flags
& RERR_NODELETE
? "[D]" : "",
274 ap
->rerr_dc
, length
);
275 dp6
= (struct rerr_unreach6
*)(void *)(ap
+ 1);
276 for (dc
= ap
->rerr_dc
; dc
!= 0 && i
>= sizeof(*dp6
);
277 ++dp6
, --dc
, i
-= sizeof(*dp6
)) {
278 printf(" {%s}(%ld)", ip6addr_string(&dp6
->u_da
),
279 (unsigned long)EXTRACT_32BITS(&dp6
->u_ds
));
281 if ((i
% sizeof(*dp6
)) != 0)
284 printf(" rerr %u", length
);
290 aodv_v6_draft_01_rreq(const struct aodv_rreq6_draft_01
*ap
, const u_char
*dat
, u_int length
)
292 aodv_v6_draft_01_rreq(const struct aodv_rreq6_draft_01
*ap _U_
, const u_char
*dat _U_
, u_int length
)
302 i
= min(length
, (u_int
)(snapend
- dat
));
303 if (i
< sizeof(*ap
)) {
308 printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
309 "\tdst %s seq %lu src %s seq %lu", length
,
310 ap
->rreq_type
& RREQ_JOIN
? "[J]" : "",
311 ap
->rreq_type
& RREQ_REPAIR
? "[R]" : "",
312 ap
->rreq_type
& RREQ_GRAT
? "[G]" : "",
313 ap
->rreq_type
& RREQ_DEST
? "[D]" : "",
314 ap
->rreq_type
& RREQ_UNKNOWN
? "[U] " : " ",
316 (unsigned long)EXTRACT_32BITS(&ap
->rreq_id
),
317 ip6addr_string(&ap
->rreq_da
),
318 (unsigned long)EXTRACT_32BITS(&ap
->rreq_ds
),
319 ip6addr_string(&ap
->rreq_oa
),
320 (unsigned long)EXTRACT_32BITS(&ap
->rreq_os
));
321 if (i
>= sizeof(struct aodv_ext
))
322 aodv_extension((void *)(ap
+ 1), i
);
324 printf(" rreq %u", length
);
330 aodv_v6_draft_01_rrep(const struct aodv_rrep6_draft_01
*ap
, const u_char
*dat
, u_int length
)
332 aodv_v6_draft_01_rrep(const struct aodv_rrep6_draft_01
*ap _U_
, const u_char
*dat _U_
, u_int length
)
342 i
= min(length
, (u_int
)(snapend
- dat
));
343 if (i
< sizeof(*ap
)) {
348 printf(" rrep %u %s%sprefix %u hops %u\n"
349 "\tdst %s dseq %lu src %s %lu ms", length
,
350 ap
->rrep_type
& RREP_REPAIR
? "[R]" : "",
351 ap
->rrep_type
& RREP_ACK
? "[A] " : " ",
352 ap
->rrep_ps
& RREP_PREFIX_MASK
,
354 ip6addr_string(&ap
->rrep_da
),
355 (unsigned long)EXTRACT_32BITS(&ap
->rrep_ds
),
356 ip6addr_string(&ap
->rrep_oa
),
357 (unsigned long)EXTRACT_32BITS(&ap
->rrep_life
));
358 if (i
>= sizeof(struct aodv_ext
))
359 aodv_extension((void *)(ap
+ 1), i
);
361 printf(" rrep %u", length
);
367 aodv_v6_draft_01_rerr(const struct aodv_rerr
*ap
, const u_char
*dat
, u_int length
)
369 aodv_v6_draft_01_rerr(const struct aodv_rerr
*ap _U_
, const u_char
*dat
, u_int length
)
374 const struct rerr_unreach6_draft_01
*dp6
;
380 i
= min(length
, (u_int
)(snapend
- dat
));
381 if (i
< sizeof(*ap
)) {
386 printf(" rerr %s [items %u] [%u]:",
387 ap
->rerr_flags
& RERR_NODELETE
? "[D]" : "",
388 ap
->rerr_dc
, length
);
389 dp6
= (struct rerr_unreach6_draft_01
*)(void *)(ap
+ 1);
390 for (dc
= ap
->rerr_dc
; dc
!= 0 && i
>= sizeof(*dp6
);
391 ++dp6
, --dc
, i
-= sizeof(*dp6
)) {
392 printf(" {%s}(%ld)", ip6addr_string(&dp6
->u_da
),
393 (unsigned long)EXTRACT_32BITS(&dp6
->u_ds
));
395 if ((i
% sizeof(*dp6
)) != 0)
398 printf(" rerr %u", length
);
403 aodv_print(const u_char
*dat
, u_int length
, int is_ip6
)
408 * The message type is the first byte; make sure we have it
419 aodv_v6_rreq((const struct aodv_rreq6
*)dat
, dat
, length
);
421 aodv_rreq((const struct aodv_rreq
*)dat
, dat
, length
);
426 aodv_v6_rrep((const struct aodv_rrep6
*)dat
, dat
, length
);
428 aodv_rrep((const struct aodv_rrep
*)dat
, dat
, length
);
433 aodv_v6_rerr((const struct aodv_rerr
*)dat
, dat
, length
);
435 aodv_rerr((const struct aodv_rerr
*)dat
, dat
, length
);
439 printf(" rrep-ack %u", length
);
442 case AODV_V6_DRAFT_01_RREQ
:
443 aodv_v6_draft_01_rreq((const struct aodv_rreq6_draft_01
*)dat
, dat
, length
);
446 case AODV_V6_DRAFT_01_RREP
:
447 aodv_v6_draft_01_rrep((const struct aodv_rrep6_draft_01
*)dat
, dat
, length
);
450 case AODV_V6_DRAFT_01_RERR
:
451 aodv_v6_draft_01_rerr((const struct aodv_rerr
*)dat
, dat
, length
);
454 case AODV_V6_DRAFT_01_RREP_ACK
:
455 printf(" rrep-ack %u", length
);
459 printf(" type %u %u", msg_type
, length
);