git: 1d926be8824a - main - libsysdecode : add attribute parsing for PFNL_CMD_KILLSTATES

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Mon, 10 Aug 2026 14:34:17 UTC
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=1d926be8824a8cbf620dc12a5f9fe5623930bfd0

commit 1d926be8824a8cbf620dc12a5f9fe5623930bfd0
Author:     Ishan Agrawal <iagrawal9990@gmail.com>
AuthorDate: 2026-08-08 05:29:25 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2026-08-10 14:33:31 +0000

    libsysdecode : add attribute parsing for PFNL_CMD_KILLSTATES
    
    Signed-off-by:  Ishan Agrawal <iagrawal9990@gmail.com>
    Sponsored-by:   Google LLC (GSoC 2026)
    Reviewed by:    kp
---
 lib/libsysdecode/netlink.c | 84 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 80 insertions(+), 4 deletions(-)

diff --git a/lib/libsysdecode/netlink.c b/lib/libsysdecode/netlink.c
index 6e2af72374b0..1d6200980c9e 100644
--- a/lib/libsysdecode/netlink.c
+++ b/lib/libsysdecode/netlink.c
@@ -78,6 +78,20 @@ nlattr_decode_in6_addr(FILE *fp, const struct nlattr *attr,
 		fprintf(fp, "%s", buf);
 }
 
+static void
+nlattr_decode_uint64(FILE *fp, const struct nlattr *attr, const char *attr_name,
+    const void *args __unused)
+{
+	uint64_t target;
+
+	if (NLA_DATA_LEN(attr) < (int)sizeof(target))
+		return;
+
+	memcpy(&target, NLA_DATA_CONST(attr), sizeof(uint64_t));
+
+	fprintf(fp, "%s=%ju", attr_name, target);
+}
+
 static void
 nlattr_decode_uint32(FILE *fp, const struct nlattr *attr, const char *attr_name,
     const void *args)
@@ -94,6 +108,20 @@ nlattr_decode_uint32(FILE *fp, const struct nlattr *attr, const char *attr_name,
 	fprintf(fp, "%s=%u", attr_name, target);
 }
 
+static void
+nlattr_decode_uint16(FILE *fp, const struct nlattr *attr, const char *attr_name,
+    const void *args __unused)
+{
+	uint16_t target;
+
+	if (NLA_DATA_LEN(attr) < (int)sizeof(target))
+		return;
+
+	memcpy(&target, NLA_DATA_CONST(attr), sizeof(uint16_t));
+
+	fprintf(fp, "%s=%u", attr_name, target);
+}
+
 static void
 nlattr_decode_uint8(FILE *fp, const struct nlattr *attr, const char *attr_name,
     const void *args)
@@ -110,6 +138,25 @@ nlattr_decode_uint8(FILE *fp, const struct nlattr *attr, const char *attr_name,
 	fprintf(fp, "%s=%u", attr_name, target);
 }
 
+static void
+nlattr_decode_bool(FILE *fp, const struct nlattr *attr, const char *attr_name,
+    const void *args __unused)
+{
+	bool target;
+
+	if (NLA_DATA_LEN(attr) < (int)sizeof(target))
+		return;
+
+	memcpy(&target, NLA_DATA_CONST(attr), sizeof(bool));
+
+	fprintf(fp, "%s=", attr_name);
+
+	if (target)
+		fprintf(fp, "TRUE");
+	else
+		fprintf(fp, "FALSE");
+}
+
 static void
 nlattr_decode_string(FILE *fp, const struct nlattr *attr, const char *attr_name,
     const void *args)
@@ -218,8 +265,32 @@ static const struct nlattr_decoder nla_d_add_addr[] = {
 	{ .type = PF_AA_ADDR, .attr_name = "addr", .cb = nlattr_decode_nested , .args = &pool_addr_decoder},
 	{ .type = PF_AA_WHICH, .attr_name = "which", .cb = nlattr_decode_uint32 },
 };
-NL_DECLARE_ATTR_DECODER(addr_parser, nla_d_add_addr);
-
+NL_DECLARE_ATTR_DECODER(addr_decoder, nla_d_add_addr);
+
+static const struct nlattr_decoder nla_d_ruleaddr[] = {
+	{ .type = PF_RAT_ADDR, .attr_name = "addr", .cb = nlattr_decode_nested, .args = &addr_wrap_decoder },
+	{ .type = PF_RAT_SRC_PORT, .attr_name = "src_port", .cb = nlattr_decode_uint16 },
+	{ .type = PF_RAT_DST_PORT, .attr_name = "dst_port", .cb = nlattr_decode_uint16 },
+	{ .type = PF_RAT_NEG, .attr_name = "neg", .cb = nlattr_decode_uint8 },
+	{ .type = PF_RAT_OP, .attr_name = "op", .cb = nlattr_decode_uint8 },
+};
+NL_DECLARE_ATTR_DECODER(rule_addr_decoder, nla_d_ruleaddr);
+
+static const struct nlattr_decoder nla_d_clear_states[] = {
+	{ .type = PF_CS_CMP_ID, .attr_name = "cmp_id", .cb = nlattr_decode_uint64 },
+	{ .type = PF_CS_CMP_CREATORID, .attr_name = "cmp_creatorid", .cb = nlattr_decode_uint32 },
+	{ .type = PF_CS_CMP_DIR, .attr_name = "cmp_dir", .cb = nlattr_decode_uint8 },
+	{ .type = PF_CS_AF, .attr_name = "af", .cb = nlattr_decode_uint8 },
+	{ .type = PF_CS_PROTO, .attr_name = "proto", .cb = nlattr_decode_uint8 },
+	{ .type = PF_CS_SRC, .attr_name = "src", .cb = nlattr_decode_nested, .args = &rule_addr_decoder },
+	{ .type = PF_CS_DST, .attr_name = "dst", .cb = nlattr_decode_nested, .args = &rule_addr_decoder },
+	{ .type = PF_CS_RT_ADDR, .attr_name = "rt_addr", .cb = nlattr_decode_nested, .args = &rule_addr_decoder },
+	{ .type = PF_CS_IFNAME, .attr_name = "ifname", .cb = nlattr_decode_string },
+	{ .type = PF_CS_LABEL, .attr_name = "label", .cb = nlattr_decode_string },
+	{ .type = PF_CS_KILL_MATCH, .attr_name = "kill_match", .cb = nlattr_decode_bool },
+	{ .type = PF_CS_NAT, .attr_name = "nat", .cb = nlattr_decode_bool },
+};
+NL_DECLARE_ATTR_DECODER(killclear_states_decoder, nla_d_clear_states);
 
 static void
 sysdecode_netlink_pf(FILE *fp, const struct genlmsghdr *genl, size_t nlm_len)
@@ -238,11 +309,16 @@ sysdecode_netlink_pf(FILE *fp, const struct genlmsghdr *genl, size_t nlm_len)
 	switch (cmd) {
 	case PFNL_CMD_GET_ADDR:
 			nl_decode_attrs_raw(fp, nla, nlm_len,
-			    addr_parser.decoders, addr_parser.count);
+			    addr_decoder.decoders, addr_decoder.count);
 		break;
 	case PFNL_CMD_GET_ADDRS:
 			nl_decode_attrs_raw(fp, nla, nlm_len,
-			    addr_parser.decoders, addr_parser.count);
+			    addr_decoder.decoders, addr_decoder.count);
+		break;
+	case PFNL_CMD_KILLSTATES:
+			nl_decode_attrs_raw(fp, nla, nlm_len,
+			    killclear_states_decoder.decoders,
+			    killclear_states_decoder.count);
 		break;
 	default:
 		break;