From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id B3F5CFBE0 for ; Tue, 20 Dec 2016 19:43:43 +0100 (CET) Received: by mail-wm0-f49.google.com with SMTP id g23so2251357wme.1 for ; Tue, 20 Dec 2016 10:43:43 -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=uwbkkZz+1+VTAaTPBwSELzudTnrNHY5iz13KZgOvsT8=; b=nWbG45Q5ER9Cc5Hvz2MnGR3V1mpG/3kPvyIWxzrTB0nUEefKbFcP5fhrB9yw5NWyHO l+T+lhjeOm3kQWvdjE5onWAiQaPR+/TSX/6dFJNq4DV6bDL6m7HTU+lmNw9LB9Nhk3Qg BZC6ReJoAF5QXyNBgDJAH/v8jgKhvvAhTAdG374pxUWNSUixh8Y3K1FYdHmBSFSdzWxd ZD5sc1XvhpRN8NSZSPTiLcNq9ZrAXzXjJEghgRa/aiyKbGGzFdp0800eGlwox+Du2l7q hPwKLszUBMfqlZk3O28Uky+2xaywB+PaCbamgIpPDIa84oGATbRTJ/RVrqzfAGOTAT8W JGdw== 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=uwbkkZz+1+VTAaTPBwSELzudTnrNHY5iz13KZgOvsT8=; b=A74uRGdS/0W8liajxNLc/XQon9HD2HwMS3/atpIKFPIrIZmUdKtxcHn2Q61XbsKfQM K1Se3rgKy1wkMipmK1933Jnzaw73yPEDhrHHHMCIJ96BDypx4KQQkmADKC0qqMgERGnZ IqMEZQsSXllElz8OmOmKit3PznMnciDu1/nEBHMK77VjdOC1UzyHKVcGxm2jVAwrXRg8 2Or63qtQknLzOBpQK1AXm/cX3Aibjhb66GRVKr4J4+ppV20V7QFTIaKgcja9CQoRVtxO jGVwwYzcMaK9+mLZfynu1a8JRMSJN89W8xNlugnVJariOUJjg6C2VFqrCO4/IUpmRH+a hwiw== X-Gm-Message-State: AIkVDXJMBliQ9ntcBya1G0Xzab8tKLX+zxyF4O+sTS8dH55D4ALiHDf+gyTXyt7irJCYG1Gp X-Received: by 10.28.48.7 with SMTP id w7mr1133043wmw.115.1482259423204; Tue, 20 Dec 2016 10:43:43 -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 197sm23359493wmy.16.2016.12.20.10.43.42 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 20 Dec 2016 10:43:42 -0800 (PST) From: Adrien Mazarguil To: dev@dpdk.org Date: Tue, 20 Dec 2016 19:42:41 +0100 Message-Id: <0b2ee59e49423afd1ed088dd822f56a95559f471.1482257521.git.adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 24/25] app/testpmd: add queue actions to flow command 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:43 -0000 - QUEUE: assign packets to a given queue index. - DUP: duplicate packets to a given queue index. - RSS: spread packets among several queues. Signed-off-by: Adrien Mazarguil Acked-by: Olga Shern --- app/test-pmd/cmdline_flow.c | 152 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index d0b6754..145838e 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -156,8 +156,15 @@ enum index { ACTION_MARK, ACTION_MARK_ID, ACTION_FLAG, + ACTION_QUEUE, + ACTION_QUEUE_INDEX, ACTION_DROP, ACTION_COUNT, + ACTION_DUP, + ACTION_DUP_INDEX, + ACTION_RSS, + ACTION_RSS_QUEUES, + ACTION_RSS_QUEUE, ACTION_PF, ACTION_VF, ACTION_VF_ORIGINAL, @@ -171,6 +178,14 @@ enum index { #define ITEM_RAW_SIZE \ (offsetof(struct rte_flow_item_raw, pattern) + ITEM_RAW_PATTERN_SIZE) +/** Number of queue[] entries in struct rte_flow_action_rss. */ +#define ACTION_RSS_NUM 32 + +/** Storage size for struct rte_flow_action_rss including queues. */ +#define ACTION_RSS_SIZE \ + (offsetof(struct rte_flow_action_rss, queue) + \ + sizeof(*((struct rte_flow_action_rss *)0)->queue) * ACTION_RSS_NUM) + /** Maximum number of subsequent tokens and arguments on the stack. */ #define CTX_STACK_SIZE 16 @@ -487,8 +502,11 @@ static const enum index next_action[] = { ACTION_PASSTHRU, ACTION_MARK, ACTION_FLAG, + ACTION_QUEUE, ACTION_DROP, ACTION_COUNT, + ACTION_DUP, + ACTION_RSS, ACTION_PF, ACTION_VF, ZERO, @@ -500,6 +518,24 @@ static const enum index action_mark[] = { ZERO, }; +static const enum index action_queue[] = { + ACTION_QUEUE_INDEX, + ACTION_NEXT, + ZERO, +}; + +static const enum index action_dup[] = { + ACTION_DUP_INDEX, + ACTION_NEXT, + ZERO, +}; + +static const enum index action_rss[] = { + ACTION_RSS_QUEUES, + ACTION_NEXT, + ZERO, +}; + static const enum index action_vf[] = { ACTION_VF_ORIGINAL, ACTION_VF_ID, @@ -517,6 +553,9 @@ static int parse_vc_spec(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); static int parse_vc_conf(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); +static int parse_vc_action_rss_queue(struct context *, const struct token *, + const char *, unsigned int, void *, + unsigned int); static int parse_destroy(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); @@ -566,6 +605,8 @@ static int comp_port(struct context *, const struct token *, unsigned int, char *, unsigned int); static int comp_rule_id(struct context *, const struct token *, unsigned int, char *, unsigned int); +static int comp_vc_action_rss_queue(struct context *, const struct token *, + unsigned int, char *, unsigned int); /** Token definitions. */ static const struct token token_list[] = { @@ -1163,6 +1204,21 @@ static const struct token token_list[] = { .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), .call = parse_vc, }, + [ACTION_QUEUE] = { + .name = "queue", + .help = "assign packets to a given queue index", + .priv = PRIV_ACTION(QUEUE, + sizeof(struct rte_flow_action_queue)), + .next = NEXT(action_queue), + .call = parse_vc, + }, + [ACTION_QUEUE_INDEX] = { + .name = "index", + .help = "queue index to use", + .next = NEXT(action_queue, NEXT_ENTRY(UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct rte_flow_action_queue, index)), + .call = parse_vc_conf, + }, [ACTION_DROP] = { .name = "drop", .help = "drop packets (note: passthru has priority)", @@ -1177,6 +1233,39 @@ static const struct token token_list[] = { .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), .call = parse_vc, }, + [ACTION_DUP] = { + .name = "dup", + .help = "duplicate packets to a given queue index", + .priv = PRIV_ACTION(DUP, sizeof(struct rte_flow_action_dup)), + .next = NEXT(action_dup), + .call = parse_vc, + }, + [ACTION_DUP_INDEX] = { + .name = "index", + .help = "queue index to duplicate packets to", + .next = NEXT(action_dup, NEXT_ENTRY(UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct rte_flow_action_dup, index)), + .call = parse_vc_conf, + }, + [ACTION_RSS] = { + .name = "rss", + .help = "spread packets among several queues", + .priv = PRIV_ACTION(RSS, ACTION_RSS_SIZE), + .next = NEXT(action_rss), + .call = parse_vc, + }, + [ACTION_RSS_QUEUES] = { + .name = "queues", + .help = "queue indices to use", + .next = NEXT(action_rss, NEXT_ENTRY(ACTION_RSS_QUEUE)), + .call = parse_vc_conf, + }, + [ACTION_RSS_QUEUE] = { + .name = "{queue}", + .help = "queue index", + .call = parse_vc_action_rss_queue, + .comp = comp_vc_action_rss_queue, + }, [ACTION_PF] = { .name = "pf", .help = "redirect packets to physical device function", @@ -1556,6 +1645,51 @@ parse_vc_conf(struct context *ctx, const struct token *token, return len; } +/** + * Parse queue field for RSS action. + * + * Valid tokens are queue indices and the "end" token. + */ +static int +parse_vc_action_rss_queue(struct context *ctx, const struct token *token, + const char *str, unsigned int len, + void *buf, unsigned int size) +{ + static const enum index next[] = NEXT_ENTRY(ACTION_RSS_QUEUE); + int ret; + int i; + + (void)token; + (void)buf; + (void)size; + if (ctx->curr != ACTION_RSS_QUEUE) + return -1; + i = ctx->objdata >> 16; + if (!strncmp(str, "end", len)) { + ctx->objdata &= 0xffff; + return len; + } + if (i >= ACTION_RSS_NUM) + return -1; + if (push_args(ctx, ARGS_ENTRY(struct rte_flow_action_rss, queue[i]))) + return -1; + ret = parse_int(ctx, token, str, len, NULL, 0); + if (ret < 0) { + pop_args(ctx); + return -1; + } + ++i; + ctx->objdata = i << 16 | (ctx->objdata & 0xffff); + /* Repeat token. */ + if (ctx->next_num == RTE_DIM(ctx->next)) + return -1; + ctx->next[ctx->next_num++] = next; + if (!ctx->object) + return len; + ((struct rte_flow_action_rss *)ctx->object)->num = i; + return len; +} + /** Parse tokens for destroy command. */ static int parse_destroy(struct context *ctx, const struct token *token, @@ -2130,6 +2264,24 @@ comp_rule_id(struct context *ctx, const struct token *token, return i; } +/** Complete queue field for RSS action. */ +static int +comp_vc_action_rss_queue(struct context *ctx, const struct token *token, + unsigned int ent, char *buf, unsigned int size) +{ + static const char *const str[] = { "", "end", NULL }; + unsigned int i; + + (void)ctx; + (void)token; + for (i = 0; str[i] != NULL; ++i) + if (buf && i == ent) + return snprintf(buf, size, "%s", str[i]); + if (buf) + return -1; + return i; +} + /** Internal context. */ static struct context cmd_flow_context; -- 2.1.4