From patchwork Fri Jun 5 13:42:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick McHardy X-Patchwork-Id: 481207 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 61D331401AF for ; Fri, 5 Jun 2015 23:43:06 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753707AbbFENnE (ORCPT ); Fri, 5 Jun 2015 09:43:04 -0400 Received: from stinky.trash.net ([213.144.137.162]:59942 "EHLO stinky.trash.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751376AbbFENm4 (ORCPT ); Fri, 5 Jun 2015 09:42:56 -0400 Received: from acer.localdomain.Speedport_W_700V (localhost [127.0.0.1]) by stinky.trash.net (Postfix) with ESMTP id 8EB169D2E8; Fri, 5 Jun 2015 15:42:54 +0200 (MEST) From: Patrick McHardy To: pablo@netfilter.org Cc: netfilter-devel@vger.kernel.org Subject: [PATCH nft 5/9] netlink_linearize: generate concat expressions Date: Fri, 5 Jun 2015 15:42:47 +0200 Message-Id: <1433511771-4620-6-git-send-email-kaber@trash.net> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1433511771-4620-1-git-send-email-kaber@trash.net> References: <1433511771-4620-1-git-send-email-kaber@trash.net> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org 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 6930b39..bf1e56b 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,