From 1e4bf9dbb9218030ce9a5ee0b30eb33f918ca6bf Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Mon, 13 Apr 2015 12:19:12 +0100 Subject: netlink_linearize: generate concat expressions Use the real length for reserving/releasing registers when generating concat expressions. Signed-off-by: Patrick McHardy --- src/netlink_linearize.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c index 6930b39d..bf1e56be 100644 --- a/src/netlink_linearize.c +++ b/src/netlink_linearize.c @@ -68,13 +68,19 @@ static void __release_register(struct netlink_linearize_ctx *ctx, static enum nft_registers get_register(struct netlink_linearize_ctx *ctx, const struct expr *expr) { - return __get_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE); + if (expr && expr->ops->type == EXPR_CONCAT) + return __get_register(ctx, expr->len); + else + return __get_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE); } static void release_register(struct netlink_linearize_ctx *ctx, const struct expr *expr) { - __release_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE); + if (expr && expr->ops->type == EXPR_CONCAT) + __release_register(ctx, expr->len); + else + __release_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE); } static void netlink_gen_expr(struct netlink_linearize_ctx *ctx, @@ -87,8 +93,10 @@ static void netlink_gen_concat(struct netlink_linearize_ctx *ctx, { const struct expr *i; - list_for_each_entry(i, &expr->expressions, list) + list_for_each_entry(i, &expr->expressions, list) { netlink_gen_expr(ctx, i, dreg); + dreg += netlink_register_space(i->len); + } } static void netlink_gen_payload(struct netlink_linearize_ctx *ctx, -- cgit v1.2.3