From 931dc2d4c9195ab50974ce8af1a14053f2ebdc84 Mon Sep 17 00:00:00 2001 From: Felix Huettner Date: Tue, 5 Dec 2023 09:35:03 +0000 Subject: dump: support filtering by zone based on a kernel side extension of the conntrack api, this patch brings this extension to userspace. When dumping the conntrack table we can now filter based on the conntrack zone directly in kernel space. If the kernel does not yet support this feature this filtering is ignored. Signed-off-by: Felix Huettner Signed-off-by: Pablo Neira Ayuso --- src/conntrack/api.c | 13 +++++++++++++ src/conntrack/build_mnl.c | 3 +++ src/conntrack/filter_dump.c | 8 ++++++++ 3 files changed, 24 insertions(+) (limited to 'src') diff --git a/src/conntrack/api.c b/src/conntrack/api.c index cd8bea8..60c87b3 100644 --- a/src/conntrack/api.c +++ b/src/conntrack/api.c @@ -1551,6 +1551,19 @@ void nfct_filter_dump_set_attr_u8(struct nfct_filter_dump *filter_dump, nfct_filter_dump_set_attr(filter_dump, type, &value); } +/** + * nfct_filter_dump_attr_set_u16 - set u16 dump filter attribute + * \param filter dump filter object that we want to modify + * \param type filter attribute type + * \param value value of the filter attribute using unsigned int (32 bits). + */ +void nfct_filter_dump_set_attr_u16(struct nfct_filter_dump *filter_dump, + const enum nfct_filter_dump_attr type, + uint16_t value) +{ + nfct_filter_dump_set_attr(filter_dump, type, &value); +} + /** * @} */ diff --git a/src/conntrack/build_mnl.c b/src/conntrack/build_mnl.c index eb9fcbf..eed0679 100644 --- a/src/conntrack/build_mnl.c +++ b/src/conntrack/build_mnl.c @@ -658,6 +658,9 @@ int nfct_nlmsg_build_filter(struct nlmsghdr *nlh, mnl_attr_put_u32(nlh, CTA_STATUS_MASK, htonl(filter_dump->status.mask)); } + if (filter_dump->set & (1 << NFCT_FILTER_DUMP_ZONE)) { + mnl_attr_put_u16(nlh, CTA_ZONE, htons(filter_dump->zone)); + } if (filter_dump->set & (1 << NFCT_FILTER_DUMP_TUPLE)) { const struct nf_conntrack *ct = &filter_dump->ct; struct nlattr *nest; diff --git a/src/conntrack/filter_dump.c b/src/conntrack/filter_dump.c index 5723a44..0a19985 100644 --- a/src/conntrack/filter_dump.c +++ b/src/conntrack/filter_dump.c @@ -37,6 +37,13 @@ set_filter_dump_attr_family(struct nfct_filter_dump *filter_dump, filter_dump->l3num = *((uint8_t *)value); } +static void +set_filter_dump_attr_zone(struct nfct_filter_dump *filter_dump, + const void *value) +{ + filter_dump->zone = *((uint16_t *)value); +} + static void set_filter_dump_attr_tuple(struct nfct_filter_dump *filter_dump, const void *value) @@ -48,6 +55,7 @@ const set_filter_dump_attr set_filter_dump_attr_array[NFCT_FILTER_DUMP_MAX] = { [NFCT_FILTER_DUMP_MARK] = set_filter_dump_attr_mark, [NFCT_FILTER_DUMP_L3NUM] = set_filter_dump_attr_family, [NFCT_FILTER_DUMP_STATUS] = set_filter_dump_attr_status, + [NFCT_FILTER_DUMP_ZONE] = set_filter_dump_attr_zone, [NFCT_FILTER_DUMP_TUPLE] = set_filter_dump_attr_tuple, }; -- cgit v1.2.3