Blame tests/check_cdp.c

Packit e9ba0d
/* -*- mode: c; c-file-style: "openbsd" -*- */
Packit e9ba0d
/*
Packit e9ba0d
 * Copyright (c) 2015 Vincent Bernat <bernat@luffy.cx>
Packit e9ba0d
 *
Packit e9ba0d
 * Permission to use, copy, modify, and/or distribute this software for any
Packit e9ba0d
 * purpose with or without fee is hereby granted, provided that the above
Packit e9ba0d
 * copyright notice and this permission notice appear in all copies.
Packit e9ba0d
 *
Packit e9ba0d
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Packit e9ba0d
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Packit e9ba0d
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Packit e9ba0d
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit e9ba0d
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Packit e9ba0d
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Packit e9ba0d
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit e9ba0d
 */
Packit e9ba0d
Packit e9ba0d
#include <stdlib.h>
Packit e9ba0d
#include <sys/socket.h>
Packit e9ba0d
#include <arpa/inet.h>
Packit e9ba0d
#include <netinet/in.h>
Packit e9ba0d
#include <check.h>
Packit e9ba0d
#include "common.h"
Packit e9ba0d
Packit e9ba0d
char filenameprefix[] = "cdp_send";
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_CDP
Packit e9ba0d
Packit e9ba0d
START_TEST (test_send_cdpv1)
Packit e9ba0d
{
Packit e9ba0d
	int n;
Packit e9ba0d
	/* Packet we should build:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
Packit e9ba0d
    Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
Packit e9ba0d
    Length: 106
Packit e9ba0d
Logical-Link Control
Packit e9ba0d
    DSAP: SNAP (0xaa)
Packit e9ba0d
    IG Bit: Individual
Packit e9ba0d
    SSAP: SNAP (0xaa)
Packit e9ba0d
    CR Bit: Command
Packit e9ba0d
    Control field: U, func=UI (0x03)
Packit e9ba0d
        000. 00.. = Command: Unnumbered Information (0x00)
Packit e9ba0d
        .... ..11 = Frame type: Unnumbered frame (0x03)
Packit e9ba0d
    Organization Code: Cisco (0x00000c)
Packit e9ba0d
    PID: CDP (0x2000)
Packit e9ba0d
Cisco Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    TTL: 180 seconds
Packit e9ba0d
    Checksum: 0x3af7 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Device ID: First chassis
Packit e9ba0d
        Type: Device ID (0x0001)
Packit e9ba0d
        Length: 17
Packit e9ba0d
        Device ID: First chassis
Packit e9ba0d
    Addresses
Packit e9ba0d
        Type: Addresses (0x0002)
Packit e9ba0d
        Length: 17
Packit e9ba0d
        Number of addresses: 1
Packit e9ba0d
        IP address: 172.17.142.37
Packit e9ba0d
            Protocol type: NLPID
Packit e9ba0d
            Protocol length: 1
Packit e9ba0d
            Protocol: IP
Packit e9ba0d
            Address length: 4
Packit e9ba0d
            IP address: 172.17.142.37
Packit e9ba0d
    Port ID: FastEthernet 1/5
Packit e9ba0d
        Type: Port ID (0x0003)
Packit e9ba0d
        Length: 20
Packit e9ba0d
        Sent through Interface: FastEthernet 1/5
Packit e9ba0d
    Capabilities
Packit e9ba0d
        Type: Capabilities (0x0004)
Packit e9ba0d
        Length: 8
Packit e9ba0d
        Capabilities: 0x00000011
Packit e9ba0d
            .... .... .... .... .... .... .... ...1 = Is  a Router
Packit e9ba0d
            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... 0... = Not a Switch
Packit e9ba0d
            .... .... .... .... .... .... ...1 .... = Is  a Host
Packit e9ba0d
            .... .... .... .... .... .... ..0. .... = Not IGMP capable
Packit e9ba0d
            .... .... .... .... .... .... .0.. .... = Not a Repeater
Packit e9ba0d
    Software Version
Packit e9ba0d
        Type: Software version (0x0005)
Packit e9ba0d
        Length: 23
Packit e9ba0d
        Software Version: Chassis description
Packit e9ba0d
    Platform: Linux
Packit e9ba0d
        Type: Platform (0x0006)
Packit e9ba0d
        Length: 9
Packit e9ba0d
        Platform: Linux
Packit e9ba0d
	*/
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
	  0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x5e, 0x10,
Packit e9ba0d
	  0x8e, 0xe7, 0x84, 0xad, 0x00, 0x6a, 0xaa, 0xaa,
Packit e9ba0d
	  0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x01, 0xb4,
Packit e9ba0d
	  0x3a, 0xf7, 0x00, 0x01, 0x00, 0x11, 0x46, 0x69,
Packit e9ba0d
	  0x72, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x73,
Packit e9ba0d
	  0x73, 0x69, 0x73, 0x00, 0x02, 0x00, 0x11, 0x00,
Packit e9ba0d
	  0x00, 0x00, 0x01, 0x01, 0x01, 0xcc, 0x00, 0x04,
Packit e9ba0d
	  0xac, 0x11, 0x8e, 0x25, 0x00, 0x03, 0x00, 0x14,
Packit e9ba0d
	  0x46, 0x61, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65,
Packit e9ba0d
	  0x72, 0x6e, 0x65, 0x74, 0x20, 0x31, 0x2f, 0x35,
Packit e9ba0d
	  0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x11,
Packit e9ba0d
	  0x00, 0x05, 0x00, 0x17, 0x43, 0x68, 0x61, 0x73,
Packit e9ba0d
	  0x73, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63,
Packit e9ba0d
	  0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00,
Packit e9ba0d
	  0x06, 0x00, 0x09, 0x4c, 0x69, 0x6e, 0x75, 0x78 };
Packit e9ba0d
	struct packet *pkt;
Packit e9ba0d
	in_addr_t addr;
Packit e9ba0d
	struct lldpd_mgmt *mgmt;
Packit e9ba0d
	struct lldpd cfg = {
Packit e9ba0d
		.g_config = {
Packit e9ba0d
			.c_ttl = 180,
Packit e9ba0d
			.c_platform = "Linux"
Packit e9ba0d
		}
Packit e9ba0d
	};
Packit e9ba0d
Packit e9ba0d
	/* Populate port and chassis */
Packit e9ba0d
	hardware.h_lport.p_id_subtype = LLDP_PORTID_SUBTYPE_IFNAME;
Packit e9ba0d
	hardware.h_lport.p_id = "Not used";
Packit e9ba0d
	hardware.h_lport.p_id_len = strlen(hardware.h_lport.p_id);
Packit e9ba0d
	hardware.h_lport.p_descr = "FastEthernet 1/5";
Packit e9ba0d
	chassis.c_id_subtype = LLDP_CHASSISID_SUBTYPE_LLADDR;
Packit e9ba0d
	chassis.c_id = macaddress;
Packit e9ba0d
	chassis.c_id_len = ETHER_ADDR_LEN;
Packit e9ba0d
	chassis.c_name = "First chassis";
Packit e9ba0d
	chassis.c_descr = "Chassis description";
Packit e9ba0d
	chassis.c_cap_available = chassis.c_cap_enabled = LLDP_CAP_ROUTER;
Packit e9ba0d
	TAILQ_INIT(&chassis.c_mgmt);
Packit e9ba0d
	addr = inet_addr("172.17.142.37");
Packit e9ba0d
	mgmt = lldpd_alloc_mgmt(LLDPD_AF_IPV4, 
Packit e9ba0d
					&addr, sizeof(in_addr_t), 0);
Packit e9ba0d
	if (mgmt == NULL)
Packit e9ba0d
		ck_abort();
Packit e9ba0d
	TAILQ_INSERT_TAIL(&chassis.c_mgmt, mgmt, m_entries);
Packit e9ba0d
Packit e9ba0d
	/* Build packet */
Packit e9ba0d
	n = cdpv1_send(&cfg, &hardware);
Packit e9ba0d
	if (n != 0) {
Packit e9ba0d
		fail("unable to build packet");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	if (TAILQ_EMPTY(&pkts)) {
Packit e9ba0d
		fail("no packets sent");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	pkt = TAILQ_FIRST(&pkts);
Packit e9ba0d
	ck_assert_int_eq(pkt->size, sizeof(pkt1));
Packit e9ba0d
	fail_unless(memcmp(pkt->data, pkt1, sizeof(pkt1)) == 0);
Packit e9ba0d
	fail_unless(TAILQ_NEXT(pkt, next) == NULL, "more than one packet sent");
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
Packit e9ba0d
START_TEST (test_send_cdpv2)
Packit e9ba0d
{
Packit e9ba0d
	int n;
Packit e9ba0d
	/* Packet we should build:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
Packit e9ba0d
    Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
Packit e9ba0d
 the factory default)
Packit e9ba0d
    Length: 111
Packit e9ba0d
Logical-Link Control
Packit e9ba0d
    DSAP: SNAP (0xaa)
Packit e9ba0d
    IG Bit: Individual
Packit e9ba0d
    SSAP: SNAP (0xaa)
Packit e9ba0d
    CR Bit: Command
Packit e9ba0d
    Control field: U, func=UI (0x03)
Packit e9ba0d
        000. 00.. = Command: Unnumbered Information (0x00)
Packit e9ba0d
        .... ..11 = Frame type: Unnumbered frame (0x03)
Packit e9ba0d
    Organization Code: Cisco (0x00000c)
Packit e9ba0d
    PID: CDP (0x2000)
Packit e9ba0d
Cisco Discovery Protocol
Packit e9ba0d
    Version: 2
Packit e9ba0d
    TTL: 180 seconds
Packit e9ba0d
    Checksum: 0x5926 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Device ID: Second chassis
Packit e9ba0d
        Type: Device ID (0x0001)
Packit e9ba0d
        Length: 18
Packit e9ba0d
        Device ID: Second chassis
Packit e9ba0d
    Addresses
Packit e9ba0d
        Type: Addresses (0x0002)
Packit e9ba0d
        Length: 26
Packit e9ba0d
        Number of addresses: 2
Packit e9ba0d
        IP address: 172.17.142.36
Packit e9ba0d
            Protocol type: NLPID
Packit e9ba0d
            Protocol length: 1
Packit e9ba0d
            Protocol: IP
Packit e9ba0d
            Address length: 4
Packit e9ba0d
            IP address: 172.17.142.36
Packit e9ba0d
        IP address: 172.17.142.38
Packit e9ba0d
            Protocol type: NLPID
Packit e9ba0d
            Protocol length: 1
Packit e9ba0d
            Protocol: IP
Packit e9ba0d
            Address length: 4
Packit e9ba0d
            IP address: 172.17.142.38
Packit e9ba0d
    Port ID: Gigabit Ethernet 5/8
Packit e9ba0d
        Type: Port ID (0x0003)
Packit e9ba0d
        Length: 24
Packit e9ba0d
        Sent through Interface: Gigabit Ethernet 5/8
Packit e9ba0d
    Capabilities
Packit e9ba0d
        Type: Capabilities (0x0004)
Packit e9ba0d
        Length: 8
Packit e9ba0d
        Capabilities: 0x00000019
Packit e9ba0d
            .... .... .... .... .... .... .... ...1 = Is  a Router
Packit e9ba0d
            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... 1... = Is  a Switch
Packit e9ba0d
            .... .... .... .... .... .... ...1 .... = Is  a Host
Packit e9ba0d
            .... .... .... .... .... .... ..0. .... = Not IGMP capable
Packit e9ba0d
            .... .... .... .... .... .... .0.. .... = Not a Repeater
Packit e9ba0d
    Software Version
Packit e9ba0d
        Type: Software version (0x0005)
Packit e9ba0d
        Length: 23
Packit e9ba0d
        Software Version: Chassis description
Packit e9ba0d
    Platform: Linux
Packit e9ba0d
        Type: Platform (0x0006)
Packit e9ba0d
        Length: 9
Packit e9ba0d
        Platform: Linux
Packit e9ba0d
	*/
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
	  0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x5e, 0x10,
Packit e9ba0d
	  0x8e, 0xe7, 0x84, 0xad, 0x00, 0x78, 0xaa, 0xaa,
Packit e9ba0d
	  0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x02, 0xb4,
Packit e9ba0d
	  0xc8, 0x67, 0x00, 0x01, 0x00, 0x12, 0x53, 0x65,
Packit e9ba0d
	  0x63, 0x6f, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61,
Packit e9ba0d
	  0x73, 0x73, 0x69, 0x73, 0x00, 0x02, 0x00, 0x1a,
Packit e9ba0d
	  0x00, 0x00, 0x00, 0x02, 0x01, 0x01, 0xcc, 0x00,
Packit e9ba0d
	  0x04, 0xac, 0x11, 0x8e, 0x24, 0x01, 0x01, 0xcc,
Packit e9ba0d
	  0x00, 0x04, 0xac, 0x11, 0x8e, 0x26, 0x00, 0x03,
Packit e9ba0d
	  0x00, 0x18, 0x47, 0x69, 0x67, 0x61, 0x62, 0x69,
Packit e9ba0d
	  0x74, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e,
Packit e9ba0d
	  0x65, 0x74, 0x20, 0x35, 0x2f, 0x38, 0x00, 0x04,
Packit e9ba0d
	  0x00, 0x08, 0x00, 0x00, 0x00, 0x19, 0x00, 0x05,
Packit e9ba0d
	  0x00, 0x17, 0x43, 0x68, 0x61, 0x73, 0x73, 0x69,
Packit e9ba0d
	  0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
Packit e9ba0d
	  0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00,
Packit e9ba0d
	  0x09, 0x4c, 0x69, 0x6e, 0x75, 0x78 };
Packit e9ba0d
	struct packet *pkt;
Packit e9ba0d
	in_addr_t addr1;
Packit e9ba0d
	in_addr_t addr2;
Packit e9ba0d
	struct lldpd_mgmt *mgmt1;
Packit e9ba0d
	struct lldpd_mgmt *mgmt2;
Packit e9ba0d
	struct lldpd cfg = {
Packit e9ba0d
		.g_config = {
Packit e9ba0d
			.c_ttl = 180,
Packit e9ba0d
			.c_platform = "Linux"
Packit e9ba0d
		}
Packit e9ba0d
	};
Packit e9ba0d
Packit e9ba0d
	/* Populate port and chassis */
Packit e9ba0d
	hardware.h_lport.p_id_subtype = LLDP_PORTID_SUBTYPE_LLADDR;
Packit e9ba0d
	hardware.h_lport.p_id = macaddress;
Packit e9ba0d
	hardware.h_lport.p_id_len = ETHER_ADDR_LEN;
Packit e9ba0d
	hardware.h_lport.p_descr = "Gigabit Ethernet 5/8";
Packit e9ba0d
	chassis.c_id_subtype = LLDP_CHASSISID_SUBTYPE_LLADDR;
Packit e9ba0d
	chassis.c_id = macaddress;
Packit e9ba0d
	chassis.c_id_len = ETHER_ADDR_LEN;
Packit e9ba0d
	chassis.c_name = "Second chassis";
Packit e9ba0d
	chassis.c_descr = "Chassis description";
Packit e9ba0d
	chassis.c_cap_available = chassis.c_cap_enabled =
Packit e9ba0d
	  LLDP_CAP_ROUTER | LLDP_CAP_BRIDGE;
Packit e9ba0d
	TAILQ_INIT(&chassis.c_mgmt);
Packit e9ba0d
	addr1 = inet_addr("172.17.142.36");
Packit e9ba0d
	addr2 = inet_addr("172.17.142.38");
Packit e9ba0d
	mgmt1 = lldpd_alloc_mgmt(LLDPD_AF_IPV4, 
Packit e9ba0d
				 &addr1, sizeof(in_addr_t), 0);
Packit e9ba0d
	mgmt2 = lldpd_alloc_mgmt(LLDPD_AF_IPV4, 
Packit e9ba0d
				 &addr2, sizeof(in_addr_t), 0);
Packit e9ba0d
	if (mgmt1 == NULL || mgmt2 == NULL)
Packit e9ba0d
		ck_abort();
Packit e9ba0d
	TAILQ_INSERT_TAIL(&chassis.c_mgmt, mgmt1, m_entries);
Packit e9ba0d
	TAILQ_INSERT_TAIL(&chassis.c_mgmt, mgmt2, m_entries);
Packit e9ba0d
Packit e9ba0d
	/* Build packet */
Packit e9ba0d
	n = cdpv2_send(&cfg, &hardware);
Packit e9ba0d
	if (n != 0) {
Packit e9ba0d
		fail("unable to build packet");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	if (TAILQ_EMPTY(&pkts)) {
Packit e9ba0d
		fail("no packets sent");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	pkt = TAILQ_FIRST(&pkts);
Packit e9ba0d
	ck_assert_int_eq(pkt->size, sizeof(pkt1));
Packit e9ba0d
	fail_unless(memcmp(pkt->data, pkt1, sizeof(pkt1)) == 0);
Packit e9ba0d
	fail_unless(TAILQ_NEXT(pkt, next) == NULL, "more than one packet sent");
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
Packit e9ba0d
START_TEST (test_recv_cdpv1)
Packit e9ba0d
{
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
		0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x00, 0xe0,
Packit e9ba0d
		0x1e, 0xd5, 0xd5, 0x15, 0x01, 0x1e, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x01, 0xb4,
Packit e9ba0d
		0xdf, 0xf0, 0x00, 0x01, 0x00, 0x06, 0x52, 0x31,
Packit e9ba0d
		0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01,
Packit e9ba0d
		0x01, 0x01, 0xcc, 0x00, 0x04, 0xc0, 0xa8, 0x0a,
Packit e9ba0d
		0x01, 0x00, 0x03, 0x00, 0x0d, 0x45, 0x74, 0x68,
Packit e9ba0d
		0x65, 0x72, 0x6e, 0x65, 0x74, 0x30, 0x00, 0x04,
Packit e9ba0d
		0x00, 0x08, 0x00, 0x00, 0x00, 0x11, 0x00, 0x05,
Packit e9ba0d
		0x00, 0xd8, 0x43, 0x69, 0x73, 0x63, 0x6f, 0x20,
Packit e9ba0d
		0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
Packit e9ba0d
		0x77, 0x6f, 0x72, 0x6b, 0x20, 0x4f, 0x70, 0x65,
Packit e9ba0d
		0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x53,
Packit e9ba0d
		0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x6f,
Packit e9ba0d
		0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x0a,
Packit e9ba0d
		0x49, 0x4f, 0x53, 0x20, 0x28, 0x74, 0x6d, 0x29,
Packit e9ba0d
		0x20, 0x31, 0x36, 0x30, 0x30, 0x20, 0x53, 0x6f,
Packit e9ba0d
		0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x28,
Packit e9ba0d
		0x43, 0x31, 0x36, 0x30, 0x30, 0x2d, 0x4e, 0x59,
Packit e9ba0d
		0x2d, 0x4c, 0x29, 0x2c, 0x20, 0x56, 0x65, 0x72,
Packit e9ba0d
		0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x31, 0x2e,
Packit e9ba0d
		0x32, 0x28, 0x31, 0x32, 0x29, 0x50, 0x2c, 0x20,
Packit e9ba0d
		0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x20,
Packit e9ba0d
		0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45,
Packit e9ba0d
		0x20, 0x28, 0x66, 0x63, 0x31, 0x29, 0x0a, 0x43,
Packit e9ba0d
		0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
Packit e9ba0d
		0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x38,
Packit e9ba0d
		0x36, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x20, 0x62,
Packit e9ba0d
		0x79, 0x20, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x20,
Packit e9ba0d
		0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c,
Packit e9ba0d
		0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x43, 0x6f,
Packit e9ba0d
		0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x54,
Packit e9ba0d
		0x75, 0x65, 0x20, 0x30, 0x33, 0x2d, 0x4d, 0x61,
Packit e9ba0d
		0x72, 0x2d, 0x39, 0x38, 0x20, 0x30, 0x36, 0x3a,
Packit e9ba0d
		0x33, 0x33, 0x20, 0x62, 0x79, 0x20, 0x64, 0x73,
Packit e9ba0d
		0x63, 0x68, 0x77, 0x61, 0x72, 0x74, 0x00, 0x06,
Packit e9ba0d
		0x00, 0x0e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x20,
Packit e9ba0d
		0x31, 0x36, 0x30, 0x31 };
Packit e9ba0d
	/* This is:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
Packit e9ba0d
    Source: Cisco_d5:d5:15 (00:e0:1e:d5:d5:15)
Packit e9ba0d
    Length: 286
Packit e9ba0d
Logical-Link Control
Packit e9ba0d
    DSAP: SNAP (0xaa)
Packit e9ba0d
    IG Bit: Individual
Packit e9ba0d
    SSAP: SNAP (0xaa)
Packit e9ba0d
    CR Bit: Command
Packit e9ba0d
    Control field: U, func=UI (0x03)
Packit e9ba0d
        000. 00.. = Command: Unnumbered Information (0x00)
Packit e9ba0d
        .... ..11 = Frame type: Unnumbered frame (0x03)
Packit e9ba0d
    Organization Code: Cisco (0x00000c)
Packit e9ba0d
    PID: CDP (0x2000)
Packit e9ba0d
Cisco Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    TTL: 180 seconds
Packit e9ba0d
    Checksum: 0xdff0 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Device ID: R1
Packit e9ba0d
        Type: Device ID (0x0001)
Packit e9ba0d
        Length: 6
Packit e9ba0d
        Device ID: R1
Packit e9ba0d
    Addresses
Packit e9ba0d
        Type: Addresses (0x0002)
Packit e9ba0d
        Length: 17
Packit e9ba0d
        Number of addresses: 1
Packit e9ba0d
        IP address: 192.168.10.1
Packit e9ba0d
            Protocol type: NLPID
Packit e9ba0d
            Protocol length: 1
Packit e9ba0d
            Protocol: IP
Packit e9ba0d
            Address length: 4
Packit e9ba0d
            IP address: 192.168.10.1
Packit e9ba0d
    Port ID: Ethernet0
Packit e9ba0d
        Type: Port ID (0x0003)
Packit e9ba0d
        Length: 13
Packit e9ba0d
        Sent through Interface: Ethernet0
Packit e9ba0d
    Capabilities
Packit e9ba0d
        Type: Capabilities (0x0004)
Packit e9ba0d
        Length: 8
Packit e9ba0d
        Capabilities: 0x00000011
Packit e9ba0d
            .... .... .... .... .... .... .... ...1 = Is  a Router
Packit e9ba0d
            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... 0... = Not a Switch
Packit e9ba0d
            .... .... .... .... .... .... ...1 .... = Is  a Host
Packit e9ba0d
            .... .... .... .... .... .... ..0. .... = Not IGMP capable
Packit e9ba0d
            .... .... .... .... .... .... .0.. .... = Not a Repeater
Packit e9ba0d
    Software Version
Packit e9ba0d
        Type: Software version (0x0005)
Packit e9ba0d
        Length: 216
Packit e9ba0d
        Software Version: Cisco Internetwork Operating System Software 
Packit e9ba0d
                          IOS (tm) 1600 Software (C1600-NY-L), Version 11.2(12)P, RELEASE SOFTWARE (fc1)
Packit e9ba0d
                          Copyright (c) 1986-1998 by cisco Systems, Inc.
Packit e9ba0d
                          Compiled Tue 03-Mar-98 06:33 by dschwart
Packit e9ba0d
    Platform: cisco 1601
Packit e9ba0d
        Type: Platform (0x0006)
Packit e9ba0d
        Length: 14
Packit e9ba0d
        Platform: cisco 1601
Packit e9ba0d
	*/
Packit e9ba0d
	struct lldpd_chassis *nchassis = NULL;
Packit e9ba0d
	struct lldpd_port *nport = NULL;
Packit e9ba0d
Packit e9ba0d
	fail_unless(cdpv1_guess(pkt1, sizeof(pkt1)));
Packit e9ba0d
	fail_unless(cdp_decode(NULL, pkt1, sizeof(pkt1), &hardware,
Packit e9ba0d
		&nchassis, &nport) != -1);
Packit e9ba0d
	if (!nchassis || !nport) {
Packit e9ba0d
		fail("unable to decode packet");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_id_subtype,
Packit e9ba0d
	    LLDP_CHASSISID_SUBTYPE_LOCAL);
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_id_len, 2);
Packit e9ba0d
	fail_unless(memcmp(nchassis->c_id, "R1", 2) == 0);
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_name, "R1");
Packit e9ba0d
	ck_assert_int_eq(TAILQ_FIRST(&nchassis->c_mgmt)->m_addr.inet.s_addr,
Packit e9ba0d
	    (u_int32_t)inet_addr("192.168.10.1"));
Packit e9ba0d
	ck_assert_int_eq(TAILQ_FIRST(&nchassis->c_mgmt)->m_iface, 0);
Packit e9ba0d
	ck_assert_int_eq(nport->p_id_subtype,
Packit e9ba0d
	    LLDP_PORTID_SUBTYPE_IFNAME);
Packit e9ba0d
	ck_assert_int_eq(nport->p_id_len, strlen("Ethernet0"));
Packit e9ba0d
	fail_unless(memcmp(nport->p_id,
Packit e9ba0d
		"Ethernet0", strlen("Ethernet0")) == 0);
Packit e9ba0d
	ck_assert_str_eq(nport->p_descr, "Ethernet0");
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_cap_enabled, LLDP_CAP_ROUTER);
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_descr,
Packit e9ba0d
	    "cisco 1601 running on\n"
Packit e9ba0d
	    "Cisco Internetwork Operating System Software \n"
Packit e9ba0d
	    "IOS (tm) 1600 Software (C1600-NY-L), Version 11.2(12)P, RELEASE SOFTWARE (fc1)\n"
Packit e9ba0d
	    "Copyright (c) 1986-1998 by cisco Systems, Inc.\n"
Packit e9ba0d
	    "Compiled Tue 03-Mar-98 06:33 by dschwart");
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
Packit e9ba0d
START_TEST (test_recv_cdpv2)
Packit e9ba0d
{
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
		0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0xca, 0x00,
Packit e9ba0d
		0x68, 0x46, 0x00, 0x00, 0x01, 0x30, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x02, 0xb4,
Packit e9ba0d
		0x54, 0x27, 0x00, 0x01, 0x00, 0x0f, 0x72, 0x74,
Packit e9ba0d
		0x62, 0x67, 0x36, 0x74, 0x65, 0x73, 0x74, 0x30,
Packit e9ba0d
		0x31, 0x00, 0x05, 0x00, 0xd3, 0x43, 0x69, 0x73,
Packit e9ba0d
		0x63, 0x6f, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72,
Packit e9ba0d
		0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20,
Packit e9ba0d
		0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e,
Packit e9ba0d
		0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
Packit e9ba0d
		0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
Packit e9ba0d
		0x65, 0x20, 0x0a, 0x49, 0x4f, 0x53, 0x20, 0x28,
Packit e9ba0d
		0x74, 0x6d, 0x29, 0x20, 0x37, 0x32, 0x30, 0x30,
Packit e9ba0d
		0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
Packit e9ba0d
		0x65, 0x20, 0x28, 0x43, 0x37, 0x32, 0x30, 0x30,
Packit e9ba0d
		0x2d, 0x50, 0x2d, 0x4d, 0x29, 0x2c, 0x20, 0x56,
Packit e9ba0d
		0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31,
Packit e9ba0d
		0x32, 0x2e, 0x32, 0x28, 0x34, 0x36, 0x29, 0x2c,
Packit e9ba0d
		0x20, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45,
Packit e9ba0d
		0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52,
Packit e9ba0d
		0x45, 0x20, 0x28, 0x66, 0x63, 0x31, 0x29, 0x0a,
Packit e9ba0d
		0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68,
Packit e9ba0d
		0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39,
Packit e9ba0d
		0x38, 0x36, 0x2d, 0x32, 0x30, 0x30, 0x37, 0x20,
Packit e9ba0d
		0x62, 0x79, 0x20, 0x63, 0x69, 0x73, 0x63, 0x6f,
Packit e9ba0d
		0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
Packit e9ba0d
		0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x43,
Packit e9ba0d
		0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20,
Packit e9ba0d
		0x54, 0x68, 0x75, 0x20, 0x32, 0x36, 0x2d, 0x41,
Packit e9ba0d
		0x70, 0x72, 0x2d, 0x30, 0x37, 0x20, 0x32, 0x31,
Packit e9ba0d
		0x3a, 0x35, 0x36, 0x20, 0x62, 0x79, 0x20, 0x70,
Packit e9ba0d
		0x77, 0x61, 0x64, 0x65, 0x00, 0x06, 0x00, 0x11,
Packit e9ba0d
		0x63, 0x69, 0x73, 0x63, 0x6f, 0x20, 0x37, 0x32,
Packit e9ba0d
		0x30, 0x36, 0x56, 0x58, 0x52, 0x00, 0x02, 0x00,
Packit e9ba0d
		0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xcc,
Packit e9ba0d
		0x00, 0x04, 0xac, 0x42, 0x37, 0x03, 0x00, 0x03,
Packit e9ba0d
		0x00, 0x13, 0x46, 0x61, 0x73, 0x74, 0x45, 0x74,
Packit e9ba0d
		0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x30, 0x2f,
Packit e9ba0d
		0x30, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x0b, 0x00, 0x05, 0x00 };
Packit e9ba0d
	/* This is:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: CDP/VTP/DTP/PAgP/UDLD (01:00:0c:cc:cc:cc)
Packit e9ba0d
    Source: ca:00:68:46:00:00 (ca:00:68:46:00:00)
Packit e9ba0d
    Length: 304
Packit e9ba0d
Logical-Link Control
Packit e9ba0d
    DSAP: SNAP (0xaa)
Packit e9ba0d
    IG Bit: Individual
Packit e9ba0d
    SSAP: SNAP (0xaa)
Packit e9ba0d
    CR Bit: Command
Packit e9ba0d
    Control field: U, func=UI (0x03)
Packit e9ba0d
        000. 00.. = Command: Unnumbered Information (0x00)
Packit e9ba0d
        .... ..11 = Frame type: Unnumbered frame (0x03)
Packit e9ba0d
    Organization Code: Cisco (0x00000c)
Packit e9ba0d
    PID: CDP (0x2000)
Packit e9ba0d
Cisco Discovery Protocol
Packit e9ba0d
    Version: 2
Packit e9ba0d
    TTL: 180 seconds
Packit e9ba0d
    Checksum: 0x5427 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Device ID: rtbg6test01
Packit e9ba0d
        Type: Device ID (0x0001)
Packit e9ba0d
        Length: 15
Packit e9ba0d
        Device ID: rtbg6test01
Packit e9ba0d
    Software Version
Packit e9ba0d
        Type: Software version (0x0005)
Packit e9ba0d
        Length: 211
Packit e9ba0d
        Software Version: Cisco Internetwork Operating System Software 
Packit e9ba0d
                          IOS (tm) 7200 Software (C7200-P-M), Version 12.2(46), RELEASE SOFTWARE (fc1)
Packit e9ba0d
                          Copyright (c) 1986-2007 by cisco Systems, Inc.
Packit e9ba0d
                          Compiled Thu 26-Apr-07 21:56 by pwade
Packit e9ba0d
    Platform: cisco 7206VXR
Packit e9ba0d
        Type: Platform (0x0006)
Packit e9ba0d
        Length: 17
Packit e9ba0d
        Platform: cisco 7206VXR
Packit e9ba0d
    Addresses
Packit e9ba0d
        Type: Addresses (0x0002)
Packit e9ba0d
        Length: 17
Packit e9ba0d
        Number of addresses: 1
Packit e9ba0d
        IP address: 172.66.55.3
Packit e9ba0d
            Protocol type: NLPID
Packit e9ba0d
            Protocol length: 1
Packit e9ba0d
            Protocol: IP
Packit e9ba0d
            Address length: 4
Packit e9ba0d
            IP address: 172.66.55.3
Packit e9ba0d
    Port ID: FastEthernet0/0
Packit e9ba0d
        Type: Port ID (0x0003)
Packit e9ba0d
        Length: 19
Packit e9ba0d
        Sent through Interface: FastEthernet0/0
Packit e9ba0d
    Capabilities
Packit e9ba0d
        Type: Capabilities (0x0004)
Packit e9ba0d
        Length: 8
Packit e9ba0d
        Capabilities: 0x00000000
Packit e9ba0d
            .... .... .... .... .... .... .... ...0 = Not a Router
Packit e9ba0d
            .... .... .... .... .... .... .... ..0. = Not a Transparent Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... .0.. = Not a Source Route Bridge
Packit e9ba0d
            .... .... .... .... .... .... .... 0... = Not a Switch
Packit e9ba0d
            .... .... .... .... .... .... ...0 .... = Not a Host
Packit e9ba0d
            .... .... .... .... .... .... ..0. .... = Not IGMP capable
Packit e9ba0d
            .... .... .... .... .... .... .0.. .... = Not a Repeater
Packit e9ba0d
    Duplex: Half
Packit e9ba0d
        Type: Duplex (0x000b)
Packit e9ba0d
        Length: 5
Packit e9ba0d
        Duplex: Half
Packit e9ba0d
	*/
Packit e9ba0d
	struct lldpd_chassis *nchassis = NULL;
Packit e9ba0d
	struct lldpd_port *nport = NULL;
Packit e9ba0d
Packit e9ba0d
	fail_unless(cdpv2_guess(pkt1, sizeof(pkt1)));
Packit e9ba0d
	fail_unless(cdp_decode(NULL, pkt1, sizeof(pkt1), &hardware,
Packit e9ba0d
		&nchassis, &nport) != -1);
Packit e9ba0d
	if (!nchassis || !nport) {
Packit e9ba0d
		fail("unable to decode packet");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_id_subtype,
Packit e9ba0d
	    LLDP_CHASSISID_SUBTYPE_LOCAL);
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_id_len, strlen("rtbg6test01"));
Packit e9ba0d
	fail_unless(memcmp(nchassis->c_id,
Packit e9ba0d
		"rtbg6test01", strlen("rtbg6test01")) == 0);
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_name, "rtbg6test01");
Packit e9ba0d
	ck_assert_int_eq(TAILQ_FIRST(&nchassis->c_mgmt)->m_addr.inet.s_addr,
Packit e9ba0d
	    (u_int32_t)inet_addr("172.66.55.3"));
Packit e9ba0d
	ck_assert_int_eq(TAILQ_FIRST(&nchassis->c_mgmt)->m_iface, 0);
Packit e9ba0d
	ck_assert_int_eq(nport->p_id_subtype,
Packit e9ba0d
	    LLDP_PORTID_SUBTYPE_IFNAME);
Packit e9ba0d
	ck_assert_int_eq(nport->p_id_len, strlen("FastEthernet0/0"));
Packit e9ba0d
	fail_unless(memcmp(nport->p_id,
Packit e9ba0d
		"FastEthernet0/0", strlen("FastEthernet0/0")) == 0);
Packit e9ba0d
	ck_assert_str_eq(nport->p_descr, "FastEthernet0/0");
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_cap_enabled, LLDP_CAP_STATION);
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_descr,
Packit e9ba0d
	    "cisco 7206VXR running on\n"
Packit e9ba0d
	    "Cisco Internetwork Operating System Software \n"
Packit e9ba0d
	    "IOS (tm) 7200 Software (C7200-P-M), Version 12.2(46), RELEASE SOFTWARE (fc1)\n"
Packit e9ba0d
	    "Copyright (c) 1986-2007 by cisco Systems, Inc.\n"
Packit e9ba0d
	    "Compiled Thu 26-Apr-07 21:56 by pwade");
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
Suite *
Packit e9ba0d
cdp_suite(void)
Packit e9ba0d
{
Packit e9ba0d
	Suite *s = suite_create("CDP");
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_CDP
Packit e9ba0d
	TCase *tc_send = tcase_create("Send CDP packets");
Packit e9ba0d
	TCase *tc_receive = tcase_create("Receive CDP packets");
Packit e9ba0d
Packit e9ba0d
	tcase_add_checked_fixture(tc_send, pcap_setup, pcap_teardown);
Packit e9ba0d
	tcase_add_test(tc_send, test_send_cdpv1);
Packit e9ba0d
	tcase_add_test(tc_send, test_send_cdpv2);
Packit e9ba0d
	suite_add_tcase(s, tc_send);
Packit e9ba0d
Packit e9ba0d
	tcase_add_test(tc_receive, test_recv_cdpv1);
Packit e9ba0d
	tcase_add_test(tc_receive, test_recv_cdpv2);
Packit e9ba0d
	suite_add_tcase(s, tc_receive);
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
	return s;
Packit e9ba0d
}
Packit e9ba0d
Packit e9ba0d
int
Packit e9ba0d
main()
Packit e9ba0d
{
Packit e9ba0d
	int number_failed;
Packit e9ba0d
	Suite *s = cdp_suite ();
Packit e9ba0d
	SRunner *sr = srunner_create (s);
Packit e9ba0d
	srunner_set_fork_status (sr, CK_NOFORK); /* Can't fork because
Packit e9ba0d
						    we need to write
Packit e9ba0d
						    files */
Packit e9ba0d
	srunner_run_all (sr, CK_ENV);
Packit e9ba0d
	number_failed = srunner_ntests_failed (sr);
Packit e9ba0d
	srunner_free (sr);
Packit e9ba0d
	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit e9ba0d
}