summaryrefslogtreecommitdiffstats
path: root/src/netlink_linearize.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2015-04-13 12:19:12 +0100
committerPatrick McHardy <kaber@trash.net>2015-06-02 13:03:58 +0200
commit1e4bf9dbb9218030ce9a5ee0b30eb33f918ca6bf (patch)
tree3f2dcad0600a82b3072e337e2b23d6804a862c19 /src/netlink_linearize.c
parent9c286f2d689bbc19889d2f3b69923ad68831b3e7 (diff)
netlink_linearize: generate concat expressions
Use the real length for reserving/releasing registers when generating concat expressions. Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/netlink_linearize.c')
-rw-r--r--src/netlink_linearize.c14
1 files 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,