git: 832594e4e294 - stable/13 - pf: Convenience function for optional (numeric) arguments

Kristof Provost kp at FreeBSD.org
Mon Jun 14 16:35:34 UTC 2021


The branch stable/13 has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=832594e4e29485880cb6db2bacfdc26e74ea7258

commit 832594e4e29485880cb6db2bacfdc26e74ea7258
Author:     Kristof Provost <kp at FreeBSD.org>
AuthorDate: 2021-05-15 11:45:55 +0000
Commit:     Kristof Provost <kp at FreeBSD.org>
CommitDate: 2021-06-14 16:14:23 +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
    
    (cherry picked from commit 7c4342890bf17b72f0d79ada1326d9cbf34e736c)
---
 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 dab72f04d138..31943ba69687 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 */


More information about the dev-commits-src-all mailing list