ncsi: Add basic test for Get Version ID response

Signed-off-by: Peter Delevoryas <pdel@fb.com>
diff --git a/meson.build b/meson.build
index 5fe33d3..435f331 100644
--- a/meson.build
+++ b/meson.build
@@ -151,6 +151,14 @@
 
 test('ping', pingtest)
 
+ncsitest = executable('ncsitest', 'test/ncsitest.c',
+  link_with: [lib],
+  include_directories: ['src'],
+  dependencies: [glib_dep, platform_deps]
+)
+
+test('ncsi', ncsitest)
+
 if install_devel
   install_headers(['src/libslirp.h'], subdir : 'slirp')
 
diff --git a/test/ncsitest.c b/test/ncsitest.c
new file mode 100644
index 0000000..12adfa3
--- /dev/null
+++ b/test/ncsitest.c
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
+ */
+
+/*
+ * This test verifies slirp responses to NC-SI commands.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "slirp.h"
+#include "ncsi-pkt.h"
+
+#define NCSI_RESPONSE_CAPACITY 1024
+
+static void test_ncsi_get_version_id(Slirp *slirp)
+{
+    slirp->mfr_id = 0xabcdef01;
+
+    uint8_t command[] = {
+        /* Destination MAC */
+        0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+        /* Source MAC */
+        0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+        /* Ethertype */
+        0x88, 0xf8,
+        /* NC-SI Control packet header */
+        0x00, /* MC ID */
+        0x01, /* Header revision */
+        0x00, /* Reserved */
+        0x01, /* Instance ID */
+        0x15, /* Control Packet Type */
+        0x00, /* Channel ID */
+        0x00, /* Reserved */
+        0x00, /* Payload length */
+        0x00, 0x00, 0x00, 0x00, /* Reserved */
+        0x00, 0x00, 0x00, 0x00, /* Reserved */
+    };
+    slirp_input(slirp, command, sizeof(command));
+
+    const struct ncsi_rsp_gvi_pkt *gvi = slirp->opaque + ETH_HLEN;
+
+    assert(gvi->rsp.code == NCSI_PKT_RSP_C_COMPLETED);
+    assert(gvi->rsp.code == NCSI_PKT_RSP_R_NO_ERROR);
+    assert(ntohl(gvi->mf_id) == slirp->mfr_id);
+
+    slirp->mfr_id = 0;
+}
+
+static ssize_t send_packet(const void *buf, size_t len, void *opaque)
+{
+    assert(len <= NCSI_RESPONSE_CAPACITY);
+    memcpy(opaque, buf, len);
+    return len;
+}
+
+int main(int argc, char *argv[])
+{
+    SlirpConfig config = {};
+    SlirpCb callbacks = {};
+    Slirp *slirp = NULL;
+    uint8_t ncsi_response[NCSI_RESPONSE_CAPACITY];
+
+    config.version = SLIRP_CONFIG_VERSION_MAX;
+    callbacks.send_packet = send_packet;
+    slirp = slirp_new(&config, &callbacks, ncsi_response);
+
+    test_ncsi_get_version_id(slirp);
+
+    slirp_cleanup(slirp);
+}