12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org>
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *        This product includes software developed by Bruce M. Simpson.
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. Neither the name of Bruce M. Simpson nor the names of co-
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    contributors may be used to endorse or promote products derived
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    from this software without specific prior written permission.
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * POSSIBILITY OF SUCH DAMAGE.
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.11 2004/03/24 00:30:19 guy Exp $ (LBL)";
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stddef.h>
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <ctype.h>
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "aodv.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_extension(const struct aodv_ext *ep, u_int length)
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct aodv_hello *ah;
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (ep->type) {
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_EXT_HELLO:
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (snapend < (u_char *) ep) {
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [|hello]");
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = min(length, (u_int)(snapend - (u_char *)ep));
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (i < sizeof(struct aodv_hello)) {
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [|hello]");
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i -= sizeof(struct aodv_hello);
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ah = (void *)ep;
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\text HELLO %ld ms",
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (unsigned long)EXTRACT_32BITS(&ah->interval));
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n\text %u %u", ep->type, ep->length);
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_rreq(const union aodv *ap, const u_char *dat, u_int length)
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rreq)) {
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rreq]");
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rreq);
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "\tdst %s seq %lu src %s seq %lu", length,
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "",
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "",
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "",
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "",
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq.rreq_hops,
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_id),
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ipaddr_string(&ap->rreq.rreq_da),
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_ds),
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ipaddr_string(&ap->rreq.rreq_oa),
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_os));
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rreq + 1), i);
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_rrep(const union aodv *ap, const u_char *dat, u_int length)
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rrep)) {
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rrep]");
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rrep);
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rrep %u %s%sprefix %u hops %u\n"
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "\tdst %s dseq %lu src %s %lu ms", length,
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "",
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ",
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep.rrep_ps & RREP_PREFIX_MASK,
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep.rrep_hops,
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ipaddr_string(&ap->rrep.rrep_da),
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_ds),
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ipaddr_string(&ap->rrep.rrep_oa),
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_life));
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rrep + 1), i);
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_rerr(const union aodv *ap, const u_char *dat, u_int length)
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct rerr_unreach *dp = NULL;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int n, trunc;
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < offsetof(struct aodv_rerr, r)) {
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rerr]");
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= offsetof(struct aodv_rerr, r);
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = &ap->rerr.r.dest[0];
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	n = ap->rerr.rerr_dc * sizeof(ap->rerr.r.dest[0]);
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rerr %s [items %u] [%u]:",
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_dc, length);
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	trunc = n - (i/sizeof(ap->rerr.r.dest[0]));
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (; i >= sizeof(ap->rerr.r.dest[0]);
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ++dp, i -= sizeof(ap->rerr.r.dest[0])) {
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" {%s}(%ld)", ipaddr_string(&dp->u_da),
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (unsigned long)EXTRACT_32BITS(&dp->u_ds));
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (trunc)
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|rerr]");
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rreq(const union aodv *ap, const u_char *dat, u_int length)
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rreq6)) {
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rreq6]");
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rreq6);
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "\tdst %s seq %lu src %s seq %lu", length,
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "",
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "",
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "",
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "",
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6.rreq_hops,
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_id),
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rreq6.rreq_da),
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_ds),
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rreq6.rreq_oa),
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_os));
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rreq6 + 1), i);
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" v6 rreq %u", length);
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rrep(const union aodv *ap, const u_char *dat, u_int length)
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rrep6)) {
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rrep6]");
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rrep6);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rrep %u %s%sprefix %u hops %u\n"
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   "\tdst %s dseq %lu src %s %lu ms", length,
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "",
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ",
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6.rrep_ps & RREP_PREFIX_MASK,
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6.rrep_hops,
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rrep6.rrep_da),
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_ds),
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rrep6.rrep_oa),
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_life));
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rrep6 + 1), i);
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rrep %u", length);
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rerr(const union aodv *ap, u_int length)
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_rerr(const union aodv *ap _U_, u_int length)
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct rerr_unreach6 *dp6 = NULL;
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i, j, n, trunc;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = length - offsetof(struct aodv_rerr, r);
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	j = sizeof(ap->rerr.r.dest6[0]);
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp6 = &ap->rerr.r.dest6[0];
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	n = ap->rerr.rerr_dc * j;
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rerr %s [items %u] [%u]:",
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_dc, length);
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	trunc = n - (i/j);
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (; i -= j >= 0; ++dp6) {
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da),
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (unsigned long)EXTRACT_32BITS(&dp6->u_ds));
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (trunc)
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|rerr]");
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rerr %u", length);
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rreq(const union aodv *ap, const u_char *dat, u_int length)
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_,
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int length)
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rreq6_draft_01)) {
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rreq6]");
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rreq6_draft_01);
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n"
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "\tdst %s seq %lu src %s seq %lu", length,
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_type & RREQ_JOIN ? "[J]" : "",
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_type & RREQ_REPAIR ? "[R]" : "",
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_type & RREQ_GRAT ? "[G]" : "",
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_type & RREQ_DEST ? "[D]" : "",
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rreq6_draft_01.rreq_hops,
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_id),
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rreq6_draft_01.rreq_da),
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_ds),
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rreq6_draft_01.rreq_oa),
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_os));
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rreq6_draft_01 + 1), i);
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rreq %u", length);
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rrep(const union aodv *ap, const u_char *dat, u_int length)
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_,
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int length)
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int i;
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = min(length, (u_int)(snapend - dat));
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < sizeof(ap->rrep6_draft_01)) {
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rrep6]");
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i -= sizeof(ap->rrep6_draft_01);
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rrep %u %s%sprefix %u hops %u\n"
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   "\tdst %s dseq %lu src %s %lu ms", length,
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6_draft_01.rrep_type & RREP_REPAIR ? "[R]" : "",
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6_draft_01.rrep_type & RREP_ACK ? "[A] " : " ",
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6_draft_01.rrep_ps & RREP_PREFIX_MASK,
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rrep6_draft_01.rrep_hops,
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rrep6_draft_01.rrep_da),
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_ds),
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ip6addr_string(&ap->rrep6_draft_01.rrep_oa),
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_life));
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= sizeof(struct aodv_ext))
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_extension((void *)(&ap->rrep6_draft_01 + 1), i);
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rrep %u", length);
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rerr(const union aodv *ap, u_int length)
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_v6_draft_01_rerr(const union aodv *ap _U_, u_int length)
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct rerr_unreach6_draft_01 *dp6 = NULL;
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i, j, n, trunc;
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = length - offsetof(struct aodv_rerr, r);
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	j = sizeof(ap->rerr.r.dest6_draft_01[0]);
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp6 = &ap->rerr.r.dest6_draft_01[0];
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	n = ap->rerr.rerr_dc * j;
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rerr %s [items %u] [%u]:",
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ap->rerr.rerr_dc, length);
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	trunc = n - (i/j);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (; i -= j >= 0; ++dp6) {
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da),
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (unsigned long)EXTRACT_32BITS(&dp6->u_ds));
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (trunc)
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|rerr]");
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rerr %u", length);
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaodv_print(const u_char *dat, u_int length, int is_ip6)
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const union aodv *ap;
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ap = (union aodv *)dat;
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend < dat) {
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (min(length, (u_int)(snapend - dat)) < sizeof(ap->rrep_ack)) {
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|aodv]");
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" aodv");
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (ap->rerr.rerr_type) {
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_RREQ:
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (is_ip6)
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_v6_rreq(ap, dat, length);
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_rreq(ap, dat, length);
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_RREP:
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (is_ip6)
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_v6_rrep(ap, dat, length);
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_rrep(ap, dat, length);
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_RERR:
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (is_ip6)
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_v6_rerr(ap, length);
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			aodv_rerr(ap, dat, length);
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_RREP_ACK:
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rrep-ack %u", length);
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_V6_DRAFT_01_RREQ:
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_v6_draft_01_rreq(ap, dat, length);
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_V6_DRAFT_01_RREP:
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_v6_draft_01_rrep(ap, dat, length);
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_V6_DRAFT_01_RERR:
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		aodv_v6_draft_01_rerr(ap, length);
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case AODV_V6_DRAFT_01_RREP_ACK:
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rrep-ack %u", length);
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %u %u", ap->rreq.rreq_type, length);
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
456