xref: /dragonfly/contrib/tcpdump/print-lldp.c (revision ed775ee7)
1ea7b4bf5SPeter Avalos /*
2ea7b4bf5SPeter Avalos  * Copyright (c) 1998-2007 The TCPDUMP project
3ea7b4bf5SPeter Avalos  *
4ea7b4bf5SPeter Avalos  * Redistribution and use in source and binary forms, with or without
5ea7b4bf5SPeter Avalos  * modification, are permitted provided that: (1) source code
6ea7b4bf5SPeter Avalos  * distributions retain the above copyright notice and this paragraph
7ea7b4bf5SPeter Avalos  * in its entirety, and (2) distributions including binary code include
8ea7b4bf5SPeter Avalos  * the above copyright notice and this paragraph in its entirety in
9ea7b4bf5SPeter Avalos  * the documentation or other materials provided with the distribution.
10ea7b4bf5SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
11ea7b4bf5SPeter Avalos  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
12ea7b4bf5SPeter Avalos  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13ea7b4bf5SPeter Avalos  * FOR A PARTICULAR PURPOSE.
14ea7b4bf5SPeter Avalos  *
15411677aeSAaron LI  * Original code by Hannes Gredler (hannes@gredler.at)
16ea7b4bf5SPeter Avalos  * IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com>
1727bfbee1SPeter Avalos  * DCBX extensions by Kaladhar Musunuru <kaladharm@sourceforge.net>
18ea7b4bf5SPeter Avalos  */
19ea7b4bf5SPeter Avalos 
20411677aeSAaron LI /* \summary: IEEE 802.1ab Link Layer Discovery Protocol (LLDP) printer */
21ea7b4bf5SPeter Avalos 
22ea7b4bf5SPeter Avalos #ifdef HAVE_CONFIG_H
23*ed775ee7SAntonio Huete Jimenez #include <config.h>
24ea7b4bf5SPeter Avalos #endif
25ea7b4bf5SPeter Avalos 
26*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
27ea7b4bf5SPeter Avalos 
28ea7b4bf5SPeter Avalos #include <stdio.h>
29ea7b4bf5SPeter Avalos 
30411677aeSAaron LI #include "netdissect.h"
31ea7b4bf5SPeter Avalos #include "extract.h"
32ea7b4bf5SPeter Avalos #include "addrtoname.h"
33ea7b4bf5SPeter Avalos #include "af.h"
34ea7b4bf5SPeter Avalos #include "oui.h"
35ea7b4bf5SPeter Avalos 
36ea7b4bf5SPeter Avalos #define	LLDP_EXTRACT_TYPE(x) (((x)&0xfe00)>>9)
37ea7b4bf5SPeter Avalos #define	LLDP_EXTRACT_LEN(x) ((x)&0x01ff)
38ea7b4bf5SPeter Avalos 
39ea7b4bf5SPeter Avalos /*
40ea7b4bf5SPeter Avalos  * TLV type codes
41ea7b4bf5SPeter Avalos  */
42ea7b4bf5SPeter Avalos #define LLDP_END_TLV             0
43ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_ID_TLV      1
44ea7b4bf5SPeter Avalos #define LLDP_PORT_ID_TLV         2
45ea7b4bf5SPeter Avalos #define LLDP_TTL_TLV             3
46ea7b4bf5SPeter Avalos #define LLDP_PORT_DESCR_TLV      4
47ea7b4bf5SPeter Avalos #define LLDP_SYSTEM_NAME_TLV     5
48ea7b4bf5SPeter Avalos #define LLDP_SYSTEM_DESCR_TLV    6
49ea7b4bf5SPeter Avalos #define LLDP_SYSTEM_CAP_TLV      7
50ea7b4bf5SPeter Avalos #define LLDP_MGMT_ADDR_TLV       8
51ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TLV       127
52ea7b4bf5SPeter Avalos 
53ea7b4bf5SPeter Avalos static const struct tok lldp_tlv_values[] = {
54ea7b4bf5SPeter Avalos     { LLDP_END_TLV, "End" },
55ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_ID_TLV, "Chassis ID" },
56ea7b4bf5SPeter Avalos     { LLDP_PORT_ID_TLV, "Port ID" },
57ea7b4bf5SPeter Avalos     { LLDP_TTL_TLV, "Time to Live" },
58ea7b4bf5SPeter Avalos     { LLDP_PORT_DESCR_TLV, "Port Description" },
59ea7b4bf5SPeter Avalos     { LLDP_SYSTEM_NAME_TLV, "System Name" },
60ea7b4bf5SPeter Avalos     { LLDP_SYSTEM_DESCR_TLV, "System Description" },
61ea7b4bf5SPeter Avalos     { LLDP_SYSTEM_CAP_TLV, "System Capabilities" },
62ea7b4bf5SPeter Avalos     { LLDP_MGMT_ADDR_TLV, "Management Address" },
63ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TLV, "Organization specific" },
64ea7b4bf5SPeter Avalos     { 0, NULL}
65ea7b4bf5SPeter Avalos };
66ea7b4bf5SPeter Avalos 
67ea7b4bf5SPeter Avalos /*
68ea7b4bf5SPeter Avalos  * Chassis ID subtypes
69ea7b4bf5SPeter Avalos  */
70ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE  1
71ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_INTF_ALIAS_SUBTYPE    2
72ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_PORT_COMP_SUBTYPE     3
73ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_MAC_ADDR_SUBTYPE      4
74ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE  5
75ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_INTF_NAME_SUBTYPE     6
76ea7b4bf5SPeter Avalos #define LLDP_CHASSIS_LOCAL_SUBTYPE         7
77ea7b4bf5SPeter Avalos 
78ea7b4bf5SPeter Avalos static const struct tok lldp_chassis_subtype_values[] = {
79ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE, "Chassis component"},
80ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_INTF_ALIAS_SUBTYPE, "Interface alias"},
81ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_PORT_COMP_SUBTYPE, "Port component"},
82ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_MAC_ADDR_SUBTYPE, "MAC address"},
83ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE, "Network address"},
84ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_INTF_NAME_SUBTYPE, "Interface name"},
85ea7b4bf5SPeter Avalos     { LLDP_CHASSIS_LOCAL_SUBTYPE, "Local"},
86ea7b4bf5SPeter Avalos     { 0, NULL}
87ea7b4bf5SPeter Avalos };
88ea7b4bf5SPeter Avalos 
89ea7b4bf5SPeter Avalos /*
90ea7b4bf5SPeter Avalos  * Port ID subtypes
91ea7b4bf5SPeter Avalos  */
92ea7b4bf5SPeter Avalos #define LLDP_PORT_INTF_ALIAS_SUBTYPE       1
93ea7b4bf5SPeter Avalos #define LLDP_PORT_PORT_COMP_SUBTYPE        2
94ea7b4bf5SPeter Avalos #define LLDP_PORT_MAC_ADDR_SUBTYPE         3
95ea7b4bf5SPeter Avalos #define LLDP_PORT_NETWORK_ADDR_SUBTYPE     4
96ea7b4bf5SPeter Avalos #define LLDP_PORT_INTF_NAME_SUBTYPE        5
97ea7b4bf5SPeter Avalos #define LLDP_PORT_AGENT_CIRC_ID_SUBTYPE    6
98ea7b4bf5SPeter Avalos #define LLDP_PORT_LOCAL_SUBTYPE            7
99ea7b4bf5SPeter Avalos 
100ea7b4bf5SPeter Avalos static const struct tok lldp_port_subtype_values[] = {
101ea7b4bf5SPeter Avalos     { LLDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
102ea7b4bf5SPeter Avalos     { LLDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
103ea7b4bf5SPeter Avalos     { LLDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
104ea7b4bf5SPeter Avalos     { LLDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
105ea7b4bf5SPeter Avalos     { LLDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
106ea7b4bf5SPeter Avalos     { LLDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
107ea7b4bf5SPeter Avalos     { LLDP_PORT_LOCAL_SUBTYPE, "Local"},
108ea7b4bf5SPeter Avalos     { 0, NULL}
109ea7b4bf5SPeter Avalos };
110ea7b4bf5SPeter Avalos 
111ea7b4bf5SPeter Avalos /*
112ea7b4bf5SPeter Avalos  * System Capabilities
113ea7b4bf5SPeter Avalos  */
114ea7b4bf5SPeter Avalos #define LLDP_CAP_OTHER              (1 <<  0)
115ea7b4bf5SPeter Avalos #define LLDP_CAP_REPEATER           (1 <<  1)
116ea7b4bf5SPeter Avalos #define LLDP_CAP_BRIDGE             (1 <<  2)
117ea7b4bf5SPeter Avalos #define LLDP_CAP_WLAN_AP            (1 <<  3)
118ea7b4bf5SPeter Avalos #define LLDP_CAP_ROUTER             (1 <<  4)
119ea7b4bf5SPeter Avalos #define LLDP_CAP_PHONE              (1 <<  5)
120ea7b4bf5SPeter Avalos #define LLDP_CAP_DOCSIS             (1 <<  6)
121ea7b4bf5SPeter Avalos #define LLDP_CAP_STATION_ONLY       (1 <<  7)
122ea7b4bf5SPeter Avalos 
123ea7b4bf5SPeter Avalos static const struct tok lldp_cap_values[] = {
124ea7b4bf5SPeter Avalos     { LLDP_CAP_OTHER, "Other"},
125ea7b4bf5SPeter Avalos     { LLDP_CAP_REPEATER, "Repeater"},
126ea7b4bf5SPeter Avalos     { LLDP_CAP_BRIDGE, "Bridge"},
127ea7b4bf5SPeter Avalos     { LLDP_CAP_WLAN_AP, "WLAN AP"},
128ea7b4bf5SPeter Avalos     { LLDP_CAP_ROUTER, "Router"},
129ea7b4bf5SPeter Avalos     { LLDP_CAP_PHONE, "Telephone"},
130ea7b4bf5SPeter Avalos     { LLDP_CAP_DOCSIS, "Docsis"},
131ea7b4bf5SPeter Avalos     { LLDP_CAP_STATION_ONLY, "Station Only"},
132ea7b4bf5SPeter Avalos     { 0, NULL}
133ea7b4bf5SPeter Avalos };
134ea7b4bf5SPeter Avalos 
135ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID		1
136ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID	2
137ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME		3
138ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY	4
139*ed775ee7SAntonio Huete Jimenez #define LLDP_PRIVATE_8021_SUBTYPE_LINKAGGR		7
140411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION 8
141411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION       9
142411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION     10
143411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION      11
144411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY   12
145411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_EVB                    13
146411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_CDCP 			 14
147ea7b4bf5SPeter Avalos 
148ea7b4bf5SPeter Avalos static const struct tok lldp_8021_subtype_values[] = {
149ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID, "Port VLAN Id"},
150ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID, "Port and Protocol VLAN ID"},
151ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME, "VLAN name"},
152ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY, "Protocol Identity"},
153*ed775ee7SAntonio Huete Jimenez     { LLDP_PRIVATE_8021_SUBTYPE_LINKAGGR, "Link aggregation"},
154411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION, "Congestion Notification"},
155411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION, "ETS Configuration"},
156411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION, "ETS Recommendation"},
157411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION, "Priority Flow Control Configuration"},
158411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY, "Application Priority"},
159411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_EVB, "EVB"},
160411677aeSAaron LI     { LLDP_PRIVATE_8021_SUBTYPE_CDCP,"CDCP"},
161ea7b4bf5SPeter Avalos     { 0, NULL}
162ea7b4bf5SPeter Avalos };
163ea7b4bf5SPeter Avalos 
164ea7b4bf5SPeter Avalos #define LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT       (1 <<  1)
165ea7b4bf5SPeter Avalos #define LLDP_8021_PORT_PROTOCOL_VLAN_STATUS        (1 <<  2)
166ea7b4bf5SPeter Avalos 
167ea7b4bf5SPeter Avalos static const struct tok lldp_8021_port_protocol_id_values[] = {
168ea7b4bf5SPeter Avalos     { LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT, "supported"},
169ea7b4bf5SPeter Avalos     { LLDP_8021_PORT_PROTOCOL_VLAN_STATUS, "enabled"},
170ea7b4bf5SPeter Avalos     { 0, NULL}
171ea7b4bf5SPeter Avalos };
172ea7b4bf5SPeter Avalos 
173ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8023_SUBTYPE_MACPHY        1
174ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER      2
175ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR      3
176ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_8023_SUBTYPE_MTU           4
177ea7b4bf5SPeter Avalos 
178ea7b4bf5SPeter Avalos static const struct tok lldp_8023_subtype_values[] = {
179ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8023_SUBTYPE_MACPHY,	"MAC/PHY configuration/status"},
180ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER, "Power via MDI"},
181ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR, "Link aggregation"},
182ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_8023_SUBTYPE_MTU, "Max frame size"},
183ea7b4bf5SPeter Avalos     { 0, NULL}
184ea7b4bf5SPeter Avalos };
185ea7b4bf5SPeter Avalos 
186ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES                   1
187ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY                 2
188ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID                       3
189ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI             4
190ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV         5
191ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV         6
192ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV         7
193ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER        8
194ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME    9
195ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME           10
196ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID             11
197ea7b4bf5SPeter Avalos 
198ea7b4bf5SPeter Avalos static const struct tok lldp_tia_subtype_values[] = {
199ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES, "LLDP-MED Capabilities" },
200ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY, "Network policy" },
201ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID, "Location identification" },
202ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI, "Extended power-via-MDI" },
203ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Inventory - hardware revision" },
204ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Inventory - firmware revision" },
205ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Inventory - software revision" },
206ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Inventory - serial number" },
207ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Inventory - manufacturer name" },
208ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Inventory - model name" },
209ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Inventory - asset ID" },
210ea7b4bf5SPeter Avalos     { 0, NULL}
211ea7b4bf5SPeter Avalos };
212ea7b4bf5SPeter Avalos 
213ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS       1
214ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS       2
215ea7b4bf5SPeter Avalos 
216ea7b4bf5SPeter Avalos static const struct tok lldp_tia_location_altitude_type_values[] = {
217ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS, "meters"},
218ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS, "floors"},
219ea7b4bf5SPeter Avalos     { 0, NULL}
220ea7b4bf5SPeter Avalos };
221ea7b4bf5SPeter Avalos 
222ea7b4bf5SPeter Avalos /* ANSI/TIA-1057 - Annex B */
223ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1		1
224ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2		2
225ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3		3
226ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4		4
227ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5		5
228ea7b4bf5SPeter Avalos #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6		6
229ea7b4bf5SPeter Avalos 
230ea7b4bf5SPeter Avalos static const struct tok lldp_tia_location_lci_catype_values[] = {
231ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1, "national subdivisions (state,canton,region,province,prefecture)"},
232ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2, "county, parish, gun, district"},
233ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3, "city, township, shi"},
234ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4, "city division, borough, city district, ward chou"},
235ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5, "neighborhood, block"},
236ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6, "street"},
237ea7b4bf5SPeter Avalos     { 0, NULL}
238ea7b4bf5SPeter Avalos };
239ea7b4bf5SPeter Avalos 
240ea7b4bf5SPeter Avalos static const struct tok lldp_tia_location_lci_what_values[] = {
241ea7b4bf5SPeter Avalos     { 0, "location of DHCP server"},
242ea7b4bf5SPeter Avalos     { 1, "location of the network element believed to be closest to the client"},
243ea7b4bf5SPeter Avalos     { 2, "location of the client"},
244ea7b4bf5SPeter Avalos     { 0, NULL}
245ea7b4bf5SPeter Avalos };
246ea7b4bf5SPeter Avalos 
247ea7b4bf5SPeter Avalos /*
248ea7b4bf5SPeter Avalos  * From RFC 3636 - dot3MauType
249ea7b4bf5SPeter Avalos  */
250ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_UNKNOWN		0
251ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_AUI		1
252ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_5		2
253ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_FOIRL		3
254ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_2		4
255ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_T		5
256ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_FP		6
257ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_FB		7
258ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_FL		8
259ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BROAD36		9
260ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_T_HD	10
261ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_T_FD	11
262ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_FL_HD	12
263ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10BASE_FL_FD	13
264ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_T4	14
265ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_TX_HD	15
266ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_TX_FD	16
267ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_FX_HD	17
268ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_FX_FD	18
269ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_T2_HD	19
270ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_100BASE_T2_FD	20
271ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_X_HD	21
272ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_X_FD	22
273ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_LX_HD	23
274ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_LX_FD	24
275ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_SX_HD	25
276ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_SX_FD	26
277ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_CX_HD	27
278ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_CX_FD	28
279ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_T_HD	29
280ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_1000BASE_T_FD	30
281ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_X		31
282ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_LX4	32
283ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_R		33
284ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_ER	34
285ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_LR	35
286ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_SR	36
287ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_W		37
288ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_EW	38
289ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_LW	39
290ea7b4bf5SPeter Avalos #define		LLDP_MAU_TYPE_10GBASE_SW	40
291ea7b4bf5SPeter Avalos 
292ea7b4bf5SPeter Avalos static const struct tok lldp_mau_types_values[] = {
293ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_UNKNOWN,            "Unknown"},
294ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_AUI,                "AUI"},
295ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_5,           "10BASE_5"},
296ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_FOIRL,              "FOIRL"},
297ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_2,           "10BASE2"},
298ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_T,           "10BASET duplex mode unknown"},
299ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_FP,          "10BASEFP"},
300ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_FB,          "10BASEFB"},
301ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_FL,          "10BASEFL duplex mode unknown"},
302ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BROAD36,          "10BROAD36"},
303ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_T_HD,        "10BASET hdx"},
304ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_T_FD,        "10BASET fdx"},
305ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_FL_HD,       "10BASEFL hdx"},
306ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10BASE_FL_FD,       "10BASEFL fdx"},
307ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_T4,         "100BASET4"},
308ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_TX_HD,      "100BASETX hdx"},
309ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_TX_FD,      "100BASETX fdx"},
310ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_FX_HD,      "100BASEFX hdx"},
311ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_FX_FD,      "100BASEFX fdx"},
312ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_T2_HD,      "100BASET2 hdx"},
313ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_100BASE_T2_FD,      "100BASET2 fdx"},
314ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_X_HD,      "1000BASEX hdx"},
315ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_X_FD,      "1000BASEX fdx"},
316ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_LX_HD,     "1000BASELX hdx"},
317ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_LX_FD,     "1000BASELX fdx"},
318ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_SX_HD,     "1000BASESX hdx"},
319ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_SX_FD,     "1000BASESX fdx"},
320ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_CX_HD,     "1000BASECX hdx"},
321ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_CX_FD,     "1000BASECX fdx"},
322ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_T_HD,      "1000BASET hdx"},
323ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_1000BASE_T_FD,      "1000BASET fdx"},
324ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_X,          "10GBASEX"},
325ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_LX4,        "10GBASELX4"},
326ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_R,          "10GBASER"},
327ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_ER,         "10GBASEER"},
328ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_LR,         "10GBASELR"},
329ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_SR,         "10GBASESR"},
330ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_W,          "10GBASEW"},
331ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_EW,         "10GBASEEW"},
332ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_LW,         "10GBASELW"},
333ea7b4bf5SPeter Avalos     { LLDP_MAU_TYPE_10GBASE_SW,         "10GBASESW"},
334ea7b4bf5SPeter Avalos     { 0, NULL}
335ea7b4bf5SPeter Avalos };
336ea7b4bf5SPeter Avalos 
337ea7b4bf5SPeter Avalos #define LLDP_8023_AUTONEGOTIATION_SUPPORT       (1 <<  0)
338ea7b4bf5SPeter Avalos #define LLDP_8023_AUTONEGOTIATION_STATUS        (1 <<  1)
339ea7b4bf5SPeter Avalos 
340ea7b4bf5SPeter Avalos static const struct tok lldp_8023_autonegotiation_values[] = {
341ea7b4bf5SPeter Avalos     { LLDP_8023_AUTONEGOTIATION_SUPPORT, "supported"},
342ea7b4bf5SPeter Avalos     { LLDP_8023_AUTONEGOTIATION_STATUS, "enabled"},
343ea7b4bf5SPeter Avalos     { 0, NULL}
344ea7b4bf5SPeter Avalos };
345ea7b4bf5SPeter Avalos 
346ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_MED                         (1 <<  0)
347ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_NETWORK_POLICY              (1 <<  1)
348ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION     (1 <<  2)
349ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE      (1 <<  3)
350ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD       (1 <<  4)
351ea7b4bf5SPeter Avalos #define LLDP_TIA_CAPABILITY_INVENTORY                   (1 <<  5)
352ea7b4bf5SPeter Avalos 
353ea7b4bf5SPeter Avalos static const struct tok lldp_tia_capabilities_values[] = {
354ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_MED, "LLDP-MED capabilities"},
355ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_NETWORK_POLICY, "network policy"},
356ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION, "location identification"},
357ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE, "extended power via MDI-PSE"},
358ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD, "extended power via MDI-PD"},
359ea7b4bf5SPeter Avalos     { LLDP_TIA_CAPABILITY_INVENTORY, "Inventory"},
360ea7b4bf5SPeter Avalos     { 0, NULL}
361ea7b4bf5SPeter Avalos };
362ea7b4bf5SPeter Avalos 
363ea7b4bf5SPeter Avalos #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1           1
364ea7b4bf5SPeter Avalos #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2           2
365ea7b4bf5SPeter Avalos #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3           3
366ea7b4bf5SPeter Avalos #define LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY       4
367ea7b4bf5SPeter Avalos 
368ea7b4bf5SPeter Avalos static const struct tok lldp_tia_device_type_values[] = {
369ea7b4bf5SPeter Avalos     { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1, "endpoint class 1"},
370ea7b4bf5SPeter Avalos     { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2, "endpoint class 2"},
371ea7b4bf5SPeter Avalos     { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3, "endpoint class 3"},
372ea7b4bf5SPeter Avalos     { LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY, "network connectivity"},
373ea7b4bf5SPeter Avalos     { 0, NULL}
374ea7b4bf5SPeter Avalos };
375ea7b4bf5SPeter Avalos 
376ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_VOICE                 1
377ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING       2
378ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE           3
379ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING 4
380ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE       5
381ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING    6
382ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO       7
383ea7b4bf5SPeter Avalos #define LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING       8
384ea7b4bf5SPeter Avalos 
385ea7b4bf5SPeter Avalos static const struct tok lldp_tia_application_type_values[] = {
386ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_VOICE, "voice"},
387ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING, "voice signaling"},
388ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE, "guest voice"},
389ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING, "guest voice signaling"},
390ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE, "softphone voice"},
391ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING, "video conferencing"},
392ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO, "streaming video"},
393ea7b4bf5SPeter Avalos     { LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING, "video signaling"},
394ea7b4bf5SPeter Avalos     { 0, NULL}
395ea7b4bf5SPeter Avalos };
396ea7b4bf5SPeter Avalos 
3976263709fSPeter Avalos #define LLDP_TIA_NETWORK_POLICY_X_BIT           (1 << 5)
398ea7b4bf5SPeter Avalos #define LLDP_TIA_NETWORK_POLICY_T_BIT           (1 << 6)
3996263709fSPeter Avalos #define LLDP_TIA_NETWORK_POLICY_U_BIT           (1 << 7)
400ea7b4bf5SPeter Avalos 
401ea7b4bf5SPeter Avalos static const struct tok lldp_tia_network_policy_bits_values[] = {
402ea7b4bf5SPeter Avalos     { LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"},
403ea7b4bf5SPeter Avalos     { LLDP_TIA_NETWORK_POLICY_T_BIT, "Tagged"},
404ea7b4bf5SPeter Avalos     { LLDP_TIA_NETWORK_POLICY_X_BIT, "reserved"},
405ea7b4bf5SPeter Avalos     { 0, NULL}
406ea7b4bf5SPeter Avalos };
407ea7b4bf5SPeter Avalos 
408ea7b4bf5SPeter Avalos #define LLDP_EXTRACT_NETWORK_POLICY_VLAN(x)           (((x)&0x1ffe)>>1)
409ea7b4bf5SPeter Avalos #define LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(x)    (((x)&0x01ff)>>6)
410ea7b4bf5SPeter Avalos #define LLDP_EXTRACT_NETWORK_POLICY_DSCP(x)           ((x)&0x003f)
411ea7b4bf5SPeter Avalos 
412ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED  1
413ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS     2
414ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN          3
415ea7b4bf5SPeter Avalos 
416ea7b4bf5SPeter Avalos static const struct tok lldp_tia_location_data_format_values[] = {
417ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED, "coordinate-based LCI"},
418ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS, "civic address LCI"},
419ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN, "ECS ELIN"},
420ea7b4bf5SPeter Avalos     { 0, NULL}
421ea7b4bf5SPeter Avalos };
422ea7b4bf5SPeter Avalos 
423ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATUM_WGS_84          1
424ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88  2
425ea7b4bf5SPeter Avalos #define LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW     3
426ea7b4bf5SPeter Avalos 
427ea7b4bf5SPeter Avalos static const struct tok lldp_tia_location_datum_type_values[] = {
428ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATUM_WGS_84, "World Geodesic System 1984"},
429ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88, "North American Datum 1983 (NAVD88)"},
430ea7b4bf5SPeter Avalos     { LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW, "North American Datum 1983 (MLLW)"},
431ea7b4bf5SPeter Avalos     { 0, NULL}
432ea7b4bf5SPeter Avalos };
433ea7b4bf5SPeter Avalos 
434ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_SOURCE_PSE               1
435ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_SOURCE_LOCAL             2
436ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL     3
437ea7b4bf5SPeter Avalos 
438ea7b4bf5SPeter Avalos static const struct tok lldp_tia_power_source_values[] = {
439ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_SOURCE_PSE, "PSE - primary power source"},
440ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_SOURCE_LOCAL, "local - backup power source"},
441ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL, "PSE+local - reserved"},
442ea7b4bf5SPeter Avalos     { 0, NULL}
443ea7b4bf5SPeter Avalos };
444ea7b4bf5SPeter Avalos 
445ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_PRIORITY_CRITICAL        1
446ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_PRIORITY_HIGH            2
447ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_PRIORITY_LOW             3
448ea7b4bf5SPeter Avalos 
449ea7b4bf5SPeter Avalos static const struct tok lldp_tia_power_priority_values[] = {
450ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_PRIORITY_CRITICAL, "critical"},
451ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_PRIORITY_HIGH, "high"},
452ea7b4bf5SPeter Avalos     { LLDP_TIA_POWER_PRIORITY_LOW, "low"},
453ea7b4bf5SPeter Avalos     { 0, NULL}
454ea7b4bf5SPeter Avalos };
455ea7b4bf5SPeter Avalos 
456ea7b4bf5SPeter Avalos #define LLDP_TIA_POWER_VAL_MAX               1024
457ea7b4bf5SPeter Avalos 
458ea7b4bf5SPeter Avalos static const struct tok lldp_tia_inventory_values[] = {
459ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Hardware revision" },
460ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Firmware revision" },
461ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Software revision" },
462ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Serial number" },
463ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Manufacturer name" },
464ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Model name" },
465ea7b4bf5SPeter Avalos     { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Asset ID" },
466ea7b4bf5SPeter Avalos     { 0, NULL}
467ea7b4bf5SPeter Avalos };
468ea7b4bf5SPeter Avalos 
469ea7b4bf5SPeter Avalos /*
470ea7b4bf5SPeter Avalos  * From RFC 3636 - ifMauAutoNegCapAdvertisedBits
471ea7b4bf5SPeter Avalos  */
472ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_OTHER			(1 <<  15)
473ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_10BASE_T			(1 <<  14)
474ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_10BASE_T_FD		(1 <<  13)
475ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_100BASE_T4		(1 <<  12)
476ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_100BASE_TX		(1 <<  11)
477ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_100BASE_TX_FD		(1 <<  10)
478ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_100BASE_T2		(1 <<  9)
479ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_100BASE_T2_FD		(1 <<  8)
480ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_FDXPAUSE			(1 <<  7)
481ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_FDXAPAUSE			(1 <<  6)
482ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_FDXSPAUSE			(1 <<  5)
483ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_FDXBPAUSE			(1 <<  4)
484ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_1000BASE_X		(1 <<  3)
485ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_1000BASE_X_FD		(1 <<  2)
486ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_1000BASE_T		(1 <<  1)
487ea7b4bf5SPeter Avalos #define	 LLDP_MAU_PMD_1000BASE_T_FD		(1 <<  0)
488ea7b4bf5SPeter Avalos 
489ea7b4bf5SPeter Avalos static const struct tok lldp_pmd_capability_values[] = {
490ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_10BASE_T,		"10BASE-T hdx"},
491ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_10BASE_T_FD,	        "10BASE-T fdx"},
492ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_100BASE_T4,		"100BASE-T4"},
493ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_100BASE_TX,		"100BASE-TX hdx"},
494ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_100BASE_TX_FD,	"100BASE-TX fdx"},
495ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_100BASE_T2,		"100BASE-T2 hdx"},
496ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_100BASE_T2_FD,	"100BASE-T2 fdx"},
497ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_FDXPAUSE,		"Pause for fdx links"},
498ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_FDXAPAUSE,		"Asym PAUSE for fdx"},
499ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_FDXSPAUSE,		"Sym PAUSE for fdx"},
500ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_FDXBPAUSE,		"Asym and Sym PAUSE for fdx"},
501ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_1000BASE_X,		"1000BASE-{X LX SX CX} hdx"},
502ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_1000BASE_X_FD,	"1000BASE-{X LX SX CX} fdx"},
503ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_1000BASE_T,		"1000BASE-T hdx"},
504ea7b4bf5SPeter Avalos     { LLDP_MAU_PMD_1000BASE_T_FD,	"1000BASE-T fdx"},
505ea7b4bf5SPeter Avalos     { 0, NULL}
506ea7b4bf5SPeter Avalos };
507ea7b4bf5SPeter Avalos 
508ea7b4bf5SPeter Avalos #define	LLDP_MDI_PORT_CLASS			(1 <<  0)
509ea7b4bf5SPeter Avalos #define	LLDP_MDI_POWER_SUPPORT			(1 <<  1)
510ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_STATE			(1 <<  2)
511ea7b4bf5SPeter Avalos #define LLDP_MDI_PAIR_CONTROL_ABILITY		(1 <<  3)
512ea7b4bf5SPeter Avalos 
513ea7b4bf5SPeter Avalos static const struct tok lldp_mdi_values[] = {
514ea7b4bf5SPeter Avalos     { LLDP_MDI_PORT_CLASS, 		"PSE"},
515ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_SUPPORT, 		"supported"},
516ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_STATE, 		"enabled"},
517ea7b4bf5SPeter Avalos     { LLDP_MDI_PAIR_CONTROL_ABILITY, 	"can be controlled"},
518ea7b4bf5SPeter Avalos     { 0, NULL}
519ea7b4bf5SPeter Avalos };
520ea7b4bf5SPeter Avalos 
521ea7b4bf5SPeter Avalos #define LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL	1
522ea7b4bf5SPeter Avalos #define LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE	2
523ea7b4bf5SPeter Avalos 
524ea7b4bf5SPeter Avalos static const struct tok lldp_mdi_power_pairs_values[] = {
525ea7b4bf5SPeter Avalos     { LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL,	"signal"},
526ea7b4bf5SPeter Avalos     { LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE,	"spare"},
527ea7b4bf5SPeter Avalos     { 0, NULL}
528ea7b4bf5SPeter Avalos };
529ea7b4bf5SPeter Avalos 
530ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_CLASS0		1
531ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_CLASS1		2
532ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_CLASS2		3
533ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_CLASS3		4
534ea7b4bf5SPeter Avalos #define LLDP_MDI_POWER_CLASS4		5
535ea7b4bf5SPeter Avalos 
536ea7b4bf5SPeter Avalos static const struct tok lldp_mdi_power_class_values[] = {
537ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_CLASS0,     "class0"},
538ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_CLASS1,     "class1"},
539ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_CLASS2,     "class2"},
540ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_CLASS3,     "class3"},
541ea7b4bf5SPeter Avalos     { LLDP_MDI_POWER_CLASS4,     "class4"},
542ea7b4bf5SPeter Avalos     { 0, NULL}
543ea7b4bf5SPeter Avalos };
544ea7b4bf5SPeter Avalos 
545*ed775ee7SAntonio Huete Jimenez #define LLDP_AGGREGATION_CAPABILITY     (1 <<  0)
546ea7b4bf5SPeter Avalos #define LLDP_AGGREGATION_STATUS         (1 <<  1)
547ea7b4bf5SPeter Avalos 
548ea7b4bf5SPeter Avalos static const struct tok lldp_aggregation_values[] = {
549*ed775ee7SAntonio Huete Jimenez     { LLDP_AGGREGATION_CAPABILITY, "supported"},
550ea7b4bf5SPeter Avalos     { LLDP_AGGREGATION_STATUS, "enabled"},
551ea7b4bf5SPeter Avalos     { 0, NULL}
552ea7b4bf5SPeter Avalos };
553ea7b4bf5SPeter Avalos 
554ea7b4bf5SPeter Avalos /*
55527bfbee1SPeter Avalos  * DCBX protocol subtypes.
55627bfbee1SPeter Avalos  */
55727bfbee1SPeter Avalos #define LLDP_DCBX_SUBTYPE_1                1
55827bfbee1SPeter Avalos #define LLDP_DCBX_SUBTYPE_2                2
55927bfbee1SPeter Avalos 
56027bfbee1SPeter Avalos static const struct tok lldp_dcbx_subtype_values[] = {
56127bfbee1SPeter Avalos     { LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" },
56227bfbee1SPeter Avalos     { LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" },
56327bfbee1SPeter Avalos     { 0, NULL}
56427bfbee1SPeter Avalos };
56527bfbee1SPeter Avalos 
56627bfbee1SPeter Avalos #define LLDP_DCBX_CONTROL_TLV                1
56727bfbee1SPeter Avalos #define LLDP_DCBX_PRIORITY_GROUPS_TLV        2
56827bfbee1SPeter Avalos #define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV  3
56927bfbee1SPeter Avalos #define LLDP_DCBX_APPLICATION_TLV            4
57027bfbee1SPeter Avalos 
57127bfbee1SPeter Avalos /*
572ea7b4bf5SPeter Avalos  * Interface numbering subtypes.
573ea7b4bf5SPeter Avalos  */
574ea7b4bf5SPeter Avalos #define LLDP_INTF_NUMB_IFX_SUBTYPE         2
575ea7b4bf5SPeter Avalos #define LLDP_INTF_NUMB_SYSPORT_SUBTYPE     3
576ea7b4bf5SPeter Avalos 
577ea7b4bf5SPeter Avalos static const struct tok lldp_intf_numb_subtype_values[] = {
578ea7b4bf5SPeter Avalos     { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" },
579ea7b4bf5SPeter Avalos     { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" },
580ea7b4bf5SPeter Avalos     { 0, NULL}
581ea7b4bf5SPeter Avalos };
582ea7b4bf5SPeter Avalos 
583ea7b4bf5SPeter Avalos #define LLDP_INTF_NUM_LEN                  5
584ea7b4bf5SPeter Avalos 
585411677aeSAaron LI #define LLDP_EVB_MODE_NOT_SUPPORTED	0
586411677aeSAaron LI #define LLDP_EVB_MODE_EVB_BRIDGE	1
587411677aeSAaron LI #define LLDP_EVB_MODE_EVB_STATION	2
588411677aeSAaron LI #define LLDP_EVB_MODE_RESERVED		3
589411677aeSAaron LI 
590411677aeSAaron LI static const struct tok lldp_evb_mode_values[]={
591411677aeSAaron LI     { LLDP_EVB_MODE_NOT_SUPPORTED, "Not Supported"},
592411677aeSAaron LI     { LLDP_EVB_MODE_EVB_BRIDGE, "EVB Bridge"},
593*ed775ee7SAntonio Huete Jimenez     { LLDP_EVB_MODE_EVB_STATION, "EVB Station"},
594411677aeSAaron LI     { LLDP_EVB_MODE_RESERVED, "Reserved for future Standardization"},
595411677aeSAaron LI     { 0, NULL},
596411677aeSAaron LI };
597411677aeSAaron LI 
598411677aeSAaron LI #define NO_OF_BITS 8
599411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH  6
600411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH       25
601411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH      25
602411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH        6
603411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH 5
604411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH                      9
605411677aeSAaron LI #define LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH                 8
606411677aeSAaron LI 
607411677aeSAaron LI #define LLDP_IANA_SUBTYPE_MUDURL 1
608411677aeSAaron LI 
609411677aeSAaron LI static const struct tok lldp_iana_subtype_values[] =   {
610411677aeSAaron LI     { LLDP_IANA_SUBTYPE_MUDURL, "MUD-URL" },
611411677aeSAaron LI     { 0, NULL }
612411677aeSAaron LI };
613411677aeSAaron LI 
614411677aeSAaron LI 
615411677aeSAaron LI static void
print_ets_priority_assignment_table(netdissect_options * ndo,const u_char * ptr)616411677aeSAaron LI print_ets_priority_assignment_table(netdissect_options *ndo,
617411677aeSAaron LI                                     const u_char *ptr)
618411677aeSAaron LI {
619*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t    Priority Assignment Table");
620*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     Priority : 0   1   2   3   4   5   6   7");
621*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     Value    : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
622*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr) >> 4, GET_U_1(ptr) & 0x0f,
623*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 1) >> 4, GET_U_1(ptr + 1) & 0x0f,
624*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 2) >> 4, GET_U_1(ptr + 2) & 0x0f,
625*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 3) >> 4, GET_U_1(ptr + 3) & 0x0f);
626411677aeSAaron LI }
627411677aeSAaron LI 
628411677aeSAaron LI static void
print_tc_bandwidth_table(netdissect_options * ndo,const u_char * ptr)629411677aeSAaron LI print_tc_bandwidth_table(netdissect_options *ndo,
630411677aeSAaron LI                          const u_char *ptr)
631411677aeSAaron LI {
632*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t    TC Bandwidth Table");
633*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     TC%%   : 0   1   2   3   4   5   6   7");
634*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
635*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr), GET_U_1(ptr + 1), GET_U_1(ptr + 2),
636*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 3), GET_U_1(ptr + 4), GET_U_1(ptr + 5),
637*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 6), GET_U_1(ptr + 7));
638411677aeSAaron LI }
639411677aeSAaron LI 
640411677aeSAaron LI static void
print_tsa_assignment_table(netdissect_options * ndo,const u_char * ptr)641411677aeSAaron LI print_tsa_assignment_table(netdissect_options *ndo,
642411677aeSAaron LI                            const u_char *ptr)
643411677aeSAaron LI {
644*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t    TSA Assignment Table");
645*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     Traffic Class: 0   1   2   3   4   5   6   7");
646*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t     Value        : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
647*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr), GET_U_1(ptr + 1), GET_U_1(ptr + 2),
648*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 3), GET_U_1(ptr + 4), GET_U_1(ptr + 5),
649*ed775ee7SAntonio Huete Jimenez               GET_U_1(ptr + 6), GET_U_1(ptr + 7));
650411677aeSAaron LI }
651411677aeSAaron LI 
652ea7b4bf5SPeter Avalos /*
65327bfbee1SPeter Avalos  * Print IEEE 802.1 private extensions. (802.1AB annex E)
654ea7b4bf5SPeter Avalos  */
655ea7b4bf5SPeter Avalos static int
lldp_private_8021_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)656411677aeSAaron LI lldp_private_8021_print(netdissect_options *ndo,
657411677aeSAaron LI                         const u_char *tptr, u_int tlv_len)
658ea7b4bf5SPeter Avalos {
659*ed775ee7SAntonio Huete Jimenez     int hexdump = FALSE;
660*ed775ee7SAntonio Huete Jimenez     u_int subtype;
66127bfbee1SPeter Avalos     u_int sublen;
662411677aeSAaron LI     u_int tval;
663411677aeSAaron LI     u_int i;
664ea7b4bf5SPeter Avalos 
66527bfbee1SPeter Avalos     if (tlv_len < 4) {
66627bfbee1SPeter Avalos         return hexdump;
66727bfbee1SPeter Avalos     }
668*ed775ee7SAntonio Huete Jimenez     subtype = GET_U_1(tptr + 3);
669ea7b4bf5SPeter Avalos 
670*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Subtype (%u)",
671ea7b4bf5SPeter Avalos            tok2str(lldp_8021_subtype_values, "unknown", subtype),
672*ed775ee7SAntonio Huete Jimenez            subtype);
673ea7b4bf5SPeter Avalos 
674ea7b4bf5SPeter Avalos     switch (subtype) {
675ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
67627bfbee1SPeter Avalos         if (tlv_len < 6) {
67727bfbee1SPeter Avalos             return hexdump;
67827bfbee1SPeter Avalos         }
679*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    port vlan id (PVID): %u",
680*ed775ee7SAntonio Huete Jimenez                GET_BE_U_2(tptr + 4));
681ea7b4bf5SPeter Avalos         break;
682ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID:
68327bfbee1SPeter Avalos         if (tlv_len < 7) {
68427bfbee1SPeter Avalos             return hexdump;
68527bfbee1SPeter Avalos         }
686*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)",
687*ed775ee7SAntonio Huete Jimenez                GET_BE_U_2(tptr + 5),
688*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_8021_port_protocol_id_values, "none", GET_U_1(tptr + 4)),
689*ed775ee7SAntonio Huete Jimenez                GET_U_1(tptr + 4));
690ea7b4bf5SPeter Avalos         break;
691ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME:
69227bfbee1SPeter Avalos         if (tlv_len < 6) {
69327bfbee1SPeter Avalos             return hexdump;
69427bfbee1SPeter Avalos         }
695*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    vlan id (VID): %u", GET_BE_U_2(tptr + 4));
69627bfbee1SPeter Avalos         if (tlv_len < 7) {
69727bfbee1SPeter Avalos             return hexdump;
69827bfbee1SPeter Avalos         }
699*ed775ee7SAntonio Huete Jimenez         sublen = GET_U_1(tptr + 6);
70027bfbee1SPeter Avalos         if (tlv_len < 7+sublen) {
70127bfbee1SPeter Avalos             return hexdump;
70227bfbee1SPeter Avalos         }
703*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    vlan name: ");
704*ed775ee7SAntonio Huete Jimenez         nd_printjnp(ndo, tptr + 7, sublen);
705ea7b4bf5SPeter Avalos         break;
706ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY:
70727bfbee1SPeter Avalos         if (tlv_len < 5) {
70827bfbee1SPeter Avalos             return hexdump;
70927bfbee1SPeter Avalos         }
710*ed775ee7SAntonio Huete Jimenez         sublen = GET_U_1(tptr + 4);
71127bfbee1SPeter Avalos         if (tlv_len < 5+sublen) {
71227bfbee1SPeter Avalos             return hexdump;
71327bfbee1SPeter Avalos         }
714*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    protocol identity: ");
715*ed775ee7SAntonio Huete Jimenez         nd_printjnp(ndo, tptr + 5, sublen);
716411677aeSAaron LI         break;
717*ed775ee7SAntonio Huete Jimenez 
718*ed775ee7SAntonio Huete Jimenez     case LLDP_PRIVATE_8021_SUBTYPE_LINKAGGR:
719*ed775ee7SAntonio Huete Jimenez         if (tlv_len < 9) {
720*ed775ee7SAntonio Huete Jimenez             return hexdump;
721*ed775ee7SAntonio Huete Jimenez         }
722*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    aggregation status [%s], aggregation port ID %u",
723*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_aggregation_values, "none", GET_U_1((tptr + 4))),
724*ed775ee7SAntonio Huete Jimenez                GET_BE_U_4(tptr + 5));
725*ed775ee7SAntonio Huete Jimenez         break;
726*ed775ee7SAntonio Huete Jimenez 
727411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION:
728411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH){
729411677aeSAaron LI 		return hexdump;
730411677aeSAaron LI         }
731*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 4);
732*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Pre-Priority CNPV Indicator");
733*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Priority : 0  1  2  3  4  5  6  7");
734*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Value    : ");
735411677aeSAaron LI         for(i=0;i<NO_OF_BITS;i++)
736*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%-2d ", (tval >> i) & 0x01);
737*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 5);
738*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Pre-Priority Ready Indicator");
739*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Priority : 0  1  2  3  4  5  6  7");
740*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Value    : ");
741411677aeSAaron LI         for(i=0;i<NO_OF_BITS;i++)
742*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%-2d ", (tval >> i) & 0x01);
743411677aeSAaron LI         break;
744411677aeSAaron LI 
745411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION:
746411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH) {
747411677aeSAaron LI             return hexdump;
748411677aeSAaron LI         }
749*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 4);
750*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Willing:%u, CBS:%u, RES:%u, Max TCs:%u",
751*ed775ee7SAntonio Huete Jimenez 		tval >> 7, (tval >> 6) & 0x02, (tval >> 3) & 0x07, tval & 0x07);
752411677aeSAaron LI 
753411677aeSAaron LI         /*Print Priority Assignment Table*/
754411677aeSAaron LI         print_ets_priority_assignment_table(ndo, tptr + 5);
755411677aeSAaron LI 
756411677aeSAaron LI         /*Print TC Bandwidth Table*/
757411677aeSAaron LI         print_tc_bandwidth_table(ndo, tptr + 9);
758411677aeSAaron LI 
759411677aeSAaron LI         /* Print TSA Assignment Table */
760411677aeSAaron LI         print_tsa_assignment_table(ndo, tptr + 17);
761411677aeSAaron LI 
762411677aeSAaron LI         break;
763411677aeSAaron LI 
764411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION:
765411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH) {
766411677aeSAaron LI 		return hexdump;
767411677aeSAaron LI         }
768*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    RES: %u", GET_U_1(tptr + 4));
769411677aeSAaron LI         /*Print Priority Assignment Table */
770411677aeSAaron LI         print_ets_priority_assignment_table(ndo, tptr + 5);
771411677aeSAaron LI         /*Print TC Bandwidth Table */
772411677aeSAaron LI         print_tc_bandwidth_table(ndo, tptr + 9);
773411677aeSAaron LI         /* Print TSA Assignment Table */
774411677aeSAaron LI         print_tsa_assignment_table(ndo, tptr + 17);
775411677aeSAaron LI         break;
776411677aeSAaron LI 
777411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION:
778411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH) {
779411677aeSAaron LI             return hexdump;
780411677aeSAaron LI         }
781*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 4);
782*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Willing: %u, MBC: %u, RES: %u, PFC cap:%u ",
783*ed775ee7SAntonio Huete Jimenez 		tval >> 7, (tval >> 6) & 0x01, (tval >> 4) & 0x03, (tval & 0x0f));
784*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    PFC Enable");
785*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 5);
786*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Priority : 0  1  2  3  4  5  6  7");
787*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t     Value    : ");
788411677aeSAaron LI         for(i=0;i<NO_OF_BITS;i++)
789*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%-2d ", (tval >> i) & 0x01);
790411677aeSAaron LI         break;
791411677aeSAaron LI 
792411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY:
793411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH) {
794411677aeSAaron LI             return hexdump;
795411677aeSAaron LI         }
796*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    RES: %u", GET_U_1(tptr + 4));
797411677aeSAaron LI         if(tlv_len<=LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH){
798411677aeSAaron LI 		return hexdump;
799411677aeSAaron LI         }
800411677aeSAaron LI         /*  Length of Application Priority Table */
801411677aeSAaron LI         sublen=tlv_len-5;
802411677aeSAaron LI         if(sublen%3!=0){
803411677aeSAaron LI 		return hexdump;
804411677aeSAaron LI         }
805411677aeSAaron LI         i=0;
806*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Application Priority Table");
807411677aeSAaron LI         while(i<sublen) {
808*ed775ee7SAntonio Huete Jimenez 		tval=GET_U_1(tptr + i + 5);
809*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t      Priority: %u, RES: %u, Sel: %u, Protocol ID: %u",
810411677aeSAaron LI 			 tval >> 5, (tval >> 3) & 0x03, (tval & 0x07),
811*ed775ee7SAntonio Huete Jimenez 			 GET_BE_U_2(tptr + i + 6));
812411677aeSAaron LI 		i=i+3;
813411677aeSAaron LI         }
814411677aeSAaron LI         break;
815411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_EVB:
816411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH){
817411677aeSAaron LI 		return hexdump;
818411677aeSAaron LI         }
819*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    EVB Bridge Status");
820*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 4);
821*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t      RES: %u, BGID: %u, RRCAP: %u, RRCTR: %u",
822*ed775ee7SAntonio Huete Jimenez 		tval >> 3, (tval >> 2) & 0x01, (tval >> 1) & 0x01, tval & 0x01);
823*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    EVB Station Status");
824*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 5);
825*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t      RES: %u, SGID: %u, RRREQ: %u,RRSTAT: %u",
826*ed775ee7SAntonio Huete Jimenez 		tval >> 4, (tval >> 3) & 0x01, (tval >> 2) & 0x01, tval & 0x03);
827*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 6);
828*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    R: %u, RTE: %u, ",tval >> 5, tval & 0x1f);
829*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 7);
830*ed775ee7SAntonio Huete Jimenez         ND_PRINT("EVB Mode: %s [%u]",
831*ed775ee7SAntonio Huete Jimenez 		tok2str(lldp_evb_mode_values, "unknown", tval >> 6), tval >> 6);
832*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    ROL: %u, RWD: %u, ", (tval >> 5) & 0x01, tval & 0x1f);
833*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 8);
834*ed775ee7SAntonio Huete Jimenez         ND_PRINT("RES: %u, ROL: %u, RKA: %u", tval >> 6, (tval >> 5) & 0x01, tval & 0x1f);
835411677aeSAaron LI         break;
836411677aeSAaron LI 
837411677aeSAaron LI     case LLDP_PRIVATE_8021_SUBTYPE_CDCP:
838411677aeSAaron LI         if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH){
839411677aeSAaron LI 		return hexdump;
840411677aeSAaron LI         }
841*ed775ee7SAntonio Huete Jimenez         tval=GET_U_1(tptr + 4);
842*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Role: %u, RES: %u, Scomp: %u ",
843*ed775ee7SAntonio Huete Jimenez 		tval >> 7, (tval >> 4) & 0x07, (tval >> 3) & 0x01);
844*ed775ee7SAntonio Huete Jimenez         ND_PRINT("ChnCap: %u", GET_BE_U_2(tptr + 6) & 0x0fff);
845411677aeSAaron LI         sublen=tlv_len-8;
846411677aeSAaron LI         if(sublen%3!=0) {
847411677aeSAaron LI 		return hexdump;
848411677aeSAaron LI         }
849411677aeSAaron LI         i=0;
850411677aeSAaron LI         while(i<sublen) {
851*ed775ee7SAntonio Huete Jimenez 		tval=GET_BE_U_3(tptr + i + 8);
852*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t    SCID: %u, SVID: %u",
853*ed775ee7SAntonio Huete Jimenez 			tval >> 12, tval & 0x000fff);
854411677aeSAaron LI 		i=i+3;
855411677aeSAaron LI         }
856ea7b4bf5SPeter Avalos         break;
857ea7b4bf5SPeter Avalos 
858ea7b4bf5SPeter Avalos     default:
859ea7b4bf5SPeter Avalos         hexdump = TRUE;
860ea7b4bf5SPeter Avalos         break;
861ea7b4bf5SPeter Avalos     }
862ea7b4bf5SPeter Avalos 
863ea7b4bf5SPeter Avalos     return hexdump;
864ea7b4bf5SPeter Avalos }
865ea7b4bf5SPeter Avalos 
866ea7b4bf5SPeter Avalos /*
86727bfbee1SPeter Avalos  * Print IEEE 802.3 private extensions. (802.3bc)
868ea7b4bf5SPeter Avalos  */
869ea7b4bf5SPeter Avalos static int
lldp_private_8023_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)870411677aeSAaron LI lldp_private_8023_print(netdissect_options *ndo,
871411677aeSAaron LI                         const u_char *tptr, u_int tlv_len)
872ea7b4bf5SPeter Avalos {
873*ed775ee7SAntonio Huete Jimenez     int hexdump = FALSE;
874*ed775ee7SAntonio Huete Jimenez     u_int subtype;
875ea7b4bf5SPeter Avalos 
87627bfbee1SPeter Avalos     if (tlv_len < 4) {
87727bfbee1SPeter Avalos         return hexdump;
87827bfbee1SPeter Avalos     }
879*ed775ee7SAntonio Huete Jimenez     subtype = GET_U_1(tptr + 3);
880ea7b4bf5SPeter Avalos 
881*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Subtype (%u)",
882ea7b4bf5SPeter Avalos            tok2str(lldp_8023_subtype_values, "unknown", subtype),
883*ed775ee7SAntonio Huete Jimenez            subtype);
884ea7b4bf5SPeter Avalos 
885ea7b4bf5SPeter Avalos     switch (subtype) {
886ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
88727bfbee1SPeter Avalos         if (tlv_len < 9) {
88827bfbee1SPeter Avalos             return hexdump;
88927bfbee1SPeter Avalos         }
890*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    autonegotiation [%s] (0x%02x)",
891*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_8023_autonegotiation_values, "none", GET_U_1(tptr + 4)),
892*ed775ee7SAntonio Huete Jimenez                GET_U_1(tptr + 4));
893*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    PMD autoneg capability [%s] (0x%04x)",
894*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_pmd_capability_values,"unknown", GET_BE_U_2(tptr + 5)),
895*ed775ee7SAntonio Huete Jimenez                GET_BE_U_2(tptr + 5));
896*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    MAU type %s (0x%04x)",
897*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_mau_types_values, "unknown", GET_BE_U_2(tptr + 7)),
898*ed775ee7SAntonio Huete Jimenez                GET_BE_U_2(tptr + 7));
899ea7b4bf5SPeter Avalos         break;
900ea7b4bf5SPeter Avalos 
901ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
90227bfbee1SPeter Avalos         if (tlv_len < 7) {
90327bfbee1SPeter Avalos             return hexdump;
90427bfbee1SPeter Avalos         }
905*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    MDI power support [%s], power pair %s, power class %s",
906*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_mdi_values, "none", GET_U_1((tptr + 4))),
907*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_mdi_power_pairs_values, "unknown", GET_U_1((tptr + 5))),
908*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_mdi_power_class_values, "unknown", GET_U_1((tptr + 6))));
909ea7b4bf5SPeter Avalos         break;
910ea7b4bf5SPeter Avalos 
911ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
91227bfbee1SPeter Avalos         if (tlv_len < 9) {
91327bfbee1SPeter Avalos             return hexdump;
91427bfbee1SPeter Avalos         }
915*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    aggregation status [%s], aggregation port ID %u",
916*ed775ee7SAntonio Huete Jimenez                bittok2str(lldp_aggregation_values, "none", GET_U_1((tptr + 4))),
917*ed775ee7SAntonio Huete Jimenez                GET_BE_U_4(tptr + 5));
918ea7b4bf5SPeter Avalos         break;
919ea7b4bf5SPeter Avalos 
920ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_8023_SUBTYPE_MTU:
921411677aeSAaron LI         if (tlv_len < 6) {
922411677aeSAaron LI             return hexdump;
923411677aeSAaron LI         }
924*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    MTU size %u", GET_BE_U_2(tptr + 4));
925ea7b4bf5SPeter Avalos         break;
926ea7b4bf5SPeter Avalos 
927ea7b4bf5SPeter Avalos     default:
928ea7b4bf5SPeter Avalos         hexdump = TRUE;
929ea7b4bf5SPeter Avalos         break;
930ea7b4bf5SPeter Avalos     }
931ea7b4bf5SPeter Avalos 
932ea7b4bf5SPeter Avalos     return hexdump;
933ea7b4bf5SPeter Avalos }
934ea7b4bf5SPeter Avalos 
935ea7b4bf5SPeter Avalos /*
936ea7b4bf5SPeter Avalos  * Extract 34bits of latitude/longitude coordinates.
937ea7b4bf5SPeter Avalos  */
938411677aeSAaron LI static uint64_t
lldp_extract_latlon(netdissect_options * ndo,const u_char * tptr)939*ed775ee7SAntonio Huete Jimenez lldp_extract_latlon(netdissect_options *ndo, const u_char *tptr)
940ea7b4bf5SPeter Avalos {
941411677aeSAaron LI     uint64_t latlon;
942ea7b4bf5SPeter Avalos 
943*ed775ee7SAntonio Huete Jimenez     latlon = GET_U_1(tptr) & 0x3;
944*ed775ee7SAntonio Huete Jimenez     latlon = (latlon << 32) | GET_BE_U_4(tptr + 1);
945ea7b4bf5SPeter Avalos 
946ea7b4bf5SPeter Avalos     return latlon;
947ea7b4bf5SPeter Avalos }
948ea7b4bf5SPeter Avalos 
949411677aeSAaron LI /* objects defined in IANA subtype 00 00 5e
950411677aeSAaron LI  * (right now there is only one)
951411677aeSAaron LI  */
952411677aeSAaron LI 
953411677aeSAaron LI 
954411677aeSAaron LI static int
lldp_private_iana_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)955411677aeSAaron LI lldp_private_iana_print(netdissect_options *ndo,
956411677aeSAaron LI                         const u_char *tptr, u_int tlv_len)
957411677aeSAaron LI {
958*ed775ee7SAntonio Huete Jimenez     int hexdump = FALSE;
959*ed775ee7SAntonio Huete Jimenez     u_int subtype;
960411677aeSAaron LI 
961411677aeSAaron LI     if (tlv_len < 8) {
962411677aeSAaron LI         return hexdump;
963411677aeSAaron LI     }
964*ed775ee7SAntonio Huete Jimenez     subtype = GET_U_1(tptr + 3);
965411677aeSAaron LI 
966*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Subtype (%u)",
967411677aeSAaron LI            tok2str(lldp_iana_subtype_values, "unknown", subtype),
968*ed775ee7SAntonio Huete Jimenez            subtype);
969411677aeSAaron LI 
970411677aeSAaron LI     switch (subtype) {
971411677aeSAaron LI     case LLDP_IANA_SUBTYPE_MUDURL:
972*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t  MUD-URL=");
973*ed775ee7SAntonio Huete Jimenez         (void)nd_printn(ndo, tptr+4, tlv_len-4, NULL);
974411677aeSAaron LI         break;
975411677aeSAaron LI     default:
976411677aeSAaron LI         hexdump=TRUE;
977411677aeSAaron LI     }
978411677aeSAaron LI 
979411677aeSAaron LI     return hexdump;
980411677aeSAaron LI }
981411677aeSAaron LI 
982411677aeSAaron LI 
983411677aeSAaron LI 
984ea7b4bf5SPeter Avalos /*
985ea7b4bf5SPeter Avalos  * Print private TIA extensions.
986ea7b4bf5SPeter Avalos  */
987ea7b4bf5SPeter Avalos static int
lldp_private_tia_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)988411677aeSAaron LI lldp_private_tia_print(netdissect_options *ndo,
989411677aeSAaron LI                        const u_char *tptr, u_int tlv_len)
990ea7b4bf5SPeter Avalos {
991*ed775ee7SAntonio Huete Jimenez     int hexdump = FALSE;
992*ed775ee7SAntonio Huete Jimenez     u_int subtype;
993411677aeSAaron LI     uint8_t location_format;
994411677aeSAaron LI     uint16_t power_val;
99527bfbee1SPeter Avalos     u_int lci_len;
996411677aeSAaron LI     uint8_t ca_type, ca_len;
997ea7b4bf5SPeter Avalos 
99827bfbee1SPeter Avalos     if (tlv_len < 4) {
99927bfbee1SPeter Avalos         return hexdump;
100027bfbee1SPeter Avalos     }
1001*ed775ee7SAntonio Huete Jimenez     subtype = GET_U_1(tptr + 3);
1002ea7b4bf5SPeter Avalos 
1003*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Subtype (%u)",
1004ea7b4bf5SPeter Avalos            tok2str(lldp_tia_subtype_values, "unknown", subtype),
1005*ed775ee7SAntonio Huete Jimenez            subtype);
1006ea7b4bf5SPeter Avalos 
1007ea7b4bf5SPeter Avalos     switch (subtype) {
1008ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES:
100927bfbee1SPeter Avalos         if (tlv_len < 7) {
101027bfbee1SPeter Avalos             return hexdump;
101127bfbee1SPeter Avalos         }
1012*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Media capabilities [%s] (0x%04x)",
1013ea7b4bf5SPeter Avalos                bittok2str(lldp_tia_capabilities_values, "none",
1014*ed775ee7SAntonio Huete Jimenez                           GET_BE_U_2(tptr + 4)), GET_BE_U_2(tptr + 4));
1015*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Device type [%s] (0x%02x)",
1016*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_tia_device_type_values, "unknown", GET_U_1(tptr + 6)),
1017*ed775ee7SAntonio Huete Jimenez                GET_U_1(tptr + 6));
1018ea7b4bf5SPeter Avalos         break;
1019ea7b4bf5SPeter Avalos 
1020ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY:
102127bfbee1SPeter Avalos         if (tlv_len < 8) {
102227bfbee1SPeter Avalos             return hexdump;
102327bfbee1SPeter Avalos         }
1024*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Application type [%s] (0x%02x)",
1025*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_tia_application_type_values, "none", GET_U_1(tptr + 4)),
1026*ed775ee7SAntonio Huete Jimenez                GET_U_1(tptr + 4));
1027*ed775ee7SAntonio Huete Jimenez         ND_PRINT(", Flags [%s]", bittok2str(
1028*ed775ee7SAntonio Huete Jimenez                    lldp_tia_network_policy_bits_values, "none", GET_U_1((tptr + 5))));
1029*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Vlan id %u",
1030*ed775ee7SAntonio Huete Jimenez                LLDP_EXTRACT_NETWORK_POLICY_VLAN(GET_BE_U_2(tptr + 5)));
1031*ed775ee7SAntonio Huete Jimenez         ND_PRINT(", L2 priority %u",
1032*ed775ee7SAntonio Huete Jimenez                LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(GET_BE_U_2(tptr + 6)));
1033*ed775ee7SAntonio Huete Jimenez         ND_PRINT(", DSCP value %u",
1034*ed775ee7SAntonio Huete Jimenez                LLDP_EXTRACT_NETWORK_POLICY_DSCP(GET_BE_U_2(tptr + 6)));
1035ea7b4bf5SPeter Avalos         break;
1036ea7b4bf5SPeter Avalos 
1037ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID:
103827bfbee1SPeter Avalos         if (tlv_len < 5) {
103927bfbee1SPeter Avalos             return hexdump;
104027bfbee1SPeter Avalos         }
1041*ed775ee7SAntonio Huete Jimenez         location_format = GET_U_1(tptr + 4);
1042*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Location data format %s (0x%02x)",
1043ea7b4bf5SPeter Avalos                tok2str(lldp_tia_location_data_format_values, "unknown", location_format),
1044*ed775ee7SAntonio Huete Jimenez                location_format);
1045ea7b4bf5SPeter Avalos 
1046ea7b4bf5SPeter Avalos         switch (location_format) {
1047ea7b4bf5SPeter Avalos         case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED:
104827bfbee1SPeter Avalos             if (tlv_len < 21) {
104927bfbee1SPeter Avalos                 return hexdump;
105027bfbee1SPeter Avalos             }
1051*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Latitude resolution %u, latitude value %" PRIu64,
1052*ed775ee7SAntonio Huete Jimenez                    (GET_U_1(tptr + 5) >> 2),
1053*ed775ee7SAntonio Huete Jimenez                    lldp_extract_latlon(ndo, tptr + 5));
1054*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Longitude resolution %u, longitude value %" PRIu64,
1055*ed775ee7SAntonio Huete Jimenez                    (GET_U_1(tptr + 10) >> 2),
1056*ed775ee7SAntonio Huete Jimenez                    lldp_extract_latlon(ndo, tptr + 10));
1057*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Altitude type %s (%u)",
1058*ed775ee7SAntonio Huete Jimenez                    tok2str(lldp_tia_location_altitude_type_values, "unknown",GET_U_1(tptr + 15) >> 4),
1059*ed775ee7SAntonio Huete Jimenez                    (GET_U_1(tptr + 15) >> 4));
1060*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Altitude resolution %u, altitude value 0x%x",
1061*ed775ee7SAntonio Huete Jimenez                    (GET_BE_U_2(tptr + 15)>>6)&0x3f,
1062*ed775ee7SAntonio Huete Jimenez                    (GET_BE_U_4(tptr + 16) & 0x3fffffff));
1063*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Datum %s (0x%02x)",
1064*ed775ee7SAntonio Huete Jimenez                    tok2str(lldp_tia_location_datum_type_values, "unknown", GET_U_1(tptr + 20)),
1065*ed775ee7SAntonio Huete Jimenez                    GET_U_1(tptr + 20));
1066ea7b4bf5SPeter Avalos             break;
1067ea7b4bf5SPeter Avalos 
1068ea7b4bf5SPeter Avalos         case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS:
106927bfbee1SPeter Avalos             if (tlv_len < 6) {
107027bfbee1SPeter Avalos                 return hexdump;
107127bfbee1SPeter Avalos             }
1072*ed775ee7SAntonio Huete Jimenez             lci_len = GET_U_1(tptr + 5);
107327bfbee1SPeter Avalos             if (lci_len < 3) {
107427bfbee1SPeter Avalos                 return hexdump;
107527bfbee1SPeter Avalos             }
107627bfbee1SPeter Avalos             if (tlv_len < 7+lci_len) {
107727bfbee1SPeter Avalos                 return hexdump;
107827bfbee1SPeter Avalos             }
1079*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    LCI length %u, LCI what %s (0x%02x), Country-code ",
1080ea7b4bf5SPeter Avalos                    lci_len,
1081*ed775ee7SAntonio Huete Jimenez                    tok2str(lldp_tia_location_lci_what_values, "unknown", GET_U_1(tptr + 6)),
1082*ed775ee7SAntonio Huete Jimenez                    GET_U_1(tptr + 6));
1083ea7b4bf5SPeter Avalos 
1084ea7b4bf5SPeter Avalos             /* Country code */
1085*ed775ee7SAntonio Huete Jimenez             nd_printjnp(ndo, tptr + 7, 2);
1086ea7b4bf5SPeter Avalos 
1087ea7b4bf5SPeter Avalos             lci_len = lci_len-3;
1088ea7b4bf5SPeter Avalos             tptr = tptr + 9;
1089ea7b4bf5SPeter Avalos 
1090ea7b4bf5SPeter Avalos             /* Decode each civic address element */
1091ea7b4bf5SPeter Avalos             while (lci_len > 0) {
109227bfbee1SPeter Avalos                 if (lci_len < 2) {
109327bfbee1SPeter Avalos                     return hexdump;
109427bfbee1SPeter Avalos                 }
1095*ed775ee7SAntonio Huete Jimenez 		ca_type = GET_U_1(tptr);
1096*ed775ee7SAntonio Huete Jimenez                 ca_len = GET_U_1(tptr + 1);
1097ea7b4bf5SPeter Avalos 
1098ea7b4bf5SPeter Avalos 		tptr += 2;
1099ea7b4bf5SPeter Avalos                 lci_len -= 2;
1100ea7b4bf5SPeter Avalos 
1101*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t      CA type \'%s\' (%u), length %u: ",
1102ea7b4bf5SPeter Avalos                        tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type),
1103*ed775ee7SAntonio Huete Jimenez                        ca_type, ca_len);
1104ea7b4bf5SPeter Avalos 
1105ea7b4bf5SPeter Avalos 		/* basic sanity check */
1106ea7b4bf5SPeter Avalos 		if ( ca_type == 0 || ca_len == 0) {
1107ea7b4bf5SPeter Avalos                     return hexdump;
1108ea7b4bf5SPeter Avalos 		}
110927bfbee1SPeter Avalos 		if (lci_len < ca_len) {
111027bfbee1SPeter Avalos 		    return hexdump;
111127bfbee1SPeter Avalos 		}
1112ea7b4bf5SPeter Avalos 
1113*ed775ee7SAntonio Huete Jimenez                 nd_printjnp(ndo, tptr, ca_len);
1114ea7b4bf5SPeter Avalos                 tptr += ca_len;
1115ea7b4bf5SPeter Avalos                 lci_len -= ca_len;
1116ea7b4bf5SPeter Avalos             }
1117ea7b4bf5SPeter Avalos             break;
1118ea7b4bf5SPeter Avalos 
1119ea7b4bf5SPeter Avalos         case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN:
1120*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    ECS ELIN id ");
1121*ed775ee7SAntonio Huete Jimenez             nd_printjnp(ndo, tptr + 5, tlv_len - 5);
1122ea7b4bf5SPeter Avalos             break;
1123ea7b4bf5SPeter Avalos 
1124ea7b4bf5SPeter Avalos         default:
1125*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Location ID ");
1126411677aeSAaron LI             print_unknown_data(ndo, tptr + 5, "\n\t      ", tlv_len - 5);
1127ea7b4bf5SPeter Avalos         }
1128ea7b4bf5SPeter Avalos         break;
1129ea7b4bf5SPeter Avalos 
1130ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI:
113127bfbee1SPeter Avalos         if (tlv_len < 7) {
113227bfbee1SPeter Avalos             return hexdump;
113327bfbee1SPeter Avalos         }
1134*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Power type [%s]",
1135*ed775ee7SAntonio Huete Jimenez                (GET_U_1(tptr + 4) & 0xC0 >> 6) ? "PD device" : "PSE device");
1136*ed775ee7SAntonio Huete Jimenez         ND_PRINT(", Power source [%s]",
1137*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_tia_power_source_values, "none", (GET_U_1((tptr + 4)) & 0x30) >> 4));
1138*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Power priority [%s] (0x%02x)",
1139*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_tia_power_priority_values, "none", GET_U_1(tptr + 4) & 0x0f),
1140*ed775ee7SAntonio Huete Jimenez                GET_U_1(tptr + 4) & 0x0f);
1141*ed775ee7SAntonio Huete Jimenez         power_val = GET_BE_U_2(tptr + 5);
1142ea7b4bf5SPeter Avalos         if (power_val < LLDP_TIA_POWER_VAL_MAX) {
1143*ed775ee7SAntonio Huete Jimenez             ND_PRINT(", Power %.1f Watts", ((float)power_val) / 10);
1144ea7b4bf5SPeter Avalos         } else {
1145*ed775ee7SAntonio Huete Jimenez             ND_PRINT(", Power %u (Reserved)", power_val);
1146ea7b4bf5SPeter Avalos         }
1147ea7b4bf5SPeter Avalos         break;
1148ea7b4bf5SPeter Avalos 
1149ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV:
1150ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV:
1151ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV:
1152ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER:
1153ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME:
1154ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME:
1155ea7b4bf5SPeter Avalos     case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID:
1156*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t  %s ",
1157*ed775ee7SAntonio Huete Jimenez                tok2str(lldp_tia_inventory_values, "unknown", subtype));
1158*ed775ee7SAntonio Huete Jimenez         nd_printjnp(ndo, tptr + 4, tlv_len - 4);
1159ea7b4bf5SPeter Avalos         break;
1160ea7b4bf5SPeter Avalos 
1161ea7b4bf5SPeter Avalos     default:
1162ea7b4bf5SPeter Avalos         hexdump = TRUE;
1163ea7b4bf5SPeter Avalos         break;
1164ea7b4bf5SPeter Avalos     }
1165ea7b4bf5SPeter Avalos 
1166ea7b4bf5SPeter Avalos     return hexdump;
1167ea7b4bf5SPeter Avalos }
1168ea7b4bf5SPeter Avalos 
116927bfbee1SPeter Avalos /*
117027bfbee1SPeter Avalos  * Print DCBX Protocol fields (V 1.01).
117127bfbee1SPeter Avalos  */
117227bfbee1SPeter Avalos static int
lldp_private_dcbx_print(netdissect_options * ndo,const u_char * pptr,u_int len)1173411677aeSAaron LI lldp_private_dcbx_print(netdissect_options *ndo,
1174411677aeSAaron LI                         const u_char *pptr, u_int len)
117527bfbee1SPeter Avalos {
1176*ed775ee7SAntonio Huete Jimenez     int hexdump = FALSE;
1177*ed775ee7SAntonio Huete Jimenez     u_int subtype;
1178*ed775ee7SAntonio Huete Jimenez     uint16_t tval;
1179411677aeSAaron LI     uint16_t tlv;
1180411677aeSAaron LI     uint32_t i, pgval, uval;
1181*ed775ee7SAntonio Huete Jimenez     u_int tlen, tlv_type;
1182*ed775ee7SAntonio Huete Jimenez     uint16_t tlv_len;
118327bfbee1SPeter Avalos     const u_char *tptr, *mptr;
118427bfbee1SPeter Avalos 
118527bfbee1SPeter Avalos     if (len < 4) {
118627bfbee1SPeter Avalos         return hexdump;
118727bfbee1SPeter Avalos     }
1188*ed775ee7SAntonio Huete Jimenez     subtype = GET_U_1(pptr + 3);
118927bfbee1SPeter Avalos 
1190*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Subtype (%u)",
119127bfbee1SPeter Avalos            tok2str(lldp_dcbx_subtype_values, "unknown", subtype),
1192*ed775ee7SAntonio Huete Jimenez            subtype);
119327bfbee1SPeter Avalos 
119427bfbee1SPeter Avalos     /* by passing old version */
119527bfbee1SPeter Avalos     if (subtype == LLDP_DCBX_SUBTYPE_1)
119627bfbee1SPeter Avalos 	return TRUE;
119727bfbee1SPeter Avalos 
119827bfbee1SPeter Avalos     tptr = pptr + 4;
119927bfbee1SPeter Avalos     tlen = len - 4;
120027bfbee1SPeter Avalos 
120127bfbee1SPeter Avalos     while (tlen >= sizeof(tlv)) {
120227bfbee1SPeter Avalos 
1203*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, sizeof(tlv));
120427bfbee1SPeter Avalos 
1205*ed775ee7SAntonio Huete Jimenez         tlv = GET_BE_U_2(tptr);
120627bfbee1SPeter Avalos 
120727bfbee1SPeter Avalos         tlv_type = LLDP_EXTRACT_TYPE(tlv);
120827bfbee1SPeter Avalos         tlv_len = LLDP_EXTRACT_LEN(tlv);
120927bfbee1SPeter Avalos         hexdump = FALSE;
121027bfbee1SPeter Avalos 
121127bfbee1SPeter Avalos         tlen -= sizeof(tlv);
121227bfbee1SPeter Avalos         tptr += sizeof(tlv);
121327bfbee1SPeter Avalos 
121427bfbee1SPeter Avalos         /* loop check */
121527bfbee1SPeter Avalos         if (!tlv_type || !tlv_len) {
121627bfbee1SPeter Avalos             break;
121727bfbee1SPeter Avalos         }
121827bfbee1SPeter Avalos 
1219*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, tlv_len);
122027bfbee1SPeter Avalos         if (tlen < tlv_len) {
122127bfbee1SPeter Avalos             goto trunc;
122227bfbee1SPeter Avalos         }
122327bfbee1SPeter Avalos 
122427bfbee1SPeter Avalos 	/* decode every tlv */
122527bfbee1SPeter Avalos         switch (tlv_type) {
122627bfbee1SPeter Avalos         case LLDP_DCBX_CONTROL_TLV:
122727bfbee1SPeter Avalos             if (tlv_len < 10) {
122827bfbee1SPeter Avalos                 goto trunc;
122927bfbee1SPeter Avalos             }
1230*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t    Control - Protocol Control (type 0x%x, length %u)",
1231*ed775ee7SAntonio Huete Jimenez 		LLDP_DCBX_CONTROL_TLV, tlv_len);
1232*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Oper_Version: %u", GET_U_1(tptr));
1233*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Max_Version: %u", GET_U_1(tptr + 1));
1234*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Sequence Number: %u", GET_BE_U_4(tptr + 2));
1235*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Acknowledgement Number: %u",
1236*ed775ee7SAntonio Huete Jimenez 					GET_BE_U_4(tptr + 6));
123727bfbee1SPeter Avalos 	    break;
123827bfbee1SPeter Avalos         case LLDP_DCBX_PRIORITY_GROUPS_TLV:
123927bfbee1SPeter Avalos             if (tlv_len < 17) {
124027bfbee1SPeter Avalos                 goto trunc;
124127bfbee1SPeter Avalos             }
1242*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t    Feature - Priority Group (type 0x%x, length %u)",
1243*ed775ee7SAntonio Huete Jimenez 		LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len);
1244*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Oper_Version: %u", GET_U_1(tptr));
1245*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Max_Version: %u", GET_U_1(tptr + 1));
1246*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Info block(0x%02X): ", GET_U_1(tptr + 2));
1247*ed775ee7SAntonio Huete Jimenez 	    tval = GET_U_1(tptr + 2);
1248*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("Enable bit: %u, Willing bit: %u, Error Bit: %u",
124927bfbee1SPeter Avalos 		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
1250*ed775ee7SAntonio Huete Jimenez 		(tval &  0x20) ? 1 : 0);
1251*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      SubType: %u", GET_U_1(tptr + 3));
1252*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Priority Allocation");
125327bfbee1SPeter Avalos 
1254411677aeSAaron LI 	    /*
1255411677aeSAaron LI 	     * Array of 8 4-bit priority group ID values; we fetch all
1256411677aeSAaron LI 	     * 32 bits and extract each nibble.
1257411677aeSAaron LI 	     */
1258*ed775ee7SAntonio Huete Jimenez 	    pgval = GET_BE_U_4(tptr + 4);
125927bfbee1SPeter Avalos 	    for (i = 0; i <= 7; i++) {
1260*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          PgId_%u: %u",
1261*ed775ee7SAntonio Huete Jimenez 			i, (pgval >> (28 - 4 * i)) & 0xF);
126227bfbee1SPeter Avalos 	    }
1263*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Priority Group Allocation");
126427bfbee1SPeter Avalos 	    for (i = 0; i <= 7; i++)
1265*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          Pg percentage[%u]: %u", i,
1266*ed775ee7SAntonio Huete Jimenez                          GET_U_1(tptr + 8 + i));
1267*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      NumTCsSupported: %u", GET_U_1(tptr + 8 + 8));
126827bfbee1SPeter Avalos 	    break;
126927bfbee1SPeter Avalos         case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV:
127027bfbee1SPeter Avalos             if (tlv_len < 6) {
127127bfbee1SPeter Avalos                 goto trunc;
127227bfbee1SPeter Avalos             }
1273*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t    Feature - Priority Flow Control");
1274*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT(" (type 0x%x, length %u)",
1275*ed775ee7SAntonio Huete Jimenez 		LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len);
1276*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Oper_Version: %u", GET_U_1(tptr));
1277*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Max_Version: %u", GET_U_1(tptr + 1));
1278*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Info block(0x%02X): ", GET_U_1(tptr + 2));
1279*ed775ee7SAntonio Huete Jimenez 	    tval = GET_U_1(tptr + 2);
1280*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("Enable bit: %u, Willing bit: %u, Error Bit: %u",
128127bfbee1SPeter Avalos 		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
1282*ed775ee7SAntonio Huete Jimenez 		(tval &  0x20) ? 1 : 0);
1283*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      SubType: %u", GET_U_1(tptr + 3));
1284*ed775ee7SAntonio Huete Jimenez 	    tval = GET_U_1(tptr + 4);
1285*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      PFC Config (0x%02X)", GET_U_1(tptr + 4));
128627bfbee1SPeter Avalos 	    for (i = 0; i <= 7; i++)
1287*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          Priority Bit %u: %s",
1288*ed775ee7SAntonio Huete Jimenez 		    i, (tval & (1 << i)) ? "Enabled" : "Disabled");
1289*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      NumTCPFCSupported: %u", GET_U_1(tptr + 5));
129027bfbee1SPeter Avalos 	    break;
129127bfbee1SPeter Avalos         case LLDP_DCBX_APPLICATION_TLV:
129227bfbee1SPeter Avalos             if (tlv_len < 4) {
129327bfbee1SPeter Avalos                 goto trunc;
129427bfbee1SPeter Avalos             }
1295*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t    Feature - Application (type 0x%x, length %u)",
1296*ed775ee7SAntonio Huete Jimenez 		LLDP_DCBX_APPLICATION_TLV, tlv_len);
1297*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Oper_Version: %u", GET_U_1(tptr));
1298*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Max_Version: %u", GET_U_1(tptr + 1));
1299*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      Info block(0x%02X): ", GET_U_1(tptr + 2));
1300*ed775ee7SAntonio Huete Jimenez 	    tval = GET_U_1(tptr + 2);
1301*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("Enable bit: %u, Willing bit: %u, Error Bit: %u",
130227bfbee1SPeter Avalos 		(tval &  0x80) ? 1 : 0, (tval &  0x40) ? 1 : 0,
1303*ed775ee7SAntonio Huete Jimenez 		(tval &  0x20) ? 1 : 0);
1304*ed775ee7SAntonio Huete Jimenez 	    ND_PRINT("\n\t      SubType: %u", GET_U_1(tptr + 3));
130527bfbee1SPeter Avalos 	    tval = tlv_len - 4;
130627bfbee1SPeter Avalos 	    mptr = tptr + 4;
130727bfbee1SPeter Avalos 	    while (tval >= 6) {
1308*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t      Application Value");
1309*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          Application Protocol ID: 0x%04x",
1310*ed775ee7SAntonio Huete Jimenez 			GET_BE_U_2(mptr));
1311*ed775ee7SAntonio Huete Jimenez 		uval = GET_BE_U_3(mptr + 2);
1312*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          SF (0x%x) Application Protocol ID is %s",
131327bfbee1SPeter Avalos 			(uval >> 22),
1314*ed775ee7SAntonio Huete Jimenez 			(uval >> 22) ? "Socket Number" : "L2 EtherType");
1315*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          OUI: 0x%06x", uval & 0x3fffff);
1316*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("\n\t          User Priority Map: 0x%02x",
1317*ed775ee7SAntonio Huete Jimenez                          GET_U_1(mptr + 5));
131827bfbee1SPeter Avalos 		tval = tval - 6;
131927bfbee1SPeter Avalos 		mptr = mptr + 6;
132027bfbee1SPeter Avalos 	    }
132127bfbee1SPeter Avalos 	    break;
132227bfbee1SPeter Avalos 	default:
132327bfbee1SPeter Avalos 	    hexdump = TRUE;
132427bfbee1SPeter Avalos 	    break;
132527bfbee1SPeter Avalos 	}
132627bfbee1SPeter Avalos 
132727bfbee1SPeter Avalos         /* do we also want to see a hex dump ? */
1328411677aeSAaron LI         if (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
1329411677aeSAaron LI 	    print_unknown_data(ndo, tptr, "\n\t    ", tlv_len);
133027bfbee1SPeter Avalos         }
133127bfbee1SPeter Avalos 
133227bfbee1SPeter Avalos         tlen -= tlv_len;
133327bfbee1SPeter Avalos         tptr += tlv_len;
133427bfbee1SPeter Avalos     }
133527bfbee1SPeter Avalos 
133627bfbee1SPeter Avalos  trunc:
133727bfbee1SPeter Avalos     return hexdump;
133827bfbee1SPeter Avalos }
133927bfbee1SPeter Avalos 
1340ea7b4bf5SPeter Avalos static char *
lldp_network_addr_print(netdissect_options * ndo,const u_char * tptr,u_int len)1341411677aeSAaron LI lldp_network_addr_print(netdissect_options *ndo, const u_char *tptr, u_int len)
1342411677aeSAaron LI {
1343411677aeSAaron LI     uint8_t af;
1344ea7b4bf5SPeter Avalos     static char buf[BUFSIZE];
1345411677aeSAaron LI     const char * (*pfunc)(netdissect_options *, const u_char *);
1346ea7b4bf5SPeter Avalos 
134727bfbee1SPeter Avalos     if (len < 1)
134827bfbee1SPeter Avalos       return NULL;
134927bfbee1SPeter Avalos     len--;
1350*ed775ee7SAntonio Huete Jimenez     af = GET_U_1(tptr);
1351ea7b4bf5SPeter Avalos     switch (af) {
1352ea7b4bf5SPeter Avalos     case AFNUM_INET:
1353*ed775ee7SAntonio Huete Jimenez         if (len < sizeof(nd_ipv4))
135427bfbee1SPeter Avalos           return NULL;
1355*ed775ee7SAntonio Huete Jimenez         pfunc = ipaddr_string;
1356ea7b4bf5SPeter Avalos         break;
1357ea7b4bf5SPeter Avalos     case AFNUM_INET6:
1358*ed775ee7SAntonio Huete Jimenez         if (len < sizeof(nd_ipv6))
135927bfbee1SPeter Avalos           return NULL;
1360*ed775ee7SAntonio Huete Jimenez         pfunc = ip6addr_string;
1361ea7b4bf5SPeter Avalos         break;
1362ea7b4bf5SPeter Avalos     case AFNUM_802:
1363*ed775ee7SAntonio Huete Jimenez         if (len < MAC_ADDR_LEN)
136427bfbee1SPeter Avalos           return NULL;
1365ea7b4bf5SPeter Avalos         pfunc = etheraddr_string;
1366ea7b4bf5SPeter Avalos         break;
1367ea7b4bf5SPeter Avalos     default:
1368ea7b4bf5SPeter Avalos         pfunc = NULL;
1369ea7b4bf5SPeter Avalos         break;
1370ea7b4bf5SPeter Avalos     }
1371ea7b4bf5SPeter Avalos 
1372ea7b4bf5SPeter Avalos     if (!pfunc) {
1373ea7b4bf5SPeter Avalos         snprintf(buf, sizeof(buf), "AFI %s (%u), no AF printer !",
1374ea7b4bf5SPeter Avalos                  tok2str(af_values, "Unknown", af), af);
1375ea7b4bf5SPeter Avalos     } else {
1376ea7b4bf5SPeter Avalos         snprintf(buf, sizeof(buf), "AFI %s (%u): %s",
1377411677aeSAaron LI                  tok2str(af_values, "Unknown", af), af, (*pfunc)(ndo, tptr+1));
1378ea7b4bf5SPeter Avalos     }
1379ea7b4bf5SPeter Avalos 
1380ea7b4bf5SPeter Avalos     return buf;
1381ea7b4bf5SPeter Avalos }
1382ea7b4bf5SPeter Avalos 
1383ea7b4bf5SPeter Avalos static int
lldp_mgmt_addr_tlv_print(netdissect_options * ndo,const u_char * pptr,u_int len)1384411677aeSAaron LI lldp_mgmt_addr_tlv_print(netdissect_options *ndo,
1385411677aeSAaron LI                          const u_char *pptr, u_int len)
1386411677aeSAaron LI {
1387411677aeSAaron LI     uint8_t mgmt_addr_len, intf_num_subtype, oid_len;
1388ea7b4bf5SPeter Avalos     const u_char *tptr;
1389ea7b4bf5SPeter Avalos     u_int tlen;
139027bfbee1SPeter Avalos     char *mgmt_addr;
1391ea7b4bf5SPeter Avalos 
1392ea7b4bf5SPeter Avalos     tlen = len;
1393ea7b4bf5SPeter Avalos     tptr = pptr;
1394ea7b4bf5SPeter Avalos 
139527bfbee1SPeter Avalos     if (tlen < 1) {
139627bfbee1SPeter Avalos         return 0;
139727bfbee1SPeter Avalos     }
1398*ed775ee7SAntonio Huete Jimenez     mgmt_addr_len = GET_U_1(tptr);
1399*ed775ee7SAntonio Huete Jimenez     tptr++;
1400ea7b4bf5SPeter Avalos     tlen--;
1401ea7b4bf5SPeter Avalos 
1402ea7b4bf5SPeter Avalos     if (tlen < mgmt_addr_len) {
1403ea7b4bf5SPeter Avalos         return 0;
1404ea7b4bf5SPeter Avalos     }
1405ea7b4bf5SPeter Avalos 
1406411677aeSAaron LI     mgmt_addr = lldp_network_addr_print(ndo, tptr, mgmt_addr_len);
140727bfbee1SPeter Avalos     if (mgmt_addr == NULL) {
140827bfbee1SPeter Avalos         return 0;
140927bfbee1SPeter Avalos     }
1410*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  Management Address length %u, %s",
1411*ed775ee7SAntonio Huete Jimenez            mgmt_addr_len, mgmt_addr);
1412ea7b4bf5SPeter Avalos     tptr += mgmt_addr_len;
1413ea7b4bf5SPeter Avalos     tlen -= mgmt_addr_len;
1414ea7b4bf5SPeter Avalos 
1415ea7b4bf5SPeter Avalos     if (tlen < LLDP_INTF_NUM_LEN) {
1416ea7b4bf5SPeter Avalos         return 0;
1417ea7b4bf5SPeter Avalos     }
1418ea7b4bf5SPeter Avalos 
1419*ed775ee7SAntonio Huete Jimenez     intf_num_subtype = GET_U_1(tptr);
1420*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t  %s Interface Numbering (%u): %u",
1421ea7b4bf5SPeter Avalos            tok2str(lldp_intf_numb_subtype_values, "Unknown", intf_num_subtype),
1422ea7b4bf5SPeter Avalos            intf_num_subtype,
1423*ed775ee7SAntonio Huete Jimenez            GET_BE_U_4(tptr + 1));
1424ea7b4bf5SPeter Avalos 
1425ea7b4bf5SPeter Avalos     tptr += LLDP_INTF_NUM_LEN;
1426ea7b4bf5SPeter Avalos     tlen -= LLDP_INTF_NUM_LEN;
1427ea7b4bf5SPeter Avalos 
1428ea7b4bf5SPeter Avalos     /*
1429ea7b4bf5SPeter Avalos      * The OID is optional.
1430ea7b4bf5SPeter Avalos      */
1431ea7b4bf5SPeter Avalos     if (tlen) {
1432*ed775ee7SAntonio Huete Jimenez         oid_len = GET_U_1(tptr);
1433ea7b4bf5SPeter Avalos 
1434411677aeSAaron LI         if (tlen < 1U + oid_len) {
143527bfbee1SPeter Avalos             return 0;
143627bfbee1SPeter Avalos         }
1437ea7b4bf5SPeter Avalos         if (oid_len) {
1438*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t  OID length %u", oid_len);
1439*ed775ee7SAntonio Huete Jimenez             nd_printjnp(ndo, tptr + 1, oid_len);
1440ea7b4bf5SPeter Avalos         }
1441ea7b4bf5SPeter Avalos     }
1442ea7b4bf5SPeter Avalos 
1443ea7b4bf5SPeter Avalos     return 1;
1444ea7b4bf5SPeter Avalos }
1445ea7b4bf5SPeter Avalos 
1446ea7b4bf5SPeter Avalos void
lldp_print(netdissect_options * ndo,const u_char * pptr,u_int len)1447411677aeSAaron LI lldp_print(netdissect_options *ndo,
1448*ed775ee7SAntonio Huete Jimenez            const u_char *pptr, u_int len)
1449411677aeSAaron LI {
1450411677aeSAaron LI     uint8_t subtype;
1451411677aeSAaron LI     uint16_t tlv, cap, ena_cap;
1452ea7b4bf5SPeter Avalos     u_int oui, tlen, hexdump, tlv_type, tlv_len;
1453ea7b4bf5SPeter Avalos     const u_char *tptr;
145427bfbee1SPeter Avalos     char *network_addr;
1455ea7b4bf5SPeter Avalos 
1456*ed775ee7SAntonio Huete Jimenez     ndo->ndo_protocol = "lldp";
1457ea7b4bf5SPeter Avalos     tptr = pptr;
1458ea7b4bf5SPeter Avalos     tlen = len;
1459ea7b4bf5SPeter Avalos 
1460*ed775ee7SAntonio Huete Jimenez     ND_PRINT("LLDP, length %u", len);
1461ea7b4bf5SPeter Avalos 
1462ea7b4bf5SPeter Avalos     while (tlen >= sizeof(tlv)) {
1463ea7b4bf5SPeter Avalos 
1464*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, sizeof(tlv));
1465ea7b4bf5SPeter Avalos 
1466*ed775ee7SAntonio Huete Jimenez         tlv = GET_BE_U_2(tptr);
1467ea7b4bf5SPeter Avalos 
1468ea7b4bf5SPeter Avalos         tlv_type = LLDP_EXTRACT_TYPE(tlv);
1469ea7b4bf5SPeter Avalos         tlv_len = LLDP_EXTRACT_LEN(tlv);
1470ea7b4bf5SPeter Avalos         hexdump = FALSE;
1471ea7b4bf5SPeter Avalos 
1472ea7b4bf5SPeter Avalos         tlen -= sizeof(tlv);
1473ea7b4bf5SPeter Avalos         tptr += sizeof(tlv);
1474ea7b4bf5SPeter Avalos 
1475411677aeSAaron LI         if (ndo->ndo_vflag) {
1476*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t%s TLV (%u), length %u",
1477ea7b4bf5SPeter Avalos                    tok2str(lldp_tlv_values, "Unknown", tlv_type),
1478*ed775ee7SAntonio Huete Jimenez                    tlv_type, tlv_len);
1479ea7b4bf5SPeter Avalos         }
1480ea7b4bf5SPeter Avalos 
1481ea7b4bf5SPeter Avalos         /* infinite loop check */
1482ea7b4bf5SPeter Avalos         if (!tlv_type || !tlv_len) {
1483ea7b4bf5SPeter Avalos             break;
1484ea7b4bf5SPeter Avalos         }
1485ea7b4bf5SPeter Avalos 
1486*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, tlv_len);
148727bfbee1SPeter Avalos         if (tlen < tlv_len) {
148827bfbee1SPeter Avalos             goto trunc;
148927bfbee1SPeter Avalos         }
1490ea7b4bf5SPeter Avalos 
1491ea7b4bf5SPeter Avalos         switch (tlv_type) {
149227bfbee1SPeter Avalos 
149327bfbee1SPeter Avalos         case LLDP_CHASSIS_ID_TLV:
1494411677aeSAaron LI             if (ndo->ndo_vflag) {
149527bfbee1SPeter Avalos                 if (tlv_len < 2) {
149627bfbee1SPeter Avalos                     goto trunc;
149727bfbee1SPeter Avalos                 }
1498*ed775ee7SAntonio Huete Jimenez                 subtype = GET_U_1(tptr);
1499*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  Subtype %s (%u): ",
150027bfbee1SPeter Avalos                        tok2str(lldp_chassis_subtype_values, "Unknown", subtype),
1501*ed775ee7SAntonio Huete Jimenez                        subtype);
150227bfbee1SPeter Avalos 
150327bfbee1SPeter Avalos                 switch (subtype) {
150427bfbee1SPeter Avalos                 case LLDP_CHASSIS_MAC_ADDR_SUBTYPE:
150527bfbee1SPeter Avalos                     if (tlv_len < 1+6) {
150627bfbee1SPeter Avalos                         goto trunc;
150727bfbee1SPeter Avalos                     }
1508*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s", GET_ETHERADDR_STRING(tptr + 1));
150927bfbee1SPeter Avalos                     break;
151027bfbee1SPeter Avalos 
151127bfbee1SPeter Avalos                 case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */
151227bfbee1SPeter Avalos                 case LLDP_CHASSIS_LOCAL_SUBTYPE:
151327bfbee1SPeter Avalos                 case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE:
151427bfbee1SPeter Avalos                 case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE:
151527bfbee1SPeter Avalos                 case LLDP_CHASSIS_PORT_COMP_SUBTYPE:
1516*ed775ee7SAntonio Huete Jimenez                     nd_printjnp(ndo, tptr + 1, tlv_len - 1);
151727bfbee1SPeter Avalos                     break;
151827bfbee1SPeter Avalos 
151927bfbee1SPeter Avalos                 case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
1520411677aeSAaron LI                     network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
152127bfbee1SPeter Avalos                     if (network_addr == NULL) {
152227bfbee1SPeter Avalos                         goto trunc;
152327bfbee1SPeter Avalos                     }
1524*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s", network_addr);
152527bfbee1SPeter Avalos                     break;
152627bfbee1SPeter Avalos 
152727bfbee1SPeter Avalos                 default:
152827bfbee1SPeter Avalos                     hexdump = TRUE;
152927bfbee1SPeter Avalos                     break;
153027bfbee1SPeter Avalos                 }
153127bfbee1SPeter Avalos             }
153227bfbee1SPeter Avalos             break;
153327bfbee1SPeter Avalos 
153427bfbee1SPeter Avalos         case LLDP_PORT_ID_TLV:
1535411677aeSAaron LI             if (ndo->ndo_vflag) {
153627bfbee1SPeter Avalos                 if (tlv_len < 2) {
153727bfbee1SPeter Avalos                     goto trunc;
153827bfbee1SPeter Avalos                 }
1539*ed775ee7SAntonio Huete Jimenez                 subtype = GET_U_1(tptr);
1540*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  Subtype %s (%u): ",
154127bfbee1SPeter Avalos                        tok2str(lldp_port_subtype_values, "Unknown", subtype),
1542*ed775ee7SAntonio Huete Jimenez                        subtype);
154327bfbee1SPeter Avalos 
154427bfbee1SPeter Avalos                 switch (subtype) {
154527bfbee1SPeter Avalos                 case LLDP_PORT_MAC_ADDR_SUBTYPE:
154627bfbee1SPeter Avalos                     if (tlv_len < 1+6) {
154727bfbee1SPeter Avalos                         goto trunc;
154827bfbee1SPeter Avalos                     }
1549*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s", GET_ETHERADDR_STRING(tptr + 1));
155027bfbee1SPeter Avalos                     break;
155127bfbee1SPeter Avalos 
155227bfbee1SPeter Avalos                 case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
155327bfbee1SPeter Avalos                 case LLDP_PORT_LOCAL_SUBTYPE:
155427bfbee1SPeter Avalos                 case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
155527bfbee1SPeter Avalos                 case LLDP_PORT_INTF_ALIAS_SUBTYPE:
155627bfbee1SPeter Avalos                 case LLDP_PORT_PORT_COMP_SUBTYPE:
1557*ed775ee7SAntonio Huete Jimenez                     nd_printjnp(ndo, tptr + 1, tlv_len - 1);
155827bfbee1SPeter Avalos                     break;
155927bfbee1SPeter Avalos 
156027bfbee1SPeter Avalos                 case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
1561411677aeSAaron LI                     network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
156227bfbee1SPeter Avalos                     if (network_addr == NULL) {
156327bfbee1SPeter Avalos                         goto trunc;
156427bfbee1SPeter Avalos                     }
1565*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s", network_addr);
156627bfbee1SPeter Avalos                     break;
156727bfbee1SPeter Avalos 
156827bfbee1SPeter Avalos                 default:
156927bfbee1SPeter Avalos                     hexdump = TRUE;
157027bfbee1SPeter Avalos                     break;
157127bfbee1SPeter Avalos                 }
157227bfbee1SPeter Avalos             }
157327bfbee1SPeter Avalos             break;
157427bfbee1SPeter Avalos 
1575ea7b4bf5SPeter Avalos         case LLDP_TTL_TLV:
1576411677aeSAaron LI             if (ndo->ndo_vflag) {
157727bfbee1SPeter Avalos                 if (tlv_len < 2) {
157827bfbee1SPeter Avalos                     goto trunc;
157927bfbee1SPeter Avalos                 }
1580*ed775ee7SAntonio Huete Jimenez                 ND_PRINT(": TTL %us", GET_BE_U_2(tptr));
1581ea7b4bf5SPeter Avalos             }
1582ea7b4bf5SPeter Avalos             break;
1583ea7b4bf5SPeter Avalos 
158427bfbee1SPeter Avalos         case LLDP_PORT_DESCR_TLV:
1585411677aeSAaron LI             if (ndo->ndo_vflag) {
1586*ed775ee7SAntonio Huete Jimenez                 ND_PRINT(": ");
1587*ed775ee7SAntonio Huete Jimenez                 nd_printjnp(ndo, tptr, tlv_len);
158827bfbee1SPeter Avalos             }
158927bfbee1SPeter Avalos             break;
1590ea7b4bf5SPeter Avalos 
159127bfbee1SPeter Avalos         case LLDP_SYSTEM_NAME_TLV:
1592ea7b4bf5SPeter Avalos             /*
1593ea7b4bf5SPeter Avalos              * The system name is also print in non-verbose mode
1594ea7b4bf5SPeter Avalos              * similar to the CDP printer.
1595ea7b4bf5SPeter Avalos              */
1596*ed775ee7SAntonio Huete Jimenez             ND_PRINT(": ");
1597*ed775ee7SAntonio Huete Jimenez             nd_printjnp(ndo, tptr, tlv_len);
1598ea7b4bf5SPeter Avalos             break;
1599ea7b4bf5SPeter Avalos 
1600ea7b4bf5SPeter Avalos         case LLDP_SYSTEM_DESCR_TLV:
1601411677aeSAaron LI             if (ndo->ndo_vflag) {
1602*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  ");
1603*ed775ee7SAntonio Huete Jimenez                 nd_printjnp(ndo, tptr, tlv_len);
1604ea7b4bf5SPeter Avalos             }
1605ea7b4bf5SPeter Avalos             break;
1606ea7b4bf5SPeter Avalos 
1607ea7b4bf5SPeter Avalos         case LLDP_SYSTEM_CAP_TLV:
1608411677aeSAaron LI             if (ndo->ndo_vflag) {
160927bfbee1SPeter Avalos                 /*
161027bfbee1SPeter Avalos                  * XXX - IEEE Std 802.1AB-2009 says the first octet
161127bfbee1SPeter Avalos                  * if a chassis ID subtype, with the system
161227bfbee1SPeter Avalos                  * capabilities and enabled capabilities following
161327bfbee1SPeter Avalos                  * it.
161427bfbee1SPeter Avalos                  */
161527bfbee1SPeter Avalos                 if (tlv_len < 4) {
161627bfbee1SPeter Avalos                     goto trunc;
161727bfbee1SPeter Avalos                 }
1618*ed775ee7SAntonio Huete Jimenez                 cap = GET_BE_U_2(tptr);
1619*ed775ee7SAntonio Huete Jimenez                 ena_cap = GET_BE_U_2(tptr + 2);
1620*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  System  Capabilities [%s] (0x%04x)",
1621*ed775ee7SAntonio Huete Jimenez                        bittok2str(lldp_cap_values, "none", cap), cap);
1622*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  Enabled Capabilities [%s] (0x%04x)",
1623*ed775ee7SAntonio Huete Jimenez                        bittok2str(lldp_cap_values, "none", ena_cap), ena_cap);
1624ea7b4bf5SPeter Avalos             }
1625ea7b4bf5SPeter Avalos             break;
1626ea7b4bf5SPeter Avalos 
1627ea7b4bf5SPeter Avalos         case LLDP_MGMT_ADDR_TLV:
1628411677aeSAaron LI             if (ndo->ndo_vflag) {
1629411677aeSAaron LI                 if (!lldp_mgmt_addr_tlv_print(ndo, tptr, tlv_len)) {
1630ea7b4bf5SPeter Avalos                     goto trunc;
1631ea7b4bf5SPeter Avalos                 }
1632ea7b4bf5SPeter Avalos             }
1633ea7b4bf5SPeter Avalos             break;
1634ea7b4bf5SPeter Avalos 
163527bfbee1SPeter Avalos         case LLDP_PRIVATE_TLV:
1636411677aeSAaron LI             if (ndo->ndo_vflag) {
163727bfbee1SPeter Avalos                 if (tlv_len < 3) {
163827bfbee1SPeter Avalos                     goto trunc;
163927bfbee1SPeter Avalos                 }
1640*ed775ee7SAntonio Huete Jimenez                 oui = GET_BE_U_3(tptr);
1641*ed775ee7SAntonio Huete Jimenez                 ND_PRINT(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui);
164227bfbee1SPeter Avalos 
164327bfbee1SPeter Avalos                 switch (oui) {
164427bfbee1SPeter Avalos                 case OUI_IEEE_8021_PRIVATE:
1645411677aeSAaron LI                     hexdump = lldp_private_8021_print(ndo, tptr, tlv_len);
164627bfbee1SPeter Avalos                     break;
164727bfbee1SPeter Avalos                 case OUI_IEEE_8023_PRIVATE:
1648411677aeSAaron LI                     hexdump = lldp_private_8023_print(ndo, tptr, tlv_len);
1649411677aeSAaron LI                     break;
1650411677aeSAaron LI 		case OUI_IANA:
1651411677aeSAaron LI                     hexdump = lldp_private_iana_print(ndo, tptr, tlv_len);
165227bfbee1SPeter Avalos                     break;
165327bfbee1SPeter Avalos                 case OUI_TIA:
1654411677aeSAaron LI                     hexdump = lldp_private_tia_print(ndo, tptr, tlv_len);
165527bfbee1SPeter Avalos                     break;
165627bfbee1SPeter Avalos                 case OUI_DCBX:
1657411677aeSAaron LI                     hexdump = lldp_private_dcbx_print(ndo, tptr, tlv_len);
165827bfbee1SPeter Avalos                     break;
165927bfbee1SPeter Avalos                 default:
166027bfbee1SPeter Avalos                     hexdump = TRUE;
166127bfbee1SPeter Avalos                     break;
166227bfbee1SPeter Avalos                 }
166327bfbee1SPeter Avalos             }
166427bfbee1SPeter Avalos             break;
166527bfbee1SPeter Avalos 
1666ea7b4bf5SPeter Avalos         default:
1667ea7b4bf5SPeter Avalos             hexdump = TRUE;
1668ea7b4bf5SPeter Avalos             break;
1669ea7b4bf5SPeter Avalos         }
1670ea7b4bf5SPeter Avalos 
1671ea7b4bf5SPeter Avalos         /* do we also want to see a hex dump ? */
1672411677aeSAaron LI         if (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
1673411677aeSAaron LI             print_unknown_data(ndo, tptr, "\n\t  ", tlv_len);
1674ea7b4bf5SPeter Avalos         }
1675ea7b4bf5SPeter Avalos 
1676ea7b4bf5SPeter Avalos         tlen -= tlv_len;
1677ea7b4bf5SPeter Avalos         tptr += tlv_len;
1678ea7b4bf5SPeter Avalos     }
1679ea7b4bf5SPeter Avalos     return;
1680ea7b4bf5SPeter Avalos  trunc:
1681*ed775ee7SAntonio Huete Jimenez     nd_print_trunc(ndo);
1682ea7b4bf5SPeter Avalos }
1683