From patchwork Wed Nov 16 16:23:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 17037 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id ABF3DD4B8; Wed, 16 Nov 2016 17:25:30 +0100 (CET) Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by dpdk.org (Postfix) with ESMTP id B40D75599 for ; Wed, 16 Nov 2016 17:24:37 +0100 (CET) Received: by mail-wm0-f52.google.com with SMTP id a197so249930534wmd.0 for ; Wed, 16 Nov 2016 08:24:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bdFsLAtEhb1kER+daStmsCl/KZAXYNz+hXFo29CtMaI=; b=WHr7tKcCR3lg9PFZxJg4+iaOEQtlz9waYsuwB2NoaUhA56OJney1JdNZ+F5xE37vYt R4vFEuDvZzvPdkZ0qIOtex2bdSS1rP0z2NHm6ljJtag2MYw3OayqIKlXDm3EkZtllU5F I+0DNmgUPuZtIdG+ne1ip1ssoiMozrIyXWmZGKHDPSwzAD2WaDHY8zCF6HWjtaDnt/2E 9c9pGB0I8ER52XvqDO/QMFzEzyBvsQQ0BBVxWsGFYmdRxQhpOUsmy1xYUYH0yrTIeEiy z1zxNlo/cKwANzA88jOYY4ubcyFNPOm4EXvcziF1A3FWIICO+3g0QLQk6muBo0NbPWhI 3wPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bdFsLAtEhb1kER+daStmsCl/KZAXYNz+hXFo29CtMaI=; b=ZenD1ig9xh/XeyAHFrDrrs2tep9k1ZnjIzxr2MdqSmicyzQweZ0d+WEPdpWPpqOqBN /qzT8+Td8BKO1CCfVNOh/0XeIwVfcRuKTmnAw+juTOLRPtMdIqMmKmLaK28eKifYgnVv /hiQHVOIPIVTfdv16XJ2LPscG3Ij/tRawiTcHeDIR5GPe2UZTKQ4+kOcnHyEsCRJHP0p 6kKV9EYHYnO8DCZMeWEX8/zSlMC0H/ebO6rpJsZkhxURf38TBbbWD4h7/dhZnUmXpXRM AsAJT/8bW+nrmT65qQazPGeGXYjVitT7kFiE9LnE/3Bms4/doIveJjgV9G67YDopd9aj pIpQ== X-Gm-Message-State: ABUngvcMmVkOIqg1lagH6vx7rXVGP6MjLZdBrC58Jd4KlNSaZJ6B+ZndH+SADkcjC6RgXz3U X-Received: by 10.28.91.143 with SMTP id p137mr11418126wmb.51.1479313477378; Wed, 16 Nov 2016 08:24:37 -0800 (PST) Received: from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id c202sm12660250wme.1.2016.11.16.08.24.36 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 16 Nov 2016 08:24:36 -0800 (PST) From: Adrien Mazarguil To: dev@dpdk.org Cc: Thomas Monjalon , Pablo de Lara , Olivier Matz Date: Wed, 16 Nov 2016 17:23:39 +0100 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH 13/22] app/testpmd: add rte_flow item spec prefix length X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Generating bit-masks from prefix lengths is often more convenient than providing them entirely (e.g. to define IPv4 and IPv6 subnets). This commit adds the "prefix" operator that assigns generated bit-masks to any pattern item specification field. Signed-off-by: Adrien Mazarguil --- app/test-pmd/cmdline_flow.c | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 790b4b8..89307cb 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -56,6 +56,7 @@ enum index { /* Common tokens. */ INTEGER, UNSIGNED, + PREFIX, RULE_ID, PORT_ID, GROUP_ID, @@ -93,6 +94,7 @@ enum index { ITEM_PARAM_SPEC, ITEM_PARAM_LAST, ITEM_PARAM_MASK, + ITEM_PARAM_PREFIX, ITEM_NEXT, ITEM_END, ITEM_VOID, @@ -277,6 +279,7 @@ static const enum index item_param[] = { ITEM_PARAM_SPEC, ITEM_PARAM_LAST, ITEM_PARAM_MASK, + ITEM_PARAM_PREFIX, 0, }; @@ -320,6 +323,9 @@ static int parse_list(struct context *, const struct token *, static int parse_int(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); +static int parse_prefix(struct context *, const struct token *, + const char *, unsigned int, + void *, unsigned int); static int parse_port(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); @@ -360,6 +366,13 @@ static const struct token token_list[] = { .call = parse_int, .comp = comp_none, }, + [PREFIX] = { + .name = "{prefix}", + .type = "PREFIX", + .help = "prefix length for bit-mask", + .call = parse_prefix, + .comp = comp_none, + }, [RULE_ID] = { .name = "{rule id}", .type = "RULE ID", @@ -527,6 +540,11 @@ static const struct token token_list[] = { .help = "specify bit-mask with relevant bits set to one", .call = parse_vc_spec, }, + [ITEM_PARAM_PREFIX] = { + .name = "prefix", + .help = "generate bit-mask from a prefix length", + .call = parse_vc_spec, + }, [ITEM_NEXT] = { .name = "/", .help = "specify next pattern item", @@ -604,6 +622,62 @@ push_args(struct context *ctx, const struct arg *arg) return 0; } +/** + * Parse a prefix length and generate a bit-mask. + * + * Last argument (ctx->args) is retrieved to determine mask size, storage + * location and whether the result must use network byte ordering. + */ +static int +parse_prefix(struct context *ctx, const struct token *token, + const char *str, unsigned int len, + void *buf, unsigned int size) +{ + const struct arg *arg = pop_args(ctx); + static const uint8_t conv[] = "\x00\x80\xc0\xe0\xf0\xf8\xfc\xfe\xff"; + char *end; + uintmax_t u; + unsigned int bytes; + unsigned int extra; + + (void)token; + /* Argument is expected. */ + if (!arg) + return -1; + errno = 0; + u = strtoumax(str, &end, 0); + if (errno || (size_t)(end - str) != len) + goto error; + bytes = u / 8; + extra = u % 8; + size = arg->size; + if (bytes > size || bytes + !!extra > size) + goto error; + if (!ctx->object) + return len; + buf = (uint8_t *)ctx->object + arg->offset; +#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN + if (!arg->hton) { + memset((uint8_t *)buf + size - bytes, 0xff, bytes); + memset(buf, 0x00, size - bytes); + if (extra) + ((uint8_t *)buf)[size - bytes - 1] = conv[extra]; + } else +#endif + { + memset(buf, 0xff, bytes); + memset((uint8_t *)buf + bytes, 0x00, size - bytes); + if (extra) + ((uint8_t *)buf)[bytes] = conv[extra]; + } + if (ctx->objmask) + memset((uint8_t *)ctx->objmask + arg->offset, 0xff, size); + return len; +error: + push_args(ctx, arg); + return -1; +} + /** Default parsing function for token name matching. */ static int parse_default(struct context *ctx, const struct token *token, @@ -775,6 +849,12 @@ parse_vc_spec(struct context *ctx, const struct token *token, case ITEM_PARAM_LAST: index = 1; break; + case ITEM_PARAM_PREFIX: + /* Modify next token to expect a prefix. */ + if (ctx->next_num < 2) + return -1; + ctx->next[ctx->next_num - 2] = NEXT_ENTRY(PREFIX); + /* Fall through. */ case ITEM_PARAM_MASK: index = 2; break;