1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Copyright (c) 1998-2007 The TCPDUMP project
3*b636d99dSDavid van Moolenbroek *
4*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
5*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code
6*b636d99dSDavid van Moolenbroek * distributions retain the above copyright notice and this paragraph
7*b636d99dSDavid van Moolenbroek * in its entirety, and (2) distributions including binary code include
8*b636d99dSDavid van Moolenbroek * the above copyright notice and this paragraph in its entirety in
9*b636d99dSDavid van Moolenbroek * the documentation or other materials provided with the distribution.
10*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
11*b636d99dSDavid van Moolenbroek * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
12*b636d99dSDavid van Moolenbroek * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13*b636d99dSDavid van Moolenbroek * FOR A PARTICULAR PURPOSE.
14*b636d99dSDavid van Moolenbroek *
15*b636d99dSDavid van Moolenbroek * support for the IEEE Link Discovery Protocol as per 802.1AB
16*b636d99dSDavid van Moolenbroek *
17*b636d99dSDavid van Moolenbroek * Original code by Hannes Gredler (hannes@juniper.net)
18*b636d99dSDavid van Moolenbroek * IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com>
19*b636d99dSDavid van Moolenbroek * DCBX extensions by Kaladhar Musunuru <kaladharm@sourceforge.net>
20*b636d99dSDavid van Moolenbroek */
21*b636d99dSDavid van Moolenbroek
22*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
23*b636d99dSDavid van Moolenbroek #ifndef lint
24*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-lldp.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
25*b636d99dSDavid van Moolenbroek #endif
26*b636d99dSDavid van Moolenbroek
27*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
28*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
29*b636d99dSDavid van Moolenbroek #include "config.h"
30*b636d99dSDavid van Moolenbroek #endif
31*b636d99dSDavid van Moolenbroek
32*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
33*b636d99dSDavid van Moolenbroek
34*b636d99dSDavid van Moolenbroek #include <stdio.h>
35*b636d99dSDavid van Moolenbroek
36*b636d99dSDavid van Moolenbroek #include "interface.h"
37*b636d99dSDavid van Moolenbroek #include "extract.h"
38*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
39*b636d99dSDavid van Moolenbroek #include "af.h"
40*b636d99dSDavid van Moolenbroek #include "oui.h"
41*b636d99dSDavid van Moolenbroek
42*b636d99dSDavid van Moolenbroek #define LLDP_EXTRACT_TYPE(x) (((x)&0xfe00)>>9)
43*b636d99dSDavid van Moolenbroek #define LLDP_EXTRACT_LEN(x) ((x)&0x01ff)
44*b636d99dSDavid van Moolenbroek
45*b636d99dSDavid van Moolenbroek /*
46*b636d99dSDavid van Moolenbroek * TLV type codes
47*b636d99dSDavid van Moolenbroek */
48*b636d99dSDavid van Moolenbroek #define LLDP_END_TLV 0
49*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_ID_TLV 1
50*b636d99dSDavid van Moolenbroek #define LLDP_PORT_ID_TLV 2
51*b636d99dSDavid van Moolenbroek #define LLDP_TTL_TLV 3
52*b636d99dSDavid van Moolenbroek #define LLDP_PORT_DESCR_TLV 4
53*b636d99dSDavid van Moolenbroek #define LLDP_SYSTEM_NAME_TLV 5
54*b636d99dSDavid van Moolenbroek #define LLDP_SYSTEM_DESCR_TLV 6
55*b636d99dSDavid van Moolenbroek #define LLDP_SYSTEM_CAP_TLV 7
56*b636d99dSDavid van Moolenbroek #define LLDP_MGMT_ADDR_TLV 8
57*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TLV 127
58*b636d99dSDavid van Moolenbroek
59*b636d99dSDavid van Moolenbroek static const struct tok lldp_tlv_values[] = {
60*b636d99dSDavid van Moolenbroek { LLDP_END_TLV, "End" },
61*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_ID_TLV, "Chassis ID" },
62*b636d99dSDavid van Moolenbroek { LLDP_PORT_ID_TLV, "Port ID" },
63*b636d99dSDavid van Moolenbroek { LLDP_TTL_TLV, "Time to Live" },
64*b636d99dSDavid van Moolenbroek { LLDP_PORT_DESCR_TLV, "Port Description" },
65*b636d99dSDavid van Moolenbroek { LLDP_SYSTEM_NAME_TLV, "System Name" },
66*b636d99dSDavid van Moolenbroek { LLDP_SYSTEM_DESCR_TLV, "System Description" },
67*b636d99dSDavid van Moolenbroek { LLDP_SYSTEM_CAP_TLV, "System Capabilities" },
68*b636d99dSDavid van Moolenbroek { LLDP_MGMT_ADDR_TLV, "Management Address" },
69*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TLV, "Organization specific" },
70*b636d99dSDavid van Moolenbroek { 0, NULL}
71*b636d99dSDavid van Moolenbroek };
72*b636d99dSDavid van Moolenbroek
73*b636d99dSDavid van Moolenbroek /*
74*b636d99dSDavid van Moolenbroek * Chassis ID subtypes
75*b636d99dSDavid van Moolenbroek */
76*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE 1
77*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_INTF_ALIAS_SUBTYPE 2
78*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_PORT_COMP_SUBTYPE 3
79*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_MAC_ADDR_SUBTYPE 4
80*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE 5
81*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_INTF_NAME_SUBTYPE 6
82*b636d99dSDavid van Moolenbroek #define LLDP_CHASSIS_LOCAL_SUBTYPE 7
83*b636d99dSDavid van Moolenbroek
84*b636d99dSDavid van Moolenbroek static const struct tok lldp_chassis_subtype_values[] = {
85*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE, "Chassis component"},
86*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_INTF_ALIAS_SUBTYPE, "Interface alias"},
87*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_PORT_COMP_SUBTYPE, "Port component"},
88*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_MAC_ADDR_SUBTYPE, "MAC address"},
89*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE, "Network address"},
90*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_INTF_NAME_SUBTYPE, "Interface name"},
91*b636d99dSDavid van Moolenbroek { LLDP_CHASSIS_LOCAL_SUBTYPE, "Local"},
92*b636d99dSDavid van Moolenbroek { 0, NULL}
93*b636d99dSDavid van Moolenbroek };
94*b636d99dSDavid van Moolenbroek
95*b636d99dSDavid van Moolenbroek /*
96*b636d99dSDavid van Moolenbroek * Port ID subtypes
97*b636d99dSDavid van Moolenbroek */
98*b636d99dSDavid van Moolenbroek #define LLDP_PORT_INTF_ALIAS_SUBTYPE 1
99*b636d99dSDavid van Moolenbroek #define LLDP_PORT_PORT_COMP_SUBTYPE 2
100*b636d99dSDavid van Moolenbroek #define LLDP_PORT_MAC_ADDR_SUBTYPE 3
101*b636d99dSDavid van Moolenbroek #define LLDP_PORT_NETWORK_ADDR_SUBTYPE 4
102*b636d99dSDavid van Moolenbroek #define LLDP_PORT_INTF_NAME_SUBTYPE 5
103*b636d99dSDavid van Moolenbroek #define LLDP_PORT_AGENT_CIRC_ID_SUBTYPE 6
104*b636d99dSDavid van Moolenbroek #define LLDP_PORT_LOCAL_SUBTYPE 7
105*b636d99dSDavid van Moolenbroek
106*b636d99dSDavid van Moolenbroek static const struct tok lldp_port_subtype_values[] = {
107*b636d99dSDavid van Moolenbroek { LLDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
108*b636d99dSDavid van Moolenbroek { LLDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
109*b636d99dSDavid van Moolenbroek { LLDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
110*b636d99dSDavid van Moolenbroek { LLDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
111*b636d99dSDavid van Moolenbroek { LLDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
112*b636d99dSDavid van Moolenbroek { LLDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
113*b636d99dSDavid van Moolenbroek { LLDP_PORT_LOCAL_SUBTYPE, "Local"},
114*b636d99dSDavid van Moolenbroek { 0, NULL}
115*b636d99dSDavid van Moolenbroek };
116*b636d99dSDavid van Moolenbroek
117*b636d99dSDavid van Moolenbroek /*
118*b636d99dSDavid van Moolenbroek * System Capabilities
119*b636d99dSDavid van Moolenbroek */
120*b636d99dSDavid van Moolenbroek #define LLDP_CAP_OTHER (1 << 0)
121*b636d99dSDavid van Moolenbroek #define LLDP_CAP_REPEATER (1 << 1)
122*b636d99dSDavid van Moolenbroek #define LLDP_CAP_BRIDGE (1 << 2)
123*b636d99dSDavid van Moolenbroek #define LLDP_CAP_WLAN_AP (1 << 3)
124*b636d99dSDavid van Moolenbroek #define LLDP_CAP_ROUTER (1 << 4)
125*b636d99dSDavid van Moolenbroek #define LLDP_CAP_PHONE (1 << 5)
126*b636d99dSDavid van Moolenbroek #define LLDP_CAP_DOCSIS (1 << 6)
127*b636d99dSDavid van Moolenbroek #define LLDP_CAP_STATION_ONLY (1 << 7)
128*b636d99dSDavid van Moolenbroek
129*b636d99dSDavid van Moolenbroek static const struct tok lldp_cap_values[] = {
130*b636d99dSDavid van Moolenbroek { LLDP_CAP_OTHER, "Other"},
131*b636d99dSDavid van Moolenbroek { LLDP_CAP_REPEATER, "Repeater"},
132*b636d99dSDavid van Moolenbroek { LLDP_CAP_BRIDGE, "Bridge"},
133*b636d99dSDavid van Moolenbroek { LLDP_CAP_WLAN_AP, "WLAN AP"},
134*b636d99dSDavid van Moolenbroek { LLDP_CAP_ROUTER, "Router"},
135*b636d99dSDavid van Moolenbroek { LLDP_CAP_PHONE, "Telephone"},
136*b636d99dSDavid van Moolenbroek { LLDP_CAP_DOCSIS, "Docsis"},
137*b636d99dSDavid van Moolenbroek { LLDP_CAP_STATION_ONLY, "Station Only"},
138*b636d99dSDavid van Moolenbroek { 0, NULL}
139*b636d99dSDavid van Moolenbroek };
140*b636d99dSDavid van Moolenbroek
141*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID 1
142*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID 2
143*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME 3
144*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY 4
145*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION 8
146*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION 9
147*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION 10
148*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION 11
149*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY 12
150*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_EVB 13
151*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_CDCP 14
152*b636d99dSDavid van Moolenbroek
153*b636d99dSDavid van Moolenbroek static const struct tok lldp_8021_subtype_values[] = {
154*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID, "Port VLAN Id"},
155*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID, "Port and Protocol VLAN ID"},
156*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME, "VLAN name"},
157*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY, "Protocol Identity"},
158*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION, "Congestion Notification"},
159*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION, "ETS Configuration"},
160*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION, "ETS Recommendation"},
161*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION, "Priority Flow Control Configuration"},
162*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY, "Application Priority"},
163*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_EVB, "EVB"},
164*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8021_SUBTYPE_CDCP,"CDCP"},
165*b636d99dSDavid van Moolenbroek { 0, NULL}
166*b636d99dSDavid van Moolenbroek };
167*b636d99dSDavid van Moolenbroek
168*b636d99dSDavid van Moolenbroek #define LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT (1 << 1)
169*b636d99dSDavid van Moolenbroek #define LLDP_8021_PORT_PROTOCOL_VLAN_STATUS (1 << 2)
170*b636d99dSDavid van Moolenbroek
171*b636d99dSDavid van Moolenbroek static const struct tok lldp_8021_port_protocol_id_values[] = {
172*b636d99dSDavid van Moolenbroek { LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT, "supported"},
173*b636d99dSDavid van Moolenbroek { LLDP_8021_PORT_PROTOCOL_VLAN_STATUS, "enabled"},
174*b636d99dSDavid van Moolenbroek { 0, NULL}
175*b636d99dSDavid van Moolenbroek };
176*b636d99dSDavid van Moolenbroek
177*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8023_SUBTYPE_MACPHY 1
178*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER 2
179*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR 3
180*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8023_SUBTYPE_MTU 4
181*b636d99dSDavid van Moolenbroek
182*b636d99dSDavid van Moolenbroek static const struct tok lldp_8023_subtype_values[] = {
183*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8023_SUBTYPE_MACPHY, "MAC/PHY configuration/status"},
184*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER, "Power via MDI"},
185*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR, "Link aggregation"},
186*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_8023_SUBTYPE_MTU, "Max frame size"},
187*b636d99dSDavid van Moolenbroek { 0, NULL}
188*b636d99dSDavid van Moolenbroek };
189*b636d99dSDavid van Moolenbroek
190*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES 1
191*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY 2
192*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID 3
193*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI 4
194*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV 5
195*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV 6
196*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV 7
197*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER 8
198*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME 9
199*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME 10
200*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID 11
201*b636d99dSDavid van Moolenbroek
202*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_subtype_values[] = {
203*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES, "LLDP-MED Capabilities" },
204*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY, "Network policy" },
205*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID, "Location identification" },
206*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI, "Extended power-via-MDI" },
207*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Inventory - hardware revision" },
208*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Inventory - firmware revision" },
209*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Inventory - software revision" },
210*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Inventory - serial number" },
211*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Inventory - manufacturer name" },
212*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Inventory - model name" },
213*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Inventory - asset ID" },
214*b636d99dSDavid van Moolenbroek { 0, NULL}
215*b636d99dSDavid van Moolenbroek };
216*b636d99dSDavid van Moolenbroek
217*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS 1
218*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS 2
219*b636d99dSDavid van Moolenbroek
220*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_location_altitude_type_values[] = {
221*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_METERS, "meters"},
222*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_ALTITUDE_FLOORS, "floors"},
223*b636d99dSDavid van Moolenbroek { 0, NULL}
224*b636d99dSDavid van Moolenbroek };
225*b636d99dSDavid van Moolenbroek
226*b636d99dSDavid van Moolenbroek /* ANSI/TIA-1057 - Annex B */
227*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1 1
228*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2 2
229*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3 3
230*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4 4
231*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5 5
232*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6 6
233*b636d99dSDavid van Moolenbroek
234*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_location_lci_catype_values[] = {
235*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A1, "national subdivisions (state,canton,region,province,prefecture)"},
236*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A2, "county, parish, gun, district"},
237*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A3, "city, township, shi"},
238*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A4, "city division, borough, city district, ward chou"},
239*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A5, "neighborhood, block"},
240*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_LOCATION_LCI_CATYPE_A6, "street"},
241*b636d99dSDavid van Moolenbroek { 0, NULL}
242*b636d99dSDavid van Moolenbroek };
243*b636d99dSDavid van Moolenbroek
244*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_location_lci_what_values[] = {
245*b636d99dSDavid van Moolenbroek { 0, "location of DHCP server"},
246*b636d99dSDavid van Moolenbroek { 1, "location of the network element believed to be closest to the client"},
247*b636d99dSDavid van Moolenbroek { 2, "location of the client"},
248*b636d99dSDavid van Moolenbroek { 0, NULL}
249*b636d99dSDavid van Moolenbroek };
250*b636d99dSDavid van Moolenbroek
251*b636d99dSDavid van Moolenbroek /*
252*b636d99dSDavid van Moolenbroek * From RFC 3636 - dot3MauType
253*b636d99dSDavid van Moolenbroek */
254*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_UNKNOWN 0
255*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_AUI 1
256*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_5 2
257*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_FOIRL 3
258*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_2 4
259*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_T 5
260*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_FP 6
261*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_FB 7
262*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_FL 8
263*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BROAD36 9
264*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_T_HD 10
265*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_T_FD 11
266*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_FL_HD 12
267*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10BASE_FL_FD 13
268*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_T4 14
269*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_TX_HD 15
270*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_TX_FD 16
271*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_FX_HD 17
272*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_FX_FD 18
273*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_T2_HD 19
274*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_100BASE_T2_FD 20
275*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_X_HD 21
276*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_X_FD 22
277*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_LX_HD 23
278*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_LX_FD 24
279*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_SX_HD 25
280*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_SX_FD 26
281*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_CX_HD 27
282*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_CX_FD 28
283*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_T_HD 29
284*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_1000BASE_T_FD 30
285*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_X 31
286*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_LX4 32
287*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_R 33
288*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_ER 34
289*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_LR 35
290*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_SR 36
291*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_W 37
292*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_EW 38
293*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_LW 39
294*b636d99dSDavid van Moolenbroek #define LLDP_MAU_TYPE_10GBASE_SW 40
295*b636d99dSDavid van Moolenbroek
296*b636d99dSDavid van Moolenbroek static const struct tok lldp_mau_types_values[] = {
297*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_UNKNOWN, "Unknown"},
298*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_AUI, "AUI"},
299*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_5, "10BASE_5"},
300*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_FOIRL, "FOIRL"},
301*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_2, "10BASE2"},
302*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_T, "10BASET duplex mode unknown"},
303*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_FP, "10BASEFP"},
304*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_FB, "10BASEFB"},
305*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_FL, "10BASEFL duplex mode unknown"},
306*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BROAD36, "10BROAD36"},
307*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_T_HD, "10BASET hdx"},
308*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_T_FD, "10BASET fdx"},
309*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_FL_HD, "10BASEFL hdx"},
310*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10BASE_FL_FD, "10BASEFL fdx"},
311*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_T4, "100BASET4"},
312*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_TX_HD, "100BASETX hdx"},
313*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_TX_FD, "100BASETX fdx"},
314*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_FX_HD, "100BASEFX hdx"},
315*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_FX_FD, "100BASEFX fdx"},
316*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_T2_HD, "100BASET2 hdx"},
317*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_100BASE_T2_FD, "100BASET2 fdx"},
318*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_X_HD, "1000BASEX hdx"},
319*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_X_FD, "1000BASEX fdx"},
320*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_LX_HD, "1000BASELX hdx"},
321*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_LX_FD, "1000BASELX fdx"},
322*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_SX_HD, "1000BASESX hdx"},
323*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_SX_FD, "1000BASESX fdx"},
324*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_CX_HD, "1000BASECX hdx"},
325*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_CX_FD, "1000BASECX fdx"},
326*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_T_HD, "1000BASET hdx"},
327*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_1000BASE_T_FD, "1000BASET fdx"},
328*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_X, "10GBASEX"},
329*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_LX4, "10GBASELX4"},
330*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_R, "10GBASER"},
331*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_ER, "10GBASEER"},
332*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_LR, "10GBASELR"},
333*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_SR, "10GBASESR"},
334*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_W, "10GBASEW"},
335*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_EW, "10GBASEEW"},
336*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_LW, "10GBASELW"},
337*b636d99dSDavid van Moolenbroek { LLDP_MAU_TYPE_10GBASE_SW, "10GBASESW"},
338*b636d99dSDavid van Moolenbroek { 0, NULL}
339*b636d99dSDavid van Moolenbroek };
340*b636d99dSDavid van Moolenbroek
341*b636d99dSDavid van Moolenbroek #define LLDP_8023_AUTONEGOTIATION_SUPPORT (1 << 0)
342*b636d99dSDavid van Moolenbroek #define LLDP_8023_AUTONEGOTIATION_STATUS (1 << 1)
343*b636d99dSDavid van Moolenbroek
344*b636d99dSDavid van Moolenbroek static const struct tok lldp_8023_autonegotiation_values[] = {
345*b636d99dSDavid van Moolenbroek { LLDP_8023_AUTONEGOTIATION_SUPPORT, "supported"},
346*b636d99dSDavid van Moolenbroek { LLDP_8023_AUTONEGOTIATION_STATUS, "enabled"},
347*b636d99dSDavid van Moolenbroek { 0, NULL}
348*b636d99dSDavid van Moolenbroek };
349*b636d99dSDavid van Moolenbroek
350*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_MED (1 << 0)
351*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_NETWORK_POLICY (1 << 1)
352*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION (1 << 2)
353*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE (1 << 3)
354*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD (1 << 4)
355*b636d99dSDavid van Moolenbroek #define LLDP_TIA_CAPABILITY_INVENTORY (1 << 5)
356*b636d99dSDavid van Moolenbroek
357*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_capabilities_values[] = {
358*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_MED, "LLDP-MED capabilities"},
359*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_NETWORK_POLICY, "network policy"},
360*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_LOCATION_IDENTIFICATION, "location identification"},
361*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PSE, "extended power via MDI-PSE"},
362*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_EXTENDED_POWER_MDI_PD, "extended power via MDI-PD"},
363*b636d99dSDavid van Moolenbroek { LLDP_TIA_CAPABILITY_INVENTORY, "Inventory"},
364*b636d99dSDavid van Moolenbroek { 0, NULL}
365*b636d99dSDavid van Moolenbroek };
366*b636d99dSDavid van Moolenbroek
367*b636d99dSDavid van Moolenbroek #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1 1
368*b636d99dSDavid van Moolenbroek #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2 2
369*b636d99dSDavid van Moolenbroek #define LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3 3
370*b636d99dSDavid van Moolenbroek #define LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY 4
371*b636d99dSDavid van Moolenbroek
372*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_device_type_values[] = {
373*b636d99dSDavid van Moolenbroek { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_1, "endpoint class 1"},
374*b636d99dSDavid van Moolenbroek { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_2, "endpoint class 2"},
375*b636d99dSDavid van Moolenbroek { LLDP_TIA_DEVICE_TYPE_ENDPOINT_CLASS_3, "endpoint class 3"},
376*b636d99dSDavid van Moolenbroek { LLDP_TIA_DEVICE_TYPE_NETWORK_CONNECTIVITY, "network connectivity"},
377*b636d99dSDavid van Moolenbroek { 0, NULL}
378*b636d99dSDavid van Moolenbroek };
379*b636d99dSDavid van Moolenbroek
380*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_VOICE 1
381*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING 2
382*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE 3
383*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING 4
384*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE 5
385*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING 6
386*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO 7
387*b636d99dSDavid van Moolenbroek #define LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING 8
388*b636d99dSDavid van Moolenbroek
389*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_application_type_values[] = {
390*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_VOICE, "voice"},
391*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_VOICE_SIGNALING, "voice signaling"},
392*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE, "guest voice"},
393*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_GUEST_VOICE_SIGNALING, "guest voice signaling"},
394*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_SOFTPHONE_VOICE, "softphone voice"},
395*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_VIDEO_CONFERENCING, "video conferencing"},
396*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_STREAMING_VIDEO, "streaming video"},
397*b636d99dSDavid van Moolenbroek { LLDP_TIA_APPLICATION_TYPE_VIDEO_SIGNALING, "video signaling"},
398*b636d99dSDavid van Moolenbroek { 0, NULL}
399*b636d99dSDavid van Moolenbroek };
400*b636d99dSDavid van Moolenbroek
401*b636d99dSDavid van Moolenbroek #define LLDP_TIA_NETWORK_POLICY_X_BIT (1 << 5)
402*b636d99dSDavid van Moolenbroek #define LLDP_TIA_NETWORK_POLICY_T_BIT (1 << 6)
403*b636d99dSDavid van Moolenbroek #define LLDP_TIA_NETWORK_POLICY_U_BIT (1 << 7)
404*b636d99dSDavid van Moolenbroek
405*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_network_policy_bits_values[] = {
406*b636d99dSDavid van Moolenbroek { LLDP_TIA_NETWORK_POLICY_U_BIT, "Unknown"},
407*b636d99dSDavid van Moolenbroek { LLDP_TIA_NETWORK_POLICY_T_BIT, "Tagged"},
408*b636d99dSDavid van Moolenbroek { LLDP_TIA_NETWORK_POLICY_X_BIT, "reserved"},
409*b636d99dSDavid van Moolenbroek { 0, NULL}
410*b636d99dSDavid van Moolenbroek };
411*b636d99dSDavid van Moolenbroek
412*b636d99dSDavid van Moolenbroek #define LLDP_EXTRACT_NETWORK_POLICY_VLAN(x) (((x)&0x1ffe)>>1)
413*b636d99dSDavid van Moolenbroek #define LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(x) (((x)&0x01ff)>>6)
414*b636d99dSDavid van Moolenbroek #define LLDP_EXTRACT_NETWORK_POLICY_DSCP(x) ((x)&0x003f)
415*b636d99dSDavid van Moolenbroek
416*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED 1
417*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS 2
418*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN 3
419*b636d99dSDavid van Moolenbroek
420*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_location_data_format_values[] = {
421*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED, "coordinate-based LCI"},
422*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS, "civic address LCI"},
423*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN, "ECS ELIN"},
424*b636d99dSDavid van Moolenbroek { 0, NULL}
425*b636d99dSDavid van Moolenbroek };
426*b636d99dSDavid van Moolenbroek
427*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATUM_WGS_84 1
428*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88 2
429*b636d99dSDavid van Moolenbroek #define LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW 3
430*b636d99dSDavid van Moolenbroek
431*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_location_datum_type_values[] = {
432*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATUM_WGS_84, "World Geodesic System 1984"},
433*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATUM_NAD_83_NAVD_88, "North American Datum 1983 (NAVD88)"},
434*b636d99dSDavid van Moolenbroek { LLDP_TIA_LOCATION_DATUM_NAD_83_MLLW, "North American Datum 1983 (MLLW)"},
435*b636d99dSDavid van Moolenbroek { 0, NULL}
436*b636d99dSDavid van Moolenbroek };
437*b636d99dSDavid van Moolenbroek
438*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_SOURCE_PSE 1
439*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_SOURCE_LOCAL 2
440*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL 3
441*b636d99dSDavid van Moolenbroek
442*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_power_source_values[] = {
443*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_SOURCE_PSE, "PSE - primary power source"},
444*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_SOURCE_LOCAL, "local - backup power source"},
445*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_SOURCE_PSE_AND_LOCAL, "PSE+local - reserved"},
446*b636d99dSDavid van Moolenbroek { 0, NULL}
447*b636d99dSDavid van Moolenbroek };
448*b636d99dSDavid van Moolenbroek
449*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_PRIORITY_CRITICAL 1
450*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_PRIORITY_HIGH 2
451*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_PRIORITY_LOW 3
452*b636d99dSDavid van Moolenbroek
453*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_power_priority_values[] = {
454*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_PRIORITY_CRITICAL, "critical"},
455*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_PRIORITY_HIGH, "high"},
456*b636d99dSDavid van Moolenbroek { LLDP_TIA_POWER_PRIORITY_LOW, "low"},
457*b636d99dSDavid van Moolenbroek { 0, NULL}
458*b636d99dSDavid van Moolenbroek };
459*b636d99dSDavid van Moolenbroek
460*b636d99dSDavid van Moolenbroek #define LLDP_TIA_POWER_VAL_MAX 1024
461*b636d99dSDavid van Moolenbroek
462*b636d99dSDavid van Moolenbroek static const struct tok lldp_tia_inventory_values[] = {
463*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV, "Hardware revision" },
464*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV, "Firmware revision" },
465*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV, "Software revision" },
466*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER, "Serial number" },
467*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME, "Manufacturer name" },
468*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME, "Model name" },
469*b636d99dSDavid van Moolenbroek { LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID, "Asset ID" },
470*b636d99dSDavid van Moolenbroek { 0, NULL}
471*b636d99dSDavid van Moolenbroek };
472*b636d99dSDavid van Moolenbroek
473*b636d99dSDavid van Moolenbroek /*
474*b636d99dSDavid van Moolenbroek * From RFC 3636 - ifMauAutoNegCapAdvertisedBits
475*b636d99dSDavid van Moolenbroek */
476*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_OTHER (1 << 15)
477*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_10BASE_T (1 << 14)
478*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_10BASE_T_FD (1 << 13)
479*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_100BASE_T4 (1 << 12)
480*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_100BASE_TX (1 << 11)
481*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_100BASE_TX_FD (1 << 10)
482*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_100BASE_T2 (1 << 9)
483*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_100BASE_T2_FD (1 << 8)
484*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_FDXPAUSE (1 << 7)
485*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_FDXAPAUSE (1 << 6)
486*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_FDXSPAUSE (1 << 5)
487*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_FDXBPAUSE (1 << 4)
488*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_1000BASE_X (1 << 3)
489*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_1000BASE_X_FD (1 << 2)
490*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_1000BASE_T (1 << 1)
491*b636d99dSDavid van Moolenbroek #define LLDP_MAU_PMD_1000BASE_T_FD (1 << 0)
492*b636d99dSDavid van Moolenbroek
493*b636d99dSDavid van Moolenbroek static const struct tok lldp_pmd_capability_values[] = {
494*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_10BASE_T, "10BASE-T hdx"},
495*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_10BASE_T_FD, "10BASE-T fdx"},
496*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_100BASE_T4, "100BASE-T4"},
497*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_100BASE_TX, "100BASE-TX hdx"},
498*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_100BASE_TX_FD, "100BASE-TX fdx"},
499*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_100BASE_T2, "100BASE-T2 hdx"},
500*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_100BASE_T2_FD, "100BASE-T2 fdx"},
501*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_FDXPAUSE, "Pause for fdx links"},
502*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_FDXAPAUSE, "Asym PAUSE for fdx"},
503*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_FDXSPAUSE, "Sym PAUSE for fdx"},
504*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_FDXBPAUSE, "Asym and Sym PAUSE for fdx"},
505*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_1000BASE_X, "1000BASE-{X LX SX CX} hdx"},
506*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_1000BASE_X_FD, "1000BASE-{X LX SX CX} fdx"},
507*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_1000BASE_T, "1000BASE-T hdx"},
508*b636d99dSDavid van Moolenbroek { LLDP_MAU_PMD_1000BASE_T_FD, "1000BASE-T fdx"},
509*b636d99dSDavid van Moolenbroek { 0, NULL}
510*b636d99dSDavid van Moolenbroek };
511*b636d99dSDavid van Moolenbroek
512*b636d99dSDavid van Moolenbroek #define LLDP_MDI_PORT_CLASS (1 << 0)
513*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_SUPPORT (1 << 1)
514*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_STATE (1 << 2)
515*b636d99dSDavid van Moolenbroek #define LLDP_MDI_PAIR_CONTROL_ABILITY (1 << 3)
516*b636d99dSDavid van Moolenbroek
517*b636d99dSDavid van Moolenbroek static const struct tok lldp_mdi_values[] = {
518*b636d99dSDavid van Moolenbroek { LLDP_MDI_PORT_CLASS, "PSE"},
519*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_SUPPORT, "supported"},
520*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_STATE, "enabled"},
521*b636d99dSDavid van Moolenbroek { LLDP_MDI_PAIR_CONTROL_ABILITY, "can be controlled"},
522*b636d99dSDavid van Moolenbroek { 0, NULL}
523*b636d99dSDavid van Moolenbroek };
524*b636d99dSDavid van Moolenbroek
525*b636d99dSDavid van Moolenbroek #define LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL 1
526*b636d99dSDavid van Moolenbroek #define LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE 2
527*b636d99dSDavid van Moolenbroek
528*b636d99dSDavid van Moolenbroek static const struct tok lldp_mdi_power_pairs_values[] = {
529*b636d99dSDavid van Moolenbroek { LLDP_MDI_PSE_PORT_POWER_PAIRS_SIGNAL, "signal"},
530*b636d99dSDavid van Moolenbroek { LLDP_MDI_PSE_PORT_POWER_PAIRS_SPARE, "spare"},
531*b636d99dSDavid van Moolenbroek { 0, NULL}
532*b636d99dSDavid van Moolenbroek };
533*b636d99dSDavid van Moolenbroek
534*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_CLASS0 1
535*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_CLASS1 2
536*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_CLASS2 3
537*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_CLASS3 4
538*b636d99dSDavid van Moolenbroek #define LLDP_MDI_POWER_CLASS4 5
539*b636d99dSDavid van Moolenbroek
540*b636d99dSDavid van Moolenbroek static const struct tok lldp_mdi_power_class_values[] = {
541*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_CLASS0, "class0"},
542*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_CLASS1, "class1"},
543*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_CLASS2, "class2"},
544*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_CLASS3, "class3"},
545*b636d99dSDavid van Moolenbroek { LLDP_MDI_POWER_CLASS4, "class4"},
546*b636d99dSDavid van Moolenbroek { 0, NULL}
547*b636d99dSDavid van Moolenbroek };
548*b636d99dSDavid van Moolenbroek
549*b636d99dSDavid van Moolenbroek #define LLDP_AGGREGATION_CAPABILTIY (1 << 0)
550*b636d99dSDavid van Moolenbroek #define LLDP_AGGREGATION_STATUS (1 << 1)
551*b636d99dSDavid van Moolenbroek
552*b636d99dSDavid van Moolenbroek static const struct tok lldp_aggregation_values[] = {
553*b636d99dSDavid van Moolenbroek { LLDP_AGGREGATION_CAPABILTIY, "supported"},
554*b636d99dSDavid van Moolenbroek { LLDP_AGGREGATION_STATUS, "enabled"},
555*b636d99dSDavid van Moolenbroek { 0, NULL}
556*b636d99dSDavid van Moolenbroek };
557*b636d99dSDavid van Moolenbroek
558*b636d99dSDavid van Moolenbroek /*
559*b636d99dSDavid van Moolenbroek * DCBX protocol subtypes.
560*b636d99dSDavid van Moolenbroek */
561*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_SUBTYPE_1 1
562*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_SUBTYPE_2 2
563*b636d99dSDavid van Moolenbroek
564*b636d99dSDavid van Moolenbroek static const struct tok lldp_dcbx_subtype_values[] = {
565*b636d99dSDavid van Moolenbroek { LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" },
566*b636d99dSDavid van Moolenbroek { LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" },
567*b636d99dSDavid van Moolenbroek { 0, NULL}
568*b636d99dSDavid van Moolenbroek };
569*b636d99dSDavid van Moolenbroek
570*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_CONTROL_TLV 1
571*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_PRIORITY_GROUPS_TLV 2
572*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV 3
573*b636d99dSDavid van Moolenbroek #define LLDP_DCBX_APPLICATION_TLV 4
574*b636d99dSDavid van Moolenbroek
575*b636d99dSDavid van Moolenbroek /*
576*b636d99dSDavid van Moolenbroek * Interface numbering subtypes.
577*b636d99dSDavid van Moolenbroek */
578*b636d99dSDavid van Moolenbroek #define LLDP_INTF_NUMB_IFX_SUBTYPE 2
579*b636d99dSDavid van Moolenbroek #define LLDP_INTF_NUMB_SYSPORT_SUBTYPE 3
580*b636d99dSDavid van Moolenbroek
581*b636d99dSDavid van Moolenbroek static const struct tok lldp_intf_numb_subtype_values[] = {
582*b636d99dSDavid van Moolenbroek { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" },
583*b636d99dSDavid van Moolenbroek { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" },
584*b636d99dSDavid van Moolenbroek { 0, NULL}
585*b636d99dSDavid van Moolenbroek };
586*b636d99dSDavid van Moolenbroek
587*b636d99dSDavid van Moolenbroek #define LLDP_INTF_NUM_LEN 5
588*b636d99dSDavid van Moolenbroek
589*b636d99dSDavid van Moolenbroek #define LLDP_EVB_MODE_NOT_SUPPORTED 0
590*b636d99dSDavid van Moolenbroek #define LLDP_EVB_MODE_EVB_BRIDGE 1
591*b636d99dSDavid van Moolenbroek #define LLDP_EVB_MODE_EVB_STATION 2
592*b636d99dSDavid van Moolenbroek #define LLDP_EVB_MODE_RESERVED 3
593*b636d99dSDavid van Moolenbroek
594*b636d99dSDavid van Moolenbroek static const struct tok lldp_evb_mode_values[]={
595*b636d99dSDavid van Moolenbroek { LLDP_EVB_MODE_NOT_SUPPORTED, "Not Supported"},
596*b636d99dSDavid van Moolenbroek { LLDP_EVB_MODE_EVB_BRIDGE, "EVB Bridge"},
597*b636d99dSDavid van Moolenbroek { LLDP_EVB_MODE_EVB_STATION, "EVB Staion"},
598*b636d99dSDavid van Moolenbroek { LLDP_EVB_MODE_RESERVED, "Reserved for future Standardization"},
599*b636d99dSDavid van Moolenbroek };
600*b636d99dSDavid van Moolenbroek
601*b636d99dSDavid van Moolenbroek #define NO_OF_BITS 8
602*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH 6
603*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH 25
604*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH 25
605*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH 6
606*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH 5
607*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH 9
608*b636d99dSDavid van Moolenbroek #define LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH 8
609*b636d99dSDavid van Moolenbroek
610*b636d99dSDavid van Moolenbroek static void
print_ets_priority_assignment_table(netdissect_options * ndo,const u_char * ptr)611*b636d99dSDavid van Moolenbroek print_ets_priority_assignment_table(netdissect_options *ndo,
612*b636d99dSDavid van Moolenbroek const u_char *ptr)
613*b636d99dSDavid van Moolenbroek {
614*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority Assignment Table"));
615*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
616*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
617*b636d99dSDavid van Moolenbroek ptr[0]>>4,ptr[0]&0x0f,ptr[1]>>4,ptr[1]&0x0f,ptr[2]>>4,
618*b636d99dSDavid van Moolenbroek ptr[2] & 0x0f, ptr[3] >> 4, ptr[3] & 0x0f));
619*b636d99dSDavid van Moolenbroek }
620*b636d99dSDavid van Moolenbroek
621*b636d99dSDavid van Moolenbroek static void
print_tc_bandwidth_table(netdissect_options * ndo,const u_char * ptr)622*b636d99dSDavid van Moolenbroek print_tc_bandwidth_table(netdissect_options *ndo,
623*b636d99dSDavid van Moolenbroek const u_char *ptr)
624*b636d99dSDavid van Moolenbroek {
625*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t TC Bandwidth Table"));
626*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t TC%% : 0 1 2 3 4 5 6 7"));
627*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
628*b636d99dSDavid van Moolenbroek ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]));
629*b636d99dSDavid van Moolenbroek }
630*b636d99dSDavid van Moolenbroek
631*b636d99dSDavid van Moolenbroek static void
print_tsa_assignment_table(netdissect_options * ndo,const u_char * ptr)632*b636d99dSDavid van Moolenbroek print_tsa_assignment_table(netdissect_options *ndo,
633*b636d99dSDavid van Moolenbroek const u_char *ptr)
634*b636d99dSDavid van Moolenbroek {
635*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t TSA Assignment Table"));
636*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Traffic Class: 0 1 2 3 4 5 6 7"));
637*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : %-3d %-3d %-3d %-3d %-3d %-3d %-3d %-3d",
638*b636d99dSDavid van Moolenbroek ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]));
639*b636d99dSDavid van Moolenbroek }
640*b636d99dSDavid van Moolenbroek
641*b636d99dSDavid van Moolenbroek /*
642*b636d99dSDavid van Moolenbroek * Print IEEE 802.1 private extensions. (802.1AB annex E)
643*b636d99dSDavid van Moolenbroek */
644*b636d99dSDavid van Moolenbroek static int
lldp_private_8021_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)645*b636d99dSDavid van Moolenbroek lldp_private_8021_print(netdissect_options *ndo,
646*b636d99dSDavid van Moolenbroek const u_char *tptr, u_int tlv_len)
647*b636d99dSDavid van Moolenbroek {
648*b636d99dSDavid van Moolenbroek int subtype, hexdump = FALSE;
649*b636d99dSDavid van Moolenbroek u_int sublen;
650*b636d99dSDavid van Moolenbroek u_int tval;
651*b636d99dSDavid van Moolenbroek uint8_t i;
652*b636d99dSDavid van Moolenbroek
653*b636d99dSDavid van Moolenbroek if (tlv_len < 4) {
654*b636d99dSDavid van Moolenbroek return hexdump;
655*b636d99dSDavid van Moolenbroek }
656*b636d99dSDavid van Moolenbroek subtype = *(tptr+3);
657*b636d99dSDavid van Moolenbroek
658*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Subtype (%u)",
659*b636d99dSDavid van Moolenbroek tok2str(lldp_8021_subtype_values, "unknown", subtype),
660*b636d99dSDavid van Moolenbroek subtype));
661*b636d99dSDavid van Moolenbroek
662*b636d99dSDavid van Moolenbroek switch (subtype) {
663*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
664*b636d99dSDavid van Moolenbroek if (tlv_len < 6) {
665*b636d99dSDavid van Moolenbroek return hexdump;
666*b636d99dSDavid van Moolenbroek }
667*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t port vlan id (PVID): %u",
668*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(tptr + 4)));
669*b636d99dSDavid van Moolenbroek break;
670*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID:
671*b636d99dSDavid van Moolenbroek if (tlv_len < 7) {
672*b636d99dSDavid van Moolenbroek return hexdump;
673*b636d99dSDavid van Moolenbroek }
674*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)",
675*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(tptr+5),
676*b636d99dSDavid van Moolenbroek bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)),
677*b636d99dSDavid van Moolenbroek *(tptr + 4)));
678*b636d99dSDavid van Moolenbroek break;
679*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME:
680*b636d99dSDavid van Moolenbroek if (tlv_len < 6) {
681*b636d99dSDavid van Moolenbroek return hexdump;
682*b636d99dSDavid van Moolenbroek }
683*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t vlan id (VID): %u", EXTRACT_16BITS(tptr + 4)));
684*b636d99dSDavid van Moolenbroek if (tlv_len < 7) {
685*b636d99dSDavid van Moolenbroek return hexdump;
686*b636d99dSDavid van Moolenbroek }
687*b636d99dSDavid van Moolenbroek sublen = *(tptr+6);
688*b636d99dSDavid van Moolenbroek if (tlv_len < 7+sublen) {
689*b636d99dSDavid van Moolenbroek return hexdump;
690*b636d99dSDavid van Moolenbroek }
691*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t vlan name: "));
692*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 7, sublen);
693*b636d99dSDavid van Moolenbroek break;
694*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY:
695*b636d99dSDavid van Moolenbroek if (tlv_len < 5) {
696*b636d99dSDavid van Moolenbroek return hexdump;
697*b636d99dSDavid van Moolenbroek }
698*b636d99dSDavid van Moolenbroek sublen = *(tptr+4);
699*b636d99dSDavid van Moolenbroek if (tlv_len < 5+sublen) {
700*b636d99dSDavid van Moolenbroek return hexdump;
701*b636d99dSDavid van Moolenbroek }
702*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t protocol identity: "));
703*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 5, sublen);
704*b636d99dSDavid van Moolenbroek break;
705*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION:
706*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CONGESTION_NOTIFICATION_LENGTH){
707*b636d99dSDavid van Moolenbroek return hexdump;
708*b636d99dSDavid van Moolenbroek }
709*b636d99dSDavid van Moolenbroek tval=*(tptr+4);
710*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Pre-Priority CNPV Indicator"));
711*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
712*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : "));
713*b636d99dSDavid van Moolenbroek for(i=0;i<NO_OF_BITS;i++)
714*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
715*b636d99dSDavid van Moolenbroek tval=*(tptr+5);
716*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Pre-Priority Ready Indicator"));
717*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
718*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : "));
719*b636d99dSDavid van Moolenbroek for(i=0;i<NO_OF_BITS;i++)
720*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
721*b636d99dSDavid van Moolenbroek break;
722*b636d99dSDavid van Moolenbroek
723*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION:
724*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_CONFIGURATION_LENGTH) {
725*b636d99dSDavid van Moolenbroek return hexdump;
726*b636d99dSDavid van Moolenbroek }
727*b636d99dSDavid van Moolenbroek tval=*(tptr+4);
728*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Willing:%d, CBS:%d, RES:%d, Max TCs:%d",
729*b636d99dSDavid van Moolenbroek tval >> 7, (tval >> 6) & 0x02, (tval >> 3) & 0x07, tval & 0x07));
730*b636d99dSDavid van Moolenbroek
731*b636d99dSDavid van Moolenbroek /*Print Priority Assignment Table*/
732*b636d99dSDavid van Moolenbroek print_ets_priority_assignment_table(ndo, tptr + 5);
733*b636d99dSDavid van Moolenbroek
734*b636d99dSDavid van Moolenbroek /*Print TC Bandwidth Table*/
735*b636d99dSDavid van Moolenbroek print_tc_bandwidth_table(ndo, tptr + 9);
736*b636d99dSDavid van Moolenbroek
737*b636d99dSDavid van Moolenbroek /* Print TSA Assignment Table */
738*b636d99dSDavid van Moolenbroek print_tsa_assignment_table(ndo, tptr + 17);
739*b636d99dSDavid van Moolenbroek
740*b636d99dSDavid van Moolenbroek break;
741*b636d99dSDavid van Moolenbroek
742*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION:
743*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_ETS_RECOMMENDATION_LENGTH) {
744*b636d99dSDavid van Moolenbroek return hexdump;
745*b636d99dSDavid van Moolenbroek }
746*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t RES: %d", *(tptr + 4)));
747*b636d99dSDavid van Moolenbroek /*Print Priority Assignment Table */
748*b636d99dSDavid van Moolenbroek print_ets_priority_assignment_table(ndo, tptr + 5);
749*b636d99dSDavid van Moolenbroek /*Print TC Bandwidth Table */
750*b636d99dSDavid van Moolenbroek print_tc_bandwidth_table(ndo, tptr + 9);
751*b636d99dSDavid van Moolenbroek /* Print TSA Assignment Table */
752*b636d99dSDavid van Moolenbroek print_tsa_assignment_table(ndo, tptr + 17);
753*b636d99dSDavid van Moolenbroek break;
754*b636d99dSDavid van Moolenbroek
755*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION:
756*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_PFC_CONFIGURATION_LENGTH) {
757*b636d99dSDavid van Moolenbroek return hexdump;
758*b636d99dSDavid van Moolenbroek }
759*b636d99dSDavid van Moolenbroek tval=*(tptr+4);
760*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Willing: %d, MBC: %d, RES: %d, PFC cap:%d ",
761*b636d99dSDavid van Moolenbroek tval >> 7, (tval >> 6) & 0x01, (tval >> 4) & 0x03, (tval & 0x0f)));
762*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t PFC Enable"));
763*b636d99dSDavid van Moolenbroek tval=*(tptr+5);
764*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority : 0 1 2 3 4 5 6 7"));
765*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Value : "));
766*b636d99dSDavid van Moolenbroek for(i=0;i<NO_OF_BITS;i++)
767*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%-2d ", (tval >> i) & 0x01));
768*b636d99dSDavid van Moolenbroek break;
769*b636d99dSDavid van Moolenbroek
770*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY:
771*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH) {
772*b636d99dSDavid van Moolenbroek return hexdump;
773*b636d99dSDavid van Moolenbroek }
774*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t RES: %d", *(tptr + 4)));
775*b636d99dSDavid van Moolenbroek if(tlv_len<=LLDP_PRIVATE_8021_SUBTYPE_APPLICATION_PRIORITY_MIN_LENGTH){
776*b636d99dSDavid van Moolenbroek return hexdump;
777*b636d99dSDavid van Moolenbroek }
778*b636d99dSDavid van Moolenbroek /* Length of Application Priority Table */
779*b636d99dSDavid van Moolenbroek sublen=tlv_len-5;
780*b636d99dSDavid van Moolenbroek if(sublen%3!=0){
781*b636d99dSDavid van Moolenbroek return hexdump;
782*b636d99dSDavid van Moolenbroek }
783*b636d99dSDavid van Moolenbroek i=0;
784*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Application Priority Table"));
785*b636d99dSDavid van Moolenbroek while(i<sublen) {
786*b636d99dSDavid van Moolenbroek tval=*(tptr+i+5);
787*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority: %d, RES: %d, Sel: %d",
788*b636d99dSDavid van Moolenbroek tval >> 5, (tval >> 3) & 0x03, (tval & 0x07)));
789*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Protocol ID: %d", EXTRACT_16BITS(tptr + i + 5)));
790*b636d99dSDavid van Moolenbroek i=i+3;
791*b636d99dSDavid van Moolenbroek }
792*b636d99dSDavid van Moolenbroek break;
793*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_EVB:
794*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH){
795*b636d99dSDavid van Moolenbroek return hexdump;
796*b636d99dSDavid van Moolenbroek }
797*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t EVB Bridge Status"));
798*b636d99dSDavid van Moolenbroek tval=*(tptr+4);
799*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t RES: %d, BGID: %d, RRCAP: %d, RRCTR: %d",
800*b636d99dSDavid van Moolenbroek tval >> 3, (tval >> 2) & 0x01, (tval >> 1) & 0x01, tval & 0x01));
801*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t EVB Station Status"));
802*b636d99dSDavid van Moolenbroek tval=*(tptr+5);
803*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t RES: %d, SGID: %d, RRREQ: %d,RRSTAT: %d",
804*b636d99dSDavid van Moolenbroek tval >> 4, (tval >> 3) & 0x01, (tval >> 2) & 0x01, tval & 0x03));
805*b636d99dSDavid van Moolenbroek tval=*(tptr+6);
806*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t R: %d, RTE: %d, ",tval >> 5, tval & 0x1f));
807*b636d99dSDavid van Moolenbroek tval=*(tptr+7);
808*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "EVB Mode: %s [%d]",
809*b636d99dSDavid van Moolenbroek tok2str(lldp_evb_mode_values, "unknown", tval >> 6), tval >> 6));
810*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t ROL: %d, RWD: %d, ", (tval >> 5) & 0x01, tval & 0x1f));
811*b636d99dSDavid van Moolenbroek tval=*(tptr+8);
812*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "RES: %d, ROL: %d, RKA: %d", tval >> 6, (tval >> 5) & 0x01, tval & 0x1f));
813*b636d99dSDavid van Moolenbroek break;
814*b636d99dSDavid van Moolenbroek
815*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8021_SUBTYPE_CDCP:
816*b636d99dSDavid van Moolenbroek if(tlv_len<LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH){
817*b636d99dSDavid van Moolenbroek return hexdump;
818*b636d99dSDavid van Moolenbroek }
819*b636d99dSDavid van Moolenbroek tval=*(tptr+4);
820*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Role: %d, RES: %d, Scomp: %d ",
821*b636d99dSDavid van Moolenbroek tval >> 7, (tval >> 4) & 0x07, (tval >> 3) & 0x01));
822*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "ChnCap: %d", EXTRACT_16BITS(tptr + 6) & 0x0fff));
823*b636d99dSDavid van Moolenbroek sublen=tlv_len-8;
824*b636d99dSDavid van Moolenbroek if(sublen%3!=0) {
825*b636d99dSDavid van Moolenbroek return hexdump;
826*b636d99dSDavid van Moolenbroek }
827*b636d99dSDavid van Moolenbroek i=0;
828*b636d99dSDavid van Moolenbroek while(i<sublen) {
829*b636d99dSDavid van Moolenbroek tval=EXTRACT_24BITS(tptr+i+8);
830*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t SCID: %d, SVID: %d",
831*b636d99dSDavid van Moolenbroek tval >> 12, tval & 0x000fff));
832*b636d99dSDavid van Moolenbroek i=i+3;
833*b636d99dSDavid van Moolenbroek }
834*b636d99dSDavid van Moolenbroek break;
835*b636d99dSDavid van Moolenbroek
836*b636d99dSDavid van Moolenbroek default:
837*b636d99dSDavid van Moolenbroek hexdump = TRUE;
838*b636d99dSDavid van Moolenbroek break;
839*b636d99dSDavid van Moolenbroek }
840*b636d99dSDavid van Moolenbroek
841*b636d99dSDavid van Moolenbroek return hexdump;
842*b636d99dSDavid van Moolenbroek }
843*b636d99dSDavid van Moolenbroek
844*b636d99dSDavid van Moolenbroek /*
845*b636d99dSDavid van Moolenbroek * Print IEEE 802.3 private extensions. (802.3bc)
846*b636d99dSDavid van Moolenbroek */
847*b636d99dSDavid van Moolenbroek static int
lldp_private_8023_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)848*b636d99dSDavid van Moolenbroek lldp_private_8023_print(netdissect_options *ndo,
849*b636d99dSDavid van Moolenbroek const u_char *tptr, u_int tlv_len)
850*b636d99dSDavid van Moolenbroek {
851*b636d99dSDavid van Moolenbroek int subtype, hexdump = FALSE;
852*b636d99dSDavid van Moolenbroek
853*b636d99dSDavid van Moolenbroek if (tlv_len < 4) {
854*b636d99dSDavid van Moolenbroek return hexdump;
855*b636d99dSDavid van Moolenbroek }
856*b636d99dSDavid van Moolenbroek subtype = *(tptr+3);
857*b636d99dSDavid van Moolenbroek
858*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Subtype (%u)",
859*b636d99dSDavid van Moolenbroek tok2str(lldp_8023_subtype_values, "unknown", subtype),
860*b636d99dSDavid van Moolenbroek subtype));
861*b636d99dSDavid van Moolenbroek
862*b636d99dSDavid van Moolenbroek switch (subtype) {
863*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
864*b636d99dSDavid van Moolenbroek if (tlv_len < 9) {
865*b636d99dSDavid van Moolenbroek return hexdump;
866*b636d99dSDavid van Moolenbroek }
867*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t autonegotiation [%s] (0x%02x)",
868*b636d99dSDavid van Moolenbroek bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)),
869*b636d99dSDavid van Moolenbroek *(tptr + 4)));
870*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t PMD autoneg capability [%s] (0x%04x)",
871*b636d99dSDavid van Moolenbroek bittok2str(lldp_pmd_capability_values,"unknown", EXTRACT_16BITS(tptr+5)),
872*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(tptr + 5)));
873*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t MAU type %s (0x%04x)",
874*b636d99dSDavid van Moolenbroek tok2str(lldp_mau_types_values, "unknown", EXTRACT_16BITS(tptr+7)),
875*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(tptr + 7)));
876*b636d99dSDavid van Moolenbroek break;
877*b636d99dSDavid van Moolenbroek
878*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
879*b636d99dSDavid van Moolenbroek if (tlv_len < 7) {
880*b636d99dSDavid van Moolenbroek return hexdump;
881*b636d99dSDavid van Moolenbroek }
882*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t MDI power support [%s], power pair %s, power class %s",
883*b636d99dSDavid van Moolenbroek bittok2str(lldp_mdi_values, "none", *(tptr+4)),
884*b636d99dSDavid van Moolenbroek tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)),
885*b636d99dSDavid van Moolenbroek tok2str(lldp_mdi_power_class_values, "unknown", *(tptr + 6))));
886*b636d99dSDavid van Moolenbroek break;
887*b636d99dSDavid van Moolenbroek
888*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
889*b636d99dSDavid van Moolenbroek if (tlv_len < 9) {
890*b636d99dSDavid van Moolenbroek return hexdump;
891*b636d99dSDavid van Moolenbroek }
892*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t aggregation status [%s], aggregation port ID %u",
893*b636d99dSDavid van Moolenbroek bittok2str(lldp_aggregation_values, "none", *(tptr+4)),
894*b636d99dSDavid van Moolenbroek EXTRACT_32BITS(tptr + 5)));
895*b636d99dSDavid van Moolenbroek break;
896*b636d99dSDavid van Moolenbroek
897*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_8023_SUBTYPE_MTU:
898*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t MTU size %u", EXTRACT_16BITS(tptr + 4)));
899*b636d99dSDavid van Moolenbroek break;
900*b636d99dSDavid van Moolenbroek
901*b636d99dSDavid van Moolenbroek default:
902*b636d99dSDavid van Moolenbroek hexdump = TRUE;
903*b636d99dSDavid van Moolenbroek break;
904*b636d99dSDavid van Moolenbroek }
905*b636d99dSDavid van Moolenbroek
906*b636d99dSDavid van Moolenbroek return hexdump;
907*b636d99dSDavid van Moolenbroek }
908*b636d99dSDavid van Moolenbroek
909*b636d99dSDavid van Moolenbroek /*
910*b636d99dSDavid van Moolenbroek * Extract 34bits of latitude/longitude coordinates.
911*b636d99dSDavid van Moolenbroek */
912*b636d99dSDavid van Moolenbroek static uint64_t
lldp_extract_latlon(const u_char * tptr)913*b636d99dSDavid van Moolenbroek lldp_extract_latlon(const u_char *tptr)
914*b636d99dSDavid van Moolenbroek {
915*b636d99dSDavid van Moolenbroek uint64_t latlon;
916*b636d99dSDavid van Moolenbroek
917*b636d99dSDavid van Moolenbroek latlon = *tptr & 0x3;
918*b636d99dSDavid van Moolenbroek latlon = (latlon << 32) | EXTRACT_32BITS(tptr+1);
919*b636d99dSDavid van Moolenbroek
920*b636d99dSDavid van Moolenbroek return latlon;
921*b636d99dSDavid van Moolenbroek }
922*b636d99dSDavid van Moolenbroek
923*b636d99dSDavid van Moolenbroek /*
924*b636d99dSDavid van Moolenbroek * Print private TIA extensions.
925*b636d99dSDavid van Moolenbroek */
926*b636d99dSDavid van Moolenbroek static int
lldp_private_tia_print(netdissect_options * ndo,const u_char * tptr,u_int tlv_len)927*b636d99dSDavid van Moolenbroek lldp_private_tia_print(netdissect_options *ndo,
928*b636d99dSDavid van Moolenbroek const u_char *tptr, u_int tlv_len)
929*b636d99dSDavid van Moolenbroek {
930*b636d99dSDavid van Moolenbroek int subtype, hexdump = FALSE;
931*b636d99dSDavid van Moolenbroek uint8_t location_format;
932*b636d99dSDavid van Moolenbroek uint16_t power_val;
933*b636d99dSDavid van Moolenbroek u_int lci_len;
934*b636d99dSDavid van Moolenbroek uint8_t ca_type, ca_len;
935*b636d99dSDavid van Moolenbroek
936*b636d99dSDavid van Moolenbroek if (tlv_len < 4) {
937*b636d99dSDavid van Moolenbroek return hexdump;
938*b636d99dSDavid van Moolenbroek }
939*b636d99dSDavid van Moolenbroek subtype = *(tptr+3);
940*b636d99dSDavid van Moolenbroek
941*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Subtype (%u)",
942*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_subtype_values, "unknown", subtype),
943*b636d99dSDavid van Moolenbroek subtype));
944*b636d99dSDavid van Moolenbroek
945*b636d99dSDavid van Moolenbroek switch (subtype) {
946*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES:
947*b636d99dSDavid van Moolenbroek if (tlv_len < 7) {
948*b636d99dSDavid van Moolenbroek return hexdump;
949*b636d99dSDavid van Moolenbroek }
950*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Media capabilities [%s] (0x%04x)",
951*b636d99dSDavid van Moolenbroek bittok2str(lldp_tia_capabilities_values, "none",
952*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(tptr + 4)), EXTRACT_16BITS(tptr + 4)));
953*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Device type [%s] (0x%02x)",
954*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_device_type_values, "unknown", *(tptr+6)),
955*b636d99dSDavid van Moolenbroek *(tptr + 6)));
956*b636d99dSDavid van Moolenbroek break;
957*b636d99dSDavid van Moolenbroek
958*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY:
959*b636d99dSDavid van Moolenbroek if (tlv_len < 8) {
960*b636d99dSDavid van Moolenbroek return hexdump;
961*b636d99dSDavid van Moolenbroek }
962*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Application type [%s] (0x%02x)",
963*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_application_type_values, "none", *(tptr+4)),
964*b636d99dSDavid van Moolenbroek *(tptr + 4)));
965*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Flags [%s]", bittok2str(
966*b636d99dSDavid van Moolenbroek lldp_tia_network_policy_bits_values, "none", *(tptr + 5))));
967*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Vlan id %u",
968*b636d99dSDavid van Moolenbroek LLDP_EXTRACT_NETWORK_POLICY_VLAN(EXTRACT_16BITS(tptr + 5))));
969*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", L2 priority %u",
970*b636d99dSDavid van Moolenbroek LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(EXTRACT_16BITS(tptr + 6))));
971*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", DSCP value %u",
972*b636d99dSDavid van Moolenbroek LLDP_EXTRACT_NETWORK_POLICY_DSCP(EXTRACT_16BITS(tptr + 6))));
973*b636d99dSDavid van Moolenbroek break;
974*b636d99dSDavid van Moolenbroek
975*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID:
976*b636d99dSDavid van Moolenbroek if (tlv_len < 5) {
977*b636d99dSDavid van Moolenbroek return hexdump;
978*b636d99dSDavid van Moolenbroek }
979*b636d99dSDavid van Moolenbroek location_format = *(tptr+4);
980*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Location data format %s (0x%02x)",
981*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_location_data_format_values, "unknown", location_format),
982*b636d99dSDavid van Moolenbroek location_format));
983*b636d99dSDavid van Moolenbroek
984*b636d99dSDavid van Moolenbroek switch (location_format) {
985*b636d99dSDavid van Moolenbroek case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED:
986*b636d99dSDavid van Moolenbroek if (tlv_len < 21) {
987*b636d99dSDavid van Moolenbroek return hexdump;
988*b636d99dSDavid van Moolenbroek }
989*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Latitude resolution %u, latitude value %" PRIu64,
990*b636d99dSDavid van Moolenbroek (*(tptr + 5) >> 2), lldp_extract_latlon(tptr + 5)));
991*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Longitude resolution %u, longitude value %" PRIu64,
992*b636d99dSDavid van Moolenbroek (*(tptr + 10) >> 2), lldp_extract_latlon(tptr + 10)));
993*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Altitude type %s (%u)",
994*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_location_altitude_type_values, "unknown",(*(tptr+15)>>4)),
995*b636d99dSDavid van Moolenbroek (*(tptr + 15) >> 4)));
996*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Altitude resolution %u, altitude value 0x%x",
997*b636d99dSDavid van Moolenbroek (EXTRACT_16BITS(tptr+15)>>6)&0x3f,
998*b636d99dSDavid van Moolenbroek ((EXTRACT_32BITS(tptr + 16) & 0x3fffffff))));
999*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Datum %s (0x%02x)",
1000*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_location_datum_type_values, "unknown", *(tptr+20)),
1001*b636d99dSDavid van Moolenbroek *(tptr + 20)));
1002*b636d99dSDavid van Moolenbroek break;
1003*b636d99dSDavid van Moolenbroek
1004*b636d99dSDavid van Moolenbroek case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS:
1005*b636d99dSDavid van Moolenbroek if (tlv_len < 6) {
1006*b636d99dSDavid van Moolenbroek return hexdump;
1007*b636d99dSDavid van Moolenbroek }
1008*b636d99dSDavid van Moolenbroek lci_len = *(tptr+5);
1009*b636d99dSDavid van Moolenbroek if (lci_len < 3) {
1010*b636d99dSDavid van Moolenbroek return hexdump;
1011*b636d99dSDavid van Moolenbroek }
1012*b636d99dSDavid van Moolenbroek if (tlv_len < 7+lci_len) {
1013*b636d99dSDavid van Moolenbroek return hexdump;
1014*b636d99dSDavid van Moolenbroek }
1015*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t LCI length %u, LCI what %s (0x%02x), Country-code ",
1016*b636d99dSDavid van Moolenbroek lci_len,
1017*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)),
1018*b636d99dSDavid van Moolenbroek *(tptr + 6)));
1019*b636d99dSDavid van Moolenbroek
1020*b636d99dSDavid van Moolenbroek /* Country code */
1021*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 7, 2);
1022*b636d99dSDavid van Moolenbroek
1023*b636d99dSDavid van Moolenbroek lci_len = lci_len-3;
1024*b636d99dSDavid van Moolenbroek tptr = tptr + 9;
1025*b636d99dSDavid van Moolenbroek
1026*b636d99dSDavid van Moolenbroek /* Decode each civic address element */
1027*b636d99dSDavid van Moolenbroek while (lci_len > 0) {
1028*b636d99dSDavid van Moolenbroek if (lci_len < 2) {
1029*b636d99dSDavid van Moolenbroek return hexdump;
1030*b636d99dSDavid van Moolenbroek }
1031*b636d99dSDavid van Moolenbroek ca_type = *(tptr);
1032*b636d99dSDavid van Moolenbroek ca_len = *(tptr+1);
1033*b636d99dSDavid van Moolenbroek
1034*b636d99dSDavid van Moolenbroek tptr += 2;
1035*b636d99dSDavid van Moolenbroek lci_len -= 2;
1036*b636d99dSDavid van Moolenbroek
1037*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t CA type \'%s\' (%u), length %u: ",
1038*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type),
1039*b636d99dSDavid van Moolenbroek ca_type, ca_len));
1040*b636d99dSDavid van Moolenbroek
1041*b636d99dSDavid van Moolenbroek /* basic sanity check */
1042*b636d99dSDavid van Moolenbroek if ( ca_type == 0 || ca_len == 0) {
1043*b636d99dSDavid van Moolenbroek return hexdump;
1044*b636d99dSDavid van Moolenbroek }
1045*b636d99dSDavid van Moolenbroek if (lci_len < ca_len) {
1046*b636d99dSDavid van Moolenbroek return hexdump;
1047*b636d99dSDavid van Moolenbroek }
1048*b636d99dSDavid van Moolenbroek
1049*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr, ca_len);
1050*b636d99dSDavid van Moolenbroek tptr += ca_len;
1051*b636d99dSDavid van Moolenbroek lci_len -= ca_len;
1052*b636d99dSDavid van Moolenbroek }
1053*b636d99dSDavid van Moolenbroek break;
1054*b636d99dSDavid van Moolenbroek
1055*b636d99dSDavid van Moolenbroek case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN:
1056*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t ECS ELIN id "));
1057*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 5, tlv_len - 5);
1058*b636d99dSDavid van Moolenbroek break;
1059*b636d99dSDavid van Moolenbroek
1060*b636d99dSDavid van Moolenbroek default:
1061*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Location ID "));
1062*b636d99dSDavid van Moolenbroek print_unknown_data(ndo, tptr + 5, "\n\t ", tlv_len - 5);
1063*b636d99dSDavid van Moolenbroek }
1064*b636d99dSDavid van Moolenbroek break;
1065*b636d99dSDavid van Moolenbroek
1066*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI:
1067*b636d99dSDavid van Moolenbroek if (tlv_len < 7) {
1068*b636d99dSDavid van Moolenbroek return hexdump;
1069*b636d99dSDavid van Moolenbroek }
1070*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Power type [%s]",
1071*b636d99dSDavid van Moolenbroek (*(tptr + 4) & 0xC0 >> 6) ? "PD device" : "PSE device"));
1072*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Power source [%s]",
1073*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_power_source_values, "none", (*(tptr + 4) & 0x30) >> 4)));
1074*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Power priority [%s] (0x%02x)",
1075*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_power_priority_values, "none", *(tptr+4)&0x0f),
1076*b636d99dSDavid van Moolenbroek *(tptr + 4) & 0x0f));
1077*b636d99dSDavid van Moolenbroek power_val = EXTRACT_16BITS(tptr+5);
1078*b636d99dSDavid van Moolenbroek if (power_val < LLDP_TIA_POWER_VAL_MAX) {
1079*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Power %.1f Watts", ((float)power_val) / 10));
1080*b636d99dSDavid van Moolenbroek } else {
1081*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Power %u (Reserved)", power_val));
1082*b636d99dSDavid van Moolenbroek }
1083*b636d99dSDavid van Moolenbroek break;
1084*b636d99dSDavid van Moolenbroek
1085*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_HARDWARE_REV:
1086*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_FIRMWARE_REV:
1087*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SOFTWARE_REV:
1088*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_SERIAL_NUMBER:
1089*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MANUFACTURER_NAME:
1090*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_MODEL_NAME:
1091*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TIA_SUBTYPE_INVENTORY_ASSET_ID:
1092*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s ",
1093*b636d99dSDavid van Moolenbroek tok2str(lldp_tia_inventory_values, "unknown", subtype)));
1094*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 4, tlv_len - 4);
1095*b636d99dSDavid van Moolenbroek break;
1096*b636d99dSDavid van Moolenbroek
1097*b636d99dSDavid van Moolenbroek default:
1098*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1099*b636d99dSDavid van Moolenbroek break;
1100*b636d99dSDavid van Moolenbroek }
1101*b636d99dSDavid van Moolenbroek
1102*b636d99dSDavid van Moolenbroek return hexdump;
1103*b636d99dSDavid van Moolenbroek }
1104*b636d99dSDavid van Moolenbroek
1105*b636d99dSDavid van Moolenbroek /*
1106*b636d99dSDavid van Moolenbroek * Print DCBX Protocol fields (V 1.01).
1107*b636d99dSDavid van Moolenbroek */
1108*b636d99dSDavid van Moolenbroek static int
lldp_private_dcbx_print(netdissect_options * ndo,const u_char * pptr,u_int len)1109*b636d99dSDavid van Moolenbroek lldp_private_dcbx_print(netdissect_options *ndo,
1110*b636d99dSDavid van Moolenbroek const u_char *pptr, u_int len)
1111*b636d99dSDavid van Moolenbroek {
1112*b636d99dSDavid van Moolenbroek int subtype, hexdump = FALSE;
1113*b636d99dSDavid van Moolenbroek uint8_t tval;
1114*b636d99dSDavid van Moolenbroek uint16_t tlv;
1115*b636d99dSDavid van Moolenbroek uint32_t i, pgval, uval;
1116*b636d99dSDavid van Moolenbroek u_int tlen, tlv_type, tlv_len;
1117*b636d99dSDavid van Moolenbroek const u_char *tptr, *mptr;
1118*b636d99dSDavid van Moolenbroek
1119*b636d99dSDavid van Moolenbroek if (len < 4) {
1120*b636d99dSDavid van Moolenbroek return hexdump;
1121*b636d99dSDavid van Moolenbroek }
1122*b636d99dSDavid van Moolenbroek subtype = *(pptr+3);
1123*b636d99dSDavid van Moolenbroek
1124*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Subtype (%u)",
1125*b636d99dSDavid van Moolenbroek tok2str(lldp_dcbx_subtype_values, "unknown", subtype),
1126*b636d99dSDavid van Moolenbroek subtype));
1127*b636d99dSDavid van Moolenbroek
1128*b636d99dSDavid van Moolenbroek /* by passing old version */
1129*b636d99dSDavid van Moolenbroek if (subtype == LLDP_DCBX_SUBTYPE_1)
1130*b636d99dSDavid van Moolenbroek return TRUE;
1131*b636d99dSDavid van Moolenbroek
1132*b636d99dSDavid van Moolenbroek tptr = pptr + 4;
1133*b636d99dSDavid van Moolenbroek tlen = len - 4;
1134*b636d99dSDavid van Moolenbroek
1135*b636d99dSDavid van Moolenbroek while (tlen >= sizeof(tlv)) {
1136*b636d99dSDavid van Moolenbroek
1137*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, sizeof(tlv));
1138*b636d99dSDavid van Moolenbroek
1139*b636d99dSDavid van Moolenbroek tlv = EXTRACT_16BITS(tptr);
1140*b636d99dSDavid van Moolenbroek
1141*b636d99dSDavid van Moolenbroek tlv_type = LLDP_EXTRACT_TYPE(tlv);
1142*b636d99dSDavid van Moolenbroek tlv_len = LLDP_EXTRACT_LEN(tlv);
1143*b636d99dSDavid van Moolenbroek hexdump = FALSE;
1144*b636d99dSDavid van Moolenbroek
1145*b636d99dSDavid van Moolenbroek tlen -= sizeof(tlv);
1146*b636d99dSDavid van Moolenbroek tptr += sizeof(tlv);
1147*b636d99dSDavid van Moolenbroek
1148*b636d99dSDavid van Moolenbroek /* loop check */
1149*b636d99dSDavid van Moolenbroek if (!tlv_type || !tlv_len) {
1150*b636d99dSDavid van Moolenbroek break;
1151*b636d99dSDavid van Moolenbroek }
1152*b636d99dSDavid van Moolenbroek
1153*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, tlv_len);
1154*b636d99dSDavid van Moolenbroek if (tlen < tlv_len) {
1155*b636d99dSDavid van Moolenbroek goto trunc;
1156*b636d99dSDavid van Moolenbroek }
1157*b636d99dSDavid van Moolenbroek
1158*b636d99dSDavid van Moolenbroek /* decode every tlv */
1159*b636d99dSDavid van Moolenbroek switch (tlv_type) {
1160*b636d99dSDavid van Moolenbroek case LLDP_DCBX_CONTROL_TLV:
1161*b636d99dSDavid van Moolenbroek if (tlv_len < 10) {
1162*b636d99dSDavid van Moolenbroek goto trunc;
1163*b636d99dSDavid van Moolenbroek }
1164*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Control - Protocol Control (type 0x%x, length %d)",
1165*b636d99dSDavid van Moolenbroek LLDP_DCBX_CONTROL_TLV, tlv_len));
1166*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
1167*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
1168*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Sequence Number: %d", EXTRACT_32BITS(tptr + 2)));
1169*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Acknowledgement Number: %d",
1170*b636d99dSDavid van Moolenbroek EXTRACT_32BITS(tptr + 6)));
1171*b636d99dSDavid van Moolenbroek break;
1172*b636d99dSDavid van Moolenbroek case LLDP_DCBX_PRIORITY_GROUPS_TLV:
1173*b636d99dSDavid van Moolenbroek if (tlv_len < 17) {
1174*b636d99dSDavid van Moolenbroek goto trunc;
1175*b636d99dSDavid van Moolenbroek }
1176*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Feature - Priority Group (type 0x%x, length %d)",
1177*b636d99dSDavid van Moolenbroek LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len));
1178*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
1179*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
1180*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
1181*b636d99dSDavid van Moolenbroek tval = *(tptr+2);
1182*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
1183*b636d99dSDavid van Moolenbroek (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
1184*b636d99dSDavid van Moolenbroek (tval & 0x20) ? 1 : 0));
1185*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
1186*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority Allocation"));
1187*b636d99dSDavid van Moolenbroek
1188*b636d99dSDavid van Moolenbroek /*
1189*b636d99dSDavid van Moolenbroek * Array of 8 4-bit priority group ID values; we fetch all
1190*b636d99dSDavid van Moolenbroek * 32 bits and extract each nibble.
1191*b636d99dSDavid van Moolenbroek */
1192*b636d99dSDavid van Moolenbroek pgval = EXTRACT_32BITS(tptr+4);
1193*b636d99dSDavid van Moolenbroek for (i = 0; i <= 7; i++) {
1194*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t PgId_%d: %d",
1195*b636d99dSDavid van Moolenbroek i, (pgval >> (28 - 4 * i)) & 0xF));
1196*b636d99dSDavid van Moolenbroek }
1197*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority Group Allocation"));
1198*b636d99dSDavid van Moolenbroek for (i = 0; i <= 7; i++)
1199*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Pg percentage[%d]: %d", i, *(tptr + 8 + i)));
1200*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t NumTCsSupported: %d", *(tptr + 8 + 8)));
1201*b636d99dSDavid van Moolenbroek break;
1202*b636d99dSDavid van Moolenbroek case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV:
1203*b636d99dSDavid van Moolenbroek if (tlv_len < 6) {
1204*b636d99dSDavid van Moolenbroek goto trunc;
1205*b636d99dSDavid van Moolenbroek }
1206*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Feature - Priority Flow Control"));
1207*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " (type 0x%x, length %d)",
1208*b636d99dSDavid van Moolenbroek LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len));
1209*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
1210*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
1211*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
1212*b636d99dSDavid van Moolenbroek tval = *(tptr+2);
1213*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
1214*b636d99dSDavid van Moolenbroek (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
1215*b636d99dSDavid van Moolenbroek (tval & 0x20) ? 1 : 0));
1216*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
1217*b636d99dSDavid van Moolenbroek tval = *(tptr+4);
1218*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t PFC Config (0x%02X)", *(tptr + 4)));
1219*b636d99dSDavid van Moolenbroek for (i = 0; i <= 7; i++)
1220*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Priority Bit %d: %s",
1221*b636d99dSDavid van Moolenbroek i, (tval & (1 << i)) ? "Enabled" : "Disabled"));
1222*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t NumTCPFCSupported: %d", *(tptr + 5)));
1223*b636d99dSDavid van Moolenbroek break;
1224*b636d99dSDavid van Moolenbroek case LLDP_DCBX_APPLICATION_TLV:
1225*b636d99dSDavid van Moolenbroek if (tlv_len < 4) {
1226*b636d99dSDavid van Moolenbroek goto trunc;
1227*b636d99dSDavid van Moolenbroek }
1228*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Feature - Application (type 0x%x, length %d)",
1229*b636d99dSDavid van Moolenbroek LLDP_DCBX_APPLICATION_TLV, tlv_len));
1230*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Oper_Version: %d", *tptr));
1231*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Max_Version: %d", *(tptr + 1)));
1232*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Info block(0x%02X): ", *(tptr + 2)));
1233*b636d99dSDavid van Moolenbroek tval = *(tptr+2);
1234*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Enable bit: %d, Willing bit: %d, Error Bit: %d",
1235*b636d99dSDavid van Moolenbroek (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
1236*b636d99dSDavid van Moolenbroek (tval & 0x20) ? 1 : 0));
1237*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t SubType: %d", *(tptr + 3)));
1238*b636d99dSDavid van Moolenbroek tval = tlv_len - 4;
1239*b636d99dSDavid van Moolenbroek mptr = tptr + 4;
1240*b636d99dSDavid van Moolenbroek while (tval >= 6) {
1241*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Application Value"));
1242*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Application Protocol ID: 0x%04x",
1243*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(mptr)));
1244*b636d99dSDavid van Moolenbroek uval = EXTRACT_24BITS(mptr+2);
1245*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t SF (0x%x) Application Protocol ID is %s",
1246*b636d99dSDavid van Moolenbroek (uval >> 22),
1247*b636d99dSDavid van Moolenbroek (uval >> 22) ? "Socket Number" : "L2 EtherType"));
1248*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t OUI: 0x%06x", uval & 0x3fffff));
1249*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t User Priority Map: 0x%02x", *(mptr + 5)));
1250*b636d99dSDavid van Moolenbroek tval = tval - 6;
1251*b636d99dSDavid van Moolenbroek mptr = mptr + 6;
1252*b636d99dSDavid van Moolenbroek }
1253*b636d99dSDavid van Moolenbroek break;
1254*b636d99dSDavid van Moolenbroek default:
1255*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1256*b636d99dSDavid van Moolenbroek break;
1257*b636d99dSDavid van Moolenbroek }
1258*b636d99dSDavid van Moolenbroek
1259*b636d99dSDavid van Moolenbroek /* do we also want to see a hex dump ? */
1260*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
1261*b636d99dSDavid van Moolenbroek print_unknown_data(ndo, tptr, "\n\t ", tlv_len);
1262*b636d99dSDavid van Moolenbroek }
1263*b636d99dSDavid van Moolenbroek
1264*b636d99dSDavid van Moolenbroek tlen -= tlv_len;
1265*b636d99dSDavid van Moolenbroek tptr += tlv_len;
1266*b636d99dSDavid van Moolenbroek }
1267*b636d99dSDavid van Moolenbroek
1268*b636d99dSDavid van Moolenbroek trunc:
1269*b636d99dSDavid van Moolenbroek return hexdump;
1270*b636d99dSDavid van Moolenbroek }
1271*b636d99dSDavid van Moolenbroek
1272*b636d99dSDavid van Moolenbroek static char *
lldp_network_addr_print(netdissect_options * ndo,const u_char * tptr,u_int len)1273*b636d99dSDavid van Moolenbroek lldp_network_addr_print(netdissect_options *ndo, const u_char *tptr, u_int len)
1274*b636d99dSDavid van Moolenbroek {
1275*b636d99dSDavid van Moolenbroek uint8_t af;
1276*b636d99dSDavid van Moolenbroek static char buf[BUFSIZE];
1277*b636d99dSDavid van Moolenbroek const char * (*pfunc)(netdissect_options *, const u_char *);
1278*b636d99dSDavid van Moolenbroek
1279*b636d99dSDavid van Moolenbroek if (len < 1)
1280*b636d99dSDavid van Moolenbroek return NULL;
1281*b636d99dSDavid van Moolenbroek len--;
1282*b636d99dSDavid van Moolenbroek af = *tptr;
1283*b636d99dSDavid van Moolenbroek switch (af) {
1284*b636d99dSDavid van Moolenbroek case AFNUM_INET:
1285*b636d99dSDavid van Moolenbroek if (len < 4)
1286*b636d99dSDavid van Moolenbroek return NULL;
1287*b636d99dSDavid van Moolenbroek pfunc = getname;
1288*b636d99dSDavid van Moolenbroek break;
1289*b636d99dSDavid van Moolenbroek #ifdef INET6
1290*b636d99dSDavid van Moolenbroek case AFNUM_INET6:
1291*b636d99dSDavid van Moolenbroek if (len < 16)
1292*b636d99dSDavid van Moolenbroek return NULL;
1293*b636d99dSDavid van Moolenbroek pfunc = getname6;
1294*b636d99dSDavid van Moolenbroek break;
1295*b636d99dSDavid van Moolenbroek #endif
1296*b636d99dSDavid van Moolenbroek case AFNUM_802:
1297*b636d99dSDavid van Moolenbroek if (len < 6)
1298*b636d99dSDavid van Moolenbroek return NULL;
1299*b636d99dSDavid van Moolenbroek pfunc = etheraddr_string;
1300*b636d99dSDavid van Moolenbroek break;
1301*b636d99dSDavid van Moolenbroek default:
1302*b636d99dSDavid van Moolenbroek pfunc = NULL;
1303*b636d99dSDavid van Moolenbroek break;
1304*b636d99dSDavid van Moolenbroek }
1305*b636d99dSDavid van Moolenbroek
1306*b636d99dSDavid van Moolenbroek if (!pfunc) {
1307*b636d99dSDavid van Moolenbroek snprintf(buf, sizeof(buf), "AFI %s (%u), no AF printer !",
1308*b636d99dSDavid van Moolenbroek tok2str(af_values, "Unknown", af), af);
1309*b636d99dSDavid van Moolenbroek } else {
1310*b636d99dSDavid van Moolenbroek snprintf(buf, sizeof(buf), "AFI %s (%u): %s",
1311*b636d99dSDavid van Moolenbroek tok2str(af_values, "Unknown", af), af, (*pfunc)(ndo, tptr+1));
1312*b636d99dSDavid van Moolenbroek }
1313*b636d99dSDavid van Moolenbroek
1314*b636d99dSDavid van Moolenbroek return buf;
1315*b636d99dSDavid van Moolenbroek }
1316*b636d99dSDavid van Moolenbroek
1317*b636d99dSDavid van Moolenbroek static int
lldp_mgmt_addr_tlv_print(netdissect_options * ndo,const u_char * pptr,u_int len)1318*b636d99dSDavid van Moolenbroek lldp_mgmt_addr_tlv_print(netdissect_options *ndo,
1319*b636d99dSDavid van Moolenbroek const u_char *pptr, u_int len)
1320*b636d99dSDavid van Moolenbroek {
1321*b636d99dSDavid van Moolenbroek uint8_t mgmt_addr_len, intf_num_subtype, oid_len;
1322*b636d99dSDavid van Moolenbroek const u_char *tptr;
1323*b636d99dSDavid van Moolenbroek u_int tlen;
1324*b636d99dSDavid van Moolenbroek char *mgmt_addr;
1325*b636d99dSDavid van Moolenbroek
1326*b636d99dSDavid van Moolenbroek tlen = len;
1327*b636d99dSDavid van Moolenbroek tptr = pptr;
1328*b636d99dSDavid van Moolenbroek
1329*b636d99dSDavid van Moolenbroek if (tlen < 1) {
1330*b636d99dSDavid van Moolenbroek return 0;
1331*b636d99dSDavid van Moolenbroek }
1332*b636d99dSDavid van Moolenbroek mgmt_addr_len = *tptr++;
1333*b636d99dSDavid van Moolenbroek tlen--;
1334*b636d99dSDavid van Moolenbroek
1335*b636d99dSDavid van Moolenbroek if (tlen < mgmt_addr_len) {
1336*b636d99dSDavid van Moolenbroek return 0;
1337*b636d99dSDavid van Moolenbroek }
1338*b636d99dSDavid van Moolenbroek
1339*b636d99dSDavid van Moolenbroek mgmt_addr = lldp_network_addr_print(ndo, tptr, mgmt_addr_len);
1340*b636d99dSDavid van Moolenbroek if (mgmt_addr == NULL) {
1341*b636d99dSDavid van Moolenbroek return 0;
1342*b636d99dSDavid van Moolenbroek }
1343*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Management Address length %u, %s",
1344*b636d99dSDavid van Moolenbroek mgmt_addr_len, mgmt_addr));
1345*b636d99dSDavid van Moolenbroek tptr += mgmt_addr_len;
1346*b636d99dSDavid van Moolenbroek tlen -= mgmt_addr_len;
1347*b636d99dSDavid van Moolenbroek
1348*b636d99dSDavid van Moolenbroek if (tlen < LLDP_INTF_NUM_LEN) {
1349*b636d99dSDavid van Moolenbroek return 0;
1350*b636d99dSDavid van Moolenbroek }
1351*b636d99dSDavid van Moolenbroek
1352*b636d99dSDavid van Moolenbroek intf_num_subtype = *tptr;
1353*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Interface Numbering (%u): %u",
1354*b636d99dSDavid van Moolenbroek tok2str(lldp_intf_numb_subtype_values, "Unknown", intf_num_subtype),
1355*b636d99dSDavid van Moolenbroek intf_num_subtype,
1356*b636d99dSDavid van Moolenbroek EXTRACT_32BITS(tptr + 1)));
1357*b636d99dSDavid van Moolenbroek
1358*b636d99dSDavid van Moolenbroek tptr += LLDP_INTF_NUM_LEN;
1359*b636d99dSDavid van Moolenbroek tlen -= LLDP_INTF_NUM_LEN;
1360*b636d99dSDavid van Moolenbroek
1361*b636d99dSDavid van Moolenbroek /*
1362*b636d99dSDavid van Moolenbroek * The OID is optional.
1363*b636d99dSDavid van Moolenbroek */
1364*b636d99dSDavid van Moolenbroek if (tlen) {
1365*b636d99dSDavid van Moolenbroek oid_len = *tptr;
1366*b636d99dSDavid van Moolenbroek
1367*b636d99dSDavid van Moolenbroek if (tlen < oid_len) {
1368*b636d99dSDavid van Moolenbroek return 0;
1369*b636d99dSDavid van Moolenbroek }
1370*b636d99dSDavid van Moolenbroek if (oid_len) {
1371*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t OID length %u", oid_len));
1372*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 1, oid_len);
1373*b636d99dSDavid van Moolenbroek }
1374*b636d99dSDavid van Moolenbroek }
1375*b636d99dSDavid van Moolenbroek
1376*b636d99dSDavid van Moolenbroek return 1;
1377*b636d99dSDavid van Moolenbroek }
1378*b636d99dSDavid van Moolenbroek
1379*b636d99dSDavid van Moolenbroek void
lldp_print(netdissect_options * ndo,register const u_char * pptr,register u_int len)1380*b636d99dSDavid van Moolenbroek lldp_print(netdissect_options *ndo,
1381*b636d99dSDavid van Moolenbroek register const u_char *pptr, register u_int len)
1382*b636d99dSDavid van Moolenbroek {
1383*b636d99dSDavid van Moolenbroek uint8_t subtype;
1384*b636d99dSDavid van Moolenbroek uint16_t tlv, cap, ena_cap;
1385*b636d99dSDavid van Moolenbroek u_int oui, tlen, hexdump, tlv_type, tlv_len;
1386*b636d99dSDavid van Moolenbroek const u_char *tptr;
1387*b636d99dSDavid van Moolenbroek char *network_addr;
1388*b636d99dSDavid van Moolenbroek
1389*b636d99dSDavid van Moolenbroek tptr = pptr;
1390*b636d99dSDavid van Moolenbroek tlen = len;
1391*b636d99dSDavid van Moolenbroek
1392*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "LLDP, length %u", len));
1393*b636d99dSDavid van Moolenbroek
1394*b636d99dSDavid van Moolenbroek while (tlen >= sizeof(tlv)) {
1395*b636d99dSDavid van Moolenbroek
1396*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, sizeof(tlv));
1397*b636d99dSDavid van Moolenbroek
1398*b636d99dSDavid van Moolenbroek tlv = EXTRACT_16BITS(tptr);
1399*b636d99dSDavid van Moolenbroek
1400*b636d99dSDavid van Moolenbroek tlv_type = LLDP_EXTRACT_TYPE(tlv);
1401*b636d99dSDavid van Moolenbroek tlv_len = LLDP_EXTRACT_LEN(tlv);
1402*b636d99dSDavid van Moolenbroek hexdump = FALSE;
1403*b636d99dSDavid van Moolenbroek
1404*b636d99dSDavid van Moolenbroek tlen -= sizeof(tlv);
1405*b636d99dSDavid van Moolenbroek tptr += sizeof(tlv);
1406*b636d99dSDavid van Moolenbroek
1407*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1408*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t%s TLV (%u), length %u",
1409*b636d99dSDavid van Moolenbroek tok2str(lldp_tlv_values, "Unknown", tlv_type),
1410*b636d99dSDavid van Moolenbroek tlv_type, tlv_len));
1411*b636d99dSDavid van Moolenbroek }
1412*b636d99dSDavid van Moolenbroek
1413*b636d99dSDavid van Moolenbroek /* infinite loop check */
1414*b636d99dSDavid van Moolenbroek if (!tlv_type || !tlv_len) {
1415*b636d99dSDavid van Moolenbroek break;
1416*b636d99dSDavid van Moolenbroek }
1417*b636d99dSDavid van Moolenbroek
1418*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, tlv_len);
1419*b636d99dSDavid van Moolenbroek if (tlen < tlv_len) {
1420*b636d99dSDavid van Moolenbroek goto trunc;
1421*b636d99dSDavid van Moolenbroek }
1422*b636d99dSDavid van Moolenbroek
1423*b636d99dSDavid van Moolenbroek switch (tlv_type) {
1424*b636d99dSDavid van Moolenbroek
1425*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_ID_TLV:
1426*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1427*b636d99dSDavid van Moolenbroek if (tlv_len < 2) {
1428*b636d99dSDavid van Moolenbroek goto trunc;
1429*b636d99dSDavid van Moolenbroek }
1430*b636d99dSDavid van Moolenbroek subtype = *tptr;
1431*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Subtype %s (%u): ",
1432*b636d99dSDavid van Moolenbroek tok2str(lldp_chassis_subtype_values, "Unknown", subtype),
1433*b636d99dSDavid van Moolenbroek subtype));
1434*b636d99dSDavid van Moolenbroek
1435*b636d99dSDavid van Moolenbroek switch (subtype) {
1436*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_MAC_ADDR_SUBTYPE:
1437*b636d99dSDavid van Moolenbroek if (tlv_len < 1+6) {
1438*b636d99dSDavid van Moolenbroek goto trunc;
1439*b636d99dSDavid van Moolenbroek }
1440*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", etheraddr_string(ndo, tptr + 1)));
1441*b636d99dSDavid van Moolenbroek break;
1442*b636d99dSDavid van Moolenbroek
1443*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */
1444*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_LOCAL_SUBTYPE:
1445*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE:
1446*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE:
1447*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_PORT_COMP_SUBTYPE:
1448*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 1, tlv_len - 1);
1449*b636d99dSDavid van Moolenbroek break;
1450*b636d99dSDavid van Moolenbroek
1451*b636d99dSDavid van Moolenbroek case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
1452*b636d99dSDavid van Moolenbroek network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
1453*b636d99dSDavid van Moolenbroek if (network_addr == NULL) {
1454*b636d99dSDavid van Moolenbroek goto trunc;
1455*b636d99dSDavid van Moolenbroek }
1456*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", network_addr));
1457*b636d99dSDavid van Moolenbroek break;
1458*b636d99dSDavid van Moolenbroek
1459*b636d99dSDavid van Moolenbroek default:
1460*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1461*b636d99dSDavid van Moolenbroek break;
1462*b636d99dSDavid van Moolenbroek }
1463*b636d99dSDavid van Moolenbroek }
1464*b636d99dSDavid van Moolenbroek break;
1465*b636d99dSDavid van Moolenbroek
1466*b636d99dSDavid van Moolenbroek case LLDP_PORT_ID_TLV:
1467*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1468*b636d99dSDavid van Moolenbroek if (tlv_len < 2) {
1469*b636d99dSDavid van Moolenbroek goto trunc;
1470*b636d99dSDavid van Moolenbroek }
1471*b636d99dSDavid van Moolenbroek subtype = *tptr;
1472*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Subtype %s (%u): ",
1473*b636d99dSDavid van Moolenbroek tok2str(lldp_port_subtype_values, "Unknown", subtype),
1474*b636d99dSDavid van Moolenbroek subtype));
1475*b636d99dSDavid van Moolenbroek
1476*b636d99dSDavid van Moolenbroek switch (subtype) {
1477*b636d99dSDavid van Moolenbroek case LLDP_PORT_MAC_ADDR_SUBTYPE:
1478*b636d99dSDavid van Moolenbroek if (tlv_len < 1+6) {
1479*b636d99dSDavid van Moolenbroek goto trunc;
1480*b636d99dSDavid van Moolenbroek }
1481*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", etheraddr_string(ndo, tptr + 1)));
1482*b636d99dSDavid van Moolenbroek break;
1483*b636d99dSDavid van Moolenbroek
1484*b636d99dSDavid van Moolenbroek case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
1485*b636d99dSDavid van Moolenbroek case LLDP_PORT_LOCAL_SUBTYPE:
1486*b636d99dSDavid van Moolenbroek case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
1487*b636d99dSDavid van Moolenbroek case LLDP_PORT_INTF_ALIAS_SUBTYPE:
1488*b636d99dSDavid van Moolenbroek case LLDP_PORT_PORT_COMP_SUBTYPE:
1489*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr + 1, tlv_len - 1);
1490*b636d99dSDavid van Moolenbroek break;
1491*b636d99dSDavid van Moolenbroek
1492*b636d99dSDavid van Moolenbroek case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
1493*b636d99dSDavid van Moolenbroek network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
1494*b636d99dSDavid van Moolenbroek if (network_addr == NULL) {
1495*b636d99dSDavid van Moolenbroek goto trunc;
1496*b636d99dSDavid van Moolenbroek }
1497*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", network_addr));
1498*b636d99dSDavid van Moolenbroek break;
1499*b636d99dSDavid van Moolenbroek
1500*b636d99dSDavid van Moolenbroek default:
1501*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1502*b636d99dSDavid van Moolenbroek break;
1503*b636d99dSDavid van Moolenbroek }
1504*b636d99dSDavid van Moolenbroek }
1505*b636d99dSDavid van Moolenbroek break;
1506*b636d99dSDavid van Moolenbroek
1507*b636d99dSDavid van Moolenbroek case LLDP_TTL_TLV:
1508*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1509*b636d99dSDavid van Moolenbroek if (tlv_len < 2) {
1510*b636d99dSDavid van Moolenbroek goto trunc;
1511*b636d99dSDavid van Moolenbroek }
1512*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ": TTL %us", EXTRACT_16BITS(tptr)));
1513*b636d99dSDavid van Moolenbroek }
1514*b636d99dSDavid van Moolenbroek break;
1515*b636d99dSDavid van Moolenbroek
1516*b636d99dSDavid van Moolenbroek case LLDP_PORT_DESCR_TLV:
1517*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1518*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ": "));
1519*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr, tlv_len);
1520*b636d99dSDavid van Moolenbroek }
1521*b636d99dSDavid van Moolenbroek break;
1522*b636d99dSDavid van Moolenbroek
1523*b636d99dSDavid van Moolenbroek case LLDP_SYSTEM_NAME_TLV:
1524*b636d99dSDavid van Moolenbroek /*
1525*b636d99dSDavid van Moolenbroek * The system name is also print in non-verbose mode
1526*b636d99dSDavid van Moolenbroek * similar to the CDP printer.
1527*b636d99dSDavid van Moolenbroek */
1528*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ": "));
1529*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr, tlv_len);
1530*b636d99dSDavid van Moolenbroek break;
1531*b636d99dSDavid van Moolenbroek
1532*b636d99dSDavid van Moolenbroek case LLDP_SYSTEM_DESCR_TLV:
1533*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1534*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t "));
1535*b636d99dSDavid van Moolenbroek safeputs(ndo, tptr, tlv_len);
1536*b636d99dSDavid van Moolenbroek }
1537*b636d99dSDavid van Moolenbroek break;
1538*b636d99dSDavid van Moolenbroek
1539*b636d99dSDavid van Moolenbroek case LLDP_SYSTEM_CAP_TLV:
1540*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1541*b636d99dSDavid van Moolenbroek /*
1542*b636d99dSDavid van Moolenbroek * XXX - IEEE Std 802.1AB-2009 says the first octet
1543*b636d99dSDavid van Moolenbroek * if a chassis ID subtype, with the system
1544*b636d99dSDavid van Moolenbroek * capabilities and enabled capabilities following
1545*b636d99dSDavid van Moolenbroek * it.
1546*b636d99dSDavid van Moolenbroek */
1547*b636d99dSDavid van Moolenbroek if (tlv_len < 4) {
1548*b636d99dSDavid van Moolenbroek goto trunc;
1549*b636d99dSDavid van Moolenbroek }
1550*b636d99dSDavid van Moolenbroek cap = EXTRACT_16BITS(tptr);
1551*b636d99dSDavid van Moolenbroek ena_cap = EXTRACT_16BITS(tptr+2);
1552*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t System Capabilities [%s] (0x%04x)",
1553*b636d99dSDavid van Moolenbroek bittok2str(lldp_cap_values, "none", cap), cap));
1554*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Enabled Capabilities [%s] (0x%04x)",
1555*b636d99dSDavid van Moolenbroek bittok2str(lldp_cap_values, "none", ena_cap), ena_cap));
1556*b636d99dSDavid van Moolenbroek }
1557*b636d99dSDavid van Moolenbroek break;
1558*b636d99dSDavid van Moolenbroek
1559*b636d99dSDavid van Moolenbroek case LLDP_MGMT_ADDR_TLV:
1560*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1561*b636d99dSDavid van Moolenbroek if (!lldp_mgmt_addr_tlv_print(ndo, tptr, tlv_len)) {
1562*b636d99dSDavid van Moolenbroek goto trunc;
1563*b636d99dSDavid van Moolenbroek }
1564*b636d99dSDavid van Moolenbroek }
1565*b636d99dSDavid van Moolenbroek break;
1566*b636d99dSDavid van Moolenbroek
1567*b636d99dSDavid van Moolenbroek case LLDP_PRIVATE_TLV:
1568*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag) {
1569*b636d99dSDavid van Moolenbroek if (tlv_len < 3) {
1570*b636d99dSDavid van Moolenbroek goto trunc;
1571*b636d99dSDavid van Moolenbroek }
1572*b636d99dSDavid van Moolenbroek oui = EXTRACT_24BITS(tptr);
1573*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui));
1574*b636d99dSDavid van Moolenbroek
1575*b636d99dSDavid van Moolenbroek switch (oui) {
1576*b636d99dSDavid van Moolenbroek case OUI_IEEE_8021_PRIVATE:
1577*b636d99dSDavid van Moolenbroek hexdump = lldp_private_8021_print(ndo, tptr, tlv_len);
1578*b636d99dSDavid van Moolenbroek break;
1579*b636d99dSDavid van Moolenbroek case OUI_IEEE_8023_PRIVATE:
1580*b636d99dSDavid van Moolenbroek hexdump = lldp_private_8023_print(ndo, tptr, tlv_len);
1581*b636d99dSDavid van Moolenbroek break;
1582*b636d99dSDavid van Moolenbroek case OUI_TIA:
1583*b636d99dSDavid van Moolenbroek hexdump = lldp_private_tia_print(ndo, tptr, tlv_len);
1584*b636d99dSDavid van Moolenbroek break;
1585*b636d99dSDavid van Moolenbroek case OUI_DCBX:
1586*b636d99dSDavid van Moolenbroek hexdump = lldp_private_dcbx_print(ndo, tptr, tlv_len);
1587*b636d99dSDavid van Moolenbroek break;
1588*b636d99dSDavid van Moolenbroek default:
1589*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1590*b636d99dSDavid van Moolenbroek break;
1591*b636d99dSDavid van Moolenbroek }
1592*b636d99dSDavid van Moolenbroek }
1593*b636d99dSDavid van Moolenbroek break;
1594*b636d99dSDavid van Moolenbroek
1595*b636d99dSDavid van Moolenbroek default:
1596*b636d99dSDavid van Moolenbroek hexdump = TRUE;
1597*b636d99dSDavid van Moolenbroek break;
1598*b636d99dSDavid van Moolenbroek }
1599*b636d99dSDavid van Moolenbroek
1600*b636d99dSDavid van Moolenbroek /* do we also want to see a hex dump ? */
1601*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1 || (ndo->ndo_vflag && hexdump)) {
1602*b636d99dSDavid van Moolenbroek print_unknown_data(ndo, tptr, "\n\t ", tlv_len);
1603*b636d99dSDavid van Moolenbroek }
1604*b636d99dSDavid van Moolenbroek
1605*b636d99dSDavid van Moolenbroek tlen -= tlv_len;
1606*b636d99dSDavid van Moolenbroek tptr += tlv_len;
1607*b636d99dSDavid van Moolenbroek }
1608*b636d99dSDavid van Moolenbroek return;
1609*b636d99dSDavid van Moolenbroek trunc:
1610*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t[|LLDP]"));
1611*b636d99dSDavid van Moolenbroek }
1612*b636d99dSDavid van Moolenbroek
1613*b636d99dSDavid van Moolenbroek /*
1614*b636d99dSDavid van Moolenbroek * Local Variables:
1615*b636d99dSDavid van Moolenbroek * c-style: whitesmith
1616*b636d99dSDavid van Moolenbroek * c-basic-offset: 4
1617*b636d99dSDavid van Moolenbroek * End:
1618*b636d99dSDavid van Moolenbroek */
1619