Changeset View
Changeset View
Standalone View
Standalone View
sys/netpfil/pf/pf_nv.c
Show All 31 Lines | |||||
#include <sys/errno.h> | #include <sys/errno.h> | ||||
#include <sys/limits.h> | #include <sys/limits.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <netpfil/pf/pf_nv.h> | #include <netpfil/pf/pf_nv.h> | ||||
#define PV_NV_IMPL_UINT(fnname, type, max) \ | #define PV_NV_IMPL_UINT(fnname, type, max) \ | ||||
int \ | int \ | ||||
fnname(const nvlist_t *nvl, const char *name, type *val) \ | pf_nv ## fnname(const nvlist_t *nvl, const char *name, type *val) \ | ||||
{ \ | { \ | ||||
uint64_t raw; \ | uint64_t raw; \ | ||||
if (! nvlist_exists_number(nvl, name)) \ | if (! nvlist_exists_number(nvl, name)) \ | ||||
return (EINVAL); \ | return (EINVAL); \ | ||||
raw = nvlist_get_number(nvl, name); \ | raw = nvlist_get_number(nvl, name); \ | ||||
if (raw > max) \ | if (raw > max) \ | ||||
return (ERANGE); \ | return (ERANGE); \ | ||||
*val = (type)raw; \ | *val = (type)raw; \ | ||||
return (0); \ | return (0); \ | ||||
} \ | } \ | ||||
int \ | int \ | ||||
fnname ## _array(const nvlist_t *nvl, const char *name, type *array, \ | pf_nv ## fnname ## _array(const nvlist_t *nvl, const char *name, \ | ||||
size_t maxelems, size_t *nelems) \ | type *array, size_t maxelems, size_t *nelems) \ | ||||
{ \ | { \ | ||||
const uint64_t *n; \ | const uint64_t *n; \ | ||||
size_t nitems; \ | size_t nitems; \ | ||||
bzero(array, sizeof(type) * maxelems); \ | bzero(array, sizeof(type) * maxelems); \ | ||||
if (! nvlist_exists_number_array(nvl, name)) \ | if (! nvlist_exists_number_array(nvl, name)) \ | ||||
return (EINVAL); \ | return (EINVAL); \ | ||||
n = nvlist_get_number_array(nvl, name, &nitems); \ | n = nvlist_get_number_array(nvl, name, &nitems); \ | ||||
if (nitems != maxelems) \ | if (nitems != maxelems) \ | ||||
return (E2BIG); \ | return (E2BIG); \ | ||||
if (nelems != NULL) \ | if (nelems != NULL) \ | ||||
*nelems = nitems; \ | *nelems = nitems; \ | ||||
for (size_t i = 0; i < nitems; i++) { \ | for (size_t i = 0; i < nitems; i++) { \ | ||||
if (n[i] > max) \ | if (n[i] > max) \ | ||||
return (ERANGE); \ | return (ERANGE); \ | ||||
array[i] = (type)n[i]; \ | array[i] = (type)n[i]; \ | ||||
} \ | } \ | ||||
return (0); \ | return (0); \ | ||||
} \ | |||||
void \ | |||||
pf_ ## fnname ## _array_nv(nvlist_t *nvl, const char *name, \ | |||||
const type *numbers, size_t count) \ | |||||
{ \ | |||||
uint64_t tmp; \ | |||||
for (size_t i = 0; i < count; i++) { \ | |||||
tmp = numbers[i]; \ | |||||
nvlist_append_number_array(nvl, name, tmp); \ | |||||
} \ | |||||
} | } | ||||
int | int | ||||
pf_nvbinary(const nvlist_t *nvl, const char *name, void *data, | pf_nvbinary(const nvlist_t *nvl, const char *name, void *data, | ||||
size_t expected_size) | size_t expected_size) | ||||
{ | { | ||||
const uint8_t *nvdata; | const uint8_t *nvdata; | ||||
size_t len; | size_t len; | ||||
bzero(data, expected_size); | bzero(data, expected_size); | ||||
if (! nvlist_exists_binary(nvl, name)) | if (! nvlist_exists_binary(nvl, name)) | ||||
return (EINVAL); | return (EINVAL); | ||||
nvdata = (const uint8_t *)nvlist_get_binary(nvl, name, &len); | nvdata = (const uint8_t *)nvlist_get_binary(nvl, name, &len); | ||||
if (len > expected_size) | if (len > expected_size) | ||||
return (EINVAL); | return (EINVAL); | ||||
memcpy(data, nvdata, len); | memcpy(data, nvdata, len); | ||||
return (0); | return (0); | ||||
} | } | ||||
PV_NV_IMPL_UINT(pf_nvuint8, uint8_t, UINT8_MAX) | PV_NV_IMPL_UINT(uint8, uint8_t, UINT8_MAX) | ||||
PV_NV_IMPL_UINT(pf_nvuint16, uint16_t, UINT16_MAX); | PV_NV_IMPL_UINT(uint16, uint16_t, UINT16_MAX); | ||||
PV_NV_IMPL_UINT(pf_nvuint32, uint32_t, UINT32_MAX) | PV_NV_IMPL_UINT(uint32, uint32_t, UINT32_MAX) | ||||
int | int | ||||
pf_nvint(const nvlist_t *nvl, const char *name, int *val) | pf_nvint(const nvlist_t *nvl, const char *name, int *val) | ||||
{ | { | ||||
int64_t raw; | int64_t raw; | ||||
if (! nvlist_exists_number(nvl, name)) | if (! nvlist_exists_number(nvl, name)) | ||||
return (EINVAL); | return (EINVAL); | ||||
Show All 24 Lines |