index | | raw e-mail
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;home | help
