+ case LWRES_OPCODE_GETNAMEBYADDR:
+ gnba = (const lwres_gnbarequest_t *)(np + 1);
+ ND_TCHECK(gnba->addr);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gnba->flags)));
+ }
+
+ s = (const char *)&gnba->addr;
+
+ advance = lwres_printaddr(ndo, &gnba->addr);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ break;
+ case LWRES_OPCODE_GETRDATABYNAME:
+ /* XXX no trace, not tested */
+ grbn = (const lwres_grbnrequest_t *)(np + 1);
+ ND_TCHECK(grbn->namelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&grbn->flags)));
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
+ EXTRACT_16BITS(&grbn->rdtype))));
+ if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
+ EXTRACT_16BITS(&grbn->rdclass))));
+ }
+
+ /* XXX grbn points to packed struct */
+ s = (const char *)&grbn->namelen +
+ sizeof(grbn->namelen);
+ l = EXTRACT_16BITS(&grbn->namelen);
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ break;
+ default:
+ unsupported++;
+ break;
+ }
+ } else {
+ /*
+ * responses
+ */
+ const lwres_gabnresponse_t *gabn;
+ const lwres_gnbaresponse_t *gnba;
+ const lwres_grbnresponse_t *grbn;
+ uint32_t l, na;
+ uint32_t i;
+
+ gabn = NULL;
+ gnba = NULL;
+ grbn = NULL;
+
+ switch (EXTRACT_32BITS(&np->opcode)) {
+ case LWRES_OPCODE_NOOP:
+ break;
+ case LWRES_OPCODE_GETADDRSBYNAME:
+ gabn = (const lwres_gabnresponse_t *)(np + 1);
+ ND_TCHECK(gabn->realnamelen);
+ /* XXX gabn points to packed struct */
+ s = (const char *)&gabn->realnamelen +
+ sizeof(gabn->realnamelen);
+ l = EXTRACT_16BITS(&gabn->realnamelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gabn->flags)));
+ }
+
+ ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&gabn->naliases),
+ EXTRACT_16BITS(&gabn->naddrs)));
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* aliases */
+ na = EXTRACT_16BITS(&gabn->naliases);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+
+ /* addrs */
+ na = EXTRACT_16BITS(&gabn->naddrs);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printaddr(ndo, (const lwres_addr_t *)s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ case LWRES_OPCODE_GETNAMEBYADDR:
+ gnba = (const lwres_gnbaresponse_t *)(np + 1);
+ ND_TCHECK(gnba->realnamelen);
+ /* XXX gnba points to packed struct */
+ s = (const char *)&gnba->realnamelen +
+ sizeof(gnba->realnamelen);
+ l = EXTRACT_16BITS(&gnba->realnamelen);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&gnba->flags)));
+ }
+
+ ND_PRINT((ndo, " %u", EXTRACT_16BITS(&gnba->naliases)));
+
+ advance = lwres_printname(ndo, l, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* aliases */
+ na = EXTRACT_16BITS(&gnba->naliases);
+ for (i = 0; i < na; i++) {
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ case LWRES_OPCODE_GETRDATABYNAME:
+ /* XXX no trace, not tested */
+ grbn = (const lwres_grbnresponse_t *)(np + 1);
+ ND_TCHECK(grbn->nsigs);
+
+ /* BIND910: not used */
+ if (ndo->ndo_vflag > 2) {
+ ND_PRINT((ndo, " flags:0x%x",
+ EXTRACT_32BITS(&grbn->flags)));
+ }
+
+ ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d",
+ EXTRACT_16BITS(&grbn->rdtype))));
+ if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) {
+ ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d",
+ EXTRACT_16BITS(&grbn->rdclass))));
+ }
+ ND_PRINT((ndo, " TTL "));
+ unsigned_relts_print(ndo, EXTRACT_32BITS(&grbn->ttl));
+ ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&grbn->nrdatas),
+ EXTRACT_16BITS(&grbn->nsigs)));
+
+ /* XXX grbn points to packed struct */
+ s = (const char *)&grbn->nsigs+ sizeof(grbn->nsigs);
+
+ advance = lwres_printnamelen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+
+ /* rdatas */
+ na = EXTRACT_16BITS(&grbn->nrdatas);
+ for (i = 0; i < na; i++) {
+ /* XXX should decode resource data */
+ advance = lwres_printbinlen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+
+ /* sigs */
+ na = EXTRACT_16BITS(&grbn->nsigs);
+ for (i = 0; i < na; i++) {
+ /* XXX how should we print it? */
+ advance = lwres_printbinlen(ndo, s);
+ if (advance < 0)
+ goto trunc;
+ s += advance;
+ }
+ break;
+ default:
+ unsupported++;