On Tue, Jul 30, 2019 at 04:37:31PM +0200, Florian Westphal wrote: [...] > diff --git a/include/rule.h b/include/rule.h > index ee881b9ccd17..dfb6b5482a1c 100644 > --- a/include/rule.h > +++ b/include/rule.h > @@ -277,8 +277,7 @@ extern struct rule *rule_lookup_by_index(const struct chain *chain, > * @gc_int: garbage collection interval > * @timeout: default timeout value > * @key: key expression (data type, length)) > - * @datatype: mapping data type > - * @datalen: mapping data len > + * @data: mapping data expression > * @objtype: mapping object type > * @init: initializer > * @rg_cache: cached range element (left) > @@ -295,8 +294,7 @@ struct set { > uint32_t gc_int; > uint64_t timeout; > struct expr *key; > - const struct datatype *datatype; > - unsigned int datalen; > + struct expr *data; > uint32_t objtype; > struct expr *init; > struct expr *rg_cache; [...] > diff --git a/src/evaluate.c b/src/evaluate.c > index 48c65cd2f35a..6277f6545c1b 100644 > --- a/src/evaluate.c > +++ b/src/evaluate.c > @@ -1332,6 +1332,63 @@ static int expr_evaluate_set(struct eval_ctx *ctx, struct expr **expr) > return 0; > } > > +static struct expr *concat_expr_alloc_by_type_FIXME(uint32_t type) > +{ > + struct expr *concat_expr = concat_expr_alloc(&netlink_location); > + unsigned int n; > + int size = 0; > + > + n = div_round_up(fls(type), TYPE_BITS); > + while (n > 0 && concat_subtype_id(type, --n)) { > + const struct datatype *i; > + struct expr *expr; > + > + i = concat_subtype_lookup(type, n); > + if (i == NULL) > + return NULL; > + > + if (i->size == 0) > + size = -1; > + else if (size >= 0) > + size += i->size; > + > + expr = constant_expr_alloc(&netlink_location, i, i->byteorder, > + i->size, NULL); > + > + compound_expr_add(concat_expr, expr); > + } > + > + /* can be incorrect in case of i->size being 0 (variable length). */ > + concat_expr->len = size > 0 ? size : 0; > + > + return concat_expr; > +} > + > +static struct expr * > +data_expr_alloc_by_type_FIXME(enum nft_data_types type, enum byteorder keybyteorder) There is no support for concatenations from the right hand side of the mapping, so I would just calloc a constant expression itself. Hence, you wont' need concat_expr_alloc_by_type_FIXME() and this function will be more simple. Same comment applies to dtype_map_from_kernel(). In general, I agree in the direction where this is going, that is, turn the datatype field in the set object into an expression. Thanks.