aboutsummaryrefslogtreecommitdiff
path: root/sys/netlink/netlink_message_parser.h
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2022-12-14 19:45:01 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2022-12-14 19:52:35 +0000
commit80f03e63d67ede8fedbed4bd6bf6b12ec2ab2cfb (patch)
treec85e528dadaf265269d3297e1a119890ddb04f56 /sys/netlink/netlink_message_parser.h
parent1cac76c93fb7f627fd9e304cbd99e8c8a2b8fce8 (diff)
Diffstat (limited to 'sys/netlink/netlink_message_parser.h')
-rw-r--r--sys/netlink/netlink_message_parser.h28
1 files changed, 23 insertions, 5 deletions
diff --git a/sys/netlink/netlink_message_parser.h b/sys/netlink/netlink_message_parser.h
index b23b223ef80e..96fd1c7337b7 100644
--- a/sys/netlink/netlink_message_parser.h
+++ b/sys/netlink/netlink_message_parser.h
@@ -152,15 +152,21 @@ static const struct nlhdr_parser _name = { \
.np_size = NL_ARRAY_LEN(_np), \
}
-struct nlarr_hdr {
- int num_items;
- int max_items;
+struct nlattr_bmask {
+ uint64_t mask[2];
};
+static inline bool
+nl_has_attr(const struct nlattr_bmask *bm, unsigned int attr_type)
+{
+ MPASS(attr_type < sizeof(bm->mask) * 8);
+
+ return ((bm->mask[attr_type / 8] & (1 << (attr_type % 8))));
+}
+void nl_get_attrs_bmask_raw(struct nlattr *nla_head, int len, struct nlattr_bmask *bm);
+
int nl_parse_attrs_raw(struct nlattr *nla_head, int len, const struct nlattr_parser *ps,
int pslen, struct nl_pstate *npt, void *target);
-int nl_parse_attrs(struct nlmsghdr *hdr, int hdrlen, struct nlattr_parser *ps,
- int pslen, struct nl_pstate *npt, void *target);
int nlattr_get_flag(struct nlattr *nla, struct nl_pstate *npt,
const void *arg, void *target);
@@ -270,5 +276,17 @@ nl_parse_nlmsg(struct nlmsghdr *hdr, const struct nlhdr_parser *parser,
return (nl_parse_header(hdr + 1, hdr->nlmsg_len - sizeof(*hdr), parser, npt, target));
}
+static inline void
+nl_get_attrs_bmask_nlmsg(struct nlmsghdr *hdr, const struct nlhdr_parser *parser,
+ struct nlattr_bmask *bm)
+{
+ struct nlattr *nla_head;
+
+ nla_head = (struct nlattr *)((char *)(hdr + 1) + parser->nl_hdr_off);
+ int len = hdr->nlmsg_len - sizeof(*hdr) - parser->nl_hdr_off;
+
+ nl_get_attrs_bmask_raw(nla_head, len, bm);
+}
+
#endif
#endif