diff options
Diffstat (limited to 'src/expr/meta.c')
-rw-r--r-- | src/expr/meta.c | 66 |
1 files changed, 14 insertions, 52 deletions
diff --git a/src/expr/meta.c b/src/expr/meta.c index 601248f..136a450 100644 --- a/src/expr/meta.c +++ b/src/expr/meta.c @@ -14,7 +14,6 @@ #include <string.h> #include <arpa/inet.h> #include <errno.h> -#include <net/if.h> #include <linux/netfilter/nf_tables.h> #include "internal.h" @@ -23,7 +22,7 @@ #include <libnftnl/rule.h> #ifndef NFT_META_MAX -#define NFT_META_MAX (NFT_META_SDIFNAME + 1) +#define NFT_META_MAX (NFT_META_BRI_BROUTE + 1) #endif struct nftnl_expr_meta { @@ -40,16 +39,14 @@ nftnl_expr_meta_set(struct nftnl_expr *e, uint16_t type, switch(type) { case NFTNL_EXPR_META_KEY: - memcpy(&meta->key, data, sizeof(meta->key)); + memcpy(&meta->key, data, data_len); break; case NFTNL_EXPR_META_DREG: - memcpy(&meta->dreg, data, sizeof(meta->dreg)); + memcpy(&meta->dreg, data, data_len); break; case NFTNL_EXPR_META_SREG: - memcpy(&meta->sreg, data, sizeof(meta->sreg)); + memcpy(&meta->sreg, data, data_len); break; - default: - return -1; } return 0; } @@ -133,44 +130,6 @@ nftnl_expr_meta_parse(struct nftnl_expr *e, struct nlattr *attr) return 0; } -static int nftnl_meta_reg_len(const struct nftnl_expr *e) -{ - const struct nftnl_expr_meta *meta = nftnl_expr_data(e); - - switch (meta->key) { - case NFT_META_IIFNAME: - case NFT_META_OIFNAME: - case NFT_META_IIFKIND: - case NFT_META_OIFKIND: - case NFT_META_SDIFNAME: - case NFT_META_BRI_IIFNAME: - case NFT_META_BRI_OIFNAME: - return IFNAMSIZ; - case NFT_META_TIME_NS: - return sizeof(uint64_t); - default: - break; - } - - return sizeof(uint32_t); -} - -static bool nftnl_meta_reg_cmp(const struct nftnl_reg *reg, - const struct nftnl_expr *e) -{ - const struct nftnl_expr_meta *meta = nftnl_expr_data(e); - - return reg->meta.key == meta->key; -} - -static void nftnl_meta_reg_update(struct nftnl_reg *reg, - const struct nftnl_expr *e) -{ - const struct nftnl_expr_meta *meta = nftnl_expr_data(e); - - reg->meta.key = meta->key; -} - static const char *meta_key2str_array[NFT_META_MAX] = { [NFT_META_LEN] = "len", [NFT_META_PROTOCOL] = "protocol", @@ -207,6 +166,7 @@ static const char *meta_key2str_array[NFT_META_MAX] = { [NFT_META_TIME_HOUR] = "hour", [NFT_META_SDIF] = "sdif", [NFT_META_SDIFNAME] = "sdifname", + [NFT_META_BRI_BROUTE] = "broute", }; static const char *meta_key2str(uint8_t key) @@ -247,18 +207,20 @@ nftnl_expr_meta_snprintf(char *buf, size_t len, return 0; } +static struct attr_policy meta_attr_policy[__NFTNL_EXPR_META_MAX] = { + [NFTNL_EXPR_META_KEY] = { .maxlen = sizeof(uint32_t) }, + [NFTNL_EXPR_META_DREG] = { .maxlen = sizeof(uint32_t) }, + [NFTNL_EXPR_META_SREG] = { .maxlen = sizeof(uint32_t) }, +}; + struct expr_ops expr_ops_meta = { .name = "meta", .alloc_len = sizeof(struct nftnl_expr_meta), - .max_attr = NFTA_META_MAX, + .nftnl_max_attr = __NFTNL_EXPR_META_MAX - 1, + .attr_policy = meta_attr_policy, .set = nftnl_expr_meta_set, .get = nftnl_expr_meta_get, .parse = nftnl_expr_meta_parse, .build = nftnl_expr_meta_build, - .snprintf = nftnl_expr_meta_snprintf, - .reg = { - .len = nftnl_meta_reg_len, - .cmp = nftnl_meta_reg_cmp, - .update = nftnl_meta_reg_update, - }, + .output = nftnl_expr_meta_snprintf, }; |