X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/a3fa8638e8cfa36b2579c529c0742d310d003db3..c50f3934dacc4bd3fe16a900d4c63c05acb50ce3:/print-bfd.c diff --git a/print-bfd.c b/print-bfd.c index d3376be0..74ad2f7f 100644 --- a/print-bfd.c +++ b/print-bfd.c @@ -20,12 +20,11 @@ * RFC 5880 for version 1, and RFC 5881 */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" @@ -142,6 +141,14 @@ static const struct tok bfd_diag_values[] = { { 0, NULL } }; +static const struct tok bfd_port_values[] = { + { BFD_CONTROL_PORT, "Control" }, + { BFD_MULTIHOP_PORT, "Multihop" }, + { BFD_LAG_PORT, "LAG" }, + { SBFD_PORT, "S-BFD" }, + { 0, NULL } +}; + #define BFD_FLAG_AUTH 0x04 static const struct tok bfd_v0_flag_values[] = { @@ -174,7 +181,7 @@ static const struct tok bfd_v1_state_values[] = { { 0, NULL } }; -static int +static void auth_print(netdissect_options *ndo, const u_char *pptr) { const struct bfd_auth_header_t *bfd_auth_header; @@ -184,13 +191,13 @@ auth_print(netdissect_options *ndo, const u_char *pptr) pptr += sizeof (struct bfd_header_t); bfd_auth_header = (const struct bfd_auth_header_t *)pptr; ND_TCHECK_SIZE(bfd_auth_header); - auth_type = EXTRACT_U_1(bfd_auth_header->auth_type); - auth_len = EXTRACT_U_1(bfd_auth_header->auth_len); + auth_type = GET_U_1(bfd_auth_header->auth_type); + auth_len = GET_U_1(bfd_auth_header->auth_len); ND_PRINT("\n\tAuthentication: %s (%u), length: %u", tok2str(bfd_v1_authentication_values,"Unknown",auth_type), auth_type, auth_len); pptr += 2; - ND_PRINT("\n\t Auth Key ID: %u", EXTRACT_U_1(pptr)); + ND_PRINT("\n\t Auth Key ID: %u", GET_U_1(pptr)); switch(auth_type) { case AUTH_PASSWORD: @@ -214,9 +221,7 @@ auth_print(netdissect_options *ndo, const u_char *pptr) pptr++; ND_PRINT(", Password: "); /* the length is equal to the password length plus three */ - if (nd_printn(ndo, pptr, auth_len - 3, - ndo->ndo_snapend)) - goto trunc; + nd_printjn(ndo, pptr, auth_len - 3); break; case AUTH_MD5: case AUTH_MET_MD5: @@ -241,13 +246,12 @@ auth_print(netdissect_options *ndo, const u_char *pptr) break; } pptr += 2; - ND_TCHECK_4(pptr); - ND_PRINT(", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr)); + ND_PRINT(", Sequence Number: 0x%08x", GET_BE_U_4(pptr)); pptr += 4; ND_TCHECK_LEN(pptr, AUTH_MD5_HASH_LEN); ND_PRINT("\n\t Digest: "); for(i = 0; i < AUTH_MD5_HASH_LEN; i++) - ND_PRINT("%02x", EXTRACT_U_1(pptr + i)); + ND_PRINT("%02x", GET_U_1(pptr + i)); break; case AUTH_SHA1: case AUTH_MET_SHA1: @@ -272,19 +276,14 @@ auth_print(netdissect_options *ndo, const u_char *pptr) break; } pptr += 2; - ND_TCHECK_4(pptr); - ND_PRINT(", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr)); + ND_PRINT(", Sequence Number: 0x%08x", GET_BE_U_4(pptr)); pptr += 4; ND_TCHECK_LEN(pptr, AUTH_SHA1_HASH_LEN); ND_PRINT("\n\t Hash: "); for(i = 0; i < AUTH_SHA1_HASH_LEN; i++) - ND_PRINT("%02x", EXTRACT_U_1(pptr + i)); + ND_PRINT("%02x", GET_U_1(pptr + i)); break; } - return 0; - -trunc: - return 1; } void @@ -292,7 +291,10 @@ bfd_print(netdissect_options *ndo, const u_char *pptr, u_int len, u_int port) { ndo->ndo_protocol = "bfd"; - if (port == BFD_CONTROL_PORT) { + if (port == BFD_CONTROL_PORT || + port == BFD_MULTIHOP_PORT || + port == BFD_LAG_PORT || + port == SBFD_PORT) { /* * Control packet. */ @@ -303,16 +305,15 @@ bfd_print(netdissect_options *ndo, const u_char *pptr, bfd_header = (const struct bfd_header_t *)pptr; ND_TCHECK_SIZE(bfd_header); - version_diag = EXTRACT_U_1(bfd_header->version_diag); + version_diag = GET_U_1(bfd_header->version_diag); version = BFD_EXTRACT_VERSION(version_diag); - flags = EXTRACT_U_1(bfd_header->flags); + flags = GET_U_1(bfd_header->flags); switch (version) { /* BFDv0 */ case 0: - if (ndo->ndo_vflag < 1) - { + if (ndo->ndo_vflag < 1) { ND_PRINT("BFDv0, Control, Flags: [%s], length: %u", bittok2str(bfd_v0_flag_values, "none", flags), len); @@ -326,56 +327,65 @@ bfd_print(netdissect_options *ndo, const u_char *pptr, BFD_EXTRACT_DIAG(version_diag)); ND_PRINT("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", - EXTRACT_U_1(bfd_header->detect_time_multiplier), - EXTRACT_U_1(bfd_header->detect_time_multiplier) * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000, - EXTRACT_U_1(bfd_header->length)); - - - ND_PRINT("\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator)); - ND_PRINT(", Your Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->your_discriminator)); - ND_PRINT("\n\t Desired min Tx Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000); - ND_PRINT("\n\t Required min Rx Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000); - ND_PRINT("\n\t Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000); + GET_U_1(bfd_header->detect_time_multiplier), + GET_U_1(bfd_header->detect_time_multiplier) * GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000, + GET_U_1(bfd_header->length)); + + + ND_PRINT("\n\tMy Discriminator: 0x%08x", + GET_BE_U_4(bfd_header->my_discriminator)); + ND_PRINT(", Your Discriminator: 0x%08x", + GET_BE_U_4(bfd_header->your_discriminator)); + ND_PRINT("\n\t Desired min Tx Interval: %4u ms", + GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000); + ND_PRINT("\n\t Required min Rx Interval: %4u ms", + GET_BE_U_4(bfd_header->required_min_rx_interval)/1000); + ND_PRINT("\n\t Required min Echo Interval: %4u ms", + GET_BE_U_4(bfd_header->required_min_echo_interval)/1000); if (flags & BFD_FLAG_AUTH) { - if (auth_print(ndo, pptr)) - goto trunc; + auth_print(ndo, pptr); } break; /* BFDv1 */ case 1: - if (ndo->ndo_vflag < 1) - { - ND_PRINT("BFDv1, Control, State %s, Flags: [%s], length: %u", + if (ndo->ndo_vflag < 1) { + ND_PRINT("BFDv1, %s, State %s, Flags: [%s], length: %u", + tok2str(bfd_port_values, "unknown (%u)", port), tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6), bittok2str(bfd_v1_flag_values, "none", flags & 0x3f), len); return; } - ND_PRINT("BFDv1, length: %u\n\tControl, State %s, Flags: [%s], Diagnostic: %s (0x%02x)", + ND_PRINT("BFDv1, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)", len, + tok2str(bfd_port_values, "unknown (%u)", port), tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6), bittok2str(bfd_v1_flag_values, "none", flags & 0x3f), tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(version_diag)), BFD_EXTRACT_DIAG(version_diag)); ND_PRINT("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", - EXTRACT_U_1(bfd_header->detect_time_multiplier), - EXTRACT_U_1(bfd_header->detect_time_multiplier) * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000, - EXTRACT_U_1(bfd_header->length)); - - - ND_PRINT("\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator)); - ND_PRINT(", Your Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->your_discriminator)); - ND_PRINT("\n\t Desired min Tx Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000); - ND_PRINT("\n\t Required min Rx Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000); - ND_PRINT("\n\t Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000); + GET_U_1(bfd_header->detect_time_multiplier), + GET_U_1(bfd_header->detect_time_multiplier) * GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000, + GET_U_1(bfd_header->length)); + + + ND_PRINT("\n\tMy Discriminator: 0x%08x", + GET_BE_U_4(bfd_header->my_discriminator)); + ND_PRINT(", Your Discriminator: 0x%08x", + GET_BE_U_4(bfd_header->your_discriminator)); + ND_PRINT("\n\t Desired min Tx Interval: %4u ms", + GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000); + ND_PRINT("\n\t Required min Rx Interval: %4u ms", + GET_BE_U_4(bfd_header->required_min_rx_interval)/1000); + ND_PRINT("\n\t Required min Echo Interval: %4u ms", + GET_BE_U_4(bfd_header->required_min_echo_interval)/1000); if (flags & BFD_FLAG_AUTH) { - if (auth_print(ndo, pptr)) - goto trunc; + auth_print(ndo, pptr); } break; @@ -411,8 +421,4 @@ bfd_print(netdissect_options *ndo, const u_char *pptr, return; } } - return; - -trunc: - nd_print_trunc(ndo); }