Skip to content

Commit

Permalink
netfilter: ctnetlink: add and use a helper for mark parsing
Browse files Browse the repository at this point in the history
ctnetlink dumps can be filtered based on the connmark.

Prepare for status bit filtering by using a named structure and by
moving the mark parsing code to a helper.

Else ctnetlink_alloc_filter size grows a bit too big for my taste
when status handling is added.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Florian Westphal authored and Pablo Neira Ayuso committed Aug 5, 2021
1 parent 87663c3 commit ff1199d
Showing 1 changed file with 27 additions and 15 deletions.
42 changes: 27 additions & 15 deletions net/netfilter/nf_conntrack_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,11 @@ static int ctnetlink_done(struct netlink_callback *cb)
return 0;
}

struct ctnetlink_filter_u32 {
u32 val;
u32 mask;
};

struct ctnetlink_filter {
u8 family;

Expand All @@ -862,10 +867,7 @@ struct ctnetlink_filter {
struct nf_conntrack_tuple reply;
struct nf_conntrack_zone zone;

struct {
u_int32_t val;
u_int32_t mask;
} mark;
struct ctnetlink_filter_u32 mark;
};

static const struct nla_policy cta_filter_nla_policy[CTA_FILTER_MAX + 1] = {
Expand Down Expand Up @@ -907,6 +909,24 @@ static int ctnetlink_parse_tuple_filter(const struct nlattr * const cda[],
struct nf_conntrack_zone *zone,
u_int32_t flags);

static int ctnetlink_filter_parse_mark(struct ctnetlink_filter_u32 *mark,
const struct nlattr * const cda[])
{
#ifdef CONFIG_NF_CONNTRACK_MARK
if (cda[CTA_MARK]) {
mark->val = ntohl(nla_get_be32(cda[CTA_MARK]));

if (cda[CTA_MARK_MASK])
mark->mask = ntohl(nla_get_be32(cda[CTA_MARK_MASK]));
else
mark->mask = 0xffffffff;
} else if (cda[CTA_MARK_MASK]) {
return -EINVAL;
}
#endif
return 0;
}

static struct ctnetlink_filter *
ctnetlink_alloc_filter(const struct nlattr * const cda[], u8 family)
{
Expand All @@ -924,18 +944,10 @@ ctnetlink_alloc_filter(const struct nlattr * const cda[], u8 family)

filter->family = family;

#ifdef CONFIG_NF_CONNTRACK_MARK
if (cda[CTA_MARK]) {
filter->mark.val = ntohl(nla_get_be32(cda[CTA_MARK]));
if (cda[CTA_MARK_MASK])
filter->mark.mask = ntohl(nla_get_be32(cda[CTA_MARK_MASK]));
else
filter->mark.mask = 0xffffffff;
} else if (cda[CTA_MARK_MASK]) {
err = -EINVAL;
err = ctnetlink_filter_parse_mark(&filter->mark, cda);
if (err)
goto err_filter;
}
#endif

if (!cda[CTA_FILTER])
return filter;

Expand Down

0 comments on commit ff1199d

Please sign in to comment.