From 8f4c613c9c1aa0ea6b565bbd1c5332317a3e7fdc Mon Sep 17 00:00:00 2001 From: Ana Rey Date: Thu, 23 Oct 2014 14:44:19 +0200 Subject: meta: Add support for datatype devgroup This adds the new devgroup datatype to get the group name from /etc/iproute2/group file. Example of use: nft add rule ip test input meta iifgroup 0 counter nft add rule ip test input meta iifgroup default counter Moreover, It adds tests in meta.t test file. Signed-off-by: Ana Rey Signed-off-by: Pablo Neira Ayuso --- src/meta.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/meta.c') diff --git a/src/meta.c b/src/meta.c index cea3ccbb..faa29eb8 100644 --- a/src/meta.c +++ b/src/meta.c @@ -349,6 +349,40 @@ static const struct datatype pkttype_type = { .parse = pkttype_type_parse, }; +static struct symbol_table *devgroup_tbl; +static void __init devgroup_table_init(void) +{ + devgroup_tbl = rt_symbol_table_init("/etc/iproute2/group"); +} + +static void __exit devgroup_table_exit(void) +{ + rt_symbol_table_free(devgroup_tbl); +} + +static void devgroup_type_print(const struct expr *expr) +{ + return symbolic_constant_print(devgroup_tbl, expr); +} + +static struct error_record *devgroup_type_parse(const struct expr *sym, + struct expr **res) +{ + return symbolic_constant_parse(sym, devgroup_tbl, res); +} + +static const struct datatype devgroup_type = { + .type = TYPE_DEVGROUP, + .name = "devgroup", + .desc = "devgroup name", + .byteorder = BYTEORDER_HOST_ENDIAN, + .size = 4 * BITS_PER_BYTE, + .basetype = &integer_type, + .print = devgroup_type_print, + .parse = devgroup_type_parse, + .flags = DTYPE_F_PREFIX, +}; + static const struct meta_template meta_templates[] = { [NFT_META_LEN] = META_TEMPLATE("length", &integer_type, 4 * 8, BYTEORDER_HOST_ENDIAN), @@ -396,10 +430,10 @@ static const struct meta_template meta_templates[] = { [NFT_META_CPU] = META_TEMPLATE("cpu", &integer_type, 4 * BITS_PER_BYTE, BYTEORDER_HOST_ENDIAN), - [NFT_META_IIFGROUP] = META_TEMPLATE("iifgroup", &integer_type, + [NFT_META_IIFGROUP] = META_TEMPLATE("iifgroup", &devgroup_type, 4 * BITS_PER_BYTE, BYTEORDER_HOST_ENDIAN), - [NFT_META_OIFGROUP] = META_TEMPLATE("oifgroup", &integer_type, + [NFT_META_OIFGROUP] = META_TEMPLATE("oifgroup", &devgroup_type, 4 * BITS_PER_BYTE, BYTEORDER_HOST_ENDIAN), }; @@ -546,4 +580,5 @@ static void __init meta_init(void) datatype_register(&tchandle_type); datatype_register(&uid_type); datatype_register(&gid_type); + datatype_register(&devgroup_type); } -- cgit v1.2.3