12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 1998-2006 The TCPDUMP project 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * support for the IEEE "slow protocols" LACP, MARKER as per 802.3ad 1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * OAM as per 802.3ah 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Hannes Gredler (hannes@juniper.net) 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-slow.c,v 1.8 2006-10-12 05:44:33 hannes Exp $"; 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h" 4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "oui.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_common_header_t { 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t proto_subtype; 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t version; 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLOW_PROTO_LACP 1 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLOW_PROTO_MARKER 2 4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_PROTO_OAM 3 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_VERSION 1 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MARKER_VERSION 1 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok slow_proto_values[] = { 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SLOW_PROTO_LACP, "LACP" }, 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { SLOW_PROTO_MARKER, "MARKER" }, 5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_PROTO_OAM, "OAM" }, 5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 6153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_flag_values[] = { 6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0001, "Link Fault" }, 6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0002, "Dying Gasp" }, 6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0004, "Critical Event" }, 6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0008, "Local Evaluating" }, 6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0010, "Local Stable" }, 6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0020, "Remote Evaluating" }, 6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x0040, "Remote Stable" }, 6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_INFO 0x00 7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_EVENT_NOTIF 0x01 7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_VAR_REQUEST 0x02 7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_VAR_RESPONSE 0x03 7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_LOOPBACK_CTRL 0x04 7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_CODE_PRIVATE 0xfe 7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 7953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_code_values[] = { 8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_INFO, "Information" }, 8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_EVENT_NOTIF, "Event Notification" }, 8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_VAR_REQUEST, "Variable Request" }, 8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_VAR_RESPONSE, "Variable Response" }, 8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_LOOPBACK_CTRL, "Loopback Control" }, 8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_CODE_PRIVATE, "Vendor Private" }, 8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 8953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_oam_info_t { 9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t info_type; 9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t info_length; 9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t oam_version; 9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t revision[2]; 9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t state; 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t oam_config; 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t oam_pdu_config[2]; 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t oui[3]; 9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t vendor_private[4]; 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_INFO_TYPE_END_OF_TLV 0x00 10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_INFO_TYPE_LOCAL 0x01 10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_INFO_TYPE_REMOTE 0x02 10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_INFO_TYPE_ORG_SPECIFIC 0xfe 10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_info_type_values[] = { 10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_INFO_TYPE_END_OF_TLV, "End of TLV marker" }, 10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_INFO_TYPE_LOCAL, "Local" }, 10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_INFO_TYPE_REMOTE, "Remote" }, 11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_INFO_TYPE_ORG_SPECIFIC, "Organization specific" }, 11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define OAM_INFO_TYPE_PARSER_MASK 0x3 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_info_type_state_parser_values[] = { 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x00, "forwarding" }, 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x01, "looping back" }, 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x02, "discarding" }, 11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x03, "reserved" }, 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define OAM_INFO_TYPE_MUX_MASK 0x4 12453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_info_type_state_mux_values[] = { 12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x00, "forwarding" }, 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x04, "discarding" }, 12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_info_type_oam_config_values[] = { 13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x01, "Active" }, 13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x02, "Unidirectional" }, 13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x04, "Remote-Loopback" }, 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x08, "Link-Events" }, 13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x10, "Variable-Retrieval" }, 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 11 Bits */ 14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define OAM_INFO_TYPE_PDU_SIZE_MASK 0x7ff 14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_END_OF_TLV 0x00 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_ERR_SYM_PER 0x01 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_ERR_FRM 0x02 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_ERR_FRM_PER 0x03 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM 0x04 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SLOW_OAM_LINK_EVENT_ORG_SPECIFIC 0xfe 14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 14953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_link_event_values[] = { 15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_END_OF_TLV, "End of TLV marker" }, 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_ERR_SYM_PER, "Errored Symbol Period Event" }, 15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_ERR_FRM, "Errored Frame Event" }, 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_ERR_FRM_PER, "Errored Frame Period Event" }, 15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM, "Errored Frame Seconds Summary Event" }, 15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall { SLOW_OAM_LINK_EVENT_ORG_SPECIFIC, "Organization specific" }, 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL} 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_oam_link_event_t { 16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t event_type; 16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t event_length; 16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t time_stamp[2]; 16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t window[8]; 16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t threshold[8]; 16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t errors[8]; 16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t errors_running_total[8]; 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t event_running_total[4]; 16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_oam_variablerequest_t { 17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t branch; 17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t leaf[2]; 17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_oam_variableresponse_t { 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t branch; 17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t leaf[2]; 17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t length; 17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct slow_oam_loopbackctrl_t { 18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t command; 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok slow_oam_loopbackctrl_cmd_values[] = { 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x01, "Enable OAM Remote Loopback" }, 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0x02, "Disable OAM Remote Loopback" }, 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct tlv_header_t { 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t type; 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t length; 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_TERMINATOR 0x00 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_ACTOR_INFO 0x01 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_PARTNER_INFO 0x02 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_COLLECTOR_INFO 0x03 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MARKER_TLV_TERMINATOR 0x00 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MARKER_TLV_MARKER_INFO 0x01 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok slow_tlv_values[] = { 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR, "Terminator"}, 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO, "Actor Information"}, 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO, "Partner Information"}, 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO, "Collector Information"}, 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_TERMINATOR, "Terminator"}, 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO, "Marker Information"}, 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_tlv_actor_partner_info_t { 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t sys_pri[2]; 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t sys[ETHER_ADDR_LEN]; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t key[2]; 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t port_pri[2]; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t port[2]; 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t state; 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pad[3]; 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok lacp_tlv_actor_partner_info_state_values[] = { 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01, "Activity"}, 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x02, "Timeout"}, 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04, "Aggregation"}, 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x08, "Synchronization"}, 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x10, "Collecting"}, 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x20, "Distributing"}, 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x40, "Default"}, 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x80, "Expired"}, 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_tlv_collector_info_t { 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t max_delay[2]; 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pad[12]; 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct marker_tlv_marker_info_t { 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t req_port[2]; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t req_sys[ETHER_ADDR_LEN]; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t req_trans_id[4]; 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pad[2]; 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_marker_tlv_terminator_t { 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pad[50]; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 25353f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid slow_marker_lacp_print(register const u_char *, register u_int); 25453f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid slow_oam_print(register const u_char *, register u_int); 25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 25653f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst struct slow_common_header_t *slow_com_header; 25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectslow_print(register const u_char *pptr, register u_int len) { 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall int print_version; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall slow_com_header = (const struct slow_common_header_t *)pptr; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*slow_com_header); 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Sanity checking of the header. 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (slow_com_header->proto_subtype) { 27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_LACP: 27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (slow_com_header->version != LACP_VERSION) { 27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("LACP version %u packet not supported",slow_com_header->version); 27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_version = 1; 27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_MARKER: 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (slow_com_header->version != MARKER_VERSION) { 28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("MARKER version %u packet not supported",slow_com_header->version); 28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_version = 1; 28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_OAM: /* fall through */ 28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_version = 0; 28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* print basic information and exit */ 29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_version = -1; 29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (print_version) { 29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%sv%u, length %u", 29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), 29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall slow_com_header->version, 30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall len); 30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* some slow protos don't have a version number in the header */ 30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s, length %u", 30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), 30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall len); 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* unrecognized subtype */ 30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (print_version == -1) { 31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(pptr, "\n\t", len); 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (slow_com_header->proto_subtype) { 31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: /* should not happen */ 31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_OAM: 32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* skip proto_subtype */ 32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall slow_oam_print(pptr+1, len-1); 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_LACP: /* LACP and MARKER share the same semantics */ 32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_PROTO_MARKER: 32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* skip slow_common_header */ 32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall len -= sizeof(const struct slow_common_header_t); 33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pptr += sizeof(const struct slow_common_header_t); 33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall slow_marker_lacp_print(pptr, len); 33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 33653f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc: 33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t\t packet exceeded snapshot"); 33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 34053f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid slow_marker_lacp_print(register const u_char *tptr, register u_int tlen) { 34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct tlv_header_t *tlv_header; 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall const u_char *tlv_tptr; 34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int tlv_len, tlv_tlen; 34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall union { 34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct lacp_marker_tlv_terminator_t *lacp_marker_tlv_terminator; 34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct lacp_tlv_actor_partner_info_t *lacp_tlv_actor_partner_info; 34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct lacp_tlv_collector_info_t *lacp_tlv_collector_info; 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct marker_tlv_marker_info_t *marker_tlv_marker_info; 35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } tlv_ptr; 35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tlen>0) { 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the tlv header ? */ 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr, sizeof(struct tlv_header_t)); 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_header = (const struct tlv_header_t *)tptr; 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len = tlv_header->length; 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t%s TLV (0x%02x), length %u", 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(slow_tlv_values, 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown", 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (slow_com_header->proto_subtype << 8) + tlv_header->type), 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_header->type, 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((tlv_len < sizeof(struct tlv_header_t) || 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len > tlen) && 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_header->type != LACP_TLV_TERMINATOR && 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_header->type != MARKER_TLV_TERMINATOR) { 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t-----trailing data-----"); 37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr+sizeof(struct tlv_header_t),"\n\t ",tlen); 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tptr=tptr+sizeof(struct tlv_header_t); 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tlen=tlv_len-sizeof(struct tlv_header_t); 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the tlv ? */ 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*tptr, tlv_len); 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch((slow_com_header->proto_subtype << 8) + tlv_header->type) { 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* those two TLVs have the same structure -> fall through */ 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO): 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO): 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.lacp_tlv_actor_partner_info = (const struct lacp_tlv_actor_partner_info_t *)tlv_tptr; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t System %s, System Priority %u, Key %u" \ 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ", Port %u, Port Priority %u\n\t State Flags [%s]", 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(tlv_ptr.lacp_tlv_actor_partner_info->sys), 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->sys_pri), 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->key), 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port), 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port_pri), 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bittok2str(lacp_tlv_actor_partner_info_state_values, 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.lacp_tlv_actor_partner_info->state)); 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO): 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.lacp_tlv_collector_info = (const struct lacp_tlv_collector_info_t *)tlv_tptr; 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Max Delay %u", 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.lacp_tlv_collector_info->max_delay)); 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO): 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.marker_tlv_marker_info = (const struct marker_tlv_marker_info_t *)tlv_tptr; 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t Request System %s, Request Port %u, Request Transaction ID 0x%08x", 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(tlv_ptr.marker_tlv_marker_info->req_sys), 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.marker_tlv_marker_info->req_port), 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.marker_tlv_marker_info->req_trans_id)); 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* those two TLVs have the same structure -> fall through */ 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR): 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ((SLOW_PROTO_MARKER << 8) + LACP_TLV_TERMINATOR): 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.lacp_marker_tlv_terminator = (const struct lacp_marker_tlv_terminator_t *)tlv_tptr; 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tlv_len == 0) { 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len = sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad) + 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(struct tlv_header_t); 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* tell the user that we modified the length field */ 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag>1) 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (=%u)",tlv_len); 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* we have messed around with the length field - now we need to check 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * again if there are enough bytes on the wire for the hexdump */ 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(tlv_ptr.lacp_marker_tlv_terminator->pad[0], 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad)); 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(tlv_tptr,"\n\t ",tlv_tlen); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* do we want to see an additional hexdump ? */ 44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag > 1) { 44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr+sizeof(struct tlv_header_t),"\n\t ", 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_len-sizeof(struct tlv_header_t)); 44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=tlv_len; 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen-=tlv_len; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t\t packet exceeded snapshot"); 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45653f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid slow_oam_print(register const u_char *tptr, register u_int tlen) { 45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int hexdump; 45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct slow_oam_common_header_t { 46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t flags[2]; 46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t code; 46353f17a9db278d33517d9888dd77848f554522a38JP Abgrall }; 46453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 46553f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct slow_oam_tlv_header_t { 46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t type; 46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t length; 46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall }; 46953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall union { 47153f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_common_header_t *slow_oam_common_header; 47253f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_tlv_header_t *slow_oam_tlv_header; 47353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } ptr; 47453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall union { 47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_info_t *slow_oam_info; 47753f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_link_event_t *slow_oam_link_event; 47853f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_variablerequest_t *slow_oam_variablerequest; 47953f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_variableresponse_t *slow_oam_variableresponse; 48053f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct slow_oam_loopbackctrl_t *slow_oam_loopbackctrl; 48153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } tlv; 48253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 48353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_common_header = (struct slow_oam_common_header_t *)tptr; 48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr += sizeof(struct slow_oam_common_header_t); 48553f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlen -= sizeof(struct slow_oam_common_header_t); 48653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tCode %s OAM PDU, Flags [%s]", 48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_code_values, "Unknown (%u)", ptr.slow_oam_common_header->code), 48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall bittok2str(slow_oam_flag_values, 49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "none", 49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&ptr.slow_oam_common_header->flags))); 49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (ptr.slow_oam_common_header->code) { 49453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_INFO: 49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (tlen > 0) { 49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr; 49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s Information Type (%u), length %u", 49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_info_type_values, "Reserved", 49953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->type), 50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->type, 50153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->length); 50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = FALSE; 50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (ptr.slow_oam_tlv_header->type) { 50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_INFO_TYPE_END_OF_TLV: 50653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ptr.slow_oam_tlv_header->length != 0) { 50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t ERROR: illegal length - should be 0"); 50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 51153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_INFO_TYPE_LOCAL: /* identical format - fall through */ 51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_INFO_TYPE_REMOTE: 51353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_info = (const struct slow_oam_info_t *)tptr; 51453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 51553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv.slow_oam_info->info_length != 51653f17a9db278d33517d9888dd77848f554522a38JP Abgrall sizeof(struct slow_oam_info_t)) { 51753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t ERROR: illegal length - should be %lu", 51853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (unsigned long) sizeof(struct slow_oam_info_t)); 51953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t OAM-Version %u, Revision %u", 52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_info->oam_version, 52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&tlv.slow_oam_info->revision)); 52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t State-Parser-Action %s, State-MUX-Action %s", 52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_info_type_state_parser_values, "Reserved", 52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_info->state & OAM_INFO_TYPE_PARSER_MASK), 52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_info_type_state_mux_values, "Reserved", 53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_info->state & OAM_INFO_TYPE_MUX_MASK)); 53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t OAM-Config Flags [%s], OAM-PDU-Config max-PDU size %u", 53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall bittok2str(slow_oam_info_type_oam_config_values, "none", 53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_info->oam_config), 53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&tlv.slow_oam_info->oam_pdu_config) & 53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall OAM_INFO_TYPE_PDU_SIZE_MASK); 53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t OUI %s (0x%06x), Vendor-Private 0x%08x", 53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(oui_values, "Unknown", 53853f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_24BITS(&tlv.slow_oam_info->oui)), 53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_24BITS(&tlv.slow_oam_info->oui), 54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private)); 54153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_INFO_TYPE_ORG_SPECIFIC: 54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = TRUE; 54553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 54653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54753f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = TRUE; 54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 55053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 55153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 55253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* infinite loop check */ 55353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ptr.slow_oam_tlv_header->length) { 55453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* do we also want to see a hex dump ? */ 55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag > 1 || hexdump==TRUE) { 55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr,"\n\t ", 56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->length); 56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlen -= ptr.slow_oam_tlv_header->length; 56453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr += ptr.slow_oam_tlv_header->length; 56553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 56653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 56853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_EVENT_NOTIF: 56953f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (tlen > 0) { 57053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header = (const struct slow_oam_tlv_header_t *)tptr; 57153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t %s Link Event Type (%u), length %u", 57253f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_link_event_values, "Reserved", 57353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->type), 57453f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->type, 57553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->length); 57653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 57753f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = FALSE; 57853f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (ptr.slow_oam_tlv_header->type) { 57953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_END_OF_TLV: 58053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ptr.slow_oam_tlv_header->length != 0) { 58153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t ERROR: illegal length - should be 0"); 58253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 58353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 58453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 58553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_ERR_SYM_PER: /* identical format - fall through */ 58653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_ERR_FRM: 58753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_ERR_FRM_PER: 58853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM: 58953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_link_event = (const struct slow_oam_link_event_t *)tptr; 59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 59153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tlv.slow_oam_link_event->event_length != 59253f17a9db278d33517d9888dd77848f554522a38JP Abgrall sizeof(struct slow_oam_link_event_t)) { 59353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t ERROR: illegal length - should be %lu", 59453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (unsigned long) sizeof(struct slow_oam_link_event_t)); 59553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 59653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 59853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Timestamp %u ms, Errored Window %" PRIu64 59953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "\n\t Errored Threshold %" PRIu64 60053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "\n\t Errors %" PRIu64 60153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "\n\t Error Running Total %" PRIu64 60253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "\n\t Event Running Total %u", 60353f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&tlv.slow_oam_link_event->time_stamp)*100, 60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_64BITS(&tlv.slow_oam_link_event->window), 60553f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_64BITS(&tlv.slow_oam_link_event->threshold), 60653f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_64BITS(&tlv.slow_oam_link_event->errors), 60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_64BITS(&tlv.slow_oam_link_event->errors_running_total), 60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(&tlv.slow_oam_link_event->event_running_total)); 60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 61053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_LINK_EVENT_ORG_SPECIFIC: 61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = TRUE; 61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall hexdump = TRUE; 61753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* infinite loop check */ 62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ptr.slow_oam_tlv_header->length) { 62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 62453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* do we also want to see a hex dump ? */ 62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag > 1 || hexdump==TRUE) { 62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr,"\n\t ", 62853f17a9db278d33517d9888dd77848f554522a38JP Abgrall ptr.slow_oam_tlv_header->length); 62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 63053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 63153f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlen -= ptr.slow_oam_tlv_header->length; 63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr += ptr.slow_oam_tlv_header->length; 63353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 63453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 63553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 63653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_LOOPBACK_CTRL: 63753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_loopbackctrl = (const struct slow_oam_loopbackctrl_t *)tptr; 63853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\t Command %s (%u)", 63953f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(slow_oam_loopbackctrl_cmd_values, 64053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unknown", 64153f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_loopbackctrl->command), 64253f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlv.slow_oam_loopbackctrl->command); 64353f17a9db278d33517d9888dd77848f554522a38JP Abgrall tptr ++; 64453f17a9db278d33517d9888dd77848f554522a38JP Abgrall tlen --; 64553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 64653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 64753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 64853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FIXME those are the defined codes that lack a decoder 64953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * you are welcome to contribute code ;-) 65053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 65153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_VAR_REQUEST: 65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_VAR_RESPONSE: 65353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case SLOW_OAM_CODE_PRIVATE: 65453f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (vflag <= 1) { 65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_unknown_data(tptr,"\n\t ", tlen); 65753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 65953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 662