aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2021-05-15 11:45:55 +0000
committerKristof Provost <kp@FreeBSD.org>2021-05-31 12:19:17 +0000
commit7c4342890bf17b72f0d79ada1326d9cbf34e736c (patch)
tree188e0b35ce5627d0741aeb21df32a3e3ff8bcf28
parent27c77f42ae7402c313deec47aa67a8a8e0889410 (diff)
downloadsrc-7c4342890bf17b72f0d79ada1326d9cbf34e736c.tar.gz
src-7c4342890bf17b72f0d79ada1326d9cbf34e736c.zip
pf: Convenience function for optional (numeric) arguments
Add _opt() variants for the uint* functions. These functions set the provided default value if the nvlist doesn't contain the relevant value. This is helpful for optional values (e.g. when the API is extended to add new fields). While here simplify the header by also using macros to create the prototypes for the macro-generated function implementations. Reviewed by: scottl MFC after: 2 weeks Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D30510
-rw-r--r--sys/netpfil/pf/pf_nv.c15
-rw-r--r--sys/netpfil/pf/pf_nv.h35
2 files changed, 29 insertions, 21 deletions
diff --git a/sys/netpfil/pf/pf_nv.c b/sys/netpfil/pf/pf_nv.c
index 863259dbf9aa..ae9f7d99b26a 100644
--- a/sys/netpfil/pf/pf_nv.c
+++ b/sys/netpfil/pf/pf_nv.c
@@ -41,6 +41,21 @@ __FBSDID("$FreeBSD$");
#define PF_NV_IMPL_UINT(fnname, type, max) \
int \
+ pf_nv ## fnname ## _opt(const nvlist_t *nvl, const char *name, \
+ type *val, type dflt) \
+ { \
+ uint64_t raw; \
+ if (! nvlist_exists_number(nvl, name)) { \
+ *val = dflt; \
+ return (0); \
+ } \
+ raw = nvlist_get_number(nvl, name); \
+ if (raw > max) \
+ return (ERANGE); \
+ *val = (type)raw; \
+ return (0); \
+ } \
+ int \
pf_nv ## fnname(const nvlist_t *nvl, const char *name, type *val) \
{ \
uint64_t raw; \
diff --git a/sys/netpfil/pf/pf_nv.h b/sys/netpfil/pf/pf_nv.h
index 321c0425fe7f..e53d19018ffe 100644
--- a/sys/netpfil/pf/pf_nv.h
+++ b/sys/netpfil/pf/pf_nv.h
@@ -56,29 +56,22 @@ SDT_PROBE_DECLARE(pf, ioctl, nvchk, error);
goto errout; \
} while (0)
+#define PF_NV_DEF_UINT(fnname, type, max) \
+ int pf_nv ## fnname ## _opt(const nvlist_t *, const char *, \
+ type *, type); \
+ int pf_nv ## fnname(const nvlist_t *, const char *, type *); \
+ int pf_nv ## fnname ## _array(const nvlist_t *, const char *, \
+ type *,size_t, size_t *); \
+ void pf_ ## fnname ## _array_nv(nvlist_t *, const char *, \
+ const type *, size_t);
+
+PF_NV_DEF_UINT(uint8, uint8_t, UINT8_MAX);
+PF_NV_DEF_UINT(uint16, uint16_t, UINT16_MAX);
+PF_NV_DEF_UINT(uint32, uint32_t, UINT32_MAX);
+PF_NV_DEF_UINT(uint64, uint64_t, UINT64_MAX);
+
int pf_nvbinary(const nvlist_t *, const char *, void *, size_t);
int pf_nvint(const nvlist_t *, const char *, int *);
-int pf_nvuint8(const nvlist_t *, const char *, uint8_t *);
-int pf_nvuint8_array(const nvlist_t *, const char *, uint8_t *,
- size_t, size_t *);
-void pf_uint8_array_nv(nvlist_t *, const char *, const uint8_t *,
- size_t);
-int pf_nvuint16(const nvlist_t *, const char *, uint16_t *);
-int pf_nvuint16_array(const nvlist_t *, const char *, uint16_t *,
- size_t, size_t *);
-void pf_uint16_array_nv(nvlist_t *, const char *, const uint16_t *,
- size_t);
-int pf_nvuint32(const nvlist_t *, const char *, uint32_t *);
-int pf_nvuint32_array(const nvlist_t *, const char *, uint32_t *,
- size_t, size_t *);
-void pf_uint32_array_nv(nvlist_t *, const char *, const uint32_t *,
- size_t);
-int pf_nvuint64(const nvlist_t *, const char *, uint64_t *);
-int pf_nvuint64_array(const nvlist_t *, const char *, uint64_t *,
- size_t, size_t *);
-void pf_uint64_array_nv(nvlist_t *, const char *, const uint64_t *,
- size_t);
-
int pf_nvstring(const nvlist_t *, const char *, char *, size_t);
/* Translation functions */