From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by dpdk.org (Postfix) with ESMTP id 0E59210C49 for ; Wed, 21 Dec 2016 15:52:32 +0100 (CET) Received: by mail-wm0-f45.google.com with SMTP id g23so150568682wme.1 for ; Wed, 21 Dec 2016 06:52:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=cGtYbGHqMziYmcBUMb9NgjmbTpaHftW1xABKH0TyPfc=; b=ZSn3b3gRAOVvpLNkArlJlX7hz6/lB1cRuxL0t1DqvwP8qJ6Dot3Z8aTNC7HwATsJbF yIcwUVs+PfU69gz/uqRt704ao6bs+8YaBD/P9teRtCW6blj7mcQZC/m5srKD6TnSzA9/ KgcZuvLKeJRqeCPTjZ7J3y/NrHrRQZcY7WiZBNV3nHyV6+j9JmEOWpzyHztltOPmKvAb F5l+TymlUEUx+IOcQAtbU+3ApcQYy+qZnkQjlZKVHpgBeZXoPc4GofH2rmacBqdDwuN3 Y2oEDipfkgmeSa5HCJ/igV2GzVaCgnoJBRl8tDKMrHjwQ7wafvIUhKnq7YJ7WbyyOvNl pV0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=cGtYbGHqMziYmcBUMb9NgjmbTpaHftW1xABKH0TyPfc=; b=Yr0RBBOWOybjIuOrBxHa91Fdtq3yAW4BhznocJP5agv32AKa+zhkxdcLJYw5x616z3 K8Vcui01y6LctoReZ3yP5eIs6ZABRh0ur57vHkUaSIqk6yNDca9Vdk45Duv54y3goBRl I7T6UZGs4f3Groo73hnoP/arr8tSKOanPMG+URnNQqsuGFgRXgKtnohUGYNCQ36m/hR1 z//ouZqCcC0JeXdDG+j+mkbLv6BgfcbQvfU6ca96qk7UZcLJ8cIIeK/MEiPgqOpPBEBt vNxhkl5zYZXRw4uMjtcfNQl29wbInS4p7us9n2oc3jgZSv2D1jZQjxx7ZDBJtNti63pJ ZX0g== X-Gm-Message-State: AIkVDXLpf6fpvJupfoMVhyYAhen61ABytIBjgTRnMZop0GYcPObsegNLeZAPcWx925UA1wdW X-Received: by 10.28.52.201 with SMTP id b192mr5128448wma.118.1482331952446; Wed, 21 Dec 2016 06:52:32 -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 jz1sm5468048wjc.38.2016.12.21.06.52.31 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 21 Dec 2016 06:52:31 -0800 (PST) From: Adrien Mazarguil To: dev@dpdk.org Date: Wed, 21 Dec 2016 15:51:31 +0100 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v5 15/26] app/testpmd: add rte_flow item spec prefix length X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Dec 2016 14:52:33 -0000 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 Acked-by: Olga Shern --- 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 7bc1aa7..9a6f37d 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, @@ -278,6 +280,7 @@ static const enum index item_param[] = { ITEM_PARAM_SPEC, ITEM_PARAM_LAST, ITEM_PARAM_MASK, + ITEM_PARAM_PREFIX, ZERO, }; @@ -321,6 +324,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); @@ -361,6 +367,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", @@ -528,6 +541,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", @@ -605,6 +623,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, @@ -776,6 +850,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; -- 2.1.4