void hsrp_print(netdissect_options *ndo, const u_char *bp, u_int len) { const struct hsrp *hp = (const struct hsrp *) bp; uint8_t version; ndo->ndo_protocol = "hsrp"; ND_TCHECK_1(hp->hsrp_version); version = GET_U_1(hp->hsrp_version); ND_PRINT("HSRPv%u", version); if (version != 0) return; ND_TCHECK_1(hp->hsrp_op_code); ND_PRINT("-"); ND_PRINT("%s ", tok2strary(op_code_str, "unknown (%u)", GET_U_1(hp->hsrp_op_code))); ND_PRINT("%u: ", len); ND_TCHECK_1(hp->hsrp_state); ND_PRINT("state=%s ", tok2str(states, "Unknown (%u)", GET_U_1(hp->hsrp_state))); ND_TCHECK_1(hp->hsrp_group); ND_PRINT("group=%u ", GET_U_1(hp->hsrp_group)); ND_TCHECK_1(hp->hsrp_reserved); if (GET_U_1(hp->hsrp_reserved) != 0) { ND_PRINT("[reserved=%u!] ", GET_U_1(hp->hsrp_reserved)); } ND_TCHECK_4(hp->hsrp_virtaddr); ND_PRINT("addr=%s", ipaddr_string(ndo, hp->hsrp_virtaddr)); if (ndo->ndo_vflag) { ND_PRINT(" hellotime="); unsigned_relts_print(ndo, GET_U_1(hp->hsrp_hellotime)); ND_PRINT(" holdtime="); unsigned_relts_print(ndo, GET_U_1(hp->hsrp_holdtime)); ND_PRINT(" priority=%u", GET_U_1(hp->hsrp_priority)); ND_PRINT(" auth=\""); if (nd_printn(ndo, hp->hsrp_authdata, sizeof(hp->hsrp_authdata), ndo->ndo_snapend)) { ND_PRINT("\""); goto trunc; } ND_PRINT("\""); } return; trunc: nd_print_trunc(ndo); }
static int print_prune(netdissect_options *ndo, const u_char *bp) { ND_TCHECK_LEN(bp, 12); ND_PRINT(" src %s grp %s", ipaddr_string(ndo, bp), ipaddr_string(ndo, bp + 4)); bp += 8; ND_PRINT(" timer "); unsigned_relts_print(ndo, GET_BE_U_4(bp)); return (0); trunc: return (-1); }
void lwres_print(netdissect_options *ndo, const u_char *bp, u_int length) { const u_char *p; const struct lwres_lwpacket *np; uint32_t v; const u_char *s; int response; int advance; int unsupported = 0; ndo->ndo_protocol = "lwres"; np = (const struct lwres_lwpacket *)bp; ND_TCHECK_2(np->authlength); ND_PRINT(" lwres"); v = EXTRACT_BE_U_2(np->version); if (ndo->ndo_vflag || v != LWRES_LWPACKETVERSION_0) ND_PRINT(" v%u", v); if (v != LWRES_LWPACKETVERSION_0) { s = bp + EXTRACT_BE_U_4(np->length); goto tail; } response = EXTRACT_BE_U_2(np->pktflags) & LWRES_LWPACKETFLAG_RESPONSE; /* opcode and pktflags */ v = EXTRACT_BE_U_4(np->opcode); ND_PRINT(" %s%s", tok2str(opcode, "#0x%x", v), response ? "" : "?"); /* pktflags */ v = EXTRACT_BE_U_2(np->pktflags); if (v & ~LWRES_LWPACKETFLAG_RESPONSE) ND_PRINT("[0x%x]", v); if (ndo->ndo_vflag > 1) { ND_PRINT(" ("); /*)*/ ND_PRINT("serial:0x%x", EXTRACT_BE_U_4(np->serial)); ND_PRINT(" result:0x%x", EXTRACT_BE_U_4(np->result)); ND_PRINT(" recvlen:%u", EXTRACT_BE_U_4(np->recvlength)); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" authtype:0x%x", EXTRACT_BE_U_2(np->authtype)); ND_PRINT(" authlen:%u", EXTRACT_BE_U_2(np->authlength)); } /*(*/ ND_PRINT(")"); } /* per-opcode content */ if (!response) { /* * queries */ const lwres_gabnrequest_t *gabn; const lwres_gnbarequest_t *gnba; const lwres_grbnrequest_t *grbn; uint32_t l; gabn = NULL; gnba = NULL; grbn = NULL; p = (const u_char *)(np + 1); switch (EXTRACT_BE_U_4(np->opcode)) { case LWRES_OPCODE_NOOP: s = p; break; case LWRES_OPCODE_GETADDRSBYNAME: gabn = (const lwres_gabnrequest_t *)p; ND_TCHECK_2(gabn->namelen); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(gabn->flags)); } v = EXTRACT_BE_U_4(gabn->addrtypes); switch (v & (LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) { case LWRES_ADDRTYPE_V4: ND_PRINT(" IPv4"); break; case LWRES_ADDRTYPE_V6: ND_PRINT(" IPv6"); break; case LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6: ND_PRINT(" IPv4/6"); break; } if (v & ~(LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) ND_PRINT("[0x%x]", v); s = p + LWRES_GABNREQUEST_LEN; l = EXTRACT_BE_U_2(gabn->namelen); advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; break; case LWRES_OPCODE_GETNAMEBYADDR: gnba = (const lwres_gnbarequest_t *)p; ND_TCHECK_4(gnba->flags); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(gnba->flags)); } s = p + LWRES_GNBAREQUEST_LEN; advance = lwres_printaddr(ndo, s); if (advance < 0) goto trunc; s += advance; break; case LWRES_OPCODE_GETRDATABYNAME: /* XXX no trace, not tested */ grbn = (const lwres_grbnrequest_t *)p; ND_TCHECK_2(grbn->namelen); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(grbn->flags)); } ND_PRINT(" %s", tok2str(ns_type2str, "Type%u", EXTRACT_BE_U_2(grbn->rdtype))); if (EXTRACT_BE_U_2(grbn->rdclass) != C_IN) { ND_PRINT(" %s", tok2str(ns_class2str, "Class%u", EXTRACT_BE_U_2(grbn->rdclass))); } s = p + LWRES_GRBNREQUEST_LEN; l = EXTRACT_BE_U_2(grbn->namelen); advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; break; default: s = p; 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; p = (const u_char *)(np + 1); switch (EXTRACT_BE_U_4(np->opcode)) { case LWRES_OPCODE_NOOP: s = p; break; case LWRES_OPCODE_GETADDRSBYNAME: gabn = (const lwres_gabnresponse_t *)p; ND_TCHECK_2(gabn->realnamelen); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(gabn->flags)); } ND_PRINT(" %u/%u", EXTRACT_BE_U_2(gabn->naliases), EXTRACT_BE_U_2(gabn->naddrs)); s = p + LWRES_GABNRESPONSE_LEN; l = EXTRACT_BE_U_2(gabn->realnamelen); advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; /* aliases */ na = EXTRACT_BE_U_2(gabn->naliases); for (i = 0; i < na; i++) { advance = lwres_printnamelen(ndo, s); if (advance < 0) goto trunc; s += advance; } /* addrs */ na = EXTRACT_BE_U_2(gabn->naddrs); for (i = 0; i < na; i++) { advance = lwres_printaddr(ndo, s); if (advance < 0) goto trunc; s += advance; } break; case LWRES_OPCODE_GETNAMEBYADDR: gnba = (const lwres_gnbaresponse_t *)p; ND_TCHECK_2(gnba->realnamelen); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(gnba->flags)); } ND_PRINT(" %u", EXTRACT_BE_U_2(gnba->naliases)); s = p + LWRES_GNBARESPONSE_LEN; l = EXTRACT_BE_U_2(gnba->realnamelen); advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; /* aliases */ na = EXTRACT_BE_U_2(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 *)p; ND_TCHECK_2(grbn->nsigs); /* BIND910: not used */ if (ndo->ndo_vflag > 2) { ND_PRINT(" flags:0x%x", EXTRACT_BE_U_4(grbn->flags)); } ND_PRINT(" %s", tok2str(ns_type2str, "Type%u", EXTRACT_BE_U_2(grbn->rdtype))); if (EXTRACT_BE_U_2(grbn->rdclass) != C_IN) { ND_PRINT(" %s", tok2str(ns_class2str, "Class%u", EXTRACT_BE_U_2(grbn->rdclass))); } ND_PRINT(" TTL "); unsigned_relts_print(ndo, EXTRACT_BE_U_4(grbn->ttl)); ND_PRINT(" %u/%u", EXTRACT_BE_U_2(grbn->nrdatas), EXTRACT_BE_U_2(grbn->nsigs)); s = p + LWRES_GRBNRESPONSE_LEN; advance = lwres_printnamelen(ndo, s); if (advance < 0) goto trunc; s += advance; /* rdatas */ na = EXTRACT_BE_U_2(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_BE_U_2(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: s = p; unsupported++; break; } } tail: /* length mismatch */ if (EXTRACT_BE_U_4(np->length) != length) { ND_PRINT(" [len: %u != %u]", EXTRACT_BE_U_4(np->length), length); } if (!unsupported && s < bp + EXTRACT_BE_U_4(np->length)) ND_PRINT("[extra]"); return; trunc: ND_PRINT("[|lwres]"); }