]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
Add CDP unit tests.
authorVincent Bernat <bernat@luffy.cx>
Tue, 7 Jul 2009 11:39:52 +0000 (13:39 +0200)
committerVincent Bernat <bernat@luffy.cx>
Tue, 7 Jul 2009 13:23:39 +0000 (15:23 +0200)
tests/Makefile.am
tests/check_cdp.c [new file with mode: 0644]

index 10a072cc2e5a86d7e38bc438e307acf8c5bc81d4..c6940c98cf95a159fc04ab530ffbf30305dff451 100644 (file)
@@ -1,8 +1,8 @@
-TESTS = check_pack check_lldp
+TESTS = check_pack check_lldp check_cdp
 
 if HAVE_CHECK
 
-check_PROGRAMS = check_pack check_lldp
+check_PROGRAMS = $(TESTS)
 
 check_pack_SOURCES = check_pack.c \
        $(top_builddir)/src/lldpd.h
@@ -15,9 +15,16 @@ check_lldp_SOURCES = check_lldp.c \
 check_lldp_CFLAGS = @CHECK_CFLAGS@
 check_lldp_LDADD = $(top_builddir)/src/liblldpd.la @CHECK_LIBS@
 
+check_cdp_SOURCES = check_cdp.c \
+       $(top_builddir)/src/lldpd.h \
+       common.h common.c
+check_cdp_CFLAGS = @CHECK_CFLAGS@
+check_cdp_LDADD = $(top_builddir)/src/liblldpd.la @CHECK_LIBS@
+
 if USE_SNMP
 check_pack_LDADD += @NETSNMP_LIB@
 check_lldp_LDADD += @NETSNMP_LIB@
+check_cdp_LDADD += @NETSNMP_LIB@
 endif
 
 endif
diff --git a/tests/check_cdp.c b/tests/check_cdp.c
new file mode 100644 (file)
index 0000000..d2d775d
--- /dev/null
@@ -0,0 +1,554 @@
+#define _GNU_SOURCE 1
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <check.h>
+#include "../src/lldpd.h"
+#include "common.h"
+
+char filenameprefix[] = "cdp_send";
+
+#ifdef ENABLE_CDP
+
+START_TEST (test_send_cdpv1)
+{
+       int n;
+       /* Packet we should build:
+IEEE 802.3 Ethernet 
+    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
+    Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
+    Length: 106
+Logical-Link Control
+    DSAP: SNAP (0xaa)
+    IG Bit: Individual
+    SSAP: SNAP (0xaa)
+    CR Bit: Command
+    Control field: U, func=UI (0x03)
+        000. 00.. = Command: Unnumbered Information (0x00)
+        .... ..11 = Frame type: Unnumbered frame (0x03)
+    Organization Code: Cisco (0x00000c)
+    PID: CDP (0x2000)
+Cisco Discovery Protocol
+    Version: 1
+    TTL: 180 seconds
+    Checksum: 0x3b07 [correct]
+        [Good: True]
+        [Bad : False]
+    Device ID: First chassis
+        Type: Device ID (0x0001)
+        Length: 17
+        Device ID: First chassis
+    Addresses
+        Type: Addresses (0x0002)
+        Length: 17
+        Number of addresses: 1
+        IP address: 172.17.142.37
+            Protocol type: NLPID
+            Protocol length: 1
+            Protocol: IP
+            Address length: 4
+            IP address: 172.17.142.37
+    Port ID: FastEthernet 1/5
+        Type: Port ID (0x0003)
+        Length: 20
+        Sent through Interface: FastEthernet 1/5
+    Capabilities
+        Type: Capabilities (0x0004)
+        Length: 8
+        Capabilities: 0x00000001
+            .... .... .... .... .... .... .... ...1 = Is  a Router
+            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
+            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
+            .... .... .... .... .... .... .... 0... = Not a Switch
+            .... .... .... .... .... .... ...0 .... = Not a Host
+            .... .... .... .... .... .... ..0. .... = Not IGMP capable
+            .... .... .... .... .... .... .0.. .... = Not a Repeater
+    Software Version
+        Type: Software version (0x0005)
+        Length: 23
+        Software Version: Chassis description
+    Platform: Linux
+        Type: Platform (0x0006)
+        Length: 9
+        Platform: Linux
+       */
+       char pkt1[] = {
+         0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x5e, 0x10,
+         0x8e, 0xe7, 0x84, 0xad, 0x00, 0x6a, 0xaa, 0xaa,
+         0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x01, 0xb4,
+         0x3b, 0x07, 0x00, 0x01, 0x00, 0x11, 0x46, 0x69,
+         0x72, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x73,
+         0x73, 0x69, 0x73, 0x00, 0x02, 0x00, 0x11, 0x00,
+         0x00, 0x00, 0x01, 0x01, 0x01, 0xcc, 0x00, 0x04,
+         0xac, 0x11, 0x8e, 0x25, 0x00, 0x03, 0x00, 0x14,
+         0x46, 0x61, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65,
+         0x72, 0x6e, 0x65, 0x74, 0x20, 0x31, 0x2f, 0x35,
+         0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01,
+         0x00, 0x05, 0x00, 0x17, 0x43, 0x68, 0x61, 0x73,
+         0x73, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63,
+         0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00,
+         0x06, 0x00, 0x09, 0x4c, 0x69, 0x6e, 0x75, 0x78 };
+       struct packet *pkt;
+
+       /* Populate port and chassis */
+       hardware.h_lport.p_id_subtype = LLDP_PORTID_SUBTYPE_IFNAME;
+       hardware.h_lport.p_id = "Not used";
+       hardware.h_lport.p_id_len = strlen(hardware.h_lport.p_id);
+       hardware.h_lport.p_descr = "FastEthernet 1/5";
+       chassis.c_id_subtype = LLDP_CHASSISID_SUBTYPE_LLADDR;
+       chassis.c_id = macaddress;
+       chassis.c_id_len = ETH_ALEN;
+       chassis.c_name = "First chassis";
+       chassis.c_descr = "Chassis description";
+       chassis.c_cap_available = chassis.c_cap_enabled = LLDP_CAP_ROUTER;
+       chassis.c_mgmt.s_addr = inet_addr("172.17.142.37");
+
+       /* Build packet */
+       n = cdpv1_send(NULL, &hardware);
+       if (n != 0) {
+               fail("unable to build packet");
+               return;
+       }
+       if (TAILQ_EMPTY(&pkts)) {
+               fail("no packets sent");
+               return;
+       }
+       pkt = TAILQ_FIRST(&pkts);
+       ck_assert_int_eq(pkt->size, sizeof(pkt1));
+       fail_unless(memcmp(pkt->data, pkt1, sizeof(pkt1)) == 0);
+       fail_unless(TAILQ_NEXT(pkt, next) == NULL, "more than one packet sent");
+}
+END_TEST
+
+START_TEST (test_send_cdpv2)
+{
+       int n;
+       /* Packet we should build:
+IEEE 802.3 Ethernet 
+    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
+    Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
+ the factory default)
+    Length: 111
+Logical-Link Control
+    DSAP: SNAP (0xaa)
+    IG Bit: Individual
+    SSAP: SNAP (0xaa)
+    CR Bit: Command
+    Control field: U, func=UI (0x03)
+        000. 00.. = Command: Unnumbered Information (0x00)
+        .... ..11 = Frame type: Unnumbered frame (0x03)
+    Organization Code: Cisco (0x00000c)
+    PID: CDP (0x2000)
+Cisco Discovery Protocol
+    Version: 2
+    TTL: 180 seconds
+    Checksum: 0x6926 [correct]
+        [Good: True]
+        [Bad : False]
+    Device ID: Second chassis
+        Type: Device ID (0x0001)
+        Length: 18
+        Device ID: Second chassis
+    Addresses
+        Type: Addresses (0x0002)
+        Length: 17
+        Number of addresses: 1
+        IP address: 172.17.142.36
+            Protocol type: NLPID
+            Protocol length: 1
+            Protocol: IP
+            Address length: 4
+            IP address: 172.17.142.36
+    Port ID: Gigabit Ethernet 5/8
+        Type: Port ID (0x0003)
+        Length: 24
+        Sent through Interface: Gigabit Ethernet 5/8
+    Capabilities
+        Type: Capabilities (0x0004)
+        Length: 8
+        Capabilities: 0x00000009
+            .... .... .... .... .... .... .... ...1 = Is  a Router
+            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
+            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
+            .... .... .... .... .... .... .... 1... = Is  a Switch
+            .... .... .... .... .... .... ...0 .... = Not a Host
+            .... .... .... .... .... .... ..0. .... = Not IGMP capable
+            .... .... .... .... .... .... .0.. .... = Not a Repeater
+    Software Version
+        Type: Software version (0x0005)
+        Length: 23
+        Software Version: Chassis description
+    Platform: Linux
+        Type: Platform (0x0006)
+        Length: 9
+        Platform: Linux
+       */
+       char pkt1[] = {
+         0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x5e, 0x10,
+         0x8e, 0xe7, 0x84, 0xad, 0x00, 0x6f, 0xaa, 0xaa,
+         0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x02, 0xb4,
+         0x69, 0x26, 0x00, 0x01, 0x00, 0x12, 0x53, 0x65,
+         0x63, 0x6f, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61,
+         0x73, 0x73, 0x69, 0x73, 0x00, 0x02, 0x00, 0x11,
+         0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xcc, 0x00,
+         0x04, 0xac, 0x11, 0x8e, 0x24, 0x00, 0x03, 0x00,
+         0x18, 0x47, 0x69, 0x67, 0x61, 0x62, 0x69, 0x74,
+         0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65,
+         0x74, 0x20, 0x35, 0x2f, 0x38, 0x00, 0x04, 0x00,
+         0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x05, 0x00,
+         0x17, 0x43, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73,
+         0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+         0x74, 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x09,
+         0x4c, 0x69, 0x6e, 0x75, 0x78 };
+       struct packet *pkt;
+
+       /* Populate port and chassis */
+       hardware.h_lport.p_id_subtype = LLDP_PORTID_SUBTYPE_LLADDR;
+       hardware.h_lport.p_id = macaddress;
+       hardware.h_lport.p_id_len = ETH_ALEN;
+       hardware.h_lport.p_descr = "Gigabit Ethernet 5/8";
+       chassis.c_id_subtype = LLDP_CHASSISID_SUBTYPE_LLADDR;
+       chassis.c_id = macaddress;
+       chassis.c_id_len = ETH_ALEN;
+       chassis.c_name = "Second chassis";
+       chassis.c_descr = "Chassis description";
+       chassis.c_cap_available = chassis.c_cap_enabled =
+         LLDP_CAP_ROUTER | LLDP_CAP_BRIDGE;
+       chassis.c_mgmt.s_addr = inet_addr("172.17.142.36");
+
+       /* Build packet */
+       n = cdpv2_send(NULL, &hardware);
+       if (n != 0) {
+               fail("unable to build packet");
+               return;
+       }
+       if (TAILQ_EMPTY(&pkts)) {
+               fail("no packets sent");
+               return;
+       }
+       pkt = TAILQ_FIRST(&pkts);
+       ck_assert_int_eq(pkt->size, sizeof(pkt1));
+       fail_unless(memcmp(pkt->data, pkt1, sizeof(pkt1)) == 0);
+       fail_unless(TAILQ_NEXT(pkt, next) == NULL, "more than one packet sent");
+}
+END_TEST
+
+START_TEST (test_recv_cdpv1)
+{
+       char pkt1[] = {
+               0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x00, 0xe0,
+               0x1e, 0xd5, 0xd5, 0x15, 0x01, 0x1e, 0xaa, 0xaa,
+               0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x01, 0xb4,
+               0xdf, 0xf0, 0x00, 0x01, 0x00, 0x06, 0x52, 0x31,
+               0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01,
+               0x01, 0x01, 0xcc, 0x00, 0x04, 0xc0, 0xa8, 0x0a,
+               0x01, 0x00, 0x03, 0x00, 0x0d, 0x45, 0x74, 0x68,
+               0x65, 0x72, 0x6e, 0x65, 0x74, 0x30, 0x00, 0x04,
+               0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05,
+               0x00, 0xd8, 0x43, 0x69, 0x73, 0x63, 0x6f, 0x20,
+               0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+               0x77, 0x6f, 0x72, 0x6b, 0x20, 0x4f, 0x70, 0x65,
+               0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x53,
+               0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x6f,
+               0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x0a,
+               0x49, 0x4f, 0x53, 0x20, 0x28, 0x74, 0x6d, 0x29,
+               0x20, 0x31, 0x36, 0x30, 0x30, 0x20, 0x53, 0x6f,
+               0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x28,
+               0x43, 0x31, 0x36, 0x30, 0x30, 0x2d, 0x4e, 0x59,
+               0x2d, 0x4c, 0x29, 0x2c, 0x20, 0x56, 0x65, 0x72,
+               0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x31, 0x2e,
+               0x32, 0x28, 0x31, 0x32, 0x29, 0x50, 0x2c, 0x20,
+               0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x20,
+               0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45,
+               0x20, 0x28, 0x66, 0x63, 0x31, 0x29, 0x0a, 0x43,
+               0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
+               0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x38,
+               0x36, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x20, 0x62,
+               0x79, 0x20, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x20,
+               0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c,
+               0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x43, 0x6f,
+               0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x54,
+               0x75, 0x65, 0x20, 0x30, 0x33, 0x2d, 0x4d, 0x61,
+               0x72, 0x2d, 0x39, 0x38, 0x20, 0x30, 0x36, 0x3a,
+               0x33, 0x33, 0x20, 0x62, 0x79, 0x20, 0x64, 0x73,
+               0x63, 0x68, 0x77, 0x61, 0x72, 0x74, 0x00, 0x06,
+               0x00, 0x0e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x20,
+               0x31, 0x36, 0x30, 0x31 };
+       /* This is:
+IEEE 802.3 Ethernet 
+    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
+    Source: Cisco_d5:d5:15 (00:e0:1e:d5:d5:15)
+    Length: 286
+Logical-Link Control
+    DSAP: SNAP (0xaa)
+    IG Bit: Individual
+    SSAP: SNAP (0xaa)
+    CR Bit: Command
+    Control field: U, func=UI (0x03)
+        000. 00.. = Command: Unnumbered Information (0x00)
+        .... ..11 = Frame type: Unnumbered frame (0x03)
+    Organization Code: Cisco (0x00000c)
+    PID: CDP (0x2000)
+Cisco Discovery Protocol
+    Version: 1
+    TTL: 180 seconds
+    Checksum: 0xdff0 [correct]
+        [Good: True]
+        [Bad : False]
+    Device ID: R1
+        Type: Device ID (0x0001)
+        Length: 6
+        Device ID: R1
+    Addresses
+        Type: Addresses (0x0002)
+        Length: 17
+        Number of addresses: 1
+        IP address: 192.168.10.1
+            Protocol type: NLPID
+            Protocol length: 1
+            Protocol: IP
+            Address length: 4
+            IP address: 192.168.10.1
+    Port ID: Ethernet0
+        Type: Port ID (0x0003)
+        Length: 13
+        Sent through Interface: Ethernet0
+    Capabilities
+        Type: Capabilities (0x0004)
+        Length: 8
+        Capabilities: 0x00000001
+            .... .... .... .... .... .... .... ...1 = Is  a Router
+            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
+            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
+            .... .... .... .... .... .... .... 0... = Not a Switch
+            .... .... .... .... .... .... ...0 .... = Not a Host
+            .... .... .... .... .... .... ..0. .... = Not IGMP capable
+            .... .... .... .... .... .... .0.. .... = Not a Repeater
+    Software Version
+        Type: Software version (0x0005)
+        Length: 216
+        Software Version: Cisco Internetwork Operating System Software 
+                          IOS (tm) 1600 Software (C1600-NY-L), Version 11.2(12)P, RELEASE SOFTWARE (fc1)
+                          Copyright (c) 1986-1998 by cisco Systems, Inc.
+                          Compiled Tue 03-Mar-98 06:33 by dschwart
+    Platform: cisco 1601
+        Type: Platform (0x0006)
+        Length: 14
+        Platform: cisco 1601
+       */
+       struct lldpd_chassis *nchassis = NULL;
+       struct lldpd_port *nport = NULL;
+
+       fail_unless(cdpv1_guess(pkt1, sizeof(pkt1)));
+       fail_unless(cdp_decode(NULL, pkt1, sizeof(pkt1), &hardware,
+               &nchassis, &nport) != -1);
+       if (!nchassis || !nport) {
+               fail("unable to decode packet");
+               return;
+       }
+       ck_assert_int_eq(nchassis->c_id_subtype,
+           LLDP_CHASSISID_SUBTYPE_LOCAL);
+       ck_assert_int_eq(nchassis->c_id_len, 2);
+       fail_unless(memcmp(nchassis->c_id, "R1", 2) == 0);
+       ck_assert_str_eq(nchassis->c_name, "R1");
+       ck_assert_int_eq(nchassis->c_mgmt.s_addr,
+           (u_int32_t)inet_addr("192.168.10.1"));
+       ck_assert_int_eq(nchassis->c_mgmt_if, 0);
+       ck_assert_int_eq(nport->p_id_subtype,
+           LLDP_PORTID_SUBTYPE_IFNAME);
+       ck_assert_int_eq(nport->p_id_len, strlen("Ethernet0"));
+       fail_unless(memcmp(nport->p_id,
+               "Ethernet0", strlen("Ethernet0")) == 0);
+       ck_assert_str_eq(nport->p_descr, "Ethernet0");
+       ck_assert_int_eq(nchassis->c_cap_enabled, LLDP_CAP_ROUTER);
+       ck_assert_str_eq(nchassis->c_descr,
+           "cisco 1601 running on\n"
+           "Cisco Internetwork Operating System Software \n"
+           "IOS (tm) 1600 Software (C1600-NY-L), Version 11.2(12)P, RELEASE SOFTWARE (fc1)\n"
+           "Copyright (c) 1986-1998 by cisco Systems, Inc.\n"
+           "Compiled Tue 03-Mar-98 06:33 by dschwart");
+}
+END_TEST
+
+START_TEST (test_recv_cdpv2)
+{
+       char pkt1[] = {
+               0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0xca, 0x00,
+               0x68, 0x46, 0x00, 0x00, 0x01, 0x30, 0xaa, 0xaa,
+               0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x02, 0xb4,
+               0x54, 0x27, 0x00, 0x01, 0x00, 0x0f, 0x72, 0x74,
+               0x62, 0x67, 0x36, 0x74, 0x65, 0x73, 0x74, 0x30,
+               0x31, 0x00, 0x05, 0x00, 0xd3, 0x43, 0x69, 0x73,
+               0x63, 0x6f, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72,
+               0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20,
+               0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e,
+               0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+               0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
+               0x65, 0x20, 0x0a, 0x49, 0x4f, 0x53, 0x20, 0x28,
+               0x74, 0x6d, 0x29, 0x20, 0x37, 0x32, 0x30, 0x30,
+               0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
+               0x65, 0x20, 0x28, 0x43, 0x37, 0x32, 0x30, 0x30,
+               0x2d, 0x50, 0x2d, 0x4d, 0x29, 0x2c, 0x20, 0x56,
+               0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31,
+               0x32, 0x2e, 0x32, 0x28, 0x34, 0x36, 0x29, 0x2c,
+               0x20, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45,
+               0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52,
+               0x45, 0x20, 0x28, 0x66, 0x63, 0x31, 0x29, 0x0a,
+               0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68,
+               0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39,
+               0x38, 0x36, 0x2d, 0x32, 0x30, 0x30, 0x37, 0x20,
+               0x62, 0x79, 0x20, 0x63, 0x69, 0x73, 0x63, 0x6f,
+               0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+               0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x43,
+               0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20,
+               0x54, 0x68, 0x75, 0x20, 0x32, 0x36, 0x2d, 0x41,
+               0x70, 0x72, 0x2d, 0x30, 0x37, 0x20, 0x32, 0x31,
+               0x3a, 0x35, 0x36, 0x20, 0x62, 0x79, 0x20, 0x70,
+               0x77, 0x61, 0x64, 0x65, 0x00, 0x06, 0x00, 0x11,
+               0x63, 0x69, 0x73, 0x63, 0x6f, 0x20, 0x37, 0x32,
+               0x30, 0x36, 0x56, 0x58, 0x52, 0x00, 0x02, 0x00,
+               0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xcc,
+               0x00, 0x04, 0xac, 0x42, 0x37, 0x03, 0x00, 0x03,
+               0x00, 0x13, 0x46, 0x61, 0x73, 0x74, 0x45, 0x74,
+               0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x30, 0x2f,
+               0x30, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x0b, 0x00, 0x05, 0x00 };
+       /* This is:
+IEEE 802.3 Ethernet 
+    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
+    Source: ca:00:68:46:00:00 (ca:00:68:46:00:00)
+    Length: 304
+Logical-Link Control
+    DSAP: SNAP (0xaa)
+    IG Bit: Individual
+    SSAP: SNAP (0xaa)
+    CR Bit: Command
+    Control field: U, func=UI (0x03)
+        000. 00.. = Command: Unnumbered Information (0x00)
+        .... ..11 = Frame type: Unnumbered frame (0x03)
+    Organization Code: Cisco (0x00000c)
+    PID: CDP (0x2000)
+Cisco Discovery Protocol
+    Version: 2
+    TTL: 180 seconds
+    Checksum: 0x5427 [correct]
+        [Good: True]
+        [Bad : False]
+    Device ID: rtbg6test01
+        Type: Device ID (0x0001)
+        Length: 15
+        Device ID: rtbg6test01
+    Software Version
+        Type: Software version (0x0005)
+        Length: 211
+        Software Version: Cisco Internetwork Operating System Software 
+                          IOS (tm) 7200 Software (C7200-P-M), Version 12.2(46), RELEASE SOFTWARE (fc1)
+                          Copyright (c) 1986-2007 by cisco Systems, Inc.
+                          Compiled Thu 26-Apr-07 21:56 by pwade
+    Platform: cisco 7206VXR
+        Type: Platform (0x0006)
+        Length: 17
+        Platform: cisco 7206VXR
+    Addresses
+        Type: Addresses (0x0002)
+        Length: 17
+        Number of addresses: 1
+        IP address: 172.66.55.3
+            Protocol type: NLPID
+            Protocol length: 1
+            Protocol: IP
+            Address length: 4
+            IP address: 172.66.55.3
+    Port ID: FastEthernet0/0
+        Type: Port ID (0x0003)
+        Length: 19
+        Sent through Interface: FastEthernet0/0
+    Capabilities
+        Type: Capabilities (0x0004)
+        Length: 8
+        Capabilities: 0x00000000
+            .... .... .... .... .... .... .... ...0 = Not a Router
+            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
+            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
+            .... .... .... .... .... .... .... 0... = Not a Switch
+            .... .... .... .... .... .... ...0 .... = Not a Host
+            .... .... .... .... .... .... ..0. .... = Not IGMP capable
+            .... .... .... .... .... .... .0.. .... = Not a Repeater
+    Duplex: Half
+        Type: Duplex (0x000b)
+        Length: 5
+        Duplex: Half
+       */
+       struct lldpd_chassis *nchassis = NULL;
+       struct lldpd_port *nport = NULL;
+
+       fail_unless(cdpv2_guess(pkt1, sizeof(pkt1)));
+       fail_unless(cdp_decode(NULL, pkt1, sizeof(pkt1), &hardware,
+               &nchassis, &nport) != -1);
+       if (!nchassis || !nport) {
+               fail("unable to decode packet");
+               return;
+       }
+       ck_assert_int_eq(nchassis->c_id_subtype,
+           LLDP_CHASSISID_SUBTYPE_LOCAL);
+       ck_assert_int_eq(nchassis->c_id_len, strlen("rtbg6test01"));
+       fail_unless(memcmp(nchassis->c_id,
+               "rtbg6test01", strlen("rtbg6test01")) == 0);
+       ck_assert_str_eq(nchassis->c_name, "rtbg6test01");
+       ck_assert_int_eq(nchassis->c_mgmt.s_addr,
+           (u_int32_t)inet_addr("172.66.55.3"));
+       ck_assert_int_eq(nchassis->c_mgmt_if, 0);
+       ck_assert_int_eq(nport->p_id_subtype,
+           LLDP_PORTID_SUBTYPE_IFNAME);
+       ck_assert_int_eq(nport->p_id_len, strlen("FastEthernet0/0"));
+       fail_unless(memcmp(nport->p_id,
+               "FastEthernet0/0", strlen("FastEthernet0/0")) == 0);
+       ck_assert_str_eq(nport->p_descr, "FastEthernet0/0");
+       ck_assert_int_eq(nchassis->c_cap_enabled, LLDP_CAP_STATION);
+       ck_assert_str_eq(nchassis->c_descr,
+           "cisco 7206VXR running on\n"
+           "Cisco Internetwork Operating System Software \n"
+           "IOS (tm) 7200 Software (C7200-P-M), Version 12.2(46), RELEASE SOFTWARE (fc1)\n"
+           "Copyright (c) 1986-2007 by cisco Systems, Inc.\n"
+           "Compiled Thu 26-Apr-07 21:56 by pwade");
+}
+END_TEST
+
+#endif
+
+Suite *
+cdp_suite(void)
+{
+       Suite *s = suite_create("CDP");
+
+#ifdef ENABLE_CDP
+       TCase *tc_send = tcase_create("Send CDP packets");
+       tcase_add_checked_fixture(tc_send, pcap_setup, pcap_teardown);
+       tcase_add_test(tc_send, test_send_cdpv1);
+       tcase_add_test(tc_send, test_send_cdpv2);
+       suite_add_tcase(s, tc_send);
+
+       TCase *tc_receive = tcase_create("Receive CDP packets");
+       tcase_add_test(tc_receive, test_recv_cdpv1);
+       tcase_add_test(tc_receive, test_recv_cdpv2);
+       suite_add_tcase(s, tc_receive);
+#endif
+
+       return s;
+}
+
+int
+main()
+{
+       int number_failed;
+       Suite *s = cdp_suite ();
+       SRunner *sr = srunner_create (s);
+       srunner_set_fork_status (sr, CK_NOFORK); /* Can't fork because
+                                                   we need to write
+                                                   files */
+       srunner_run_all (sr, CK_ENV);
+       number_failed = srunner_ntests_failed (sr);
+       srunner_free (sr);
+       return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}