static struct expr *concat_expr_parse_udata(const struct nftnl_udata *attr)
{
const struct nftnl_udata *ud[NFTNL_UDATA_SET_KEY_CONCAT_NEST_MAX] = {};
+ const struct datatype *dtype;
struct expr *concat_expr;
- struct datatype *dtype;
+ uint32_t dt = 0;
unsigned int i;
int err;
if (!concat_expr)
return NULL;
- dtype = xzalloc(sizeof(*dtype));
-
for (i = 0; i < array_size(ud); i++) {
const struct nftnl_udata *nest_ud[NFTNL_UDATA_SET_KEY_CONCAT_SUB_MAX];
const struct nftnl_udata *nested, *subdata;
if (!expr)
goto err_free;
- dtype->subtypes++;
+ dt = concat_subtype_add(dt, expr->dtype->type);
compound_expr_add(concat_expr, expr);
- dtype->size += round_up(expr->len, BITS_PER_BYTE * sizeof(uint32_t));
}
+ dtype = concat_type_alloc(dt);
+ if (!dtype)
+ goto err_free;
+
concat_expr->dtype = dtype;
concat_expr->len = dtype->size;
elements = { 1 : 0x00000001, 4095 : 0x00004095 }
}
+ map m3 {
+ typeof ip saddr . ip daddr : meta mark
+ elements = { 1.2.3.4 . 5.6.7.8 : 0x00000001,
+ 2.3.4.5 . 6.7.8.9 : 0x00000002 }
+ }
+
chain c {
ct mark set osf name map @m1
meta mark set vlan id map @m2
+ meta mark set ip saddr . ip daddr map @m3
}
}
4095 : 0x4095 }
}
+ map m3 {
+ typeof ip saddr . ip daddr : meta mark
+ elements = { 1.2.3.4 . 5.6.7.8 : 0x00000001,
+ 2.3.4.5 . 6.7.8.9 : 0x00000002 }
+ }
+
chain c {
ct mark set osf name map @m1
ether type vlan meta mark set vlan id map @m2
+ meta mark set ip saddr . ip daddr map @m3
}
}"