summaryrefslogtreecommitdiffstats
path: root/src/expr/meta.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/meta.c')
-rw-r--r--src/expr/meta.c66
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,
};