diff options
Diffstat (limited to 'src/rt.c')
-rw-r--r-- | src/rt.c | 66 |
1 files changed, 61 insertions, 5 deletions
@@ -8,12 +8,11 @@ * published by the Free Software Foundation. */ +#include <nft.h> + #include <errno.h> #include <stddef.h> -#include <stdlib.h> #include <stdio.h> -#include <stdint.h> -#include <string.h> #include <arpa/inet.h> #include <linux/netfilter.h> @@ -26,7 +25,7 @@ void realm_table_rt_init(struct nft_ctx *ctx) { - ctx->output.tbl.realm = rt_symbol_table_init("/etc/iproute2/rt_realms"); + ctx->output.tbl.realm = rt_symbol_table_init("rt_realms"); } void realm_table_rt_exit(struct nft_ctx *ctx) @@ -46,16 +45,22 @@ static struct error_record *realm_type_parse(struct parse_ctx *ctx, return symbolic_constant_parse(ctx, sym, ctx->tbl->realm, res); } +static void realm_type_describe(struct output_ctx *octx) +{ + rt_symbol_table_describe(octx, "rt_realms", + octx->tbl.realm, &realm_type); +} + const struct datatype realm_type = { .type = TYPE_REALM, .name = "realm", .desc = "routing realm", + .describe = realm_type_describe, .byteorder = BYTEORDER_HOST_ENDIAN, .size = 4 * BITS_PER_BYTE, .basetype = &integer_type, .print = realm_type_print, .parse = realm_type_parse, - .flags = DTYPE_F_PREFIX, }; const struct rt_template rt_templates[] = { @@ -114,6 +119,55 @@ static void rt_expr_clone(struct expr *new, const struct expr *expr) new->rt.key = expr->rt.key; } +#define NFTNL_UDATA_RT_KEY 0 +#define NFTNL_UDATA_RT_MAX 1 + +static int rt_expr_build_udata(struct nftnl_udata_buf *udbuf, + const struct expr *expr) +{ + nftnl_udata_put_u32(udbuf, NFTNL_UDATA_RT_KEY, expr->rt.key); + + return 0; +} + +static int rt_parse_udata(const struct nftnl_udata *attr, void *data) +{ + const struct nftnl_udata **ud = data; + uint8_t type = nftnl_udata_type(attr); + uint8_t len = nftnl_udata_len(attr); + + switch (type) { + case NFTNL_UDATA_RT_KEY: + if (len != sizeof(uint32_t)) + return -1; + break; + default: + return 0; + } + + ud[type] = attr; + return 0; +} + +static struct expr *rt_expr_parse_udata(const struct nftnl_udata *attr) +{ + const struct nftnl_udata *ud[NFTNL_UDATA_RT_MAX + 1] = {}; + uint32_t key; + int err; + + err = nftnl_udata_parse(nftnl_udata_get(attr), nftnl_udata_len(attr), + rt_parse_udata, ud); + if (err < 0) + return NULL; + + if (!ud[NFTNL_UDATA_RT_KEY]) + return NULL; + + key = nftnl_udata_get_u32(ud[NFTNL_UDATA_RT_KEY]); + + return rt_expr_alloc(&internal_location, key, false); +} + const struct expr_ops rt_expr_ops = { .type = EXPR_RT, .name = "rt", @@ -121,6 +175,8 @@ const struct expr_ops rt_expr_ops = { .json = rt_expr_json, .cmp = rt_expr_cmp, .clone = rt_expr_clone, + .parse_udata = rt_expr_parse_udata, + .build_udata = rt_expr_build_udata, }; struct expr *rt_expr_alloc(const struct location *loc, enum nft_rt_keys key, |