diff options
| author | Ishan Agrawal <iagrawal9990@gmail.com> | 2026-06-29 06:00:40 +0000 |
|---|---|---|
| committer | Kristof Provost <kp@FreeBSD.org> | 2026-07-05 14:03:52 +0000 |
| commit | c268c80fc3d5eaeec2d01205b338dbaa7661502a (patch) | |
| tree | ee2fc918a0aa6b2877a42b340d5ba08ee5980c53 | |
| parent | 80586e853674c6d63888379274accea5c82407f2 (diff) | |
libsysdecode: cache Generic Netlink family IDs
Record Generic Netlink family IDs learned from
CTRL_CMD_GETFAMILY responses and use them to decode subsequent
Generic Netlink messages using symbolic family names instead of
numeric IDs.
Signed-off-by: Ishan Agrawal <iagrawal9990@gmail.com>
Reviewed by: kp
Sponsored-by: Google LLC (GSoC 2026)
| -rw-r--r-- | lib/libsysdecode/netlink.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/libsysdecode/netlink.c b/lib/libsysdecode/netlink.c index 4dbe6c087dcf..a9c226e6065d 100644 --- a/lib/libsysdecode/netlink.c +++ b/lib/libsysdecode/netlink.c @@ -12,8 +12,11 @@ #include <stdio.h> #include <stdbool.h> #include <stddef.h> +#include <stdlib.h> +#include <string.h> #include "sysdecode.h" +#include "support.h" /* * Decodes a buffer as a Netlink message stream. @@ -23,6 +26,9 @@ * to fallback to a standard hex/string dump. */ +static struct name_table *family_table = NULL; +static size_t num_family = 0; + bool sysdecode_netlink(FILE *fp, const void *buf, size_t len, int protocol) { @@ -41,6 +47,12 @@ sysdecode_netlink(FILE *fp, const void *buf, size_t len, int protocol) if (nl->nlmsg_len < sizeof(struct nlmsghdr) || nl->nlmsg_len > remaining) return (false); + if (family_table == NULL) { + family_table = malloc((num_family + 1) * + sizeof(struct name_table)); + family_table[num_family] = (struct name_table){0, NULL}; + } + fprintf(fp, "netlink{"); while (remaining >= sizeof(struct nlmsghdr)) { @@ -124,6 +136,22 @@ sysdecode_netlink(FILE *fp, const void *buf, size_t len, int protocol) } } + if (family_name && family_id && + !lookup_value(family_table, family_id)) { + num_family++; + + family_table = realloc(family_table, + (num_family + 1) * + sizeof(struct name_table)); + family_table[num_family - 1].val = + family_id; + family_table[num_family - 1].str = + strdup(family_name); + + family_table[num_family] = + (struct name_table){0, NULL}; + } + fprintf(fp, "}"); break; default: @@ -131,6 +159,10 @@ sysdecode_netlink(FILE *fp, const void *buf, size_t len, int protocol) break; } + const char *family = lookup_value(family_table, nl->nlmsg_type); + if (family != NULL && strcmp(family, "pfctl") == 0) + fprintf(fp, ",pf={}"); + /* Handle Alignment (Netlink messages are 4-byte aligned). */ size_t aligned_len = NLMSG_ALIGN(nl->nlmsg_len); if (aligned_len > remaining) |
