xref: /dflybsd-src/contrib/tcpdump/print-lwres.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (C) 2001 WIDE Project.
341c99275SPeter Avalos  * All rights reserved.
441c99275SPeter Avalos  *
541c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
641c99275SPeter Avalos  * modification, are permitted provided that the following conditions
741c99275SPeter Avalos  * are met:
841c99275SPeter Avalos  * 1. Redistributions of source code must retain the above copyright
941c99275SPeter Avalos  *    notice, this list of conditions and the following disclaimer.
1041c99275SPeter Avalos  * 2. Redistributions in binary form must reproduce the above copyright
1141c99275SPeter Avalos  *    notice, this list of conditions and the following disclaimer in the
1241c99275SPeter Avalos  *    documentation and/or other materials provided with the distribution.
1341c99275SPeter Avalos  * 3. Neither the name of the project nor the names of its contributors
1441c99275SPeter Avalos  *    may be used to endorse or promote products derived from this software
1541c99275SPeter Avalos  *    without specific prior written permission.
1641c99275SPeter Avalos  *
1741c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
1841c99275SPeter Avalos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1941c99275SPeter Avalos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2041c99275SPeter Avalos  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
2141c99275SPeter Avalos  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2241c99275SPeter Avalos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2341c99275SPeter Avalos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2441c99275SPeter Avalos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2541c99275SPeter Avalos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2641c99275SPeter Avalos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2741c99275SPeter Avalos  * SUCH DAMAGE.
2841c99275SPeter Avalos  */
2941c99275SPeter Avalos 
30411677aeSAaron LI /* \summary: BIND9 Lightweight Resolver protocol printer */
3141c99275SPeter Avalos 
3241c99275SPeter Avalos #ifdef HAVE_CONFIG_H
33*ed775ee7SAntonio Huete Jimenez #include <config.h>
3441c99275SPeter Avalos #endif
3541c99275SPeter Avalos 
36*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
3741c99275SPeter Avalos 
38*ed775ee7SAntonio Huete Jimenez #define ND_LONGJMP_FROM_TCHECK
39411677aeSAaron LI #include "netdissect.h"
4041c99275SPeter Avalos #include "addrtoname.h"
41411677aeSAaron LI #include "extract.h"
4241c99275SPeter Avalos 
43*ed775ee7SAntonio Huete Jimenez #include "nameser.h"
44*ed775ee7SAntonio Huete Jimenez 
4541c99275SPeter Avalos /* BIND9 lib/lwres/include/lwres */
46*ed775ee7SAntonio Huete Jimenez /*
47*ed775ee7SAntonio Huete Jimenez  * Use nd_uint16_t for lwres_uint16_t
48*ed775ee7SAntonio Huete Jimenez  * Use nd_uint32_t for lwres_uint32_t
49*ed775ee7SAntonio Huete Jimenez */
5041c99275SPeter Avalos 
5141c99275SPeter Avalos struct lwres_lwpacket {
52*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t		length;
53*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t		version;
54*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t		pktflags;
55*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t		serial;
56*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t		opcode;
57*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t		result;
58*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t		recvlength;
59*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t		authtype;
60*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t		authlength;
6141c99275SPeter Avalos };
6241c99275SPeter Avalos 
6341c99275SPeter Avalos #define LWRES_LWPACKETFLAG_RESPONSE	0x0001U	/* if set, pkt is a response */
6441c99275SPeter Avalos 
6541c99275SPeter Avalos #define LWRES_LWPACKETVERSION_0		0
6641c99275SPeter Avalos 
6741c99275SPeter Avalos #define LWRES_FLAG_TRUSTNOTREQUIRED	0x00000001U
6841c99275SPeter Avalos #define LWRES_FLAG_SECUREDATA		0x00000002U
6941c99275SPeter Avalos 
7041c99275SPeter Avalos /*
7141c99275SPeter Avalos  * no-op
7241c99275SPeter Avalos  */
7341c99275SPeter Avalos #define LWRES_OPCODE_NOOP		0x00000000U
7441c99275SPeter Avalos 
7541c99275SPeter Avalos typedef struct {
7641c99275SPeter Avalos 	/* public */
77*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			datalength;
7841c99275SPeter Avalos 	/* data follows */
7941c99275SPeter Avalos } lwres_nooprequest_t;
8041c99275SPeter Avalos 
8141c99275SPeter Avalos typedef struct {
8241c99275SPeter Avalos 	/* public */
83*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			datalength;
8441c99275SPeter Avalos 	/* data follows */
8541c99275SPeter Avalos } lwres_noopresponse_t;
8641c99275SPeter Avalos 
8741c99275SPeter Avalos /*
8841c99275SPeter Avalos  * get addresses by name
8941c99275SPeter Avalos  */
9041c99275SPeter Avalos #define LWRES_OPCODE_GETADDRSBYNAME	0x00010001U
9141c99275SPeter Avalos 
9241c99275SPeter Avalos typedef struct lwres_addr lwres_addr_t;
9341c99275SPeter Avalos 
9441c99275SPeter Avalos struct lwres_addr {
95*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			family;
96*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			length;
97*ed775ee7SAntonio Huete Jimenez 	/* address follows */
9841c99275SPeter Avalos };
99*ed775ee7SAntonio Huete Jimenez #define LWRES_ADDR_LEN			6
10041c99275SPeter Avalos 
10141c99275SPeter Avalos typedef struct {
10241c99275SPeter Avalos 	/* public */
103*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
104*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			addrtypes;
105*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			namelen;
10641c99275SPeter Avalos 	/* name follows */
10741c99275SPeter Avalos } lwres_gabnrequest_t;
108*ed775ee7SAntonio Huete Jimenez #define LWRES_GABNREQUEST_LEN		10
10941c99275SPeter Avalos 
11041c99275SPeter Avalos typedef struct {
11141c99275SPeter Avalos 	/* public */
112*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
113*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			naliases;
114*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			naddrs;
115*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			realnamelen;
11641c99275SPeter Avalos 	/* aliases follows */
11741c99275SPeter Avalos 	/* addrs follows */
11841c99275SPeter Avalos 	/* realname follows */
11941c99275SPeter Avalos } lwres_gabnresponse_t;
120*ed775ee7SAntonio Huete Jimenez #define LWRES_GABNRESPONSE_LEN		10
12141c99275SPeter Avalos 
12241c99275SPeter Avalos /*
12341c99275SPeter Avalos  * get name by address
12441c99275SPeter Avalos  */
12541c99275SPeter Avalos #define LWRES_OPCODE_GETNAMEBYADDR	0x00010002U
12641c99275SPeter Avalos typedef struct {
12741c99275SPeter Avalos 	/* public */
128*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
129*ed775ee7SAntonio Huete Jimenez 	/* addr follows */
13041c99275SPeter Avalos } lwres_gnbarequest_t;
131*ed775ee7SAntonio Huete Jimenez #define LWRES_GNBAREQUEST_LEN		4
13241c99275SPeter Avalos 
13341c99275SPeter Avalos typedef struct {
13441c99275SPeter Avalos 	/* public */
135*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
136*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			naliases;
137*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			realnamelen;
13841c99275SPeter Avalos 	/* aliases follows */
13941c99275SPeter Avalos 	/* realname follows */
14041c99275SPeter Avalos } lwres_gnbaresponse_t;
141*ed775ee7SAntonio Huete Jimenez #define LWRES_GNBARESPONSE_LEN		8
14241c99275SPeter Avalos 
14341c99275SPeter Avalos /*
14441c99275SPeter Avalos  * get rdata by name
14541c99275SPeter Avalos  */
14641c99275SPeter Avalos #define LWRES_OPCODE_GETRDATABYNAME	0x00010003U
14741c99275SPeter Avalos 
14841c99275SPeter Avalos typedef struct {
14941c99275SPeter Avalos 	/* public */
150*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
151*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			rdclass;
152*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			rdtype;
153*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			namelen;
15441c99275SPeter Avalos 	/* name follows */
15541c99275SPeter Avalos } lwres_grbnrequest_t;
156*ed775ee7SAntonio Huete Jimenez #define LWRES_GRBNREQUEST_LEN		10
15741c99275SPeter Avalos 
15841c99275SPeter Avalos typedef struct {
15941c99275SPeter Avalos 	/* public */
160*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			flags;
161*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			rdclass;
162*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			rdtype;
163*ed775ee7SAntonio Huete Jimenez 	nd_uint32_t			ttl;
164*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			nrdatas;
165*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t			nsigs;
16641c99275SPeter Avalos 	/* realname here (len + name) */
16741c99275SPeter Avalos 	/* rdata here (len + name) */
16841c99275SPeter Avalos 	/* signatures here (len + name) */
16941c99275SPeter Avalos } lwres_grbnresponse_t;
170*ed775ee7SAntonio Huete Jimenez #define LWRES_GRBNRESPONSE_LEN		16
17141c99275SPeter Avalos 
17241c99275SPeter Avalos #define LWRDATA_VALIDATED	0x00000001
17341c99275SPeter Avalos 
17441c99275SPeter Avalos #define LWRES_ADDRTYPE_V4		0x00000001U	/* ipv4 */
17541c99275SPeter Avalos #define LWRES_ADDRTYPE_V6		0x00000002U	/* ipv6 */
17641c99275SPeter Avalos 
17741c99275SPeter Avalos #define LWRES_MAX_ALIASES		16		/* max # of aliases */
17841c99275SPeter Avalos #define LWRES_MAX_ADDRS			64		/* max # of addrs */
17941c99275SPeter Avalos 
180411677aeSAaron LI static const struct tok opcode[] = {
18141c99275SPeter Avalos 	{ LWRES_OPCODE_NOOP,		"noop", },
18241c99275SPeter Avalos 	{ LWRES_OPCODE_GETADDRSBYNAME,	"getaddrsbyname", },
18341c99275SPeter Avalos 	{ LWRES_OPCODE_GETNAMEBYADDR,	"getnamebyaddr", },
18441c99275SPeter Avalos 	{ LWRES_OPCODE_GETRDATABYNAME,	"getrdatabyname", },
18541c99275SPeter Avalos 	{ 0, 				NULL, },
18641c99275SPeter Avalos };
18741c99275SPeter Avalos 
18841c99275SPeter Avalos /* print-domain.c */
189411677aeSAaron LI extern const struct tok ns_type2str[];
190411677aeSAaron LI extern const struct tok ns_class2str[];
19141c99275SPeter Avalos 
192*ed775ee7SAntonio Huete Jimenez static unsigned
lwres_printname(netdissect_options * ndo,size_t l,const u_char * p0)193411677aeSAaron LI lwres_printname(netdissect_options *ndo,
194*ed775ee7SAntonio Huete Jimenez                 size_t l, const u_char *p0)
19541c99275SPeter Avalos {
196*ed775ee7SAntonio Huete Jimenez 	ND_PRINT(" ");
197*ed775ee7SAntonio Huete Jimenez 	(void)nd_printn(ndo, p0, l, NULL);
198*ed775ee7SAntonio Huete Jimenez 	p0 += l;
199*ed775ee7SAntonio Huete Jimenez 	if (GET_U_1(p0))
200*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" (not NUL-terminated!)");
201*ed775ee7SAntonio Huete Jimenez 	return l + 1;
20241c99275SPeter Avalos }
20341c99275SPeter Avalos 
204*ed775ee7SAntonio Huete Jimenez static unsigned
lwres_printnamelen(netdissect_options * ndo,const u_char * p)205411677aeSAaron LI lwres_printnamelen(netdissect_options *ndo,
206*ed775ee7SAntonio Huete Jimenez                    const u_char *p)
20741c99275SPeter Avalos {
208411677aeSAaron LI 	uint16_t l;
20941c99275SPeter Avalos 	int advance;
21041c99275SPeter Avalos 
211*ed775ee7SAntonio Huete Jimenez 	l = GET_BE_U_2(p);
212411677aeSAaron LI 	advance = lwres_printname(ndo, l, p + 2);
21341c99275SPeter Avalos 	return 2 + advance;
21441c99275SPeter Avalos }
21541c99275SPeter Avalos 
216*ed775ee7SAntonio Huete Jimenez static unsigned
lwres_printbinlen(netdissect_options * ndo,const u_char * p0)217411677aeSAaron LI lwres_printbinlen(netdissect_options *ndo,
218*ed775ee7SAntonio Huete Jimenez                   const u_char *p0)
21941c99275SPeter Avalos {
220*ed775ee7SAntonio Huete Jimenez 	const u_char *p;
221411677aeSAaron LI 	uint16_t l;
22241c99275SPeter Avalos 	int i;
22341c99275SPeter Avalos 
22441c99275SPeter Avalos 	p = p0;
225*ed775ee7SAntonio Huete Jimenez 	l = GET_BE_U_2(p);
22641c99275SPeter Avalos 	p += 2;
227*ed775ee7SAntonio Huete Jimenez 	for (i = 0; i < l; i++) {
228*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("%02x", GET_U_1(p));
229*ed775ee7SAntonio Huete Jimenez 		p++;
230*ed775ee7SAntonio Huete Jimenez 	}
231*ed775ee7SAntonio Huete Jimenez 	return 2 + l;
23241c99275SPeter Avalos }
23341c99275SPeter Avalos 
23441c99275SPeter Avalos static int
lwres_printaddr(netdissect_options * ndo,const u_char * p0)235411677aeSAaron LI lwres_printaddr(netdissect_options *ndo,
236*ed775ee7SAntonio Huete Jimenez                 const u_char *p0)
23741c99275SPeter Avalos {
238*ed775ee7SAntonio Huete Jimenez 	const u_char *p;
239*ed775ee7SAntonio Huete Jimenez 	const lwres_addr_t *ap;
240411677aeSAaron LI 	uint16_t l;
24141c99275SPeter Avalos 	int i;
24241c99275SPeter Avalos 
243*ed775ee7SAntonio Huete Jimenez 	p = p0;
244*ed775ee7SAntonio Huete Jimenez 	ap = (const lwres_addr_t *)p;
245*ed775ee7SAntonio Huete Jimenez 	l = GET_BE_U_2(ap->length);
246*ed775ee7SAntonio Huete Jimenez 	p += LWRES_ADDR_LEN;
247*ed775ee7SAntonio Huete Jimenez 	ND_TCHECK_LEN(p, l);
24841c99275SPeter Avalos 
249*ed775ee7SAntonio Huete Jimenez 	switch (GET_BE_U_4(ap->family)) {
25041c99275SPeter Avalos 	case 1:	/* IPv4 */
25141c99275SPeter Avalos 		if (l < 4)
25241c99275SPeter Avalos 			return -1;
253*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" %s", GET_IPADDR_STRING(p));
254*ed775ee7SAntonio Huete Jimenez 		p += sizeof(nd_ipv4);
25541c99275SPeter Avalos 		break;
25641c99275SPeter Avalos 	case 2:	/* IPv6 */
25741c99275SPeter Avalos 		if (l < 16)
25841c99275SPeter Avalos 			return -1;
259*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" %s", GET_IP6ADDR_STRING(p));
260*ed775ee7SAntonio Huete Jimenez 		p += sizeof(nd_ipv6);
26141c99275SPeter Avalos 		break;
26241c99275SPeter Avalos 	default:
263*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" %u/", GET_BE_U_4(ap->family));
264*ed775ee7SAntonio Huete Jimenez 		for (i = 0; i < l; i++) {
265*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("%02x", GET_U_1(p));
266*ed775ee7SAntonio Huete Jimenez 			p++;
267*ed775ee7SAntonio Huete Jimenez 		}
26841c99275SPeter Avalos 	}
26941c99275SPeter Avalos 
270*ed775ee7SAntonio Huete Jimenez 	return ND_BYTES_BETWEEN(p, p0);
27141c99275SPeter Avalos }
27241c99275SPeter Avalos 
27341c99275SPeter Avalos void
lwres_print(netdissect_options * ndo,const u_char * bp,u_int length)274411677aeSAaron LI lwres_print(netdissect_options *ndo,
275*ed775ee7SAntonio Huete Jimenez             const u_char *bp, u_int length)
27641c99275SPeter Avalos {
277*ed775ee7SAntonio Huete Jimenez 	const u_char *p;
27841c99275SPeter Avalos 	const struct lwres_lwpacket *np;
279411677aeSAaron LI 	uint32_t v;
280*ed775ee7SAntonio Huete Jimenez 	const u_char *s;
28141c99275SPeter Avalos 	int response;
28241c99275SPeter Avalos 	int advance;
28341c99275SPeter Avalos 	int unsupported = 0;
28441c99275SPeter Avalos 
285*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "lwres";
28641c99275SPeter Avalos 	np = (const struct lwres_lwpacket *)bp;
287*ed775ee7SAntonio Huete Jimenez 	ND_TCHECK_2(np->authlength);
28841c99275SPeter Avalos 
289*ed775ee7SAntonio Huete Jimenez 	ND_PRINT(" lwres");
290*ed775ee7SAntonio Huete Jimenez 	v = GET_BE_U_2(np->version);
291411677aeSAaron LI 	if (ndo->ndo_vflag || v != LWRES_LWPACKETVERSION_0)
292*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" v%u", v);
29341c99275SPeter Avalos 	if (v != LWRES_LWPACKETVERSION_0) {
294*ed775ee7SAntonio Huete Jimenez 		s = bp + GET_BE_U_4(np->length);
29541c99275SPeter Avalos 		goto tail;
29641c99275SPeter Avalos 	}
29741c99275SPeter Avalos 
298*ed775ee7SAntonio Huete Jimenez 	response = GET_BE_U_2(np->pktflags) & LWRES_LWPACKETFLAG_RESPONSE;
29941c99275SPeter Avalos 
30041c99275SPeter Avalos 	/* opcode and pktflags */
301*ed775ee7SAntonio Huete Jimenez 	v = GET_BE_U_4(np->opcode);
302*ed775ee7SAntonio Huete Jimenez 	ND_PRINT(" %s%s", tok2str(opcode, "#0x%x", v), response ? "" : "?");
30341c99275SPeter Avalos 
30441c99275SPeter Avalos 	/* pktflags */
305*ed775ee7SAntonio Huete Jimenez 	v = GET_BE_U_2(np->pktflags);
30641c99275SPeter Avalos 	if (v & ~LWRES_LWPACKETFLAG_RESPONSE)
307*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("[0x%x]", v);
30841c99275SPeter Avalos 
309411677aeSAaron LI 	if (ndo->ndo_vflag > 1) {
310*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" (");	/*)*/
311*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("serial:0x%x", GET_BE_U_4(np->serial));
312*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" result:0x%x", GET_BE_U_4(np->result));
313*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" recvlen:%u", GET_BE_U_4(np->recvlength));
31441c99275SPeter Avalos 		/* BIND910: not used */
315411677aeSAaron LI 		if (ndo->ndo_vflag > 2) {
316*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" authtype:0x%x", GET_BE_U_2(np->authtype));
317*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" authlen:%u", GET_BE_U_2(np->authlength));
31841c99275SPeter Avalos 		}
31941c99275SPeter Avalos 		/*(*/
320*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(")");
32141c99275SPeter Avalos 	}
32241c99275SPeter Avalos 
32341c99275SPeter Avalos 	/* per-opcode content */
32441c99275SPeter Avalos 	if (!response) {
32541c99275SPeter Avalos 		/*
32641c99275SPeter Avalos 		 * queries
32741c99275SPeter Avalos 		 */
328411677aeSAaron LI 		const lwres_gabnrequest_t *gabn;
329411677aeSAaron LI 		const lwres_gnbarequest_t *gnba;
330411677aeSAaron LI 		const lwres_grbnrequest_t *grbn;
331411677aeSAaron LI 		uint32_t l;
33241c99275SPeter Avalos 
33341c99275SPeter Avalos 		gabn = NULL;
33441c99275SPeter Avalos 		gnba = NULL;
33541c99275SPeter Avalos 		grbn = NULL;
33641c99275SPeter Avalos 
337*ed775ee7SAntonio Huete Jimenez 		p = (const u_char *)(np + 1);
338*ed775ee7SAntonio Huete Jimenez 		switch (GET_BE_U_4(np->opcode)) {
33941c99275SPeter Avalos 		case LWRES_OPCODE_NOOP:
340*ed775ee7SAntonio Huete Jimenez 			s = p;
34141c99275SPeter Avalos 			break;
34241c99275SPeter Avalos 		case LWRES_OPCODE_GETADDRSBYNAME:
343*ed775ee7SAntonio Huete Jimenez 			gabn = (const lwres_gabnrequest_t *)p;
344*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_2(gabn->namelen);
34541c99275SPeter Avalos 
34641c99275SPeter Avalos 			/* BIND910: not used */
347411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
348*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
349*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(gabn->flags));
35041c99275SPeter Avalos 			}
35141c99275SPeter Avalos 
352*ed775ee7SAntonio Huete Jimenez 			v = GET_BE_U_4(gabn->addrtypes);
35341c99275SPeter Avalos 			switch (v & (LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) {
35441c99275SPeter Avalos 			case LWRES_ADDRTYPE_V4:
355*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" IPv4");
35641c99275SPeter Avalos 				break;
35741c99275SPeter Avalos 			case LWRES_ADDRTYPE_V6:
358*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" IPv6");
35941c99275SPeter Avalos 				break;
36041c99275SPeter Avalos 			case LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6:
361*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" IPv4/6");
36241c99275SPeter Avalos 				break;
36341c99275SPeter Avalos 			}
36441c99275SPeter Avalos 			if (v & ~(LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6))
365*ed775ee7SAntonio Huete Jimenez 				ND_PRINT("[0x%x]", v);
36641c99275SPeter Avalos 
367*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GABNREQUEST_LEN;
368*ed775ee7SAntonio Huete Jimenez 			l = GET_BE_U_2(gabn->namelen);
369411677aeSAaron LI 			advance = lwres_printname(ndo, l, s);
37041c99275SPeter Avalos 			s += advance;
37141c99275SPeter Avalos 			break;
37241c99275SPeter Avalos 		case LWRES_OPCODE_GETNAMEBYADDR:
373*ed775ee7SAntonio Huete Jimenez 			gnba = (const lwres_gnbarequest_t *)p;
374*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_4(gnba->flags);
37541c99275SPeter Avalos 
37641c99275SPeter Avalos 			/* BIND910: not used */
377411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
378*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
379*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(gnba->flags));
38041c99275SPeter Avalos 			}
38141c99275SPeter Avalos 
382*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GNBAREQUEST_LEN;
383*ed775ee7SAntonio Huete Jimenez 			advance = lwres_printaddr(ndo, s);
38441c99275SPeter Avalos 			if (advance < 0)
385*ed775ee7SAntonio Huete Jimenez 				goto invalid;
38641c99275SPeter Avalos 			s += advance;
38741c99275SPeter Avalos 			break;
38841c99275SPeter Avalos 		case LWRES_OPCODE_GETRDATABYNAME:
38941c99275SPeter Avalos 			/* XXX no trace, not tested */
390*ed775ee7SAntonio Huete Jimenez 			grbn = (const lwres_grbnrequest_t *)p;
391*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_2(grbn->namelen);
39241c99275SPeter Avalos 
39341c99275SPeter Avalos 			/* BIND910: not used */
394411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
395*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
396*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(grbn->flags));
39741c99275SPeter Avalos 			}
39841c99275SPeter Avalos 
399*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s", tok2str(ns_type2str, "Type%u",
400*ed775ee7SAntonio Huete Jimenez 			    GET_BE_U_2(grbn->rdtype)));
401*ed775ee7SAntonio Huete Jimenez 			if (GET_BE_U_2(grbn->rdclass) != C_IN) {
402*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" %s", tok2str(ns_class2str, "Class%u",
403*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_2(grbn->rdclass)));
40441c99275SPeter Avalos 			}
40541c99275SPeter Avalos 
406*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GRBNREQUEST_LEN;
407*ed775ee7SAntonio Huete Jimenez 			l = GET_BE_U_2(grbn->namelen);
408411677aeSAaron LI 			advance = lwres_printname(ndo, l, s);
40941c99275SPeter Avalos 			s += advance;
41041c99275SPeter Avalos 			break;
41141c99275SPeter Avalos 		default:
412*ed775ee7SAntonio Huete Jimenez 			s = p;
41341c99275SPeter Avalos 			unsupported++;
41441c99275SPeter Avalos 			break;
41541c99275SPeter Avalos 		}
41641c99275SPeter Avalos 	} else {
41741c99275SPeter Avalos 		/*
41841c99275SPeter Avalos 		 * responses
41941c99275SPeter Avalos 		 */
420411677aeSAaron LI 		const lwres_gabnresponse_t *gabn;
421411677aeSAaron LI 		const lwres_gnbaresponse_t *gnba;
422411677aeSAaron LI 		const lwres_grbnresponse_t *grbn;
423411677aeSAaron LI 		uint32_t l, na;
424411677aeSAaron LI 		uint32_t i;
42541c99275SPeter Avalos 
42641c99275SPeter Avalos 		gabn = NULL;
42741c99275SPeter Avalos 		gnba = NULL;
42841c99275SPeter Avalos 		grbn = NULL;
42941c99275SPeter Avalos 
430*ed775ee7SAntonio Huete Jimenez 		p = (const u_char *)(np + 1);
431*ed775ee7SAntonio Huete Jimenez 		switch (GET_BE_U_4(np->opcode)) {
43241c99275SPeter Avalos 		case LWRES_OPCODE_NOOP:
433*ed775ee7SAntonio Huete Jimenez 			s = p;
43441c99275SPeter Avalos 			break;
43541c99275SPeter Avalos 		case LWRES_OPCODE_GETADDRSBYNAME:
436*ed775ee7SAntonio Huete Jimenez 			gabn = (const lwres_gabnresponse_t *)p;
437*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_2(gabn->realnamelen);
43841c99275SPeter Avalos 
43941c99275SPeter Avalos 			/* BIND910: not used */
440411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
441*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
442*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(gabn->flags));
44341c99275SPeter Avalos 			}
44441c99275SPeter Avalos 
445*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %u/%u", GET_BE_U_2(gabn->naliases),
446*ed775ee7SAntonio Huete Jimenez 				  GET_BE_U_2(gabn->naddrs));
44741c99275SPeter Avalos 
448*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GABNRESPONSE_LEN;
449*ed775ee7SAntonio Huete Jimenez 			l = GET_BE_U_2(gabn->realnamelen);
450411677aeSAaron LI 			advance = lwres_printname(ndo, l, s);
45141c99275SPeter Avalos 			s += advance;
45241c99275SPeter Avalos 
45341c99275SPeter Avalos 			/* aliases */
454*ed775ee7SAntonio Huete Jimenez 			na = GET_BE_U_2(gabn->naliases);
45541c99275SPeter Avalos 			for (i = 0; i < na; i++) {
456411677aeSAaron LI 				advance = lwres_printnamelen(ndo, s);
45741c99275SPeter Avalos 				s += advance;
45841c99275SPeter Avalos 			}
45941c99275SPeter Avalos 
46041c99275SPeter Avalos 			/* addrs */
461*ed775ee7SAntonio Huete Jimenez 			na = GET_BE_U_2(gabn->naddrs);
46241c99275SPeter Avalos 			for (i = 0; i < na; i++) {
463*ed775ee7SAntonio Huete Jimenez 				advance = lwres_printaddr(ndo, s);
46441c99275SPeter Avalos 				if (advance < 0)
465*ed775ee7SAntonio Huete Jimenez 					goto invalid;
46641c99275SPeter Avalos 				s += advance;
46741c99275SPeter Avalos 			}
46841c99275SPeter Avalos 			break;
46941c99275SPeter Avalos 		case LWRES_OPCODE_GETNAMEBYADDR:
470*ed775ee7SAntonio Huete Jimenez 			gnba = (const lwres_gnbaresponse_t *)p;
471*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_2(gnba->realnamelen);
47241c99275SPeter Avalos 
47341c99275SPeter Avalos 			/* BIND910: not used */
474411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
475*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
476*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(gnba->flags));
47741c99275SPeter Avalos 			}
47841c99275SPeter Avalos 
479*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %u", GET_BE_U_2(gnba->naliases));
48041c99275SPeter Avalos 
481*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GNBARESPONSE_LEN;
482*ed775ee7SAntonio Huete Jimenez 			l = GET_BE_U_2(gnba->realnamelen);
483411677aeSAaron LI 			advance = lwres_printname(ndo, l, s);
48441c99275SPeter Avalos 			s += advance;
48541c99275SPeter Avalos 
48641c99275SPeter Avalos 			/* aliases */
487*ed775ee7SAntonio Huete Jimenez 			na = GET_BE_U_2(gnba->naliases);
48841c99275SPeter Avalos 			for (i = 0; i < na; i++) {
489411677aeSAaron LI 				advance = lwres_printnamelen(ndo, s);
49041c99275SPeter Avalos 				s += advance;
49141c99275SPeter Avalos 			}
49241c99275SPeter Avalos 			break;
49341c99275SPeter Avalos 		case LWRES_OPCODE_GETRDATABYNAME:
49441c99275SPeter Avalos 			/* XXX no trace, not tested */
495*ed775ee7SAntonio Huete Jimenez 			grbn = (const lwres_grbnresponse_t *)p;
496*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_2(grbn->nsigs);
49741c99275SPeter Avalos 
49841c99275SPeter Avalos 			/* BIND910: not used */
499411677aeSAaron LI 			if (ndo->ndo_vflag > 2) {
500*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" flags:0x%x",
501*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_4(grbn->flags));
50241c99275SPeter Avalos 			}
50341c99275SPeter Avalos 
504*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s", tok2str(ns_type2str, "Type%u",
505*ed775ee7SAntonio Huete Jimenez 			    GET_BE_U_2(grbn->rdtype)));
506*ed775ee7SAntonio Huete Jimenez 			if (GET_BE_U_2(grbn->rdclass) != C_IN) {
507*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" %s", tok2str(ns_class2str, "Class%u",
508*ed775ee7SAntonio Huete Jimenez 				    GET_BE_U_2(grbn->rdclass)));
50941c99275SPeter Avalos 			}
510*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" TTL ");
511*ed775ee7SAntonio Huete Jimenez 			unsigned_relts_print(ndo,
512*ed775ee7SAntonio Huete Jimenez 					     GET_BE_U_4(grbn->ttl));
513*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %u/%u", GET_BE_U_2(grbn->nrdatas),
514*ed775ee7SAntonio Huete Jimenez 				  GET_BE_U_2(grbn->nsigs));
51541c99275SPeter Avalos 
516*ed775ee7SAntonio Huete Jimenez 			s = p + LWRES_GRBNRESPONSE_LEN;
517411677aeSAaron LI 			advance = lwres_printnamelen(ndo, s);
51841c99275SPeter Avalos 			s += advance;
51941c99275SPeter Avalos 
52041c99275SPeter Avalos 			/* rdatas */
521*ed775ee7SAntonio Huete Jimenez 			na = GET_BE_U_2(grbn->nrdatas);
52241c99275SPeter Avalos 			for (i = 0; i < na; i++) {
52341c99275SPeter Avalos 				/* XXX should decode resource data */
524411677aeSAaron LI 				advance = lwres_printbinlen(ndo, s);
52541c99275SPeter Avalos 				s += advance;
52641c99275SPeter Avalos 			}
52741c99275SPeter Avalos 
52841c99275SPeter Avalos 			/* sigs */
529*ed775ee7SAntonio Huete Jimenez 			na = GET_BE_U_2(grbn->nsigs);
53041c99275SPeter Avalos 			for (i = 0; i < na; i++) {
53141c99275SPeter Avalos 				/* XXX how should we print it? */
532411677aeSAaron LI 				advance = lwres_printbinlen(ndo, s);
53341c99275SPeter Avalos 				s += advance;
53441c99275SPeter Avalos 			}
53541c99275SPeter Avalos 			break;
53641c99275SPeter Avalos 		default:
537*ed775ee7SAntonio Huete Jimenez 			s = p;
53841c99275SPeter Avalos 			unsupported++;
53941c99275SPeter Avalos 			break;
54041c99275SPeter Avalos 		}
54141c99275SPeter Avalos 	}
54241c99275SPeter Avalos 
54341c99275SPeter Avalos   tail:
54441c99275SPeter Avalos 	/* length mismatch */
545*ed775ee7SAntonio Huete Jimenez 	if (GET_BE_U_4(np->length) != length) {
546*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" [len: %u != %u]", GET_BE_U_4(np->length),
547*ed775ee7SAntonio Huete Jimenez 			  length);
54841c99275SPeter Avalos 	}
549*ed775ee7SAntonio Huete Jimenez 	if (!unsupported && s < bp + GET_BE_U_4(np->length))
550*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("[extra]");
55141c99275SPeter Avalos 	return;
55241c99275SPeter Avalos 
553*ed775ee7SAntonio Huete Jimenez   invalid:
554*ed775ee7SAntonio Huete Jimenez 	nd_print_invalid(ndo);
55541c99275SPeter Avalos }
556