aboutsummaryrefslogtreecommitdiff
path: root/sys/netlink/netlink_message_parser.c
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2023-03-15 12:31:45 +0000
committerKristof Provost <kp@FreeBSD.org>2023-03-20 13:37:09 +0000
commit137818006de5bb0be0b6562a0d601977f85c6867 (patch)
tree2ae84bcb3d05cc2abe8948317fec3f798a4b2499 /sys/netlink/netlink_message_parser.c
parent3afba490c1266200e9fd899f2494aa47f71c6095 (diff)
Diffstat (limited to 'sys/netlink/netlink_message_parser.c')
-rw-r--r--sys/netlink/netlink_message_parser.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/netlink/netlink_message_parser.c b/sys/netlink/netlink_message_parser.c
index e30138266d9d..d0aaf4301872 100644
--- a/sys/netlink/netlink_message_parser.c
+++ b/sys/netlink/netlink_message_parser.c
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <net/route/nhop.h>
#include <net/route/route_ctl.h>
+#include <netinet/in.h>
#include <netlink/netlink.h>
#include <netlink/netlink_ctl.h>
#include <netlink/netlink_var.h>
@@ -349,6 +350,30 @@ nlattr_get_uint64(struct nlattr *nla, struct nl_pstate *npt, const void *arg, vo
return (0);
}
+int
+nlattr_get_in_addr(struct nlattr *nla, struct nl_pstate *npt, const void *arg, void *target)
+{
+ if (__predict_false(NLA_DATA_LEN(nla) != sizeof(in_addr_t))) {
+ NLMSG_REPORT_ERR_MSG(npt, "nla type %d size(%u) is not in_addr_t",
+ nla->nla_type, NLA_DATA_LEN(nla));
+ return (EINVAL);
+ }
+ memcpy(target, NLA_DATA_CONST(nla), sizeof(in_addr_t));
+ return (0);
+}
+
+int
+nlattr_get_in6_addr(struct nlattr *nla, struct nl_pstate *npt, const void *arg, void *target)
+{
+ if (__predict_false(NLA_DATA_LEN(nla) != sizeof(struct in6_addr))) {
+ NLMSG_REPORT_ERR_MSG(npt, "nla type %d size(%u) is not struct in6_addr",
+ nla->nla_type, NLA_DATA_LEN(nla));
+ return (EINVAL);
+ }
+ memcpy(target, NLA_DATA_CONST(nla), sizeof(struct in6_addr));
+ return (0);
+}
+
static int
nlattr_get_ifp_internal(struct nlattr *nla, struct nl_pstate *npt,
void *target, bool zero_ok)