+ tlv.slow_oam_info = (const struct slow_oam_info_t *)tptr;
+ while (tlen > 0) {
+ printf("\n\t %s Information Type (%u), Version %u, Rev %u, length %u",
+ tok2str(slow_oam_info_type_values, "Reserved", tlv.slow_oam_info->info_type),
+ tlv.slow_oam_info->info_type,
+ tlv.slow_oam_info->oam_version,
+ EXTRACT_16BITS(&tlv.slow_oam_info->revision),
+ tlv.slow_oam_info->info_len);
+
+ switch (tlv.slow_oam_info->info_type) {
+ case SLOW_OAM_INFO_TYPE_END_OF_TLV:
+
+ if (tlv.slow_oam_info->info_len != 0) {
+ printf("\n\t ERROR: illegal length - should be 0");
+ }
+ return;
+
+ case SLOW_OAM_INFO_TYPE_LOCAL: /* identical format - fall through */
+ case SLOW_OAM_INFO_TYPE_REMOTE:
+
+ if (tlv.slow_oam_info->info_len !=
+ SLOW_OAM_INFO_TYPE_LOCAL_REMOTE_MINLEN) {
+ printf("\n\t ERROR: illegal length - should be %u",
+ SLOW_OAM_INFO_TYPE_LOCAL_REMOTE_MINLEN);
+ return;
+ }
+
+ printf("\n\t State-MUX-Action %s, State-Parser-Action %s",
+ tok2str(slow_oam_info_type_state_parser_values, "Reserved",
+ tlv.slow_oam_info->state & OAM_INFO_TYPE_PARSER_MASK),
+ tok2str(slow_oam_info_type_state_mux_values, "Reserved",
+ tlv.slow_oam_info->state & OAM_INFO_TYPE_MUX_MASK));
+ printf("\n\t OAM-Config Flags [%s], OAM-PDU-Config max-PDU size %u",
+ bittok2str(slow_oam_info_type_oam_config_values, "none",
+ tlv.slow_oam_info->oam_config),
+ EXTRACT_16BITS(&tlv.slow_oam_info->oam_pdu_config) &
+ OAM_INFO_TYPE_PDU_SIZE_MASK);
+ printf("\n\t OUI %s (0x%06x), Vendor-Private 0x%08x",
+ tok2str(oui_values, "Unknown",
+ EXTRACT_24BITS(&tlv.slow_oam_info->oui)),
+ EXTRACT_24BITS(&tlv.slow_oam_info->oui),
+ EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private));
+ break;
+
+ case SLOW_OAM_INFO_TYPE_ORG_SPECIFIC:
+ /* FIXME hexdump */
+ break;
+
+ default:
+ break;
+ }
+
+ /* infinite loop check */
+ if (!tlv.slow_oam_info->info_len) {
+ return;
+ }
+ tlen -= tlv.slow_oam_info->info_len;
+ tptr += tlv.slow_oam_info->info_len;
+ }
+ break;
+ /* FIXME no codes yet known - just hexdump for now */