X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/fe99fbf3b567f6850ac9c08ddc5d3134c4d5a428..a4a13734bb167ab42f86da26c3aa1cb4da9954fd:/print-bfd.c diff --git a/print-bfd.c b/print-bfd.c index 03aae7d7..f157684f 100644 --- a/print-bfd.c +++ b/print-bfd.c @@ -15,7 +15,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-bfd.c,v 1.6 2005-04-27 23:00:53 hannes Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/print-bfd.c,v 1.10 2006-02-02 06:35:52 hannes Exp $"; #endif #ifdef HAVE_CONFIG_H @@ -146,7 +146,7 @@ static const struct tok bfd_v0_flag_values[] = { { 0, NULL } }; -#define BFD_FLAG_AUTH 0x40 +#define BFD_FLAG_AUTH 0x04 static const struct tok bfd_v1_flag_values[] = { { 0x20, "Poll" }, @@ -171,13 +171,17 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) { const struct bfd_header_t *bfd_header; const struct bfd_auth_header_t *bfd_auth_header; - u_int8_t version; + u_int8_t version = 0; bfd_header = (const struct bfd_header_t *)pptr; - TCHECK(*bfd_header); - version = BFD_EXTRACT_VERSION(bfd_header->version_diag); - - switch (port << 8 | version) { + if (port == BFD_CONTROL_PORT) { + TCHECK(*bfd_header); + version = BFD_EXTRACT_VERSION(bfd_header->version_diag); + } else if (port == BFD_ECHO_PORT) { + /* Echo is BFD v1 only */ + version = 1; + } + switch ((port << 8) | version) { /* BFDv0 */ case (BFD_CONTROL_PORT << 8): @@ -219,8 +223,8 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) printf("BFDv%u, %s, State %s, Flags: [%s], length: %u", version, tok2str(bfd_port_values, "unknown (%u)", port), - tok2str(bfd_v1_state_values, "unknown (%u)", bfd_header->flags & 0xc0), - bittok2str(bfd_v1_flag_values, "none", bfd_header->flags), + tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6), + bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f), len); return; } @@ -229,8 +233,8 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) version, len, tok2str(bfd_port_values, "unknown (%u)", port), - tok2str(bfd_v1_state_values, "unknown (%u)", bfd_header->flags & 0xc0), - bittok2str(bfd_v1_flag_values, "none", bfd_header->flags), + tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6), + bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f), tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)), BFD_EXTRACT_DIAG(bfd_header->version_diag)); @@ -247,7 +251,9 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port) printf("\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000); if (bfd_header->flags & BFD_FLAG_AUTH) { - bfd_auth_header = (const struct bfd_auth_header_t *)(pptr + sizeof (const struct bfd_header_t)); + pptr += sizeof (const struct bfd_header_t); + bfd_auth_header = (const struct bfd_auth_header_t *)pptr; + TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t)); printf("\n\t%s (%u) Authentication, length %u present", tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type), bfd_auth_header->auth_type,