summaryrefslogtreecommitdiffstats
path: root/tests/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/common.c')
-rw-r--r--tests/common.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/tests/common.c b/tests/common.c
new file mode 100644
index 0000000..ec2a7ca
--- /dev/null
+++ b/tests/common.c
@@ -0,0 +1,153 @@
+/* -*- mode: c; c-file-style: "openbsd" -*- */
+/*
+ * Copyright (c) 2015 Vincent Bernat <bernat@luffy.cx>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <fcntl.h>
+#include <check.h>
+#include "common.h"
+
+int dump = -1;
+char *filename = NULL;
+struct pkts_t pkts;
+char macaddress[ETHER_ADDR_LEN] = { 0x5e, 0x10, 0x8e, 0xe7, 0x84, 0xad };
+struct lldpd_hardware hardware;
+struct lldpd_chassis chassis;
+
+int
+pcap_send(struct lldpd *cfg, struct lldpd_hardware *hardware, char *buffer, size_t size)
+{
+ struct pcaprec_hdr hdr;
+ struct packet *pkt;
+ int n;
+
+ /* Write pcap record header */
+ hdr.ts_sec = time(NULL);
+ hdr.ts_usec = 0;
+ hdr.incl_len = hdr.orig_len = size;
+ n = write(dump, &hdr, sizeof(hdr));
+ if (n == 1) {
+ fail("unable to write pcap record header to %s", filename);
+ return -1;
+ }
+
+ /* Write data */
+ n = write(dump, buffer, size);
+ if (n == -1) {
+ fail("unable to write pcap data to %s", filename);
+ return -1;
+ }
+
+ /* Append to list of packets */
+ pkt =
+ (struct packet *)malloc(size + sizeof(TAILQ_HEAD(, packet)) + sizeof(int));
+ if (!pkt) {
+ fail("unable to allocate packet");
+ return -1;
+ }
+ memcpy(pkt->data, buffer, size);
+ pkt->size = size;
+ TAILQ_INSERT_TAIL(&pkts, pkt, next);
+ return 0;
+}
+
+struct lldpd_ops pcap_ops = {
+ .send = pcap_send,
+ .recv = NULL, /* Won't be used */
+ .cleanup = NULL, /* Won't be used */
+};
+
+void
+pcap_setup(void)
+{
+ static int serial = 0;
+ struct pcap_hdr hdr;
+ int n;
+ /* Prepare packet buffer */
+ TAILQ_INIT(&pkts);
+ /* Open a new dump file */
+ n = asprintf(&filename, "%s_%04d.pcap", filenameprefix, serial++);
+ if (n == -1) {
+ fail("unable to compute filename");
+ return;
+ }
+ dump = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (dump == -1) {
+ fail("unable to open %s", filename);
+ return;
+ }
+ /* Write a PCAP header */
+ hdr.magic_number = 0xa1b2c3d4;
+ hdr.version_major = 2;
+ hdr.version_minor = 4;
+ hdr.thiszone = 0;
+ hdr.sigfigs = 0;
+ hdr.snaplen = 65535;
+ hdr.network = 1;
+ n = write(dump, &hdr, sizeof(hdr));
+ if (n == -1) {
+ fail("unable to write pcap header to %s", filename);
+ return;
+ }
+ /* Prepare hardware */
+ memset(&hardware, 0, sizeof(struct lldpd_hardware));
+ TAILQ_INIT(&hardware.h_rports);
+#ifdef ENABLE_DOT1
+ TAILQ_INIT(&hardware.h_lport.p_vlans);
+ TAILQ_INIT(&hardware.h_lport.p_ppvids);
+ TAILQ_INIT(&hardware.h_lport.p_pids);
+#endif
+ hardware.h_mtu = 1500;
+ hardware.h_ifindex = 4;
+ strlcpy(hardware.h_ifname, "test", sizeof(hardware.h_ifname));
+ memcpy(hardware.h_lladdr, macaddress, ETHER_ADDR_LEN);
+ hardware.h_ops = &pcap_ops;
+ /* Prepare chassis */
+ memset(&chassis, 0, sizeof(struct lldpd_chassis));
+ hardware.h_lport.p_chassis = &chassis;
+}
+
+void
+pcap_teardown()
+{
+ struct packet *npkt, *pkt;
+ for (pkt = TAILQ_FIRST(&pkts); pkt != NULL; pkt = npkt) {
+ npkt = TAILQ_NEXT(pkt, next);
+ TAILQ_REMOVE(&pkts, pkt, next);
+ free(pkt);
+ }
+ if (dump != -1) {
+ close(dump);
+ dump = -1;
+ }
+ if (filename) {
+ free(filename);
+ filename = NULL;
+ }
+}
+
+/* Disable leak detection sanitizer */
+int __lsan_is_turned_off(void);
+int
+__lsan_is_turned_off(void)
+{
+ return 1;
+}