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