From patchwork Mon Jun 12 21:14:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Kozyrev X-Patchwork-Id: 128522 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 08CA242C9A; Mon, 12 Jun 2023 23:14:44 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1FAB5410F9; Mon, 12 Jun 2023 23:14:40 +0200 (CEST) Received: from NAM04-BN8-obe.outbound.protection.outlook.com (mail-bn8nam04on2077.outbound.protection.outlook.com [40.107.100.77]) by mails.dpdk.org (Postfix) with ESMTP id CCB2740689 for ; Mon, 12 Jun 2023 23:14:37 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XUAzrA6eBAeBGXbbqdky6us1G/qiTcX8iUQhONMZlEvoqvIbwmHAcR6CE662iTUTqFOpFEesOOvHGXc4WFleHSkMyBuPpUgK/LaNXlwQxOhqNkpIZ2WGDLTH75UDpmurWejvz+M1WHPjaG3r8X6fH9RlMkdADF/00gkfoFlRJjmchmakVzsqEqEjaQ/2ApD6Wvry/JS13oO2venyRmWVhukLBWdQSVqJp7B4ffwX9EkouvbzCChOfK2SxLeqNW3x2Ncu7KxaSs812WPwNa1d5SdqO/uD33qyQlHV1xIfuN5Sx2n7gMVMkZlmHw/aQ2Vj7EDeMsCbkz5GPVWA95x+bQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=L2bw9BuqMzyCP29IEpawdhvFYi2UCLt09TqEvdjI9nc=; b=VKKZCsrI4YeQf4Bn57QPP+cu4Aze4i+j1TcztJJPDG/136eWMPIKlT2nPIi0FUpBqkJInaoTWg/+AJAyfzQFl7KezYFVNcFRVaXhNt9/FJMwMnIpDSQL9+Xbqx5VZUlyNYGjc/Ui8iw/q0YKmieZ/cNCt8+EGtG3hO9uj/KybNbHMYxQUtAudRxy2Pf8H27sZ2n/mw8ZsH5G2esHIof1kuDWvHU7l8SqLQ7rgzRpkLtFdSX3kYEmezsEHmS+tW8WJTIIsZfcejN/weS43MJk9lTz2PnA60KOrW5nPKDEUP9mHBovnIRfo9hIkPORXFA64EvsIIm3Xu4CBG5xQSJonQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L2bw9BuqMzyCP29IEpawdhvFYi2UCLt09TqEvdjI9nc=; b=Mr9VUTWrw/oNtL6jsKjOLsiuMMDLz8ydgMx6/RJQeD3ex+KZ20U9jViS9G2mw6o+kytvhPEHqXTvARrBEfhpP2MJy7/jJ0U2Iu2cgRXkEwO3hMrAK/3tANf0323gmhzOtBNdC5SY1lVVwpDiDKbEG0r+hMOTN4CWAe14VB9uMk8VGgTgJrkaBxUVZcYwkOQK5TM0VNBJmDVkNSb+/v+v4k3I61SrUYuvU0UBNwfLsEkwQb16Q8HTNHxngqSTGqcQlkQBcxOKGLVaxAfYX6sRE4BU9v82gx2a0r9KXejYg/7GQlR4Xl/bn6J5s9VmTdBDkPa0OBCaRVj7dBWXAhBkig== Received: from BN9PR03CA0614.namprd03.prod.outlook.com (2603:10b6:408:106::19) by PH7PR12MB6835.namprd12.prod.outlook.com (2603:10b6:510:1b5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.33; Mon, 12 Jun 2023 21:14:36 +0000 Received: from BN8NAM11FT075.eop-nam11.prod.protection.outlook.com (2603:10b6:408:106:cafe::61) by BN9PR03CA0614.outlook.office365.com (2603:10b6:408:106::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.46 via Frontend Transport; Mon, 12 Jun 2023 21:14:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN8NAM11FT075.mail.protection.outlook.com (10.13.176.208) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6477.29 via Frontend Transport; Mon, 12 Jun 2023 21:14:35 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.5; Mon, 12 Jun 2023 14:14:23 -0700 Received: from pegasus01.mtr.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.37; Mon, 12 Jun 2023 14:14:22 -0700 From: Alexander Kozyrev To: CC: , Subject: [PATCH] app/testpmd: add flow update CLI command Date: Tue, 13 Jun 2023 00:14:05 +0300 Message-ID: <20230612211405.3468343-1-akozyrev@nvidia.com> X-Mailer: git-send-email 2.18.2 MIME-Version: 1.0 X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail202.nvidia.com (10.129.68.7) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN8NAM11FT075:EE_|PH7PR12MB6835:EE_ X-MS-Office365-Filtering-Correlation-Id: a50c3e4a-049b-46ed-87d0-08db6b8a0669 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: gMj7N7KlvdQm0B1i6AvVtemJtt7vqdHK07FdW88D4m57rM9T32LomYJAxKrpQUP8B3/SOl47bMIaz8Xmu7HoTVqJrY4eWb9bYeX/9T7EOazJRp/fstMm9h2b100wXD84p+rXria1fuREt3DHnr+ffy1byyTpWGrfapBeZ+n/M+3ieVw8ycicaNv05SOA9VMy90YOoyK2Xh0Zvf/zP3tremFG4W0/8IAE5W3OoIUYkR/SorBKguPLz4NL7Mt48yQGlFv02YfSrYWdowvcQK9rYZj6VxNJz6aeAIpy8GpMV3mKv0zMRY8tvk91Mb19gfnTBMhB8wLDd9H1kNdQPBGPHqJi6X6TxXpXRfe9+uGMV0VZM3RY1jZG7wErcmQt0pSGYEMAz6II+HNOnv74UeOzdlori6gS/y3qX7XIM80cY48Yv5Zo+4FPVND965ezL2Ap0tZfmK7llDKmmvV9Yi+yRAfnalbQm2gqyeKtE7L8Jo5eouQksz6AairhOsy/AeGEkLjK/C0SlMZtpNlzfS4S8/aJ+cvD3aFqTjyPvSlOYBFqvhZhubHZC5Kur2OV88WmEC930U/eyEEnYAOKhnM9etvnZYHuB+jbVBnRmQTT8f4Bce5P6RHk7c1HHaGF6yeJtVCLrHjVfzU/S3NUNUgdx/7bUf89i0XpQAchi+yJtv1uptAaxUuxTMBxCKiI8CzxfhlDg7IOa0eN7XPJMgf/v9aP+xUmE6wi8FzIwFqR5l9hLdmZPzd7IByv2JOm67nm X-Forefront-Antispam-Report: CIP:216.228.117.161; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge2.nvidia.com; CAT:NONE; SFS:(13230028)(4636009)(396003)(39860400002)(346002)(376002)(136003)(451199021)(40470700004)(36840700001)(46966006)(40460700003)(41300700001)(316002)(83380400001)(82310400005)(47076005)(86362001)(36860700001)(186003)(16526019)(26005)(107886003)(1076003)(2906002)(15650500001)(356005)(82740400003)(7636003)(40480700001)(426003)(2616005)(336012)(8676002)(8936002)(36756003)(5660300002)(70586007)(70206006)(54906003)(478600001)(4326008)(6916009)(6666004); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jun 2023 21:14:35.8264 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a50c3e4a-049b-46ed-87d0-08db6b8a0669 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.161]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT075.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6835 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add testpmd CLI interface for the flow update API. flow queue 1 update 2 rule 3 actions_template 4 postpone yes pattern end actions queue index 3 / end Signed-off-by: Alexander Kozyrev Acked-by: Ori Kam --- app/test-pmd/cmdline_flow.c | 29 ++++++++++++ app/test-pmd/config.c | 92 ++++++++++++++++++++++++++++++++++++- app/test-pmd/testpmd.h | 5 ++ 3 files changed, 125 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 00bac0a60d..5771281125 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -132,6 +132,7 @@ enum index { /* Queue arguments. */ QUEUE_CREATE, QUEUE_DESTROY, + QUEUE_UPDATE, QUEUE_AGED, QUEUE_INDIRECT_ACTION, @@ -146,6 +147,9 @@ enum index { QUEUE_DESTROY_ID, QUEUE_DESTROY_POSTPONE, + /* Queue update arguments. */ + QUEUE_UPDATE_ID, + /* Queue indirect action arguments */ QUEUE_INDIRECT_ACTION_CREATE, QUEUE_INDIRECT_ACTION_LIST_CREATE, @@ -1312,6 +1316,7 @@ static const enum index next_table_destroy_attr[] = { static const enum index next_queue_subcmd[] = { QUEUE_CREATE, QUEUE_DESTROY, + QUEUE_UPDATE, QUEUE_AGED, QUEUE_INDIRECT_ACTION, ZERO, @@ -3408,6 +3413,14 @@ static const struct token token_list[] = { .args = ARGS(ARGS_ENTRY(struct buffer, queue)), .call = parse_qo_destroy, }, + [QUEUE_UPDATE] = { + .name = "update", + .help = "update a flow rule", + .next = NEXT(NEXT_ENTRY(QUEUE_UPDATE_ID), + NEXT_ENTRY(COMMON_QUEUE_ID)), + .args = ARGS(ARGS_ENTRY(struct buffer, queue)), + .call = parse_qo, + }, [QUEUE_AGED] = { .name = "aged", .help = "list and destroy aged flows", @@ -3484,6 +3497,15 @@ static const struct token token_list[] = { args.destroy.rule)), .call = parse_qo_destroy, }, + [QUEUE_UPDATE_ID] = { + .name = "rule", + .help = "specify rule id to update", + .next = NEXT(NEXT_ENTRY(QUEUE_ACTIONS_TEMPLATE), + NEXT_ENTRY(COMMON_UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct buffer, + args.vc.rule_id)), + .call = parse_qo, + }, /* Queue indirect action arguments */ [QUEUE_INDIRECT_ACTION_CREATE] = { .name = "create", @@ -10207,6 +10229,7 @@ parse_qo(struct context *ctx, const struct token *token, } switch (ctx->curr) { case QUEUE_CREATE: + case QUEUE_UPDATE: out->command = ctx->curr; ctx->objdata = 0; ctx->object = out; @@ -10218,6 +10241,7 @@ parse_qo(struct context *ctx, const struct token *token, case QUEUE_ACTIONS_TEMPLATE: case QUEUE_CREATE_POSTPONE: case QUEUE_RULE_ID: + case QUEUE_UPDATE_ID: return len; case ITEM_PATTERN: out->args.vc.pattern = @@ -12233,6 +12257,11 @@ cmd_flow_parsed(const struct buffer *in) in->args.destroy.rule_n, in->args.destroy.rule); break; + case QUEUE_UPDATE: + port_queue_flow_update(in->port, in->queue, in->postpone, + in->args.vc.rule_id, in->args.vc.act_templ_id, + in->args.vc.actions); + break; case PUSH: port_queue_flow_push(in->port, in->queue); break; diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 2cf01d09b3..d9437bd164 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -2799,6 +2799,7 @@ port_queue_flow_create(portid_t port_id, queueid_t queue_id, pf->next = port->flow_list; pf->id = id; + pf->table = pt; pf->flow = flow; job->pf = pf; port->flow_list = pf; @@ -2905,6 +2906,94 @@ queue_action_list_handle_create(portid_t port_id, uint32_t queue_id, job, error); } +/** Enqueue update flow rule operation. */ +int +port_queue_flow_update(portid_t port_id, queueid_t queue_id, + bool postpone, uint32_t rule_idx, uint32_t actions_idx, + const struct rte_flow_action *actions) +{ + struct rte_flow_op_attr op_attr = { .postpone = postpone }; + struct rte_port *port; + struct port_flow *pf, *uf; + struct port_flow **tmp; + struct port_table *pt; + bool found; + struct rte_flow_error error = { RTE_FLOW_ERROR_TYPE_NONE, NULL, NULL }; + struct rte_flow_action_age *age = age_action_get(actions); + struct queue_job *job; + + if (port_id_is_invalid(port_id, ENABLED_WARN) || + port_id == (portid_t)RTE_PORT_ALL) + return -EINVAL; + port = &ports[port_id]; + + if (queue_id >= port->queue_nb) { + printf("Queue #%u is invalid\n", queue_id); + return -EINVAL; + } + + found = false; + tmp = &port->flow_list; + while (*tmp) { + pf = *tmp; + if (rule_idx == pf->id) { + found = true; + break; + } + tmp = &(*tmp)->next; + } + if (!found) { + printf("Flow rule #%u is invalid\n", rule_idx); + return -EINVAL; + } + + pt = pf->table; + if (actions_idx >= pt->nb_actions_templates) { + printf("Actions template index #%u is invalid," + " %u templates present in the table\n", + actions_idx, pt->nb_actions_templates); + return -EINVAL; + } + + job = calloc(1, sizeof(*job)); + if (!job) { + printf("Queue flow create job allocate failed\n"); + return -ENOMEM; + } + job->type = QUEUE_JOB_TYPE_FLOW_UPDATE; + + uf = port_flow_new(&pt->flow_attr, pf->rule.pattern_ro, actions, &error); + if (!uf) { + free(job); + return port_flow_complain(&error); + } + + if (age) { + uf->age_type = ACTION_AGE_CONTEXT_TYPE_FLOW; + age->context = &uf->age_type; + } + + /* + * Poisoning to make sure PMD update it in case of error. + */ + memset(&error, 0x44, sizeof(error)); + if (rte_flow_async_actions_update(port_id, queue_id, &op_attr, pf->flow, + actions, actions_idx, job, &error)) { + free(uf); + free(job); + return port_flow_complain(&error); + } + uf->next = pf->next; + uf->id = pf->id; + uf->table = pt; + uf->flow = pf->flow; + *tmp = uf; + job->pf = pf; + + printf("Flow rule #%u update enqueued\n", pf->id); + return 0; +} + /** Enqueue indirect action create operation. */ int port_queue_action_handle_create(portid_t port_id, uint32_t queue_id, @@ -3394,7 +3483,8 @@ port_queue_flow_pull(portid_t port_id, queueid_t queue_id) if (res[i].status == RTE_FLOW_OP_SUCCESS) success++; job = (struct queue_job *)res[i].user_data; - if (job->type == QUEUE_JOB_TYPE_FLOW_DESTROY) + if (job->type == QUEUE_JOB_TYPE_FLOW_DESTROY || + job->type == QUEUE_JOB_TYPE_FLOW_UPDATE) free(job->pf); else if (job->type == QUEUE_JOB_TYPE_ACTION_DESTROY) free(job->pia); diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 5eeb50f67c..1761768add 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -110,6 +110,7 @@ enum { enum { QUEUE_JOB_TYPE_FLOW_CREATE, QUEUE_JOB_TYPE_FLOW_DESTROY, + QUEUE_JOB_TYPE_FLOW_UPDATE, QUEUE_JOB_TYPE_ACTION_CREATE, QUEUE_JOB_TYPE_ACTION_DESTROY, QUEUE_JOB_TYPE_ACTION_UPDATE, @@ -225,6 +226,7 @@ struct port_flow { struct port_flow *next; /**< Next flow in list. */ struct port_flow *tmp; /**< Temporary linking. */ uint32_t id; /**< Flow rule ID. */ + struct port_table *table; /**< Flow table. */ struct rte_flow *flow; /**< Opaque flow object returned by PMD. */ struct rte_flow_conv_rule rule; /**< Saved flow rule description. */ enum age_action_context_type age_type; /**< Age action context type. */ @@ -983,6 +985,9 @@ int port_queue_flow_create(portid_t port_id, queueid_t queue_id, const struct rte_flow_action *actions); int port_queue_flow_destroy(portid_t port_id, queueid_t queue_id, bool postpone, uint32_t n, const uint32_t *rule); +int port_queue_flow_update(portid_t port_id, queueid_t queue_id, + bool postpone, uint32_t rule_idx, uint32_t actions_idx, + const struct rte_flow_action *actions); int port_queue_action_handle_create(portid_t port_id, uint32_t queue_id, bool postpone, uint32_t id, const struct rte_flow_indir_action_conf *conf,