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