X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/4a28df231d469d78763dfaab9ee9ad4d0a73fca1..a8abce5c5e2dce2ba6dbccd5d3829da104b80f9c:/print-cfm.c diff --git a/print-cfm.c b/print-cfm.c index 40565af8..45608256 100644 --- a/print-cfm.c +++ b/print-cfm.c @@ -18,10 +18,10 @@ /* \summary: IEEE 802.1ag Connectivity Fault Management (CFM) protocols printer */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include "netdissect-stdinc.h" #include @@ -31,6 +31,7 @@ #include "oui.h" #include "af.h" + struct cfm_common_header_t { nd_uint8_t mdlevel_version; nd_uint8_t opcode; @@ -39,7 +40,7 @@ struct cfm_common_header_t { }; #define CFM_VERSION 0 -#define CFM_EXTRACT_VERSION(x) (((x)&0x1f)) +#define CFM_EXTRACT_VERSION(x) ((x)&0x1f) #define CFM_EXTRACT_MD_LEVEL(x) (((x)&0xe0)>>5) #define CFM_OPCODE_CCM 1 @@ -71,12 +72,12 @@ struct cfm_ccm_t { * Timer Bases for the CCM Interval field. * Expressed in units of seconds. */ -static const float ccm_interval_base[8] = {0, 0.003333, 0.01, 0.1, 1, 10, 60, 600}; +static const float ccm_interval_base[8] = {0.0f, 0.003333f, 0.01f, 0.1f, 1.0f, 10.0f, 60.0f, 600.0f}; #define CCM_INTERVAL_MIN_MULTIPLIER 3.25 #define CCM_INTERVAL_MAX_MULTIPLIER 3.5 #define CFM_CCM_RDI_FLAG 0x80 -#define CFM_EXTRACT_CCM_INTERVAL(x) (((x)&0x07)) +#define CFM_EXTRACT_CCM_INTERVAL(x) ((x)&0x07) #define CFM_CCM_MD_FORMAT_8021 0 #define CFM_CCM_MD_FORMAT_NONE 1 @@ -227,14 +228,14 @@ cfm_network_addr_print(netdissect_options *ndo, * is only one octet. */ if (length < 1) { - ND_PRINT((ndo, "\n\t Network Address Type (invalid, no data")); + ND_PRINT("\n\t Network Address Type (invalid, no data"); return hexdump; } /* The calling function must make any due ND_TCHECK calls. */ network_addr_type = EXTRACT_U_1(tptr); - ND_PRINT((ndo, "\n\t Network Address Type %s (%u)", + ND_PRINT("\n\t Network Address Type %s (%u)", tok2str(af_values, "Unknown", network_addr_type), - network_addr_type)); + network_addr_type); /* * Resolve the passed in Address. @@ -242,20 +243,20 @@ cfm_network_addr_print(netdissect_options *ndo, switch(network_addr_type) { case AFNUM_INET: if (length != 1 + 4) { - ND_PRINT((ndo, "(invalid IPv4 address length %u)", length - 1)); + ND_PRINT("(invalid IPv4 address length %u)", length - 1); hexdump = TRUE; break; } - ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr + 1))); + ND_PRINT(", %s", ipaddr_string(ndo, tptr + 1)); break; case AFNUM_INET6: if (length != 1 + 16) { - ND_PRINT((ndo, "(invalid IPv6 address length %u)", length - 1)); + ND_PRINT("(invalid IPv6 address length %u)", length - 1); hexdump = TRUE; break; } - ND_PRINT((ndo, ", %s", ip6addr_string(ndo, tptr + 1))); + ND_PRINT(", %s", ip6addr_string(ndo, tptr + 1)); break; default: @@ -290,6 +291,7 @@ cfm_print(netdissect_options *ndo, const struct cfm_ltr_t *cfm_ltr; } msg_ptr; + ndo->ndo_protocol = "cfm"; tptr=pptr; cfm_common_header = (const struct cfm_common_header_t *)pptr; if (length < sizeof(*cfm_common_header)) @@ -301,17 +303,17 @@ cfm_print(netdissect_options *ndo, */ mdlevel_version = EXTRACT_U_1(cfm_common_header->mdlevel_version); if (CFM_EXTRACT_VERSION(mdlevel_version) != CFM_VERSION) { - ND_PRINT((ndo, "CFMv%u not supported, length %u", - CFM_EXTRACT_VERSION(mdlevel_version), length)); + ND_PRINT("CFMv%u not supported, length %u", + CFM_EXTRACT_VERSION(mdlevel_version), length); return; } opcode = EXTRACT_U_1(cfm_common_header->opcode); - ND_PRINT((ndo, "CFMv%u %s, MD Level %u, length %u", + ND_PRINT("CFMv%u %s, MD Level %u, length %u", CFM_EXTRACT_VERSION(mdlevel_version), tok2str(cfm_opcode_values, "unknown (%u)", opcode), CFM_EXTRACT_MD_LEVEL(mdlevel_version), - length)); + length); /* * In non-verbose mode just print the opcode and md-level. @@ -322,7 +324,7 @@ cfm_print(netdissect_options *ndo, flags = EXTRACT_U_1(cfm_common_header->flags); first_tlv_offset = EXTRACT_U_1(cfm_common_header->first_tlv_offset); - ND_PRINT((ndo, "\n\tFirst TLV offset %u", first_tlv_offset)); + ND_PRINT("\n\tFirst TLV offset %u", first_tlv_offset); tptr += sizeof(struct cfm_common_header_t); tlen = length - sizeof(struct cfm_common_header_t); @@ -331,7 +333,7 @@ cfm_print(netdissect_options *ndo, * Sanity check the first TLV offset. */ if (first_tlv_offset > tlen) { - ND_PRINT((ndo, " (too large, must be <= %u)", tlen)); + ND_PRINT(" (too large, must be <= %u)", tlen); return; } @@ -339,8 +341,8 @@ cfm_print(netdissect_options *ndo, case CFM_OPCODE_CCM: msg_ptr.cfm_ccm = (const struct cfm_ccm_t *)tptr; if (first_tlv_offset < sizeof(*msg_ptr.cfm_ccm)) { - ND_PRINT((ndo, " (too small 1, must be >= %lu)", - (unsigned long) sizeof(*msg_ptr.cfm_ccm))); + ND_PRINT(" (too small 1, must be >= %lu)", + (unsigned long) sizeof(*msg_ptr.cfm_ccm)); return; } if (tlen < sizeof(*msg_ptr.cfm_ccm)) @@ -348,25 +350,25 @@ cfm_print(netdissect_options *ndo, ND_TCHECK_SIZE(msg_ptr.cfm_ccm); ccm_interval = CFM_EXTRACT_CCM_INTERVAL(flags); - ND_PRINT((ndo, ", Flags [CCM Interval %u%s]", + ND_PRINT(", Flags [CCM Interval %u%s]", ccm_interval, flags & CFM_CCM_RDI_FLAG ? - ", RDI" : "")); + ", RDI" : ""); /* * Resolve the CCM interval field. */ if (ccm_interval) { - ND_PRINT((ndo, "\n\t CCM Interval %.3fs" + ND_PRINT("\n\t CCM Interval %.3fs" ", min CCM Lifetime %.3fs, max CCM Lifetime %.3fs", ccm_interval_base[ccm_interval], ccm_interval_base[ccm_interval] * CCM_INTERVAL_MIN_MULTIPLIER, - ccm_interval_base[ccm_interval] * CCM_INTERVAL_MAX_MULTIPLIER)); + ccm_interval_base[ccm_interval] * CCM_INTERVAL_MAX_MULTIPLIER); } - ND_PRINT((ndo, "\n\t Sequence Number 0x%08x, MA-End-Point-ID 0x%04x", + ND_PRINT("\n\t Sequence Number 0x%08x, MA-End-Point-ID 0x%04x", EXTRACT_BE_U_4(msg_ptr.cfm_ccm->sequence), - EXTRACT_BE_U_2(msg_ptr.cfm_ccm->ma_epi))); + EXTRACT_BE_U_2(msg_ptr.cfm_ccm->ma_epi)); namesp = msg_ptr.cfm_ccm->names; names_data_remaining = sizeof(msg_ptr.cfm_ccm->names); @@ -381,35 +383,35 @@ cfm_print(netdissect_options *ndo, md_namelength = EXTRACT_U_1(namesp); namesp++; names_data_remaining--; /* We know this is !=0 */ - ND_PRINT((ndo, "\n\t MD Name Format %s (%u), MD Name length %u", + ND_PRINT("\n\t MD Name Format %s (%u), MD Name length %u", tok2str(cfm_md_nameformat_values, "Unknown", md_nameformat), md_nameformat, - md_namelength)); + md_namelength); /* * -3 for the MA short name format and length and one byte * of MA short name. */ if (md_namelength > names_data_remaining - 3) { - ND_PRINT((ndo, " (too large, must be <= %u)", names_data_remaining - 2)); + ND_PRINT(" (too large, must be <= %u)", names_data_remaining - 2); return; } md_name = namesp; - ND_PRINT((ndo, "\n\t MD Name: ")); + ND_PRINT("\n\t MD Name: "); switch (md_nameformat) { case CFM_CCM_MD_FORMAT_DNS: case CFM_CCM_MD_FORMAT_CHAR: - safeputs(ndo, md_name, md_namelength); + (void)nd_printzp(ndo, md_name, md_namelength, NULL); break; case CFM_CCM_MD_FORMAT_MAC: if (md_namelength == 6) { - ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string(ndo, - md_name))); + ND_PRINT("\n\t MAC %s", etheraddr_string(ndo, + md_name)); } else { - ND_PRINT((ndo, "\n\t MAC (length invalid)")); + ND_PRINT("\n\t MAC (length invalid)"); } break; @@ -422,10 +424,10 @@ cfm_print(netdissect_options *ndo, namesp += md_namelength; names_data_remaining -= md_namelength; } else { - ND_PRINT((ndo, "\n\t MD Name Format %s (%u)", + ND_PRINT("\n\t MD Name Format %s (%u)", tok2str(cfm_md_nameformat_values, "Unknown", md_nameformat), - md_nameformat)); + md_nameformat); } @@ -438,22 +440,22 @@ cfm_print(netdissect_options *ndo, ma_namelength = EXTRACT_U_1(namesp); namesp++; names_data_remaining--; /* We know this is != 0 */ - ND_PRINT((ndo, "\n\t MA Name-Format %s (%u), MA name length %u", + ND_PRINT("\n\t MA Name-Format %s (%u), MA name length %u", tok2str(cfm_ma_nameformat_values, "Unknown", ma_nameformat), ma_nameformat, - ma_namelength)); + ma_namelength); if (ma_namelength > names_data_remaining) { - ND_PRINT((ndo, " (too large, must be <= %u)", names_data_remaining)); + ND_PRINT(" (too large, must be <= %u)", names_data_remaining); return; } ma_name = namesp; - ND_PRINT((ndo, "\n\t MA Name: ")); + ND_PRINT("\n\t MA Name: "); switch (ma_nameformat) { case CFM_CCM_MA_FORMAT_CHAR: - safeputs(ndo, ma_name, ma_namelength); + (void)nd_printzp(ndo, ma_name, ma_namelength, NULL); break; /* FIXME add printers for those MA formats - hexdump for now */ @@ -469,49 +471,49 @@ cfm_print(netdissect_options *ndo, case CFM_OPCODE_LTM: msg_ptr.cfm_ltm = (const struct cfm_ltm_t *)tptr; if (first_tlv_offset < sizeof(*msg_ptr.cfm_ltm)) { - ND_PRINT((ndo, " (too small 4, must be >= %lu)", - (unsigned long) sizeof(*msg_ptr.cfm_ltm))); + ND_PRINT(" (too small 4, must be >= %lu)", + (unsigned long) sizeof(*msg_ptr.cfm_ltm)); return; } if (tlen < sizeof(*msg_ptr.cfm_ltm)) goto tooshort; ND_TCHECK_SIZE(msg_ptr.cfm_ltm); - ND_PRINT((ndo, ", Flags [%s]", - bittok2str(cfm_ltm_flag_values, "none", flags))); + ND_PRINT(", Flags [%s]", + bittok2str(cfm_ltm_flag_values, "none", flags)); - ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, ttl %u", + ND_PRINT("\n\t Transaction-ID 0x%08x, ttl %u", EXTRACT_BE_U_4(msg_ptr.cfm_ltm->transaction_id), - EXTRACT_U_1(msg_ptr.cfm_ltm->ttl))); + EXTRACT_U_1(msg_ptr.cfm_ltm->ttl)); - ND_PRINT((ndo, "\n\t Original-MAC %s, Target-MAC %s", + ND_PRINT("\n\t Original-MAC %s, Target-MAC %s", etheraddr_string(ndo, msg_ptr.cfm_ltm->original_mac), - etheraddr_string(ndo, msg_ptr.cfm_ltm->target_mac))); + etheraddr_string(ndo, msg_ptr.cfm_ltm->target_mac)); break; case CFM_OPCODE_LTR: msg_ptr.cfm_ltr = (const struct cfm_ltr_t *)tptr; if (first_tlv_offset < sizeof(*msg_ptr.cfm_ltr)) { - ND_PRINT((ndo, " (too small 5, must be >= %lu)", - (unsigned long) sizeof(*msg_ptr.cfm_ltr))); + ND_PRINT(" (too small 5, must be >= %lu)", + (unsigned long) sizeof(*msg_ptr.cfm_ltr)); return; } if (tlen < sizeof(*msg_ptr.cfm_ltr)) goto tooshort; ND_TCHECK_SIZE(msg_ptr.cfm_ltr); - ND_PRINT((ndo, ", Flags [%s]", - bittok2str(cfm_ltr_flag_values, "none", flags))); + ND_PRINT(", Flags [%s]", + bittok2str(cfm_ltr_flag_values, "none", flags)); - ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, ttl %u", + ND_PRINT("\n\t Transaction-ID 0x%08x, ttl %u", EXTRACT_BE_U_4(msg_ptr.cfm_ltr->transaction_id), - EXTRACT_U_1(msg_ptr.cfm_ltr->ttl))); + EXTRACT_U_1(msg_ptr.cfm_ltr->ttl)); - ND_PRINT((ndo, "\n\t Replay-Action %s (%u)", + ND_PRINT("\n\t Replay-Action %s (%u)", tok2str(cfm_ltr_replay_action_values, "Unknown", EXTRACT_U_1(msg_ptr.cfm_ltr->replay_action)), - EXTRACT_U_1(msg_ptr.cfm_ltr->replay_action))); + EXTRACT_U_1(msg_ptr.cfm_ltr->replay_action)); break; /* @@ -536,9 +538,9 @@ cfm_print(netdissect_options *ndo, ND_TCHECK_1(cfm_tlv_header->type); cfm_tlv_type = EXTRACT_U_1(cfm_tlv_header->type); - ND_PRINT((ndo, "\n\t%s TLV (0x%02x)", + ND_PRINT("\n\t%s TLV (0x%02x)", tok2str(cfm_tlv_values, "Unknown", cfm_tlv_type), - cfm_tlv_type)); + cfm_tlv_type); if (cfm_tlv_type == CFM_TLV_END) { /* Length is "Not present if the Type field is 0." */ @@ -551,7 +553,7 @@ cfm_print(netdissect_options *ndo, ND_TCHECK_LEN(tptr, sizeof(struct cfm_tlv_header_t)); cfm_tlv_len=EXTRACT_BE_U_2(cfm_tlv_header->length); - ND_PRINT((ndo, ", length %u", cfm_tlv_len)); + ND_PRINT(", length %u", cfm_tlv_len); tptr += sizeof(struct cfm_tlv_header_t); tlen -= sizeof(struct cfm_tlv_header_t); @@ -566,33 +568,33 @@ cfm_print(netdissect_options *ndo, switch(cfm_tlv_type) { case CFM_TLV_PORT_STATUS: if (cfm_tlv_len < 1) { - ND_PRINT((ndo, " (too short, must be >= 1)")); + ND_PRINT(" (too short, must be >= 1)"); return; } - ND_PRINT((ndo, ", Status: %s (%u)", + ND_PRINT(", Status: %s (%u)", tok2str(cfm_tlv_port_status_values, "Unknown", EXTRACT_U_1(tptr)), - EXTRACT_U_1(tptr))); + EXTRACT_U_1(tptr)); break; case CFM_TLV_INTERFACE_STATUS: if (cfm_tlv_len < 1) { - ND_PRINT((ndo, " (too short, must be >= 1)")); + ND_PRINT(" (too short, must be >= 1)"); return; } - ND_PRINT((ndo, ", Status: %s (%u)", + ND_PRINT(", Status: %s (%u)", tok2str(cfm_tlv_interface_status_values, "Unknown", EXTRACT_U_1(tptr)), - EXTRACT_U_1(tptr))); + EXTRACT_U_1(tptr)); break; case CFM_TLV_PRIVATE: if (cfm_tlv_len < 4) { - ND_PRINT((ndo, " (too short, must be >= 4)")); + ND_PRINT(" (too short, must be >= 4)"); return; } - ND_PRINT((ndo, ", Vendor: %s (%u), Sub-Type %u", + ND_PRINT(", Vendor: %s (%u), Sub-Type %u", tok2str(oui_values,"Unknown", EXTRACT_BE_U_3(tptr)), EXTRACT_BE_U_3(tptr), - EXTRACT_U_1(tptr + 3))); + EXTRACT_U_1(tptr + 3)); hexdump = TRUE; break; @@ -602,7 +604,7 @@ cfm_print(netdissect_options *ndo, u_int mgmt_addr_length; if (cfm_tlv_len < 1) { - ND_PRINT((ndo, " (too short, must be >= 1)")); + ND_PRINT(" (too short, must be >= 1)"); goto next_tlv; } @@ -622,20 +624,20 @@ cfm_print(netdissect_options *ndo, * IEEE 802.1AB-2016 Section 8.5.2.2: chassis ID subtype */ if (cfm_tlv_len < 1) { - ND_PRINT((ndo, "\n\t (TLV too short)")); + ND_PRINT("\n\t (TLV too short)"); goto next_tlv; } chassis_id_type = EXTRACT_U_1(tptr); cfm_tlv_len--; - ND_PRINT((ndo, "\n\t Chassis-ID Type %s (%u), Chassis-ID length %u", + ND_PRINT("\n\t Chassis-ID Type %s (%u), Chassis-ID length %u", tok2str(cfm_tlv_senderid_chassisid_values, "Unknown", chassis_id_type), chassis_id_type, - chassis_id_length)); + chassis_id_length); if (cfm_tlv_len < chassis_id_length) { - ND_PRINT((ndo, "\n\t (TLV too short)")); + ND_PRINT("\n\t (TLV too short)"); goto next_tlv; } @@ -643,11 +645,11 @@ cfm_print(netdissect_options *ndo, switch (chassis_id_type) { case CFM_CHASSIS_ID_MAC_ADDRESS: if (chassis_id_length != MAC_ADDR_LEN) { - ND_PRINT((ndo, " (invalid MAC address length)")); + ND_PRINT(" (invalid MAC address length)"); hexdump = TRUE; break; } - ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string(ndo, tptr + 1))); + ND_PRINT("\n\t MAC %s", etheraddr_string(ndo, tptr + 1)); break; case CFM_CHASSIS_ID_NETWORK_ADDRESS: @@ -659,7 +661,7 @@ cfm_print(netdissect_options *ndo, case CFM_CHASSIS_ID_LOCAL: case CFM_CHASSIS_ID_CHASSIS_COMPONENT: case CFM_CHASSIS_ID_PORT_COMPONENT: - safeputs(ndo, tptr + 1, chassis_id_length); + (void)nd_printzp(ndo, tptr + 1, chassis_id_length, NULL); break; default: @@ -688,11 +690,11 @@ cfm_print(netdissect_options *ndo, tptr++; tlen--; cfm_tlv_len--; - ND_PRINT((ndo, "\n\t Management Address Domain Length %u", mgmt_addr_length)); + ND_PRINT("\n\t Management Address Domain Length %u", mgmt_addr_length); if (mgmt_addr_length) { /* IEEE 802.1Q-2014 Section 21.5.3.5: Management Address Domain */ if (cfm_tlv_len < mgmt_addr_length) { - ND_PRINT((ndo, "\n\t (TLV too short)")); + ND_PRINT("\n\t (TLV too short)"); goto next_tlv; } cfm_tlv_len -= mgmt_addr_length; @@ -708,7 +710,7 @@ cfm_print(netdissect_options *ndo, * This field is present if Management Address Domain Length is not 0. */ if (cfm_tlv_len < 1) { - ND_PRINT((ndo, " (Management Address Length is missing)")); + ND_PRINT(" (Management Address Length is missing)"); hexdump = TRUE; break; } @@ -718,11 +720,11 @@ cfm_print(netdissect_options *ndo, tptr++; tlen--; cfm_tlv_len--; - ND_PRINT((ndo, "\n\t Management Address Length %u", mgmt_addr_length)); + ND_PRINT("\n\t Management Address Length %u", mgmt_addr_length); if (mgmt_addr_length) { /* IEEE 802.1Q-2014 Section 21.5.3.7: Management Address */ if (cfm_tlv_len < mgmt_addr_length) { - ND_PRINT((ndo, "\n\t (TLV too short)")); + ND_PRINT("\n\t (TLV too short)"); return; } cfm_tlv_len -= mgmt_addr_length; @@ -760,9 +762,9 @@ next_tlv: return; tooshort: - ND_PRINT((ndo, "\n\t\t packet is too short")); + ND_PRINT("\n\t\t packet is too short"); return; trunc: - ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); + nd_print_trunc(ndo); }