#ifndef lint
static const char rcsid[] _U_ =
-"@(#) $Header: /tcpdump/master/tcpdump/print-lldp.c,v 1.7 2007-08-20 12:18:30 hannes Exp $";
+"@(#) $Header: /tcpdump/master/tcpdump/print-lldp.c,v 1.10 2008-03-20 09:30:56 hannes Exp $";
#endif
#ifdef HAVE_CONFIG_H
{ 0, NULL}
};
-#define LLDP_PRIVATE_8023_SUTBYPE_MACPHY 1
-#define LLDP_PRIVATE_8023_SUTBYPE_MDIPOWER 2
-#define LLDP_PRIVATE_8023_SUTBYPE_LINKAGGR 3
-#define LLDP_PRIVATE_8023_SUTBYPE_MTU 4
+#define LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID 1
+#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID 2
+#define LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME 3
+#define LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY 4
+
+static const struct tok lldp_8021_subtype_values[] = {
+ { LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID, "Port VLAN Id"},
+ { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID, "Port and Protocol VLAN ID"},
+ { LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME, "VLAN name"},
+ { LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY, "Protocol Identity"},
+ { 0, NULL}
+};
+
+#define LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT (1 << 1)
+#define LLDP_8021_PORT_PROTOCOL_VLAN_STATUS (1 << 2)
+
+static const struct tok lldp_8021_port_protocol_id_values[] = {
+ { LLDP_8021_PORT_PROTOCOL_VLAN_SUPPORT, "supported"},
+ { LLDP_8021_PORT_PROTOCOL_VLAN_STATUS, "enabled"},
+ { 0, NULL}
+};
+
+#define LLDP_PRIVATE_8023_SUBTYPE_MACPHY 1
+#define LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER 2
+#define LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR 3
+#define LLDP_PRIVATE_8023_SUBTYPE_MTU 4
static const struct tok lldp_8023_subtype_values[] = {
- { LLDP_PRIVATE_8023_SUTBYPE_MACPHY, "MAC/PHY configuration/status"},
- { LLDP_PRIVATE_8023_SUTBYPE_MDIPOWER, "Power via MDI"},
- { LLDP_PRIVATE_8023_SUTBYPE_LINKAGGR, "Link aggregation"},
- { LLDP_PRIVATE_8023_SUTBYPE_MTU, "Max frame size"},
+ { LLDP_PRIVATE_8023_SUBTYPE_MACPHY, "MAC/PHY configuration/status"},
+ { LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER, "Power via MDI"},
+ { LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR, "Link aggregation"},
+ { LLDP_PRIVATE_8023_SUBTYPE_MTU, "Max frame size"},
{ 0, NULL}
};
/*
* From RFC 3636 - ifMauAutoNegCapAdvertisedBits
*/
-#define LLDP_MAU_PMD_OTHER (1 << 0)
-#define LLDP_MAU_PMD_10BASE_T (1 << 1)
-#define LLDP_MAU_PMD_10BASE_T_FD (1 << 2)
-#define LLDP_MAU_PMD_100BASE_T4 (1 << 3)
-#define LLDP_MAU_PMD_100BASE_TX (1 << 4)
-#define LLDP_MAU_PMD_100BASE_TX_FD (1 << 5)
-#define LLDP_MAU_PMD_100BASE_T2 (1 << 6)
-#define LLDP_MAU_PMD_100BASE_T2_FD (1 << 7)
-#define LLDP_MAU_PMD_FDXPAUSE (1 << 8)
-#define LLDP_MAU_PMD_FDXAPAUSE (1 << 9)
-#define LLDP_MAU_PMD_FDXSPAUSE (1 << 10)
-#define LLDP_MAU_PMD_FDXBPAUSE (1 << 11)
-#define LLDP_MAU_PMD_1000BASE_X (1 << 12)
-#define LLDP_MAU_PMD_1000BASE_X_FD (1 << 13)
-#define LLDP_MAU_PMD_1000BASE_T (1 << 14)
-#define LLDP_MAU_PMD_1000BASE_T_FD (1 << 15)
+#define LLDP_MAU_PMD_OTHER (1 << 15)
+#define LLDP_MAU_PMD_10BASE_T (1 << 14)
+#define LLDP_MAU_PMD_10BASE_T_FD (1 << 13)
+#define LLDP_MAU_PMD_100BASE_T4 (1 << 12)
+#define LLDP_MAU_PMD_100BASE_TX (1 << 11)
+#define LLDP_MAU_PMD_100BASE_TX_FD (1 << 10)
+#define LLDP_MAU_PMD_100BASE_T2 (1 << 9)
+#define LLDP_MAU_PMD_100BASE_T2_FD (1 << 8)
+#define LLDP_MAU_PMD_FDXPAUSE (1 << 7)
+#define LLDP_MAU_PMD_FDXAPAUSE (1 << 6)
+#define LLDP_MAU_PMD_FDXSPAUSE (1 << 5)
+#define LLDP_MAU_PMD_FDXBPAUSE (1 << 4)
+#define LLDP_MAU_PMD_1000BASE_X (1 << 3)
+#define LLDP_MAU_PMD_1000BASE_X_FD (1 << 2)
+#define LLDP_MAU_PMD_1000BASE_T (1 << 1)
+#define LLDP_MAU_PMD_1000BASE_T_FD (1 << 0)
static const struct tok lldp_pmd_capability_values[] = {
{ LLDP_MAU_PMD_10BASE_T, "10BASE-T hdx"},
#define LLDP_INTF_NUM_LEN 5
/*
- * Print IEEE private extensions.
+ * Print IEEE private extensions. (802.1 annex F)
+ */
+static int
+lldp_private_8021_print(const u_char *tptr)
+{
+ int subtype, hexdump = FALSE;
+
+ subtype = *(tptr+3);
+
+ printf("\n\t %s Subtype (%u)",
+ tok2str(lldp_8021_subtype_values, "unknown", subtype),
+ subtype);
+
+ switch (subtype) {
+ case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
+ printf("\n\t port vlan id (PVID): %u",
+ EXTRACT_16BITS(tptr+4));
+ break;
+ case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID:
+ printf("\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)",
+ EXTRACT_16BITS(tptr+5),
+ bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)),
+ *(tptr+4));
+ break;
+ case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME:
+ printf("\n\t vlan id (VID): %u",
+ EXTRACT_16BITS(tptr+4));
+ printf("\n\t vlan name: ");
+ safeputs((const char *)tptr+7, *(tptr+6));
+ break;
+ case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY:
+ printf("\n\t protocol identity: ");
+ safeputs((const char *)tptr+5, *(tptr+4));
+ break;
+
+ default:
+ hexdump = TRUE;
+ break;
+ }
+
+ return hexdump;
+}
+
+/*
+ * Print IEEE private extensions. (802.3)
*/
static int
lldp_private_8023_print(const u_char *tptr)
subtype);
switch (subtype) {
- case LLDP_PRIVATE_8023_SUTBYPE_MACPHY:
+ case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
printf("\n\t autonegotiation [%s] (0x%02x)",
bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)),
*(tptr+4));
EXTRACT_16BITS(tptr+7));
break;
- case LLDP_PRIVATE_8023_SUTBYPE_MDIPOWER:
+ case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
printf("\n\t MDI power support [%s], power pair %s, power class %s",
bittok2str(lldp_mdi_values, "none", *(tptr+4)),
tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)),
tok2str(lldp_mdi_power_class_values, "unknown", *(tptr+6)));
break;
- case LLDP_PRIVATE_8023_SUTBYPE_LINKAGGR:
+ case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
printf("\n\t aggregation status [%s], aggregation port ID %u",
- bittok2str(lldp_aggregation_values, "none", (*tptr+4)),
+ bittok2str(lldp_aggregation_values, "none", *(tptr+4)),
EXTRACT_32BITS(tptr+5));
break;
- case LLDP_PRIVATE_8023_SUTBYPE_MTU:
+ case LLDP_PRIVATE_8023_SUBTYPE_MTU:
printf("\n\t MTU size %u", EXTRACT_16BITS(tptr+4));
break;
printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui);
switch (oui) {
- case OUI_IEEE_PRIVATE:
+ case OUI_IEEE_8021_PRIVATE:
+ hexdump = lldp_private_8021_print(tptr);
+ break;
+ case OUI_IEEE_8023_PRIVATE:
hexdump = lldp_private_8023_print(tptr);
break;
case OUI_TIA: