*/
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;
};
/*
*/
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 {
};
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
* | ... |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
- 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;
* | ... |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
- 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:
* | ... |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
- 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;
}
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 */
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;
}
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)));
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;
}
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)));
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;
}