mctp-demux-daemon: Add packet capture option

Optionally enable libpcap support in mctp-demux-daemon to capture
packets both from the Unix domain socket and binding interfaces.
Providing the two capture points allows for tracking down issues with
packets being dropped during binding initialisation.

As there's no formal linktype defined for MCTP or higher-level DMTF
protocols command-line switches provide the ability to specify one of
the private linktype values in the range 147-162.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: I593d9e4be80c0198e643758f216e774169668a8c
diff --git a/utils/mctp-capture.h b/utils/mctp-capture.h
new file mode 100644
index 0000000..90feb66
--- /dev/null
+++ b/utils/mctp-capture.h
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
+
+#ifndef _UTILS_MCTP_CAPTURE_H
+#define _UTILS_MCTP_CAPTURE_H
+
+#include "config.h"
+
+#include "libmctp.h"
+
+#include <sys/types.h>
+
+#if HAVE_PCAP
+#include <pcap/pcap.h>
+#else
+typedef void pcap_t;
+typedef void pcap_dumper_t;
+#endif
+
+#define CAPTURE_LINKTYPE_FIRST	147
+#define CAPTURE_LINKTYPE_LAST	162
+
+#define __unused __attribute__((unused))
+
+struct capture {
+	const char	*path;
+	int		linktype;
+	pcap_t		*pcap;
+	pcap_dumper_t	*dumper;
+};
+
+#if HAVE_PCAP
+int capture_init(void);
+int capture_prepare(struct capture *cap);
+void capture_close(struct capture *cap);
+void capture_binding(struct mctp_pktbuf *pkt, void *user);
+void capture_socket(pcap_dumper_t *dumper, const void *buf, size_t len);
+#else
+#include <stdio.h>
+static inline int
+capture_init(void)
+{
+	fprintf(stderr, "libpcap support is disabled, cannot initialise libpcap\n");
+	return 0;
+}
+
+static inline int
+capture_prepare(struct capture *cap)
+{
+	fprintf(stderr, "libpcap support is disabled, cannot capture to %s\n",
+		cap->path);
+	return 0;
+}
+
+static inline void capture_close(struct capture *cap __unused)
+{
+}
+
+static inline void
+capture_binding(struct mctp_pktbuf *pkt __unused, void *user __unused)
+{
+}
+
+static inline void capture_socket(pcap_dumper_t *dumper __unused,
+				  const void *buf __unused,
+				  size_t len __unused)
+{
+}
+#endif
+#endif