summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/meta.c39
1 files changed, 37 insertions, 2 deletions
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);
}