]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-lldp.c
Fix the pointer tests in the non-ndoified TTEST2() macro as well.
[tcpdump] / print-lldp.c
index bd7bded07a5c4b4d6b0f8e7596319181059b9948..e8f67fd23a5375cf3ee37f6c63fc6a1d0d11efba 100644 (file)
@@ -20,7 +20,7 @@
 
 #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
@@ -138,16 +138,38 @@ static const struct tok lldp_cap_values[] = {
     { 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}
 };
 
@@ -437,22 +459,22 @@ static const struct tok lldp_tia_inventory_values[] = {
 /*
  * 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"},
@@ -534,7 +556,51 @@ static const struct tok lldp_intf_numb_subtype_values[] = {
 #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)
@@ -548,7 +614,7 @@ 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));
@@ -560,20 +626,20 @@ lldp_private_8023_print(const u_char *tptr)
                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;
 
@@ -980,7 +1046,10 @@ lldp_print(register const u_char *pptr, register u_int len) {
                 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: