Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 May 2021 13:38:48 GMT
From:      Kristof Provost <kp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 7c4342890bf1 - main - pf: Convenience function for optional (numeric) arguments
Message-ID:  <202105311338.14VDcmw3078059@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=7c4342890bf17b72f0d79ada1326d9cbf34e736c

commit 7c4342890bf17b72f0d79ada1326d9cbf34e736c
Author:     Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2021-05-15 11:45:55 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2021-05-31 12:19:17 +0000

    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
---
 sys/netpfil/pf/pf_nv.c | 15 +++++++++++++++
 sys/netpfil/pf/pf_nv.h | 35 ++++++++++++++---------------------
 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
@@ -40,6 +40,21 @@ __FBSDID("$FreeBSD$");
 #include <netpfil/pf/pf_nv.h>
 
 #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)	\
 	{									\
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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202105311338.14VDcmw3078059>