diff options
author | Ana Rey <anarey@gmail.com> | 2014-10-23 14:44:19 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-10-24 12:05:29 +0200 |
commit | 8f4c613c9c1aa0ea6b565bbd1c5332317a3e7fdc (patch) | |
tree | bbca9b74042975d2960da871ad31fe402bdece56 /src/meta.c | |
parent | 00a9ab8484c817853d692d7f88a206a97cb40a47 (diff) |
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 <anarey@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/meta.c')
-rw-r--r-- | src/meta.c | 39 |
1 files changed, 37 insertions, 2 deletions
@@ -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); } |