X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/da20bc56d6100b5275d6f85c4a25bac1dab4e57e..9f957a5883cb4c5c99cefa71b42fc9d2d27d73e1:/print-bfd.c diff --git a/print-bfd.c b/print-bfd.c index b2cfd61b..77a8c366 100644 --- a/print-bfd.c +++ b/print-bfd.c @@ -69,15 +69,15 @@ */ struct bfd_header_t { - uint8_t version_diag; - uint8_t flags; - uint8_t detect_time_multiplier; - uint8_t length; - uint8_t my_discriminator[4]; - uint8_t your_discriminator[4]; - uint8_t desired_min_tx_interval[4]; - uint8_t required_min_rx_interval[4]; - uint8_t required_min_echo_interval[4]; + nd_uint8_t version_diag; + nd_uint8_t flags; + nd_uint8_t detect_time_multiplier; + nd_uint8_t length; + nd_uint32_t my_discriminator; + nd_uint32_t your_discriminator; + nd_uint32_t desired_min_tx_interval; + nd_uint32_t required_min_rx_interval; + nd_uint32_t required_min_echo_interval; }; /* @@ -91,10 +91,10 @@ struct bfd_header_t { */ struct bfd_auth_header_t { - uint8_t auth_type; - uint8_t auth_len; - uint8_t auth_data; - uint8_t dummy; /* minimun 4 bytes */ + nd_uint8_t auth_type; + nd_uint8_t auth_len; + nd_uint8_t auth_data; + nd_uint8_t dummy; /* minimum 4 bytes */ }; enum auth_type { @@ -178,22 +178,24 @@ static const struct tok bfd_v1_state_values[] = { }; static int -auth_print(netdissect_options *ndo, register const u_char *pptr) +auth_print(netdissect_options *ndo, const u_char *pptr) { const struct bfd_auth_header_t *bfd_auth_header; + uint8_t auth_type, auth_len; int i; pptr += sizeof (struct bfd_header_t); bfd_auth_header = (const struct bfd_auth_header_t *)pptr; ND_TCHECK(*bfd_auth_header); + auth_type = EXTRACT_U_1(bfd_auth_header->auth_type); + auth_len = EXTRACT_U_1(bfd_auth_header->auth_len); ND_PRINT((ndo, "\n\tAuthentication: %s (%u), length: %u", - tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type), - bfd_auth_header->auth_type, - bfd_auth_header->auth_len)); + tok2str(bfd_v1_authentication_values,"Unknown",auth_type), + auth_type, auth_len)); pptr += 2; - ND_PRINT((ndo, "\n\t Auth Key ID: %d", *pptr)); + ND_PRINT((ndo, "\n\t Auth Key ID: %u", EXTRACT_U_1(pptr))); - switch(bfd_auth_header->auth_type) { + switch(auth_type) { case AUTH_PASSWORD: /* * Simple Password Authentication Section Format @@ -206,16 +208,16 @@ auth_print(netdissect_options *ndo, register const u_char *pptr) * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - if (bfd_auth_header->auth_len < AUTH_PASSWORD_FIELD_MIN_LEN || - bfd_auth_header->auth_len > AUTH_PASSWORD_FIELD_MAX_LEN) { - ND_PRINT((ndo, "[invalid length %d]", - bfd_auth_header->auth_len)); + if (auth_len < AUTH_PASSWORD_FIELD_MIN_LEN || + auth_len > AUTH_PASSWORD_FIELD_MAX_LEN) { + ND_PRINT((ndo, "[invalid length %u]", + auth_len)); break; } pptr++; ND_PRINT((ndo, ", Password: ")); /* the length is equal to the password length plus three */ - if (fn_printn(ndo, pptr, bfd_auth_header->auth_len - 3, + if (fn_printn(ndo, pptr, auth_len - 3, ndo->ndo_snapend)) goto trunc; break; @@ -236,19 +238,19 @@ auth_print(netdissect_options *ndo, register const u_char *pptr) * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - if (bfd_auth_header->auth_len != AUTH_MD5_FIELD_LEN) { - ND_PRINT((ndo, "[invalid length %d]", - bfd_auth_header->auth_len)); + if (auth_len != AUTH_MD5_FIELD_LEN) { + ND_PRINT((ndo, "[invalid length %u]", + auth_len)); break; } pptr += 2; - ND_TCHECK2(*pptr, 4); + ND_TCHECK_4(pptr); ND_PRINT((ndo, ", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr))); pptr += 4; - ND_TCHECK2(*pptr, AUTH_MD5_HASH_LEN); + ND_TCHECK_LEN(pptr, AUTH_MD5_HASH_LEN); ND_PRINT((ndo, "\n\t Digest: ")); for(i = 0; i < AUTH_MD5_HASH_LEN; i++) - ND_PRINT((ndo, "%02x", pptr[i])); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(pptr + i))); break; case AUTH_SHA1: case AUTH_MET_SHA1: @@ -267,19 +269,19 @@ auth_print(netdissect_options *ndo, register const u_char *pptr) * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - if (bfd_auth_header->auth_len != AUTH_SHA1_FIELD_LEN) { - ND_PRINT((ndo, "[invalid length %d]", - bfd_auth_header->auth_len)); + if (auth_len != AUTH_SHA1_FIELD_LEN) { + ND_PRINT((ndo, "[invalid length %u]", + auth_len)); break; } pptr += 2; - ND_TCHECK2(*pptr, 4); + ND_TCHECK_4(pptr); ND_PRINT((ndo, ", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr))); pptr += 4; - ND_TCHECK2(*pptr, AUTH_SHA1_HASH_LEN); + ND_TCHECK_LEN(pptr, AUTH_SHA1_HASH_LEN); ND_PRINT((ndo, "\n\t Hash: ")); for(i = 0; i < AUTH_SHA1_HASH_LEN; i++) - ND_PRINT((ndo, "%02x", pptr[i])); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(pptr + i))); break; } return 0; @@ -289,20 +291,24 @@ trunc: } void -bfd_print(netdissect_options *ndo, register const u_char *pptr, - register u_int len, register u_int port) +bfd_print(netdissect_options *ndo, const u_char *pptr, + u_int len, u_int port) { const struct bfd_header_t *bfd_header; + uint8_t version_diag; uint8_t version = 0; + uint8_t flags; bfd_header = (const struct bfd_header_t *)pptr; + version_diag = EXTRACT_U_1(bfd_header->version_diag); if (port == BFD_CONTROL_PORT) { ND_TCHECK(*bfd_header); - version = BFD_EXTRACT_VERSION(bfd_header->version_diag); + version = BFD_EXTRACT_VERSION(version_diag); } else if (port == BFD_ECHO_PORT) { /* Echo is BFD v1 only */ version = 1; } + flags = EXTRACT_U_1(bfd_header->flags); switch ((port << 8) | version) { /* BFDv0 */ @@ -312,7 +318,7 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr, ND_PRINT((ndo, "BFDv%u, %s, Flags: [%s], length: %u", version, tok2str(bfd_port_values, "unknown (%u)", port), - bittok2str(bfd_v0_flag_values, "none", bfd_header->flags), + bittok2str(bfd_v0_flag_values, "none", flags), len)); return; } @@ -321,14 +327,14 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr, version, len, tok2str(bfd_port_values, "unknown (%u)", port), - bittok2str(bfd_v0_flag_values, "none", bfd_header->flags), - tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)), - BFD_EXTRACT_DIAG(bfd_header->version_diag))); + bittok2str(bfd_v0_flag_values, "none", flags), + tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(version_diag)), + BFD_EXTRACT_DIAG(version_diag))); ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", - bfd_header->detect_time_multiplier, - bfd_header->detect_time_multiplier * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000, - bfd_header->length)); + 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((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator))); @@ -345,8 +351,8 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr, ND_PRINT((ndo, "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) >> 6), - bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f), + tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6), + bittok2str(bfd_v1_flag_values, "none", flags & 0x3f), len)); return; } @@ -355,15 +361,15 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr, version, len, tok2str(bfd_port_values, "unknown (%u)", port), - 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))); + 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((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u", - bfd_header->detect_time_multiplier, - bfd_header->detect_time_multiplier * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000, - bfd_header->length)); + 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((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator))); @@ -372,7 +378,7 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr, ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000)); ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000)); - if (bfd_header->flags & BFD_FLAG_AUTH) { + if (flags & BFD_FLAG_AUTH) { if (auth_print(ndo, pptr)) goto trunc; }