X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/d07e352f5a8a9cbf7e8f3ed49a316ed906353fd8..383670e8f3f5b51d1017d8c1a678aa7eaf1f2b4d:/print-hsrp.c diff --git a/print-hsrp.c b/print-hsrp.c index 35146460..30278268 100644 --- a/print-hsrp.c +++ b/print-hsrp.c @@ -29,16 +29,17 @@ /* \summary: Cisco Hot Standby Router Protocol (HSRP) printer */ -/* Cisco Hot Standby Router Protocol (HSRP). */ +/* specification: RFC 2281 for version 1 */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include "netdissect-stdinc.h" #include "netdissect.h" #include "addrtoname.h" +#include "extract.h" /* HSRP op code types. */ static const char *op_code_str[] = { @@ -80,56 +81,53 @@ static const struct tok states[] = { /* HSRP protocol header. */ struct hsrp { - uint8_t hsrp_version; - uint8_t hsrp_op_code; - uint8_t hsrp_state; - uint8_t hsrp_hellotime; - uint8_t hsrp_holdtime; - uint8_t hsrp_priority; - uint8_t hsrp_group; - uint8_t hsrp_reserved; - uint8_t hsrp_authdata[HSRP_AUTH_SIZE]; - struct in_addr hsrp_virtaddr; + nd_uint8_t hsrp_version; + nd_uint8_t hsrp_op_code; + nd_uint8_t hsrp_state; + nd_uint8_t hsrp_hellotime; + nd_uint8_t hsrp_holdtime; + nd_uint8_t hsrp_priority; + nd_uint8_t hsrp_group; + nd_uint8_t hsrp_reserved; + nd_byte hsrp_authdata[HSRP_AUTH_SIZE]; + nd_ipv4 hsrp_virtaddr; }; void -hsrp_print(netdissect_options *ndo, register const uint8_t *bp, register u_int len) +hsrp_print(netdissect_options *ndo, const u_char *bp, u_int len) { const struct hsrp *hp = (const struct hsrp *) bp; + uint8_t version; - ND_TCHECK(hp->hsrp_version); - ND_PRINT((ndo, "HSRPv%d", hp->hsrp_version)); - if (hp->hsrp_version != 0) + ndo->ndo_protocol = "hsrp"; + version = GET_U_1(hp->hsrp_version); + ND_PRINT("HSRPv%u", version); + if (version != 0) return; - ND_TCHECK(hp->hsrp_op_code); - ND_PRINT((ndo, "-")); - ND_PRINT((ndo, "%s ", tok2strary(op_code_str, "unknown (%d)", hp->hsrp_op_code))); - ND_PRINT((ndo, "%d: ", len)); - ND_TCHECK(hp->hsrp_state); - ND_PRINT((ndo, "state=%s ", tok2str(states, "Unknown (%d)", hp->hsrp_state))); - ND_TCHECK(hp->hsrp_group); - ND_PRINT((ndo, "group=%d ", hp->hsrp_group)); - ND_TCHECK(hp->hsrp_reserved); - if (hp->hsrp_reserved != 0) { - ND_PRINT((ndo, "[reserved=%d!] ", hp->hsrp_reserved)); + ND_PRINT("-"); + ND_PRINT("%s ", + tok2strary(op_code_str, "unknown (%u)", GET_U_1(hp->hsrp_op_code))); + ND_PRINT("%u: ", len); + ND_PRINT("state=%s ", + tok2str(states, "Unknown (%u)", GET_U_1(hp->hsrp_state))); + ND_PRINT("group=%u ", GET_U_1(hp->hsrp_group)); + if (GET_U_1(hp->hsrp_reserved) != 0) { + ND_PRINT("[reserved=%u!] ", GET_U_1(hp->hsrp_reserved)); } - ND_TCHECK(hp->hsrp_virtaddr); - ND_PRINT((ndo, "addr=%s", ipaddr_string(ndo, &hp->hsrp_virtaddr))); + ND_PRINT("addr=%s", GET_IPADDR_STRING(hp->hsrp_virtaddr)); if (ndo->ndo_vflag) { - ND_PRINT((ndo, " hellotime=")); - unsigned_relts_print(ndo, hp->hsrp_hellotime); - ND_PRINT((ndo, " holdtime=")); - unsigned_relts_print(ndo, hp->hsrp_holdtime); - ND_PRINT((ndo, " priority=%d", hp->hsrp_priority)); - ND_PRINT((ndo, " auth=\"")); - if (fn_printn(ndo, hp->hsrp_authdata, sizeof(hp->hsrp_authdata), - ndo->ndo_snapend)) { - ND_PRINT((ndo, "\"")); - goto trunc; - } - ND_PRINT((ndo, "\"")); + 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=\""); + /* + * RFC 2281 Section 5.1 does not specify the encoding of + * Authentication Data explicitly, but zero padding can be + * inferred from the "recommended default value". + */ + nd_printjnp(ndo, hp->hsrp_authdata, HSRP_AUTH_SIZE); + ND_PRINT("\""); } - return; -trunc: - ND_PRINT((ndo, "[|hsrp]")); }