153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 1998-2007 The TCPDUMP project
353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Redistribution and use in source and binary forms, with or without
553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * modification, are permitted provided that: (1) source code
653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * distributions retain the above copyright notice and this paragraph
753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * in its entirety, and (2) distributions including binary code include
853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the above copyright notice and this paragraph in its entirety in
953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the documentation or other materials provided with the distribution.
1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FOR A PARTICULAR PURPOSE.
1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * support for the IEEE Link Discovery Protocol as per 802.1AB
1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Original code by Hannes Gredler (hannes@juniper.net)
1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com>
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * DCBX extensions by Kaladhar Musunuru <kaladharm@sourceforge.net>
2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
2153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef lint
2353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char rcsid[] _U_ =
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"@(#) $Header: /tcpdump/master/tcpdump/print-lldp.c,v 1.10 2008-03-20 09:30:56 hannes Exp $";
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CONFIG_H
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "config.h"
2953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <tcpdump-stdinc.h>
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdio.h>
3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdlib.h>
3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <string.h>
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "interface.h"
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "extract.h"
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "addrtoname.h"
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "af.h"
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "oui.h"
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LLDP_EXTRACT_TYPE(x) (((x)&0xfe00)>>9)
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LLDP_EXTRACT_LEN(x) ((x)&0x01ff)
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * TLV type codes
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_END_TLV             0
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_ID_TLV      1
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_ID_TLV         2
5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TTL_TLV             3
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_DESCR_TLV      4
5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_SYSTEM_NAME_TLV     5
5553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_SYSTEM_DESCR_TLV    6
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_SYSTEM_CAP_TLV      7
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MGMT_ADDR_TLV       8
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TLV       127
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tlv_values[] = {
6153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_END_TLV, "End" },
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_ID_TLV, "Chassis ID" },
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_ID_TLV, "Port ID" },
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TTL_TLV, "Time to Live" },
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_DESCR_TLV, "Port Description" },
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_SYSTEM_NAME_TLV, "System Name" },
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_SYSTEM_DESCR_TLV, "System Description" },
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_SYSTEM_CAP_TLV, "System Capabilities" },
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MGMT_ADDR_TLV, "Management Address" },
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TLV, "Organization specific" },
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Chassis ID subtypes
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE  1
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_INTF_ALIAS_SUBTYPE    2
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_PORT_COMP_SUBTYPE     3
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_MAC_ADDR_SUBTYPE      4
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE  5
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_INTF_NAME_SUBTYPE     6
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CHASSIS_LOCAL_SUBTYPE         7
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_chassis_subtype_values[] = {
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE, "Chassis component"},
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_INTF_ALIAS_SUBTYPE, "Interface alias"},
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_PORT_COMP_SUBTYPE, "Port component"},
8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_MAC_ADDR_SUBTYPE, "MAC address"},
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE, "Network address"},
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_INTF_NAME_SUBTYPE, "Interface name"},
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CHASSIS_LOCAL_SUBTYPE, "Local"},
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Port ID subtypes
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_INTF_ALIAS_SUBTYPE       1
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_PORT_COMP_SUBTYPE        2
10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_MAC_ADDR_SUBTYPE         3
10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_NETWORK_ADDR_SUBTYPE     4
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_INTF_NAME_SUBTYPE        5
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_AGENT_CIRC_ID_SUBTYPE    6
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PORT_LOCAL_SUBTYPE            7
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_port_subtype_values[] = {
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PORT_LOCAL_SUBTYPE, "Local"},
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * System Capabilities
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_OTHER              (1 <<  0)
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_REPEATER           (1 <<  1)
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_BRIDGE             (1 <<  2)
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_WLAN_AP            (1 <<  3)
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_ROUTER             (1 <<  4)
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_PHONE              (1 <<  5)
12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_DOCSIS             (1 <<  6)
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_CAP_STATION_ONLY       (1 <<  7)
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_cap_values[] = {
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_OTHER, "Other"},
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_REPEATER, "Repeater"},
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_BRIDGE, "Bridge"},
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_WLAN_AP, "WLAN AP"},
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_ROUTER, "Router"},
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_PHONE, "Telephone"},
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_DOCSIS, "Docsis"},
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_CAP_STATION_ONLY, "Station Only"},
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID		1
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID	2
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME		3
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY	4
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION 8
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION       9
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION     10
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION      11
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY   12
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_EVB                    13
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_CDCP 			 14
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_8021_subtype_values[] = {
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID, "Port VLAN Id"},
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID, "Port and Protocol VLAN ID"},
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME, "VLAN name"},
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY, "Protocol Identity"},
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION, "Congestion Notification"},
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION, "ETS Configuration"},
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION, "ETS Recommendation"},
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION, "Priority Flow Control Configuration"},
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY, "Application Priority"},
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_EVB, "EVB"},
16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8021_SUBTYPE_CDCP,"CDCP"},
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT       (1 <<  1)
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_8021_PORT_PROTOCOL_VLAN_STATUS        (1 <<  2)
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_8021_port_protocol_id_values[] = {
17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT, "supported"},
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_8021_PORT_PROTOCOL_VLAN_STATUS, "enabled"},
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8023_SUBTYPE_MACPHY        1
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER      2
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR      3
18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8023_SUBTYPE_MTU           4
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_8023_subtype_values[] = {
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8023_SUBTYPE_MACPHY,	"MAC/PHY configuration/status"},
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER, "Power via MDI"},
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR, "Link aggregation"},
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_8023_SUBTYPE_MTU, "Max frame size"},
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES                   1
19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY                 2
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID                       3
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI             4
19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV         5
19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV         6
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV         7
19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER        8
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME    9
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME           10
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID             11
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_subtype_values[] = {
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES, "LLDP-MED Capabilities" },
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY, "Network policy" },
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID, "Location identification" },
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI, "Extended power-via-MDI" },
20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Inventory - hardware revision" },
20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Inventory - firmware revision" },
21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Inventory - software revision" },
21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Inventory - serial number" },
21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Inventory - manufacturer name" },
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Inventory - model name" },
21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Inventory - asset ID" },
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS       1
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS       2
22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_location_altitude_type_values[] = {
22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS, "meters"},
22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS, "floors"},
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* ANSI/TIA-1057 - Annex B */
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1		1
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2		2
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3		3
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4		4
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5		5
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6		6
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_location_lci_catype_values[] = {
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1, "national subdivisions (state,canton,region,province,prefecture)"},
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2, "county, parish, gun, district"},
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3, "city, township, shi"},
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4, "city division, borough, city district, ward chou"},
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5, "neighborhood, block"},
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6, "street"},
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_location_lci_what_values[] = {
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, "location of DHCP server"},
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 1, "location of the network element believed to be closest to the client"},
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 2, "location of the client"},
24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * From RFC 3636 - dot3MauType
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_UNKNOWN		0
25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_AUI		1
25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_5		2
25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_FOIRL		3
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_2		4
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_T		5
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_FP		6
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_FB		7
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_FL		8
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BROAD36		9
26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_T_HD	10
26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_T_FD	11
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_FL_HD	12
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10BASE_FL_FD	13
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_T4	14
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_TX_HD	15
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_TX_FD	16
27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_FX_HD	17
27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_FX_FD	18
27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_T2_HD	19
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_100BASE_T2_FD	20
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_X_HD	21
27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_X_FD	22
27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_LX_HD	23
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_LX_FD	24
28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_SX_HD	25
28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_SX_FD	26
28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_CX_HD	27
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_CX_FD	28
28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_T_HD	29
28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_1000BASE_T_FD	30
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_X		31
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_LX4	32
28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_R		33
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_ER	34
29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_LR	35
29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_SR	36
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_W		37
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_EW	38
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_LW	39
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define		LLDP_MAU_TYPE_10GBASE_SW	40
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_mau_types_values[] = {
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_UNKNOWN,            "Unknown"},
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_AUI,                "AUI"},
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_5,           "10BASE_5"},
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_FOIRL,              "FOIRL"},
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_2,           "10BASE2"},
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_T,           "10BASET duplex mode unknown"},
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_FP,          "10BASEFP"},
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_FB,          "10BASEFB"},
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_FL,          "10BASEFL duplex mode unknown"},
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BROAD36,          "10BROAD36"},
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_T_HD,        "10BASET hdx"},
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_T_FD,        "10BASET fdx"},
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_FL_HD,       "10BASEFL hdx"},
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10BASE_FL_FD,       "10BASEFL fdx"},
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_T4,         "100BASET4"},
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_TX_HD,      "100BASETX hdx"},
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_TX_FD,      "100BASETX fdx"},
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_FX_HD,      "100BASEFX hdx"},
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_FX_FD,      "100BASEFX fdx"},
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_T2_HD,      "100BASET2 hdx"},
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_100BASE_T2_FD,      "100BASET2 fdx"},
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_X_HD,      "1000BASEX hdx"},
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_X_FD,      "1000BASEX fdx"},
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_LX_HD,     "1000BASELX hdx"},
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_LX_FD,     "1000BASELX fdx"},
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_SX_HD,     "1000BASESX hdx"},
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_SX_FD,     "1000BASESX fdx"},
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_CX_HD,     "1000BASECX hdx"},
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_CX_FD,     "1000BASECX fdx"},
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_T_HD,      "1000BASET hdx"},
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_1000BASE_T_FD,      "1000BASET fdx"},
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_X,          "10GBASEX"},
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_LX4,        "10GBASELX4"},
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_R,          "10GBASER"},
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_ER,         "10GBASEER"},
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_LR,         "10GBASELR"},
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_SR,         "10GBASESR"},
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_W,          "10GBASEW"},
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_EW,         "10GBASEEW"},
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_LW,         "10GBASELW"},
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_TYPE_10GBASE_SW,         "10GBASESW"},
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_8023_AUTONEGOTIATION_SUPPORT       (1 <<  0)
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_8023_AUTONEGOTIATION_STATUS        (1 <<  1)
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_8023_autonegotiation_values[] = {
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_8023_AUTONEGOTIATION_SUPPORT, "supported"},
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_8023_AUTONEGOTIATION_STATUS, "enabled"},
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_MED                         (1 <<  0)
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_NETWORK_POLICY              (1 <<  1)
35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION     (1 <<  2)
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE      (1 <<  3)
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD       (1 <<  4)
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_CAPABILITY_INVENTORY                   (1 <<  5)
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_capabilities_values[] = {
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_MED, "LLDP-MED capabilities"},
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_NETWORK_POLICY, "network policy"},
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION, "location identification"},
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE, "extended power via MDI-PSE"},
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD, "extended power via MDI-PD"},
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_CAPABILITY_INVENTORY, "Inventory"},
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1           1
36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2           2
37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3           3
37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY       4
37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
37353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_device_type_values[] = {
37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1, "endpoint class 1"},
37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2, "endpoint class 2"},
37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3, "endpoint class 3"},
37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY, "network connectivity"},
37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_VOICE                 1
38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING       2
38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE           3
38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING 4
38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE       5
38653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING    6
38753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO       7
38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING       8
38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
39053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_application_type_values[] = {
39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_VOICE, "voice"},
39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING, "voice signaling"},
39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE, "guest voice"},
39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING, "guest voice signaling"},
39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE, "softphone voice"},
39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING, "video conferencing"},
39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO, "streaming video"},
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING, "video signaling"},
39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_NETWORK_POLICY_X_BIT           (1 << 5)
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_NETWORK_POLICY_T_BIT           (1 << 6)
40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_NETWORK_POLICY_U_BIT           (1 << 7)
40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_network_policy_bits_values[] = {
40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"},
40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_NETWORK_POLICY_T_BIT, "Tagged"},
40953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_NETWORK_POLICY_X_BIT, "reserved"},
41053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
41153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
41353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EXTRACT_NETWORK_POLICY_VLAN(x)           (((x)&0x1ffe)>>1)
41453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(x)    (((x)&0x01ff)>>6)
41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EXTRACT_NETWORK_POLICY_DSCP(x)           ((x)&0x003f)
41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED  1
41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS     2
41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN          3
42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_location_data_format_values[] = {
42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED, "coordinate-based LCI"},
42353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS, "civic address LCI"},
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN, "ECS ELIN"},
42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATUM_WGS_84          1
42953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88  2
43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW     3
43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_location_datum_type_values[] = {
43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATUM_WGS_84, "World Geodesic System 1984"},
43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88, "North American Datum 1983 (NAVD88)"},
43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW, "North American Datum 1983 (MLLW)"},
43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
43753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_SOURCE_PSE               1
44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_SOURCE_LOCAL             2
44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL     3
44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
44353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_power_source_values[] = {
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_SOURCE_PSE, "PSE - primary power source"},
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_SOURCE_LOCAL, "local - backup power source"},
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL, "PSE+local - reserved"},
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_PRIORITY_CRITICAL        1
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_PRIORITY_HIGH            2
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_PRIORITY_LOW             3
45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
45453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_power_priority_values[] = {
45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_PRIORITY_CRITICAL, "critical"},
45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_PRIORITY_HIGH, "high"},
45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_TIA_POWER_PRIORITY_LOW, "low"},
45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_TIA_POWER_VAL_MAX               1024
46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
46353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_tia_inventory_values[] = {
46453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Hardware revision" },
46553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Firmware revision" },
46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Software revision" },
46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Serial number" },
46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Manufacturer name" },
46953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Model name" },
47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Asset ID" },
47153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
47253f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
47353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
47453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * From RFC 3636 - ifMauAutoNegCapAdvertisedBits
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
47753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_OTHER			(1 <<  15)
47853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_10BASE_T			(1 <<  14)
47953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_10BASE_T_FD		(1 <<  13)
48053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_100BASE_T4		(1 <<  12)
48153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_100BASE_TX		(1 <<  11)
48253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_100BASE_TX_FD		(1 <<  10)
48353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_100BASE_T2		(1 <<  9)
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_100BASE_T2_FD		(1 <<  8)
48553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_FDXPAUSE			(1 <<  7)
48653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_FDXAPAUSE			(1 <<  6)
48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_FDXSPAUSE			(1 <<  5)
48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_FDXBPAUSE			(1 <<  4)
48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_1000BASE_X		(1 <<  3)
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_1000BASE_X_FD		(1 <<  2)
49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_1000BASE_T		(1 <<  1)
49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	 LLDP_MAU_PMD_1000BASE_T_FD		(1 <<  0)
49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
49453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_pmd_capability_values[] = {
49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_10BASE_T,		"10BASE-T hdx"},
49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_10BASE_T_FD,	        "10BASE-T fdx"},
49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_100BASE_T4,		"100BASE-T4"},
49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_100BASE_TX,		"100BASE-TX hdx"},
49953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_100BASE_TX_FD,	"100BASE-TX fdx"},
50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_100BASE_T2,		"100BASE-T2 hdx"},
50153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_100BASE_T2_FD,	"100BASE-T2 fdx"},
50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_FDXPAUSE,		"Pause for fdx links"},
50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_FDXAPAUSE,		"Asym PAUSE for fdx"},
50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_FDXSPAUSE,		"Sym PAUSE for fdx"},
50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_FDXBPAUSE,		"Asym and Sym PAUSE for fdx"},
50653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_1000BASE_X,		"1000BASE-{X LX SX CX} hdx"},
50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_1000BASE_X_FD,	"1000BASE-{X LX SX CX} fdx"},
50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_1000BASE_T,		"1000BASE-T hdx"},
50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MAU_PMD_1000BASE_T_FD,	"1000BASE-T fdx"},
51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
51153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
51353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LLDP_MDI_PORT_CLASS			(1 <<  0)
51453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LLDP_MDI_POWER_SUPPORT			(1 <<  1)
51553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_STATE			(1 <<  2)
51653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_PAIR_CONTROL_ABILITY		(1 <<  3)
51753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
51853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_mdi_values[] = {
51953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_PORT_CLASS, 		"PSE"},
52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_SUPPORT, 		"supported"},
52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_STATE, 		"enabled"},
52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_PAIR_CONTROL_ABILITY, 	"can be controlled"},
52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL	1
52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE	2
52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
52953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_mdi_power_pairs_values[] = {
53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL,	"signal"},
53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE,	"spare"},
53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_CLASS0		1
53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_CLASS1		2
53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_CLASS2		3
53853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_CLASS3		4
53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_MDI_POWER_CLASS4		5
54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
54153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_mdi_power_class_values[] = {
54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_CLASS0,     "class0"},
54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_CLASS1,     "class1"},
54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_CLASS2,     "class2"},
54553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_CLASS3,     "class3"},
54653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_MDI_POWER_CLASS4,     "class4"},
54753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
55053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_AGGREGATION_CAPABILTIY     (1 <<  0)
55153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_AGGREGATION_STATUS         (1 <<  1)
55253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
55353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_aggregation_values[] = {
55453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_AGGREGATION_CAPABILTIY, "supported"},
55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_AGGREGATION_STATUS, "enabled"},
55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * DCBX protocol subtypes.
56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_SUBTYPE_1                1
56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_SUBTYPE_2                2
56453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
56553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_dcbx_subtype_values[] = {
56653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" },
56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" },
56853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
56953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
57053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
57153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_CONTROL_TLV                1
57253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_PRIORITY_GROUPS_TLV        2
57353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV  3
57453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_DCBX_APPLICATION_TLV            4
57553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
57653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
57753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Interface numbering subtypes.
57853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
57953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_INTF_NUMB_IFX_SUBTYPE         2
58053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_INTF_NUMB_SYSPORT_SUBTYPE     3
58153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
58253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_intf_numb_subtype_values[] = {
58353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" },
58453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" },
58553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
58653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
58753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
58853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_INTF_NUM_LEN                  5
58953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EVB_MODE_NOT_SUPPORTED	0
59153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EVB_MODE_EVB_BRIDGE	1
59253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EVB_MODE_EVB_STATION	2
59353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_EVB_MODE_RESERVED		3
59453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
59553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lldp_evb_mode_values[]={
59653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_EVB_MODE_NOT_SUPPORTED, "Not Supported"},
59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_EVB_MODE_EVB_BRIDGE, "EVB Bridge"},
59853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_EVB_MODE_EVB_STATION, "EVB Staion"},
59953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LLDP_EVB_MODE_RESERVED, "Reserved for future Standardization"},
60053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
60153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
60253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define NO_OF_BITS 8
60353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH  6
60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH       25
60553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH      25
60653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH        6
60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH 5
60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH                      9
60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH                 8
61053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
61153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void print_ets_priority_assignment_table(const u_char *ptr)
61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t    Priority Assignment Table");
61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     Priority : 0   1   2   3   4   5   6   7");
61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     Value    : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            ptr[0]>>4,ptr[0]&0x0f,ptr[1]>>4,ptr[1]&0x0f,ptr[2]>>4,
61753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            ptr[2]&0x0f,ptr[3]>>4,ptr[3]&0x0f);
61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
62053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void print_tc_bandwidth_table(const u_char *ptr)
62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t    TC Bandwidth Table");
62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     TC%%   : 0   1   2   3   4   5   6   7");
62453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall             ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5],ptr[6],ptr[7]);
62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
62853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void print_tsa_assignment_table(const u_char *ptr)
62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
63053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t    TSA Assignment Table");
63153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     Traffic Class: 0   1   2   3   4   5   6   7");
63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t     Value        : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
63353f17a9db278d33517d9888dd77848f554522a38JP Abgrall             ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5],ptr[6],ptr[7]);
63453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
63553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
63653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
63753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print IEEE 802.1 private extensions. (802.1AB annex E)
63853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
63953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
64053f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_private_8021_print(const u_char *tptr, u_int tlv_len)
64153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
64253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int subtype, hexdump = FALSE;
64353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int sublen;
64453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int tval;
64553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t i;
64653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
64753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlv_len < 4) {
64853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return hexdump;
64953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
65053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    subtype = *(tptr+3);
65153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  %s Subtype (%u)",
65353f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tok2str(lldp_8021_subtype_values, "unknown", subtype),
65453f17a9db278d33517d9888dd77848f554522a38JP Abgrall           subtype);
65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    switch (subtype) {
65753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 6) {
65953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    port vlan id (PVID): %u",
66253f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(tptr+4));
66353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
66453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID:
66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7) {
66653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
66753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
66853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)",
66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(tptr+5),
67053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)),
67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       *(tptr+4));
67253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
67353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME:
67453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 6) {
67553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
67653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
67753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    vlan id (VID): %u",
67853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(tptr+4));
67953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7) {
68053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
68153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
68253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        sublen = *(tptr+6);
68353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7+sublen) {
68453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
68553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
68653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    vlan name: ");
68753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        safeputs((const char *)tptr+7, sublen);
68853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
68953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY:
69053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 5) {
69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
69253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
69353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        sublen = *(tptr+4);
69453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 5+sublen) {
69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
69653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
69753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    protocol identity: ");
69853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        safeputs((const char *)tptr+5, sublen);
69953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
70053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION:
70153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH){
70253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
70353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
70453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+4);
70553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Pre-Priority CNPV Indicator");
70653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Priority : 0  1  2  3  4  5  6  7");
70753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Value    : ");
70853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        for(i=0;i<NO_OF_BITS;i++)
70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("%-2d ",(tval>>i)&0x01);
71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+5);
71153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Pre-Priority Ready Indicator");
71253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Priority : 0  1  2  3  4  5  6  7");
71353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Value    : ");
71453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        for(i=0;i<NO_OF_BITS;i++)
71553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("%-2d ",(tval>>i)&0x01);
71653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
71753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
71853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION:
71953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH) {
72053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
72153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
72253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+4);
72353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Willing:%d, CBS:%d, RES:%d, Max TCs:%d",
72453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval>>7, (tval>>6) & 0x02, (tval>>3) & 0x07, tval & 0x07);
72553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
72653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*Print Priority Assignment Table*/
72753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_ets_priority_assignment_table(tptr+5);
72853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
72953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*Print TC Bandwidth Table*/
73053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_tc_bandwidth_table(tptr+9);
73153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
73253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* Print TSA Assignment Table */
73353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_tsa_assignment_table(tptr+17);
73453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
73653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
73753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION:
73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH) {
73953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
74053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
74153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    RES: %d",*(tptr+4));
74253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*Print Priority Assignment Table */
74353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_ets_priority_assignment_table(tptr+5);
74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*Print TC Bandwidth Table */
74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_tc_bandwidth_table(tptr+9);
74653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* Print TSA Assignment Table */
74753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        print_tsa_assignment_table(tptr+17);
74853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
74953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
75053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION:
75153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH) {
75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
75353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
75453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+4);
75553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Willing: %d, MBC: %d, RES: %d, PFC cap:%d ",
75653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval>>7, (tval>>6)&0x01, (tval>>4)&0x03, (tval & 0x0f));
75753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    PFC Enable");
75853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+5);
75953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Priority : 0  1  2  3  4  5  6  7");
76053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t     Value    : ");
76153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        for(i=0;i<NO_OF_BITS;i++)
76253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("%-2d ",(tval>>i)&0x01);
76353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
76453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
76553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY:
76653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH) {
76753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
76853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
76953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    RES: %d",*(tptr+4));
77053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<=LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH){
77153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
77253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
77353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*  Length of Application Priority Table */
77453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        sublen=tlv_len-5;
77553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(sublen%3!=0){
77653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
77753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
77853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        i=0;
77953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Application Priority Table");
78053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        while(i<sublen) {
78153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval=*(tptr+i+5);
78253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	printf("\n\t      Priority: %d, RES: %d, Sel: %d",
78353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        		 tval>>5, (tval>>3)&0x03, (tval & 0x07));
78453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	printf("Protocol ID: %d",EXTRACT_16BITS(tptr+i+5));
78553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	i=i+3;
78653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
78753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
78853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_EVB:
78953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH){
79053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
79253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    EVB Bridge Status");
79353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+4);
79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t      RES: %d, BGID: %d, RRCAP: %d, RRCTR: %d",
79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval>>3, (tval>>2)&0x01, (tval>>1)&0x01,tval&0x01);
79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    EVB Station Status");
79753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+5);
79853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t      RES: %d, SGID: %d, RRREQ: %d,RRSTAT: %d",
79953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval>>4, (tval>>3)&0x01, (tval>>2)&0x01, tval&0x03);
80053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+6);
80153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    R: %d, RTE: %d, ",tval>>5, tval&0x1f);
80253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+7);
80353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("EVB Mode: %s [%d]",
80453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tok2str(lldp_evb_mode_values,"unknown",tval>>6),tval>>6);
80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    ROL: %d, RWD: %d, ", (tval>>5)&0x01,tval&0x1f);
80653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+8);
80753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("RES: %d, ROL: %d, RKA: %d", tval>>6,(tval>>5)&0x01, tval&0x1f);
80853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
81053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8021_SUBTYPE_CDCP:
81153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH){
81253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
81453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tval=*(tptr+4);
81553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Role: %d, RES: %d, Scomp: %d ",
81653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval>>7, (tval>>4)&0x07,(tval>>3)&0x01);
81753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("ChnCap: %d",EXTRACT_16BITS(tptr+6)&0x0fff);
81853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        sublen=tlv_len-8;
81953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(sublen%3!=0) {
82053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	return hexdump;
82153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
82253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        i=0;
82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        while(i<sublen) {
82453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	tval=EXTRACT_24BITS(tptr+i+8);
82553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	printf("\n\t    SCID: %d, SVID: %d",
82653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        		tval>>12, tval&0x000fff);
82753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        	i=i+3;
82853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
82953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
83053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    default:
83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hexdump = TRUE;
83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
83453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return hexdump;
83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print IEEE 802.3 private extensions. (802.3bc)
84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
84253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
84353f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_private_8023_print(const u_char *tptr, u_int tlv_len)
84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int subtype, hexdump = FALSE;
84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlv_len < 4) {
84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return hexdump;
84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    subtype = *(tptr+3);
85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  %s Subtype (%u)",
85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tok2str(lldp_8023_subtype_values, "unknown", subtype),
85453f17a9db278d33517d9888dd77848f554522a38JP Abgrall           subtype);
85553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
85653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    switch (subtype) {
85753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
85853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 9) {
85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
86053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    autonegotiation [%s] (0x%02x)",
86253f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)),
86353f17a9db278d33517d9888dd77848f554522a38JP Abgrall               *(tptr+4));
86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    PMD autoneg capability [%s] (0x%04x)",
86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lldp_pmd_capability_values,"unknown", EXTRACT_16BITS(tptr+5)),
86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(tptr+5));
86753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    MAU type %s (0x%04x)",
86853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_mau_types_values, "unknown", EXTRACT_16BITS(tptr+7)),
86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_16BITS(tptr+7));
87053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
87253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
87353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7) {
87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
87553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    MDI power support [%s], power pair %s, power class %s",
87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lldp_mdi_values, "none", *(tptr+4)),
87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)),
87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_mdi_power_class_values, "unknown", *(tptr+6)));
88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 9) {
88453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
88553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
88653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    aggregation status [%s], aggregation port ID %u",
88753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lldp_aggregation_values, "none", *(tptr+4)),
88853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_32BITS(tptr+5));
88953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
89053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
89153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_8023_SUBTYPE_MTU:
89253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    MTU size %u", EXTRACT_16BITS(tptr+4));
89353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
89453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
89553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    default:
89653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hexdump = TRUE;
89753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
89853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
89953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
90053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return hexdump;
90153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
90253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
90353f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
90453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Extract 34bits of latitude/longitude coordinates.
90553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
90653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic u_int64_t
90753f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_extract_latlon(const u_char *tptr)
90853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
90953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int64_t latlon;
91053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
91153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    latlon = *tptr & 0x3;
91253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    latlon = (latlon << 32) | EXTRACT_32BITS(tptr+1);
91353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
91453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return latlon;
91553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
91653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
91753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
91853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print private TIA extensions.
91953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
92053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
92153f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_private_tia_print(const u_char *tptr, u_int tlv_len)
92253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
92353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int subtype, hexdump = FALSE;
92453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t location_format;
92553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int16_t power_val;
92653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int lci_len;
92753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t ca_type, ca_len;
92853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
92953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlv_len < 4) {
93053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return hexdump;
93153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
93253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    subtype = *(tptr+3);
93353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
93453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  %s Subtype (%u)",
93553f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tok2str(lldp_tia_subtype_values, "unknown", subtype),
93653f17a9db278d33517d9888dd77848f554522a38JP Abgrall           subtype);
93753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
93853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    switch (subtype) {
93953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES:
94053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7) {
94153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
94253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
94353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Media capabilities [%s] (0x%04x)",
94453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lldp_tia_capabilities_values, "none",
94553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                          EXTRACT_16BITS(tptr+4)), EXTRACT_16BITS(tptr+4));
94653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Device type [%s] (0x%02x)",
94753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_device_type_values, "unknown", *(tptr+6)),
94853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               *(tptr+6));
94953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
95053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
95153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY:
95253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 8) {
95353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
95453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
95553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Application type [%s] (0x%02x)",
95653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_application_type_values, "none", *(tptr+4)),
95753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               *(tptr+4));
95853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf(", Flags [%s]", bittok2str(
95953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   lldp_tia_network_policy_bits_values, "none", *(tptr+5)));
96053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Vlan id %u",
96153f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LLDP_EXTRACT_NETWORK_POLICY_VLAN(EXTRACT_16BITS(tptr+5)));
96253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf(", L2 priority %u",
96353f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(EXTRACT_16BITS(tptr+6)));
96453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf(", DSCP value %u",
96553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LLDP_EXTRACT_NETWORK_POLICY_DSCP(EXTRACT_16BITS(tptr+6)));
96653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
96753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
96853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID:
96953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 5) {
97053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
97153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
97253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        location_format = *(tptr+4);
97353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Location data format %s (0x%02x)",
97453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_location_data_format_values, "unknown", location_format),
97553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               location_format);
97653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
97753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        switch (location_format) {
97853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED:
97953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 21) {
98053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return hexdump;
98153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Latitude resolution %u, latitude value %" PRIu64,
98353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   (*(tptr+5)>>2), lldp_extract_latlon(tptr+5));
98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Longitude resolution %u, longitude value %" PRIu64,
98553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   (*(tptr+10)>>2), lldp_extract_latlon(tptr+10));
98653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Altitude type %s (%u)",
98753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   tok2str(lldp_tia_location_altitude_type_values, "unknown",(*(tptr+15)>>4)),
98853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   (*(tptr+15)>>4));
98953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Altitude resolution %u, altitude value 0x%x",
99053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   (EXTRACT_16BITS(tptr+15)>>6)&0x3f,
99153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   ((EXTRACT_32BITS(tptr+16)&0x3fffffff)));
99253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Datum %s (0x%02x)",
99353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   tok2str(lldp_tia_location_datum_type_values, "unknown", *(tptr+20)),
99453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   *(tptr+20));
99553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
99653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
99753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS:
99853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 6) {
99953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return hexdump;
100053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
100153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            lci_len = *(tptr+5);
100253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (lci_len < 3) {
100353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return hexdump;
100453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
100553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 7+lci_len) {
100653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return hexdump;
100753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
100853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    LCI length %u, LCI what %s (0x%02x), Country-code ",
100953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   lci_len,
101053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)),
101153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   *(tptr+6));
101253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
101353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /* Country code */
101453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            safeputs((const char *)(tptr+7), 2);
101553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
101653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            lci_len = lci_len-3;
101753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            tptr = tptr + 9;
101853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
101953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /* Decode each civic address element */
102053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            while (lci_len > 0) {
102153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (lci_len < 2) {
102253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    return hexdump;
102353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
102453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ca_type = *(tptr);
102553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                ca_len = *(tptr+1);
102653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
102753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tptr += 2;
102853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                lci_len -= 2;
102953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
103053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t      CA type \'%s\' (%u), length %u: ",
103153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type),
103253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       ca_type, ca_len);
103353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
103453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* basic sanity check */
103553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if ( ca_type == 0 || ca_len == 0) {
103653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    return hexdump;
103753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
103853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (lci_len < ca_len) {
103953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    return hexdump;
104053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
104153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
104253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                safeputs((const char *)tptr, ca_len);
104353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                tptr += ca_len;
104453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                lci_len -= ca_len;
104553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
104653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
104753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
104853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN:
104953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    ECS ELIN id ");
105053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            safeputs((const char *)tptr+5, tlv_len-5);
105153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
105253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
105353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        default:
105453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t    Location ID ");
105553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            print_unknown_data(tptr+5, "\n\t      ", tlv_len-5);
105653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
105753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
105853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
105953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI:
106053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlv_len < 7) {
106153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return hexdump;
106253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
106353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Power type [%s]",
106453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               (*(tptr+4)&0xC0>>6) ? "PD device" : "PSE device");
106553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf(", Power source [%s]",
106653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_power_source_values, "none", (*(tptr+4)&0x30)>>4));
106753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t    Power priority [%s] (0x%02x)",
106853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_power_priority_values, "none", *(tptr+4)&0x0f),
106953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               *(tptr+4)&0x0f);
107053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        power_val = EXTRACT_16BITS(tptr+5);
107153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (power_val < LLDP_TIA_POWER_VAL_MAX) {
107253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf(", Power %.1f Watts", ((float)power_val)/10);
107353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
107453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf(", Power %u (Reserved)", power_val);
107553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
107653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
107753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
107853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV:
107953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV:
108053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV:
108153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER:
108253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME:
108353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME:
108453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID:
108553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t  %s ",
108653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lldp_tia_inventory_values, "unknown", subtype));
108753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        safeputs((const char *)tptr+4, tlv_len-4);
108853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
108953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
109053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    default:
109153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hexdump = TRUE;
109253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
109353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
109453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
109553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return hexdump;
109653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
109753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
109853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
109953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print DCBX Protocol fields (V 1.01).
110053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
110153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
110253f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_private_dcbx_print(const u_char *pptr, u_int len)
110353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
110453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int subtype, hexdump = FALSE;
110553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t tval;
110653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int16_t tlv;
110753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int32_t i, pgval, uval;
110853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int tlen, tlv_type, tlv_len;
110953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const u_char *tptr, *mptr;
111053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
111153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (len < 4) {
111253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return hexdump;
111353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
111453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    subtype = *(pptr+3);
111553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
111653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  %s Subtype (%u)",
111753f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tok2str(lldp_dcbx_subtype_values, "unknown", subtype),
111853f17a9db278d33517d9888dd77848f554522a38JP Abgrall           subtype);
111953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
112053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* by passing old version */
112153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (subtype == LLDP_DCBX_SUBTYPE_1)
112253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return TRUE;
112353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
112453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr = pptr + 4;
112553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen = len - 4;
112653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
112753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    while (tlen >= sizeof(tlv)) {
112853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
112953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, sizeof(tlv));
113053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
113153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv = EXTRACT_16BITS(tptr);
113253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
113353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv_type = LLDP_EXTRACT_TYPE(tlv);
113453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv_len = LLDP_EXTRACT_LEN(tlv);
113553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hexdump = FALSE;
113653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
113753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlen -= sizeof(tlv);
113853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr += sizeof(tlv);
113953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
114053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* loop check */
114153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!tlv_type || !tlv_len) {
114253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
114353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
114453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
114553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, tlv_len);
114653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlen < tlv_len) {
114753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            goto trunc;
114853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
114953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
115053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* decode every tlv */
115153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        switch (tlv_type) {
115253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_DCBX_CONTROL_TLV:
115353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 10) {
115453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                goto trunc;
115553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
115653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t    Control - Protocol Control (type 0x%x, length %d)",
115753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		LLDP_DCBX_CONTROL_TLV, tlv_len);
115853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Oper_Version: %d", *tptr);
115953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Max_Version: %d", *(tptr+1));
116053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Sequence Number: %d", EXTRACT_32BITS(tptr+2));
116153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Acknowledgement Number: %d",
116253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					EXTRACT_32BITS(tptr+6));
116353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    break;
116453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_DCBX_PRIORITY_GROUPS_TLV:
116553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 17) {
116653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                goto trunc;
116753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
116853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t    Feature - Priority Group (type 0x%x, length %d)",
116953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len);
117053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Oper_Version: %d", *tptr);
117153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Max_Version: %d", *(tptr+1));
117253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Info block(0x%02X): ", *(tptr+2));
117353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tval = *(tptr+2);
117453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
117553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
117653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x20) ? 1 : 0);
117753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      SubType: %d", *(tptr+3));
117853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Priority Allocation");
117953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
118053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    pgval = EXTRACT_32BITS(tptr+4);
118153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    for (i = 0; i <= 7; i++) {
118253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tval = *(tptr+4+(i/2));
118353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          PgId_%d: %d",
118453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			i, (pgval >> (28-4*i)) & 0xF);
118553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
118653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Priority Group Allocation");
118753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    for (i = 0; i <= 7; i++)
118853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          Pg percentage[%d]: %d", i, *(tptr+8+i));
118953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      NumTCsSupported: %d", *(tptr+8+8));
119053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    break;
119153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV:
119253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 6) {
119353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                goto trunc;
119453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
119553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t    Feature - Priority Flow Control");
119653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf(" (type 0x%x, length %d)",
119753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len);
119853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Oper_Version: %d", *tptr);
119953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Max_Version: %d", *(tptr+1));
120053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Info block(0x%02X): ", *(tptr+2));
120153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tval = *(tptr+2);
120253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
120353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
120453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x20) ? 1 : 0);
120553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      SubType: %d", *(tptr+3));
120653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tval = *(tptr+4);
120753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      PFC Config (0x%02X)", *(tptr+4));
120853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    for (i = 0; i <= 7; i++)
120953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          Priority Bit %d: %s",
121053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    i, (tval & (1 << i)) ? "Enabled" : "Disabled");
121153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      NumTCPFCSupported: %d", *(tptr+5));
121253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    break;
121353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_DCBX_APPLICATION_TLV:
121453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (tlv_len < 4) {
121553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                goto trunc;
121653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
121753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t    Feature - Application (type 0x%x, length %d)",
121853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		LLDP_DCBX_APPLICATION_TLV, tlv_len);
121953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Oper_Version: %d", *tptr);
122053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Max_Version: %d", *(tptr+1));
122153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      Info block(0x%02X): ", *(tptr+2));
122253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tval = *(tptr+2);
122353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
122453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
122553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(tval &  0x20) ? 1 : 0);
122653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    printf("\n\t      SubType: %d", *(tptr+3));
122753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tval = tlv_len - 4;
122853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    mptr = tptr + 4;
122953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    while (tval >= 6) {
123053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t      Application Value");
123153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          Application Protocol ID: 0x%04x",
123253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			EXTRACT_16BITS(mptr));
123353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		uval = EXTRACT_24BITS(mptr+2);
123453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          SF (0x%x) Application Protocol ID is %s",
123553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(uval >> 22),
123653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(uval >> 22) ? "Socket Number" : "L2 EtherType");
123753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          OUI: 0x%06x", uval & 0x3fffff);
123853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("\n\t          User Priority Map: 0x%02x", *(mptr+5));
123953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tval = tval - 6;
124053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		mptr = mptr + 6;
124153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
124253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    break;
124353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	default:
124453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    hexdump = TRUE;
124553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    break;
124653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
124753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
124853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* do we also want to see a hex dump ? */
124953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (vflag > 1 || (vflag && hexdump)) {
125053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    print_unknown_data(tptr,"\n\t    ", tlv_len);
125153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
125253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
125353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlen -= tlv_len;
125453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr += tlv_len;
125553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
125653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
125753f17a9db278d33517d9888dd77848f554522a38JP Abgrall trunc:
125853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return hexdump;
125953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
126053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
126153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char *
126253f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_network_addr_print(const u_char *tptr, u_int len) {
126353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
126453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t af;
126553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    static char buf[BUFSIZE];
126653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const char * (*pfunc)(const u_char *);
126753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
126853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (len < 1)
126953f17a9db278d33517d9888dd77848f554522a38JP Abgrall      return NULL;
127053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    len--;
127153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    af = *tptr;
127253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    switch (af) {
127353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case AFNUM_INET:
127453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (len < 4)
127553f17a9db278d33517d9888dd77848f554522a38JP Abgrall          return NULL;
127653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        pfunc = getname;
127753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
127853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
127953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case AFNUM_INET6:
128053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (len < 16)
128153f17a9db278d33517d9888dd77848f554522a38JP Abgrall          return NULL;
128253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        pfunc = getname6;
128353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
128453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
128553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case AFNUM_802:
128653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (len < 6)
128753f17a9db278d33517d9888dd77848f554522a38JP Abgrall          return NULL;
128853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        pfunc = etheraddr_string;
128953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
129053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    default:
129153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        pfunc = NULL;
129253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        break;
129353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
129453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
129553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (!pfunc) {
129653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        snprintf(buf, sizeof(buf), "AFI %s (%u), no AF printer !",
129753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 tok2str(af_values, "Unknown", af), af);
129853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    } else {
129953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        snprintf(buf, sizeof(buf), "AFI %s (%u): %s",
130053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 tok2str(af_values, "Unknown", af), af, (*pfunc)(tptr+1));
130153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
130253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
130353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return buf;
130453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
130553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
130653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
130753f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) {
130853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
130953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t mgmt_addr_len, intf_num_subtype, oid_len;
131053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const u_char *tptr;
131153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int tlen;
131253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    char *mgmt_addr;
131353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
131453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen = len;
131553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr = pptr;
131653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
131753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlen < 1) {
131853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return 0;
131953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
132053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    mgmt_addr_len = *tptr++;
132153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen--;
132253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
132353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlen < mgmt_addr_len) {
132453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return 0;
132553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
132653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
132753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    mgmt_addr = lldp_network_addr_print(tptr, mgmt_addr_len);
132853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (mgmt_addr == NULL) {
132953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return 0;
133053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
133153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  Management Address length %u, %s",
133253f17a9db278d33517d9888dd77848f554522a38JP Abgrall           mgmt_addr_len, mgmt_addr);
133353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr += mgmt_addr_len;
133453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen -= mgmt_addr_len;
133553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
133653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlen < LLDP_INTF_NUM_LEN) {
133753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return 0;
133853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
133953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
134053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    intf_num_subtype = *tptr;
134153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t  %s Interface Numbering (%u): %u",
134253f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tok2str(lldp_intf_numb_subtype_values, "Unknown", intf_num_subtype),
134353f17a9db278d33517d9888dd77848f554522a38JP Abgrall           intf_num_subtype,
134453f17a9db278d33517d9888dd77848f554522a38JP Abgrall           EXTRACT_32BITS(tptr+1));
134553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
134653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr += LLDP_INTF_NUM_LEN;
134753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen -= LLDP_INTF_NUM_LEN;
134853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
134953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /*
135053f17a9db278d33517d9888dd77848f554522a38JP Abgrall     * The OID is optional.
135153f17a9db278d33517d9888dd77848f554522a38JP Abgrall     */
135253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (tlen) {
135353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        oid_len = *tptr;
135453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
135553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlen < oid_len) {
135653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            return 0;
135753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
135853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (oid_len) {
135953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t  OID length %u", oid_len);
136053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            safeputs((const char *)tptr+1, oid_len);
136153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
136253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
136353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
136453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return 1;
136553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
136653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
136753f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
136853f17a9db278d33517d9888dd77848f554522a38JP Abgralllldp_print(register const u_char *pptr, register u_int len) {
136953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
137053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t subtype;
137153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int16_t tlv, cap, ena_cap;
137253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int oui, tlen, hexdump, tlv_type, tlv_len;
137353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const u_char *tptr;
137453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    char *network_addr;
137553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
137653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr = pptr;
137753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen = len;
137853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
137953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("LLDP, length %u", len);
138053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
138153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    while (tlen >= sizeof(tlv)) {
138253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
138353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, sizeof(tlv));
138453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
138553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv = EXTRACT_16BITS(tptr);
138653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
138753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv_type = LLDP_EXTRACT_TYPE(tlv);
138853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv_len = LLDP_EXTRACT_LEN(tlv);
138953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hexdump = FALSE;
139053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
139153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlen -= sizeof(tlv);
139253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr += sizeof(tlv);
139353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
139453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (vflag) {
139553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf("\n\t%s TLV (%u), length %u",
139653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   tok2str(lldp_tlv_values, "Unknown", tlv_type),
139753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                   tlv_type, tlv_len);
139853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
139953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
140053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* infinite loop check */
140153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!tlv_type || !tlv_len) {
140253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
140353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
140453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
140553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, tlv_len);
140653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (tlen < tlv_len) {
140753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            goto trunc;
140853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
140953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
141053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        switch (tlv_type) {
141153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
141253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_CHASSIS_ID_TLV:
141353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
141453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (tlv_len < 2) {
141553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
141653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
141753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                subtype = *tptr;
141853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  Subtype %s (%u): ",
141953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       tok2str(lldp_chassis_subtype_values, "Unknown", subtype),
142053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       subtype);
142153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
142253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                switch (subtype) {
142353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_MAC_ADDR_SUBTYPE:
142453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    if (tlv_len < 1+6) {
142553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        goto trunc;
142653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    }
142753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    printf("%s", etheraddr_string(tptr+1));
142853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
142953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
143053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */
143153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_LOCAL_SUBTYPE:
143253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE:
143353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE:
143453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_PORT_COMP_SUBTYPE:
143553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    safeputs((const char *)tptr+1, tlv_len-1);
143653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
143753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
143853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
143953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    network_addr = lldp_network_addr_print(tptr+1, tlv_len-1);
144053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    if (network_addr == NULL) {
144153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        goto trunc;
144253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    }
144353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    printf("%s", network_addr);
144453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
144553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
144653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                default:
144753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = TRUE;
144853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
144953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
145053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
145153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
145253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
145353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_PORT_ID_TLV:
145453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
145553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (tlv_len < 2) {
145653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
145753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
145853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                subtype = *tptr;
145953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  Subtype %s (%u): ",
146053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       tok2str(lldp_port_subtype_values, "Unknown", subtype),
146153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       subtype);
146253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
146353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                switch (subtype) {
146453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_MAC_ADDR_SUBTYPE:
146553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    if (tlv_len < 1+6) {
146653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        goto trunc;
146753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    }
146853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    printf("%s", etheraddr_string(tptr+1));
146953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
147053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
147253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_LOCAL_SUBTYPE:
147353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
147453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_INTF_ALIAS_SUBTYPE:
147553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_PORT_COMP_SUBTYPE:
147653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    safeputs((const char *)tptr+1, tlv_len-1);
147753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
147853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
148053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    network_addr = lldp_network_addr_print(tptr+1, tlv_len-1);
148153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    if (network_addr == NULL) {
148253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        goto trunc;
148353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    }
148453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    printf("%s", network_addr);
148553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
148653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
148753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                default:
148853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = TRUE;
148953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
149053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
149153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
149253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
149353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
149453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_TTL_TLV:
149553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
149653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (tlv_len < 2) {
149753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
149853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
149953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(": TTL %us", EXTRACT_16BITS(tptr));
150053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
150153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
150253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
150353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_PORT_DESCR_TLV:
150453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
150553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(": ");
150653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                safeputs((const char *)tptr, tlv_len);
150753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
150853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
150953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
151053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_SYSTEM_NAME_TLV:
151153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /*
151253f17a9db278d33517d9888dd77848f554522a38JP Abgrall             * The system name is also print in non-verbose mode
151353f17a9db278d33517d9888dd77848f554522a38JP Abgrall             * similar to the CDP printer.
151453f17a9db278d33517d9888dd77848f554522a38JP Abgrall             */
151553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            printf(": ");
151653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            safeputs((const char *)tptr, tlv_len);
151753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
151853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
151953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_SYSTEM_DESCR_TLV:
152053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
152153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  ");
152253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                safeputs((const char *)tptr, tlv_len);
152353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
152453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
152553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
152653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_SYSTEM_CAP_TLV:
152753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
152853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /*
152953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * XXX - IEEE Std 802.1AB-2009 says the first octet
153053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * if a chassis ID subtype, with the system
153153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * capabilities and enabled capabilities following
153253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * it.
153353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 */
153453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (tlv_len < 4) {
153553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
153653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
153753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                cap = EXTRACT_16BITS(tptr);
153853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                ena_cap = EXTRACT_16BITS(tptr+2);
153953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  System  Capabilities [%s] (0x%04x)",
154053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(lldp_cap_values, "none", cap), cap);
154153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf("\n\t  Enabled Capabilities [%s] (0x%04x)",
154253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       bittok2str(lldp_cap_values, "none", ena_cap), ena_cap);
154353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
154453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
154553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
154653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_MGMT_ADDR_TLV:
154753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
154853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (!lldp_mgmt_addr_tlv_print(tptr, tlv_len)) {
154953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
155053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
155153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
155253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
155353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
155453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LLDP_PRIVATE_TLV:
155553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
155653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (tlv_len < 3) {
155753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    goto trunc;
155853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
155953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                oui = EXTRACT_24BITS(tptr);
156053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui);
156153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
156253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                switch (oui) {
156353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case OUI_IEEE_8021_PRIVATE:
156453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = lldp_private_8021_print(tptr, tlv_len);
156553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
156653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case OUI_IEEE_8023_PRIVATE:
156753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = lldp_private_8023_print(tptr, tlv_len);
156853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
156953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case OUI_TIA:
157053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = lldp_private_tia_print(tptr, tlv_len);
157153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
157253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case OUI_DCBX:
157353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = lldp_private_dcbx_print(tptr, tlv_len);
157453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
157553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                default:
157653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    hexdump = TRUE;
157753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    break;
157853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
157953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
158053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
158153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
158253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        default:
158353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            hexdump = TRUE;
158453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
158553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
158653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
158753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* do we also want to see a hex dump ? */
158853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (vflag > 1 || (vflag && hexdump)) {
158953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            print_unknown_data(tptr,"\n\t  ", tlv_len);
159053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
159153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
159253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlen -= tlv_len;
159353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr += tlv_len;
159453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
159553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return;
159653f17a9db278d33517d9888dd77848f554522a38JP Abgrall trunc:
159753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t[|LLDP]");
159853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
159953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
160053f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
160153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Local Variables:
160253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-style: whitesmith
160353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-basic-offset: 4
160453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * End:
160553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
1606