From patchwork Thu Mar 30 11:20:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 1763197 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=corigine.onmicrosoft.com header.i=@corigine.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-corigine-onmicrosoft-com header.b=ThYCQ2Zq; dkim-atps=neutral Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PnLbK3F0Rz1yZ0 for ; Thu, 30 Mar 2023 22:21:33 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 64AFD41E39; Thu, 30 Mar 2023 11:21:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 64AFD41E39 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=corigine.onmicrosoft.com header.i=@corigine.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-corigine-onmicrosoft-com header.b=ThYCQ2Zq X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xK-pHaZAABe9; Thu, 30 Mar 2023 11:21:29 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id B02CB403A7; Thu, 30 Mar 2023 11:21:28 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org B02CB403A7 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B03F9C008D; Thu, 30 Mar 2023 11:21:27 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 94AE0C002F for ; Thu, 30 Mar 2023 11:21:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 63AC184307 for ; Thu, 30 Mar 2023 11:21:25 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 63AC184307 Authentication-Results: smtp1.osuosl.org; dkim=pass (1024-bit key) header.d=corigine.onmicrosoft.com header.i=@corigine.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-corigine-onmicrosoft-com header.b=ThYCQ2Zq X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YeYTast7TMcS for ; Thu, 30 Mar 2023 11:21:24 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 657FA84304 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2070f.outbound.protection.outlook.com [IPv6:2a01:111:f400:7eab::70f]) by smtp1.osuosl.org (Postfix) with ESMTPS id 657FA84304 for ; Thu, 30 Mar 2023 11:21:24 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=T3Pn/Gd9JmtitrRVpuAcK1xvqci5BaH65iJmQeJ4kOYLlt+AGUceoU1Ti5xmZvbu/VHGoRDndm77sELf4a1ooLMXhJ/4FrD8b2GL4dgPSfQAaNdXvFMNa9tIO/ar9jSWCjkwlME9ADZ2o97sx0UzJwzQ3yzhIPJ/X+KRMwtYOK5JCVxMwAQXMVdRwBEvP32wu3Pw4ozbqeEEXrXktPu9EGJy753ypcsSqxnZOPBxXWqDWxpWh9dRhI+C0E1bYs3epQwQlmHK3tEskauUhwOHDnicPAPefw3/mZa40uzpvEkzdvbdFD2c0igZwHXmfaDIFvIe8nriIMb6kyFziqwbhg== 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=GvP2tDfZsYd4CjyzU2sYVf8frSPW9PGPtnD1s1qMsRE=; b=cgHCjTMY17LagYrsEZVbx919o/bgmn0K0+jgUQ74fuiwSJZpDUBt4kSx6h0K6jvpmCUZw2voe/7BXW7kh6ZAjOgVtuLwXpIrDXYq0T6bbaGMt6/wQGJkr2ztAaEzGtYwWkdEeyewZhoQk3NOB5MzSQrrwl/ACWtkLmfGtzTlS5YEQu0zKyMs8l8/SbiCA0irSZGFcQCsSxglyBattsZzYd9y9VqKW1EGkXa+OJ4uhHQXfRA3TyOxTOGPIRohFYWgpy+HSFyDnDRXookfkdOgXCtFxEEtxfNRWwx9G7fheNzhlW9mYzdFb1mArNz56+XrltF6viBiLUDQJldfJ/VQtw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GvP2tDfZsYd4CjyzU2sYVf8frSPW9PGPtnD1s1qMsRE=; b=ThYCQ2ZqVAYAdIC7mZqHJQbLZKI7BvVoS6FXaPdnBiiUaUQJHeiG+xqg2ig96dYLaGDKccf11GJNr1J+ZbNYXwv3cfz/x23krqKoRVGKJKkXYtrO0aM/eIQnFYKI1spP2lbqkbKUcsMzWIzu2rUpyL35m2fbN/ALgm6WBz/JCM0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from PH0PR13MB4842.namprd13.prod.outlook.com (2603:10b6:510:78::6) by SA0PR13MB3999.namprd13.prod.outlook.com (2603:10b6:806:70::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6254.22; Thu, 30 Mar 2023 11:21:23 +0000 Received: from PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::c506:5243:557e:82cb]) by PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::c506:5243:557e:82cb%5]) with mapi id 15.20.6254.021; Thu, 30 Mar 2023 11:21:23 +0000 From: Simon Horman To: dev@openvswitch.org Date: Thu, 30 Mar 2023 13:20:53 +0200 Message-Id: <20230330112057.14242-3-simon.horman@corigine.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230330112057.14242-1-simon.horman@corigine.com> References: <20230330112057.14242-1-simon.horman@corigine.com> X-ClientProxiedBy: AM0PR01CA0111.eurprd01.prod.exchangelabs.com (2603:10a6:208:168::16) To PH0PR13MB4842.namprd13.prod.outlook.com (2603:10b6:510:78::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH0PR13MB4842:EE_|SA0PR13MB3999:EE_ X-MS-Office365-Filtering-Correlation-Id: d0b02291-f820-40f7-7010-08db3110e4a7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VcGz1bMRrW0N7usa16068IrvN0rZQv0PEXA4Fs6uZoCHO1XXY5zhqe7x/oyMvp4q7TH9F2Obg5u67Q86h1wciWNnpInz9Y60PnhKgNa/YYSrYpTzPT5ZFEoUleEnFMlQj7CYAX6wTSwJE1iVJ2NTvJkjPnRELOXsqoRirwbNHvvhyHXX6CWZef9KJDMTBELo3XfsW3JirIwoWyRX/1lCYDHL6y05c9iH8Brh7ie/rwNz11R+gd7BLi8lkYjIf+6GquxIQ/S8QFDfrCBj6jvlI+LIx2MjIZSusQy3ZXWBLraHzqnyobR1MvZvulwnvhDYzyKBdIggZApe9BUfge2EyQJtCXctkKIKFFj3zihropQN6HIbO02Fb95hqnrhNGOtlhtiSL48/s90cSHCxu4Kit34+xePsZ3IwKj1lldDmkoifsQbXTGoeaWlqgtvxA36TCiwrzW8IjSNe6YiwYEEvkrA4umrMoiaN2Kf9vCC5MAgPkjPsygN5TgOLQP/Smq4FG+npRI0ePn0zKU1zE9tMXAq7v74pBR34V0q6co9XvVh5YdjsafnLj9eQROvEr7O X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR13MB4842.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(4636009)(136003)(376002)(396003)(346002)(366004)(39840400004)(451199021)(38100700002)(36756003)(86362001)(8936002)(6666004)(107886003)(5660300002)(83380400001)(2616005)(1076003)(41300700001)(478600001)(44832011)(52116002)(316002)(186003)(4326008)(8676002)(66556008)(6916009)(66476007)(6512007)(6506007)(54906003)(66946007)(2906002)(6486002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Zmp2qoNT0xRg00GSYO2+kusGE4V+lxGsOC3kBUHPapHGflSiBxOqIgJLSoraSt7RUBLFb2ItQ/wSHJyeNSySnC5pHjypRcI8XeHSE5+d6+8jzcDrU3Bny7Mj1wki2y/b/8lvQwrHkyFkEEqSDwjVtC51xgUd5ZXssFTjCPU9QREgsAojFVCbBd0AaagD8Y0eVhF8Q41JKt9S9RJggqo7i93pyzRx1uiv/C5PA1F4B3qQ0f5RSYBP47BLIPKclQG6AgglPCL8NAzlR06F7u+s8aXQbDBJNtuljyOYCard4CZp7lYJBmV0QBbQj2MLjrvPpIvLTszY6ZY0xT9O9rKshT4HHNYKEaHcCaRY/qOYB7/NonsuCcphF3m5Uwadr33Hf4kHCZw6C/NpmLRzkFSjmgAQg1z/KviN25A7W9C/L+exu6yMCfnPRJSfF8KmVTna4fSTOYAitIVqL59/JsC2asxA/MwoQ5m9Yqd2pRCdVr4ZPTOTqZp9rEG9fYGEL80KxZM5aKN2Td++dAq8tM4m4jsgQSpnbdOqKN62MnZLnKMaA2O3of9I9DQ39VX1IludtuvfAVBKoUzKhs4EJzV2OaHE/DlKfKu6Ta4koJ+lUTwaPtVPKDFkyfLWlBwG3LQLKVOMfv398PIftSFZngg9KDktPso37UmhUUyuCK+uoXpKSsfMfYzaTrDO285elfT6aJ8roJdyrTjSr8vy01XMHwCFucDQDqgxzLlGDrpXl5gRmzPDWC7tCFjjyMUiYqWyccUkUvmGGe/OF2Rs6l4YemERHmuF/eRtg1iQw6OE8slKWQP2I2Lin2Herjd0Tj2Ly3i380sG7LxOaZwIWXbNVFJoEIr3AGPs8vPwhrP9YvbJo7gU0CGfoD/Z48l3P0wR4HANd6cMjU7MA7glnW135ef1uJOhCwP93vw0/Xy6YnDYd0dKyhxD1o6Qi4DnVSZByBoPx97ijKCs/zxhcWDOjbDGp0YcSQKkhDvsLcxGtPASFdNl/I/eoxs37qfqvKYH4w2LBr6zlpROlkJST5xp0kdJX4xhWeqn6BriXGy1DPhk1UVGpd3KAP2BQ+Mh4aucNtB0TaoUNlTI7gi7bSf4PvSykl6jlTHKzw9Yi6mC+9yO1HR+/N8jZYsLrWuzmerYxP7vkywWkCVNvwOkwi4EIUcneQ7u5cwlm3AplFIQDrONNRid3ixnh8dxnrC6LUkyO1aMhLHDQ3TDSIaVkyP7622Kbhodzq4Tj0ZaDeniH14mdROEh5l9EggPf/7dM3m9XeR1SjA64G3NakISjq22sS9HtTx/G8/FbIk5brzFcLR788MJbCt2VlmFdeqHX84NV2ibY9MFwXsIXUNBO+2sdGBvPNABJdxkRMPztaKtixNbcAb1JixsJdAE2S8x+/IQYAENyL83tmu5g1Va2gf90FXwamn5aJ0blUejrC/yexw99jLg/nLSRoaHlG/6pRRwIXIKgw9+vFj0z6yk8Gdh4BYdq9I1Bug/SCyn8ELTfHv8SjxHhGMdZSrrHxeULNHitGFHvCEU1mGfVqFHI7zE5kUkgdEFwVV/pnF2lpBkqmgvweRm//SLGWPHPogE46+eSkzbq2h1s9KPVyw9GCu8qHh6ioaVIouoLtoM8xrPbjaW5UP8VWebNoCd+agDJuxiDLN9r59JNAlH6FLasd875w== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: d0b02291-f820-40f7-7010-08db3110e4a7 X-MS-Exchange-CrossTenant-AuthSource: PH0PR13MB4842.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2023 11:21:23.0286 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MRG+vjmHYPn1V6zq+SQVprQmvh1R6+Fq058Wv6KlsZ671TRPCuMjjL0WNhoBv+g1cTLa4+R380YINgzFdDtvTRCGBk2FzXipDTqN6taMqh8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR13MB3999 Cc: Eli Britstein , Jin Liu , Chaoyong He , oss-drivers@corigine.com, Ilya Maximets , Peng Zhang Subject: [ovs-dev] [PATCH dpdk-latest v3 2/6] netdev-offload: Let meter offload API can be used with DPDK X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Peng Zhang Changing meter API so it can offload meter to HW in different datapath. And the corresponding functions to call the DPDK meter callbacks from all the registered flow API providers. The interfaces are like those related to DPDK meter in dpif_class, in order to pass necessary info to HW. Signed-off-by: Peng Zhang Signed-off-by: Jin Liu Co-authored-by: Jin Liu Signed-off-by: Simon Horman --- Documentation/howto/dpdk.rst | 5 +- lib/netdev-offload-provider.h | 21 +++++- lib/netdev-offload-tc.c | 9 ++- lib/netdev-offload.c | 135 +++++++++++++++++++++++++++++++++- lib/netdev-offload.h | 9 +++ 5 files changed, 168 insertions(+), 11 deletions(-) diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index 04609b20bd21..02fc568770ee 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -401,10 +401,11 @@ Supported actions for hardware offload are: - Modification of IPv6 (set_field:->ipv6_src/ipv6_dst/mod_nw_ttl). - Clone/output (tnl_push and output) for encapsulating over a tunnel. - Tunnel pop, for packets received on physical ports. +- Meter. .. note:: - Tunnel offloads are experimental APIs in DPDK. In order to enable it, - compile with -DALLOW_EXPERIMENTAL_API. + Tunnel offloads and Meter offloads are experimental APIs in DPDK. To enable + these features, compile with -DALLOW_EXPERIMENTAL_API. Multiprocess ------------ diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 9108856d18d1..b02531a0f813 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -98,27 +98,42 @@ struct netdev_flow_api { * and the configuration in 'config'. On failure, a non-zero error code is * returned. * + * If the datapath is netdev, the api needs the param struct netdev *, + * If the datapath is system, the param struct netdev* is unused and + * should be NULL. + * * The meter id specified through 'config->meter_id' is ignored. */ - int (*meter_set)(ofproto_meter_id meter_id, + int (*meter_set)(struct netdev *, + ofproto_meter_id meter_id, struct ofputil_meter_config *config); /* Queries HW for meter stats with the given 'meter_id'. Store the stats * of dropped packets to band 0. On failure, a non-zero error code is * returned. * + * If the datapath is netdev, the api needs the param struct netdev *, + * If the datapath is system, the param struct netdev* is unused and + * should be NULL. + * * Note that the 'stats' structure is already initialized, and only the * available statistics should be incremented, not replaced. Those fields * are packet_in_count, byte_in_count and band[]->byte_count and * band[]->packet_count. */ - int (*meter_get)(ofproto_meter_id meter_id, + int (*meter_get)(struct netdev *, + ofproto_meter_id meter_id, struct ofputil_meter_stats *stats); /* Removes meter 'meter_id' from HW. Store the stats of dropped packets to * band 0. On failure, a non-zero error code is returned. * + * If the datapath is netdev, the api needs the param struct netdev *, + * If the datapath is system, the param struct netdev* is unused and + * should be NULL. + * * 'stats' may be passed in as NULL if no stats are needed, See the above * function for additional details on the 'stats' usage. */ - int (*meter_del)(ofproto_meter_id meter_id, + int (*meter_del)(struct netdev *, + ofproto_meter_id meter_id, struct ofputil_meter_stats *stats); /* Initializies the netdev flow api. diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index ce7f8ad97306..6a965f4d366b 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -2892,7 +2892,8 @@ meter_free_police_index(uint32_t police_index) } static int -meter_tc_set_policer(ofproto_meter_id meter_id, +meter_tc_set_policer(struct netdev *netdev OVS_UNUSED, + ofproto_meter_id meter_id, struct ofputil_meter_config *config) { uint32_t police_index; @@ -2946,7 +2947,8 @@ meter_tc_set_policer(ofproto_meter_id meter_id, } static int -meter_tc_get_policer(ofproto_meter_id meter_id, +meter_tc_get_policer(struct netdev *netdev OVS_UNUSED, + ofproto_meter_id meter_id, struct ofputil_meter_stats *stats) { uint32_t police_index; @@ -2965,7 +2967,8 @@ meter_tc_get_policer(ofproto_meter_id meter_id, } static int -meter_tc_del_policer(ofproto_meter_id meter_id, +meter_tc_del_policer(struct netdev *netdev OVS_UNUSED, + ofproto_meter_id meter_id, struct ofputil_meter_stats *stats) { uint32_t police_index; diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 4592262bd34e..ae38fb7b2fec 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -206,7 +206,7 @@ meter_offload_set(ofproto_meter_id meter_id, CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { if (rfa->flow_api->meter_set) { - int ret = rfa->flow_api->meter_set(meter_id, config); + int ret = rfa->flow_api->meter_set(NULL, meter_id, config); if (ret) { VLOG_DBG_RL(&rl, "Failed setting meter %u for flow api %s, " "error %d", meter_id.uint32, rfa->flow_api->type, @@ -225,7 +225,7 @@ meter_offload_get(ofproto_meter_id meter_id, struct ofputil_meter_stats *stats) CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { if (rfa->flow_api->meter_get) { - int ret = rfa->flow_api->meter_get(meter_id, stats); + int ret = rfa->flow_api->meter_get(NULL, meter_id, stats); if (ret) { VLOG_DBG_RL(&rl, "Failed getting meter %u for flow api %s, " "error %d", meter_id.uint32, rfa->flow_api->type, @@ -244,7 +244,7 @@ meter_offload_del(ofproto_meter_id meter_id, struct ofputil_meter_stats *stats) CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { if (rfa->flow_api->meter_del) { - int ret = rfa->flow_api->meter_del(meter_id, stats); + int ret = rfa->flow_api->meter_del(NULL, meter_id, stats); if (ret) { VLOG_DBG_RL(&rl, "Failed deleting meter %u for flow api %s, " "error %d", meter_id.uint32, rfa->flow_api->type, @@ -895,3 +895,132 @@ netdev_set_flow_api_enabled(const struct smap *ovs_other_config) } } } +struct dpdk_meter_aux { + struct ofputil_meter_config *config; + struct ofputil_meter_stats *stats; + ofproto_meter_id meter_id; + odp_port_t odp_port; +}; + +static bool +dpdk_meter_set_cb(struct netdev *netdev, + odp_port_t odp_port, + void *aux_) +{ + struct netdev_registered_flow_api *rfa; + struct dpdk_meter_aux *aux = aux_; + ofproto_meter_id meter_id; + int ret; + + meter_id = aux->meter_id; + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->meter_set) { + ret = rfa->flow_api->meter_set(netdev, meter_id, aux->config); + if (ret) { + VLOG_DBG_RL(&rl, "Failed setting meter %u for flow api %s with" + " port number %u, error %d", meter_id.uint32, + rfa->flow_api->type, odp_port, ret); + } + } + } + + return 0; +} + +void +dpdk_meter_offload_set(const char *dpif_type, + ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + struct dpdk_meter_aux aux = { + .meter_id = meter_id, + .config = config, + }; + netdev_ports_traverse(dpif_type, dpdk_meter_set_cb, &aux); +} + +static bool +dpdk_meter_get_cb(struct netdev *netdev, + odp_port_t odp_port, + void *aux_) +{ + struct ofputil_meter_stats *stats, offload_stats; + struct netdev_registered_flow_api *rfa; + struct dpdk_meter_aux *aux = aux_; + ofproto_meter_id meter_id; + int ret; + + memset(&offload_stats, 0, sizeof(struct ofputil_meter_stats)); + meter_id = aux->meter_id; + stats = aux->stats; + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->meter_get) { + ret = rfa->flow_api->meter_get(netdev, meter_id, &offload_stats); + if (ret) { + VLOG_DBG_RL(&rl, "Failed getting meter %u for flow api %s with" + " port number %u, error %d", meter_id.uint32, + rfa->flow_api->type, odp_port, ret); + } + } + } + + if (!offload_stats.byte_in_count && !offload_stats.packet_in_count) { + return 0; + } + stats->byte_in_count += offload_stats.byte_in_count; + stats->packet_in_count += offload_stats.packet_in_count; + + return 0; +} + +void +dpdk_meter_offload_get(const char *dpif_type, + ofproto_meter_id meter_id, + struct ofputil_meter_stats *stats) +{ + struct dpdk_meter_aux aux = { + .meter_id = meter_id, + .stats = stats, + }; + netdev_ports_traverse(dpif_type, dpdk_meter_get_cb, &aux); +} + +static bool +dpdk_meter_del_cb(struct netdev *netdev, + odp_port_t odp_port, + void *aux_) +{ + struct netdev_registered_flow_api *rfa; + struct ofputil_meter_stats *stats; + struct dpdk_meter_aux *aux = aux_; + ofproto_meter_id meter_id; + int ret; + + meter_id = aux->meter_id; + stats = aux->stats; + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->meter_del) { + ret = rfa->flow_api->meter_del(netdev, meter_id, stats); + if (ret) { + VLOG_DBG_RL(&rl, "Failed deleting meter %u for flow api %s" + " with port number %u, error %d", meter_id.uint32, + rfa->flow_api->type, odp_port, ret); + } + } + } + + return 0; +} + +void +dpdk_meter_offload_del(const char *dpif_type, + ofproto_meter_id meter_id, + struct ofputil_meter_stats *stats) +{ + struct dpdk_meter_aux aux = { + .meter_id = meter_id, + .stats = stats, + }; + + netdev_ports_traverse(dpif_type, dpdk_meter_del_cb, &aux); +} diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index edc843cd99a3..e53f70a277b3 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -161,6 +161,15 @@ int netdev_ports_get_n_flows(const char *dpif_type, void meter_offload_set(ofproto_meter_id, struct ofputil_meter_config *); int meter_offload_get(ofproto_meter_id, struct ofputil_meter_stats *); int meter_offload_del(ofproto_meter_id, struct ofputil_meter_stats *); +void dpdk_meter_offload_set(const char *dpif_type, + ofproto_meter_id meter_id, + struct ofputil_meter_config *config); +void dpdk_meter_offload_del(const char *dpif_type, + ofproto_meter_id meter_id_, + struct ofputil_meter_stats *stats); +void dpdk_meter_offload_get(const char *dpif_type, + ofproto_meter_id meter_id_, + struct ofputil_meter_stats *stats); #ifdef __cplusplus }