diff options
Diffstat (limited to 'src/table.c')
-rw-r--r-- | src/table.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/table.c b/src/table.c index af4b13c..33d6a8d 100644 --- a/src/table.c +++ b/src/table.c @@ -79,11 +79,19 @@ void nft_table_attr_unset(struct nft_table *t, uint16_t attr) } EXPORT_SYMBOL(nft_table_attr_unset); -void nft_table_attr_set(struct nft_table *t, uint16_t attr, const void *data) +static uint32_t nft_table_attr_validate[NFT_TABLE_ATTR_MAX + 1] = { + [NFT_TABLE_ATTR_FLAGS] = sizeof(uint32_t), + [NFT_TABLE_ATTR_FAMILY] = sizeof(uint8_t), +}; + +void nft_table_attr_set_data(struct nft_table *t, uint16_t attr, + const void *data, uint32_t data_len) { if (attr > NFT_TABLE_ATTR_MAX) return; + nft_assert_validate(nft_table_attr_validate, attr, data_len); + switch (attr) { case NFT_TABLE_ATTR_NAME: if (t->name) @@ -103,27 +111,34 @@ void nft_table_attr_set(struct nft_table *t, uint16_t attr, const void *data) } t->flags |= (1 << attr); } +EXPORT_SYMBOL(nft_table_attr_set_data); + +void nft_table_attr_set(struct nft_table *t, uint16_t attr, const void *data) +{ + nft_table_attr_set_data(t, attr, data, nft_table_attr_validate[attr]); +} EXPORT_SYMBOL(nft_table_attr_set); void nft_table_attr_set_u32(struct nft_table *t, uint16_t attr, uint32_t val) { - nft_table_attr_set(t, attr, &val); + nft_table_attr_set_data(t, attr, &val, sizeof(uint32_t)); } EXPORT_SYMBOL(nft_table_attr_set_u32); void nft_table_attr_set_u8(struct nft_table *t, uint16_t attr, uint8_t val) { - nft_table_attr_set(t, attr, &val); + nft_table_attr_set_data(t, attr, &val, sizeof(uint8_t)); } EXPORT_SYMBOL(nft_table_attr_set_u8); void nft_table_attr_set_str(struct nft_table *t, uint16_t attr, const char *str) { - nft_table_attr_set(t, attr, str); + nft_table_attr_set_data(t, attr, str, 0); } EXPORT_SYMBOL(nft_table_attr_set_str); -const void *nft_table_attr_get(struct nft_table *t, uint16_t attr) +const void *nft_table_attr_get_data(struct nft_table *t, uint16_t attr, + uint32_t *data_len) { if (!(t->flags & (1 << attr))) return NULL; @@ -132,14 +147,24 @@ const void *nft_table_attr_get(struct nft_table *t, uint16_t attr) case NFT_TABLE_ATTR_NAME: return t->name; case NFT_TABLE_ATTR_FLAGS: + *data_len = sizeof(uint32_t); return &t->table_flags; case NFT_TABLE_ATTR_FAMILY: + *data_len = sizeof(uint8_t); return &t->family; case NFT_TABLE_ATTR_USE: + *data_len = sizeof(uint32_t); return &t->use; } return NULL; } +EXPORT_SYMBOL(nft_table_attr_get_data); + +const void *nft_table_attr_get(struct nft_table *t, uint16_t attr) +{ + uint32_t data_len; + return nft_table_attr_get_data(t, attr, &data_len); +} EXPORT_SYMBOL(nft_table_attr_get); uint32_t nft_table_attr_get_u32(struct nft_table *t, uint16_t attr) |