From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wj0-f169.google.com (mail-wj0-f169.google.com [209.85.210.169]) by dpdk.org (Postfix) with ESMTP id 6E6C8FBEA for ; Tue, 20 Dec 2016 19:43:27 +0100 (CET) Received: by mail-wj0-f169.google.com with SMTP id v7so184139965wjy.2 for ; Tue, 20 Dec 2016 10:43:27 -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=otJ1KRANpU+/PRpvzKik0yvWOOAvZIYkHJ5kmcDbQoM8nkGXCwBZSTZtA0Jq+MFkkO Gw4XMoY2+IE4iqXQFkxxaNftQjqUuCVVeD8m0P2+mENaqkUU5ag9I92/cajp0Yd330Y2 XbaO7axAJAGOkxxB28wL6SqU/55wV5PQ/jCGNuB0UuxvZeBNMqJBHKPDVKcyXnTxWJd2 fNAISVWKdMzgrgkd6K9IaQZjfcNLBJpE6A2MDZtyRuaB8JSM/mnAqv0iP24zzSNMczpp 8oe7nrT7uOlQ+Z23aRcbjGIL1FHk8H3wPjRTMLhWD7cZj/6Biz/IPl3C0PLe0BXwKC/i 4y1g== 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=UtxJ3RC0uVyquqKY+aT9Z8dd83MT+J+Rn6uN+fgs0KDRka0kmmE5br3J/TamXe4imZ P2vMSoc2Gnr0LO8S8kGSDU1u8XAwTk/G1/1LzlKdHY2zOSi4wHgwJCRX/o+cWTBeCqP+ 6yKGnQFXcsCpu3v1xT9jbJW56jylNMmPFrsuIdX5ZGHJYJitWMXqcz+kOtIAsKF6dF/X Vq75gMOcD4j/qnl1RH9NmePH3E3XuTGeQisN/H2dhbkQ2+kb1NRRxNHYWSuNMt/pO+xH OxIfOh6pR/zWkO470+GdFST0GMPauzk3c4K8YSqabycJwbKVTU+e82YcuJeGXI5d1S1J 6UWg== X-Gm-Message-State: AIkVDXJBt463mFuDIvHGH4zXD4S4L6ivsp9L/TTSHBeBKb4hZLqdwSM7IhSQkGhIi8Fz0DhX X-Received: by 10.194.26.170 with SMTP id m10mr664389wjg.152.1482259406764; Tue, 20 Dec 2016 10:43:26 -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 l74sm23378332wmg.2.2016.12.20.10.43.25 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 20 Dec 2016 10:43:26 -0800 (PST) From: Adrien Mazarguil To: dev@dpdk.org Date: Tue, 20 Dec 2016 19:42:32 +0100 Message-Id: <8fdb1010b12b58eee2f150bae55980cb00065296.1482257521.git.adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 15/25] 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: Tue, 20 Dec 2016 18:43:27 -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