public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v3 15/25] pesto: Expose list of pifs to pesto
Date: Mon, 23 Mar 2026 18:37:22 +1100	[thread overview]
Message-ID: <20260323073732.3158468-16-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20260323073732.3158468-1-david@gibson.dropbear.id.au>

Extend the dynamic update protocol to expose the pif indices and names
from a running passt/pasta to the pesto tool.  pesto records that data
and (for now) prints it out.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 conf.c      | 38 +++++++++++++++++++++
 pesto.c     | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 serialise.c | 21 ++++++++++++
 serialise.h |  3 ++
 4 files changed, 159 insertions(+), 1 deletion(-)

diff --git a/conf.c b/conf.c
index 7b960fe9..b878db94 100644
--- a/conf.c
+++ b/conf.c
@@ -2303,6 +2303,41 @@ void conf(struct ctx *c, int argc, char **argv)
 		conf_print(c);
 }
 
+/**
+ * conf_send_pifs() - Send list of pifs to dynamic update client (pesto)
+ * @c:		Execution context
+ * @fd:		Socket to the client
+ *
+ * Return: 0 on success, -1 on failure
+ */
+static int conf_send_pifs(const struct ctx *c, int fd)
+{
+	uint32_t num = 0;
+	unsigned pif;
+
+	/* First count the number of pifs with tables */
+	for (pif = 0; pif < PIF_NUM_TYPES; pif++) {
+		if (c->fwd[pif])
+			num++;
+	}
+
+	if (write_u32(fd, num))
+		return -1;
+
+	for (pif = 0; pif < PIF_NUM_TYPES; pif++) {
+		if (!c->fwd[pif])
+			continue;
+
+		if (write_u8(fd, pif))
+			return -1;
+
+		if (write_str(fd, pif_name(pif)) < 0)
+			return -1;
+	}
+
+	return 0;
+}
+
 /**
  * conf_listen_handler() - Handle events on configuration listening socket
  * @c:		Execution context
@@ -2359,6 +2394,9 @@ void conf_listen_handler(struct ctx *c, uint32_t events)
 "Warning: Using experimental unsupported configuration protocol");
 	}
 
+	if (conf_send_pifs(c, fd) < 0)
+		goto fail;
+
 	return;
 
 fail:
diff --git a/pesto.c b/pesto.c
index f8c9e01d..ed4f2aab 100644
--- a/pesto.c
+++ b/pesto.c
@@ -36,6 +36,8 @@
 #include "serialise.h"
 #include "pesto.h"
 
+static int verbosity = 1;
+
 #define die(...)							\
 	do {								\
 		FPRINTF(stderr, __VA_ARGS__);				\
@@ -51,6 +53,19 @@
 		}							\
 	} while (0)
 
+/**
+ * xmalloc() - Allocate memory, with fatal error on failure
+ * @size:	Number of bytes to allocate
+ */
+static void *xmalloc(size_t size)
+{
+	void *p = malloc(size);
+
+	if (!p)
+		die("Memory allocation failure");
+	return p;
+}
+
 /**
  * usage() - Print usage, exit with given status code
  * @name:	Executable name
@@ -69,6 +84,83 @@ static void usage(const char *name, FILE *f, int status)
 	exit(status);
 }
 
+/**
+ * pesto_recv_str() - Receive a string from passt/pasta
+ * @fd:		Control socket
+ *
+ * Return: pointer to malloc()ed string
+ */
+static const char *pesto_recv_str(int fd)
+{
+	uint32_t len;
+	char *buf;
+
+	if (read_u32(fd, &len) < 0)
+		die("Error reading from control socket");
+
+	buf = xmalloc(len);
+	if (read_all_buf(fd, buf, len) < 0)
+		die("Error reading from control socket");
+
+	return buf;
+}
+
+struct pif_state {
+	uint8_t pif;
+	const char *name;
+};
+
+struct conf_state {
+	uint32_t npifs;
+	struct pif_state pif[];
+};
+
+/**
+ * pesto_read_pifs() - Read pif names and IDs from passt/pasta
+ * @fd:		Control socket
+ */
+static const struct conf_state *pesto_read_pifs(int fd)
+{
+	uint32_t num;
+	struct conf_state *state;
+	unsigned i;
+
+	if (read_u32(fd, &num) < 0)
+		die("Error reading from control socket");
+
+	debug("Receiving %"PRIu32" interface names", num);
+
+	state = xmalloc(sizeof(*state) + num * sizeof(struct pif_state));
+	state->npifs = num;
+
+	for (i = 0; i < num; i++) {
+		struct pif_state *ps = &state->pif[i];
+
+		if (read_u8(fd, &ps->pif) < 0)
+			die("Error reading from control socket");
+		ps->name = pesto_recv_str(fd);
+
+		debug("%u: %s", ps->pif, ps->name);
+	}
+
+	return state;
+}
+
+/**
+ * show_state() - Show current rule state obtained from passt/pasta
+ * @pifs:	PIF name information
+ */
+static void show_state(const struct conf_state *state)
+{
+	unsigned i;
+
+	for (i = 0; i < state->npifs; i++) {
+		const struct pif_state *ps = &state->pif[i];
+		printf("Forwarding rules for %s interface\n", ps->name);
+		printf("\tTBD\n");
+	}
+}
+
 /**
  * main() - Entry point and whole program with loop
  * @argc:	Argument count
@@ -91,12 +183,12 @@ int main(int argc, char **argv)
 		{ 0 },
 	};
 	struct sockaddr_un a = { AF_UNIX, "" };
+	const struct conf_state *state;
 	const char *optstring = "vh";
 	struct pesto_hello hello;
 	struct sock_fprog prog;
 	int optname, ret, s;
 	uint32_t s_version;
-	int verbosity = 1;
 
 	prog.len = (unsigned short)sizeof(filter_pesto) /
 				   sizeof(filter_pesto[0]);
@@ -172,5 +264,9 @@ int main(int argc, char **argv)
 "Warning: Using experimental protocol version, client and server must match\n");
 	}
 
+	state = pesto_read_pifs(s);
+
+	show_state(state);
+
 	exit(0);
 }
diff --git a/serialise.c b/serialise.c
index e3ea86e3..94c34d3c 100644
--- a/serialise.c
+++ b/serialise.c
@@ -19,6 +19,7 @@
 #include <endian.h>
 #include <errno.h>
 #include <stdint.h>
+#include <string.h>
 #include <unistd.h>
 
 #include "serialise.h"
@@ -121,6 +122,26 @@ int write_all_buf(int fd, const void *buf, size_t len)
 		return write_all_buf(fd, &beval, sizeof(beval));	\
 	}
 
+#define be8toh(x)	(x)
+#define htobe8(x)	(x)
+
+SERIALISE_UINT(8)
 SERIALISE_UINT(32)
 
 #undef SERIALISE_UNIT
+
+/**
+ * write_str() - Write a string to an fd in length/value format
+ * @fd:		Socket to the client
+ * @s:		String to send
+ *
+ * Return: 0 on success, -1 on error
+ */
+int write_str(int fd, const char *s)
+{
+	uint32_t len = strlen(s) + 1; /* Include \0 */
+
+	if (write_u32(fd, len) < 0)
+		return -1;
+	return write_all_buf(fd, s, len);
+}
diff --git a/serialise.h b/serialise.h
index 0a4ed086..7ef35786 100644
--- a/serialise.h
+++ b/serialise.h
@@ -16,6 +16,9 @@ int write_all_buf(int fd, const void *buf, size_t len);
 	int read_u##bits(int fd, uint##bits##_t *val);			\
 	int write_u##bits(int fd, uint##bits##_t val);
 
+SERIALISE_UINT_DECL(8)
 SERIALISE_UINT_DECL(32)
 
+int write_str(int fd, const char *s);
+
 #endif /* _SERIALISE_H */
-- 
2.53.0


  parent reply	other threads:[~2026-03-23  8:32 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-23  7:37 [PATCH v3 00/25] RFC: Read-only dynamic update implementation David Gibson
2026-03-23  7:37 ` [PATCH v3 01/25] conf: runas can be const David Gibson
2026-03-23  7:37 ` [PATCH v3 02/25] vhost_user: Fix assorted minor cppcheck warnings David Gibson
2026-03-23  7:37 ` [PATCH v3 03/25] serialise: Split functions user for serialisation from util.c David Gibson
2026-03-25  0:54   ` Stefano Brivio
2026-03-25  1:50     ` David Gibson
2026-03-23  7:37 ` [PATCH v3 04/25] serialise: Add helpers for serialising unsigned integers David Gibson
2026-03-23  7:37 ` [PATCH v3 05/25] fwd: Move selecting correct scan bitmap into fwd_sync_one() David Gibson
2026-03-23  7:37 ` [PATCH v3 06/25] fwd: Look up rule index in fwd_sync_one() David Gibson
2026-03-23  7:37 ` [PATCH v3 07/25] fwd: Store forwarding tables indexed by (origin) pif David Gibson
2026-03-25  0:54   ` Stefano Brivio
2026-03-25  4:04     ` David Gibson
2026-03-23  7:37 ` [PATCH v3 08/25] fwd: Allow FWD_DUAL_STACK_ANY flag to be passed directly to fwd_rule_add() David Gibson
2026-03-25  0:54   ` Stefano Brivio
2026-03-25  4:07     ` David Gibson
2026-03-23  7:37 ` [PATCH v3 09/25] fwd, conf: Expose ephemeral ports as bitmap rather than function David Gibson
2026-03-23  7:37 ` [PATCH v3 10/25] conf: Don't bother complaining about overlapping excluded ranges David Gibson
2026-03-23  7:37 ` [PATCH v3 11/25] conf: Move check for mapping port 0 to caller David Gibson
2026-03-23  7:37 ` [PATCH v3 12/25] conf: Move check for disabled interfaces earlier David Gibson
2026-03-23  7:37 ` [PATCH v3 13/25] pesto: Introduce stub configuration interface and tool David Gibson
2026-03-25  0:54   ` Stefano Brivio
2026-03-23  7:37 ` [PATCH v3 14/25] pesto: Add command line option parsing and debug messages David Gibson
2026-03-25  0:55   ` Stefano Brivio
2026-03-25  4:27     ` David Gibson
2026-03-23  7:37 ` David Gibson [this message]
2026-03-25  0:56   ` [PATCH v3 15/25] pesto: Expose list of pifs to pesto Stefano Brivio
2026-03-25  4:34     ` David Gibson
2026-03-25  8:18       ` Stefano Brivio
2026-03-25  8:31         ` David Gibson
2026-03-23  7:37 ` [PATCH v3 16/25] ip: Prepare ip.[ch] for sharing with pesto tool David Gibson
2026-03-23  7:37 ` [PATCH v3 17/25] inany: Prepare inany.[ch] " David Gibson
2026-03-23  7:37 ` [PATCH v3 18/25] fwd: Split forwading rule specification from its implementation state David Gibson
2026-03-23  7:37 ` [PATCH v3 19/25] ip: Define a bound for the string returned by ipproto_name() David Gibson
2026-03-23  7:37 ` [PATCH v3 20/25] fwd_rule: Move forwarding rule text formatting to common code David Gibson
2026-03-25  0:56   ` Stefano Brivio
2026-03-25  4:42     ` David Gibson
2026-03-25  8:18       ` Stefano Brivio
2026-03-25 23:54         ` David Gibson
2026-03-23  7:37 ` [PATCH v3 21/25] pesto: Read current ruleset from passt/pasta and display it David Gibson
2026-03-25  0:56   ` Stefano Brivio
2026-03-25  4:43     ` David Gibson
2026-03-23  7:37 ` [PATCH v3 22/25] conf: Move port parsing functions to own file, ports.c David Gibson
2026-03-23  7:37 ` [PATCH v3 23/25] conf, fwd, ports, util: Move things around for pesto David Gibson
2026-03-23  7:37 ` [PATCH v3 24/25] pesto, conf: Parse, send and receive new rules David Gibson
2026-03-23  7:37 ` [PATCH v3 25/25] conf, fwd: Allow switching to new rules received from pesto David Gibson
2026-03-23  8:38 ` [PATCH v3 00/25] RFC: Read-only dynamic update implementation David Gibson
2026-03-25  0:56 ` Stefano Brivio
2026-03-25  1:00   ` Stefano Brivio
2026-03-25  4:44     ` David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260323073732.3158468-16-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).