12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 2001 WIDE Project.
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. Neither the name of the project nor the names of its contributors
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    may be used to endorse or promote products derived from this software
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    without specific prior written permission.
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE.
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
30892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nameser.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"                    /* must come after interface.h */
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* BIND9 lib/lwres/include/lwres */
47892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestypedef uint32_t lwres_uint32_t;
48892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestypedef uint16_t lwres_uint16_t;
49892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestypedef uint8_t lwres_uint8_t;
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lwres_lwpacket {
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t		length;
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t		version;
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t		pktflags;
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t		serial;
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t		opcode;
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t		result;
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t		recvlength;
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t		authtype;
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t		authlength;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_LWPACKETFLAG_RESPONSE	0x0001U	/* if set, pkt is a response */
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_LWPACKETVERSION_0		0
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_FLAG_TRUSTNOTREQUIRED	0x00000001U
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_FLAG_SECUREDATA		0x00000002U
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * no-op
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_OPCODE_NOOP		0x00000000U
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			datalength;
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* data follows */
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_nooprequest_t;
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			datalength;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* data follows */
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_noopresponse_t;
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * get addresses by name
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_OPCODE_GETADDRSBYNAME	0x00010001U
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct lwres_addr lwres_addr_t;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lwres_addr {
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			family;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			length;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* address folows */
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			addrtypes;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			namelen;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* name follows */
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_gabnrequest_t;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			naliases;
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			naddrs;
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			realnamelen;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* aliases follows */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* addrs follows */
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* realname follows */
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_gabnresponse_t;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * get name by address
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_OPCODE_GETNAMEBYADDR	0x00010002U
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_addr_t			addr;
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* addr body follows */
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_gnbarequest_t;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			naliases;
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			realnamelen;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* aliases follows */
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* realname follows */
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_gnbaresponse_t;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * get rdata by name
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_OPCODE_GETRDATABYNAME	0x00010003U
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			rdclass;
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			rdtype;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			namelen;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* name follows */
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_grbnrequest_t;
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef struct {
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* public */
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			flags;
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			rdclass;
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			rdtype;
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint32_t			ttl;
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			nrdatas;
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lwres_uint16_t			nsigs;
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* realname here (len + name) */
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* rdata here (len + name) */
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* signatures here (len + name) */
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} lwres_grbnresponse_t;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRDATA_VALIDATED	0x00000001
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_ADDRTYPE_V4		0x00000001U	/* ipv4 */
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_ADDRTYPE_V6		0x00000002U	/* ipv6 */
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_MAX_ALIASES		16		/* max # of aliases */
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LWRES_MAX_ADDRS			64		/* max # of addrs */
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok opcode[] = {
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LWRES_OPCODE_NOOP,		"noop", },
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LWRES_OPCODE_GETADDRSBYNAME,	"getaddrsbyname", },
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LWRES_OPCODE_GETNAMEBYADDR,	"getnamebyaddr", },
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LWRES_OPCODE_GETRDATABYNAME,	"getrdatabyname", },
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0, 				NULL, },
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print-domain.c */
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrallextern const struct tok ns_type2str[];
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrallextern const struct tok ns_class2str[];
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
187892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheslwres_printname(netdissect_options *ndo,
188892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                size_t l, const char *p0)
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *p;
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	size_t i;
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = p0;
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* + 1 for terminating \0 */
195892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (p + l + 1 > (const char *)ndo->ndo_snapend)
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, " "));
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < l; i++)
200892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		safeputchar(ndo, *p++);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p++;	/* skip terminating \0 */
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p - p0;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  trunc:
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
210892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheslwres_printnamelen(netdissect_options *ndo,
211892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                   const char *p)
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
213892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t l;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int advance;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
216892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (p + 2 > (const char *)ndo->ndo_snapend)
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	l = EXTRACT_16BITS(p);
219892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	advance = lwres_printname(ndo, l, p + 2);
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (advance < 0)
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 2 + advance;
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  trunc:
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
229892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheslwres_printbinlen(netdissect_options *ndo,
230892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                  const char *p0)
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *p;
233892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t l;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = p0;
237892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (p + 2 > (const char *)ndo->ndo_snapend)
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	l = EXTRACT_16BITS(p);
240892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (p + 2 + l > (const char *)ndo->ndo_snapend)
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += 2;
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < l; i++)
244892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "%02x", *p++));
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p - p0;
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  trunc:
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
252892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheslwres_printaddr(netdissect_options *ndo,
253892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                lwres_addr_t *ap)
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
255892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t l;
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *p;
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
259892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(ap->length);
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	l = EXTRACT_16BITS(&ap->length);
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* XXX ap points to packed struct */
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (const char *)&ap->length + sizeof(ap->length);
263892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK2(*p, l);
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (EXTRACT_32BITS(&ap->family)) {
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:	/* IPv4 */
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (l < 4)
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return -1;
269892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " %s", ipaddr_string(ndo, p)));
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p += sizeof(struct in_addr);
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:	/* IPv6 */
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (l < 16)
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return -1;
276892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " %s", ip6addr_string(ndo, p)));
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p += sizeof(struct in6_addr);
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
281892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " %u/", EXTRACT_32BITS(&ap->family)));
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < l; i++)
283892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%02x", *p++));
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p - (const char *)ap;
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  trunc:
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
293892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheslwres_print(netdissect_options *ndo,
294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes            register const u_char *bp, u_int length)
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct lwres_lwpacket *np;
297892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t v;
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *s;
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int response;
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int advance;
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int unsupported = 0;
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	np = (const struct lwres_lwpacket *)bp;
304892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(np->authlength);
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
306892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, " lwres"));
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	v = EXTRACT_16BITS(&np->version);
308892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (ndo->ndo_vflag || v != LWRES_LWPACKETVERSION_0)
309892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " v%u", v));
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v != LWRES_LWPACKETVERSION_0) {
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = (const char *)np + EXTRACT_32BITS(&np->length);
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto tail;
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	response = EXTRACT_16BITS(&np->pktflags) & LWRES_LWPACKETFLAG_RESPONSE;
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* opcode and pktflags */
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	v = EXTRACT_32BITS(&np->opcode);
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	s = tok2str(opcode, "#0x%x", v);
320892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, " %s%s", s, response ? "" : "?"));
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* pktflags */
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	v = EXTRACT_16BITS(&np->pktflags);
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v & ~LWRES_LWPACKETFLAG_RESPONSE)
325892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "[0x%x]", v));
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
327892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (ndo->ndo_vflag > 1) {
328892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " ("));	/*)*/
329892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "serial:0x%x", EXTRACT_32BITS(&np->serial)));
330892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " result:0x%x", EXTRACT_32BITS(&np->result)));
331892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " recvlen:%u", EXTRACT_32BITS(&np->recvlength)));
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* BIND910: not used */
333892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (ndo->ndo_vflag > 2) {
334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " authtype:0x%x", EXTRACT_16BITS(&np->authtype)));
335892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " authlen:%u", EXTRACT_16BITS(&np->authlength)));
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*(*/
338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ")"));
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* per-opcode content */
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!response) {
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * queries
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_gabnrequest_t *gabn;
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_gnbarequest_t *gnba;
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_grbnrequest_t *grbn;
349892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		uint32_t l;
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		gabn = NULL;
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		gnba = NULL;
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		grbn = NULL;
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (EXTRACT_32BITS(&np->opcode)) {
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_NOOP:
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETADDRSBYNAME:
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gabn = (lwres_gabnrequest_t *)(np + 1);
360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(gabn->namelen);
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX gabn points to packed struct */
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&gabn->namelen +
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(gabn->namelen);
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			l = EXTRACT_16BITS(&gabn->namelen);
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&gabn->flags)));
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			v = EXTRACT_32BITS(&gabn->addrtypes);
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (v & (LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) {
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case LWRES_ADDRTYPE_V4:
375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " IPv4"));
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case LWRES_ADDRTYPE_V6:
378892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " IPv6"));
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6:
381892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " IPv4/6"));
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v & ~(LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6))
385892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, "[0x%x]", v));
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printname(ndo, l, s);
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETNAMEBYADDR:
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gnba = (lwres_gnbarequest_t *)(np + 1);
394892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(gnba->addr);
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
397892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
398892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&gnba->flags)));
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&gnba->addr;
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
404892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printaddr(ndo, &gnba->addr);
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETRDATABYNAME:
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX no trace, not tested */
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			grbn = (lwres_grbnrequest_t *)(np + 1);
412892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(grbn->namelen);
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
415892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
416892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
417892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&grbn->flags)));
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
420892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			    EXTRACT_16BITS(&grbn->rdtype))));
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
423892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
424892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_16BITS(&grbn->rdclass))));
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX grbn points to packed struct */
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&grbn->namelen +
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(grbn->namelen);
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			l = EXTRACT_16BITS(&grbn->namelen);
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printname(ndo, l, s);
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsupported++;
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * responses
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_gabnresponse_t *gabn;
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_gnbaresponse_t *gnba;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lwres_grbnresponse_t *grbn;
448892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		uint32_t l, na;
449892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		uint32_t i;
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		gabn = NULL;
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		gnba = NULL;
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		grbn = NULL;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (EXTRACT_32BITS(&np->opcode)) {
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_NOOP:
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETADDRSBYNAME:
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gabn = (lwres_gabnresponse_t *)(np + 1);
460892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(gabn->realnamelen);
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX gabn points to packed struct */
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&gabn->realnamelen +
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(gabn->realnamelen);
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			l = EXTRACT_16BITS(&gabn->realnamelen);
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
467892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
468892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
469892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&gabn->flags)));
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
472892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&gabn->naliases),
473892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			    EXTRACT_16BITS(&gabn->naddrs)));
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
475892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printname(ndo, l, s);
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* aliases */
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			na = EXTRACT_16BITS(&gabn->naliases);
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < na; i++) {
483892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				advance = lwres_printnamelen(ndo, s);
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (advance < 0)
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				s += advance;
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* addrs */
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			na = EXTRACT_16BITS(&gabn->naddrs);
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < na; i++) {
492892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				advance = lwres_printaddr(ndo, (lwres_addr_t *)s);
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (advance < 0)
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				s += advance;
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETNAMEBYADDR:
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gnba = (lwres_gnbaresponse_t *)(np + 1);
500892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(gnba->realnamelen);
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX gnba points to packed struct */
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&gnba->realnamelen +
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(gnba->realnamelen);
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			l = EXTRACT_16BITS(&gnba->realnamelen);
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
507892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
508892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
509892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&gnba->flags)));
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " %u", EXTRACT_16BITS(&gnba->naliases)));
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
514892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printname(ndo, l, s);
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* aliases */
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			na = EXTRACT_16BITS(&gnba->naliases);
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < na; i++) {
522892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				advance = lwres_printnamelen(ndo, s);
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (advance < 0)
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				s += advance;
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case LWRES_OPCODE_GETRDATABYNAME:
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX no trace, not tested */
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			grbn = (lwres_grbnresponse_t *)(np + 1);
531892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_TCHECK(grbn->nsigs);
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* BIND910: not used */
534892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			if (ndo->ndo_vflag > 2) {
535892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " flags:0x%x",
536892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_32BITS(&grbn->flags)));
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
539892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
540892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			    EXTRACT_16BITS(&grbn->rdtype))));
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
542892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
543892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				    EXTRACT_16BITS(&grbn->rdclass))));
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
545892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " TTL "));
546892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			relts_print(ndo, EXTRACT_32BITS(&grbn->ttl));
547892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&grbn->nrdatas),
548892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			    EXTRACT_16BITS(&grbn->nsigs)));
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* XXX grbn points to packed struct */
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s = (const char *)&grbn->nsigs+ sizeof(grbn->nsigs);
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
553892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			advance = lwres_printnamelen(ndo, s);
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (advance < 0)
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s += advance;
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* rdatas */
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			na = EXTRACT_16BITS(&grbn->nrdatas);
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < na; i++) {
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* XXX should decode resource data */
562892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				advance = lwres_printbinlen(ndo, s);
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (advance < 0)
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				s += advance;
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* sigs */
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			na = EXTRACT_16BITS(&grbn->nsigs);
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < na; i++) {
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* XXX how should we print it? */
572892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				advance = lwres_printbinlen(ndo, s);
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (advance < 0)
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					goto trunc;
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				s += advance;
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsupported++;
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  tail:
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* length mismatch */
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (EXTRACT_32BITS(&np->length) != length) {
587892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, " [len: %u != %u]", EXTRACT_32BITS(&np->length),
588892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		    length));
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!unsupported && s < (const char *)np + EXTRACT_32BITS(&np->length))
591892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "[extra]"));
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  trunc:
595892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|lwres]"));
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
597