summaryrefslogtreecommitdiffstats
path: root/src/expr/fib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/fib.c')
-rw-r--r--src/expr/fib.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/expr/fib.c b/src/expr/fib.c
index aaff52a..59b335a 100644
--- a/src/expr/fib.c
+++ b/src/expr/fib.c
@@ -14,6 +14,7 @@
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
+#include <net/if.h>
#include <linux/netfilter/nf_tables.h>
#include "internal.h"
@@ -128,6 +129,45 @@ nftnl_expr_fib_parse(struct nftnl_expr *e, struct nlattr *attr)
return ret;
}
+static int
+nftnl_expr_fib_reg_len(const struct nftnl_expr *e)
+{
+ const struct nftnl_expr_fib *fib = nftnl_expr_data(e);
+
+ switch (fib->result) {
+ case NFT_FIB_RESULT_OIF:
+ return sizeof(int);
+ case NFT_FIB_RESULT_OIFNAME:
+ return IFNAMSIZ;
+ case NFT_FIB_RESULT_ADDRTYPE:
+ return sizeof(uint32_t);
+ default:
+ assert(0);
+ break;
+ }
+ return sizeof(uint32_t);
+}
+
+static bool
+nftnl_expr_fib_reg_cmp(const struct nftnl_reg *reg,
+ const struct nftnl_expr *e)
+{
+ const struct nftnl_expr_fib *fib = nftnl_expr_data(e);
+
+ return reg->fib.result == fib->result &&
+ reg->fib.flags == fib->flags;
+}
+
+static void
+nftnl_expr_fib_reg_update(struct nftnl_reg *reg,
+ const struct nftnl_expr *e)
+{
+ const struct nftnl_expr_fib *fib = nftnl_expr_data(e);
+
+ reg->fib.result = fib->result;
+ reg->fib.flags = fib->flags;
+}
+
static const char *fib_type[NFT_FIB_RESULT_MAX + 1] = {
[NFT_FIB_RESULT_OIF] = "oif",
[NFT_FIB_RESULT_OIFNAME] = "oifname",
@@ -199,4 +239,9 @@ struct expr_ops expr_ops_fib = {
.parse = nftnl_expr_fib_parse,
.build = nftnl_expr_fib_build,
.snprintf = nftnl_expr_fib_snprintf,
+ .reg = {
+ .len = nftnl_expr_fib_reg_len,
+ .cmp = nftnl_expr_fib_reg_cmp,
+ .update = nftnl_expr_fib_reg_update,
+ },
};