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