Blame tests/check_edp.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[] = "edp_send";
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_EDP
Packit e9ba0d
Packit e9ba0d
START_TEST (test_send_basic)
Packit e9ba0d
{
Packit e9ba0d
	int n;
Packit e9ba0d
	/* Packet we should build:
Packit e9ba0d
Extreme Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    Reserved: 0
Packit e9ba0d
    Data length: 74
Packit e9ba0d
    Checksum: 0xde22 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Sequence number: 0
Packit e9ba0d
    Machine ID type: MAC (0)
Packit e9ba0d
    Machine MAC: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
Packit e9ba0d
    Display: "First chassis"
Packit e9ba0d
        Marker 0x99, length 18, type 1 = Display
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Display (1)
Packit e9ba0d
            TLV length: 18
Packit e9ba0d
        Name: First chassis
Packit e9ba0d
    Info: Slot/Port: 1/4, Version: 7.6.4.99
Packit e9ba0d
        Marker 0x99, length 36, type 2 = Info
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Info (2)
Packit e9ba0d
            TLV length: 36
Packit e9ba0d
        Slot: 1
Packit e9ba0d
        Port: 4
Packit e9ba0d
        Virt chassis: 0
Packit e9ba0d
        Reserved: 000000000000
Packit e9ba0d
        Version: 7.6.4 Internal: 99
Packit e9ba0d
            Version: 0x07060463
Packit e9ba0d
            Version (major1): 7
Packit e9ba0d
            Version (major2): 6
Packit e9ba0d
            Version (sustaining): 4
Packit e9ba0d
            Version (internal): 99
Packit e9ba0d
        Connections: FFFFFFFF000000000000000000000000
Packit e9ba0d
    Null
Packit e9ba0d
        Marker 0x99, length 4, type 0 = Null
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Null (0)
Packit e9ba0d
            TLV length: 4
Packit e9ba0d
	 */
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
		0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00, 0x5e, 0x10,
Packit e9ba0d
		0x8e, 0xe7, 0x84, 0xad, 0x00, 0x52, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0xe0, 0x2b, 0x00, 0xbb, 0x01, 0x00,
Packit e9ba0d
		0x00, 0x4a, 0xde, 0x22, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x5e, 0x10, 0x8e, 0xe7, 0x84, 0xad, 0x99, 0x01,
Packit e9ba0d
		0x00, 0x12, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20,
Packit e9ba0d
		0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x00,
Packit e9ba0d
		0x99, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x03,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x07, 0x06, 0x04, 0x63, 0xff, 0xff, 0xff, 0xff,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x04 };
Packit e9ba0d
	struct packet *pkt;
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 = "Not used";
Packit e9ba0d
	strlcpy(hardware.h_ifname, "eth3", sizeof(hardware.h_ifname));
Packit e9ba0d
	hardware.h_ifindex = 4;
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
	/* Build packet */
Packit e9ba0d
	n = edp_send(NULL, &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
#ifdef ENABLE_DOT1
Packit e9ba0d
START_TEST (test_send_vlans)
Packit e9ba0d
{
Packit e9ba0d
	int n;
Packit e9ba0d
	/* Packets we should build:
Packit e9ba0d
Extreme Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    Reserved: 0
Packit e9ba0d
    Data length: 74
Packit e9ba0d
    Checksum: 0xde20 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Sequence number: 2
Packit e9ba0d
    Machine ID type: MAC (0)
Packit e9ba0d
    Machine MAC: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
Packit e9ba0d
    Display: "First chassis"
Packit e9ba0d
        Marker 0x99, length 18, type 1 = Display
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Display (1)
Packit e9ba0d
            TLV length: 18
Packit e9ba0d
        Name: First chassis
Packit e9ba0d
    Info: Slot/Port: 1/4, Version: 7.6.4.99
Packit e9ba0d
        Marker 0x99, length 36, type 2 = Info
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Info (2)
Packit e9ba0d
            TLV length: 36
Packit e9ba0d
        Slot: 1
Packit e9ba0d
        Port: 4
Packit e9ba0d
        Virt chassis: 0
Packit e9ba0d
        Reserved: 000000000000
Packit e9ba0d
        Version: 7.6.4 Internal: 99
Packit e9ba0d
            Version: 0x07060463
Packit e9ba0d
            Version (major1): 7
Packit e9ba0d
            Version (major2): 6
Packit e9ba0d
            Version (sustaining): 4
Packit e9ba0d
            Version (internal): 99
Packit e9ba0d
        Connections: FFFFFFFF000000000000000000000000
Packit e9ba0d
    Null
Packit e9ba0d
        Marker 0x99, length 4, type 0 = Null
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Null (0)
Packit e9ba0d
            TLV length: 4
Packit e9ba0d
Packit e9ba0d
Extreme Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    Reserved: 0
Packit e9ba0d
    Data length: 102
Packit e9ba0d
    Checksum: 0x28c4 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Sequence number: 3
Packit e9ba0d
    Machine ID type: MAC (0)
Packit e9ba0d
    Machine MAC: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
Packit e9ba0d
    Vlan: ID 157, Name "First VLAN"
Packit e9ba0d
        Marker 0x99, length 27, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 27
Packit e9ba0d
        Flags: 0x00
Packit e9ba0d
            0... .... = Flags-IP: Not set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 157
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 0.0.0.0 (0.0.0.0)
Packit e9ba0d
        Name: First VLAN
Packit e9ba0d
    Vlan: ID 1247, Name "Second VLAN"
Packit e9ba0d
        Marker 0x99, length 28, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 28
Packit e9ba0d
        Flags: 0x00
Packit e9ba0d
            0... .... = Flags-IP: Not set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 1247
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 0.0.0.0 (0.0.0.0)
Packit e9ba0d
        Name: Second VLAN
Packit e9ba0d
    Vlan: ID 741, Name "Third VLAN"
Packit e9ba0d
        Marker 0x99, length 27, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 27
Packit e9ba0d
        Flags: 0x00
Packit e9ba0d
            0... .... = Flags-IP: Not set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 741
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 0.0.0.0 (0.0.0.0)
Packit e9ba0d
        Name: Third VLAN
Packit e9ba0d
    Null
Packit e9ba0d
        Marker 0x99, length 4, type 0 = Null
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Null (0)
Packit e9ba0d
            TLV length: 4
Packit e9ba0d
	*/
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
		0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00, 0x5e, 0x10,
Packit e9ba0d
		0x8e, 0xe7, 0x84, 0xad, 0x00, 0x52, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0xe0, 0x2b, 0x00, 0xbb, 0x01, 0x00,
Packit e9ba0d
		0x00, 0x4a, 0xde, 0x20, 0x00, 0x02, 0x00, 0x00,
Packit e9ba0d
		0x5e, 0x10, 0x8e, 0xe7, 0x84, 0xad, 0x99, 0x01,
Packit e9ba0d
		0x00, 0x12, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20,
Packit e9ba0d
		0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x00,
Packit e9ba0d
		0x99, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x03,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x07, 0x06, 0x04, 0x63, 0xff, 0xff, 0xff, 0xff,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x04 };
Packit e9ba0d
Packit e9ba0d
	char pkt2[] = {
Packit e9ba0d
		0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00, 0x5e, 0x10,
Packit e9ba0d
		0x8e, 0xe7, 0x84, 0xad, 0x00, 0x6e, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0xe0, 0x2b, 0x00, 0xbb, 0x01, 0x00,
Packit e9ba0d
		0x00, 0x66, 0x28, 0xc4, 0x00, 0x03, 0x00, 0x00,
Packit e9ba0d
		0x5e, 0x10, 0x8e, 0xe7, 0x84, 0xad, 0x99, 0x05,
Packit e9ba0d
		0x00, 0x1b, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x69,
Packit e9ba0d
		0x72, 0x73, 0x74, 0x20, 0x56, 0x4c, 0x41, 0x4e,
Packit e9ba0d
		0x00, 0x99, 0x05, 0x00, 0x1c, 0x00, 0x00, 0x04,
Packit e9ba0d
		0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20,
Packit e9ba0d
		0x56, 0x4c, 0x41, 0x4e, 0x00, 0x99, 0x05, 0x00,
Packit e9ba0d
		0x1b, 0x00, 0x00, 0x02, 0xe5, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x69,
Packit e9ba0d
		0x72, 0x64, 0x20, 0x56, 0x4c, 0x41, 0x4e, 0x00,
Packit e9ba0d
		0x99, 0x00, 0x00, 0x04 };
Packit e9ba0d
Packit e9ba0d
	struct packet *pkt;
Packit e9ba0d
	struct lldpd_vlan vlan1, vlan2, vlan3;
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 = "Not used";
Packit e9ba0d
	strlcpy(hardware.h_ifname, "eth3", sizeof(hardware.h_ifname));
Packit e9ba0d
	hardware.h_ifindex = 4;
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
	vlan1.v_name = "First VLAN"; vlan1.v_vid = 157;
Packit e9ba0d
	vlan2.v_name = "Second VLAN"; vlan2.v_vid = 1247;
Packit e9ba0d
	vlan3.v_name = "Third VLAN"; vlan3.v_vid = 741;
Packit e9ba0d
	TAILQ_INSERT_TAIL(&hardware.h_lport.p_vlans, &vlan1, v_entries);
Packit e9ba0d
	TAILQ_INSERT_TAIL(&hardware.h_lport.p_vlans, &vlan2, v_entries);
Packit e9ba0d
	TAILQ_INSERT_TAIL(&hardware.h_lport.p_vlans, &vlan3, v_entries);
Packit e9ba0d
Packit e9ba0d
	/* Build packet */
Packit e9ba0d
	n = edp_send(NULL, &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
	pkt = TAILQ_NEXT(pkt, next);
Packit e9ba0d
	if (!pkt) {
Packit e9ba0d
		fail("need one more packet");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(pkt->size, sizeof(pkt2));
Packit e9ba0d
	fail_unless(memcmp(pkt->data, pkt2, sizeof(pkt2)) == 0);
Packit e9ba0d
	fail_unless(TAILQ_NEXT(pkt, next) == NULL, "more than two packets sent");
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
START_TEST (test_recv_edp)
Packit e9ba0d
{
Packit e9ba0d
	char pkt1[] = {
Packit e9ba0d
		0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x04,
Packit e9ba0d
		0x96, 0x05, 0x44, 0x6f, 0x01, 0x44, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0xe0, 0x2b, 0x00, 0xbb, 0x01, 0x00,
Packit e9ba0d
		0x01, 0x3c, 0x05, 0xdf, 0x03, 0x0f, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x04, 0x96, 0x05, 0x44, 0x6f, 0x99, 0x02,
Packit e9ba0d
		0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06,
Packit e9ba0d
		0x04, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x99, 0x01, 0x01, 0x04, 0x6e, 0x65,
Packit e9ba0d
		0x30, 0x35, 0x30, 0x31, 0x73, 0x77, 0x2e, 0x58,
Packit e9ba0d
		0x58, 0x58, 0x58, 0x58, 0x58, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x03, 0x7b, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x80, 0x79, 0x0d, 0xec, 0xff, 0xff,
Packit e9ba0d
		0xff, 0xff, 0x80, 0xa7, 0x8b, 0x24, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x17, 0x08, 0x7e, 0xe5, 0xe2,
Packit e9ba0d
		0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x02, 0x81, 0xb2, 0x19, 0xf0, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x02, 0x80, 0xa5, 0x67, 0x20, 0xee, 0xee,
Packit e9ba0d
		0xee, 0xee, 0x80, 0xea, 0x8c, 0xac, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x80, 0xa4, 0x86, 0x2c, 0xee, 0xee,
Packit e9ba0d
		0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
Packit e9ba0d
		0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x00, 0xe0,
Packit e9ba0d
		0x2b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
Packit e9ba0d
		0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x99, 0x00,
Packit e9ba0d
		0x00, 0x04 };
Packit e9ba0d
	/* This is:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: Extreme-EDP (00:e0:2b:00:00:00)
Packit e9ba0d
    Source: ExtremeN_05:44:6f (00:04:96:05:44:6f)
Packit e9ba0d
    Length: 324
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: Extreme Networks (0x00e02b)
Packit e9ba0d
    PID: EDP (0x00bb)
Packit e9ba0d
Extreme Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    Reserved: 0
Packit e9ba0d
    Data length: 316
Packit e9ba0d
    Checksum: 0xdf05 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Sequence number: 783
Packit e9ba0d
    Machine ID type: MAC (0)
Packit e9ba0d
    Machine MAC: ExtremeN_05:44:6f (00:04:96:05:44:6f)
Packit e9ba0d
    Info: Slot/Port: 1/1, Version: 7.6.4.0
Packit e9ba0d
        Marker 0x99, length 36, type 2 = Info
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Info (2)
Packit e9ba0d
            TLV length: 36
Packit e9ba0d
        Slot: 1
Packit e9ba0d
        Port: 1
Packit e9ba0d
        Virt chassis: 0
Packit e9ba0d
        Reserved: 000000000000
Packit e9ba0d
        Version: 7.6.4 Internal: 0
Packit e9ba0d
            Version: 0x07060400
Packit e9ba0d
            Version (major1): 7
Packit e9ba0d
            Version (major2): 6
Packit e9ba0d
            Version (sustaining): 4
Packit e9ba0d
            Version (internal): 0
Packit e9ba0d
        Connections: FFFF0000000000000000000000000000
Packit e9ba0d
    Display: "ne0501sw.XXXXXX"
Packit e9ba0d
        Marker 0x99, length 260, type 1 = Display
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Display (1)
Packit e9ba0d
            TLV length: 260
Packit e9ba0d
        Name: ne0501sw.XXXXXX
Packit e9ba0d
    Null
Packit e9ba0d
        Marker 0x99, length 4, type 0 = Null
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Null (0)
Packit e9ba0d
            TLV length: 4
Packit e9ba0d
	*/
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
	char pkt2[] = {
Packit e9ba0d
		0x00, 0xe0, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x04,
Packit e9ba0d
		0x96, 0x05, 0x44, 0x6f, 0x01, 0x48, 0xaa, 0xaa,
Packit e9ba0d
		0x03, 0x00, 0xe0, 0x2b, 0x00, 0xbb, 0x01, 0x00,
Packit e9ba0d
		0x01, 0x40, 0x73, 0x04, 0x03, 0x10, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x04, 0x96, 0x05, 0x44, 0x6f, 0x99, 0x05,
Packit e9ba0d
		0x00, 0x64, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x65,
Packit e9ba0d
		0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, 0x43, 0x61,
Packit e9ba0d
		0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x76,
Packit e9ba0d
		0x65, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
Packit e9ba0d
		0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
Packit e9ba0d
		0x20, 0x74, 0x6f, 0x20, 0x6e, 0x76, 0x20, 0x28,
Packit e9ba0d
		0x25, 0x64, 0x29, 0x0a, 0x00, 0x00, 0x4e, 0x6f,
Packit e9ba0d
		0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x20,
Packit e9ba0d
		0x66, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x70, 0x65,
Packit e9ba0d
		0x72, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x49,
Packit e9ba0d
		0x6e, 0x73, 0x74, 0x20, 0x25, 0x64, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x99, 0x05, 0x00, 0x64, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x4d, 0x61, 0x63, 0x56, 0x6c, 0x61,
Packit e9ba0d
		0x6e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65,
Packit e9ba0d
		0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x05,
Packit e9ba0d
		0x00, 0x64, 0x80, 0x00, 0x00, 0x32, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x0a, 0x32, 0x00, 0x3f, 0x41, 0x64,
Packit e9ba0d
		0x6d, 0x69, 0x6e, 0x42, 0x32, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit e9ba0d
		0x00, 0x00, 0x99, 0x00, 0x00, 0x04 };
Packit e9ba0d
	/* This is:
Packit e9ba0d
IEEE 802.3 Ethernet 
Packit e9ba0d
    Destination: Extreme-EDP (00:e0:2b:00:00:00)
Packit e9ba0d
    Source: ExtremeN_05:44:6f (00:04:96:05:44:6f)
Packit e9ba0d
    Length: 328
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: Extreme Networks (0x00e02b)
Packit e9ba0d
    PID: EDP (0x00bb)
Packit e9ba0d
Extreme Discovery Protocol
Packit e9ba0d
    Version: 1
Packit e9ba0d
    Reserved: 0
Packit e9ba0d
    Data length: 320
Packit e9ba0d
    Checksum: 0x7304 [correct]
Packit e9ba0d
        [Good: True]
Packit e9ba0d
        [Bad : False]
Packit e9ba0d
    Sequence number: 784
Packit e9ba0d
    Machine ID type: MAC (0)
Packit e9ba0d
    Machine MAC: ExtremeN_05:44:6f (00:04:96:05:44:6f)
Packit e9ba0d
    Vlan: ID 1, Name "Default"
Packit e9ba0d
        Marker 0x99, length 100, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 100
Packit e9ba0d
        Flags: 0x80
Packit e9ba0d
            1... .... = Flags-IP: Set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 1
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 0.0.0.0 (0.0.0.0)
Packit e9ba0d
        Name: Default
Packit e9ba0d
    Vlan: ID 0, Name "MacVlanDiscover"
Packit e9ba0d
        Marker 0x99, length 100, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 100
Packit e9ba0d
        Flags: 0x00
Packit e9ba0d
            0... .... = Flags-IP: Not set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 0
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 0.0.0.0 (0.0.0.0)
Packit e9ba0d
        Name: MacVlanDiscover
Packit e9ba0d
    Vlan: ID 50, Name "AdminB2"
Packit e9ba0d
        Marker 0x99, length 100, type 5 = VL
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: VL (5)
Packit e9ba0d
            TLV length: 100
Packit e9ba0d
        Flags: 0x80
Packit e9ba0d
            1... .... = Flags-IP: Set
Packit e9ba0d
            .000 000. = Flags-reserved: 0x00
Packit e9ba0d
            .... ...0 = Flags-Unknown: Not set
Packit e9ba0d
        Reserved1: 00
Packit e9ba0d
        Vlan ID: 50
Packit e9ba0d
        Reserved2: 00000000
Packit e9ba0d
        IP addr: 10.50.0.63 (10.50.0.63)
Packit e9ba0d
        Name: AdminB2
Packit e9ba0d
    Null
Packit e9ba0d
        Marker 0x99, length 4, type 0 = Null
Packit e9ba0d
            TLV Marker: 0x99
Packit e9ba0d
            TLV type: Null (0)
Packit e9ba0d
            TLV length: 4
Packit e9ba0d
	*/
Packit e9ba0d
	struct lldpd_vlan *vlan;
Packit e9ba0d
#endif
Packit e9ba0d
	struct lldpd_chassis *nchassis = NULL;
Packit e9ba0d
	struct lldpd_port *nport = NULL;
Packit e9ba0d
	struct lldpd cfg;
Packit e9ba0d
	char mac1[] = { 0x00, 0x04, 0x96, 0x05, 0x44, 0x6f };
Packit e9ba0d
Packit e9ba0d
	cfg.g_config.c_mgmt_pattern = NULL;
Packit e9ba0d
	fail_unless(edp_decode(&cfg, 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_LLADDR);
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_id_len, ETHER_ADDR_LEN);
Packit e9ba0d
	fail_unless(memcmp(nchassis->c_id, mac1, ETHER_ADDR_LEN) == 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("1/1"));
Packit e9ba0d
	fail_unless(memcmp(nport->p_id,
Packit e9ba0d
		"1/1", strlen("1/1")) == 0);
Packit e9ba0d
	ck_assert_str_eq(nport->p_descr, "Slot 1 / Port 1");
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_name, "ne0501sw.XXXXXX");
Packit e9ba0d
	ck_assert_str_eq(nchassis->c_descr, "EDP enabled device, version 7.6.4.0");
Packit e9ba0d
	ck_assert_int_eq(nchassis->c_cap_enabled, 0);
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
	/* Add this port to list of remote port for hardware port */
Packit e9ba0d
	TAILQ_INSERT_TAIL(&hardware.h_rports, nport, p_entries);
Packit e9ba0d
	nport->p_chassis = nchassis;
Packit e9ba0d
	nport->p_protocol = LLDPD_MODE_EDP;
Packit e9ba0d
Packit e9ba0d
	/* Recept second packet */
Packit e9ba0d
	nchassis = NULL; nport = NULL;
Packit e9ba0d
	fail_unless(edp_decode(&cfg, pkt2, sizeof(pkt2), &hardware,
Packit e9ba0d
		&nchassis, &nport) == -1);
Packit e9ba0d
	nport = TAILQ_FIRST(&hardware.h_rports);
Packit e9ba0d
	if (!nport) {
Packit e9ba0d
		fail("unable to find our previous port?");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(TAILQ_FIRST(&nport->p_chassis->c_mgmt)->m_addr.inet.s_addr,
Packit e9ba0d
	    (u_int32_t)inet_addr("10.50.0.63"));
Packit e9ba0d
	if (TAILQ_EMPTY(&nport->p_vlans)) {
Packit e9ba0d
		fail("no VLAN");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	vlan = TAILQ_FIRST(&nport->p_vlans);
Packit e9ba0d
	ck_assert_int_eq(vlan->v_vid, 1);
Packit e9ba0d
	ck_assert_str_eq(vlan->v_name, "Default");
Packit e9ba0d
	vlan = TAILQ_NEXT(vlan, v_entries);
Packit e9ba0d
	if (!vlan) {
Packit e9ba0d
		fail("no more VLAN");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(vlan->v_vid, 0);
Packit e9ba0d
	ck_assert_str_eq(vlan->v_name, "MacVlanDiscover");
Packit e9ba0d
	vlan = TAILQ_NEXT(vlan, v_entries);
Packit e9ba0d
	if (!vlan) {
Packit e9ba0d
		fail("no more VLAN");
Packit e9ba0d
		return;
Packit e9ba0d
	}
Packit e9ba0d
	ck_assert_int_eq(vlan->v_vid, 50);
Packit e9ba0d
	ck_assert_str_eq(vlan->v_name, "AdminB2");
Packit e9ba0d
	vlan = TAILQ_NEXT(vlan, v_entries);
Packit e9ba0d
	fail_unless(vlan == NULL);
Packit e9ba0d
#endif
Packit e9ba0d
}
Packit e9ba0d
END_TEST
Packit e9ba0d
Packit e9ba0d
#endif
Packit e9ba0d
Packit e9ba0d
Suite *
Packit e9ba0d
edp_suite(void)
Packit e9ba0d
{
Packit e9ba0d
	Suite *s = suite_create("EDP");
Packit e9ba0d
Packit e9ba0d
#ifdef ENABLE_EDP
Packit e9ba0d
	TCase *tc_send = tcase_create("Send EDP packets");
Packit e9ba0d
	TCase *tc_receive = tcase_create("Receive EDP packets");
Packit e9ba0d
Packit e9ba0d
	tcase_add_checked_fixture(tc_send, pcap_setup, pcap_teardown);
Packit e9ba0d
	tcase_add_test(tc_send, test_send_basic);
Packit e9ba0d
#ifdef ENABLE_DOT1
Packit e9ba0d
	tcase_add_test(tc_send, test_send_vlans);
Packit e9ba0d
#endif
Packit e9ba0d
	suite_add_tcase(s, tc_send);
Packit e9ba0d
Packit e9ba0d
	tcase_add_test(tc_receive, test_recv_edp);
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 = edp_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
}