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