1127668Sbms/*
2127668Sbms * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org>
3127668Sbms * All rights reserved.
4127668Sbms *
5127668Sbms * Redistribution and use in source and binary forms, with or without
6127668Sbms * modification, are permitted provided that the following conditions
7127668Sbms * are met:
8127668Sbms * 1. Redistributions of source code must retain the above copyright
9127668Sbms *    notice, this list of conditions and the following disclaimer.
10127668Sbms * 2. Redistributions in binary form must reproduce the above copyright
11127668Sbms *    notice, this list of conditions and the following disclaimer in the
12127668Sbms *    documentation and/or other materials provided with the distribution.
13127668Sbms * 3. All advertising materials mentioning features or use of this software
14127668Sbms *    must display the following acknowledgement:
15127668Sbms *        This product includes software developed by Bruce M. Simpson.
16127668Sbms * 4. Neither the name of Bruce M. Simpson nor the names of co-
17127668Sbms *    contributors may be used to endorse or promote products derived
18127668Sbms *    from this software without specific prior written permission.
19127668Sbms *
20127668Sbms * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
21127668Sbms * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22127668Sbms * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23127668Sbms * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
24127668Sbms * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25127668Sbms * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26127668Sbms * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27127668Sbms * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28127668Sbms * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29127668Sbms * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30127668Sbms * POSSIBILITY OF SUCH DAMAGE.
31127668Sbms */
32127668Sbms
33127668Sbms#ifndef lint
34127668Sbmsstatic const char rcsid[] _U_ =
35190207Srpaulo    "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.11 2004-03-24 00:30:19 guy Exp $ (LBL)";
36127668Sbms#endif
37127668Sbms
38127668Sbms#ifdef HAVE_CONFIG_H
39127668Sbms#include "config.h"
40127668Sbms#endif
41127668Sbms
42127668Sbms#include <tcpdump-stdinc.h>
43127668Sbms
44127668Sbms#include <stddef.h>
45127668Sbms#include <stdio.h>
46127668Sbms#include <ctype.h>
47127668Sbms#include <string.h>
48127668Sbms
49127668Sbms#include "interface.h"
50127668Sbms#include "addrtoname.h"
51127668Sbms#include "extract.h"			/* must come after interface.h */
52127668Sbms
53127668Sbms#include "aodv.h"
54127668Sbms
55127668Sbmsstatic void
56127668Sbmsaodv_extension(const struct aodv_ext *ep, u_int length)
57127668Sbms{
58127668Sbms	u_int i;
59127668Sbms	const struct aodv_hello *ah;
60127668Sbms
61127668Sbms	switch (ep->type) {
62127668Sbms	case AODV_EXT_HELLO:
63127668Sbms		if (snapend < (u_char *) ep) {
64127668Sbms			printf(" [|hello]");
65127668Sbms			return;
66127668Sbms		}
67127668Sbms		i = min(length, (u_int)(snapend - (u_char *)ep));
68127668Sbms		if (i < sizeof(struct aodv_hello)) {
69127668Sbms			printf(" [|hello]");
70127668Sbms			return;
71127668Sbms		}
72127668Sbms		i -= sizeof(struct aodv_hello);
73127668Sbms		ah = (void *)ep;
74127668Sbms		printf("\n\text HELLO %ld ms",
75127668Sbms		    (unsigned long)EXTRACT_32BITS(&ah->interval));
76127668Sbms		break;
77127668Sbms
78127668Sbms	default:
79127668Sbms		printf("\n\text %u %u", ep->type, ep->length);
80127668Sbms		break;
81127668Sbms	}
82127668Sbms}
83127668Sbms
84127668Sbmsstatic void
85127668Sbmsaodv_rreq(const union aodv *ap, const u_char *dat, u_int length)
86127668Sbms{
87127668Sbms	u_int i;
88127668Sbms
89127668Sbms	if (snapend < dat) {
90127668Sbms		printf(" [|aodv]");
91127668Sbms		return;
92127668Sbms	}
93127668Sbms	i = min(length, (u_int)(snapend - dat));
94127668Sbms	if (i < sizeof(ap->rreq)) {
95127668Sbms		printf(" [|rreq]");
96127668Sbms		return;
97127668Sbms	}
98127668Sbms	i -= sizeof(ap->rreq);
99127668Sbms	printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
100127668Sbms	    "\tdst %s seq %lu src %s seq %lu", length,
101127668Sbms	    ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "",
102127668Sbms	    ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "",
103127668Sbms	    ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "",
104127668Sbms	    ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "",
105127668Sbms	    ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
106127668Sbms	    ap->rreq.rreq_hops,
107127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_id),
108127668Sbms	    ipaddr_string(&ap->rreq.rreq_da),
109127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_ds),
110127668Sbms	    ipaddr_string(&ap->rreq.rreq_oa),
111127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_os));
112127668Sbms	if (i >= sizeof(struct aodv_ext))
113127668Sbms		aodv_extension((void *)(&ap->rreq + 1), i);
114127668Sbms}
115127668Sbms
116127668Sbmsstatic void
117127668Sbmsaodv_rrep(const union aodv *ap, const u_char *dat, u_int length)
118127668Sbms{
119127668Sbms	u_int i;
120127668Sbms
121127668Sbms	if (snapend < dat) {
122127668Sbms		printf(" [|aodv]");
123127668Sbms		return;
124127668Sbms	}
125127668Sbms	i = min(length, (u_int)(snapend - dat));
126127668Sbms	if (i < sizeof(ap->rrep)) {
127127668Sbms		printf(" [|rrep]");
128127668Sbms		return;
129127668Sbms	}
130127668Sbms	i -= sizeof(ap->rrep);
131127668Sbms	printf(" rrep %u %s%sprefix %u hops %u\n"
132127668Sbms	    "\tdst %s dseq %lu src %s %lu ms", length,
133127668Sbms	    ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "",
134127668Sbms	    ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ",
135127668Sbms	    ap->rrep.rrep_ps & RREP_PREFIX_MASK,
136127668Sbms	    ap->rrep.rrep_hops,
137127668Sbms	    ipaddr_string(&ap->rrep.rrep_da),
138127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_ds),
139127668Sbms	    ipaddr_string(&ap->rrep.rrep_oa),
140127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_life));
141127668Sbms	if (i >= sizeof(struct aodv_ext))
142127668Sbms		aodv_extension((void *)(&ap->rrep + 1), i);
143127668Sbms}
144127668Sbms
145127668Sbmsstatic void
146127668Sbmsaodv_rerr(const union aodv *ap, const u_char *dat, u_int length)
147127668Sbms{
148127668Sbms	u_int i;
149127668Sbms	const struct rerr_unreach *dp = NULL;
150127668Sbms	int n, trunc;
151127668Sbms
152127668Sbms	if (snapend < dat) {
153127668Sbms		printf(" [|aodv]");
154127668Sbms		return;
155127668Sbms	}
156127668Sbms	i = min(length, (u_int)(snapend - dat));
157127668Sbms	if (i < offsetof(struct aodv_rerr, r)) {
158127668Sbms		printf(" [|rerr]");
159127668Sbms		return;
160127668Sbms	}
161127668Sbms	i -= offsetof(struct aodv_rerr, r);
162127668Sbms	dp = &ap->rerr.r.dest[0];
163127668Sbms	n = ap->rerr.rerr_dc * sizeof(ap->rerr.r.dest[0]);
164127668Sbms	printf(" rerr %s [items %u] [%u]:",
165127668Sbms	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
166127668Sbms	    ap->rerr.rerr_dc, length);
167127668Sbms	trunc = n - (i/sizeof(ap->rerr.r.dest[0]));
168127668Sbms	for (; i >= sizeof(ap->rerr.r.dest[0]);
169127668Sbms	    ++dp, i -= sizeof(ap->rerr.r.dest[0])) {
170127668Sbms		printf(" {%s}(%ld)", ipaddr_string(&dp->u_da),
171127668Sbms		    (unsigned long)EXTRACT_32BITS(&dp->u_ds));
172127668Sbms	}
173127668Sbms	if (trunc)
174127668Sbms		printf("[|rerr]");
175127668Sbms}
176127668Sbms
177127668Sbmsstatic void
178127668Sbms#ifdef INET6
179127668Sbmsaodv_v6_rreq(const union aodv *ap, const u_char *dat, u_int length)
180127668Sbms#else
181127668Sbmsaodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
182127668Sbms#endif
183127668Sbms{
184127668Sbms#ifdef INET6
185127668Sbms	u_int i;
186127668Sbms
187127668Sbms	if (snapend < dat) {
188127668Sbms		printf(" [|aodv]");
189127668Sbms		return;
190127668Sbms	}
191127668Sbms	i = min(length, (u_int)(snapend - dat));
192127668Sbms	if (i < sizeof(ap->rreq6)) {
193127668Sbms		printf(" [|rreq6]");
194127668Sbms		return;
195127668Sbms	}
196127668Sbms	i -= sizeof(ap->rreq6);
197127668Sbms	printf(" v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
198127668Sbms	    "\tdst %s seq %lu src %s seq %lu", length,
199127668Sbms	    ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "",
200127668Sbms	    ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "",
201127668Sbms	    ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "",
202127668Sbms	    ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "",
203127668Sbms	    ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
204127668Sbms	    ap->rreq6.rreq_hops,
205127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_id),
206127668Sbms	    ip6addr_string(&ap->rreq6.rreq_da),
207127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_ds),
208127668Sbms	    ip6addr_string(&ap->rreq6.rreq_oa),
209127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_os));
210127668Sbms	if (i >= sizeof(struct aodv_ext))
211127668Sbms		aodv_extension((void *)(&ap->rreq6 + 1), i);
212127668Sbms#else
213127668Sbms	printf(" v6 rreq %u", length);
214127668Sbms#endif
215127668Sbms}
216127668Sbms
217127668Sbmsstatic void
218127668Sbms#ifdef INET6
219127668Sbmsaodv_v6_rrep(const union aodv *ap, const u_char *dat, u_int length)
220127668Sbms#else
221127668Sbmsaodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
222127668Sbms#endif
223127668Sbms{
224127668Sbms#ifdef INET6
225127668Sbms	u_int i;
226127668Sbms
227127668Sbms	if (snapend < dat) {
228127668Sbms		printf(" [|aodv]");
229127668Sbms		return;
230127668Sbms	}
231127668Sbms	i = min(length, (u_int)(snapend - dat));
232127668Sbms	if (i < sizeof(ap->rrep6)) {
233127668Sbms		printf(" [|rrep6]");
234127668Sbms		return;
235127668Sbms	}
236127668Sbms	i -= sizeof(ap->rrep6);
237127668Sbms	printf(" rrep %u %s%sprefix %u hops %u\n"
238127668Sbms	   "\tdst %s dseq %lu src %s %lu ms", length,
239127668Sbms	    ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "",
240127668Sbms	    ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ",
241127668Sbms	    ap->rrep6.rrep_ps & RREP_PREFIX_MASK,
242127668Sbms	    ap->rrep6.rrep_hops,
243127668Sbms	    ip6addr_string(&ap->rrep6.rrep_da),
244127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_ds),
245127668Sbms	    ip6addr_string(&ap->rrep6.rrep_oa),
246127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_life));
247127668Sbms	if (i >= sizeof(struct aodv_ext))
248127668Sbms		aodv_extension((void *)(&ap->rrep6 + 1), i);
249127668Sbms#else
250127668Sbms	printf(" rrep %u", length);
251127668Sbms#endif
252127668Sbms}
253127668Sbms
254127668Sbmsstatic void
255127668Sbms#ifdef INET6
256127668Sbmsaodv_v6_rerr(const union aodv *ap, u_int length)
257127668Sbms#else
258127668Sbmsaodv_v6_rerr(const union aodv *ap _U_, u_int length)
259127668Sbms#endif
260127668Sbms{
261127668Sbms#ifdef INET6
262127668Sbms	const struct rerr_unreach6 *dp6 = NULL;
263127668Sbms	int i, j, n, trunc;
264127668Sbms
265127668Sbms	i = length - offsetof(struct aodv_rerr, r);
266127668Sbms	j = sizeof(ap->rerr.r.dest6[0]);
267127668Sbms	dp6 = &ap->rerr.r.dest6[0];
268127668Sbms	n = ap->rerr.rerr_dc * j;
269127668Sbms	printf(" rerr %s [items %u] [%u]:",
270127668Sbms	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
271127668Sbms	    ap->rerr.rerr_dc, length);
272127668Sbms	trunc = n - (i/j);
273127668Sbms	for (; i -= j >= 0; ++dp6) {
274127668Sbms		printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da),
275127668Sbms		    (unsigned long)EXTRACT_32BITS(&dp6->u_ds));
276127668Sbms	}
277127668Sbms	if (trunc)
278127668Sbms		printf("[|rerr]");
279127668Sbms#else
280127668Sbms	printf(" rerr %u", length);
281127668Sbms#endif
282127668Sbms}
283127668Sbms
284127668Sbmsstatic void
285127668Sbms#ifdef INET6
286127668Sbmsaodv_v6_draft_01_rreq(const union aodv *ap, const u_char *dat, u_int length)
287127668Sbms#else
288127668Sbmsaodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_,
289127668Sbms    u_int length)
290127668Sbms#endif
291127668Sbms{
292127668Sbms#ifdef INET6
293127668Sbms	u_int i;
294127668Sbms
295127668Sbms	if (snapend < dat) {
296127668Sbms		printf(" [|aodv]");
297127668Sbms		return;
298127668Sbms	}
299127668Sbms	i = min(length, (u_int)(snapend - dat));
300127668Sbms	if (i < sizeof(ap->rreq6_draft_01)) {
301127668Sbms		printf(" [|rreq6]");
302127668Sbms		return;
303127668Sbms	}
304127668Sbms	i -= sizeof(ap->rreq6_draft_01);
305127668Sbms	printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
306127668Sbms	    "\tdst %s seq %lu src %s seq %lu", length,
307127668Sbms	    ap->rreq6_draft_01.rreq_type & RREQ_JOIN ? "[J]" : "",
308127668Sbms	    ap->rreq6_draft_01.rreq_type & RREQ_REPAIR ? "[R]" : "",
309127668Sbms	    ap->rreq6_draft_01.rreq_type & RREQ_GRAT ? "[G]" : "",
310127668Sbms	    ap->rreq6_draft_01.rreq_type & RREQ_DEST ? "[D]" : "",
311127668Sbms	    ap->rreq6_draft_01.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
312127668Sbms	    ap->rreq6_draft_01.rreq_hops,
313127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_id),
314127668Sbms	    ip6addr_string(&ap->rreq6_draft_01.rreq_da),
315127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_ds),
316127668Sbms	    ip6addr_string(&ap->rreq6_draft_01.rreq_oa),
317127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_os));
318127668Sbms	if (i >= sizeof(struct aodv_ext))
319127668Sbms		aodv_extension((void *)(&ap->rreq6_draft_01 + 1), i);
320127668Sbms#else
321127668Sbms	printf(" rreq %u", length);
322127668Sbms#endif
323127668Sbms}
324127668Sbms
325127668Sbmsstatic void
326127668Sbms#ifdef INET6
327127668Sbmsaodv_v6_draft_01_rrep(const union aodv *ap, const u_char *dat, u_int length)
328127668Sbms#else
329127668Sbmsaodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_,
330127668Sbms    u_int length)
331127668Sbms#endif
332127668Sbms{
333127668Sbms#ifdef INET6
334127668Sbms	u_int i;
335127668Sbms
336127668Sbms	if (snapend < dat) {
337127668Sbms		printf(" [|aodv]");
338127668Sbms		return;
339127668Sbms	}
340127668Sbms	i = min(length, (u_int)(snapend - dat));
341127668Sbms	if (i < sizeof(ap->rrep6_draft_01)) {
342127668Sbms		printf(" [|rrep6]");
343127668Sbms		return;
344127668Sbms	}
345127668Sbms	i -= sizeof(ap->rrep6_draft_01);
346127668Sbms	printf(" rrep %u %s%sprefix %u hops %u\n"
347127668Sbms	   "\tdst %s dseq %lu src %s %lu ms", length,
348127668Sbms	    ap->rrep6_draft_01.rrep_type & RREP_REPAIR ? "[R]" : "",
349127668Sbms	    ap->rrep6_draft_01.rrep_type & RREP_ACK ? "[A] " : " ",
350127668Sbms	    ap->rrep6_draft_01.rrep_ps & RREP_PREFIX_MASK,
351127668Sbms	    ap->rrep6_draft_01.rrep_hops,
352127668Sbms	    ip6addr_string(&ap->rrep6_draft_01.rrep_da),
353127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_ds),
354127668Sbms	    ip6addr_string(&ap->rrep6_draft_01.rrep_oa),
355127668Sbms	    (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_life));
356127668Sbms	if (i >= sizeof(struct aodv_ext))
357127668Sbms		aodv_extension((void *)(&ap->rrep6_draft_01 + 1), i);
358127668Sbms#else
359127668Sbms	printf(" rrep %u", length);
360127668Sbms#endif
361127668Sbms}
362127668Sbms
363127668Sbmsstatic void
364127668Sbms#ifdef INET6
365127668Sbmsaodv_v6_draft_01_rerr(const union aodv *ap, u_int length)
366127668Sbms#else
367127668Sbmsaodv_v6_draft_01_rerr(const union aodv *ap _U_, u_int length)
368127668Sbms#endif
369127668Sbms{
370127668Sbms#ifdef INET6
371127668Sbms	const struct rerr_unreach6_draft_01 *dp6 = NULL;
372127668Sbms	int i, j, n, trunc;
373127668Sbms
374127668Sbms	i = length - offsetof(struct aodv_rerr, r);
375127668Sbms	j = sizeof(ap->rerr.r.dest6_draft_01[0]);
376127668Sbms	dp6 = &ap->rerr.r.dest6_draft_01[0];
377127668Sbms	n = ap->rerr.rerr_dc * j;
378127668Sbms	printf(" rerr %s [items %u] [%u]:",
379127668Sbms	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
380127668Sbms	    ap->rerr.rerr_dc, length);
381127668Sbms	trunc = n - (i/j);
382127668Sbms	for (; i -= j >= 0; ++dp6) {
383127668Sbms		printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da),
384127668Sbms		    (unsigned long)EXTRACT_32BITS(&dp6->u_ds));
385127668Sbms	}
386127668Sbms	if (trunc)
387127668Sbms		printf("[|rerr]");
388127668Sbms#else
389127668Sbms	printf(" rerr %u", length);
390127668Sbms#endif
391127668Sbms}
392127668Sbms
393127668Sbmsvoid
394127668Sbmsaodv_print(const u_char *dat, u_int length, int is_ip6)
395127668Sbms{
396127668Sbms	const union aodv *ap;
397127668Sbms
398127668Sbms	ap = (union aodv *)dat;
399127668Sbms	if (snapend < dat) {
400127668Sbms		printf(" [|aodv]");
401127668Sbms		return;
402127668Sbms	}
403127668Sbms	if (min(length, (u_int)(snapend - dat)) < sizeof(ap->rrep_ack)) {
404127668Sbms		printf(" [|aodv]");
405127668Sbms		return;
406127668Sbms	}
407127668Sbms	printf(" aodv");
408127668Sbms
409127668Sbms	switch (ap->rerr.rerr_type) {
410127668Sbms
411127668Sbms	case AODV_RREQ:
412127668Sbms		if (is_ip6)
413127668Sbms			aodv_v6_rreq(ap, dat, length);
414127668Sbms		else
415127668Sbms			aodv_rreq(ap, dat, length);
416127668Sbms		break;
417127668Sbms
418127668Sbms	case AODV_RREP:
419127668Sbms		if (is_ip6)
420127668Sbms			aodv_v6_rrep(ap, dat, length);
421127668Sbms		else
422127668Sbms			aodv_rrep(ap, dat, length);
423127668Sbms		break;
424127668Sbms
425127668Sbms	case AODV_RERR:
426127668Sbms		if (is_ip6)
427127668Sbms			aodv_v6_rerr(ap, length);
428127668Sbms		else
429127668Sbms			aodv_rerr(ap, dat, length);
430127668Sbms		break;
431127668Sbms
432127668Sbms	case AODV_RREP_ACK:
433127668Sbms		printf(" rrep-ack %u", length);
434127668Sbms		break;
435127668Sbms
436127668Sbms	case AODV_V6_DRAFT_01_RREQ:
437127668Sbms		aodv_v6_draft_01_rreq(ap, dat, length);
438127668Sbms		break;
439127668Sbms
440127668Sbms	case AODV_V6_DRAFT_01_RREP:
441127668Sbms		aodv_v6_draft_01_rrep(ap, dat, length);
442127668Sbms		break;
443127668Sbms
444127668Sbms	case AODV_V6_DRAFT_01_RERR:
445127668Sbms		aodv_v6_draft_01_rerr(ap, length);
446127668Sbms		break;
447127668Sbms
448127668Sbms	case AODV_V6_DRAFT_01_RREP_ACK:
449127668Sbms		printf(" rrep-ack %u", length);
450127668Sbms		break;
451127668Sbms
452127668Sbms	default:
453127668Sbms		printf(" %u %u", ap->rreq.rreq_type, length);
454127668Sbms	}
455127668Sbms}
456