From patchwork Fri Dec 16 15:50:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 1716564 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=2605:bc80:3010::138; helo=smtp1.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=dfI/JarV; dkim-atps=neutral Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (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 4NYYW43FhSz23ym for ; Sat, 17 Dec 2022 02:51:44 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id AE5A482212; Fri, 16 Dec 2022 15:51:42 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org AE5A482212 Authentication-Results: smtp1.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=dfI/JarV 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 a7a029DwvQGI; Fri, 16 Dec 2022 15:51:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 22D2B821F4; Fri, 16 Dec 2022 15:51:40 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 22D2B821F4 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 54584C007F; Fri, 16 Dec 2022 15:51:38 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6BD66C002D for ; Fri, 16 Dec 2022 15:51:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 3A33E61161 for ; Fri, 16 Dec 2022 15:51:35 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 3A33E61161 Authentication-Results: smtp3.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=dfI/JarV X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gQAkEU9HhfYb for ; Fri, 16 Dec 2022 15:51:32 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org BC0AB60BB2 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2094.outbound.protection.outlook.com [40.107.243.94]) by smtp3.osuosl.org (Postfix) with ESMTPS id BC0AB60BB2 for ; Fri, 16 Dec 2022 15:51:32 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ftOVXhyFEWytY9Rdm4j4P4E44pqoNosJaVodPgx3rWk/qGmmzExNjjXqpcvQBrqk1pGkspNVrLVvzbhMgtmVt4MWIAJr34hhgoJjSZH6jr9JTGPTFrhDHbddES6+tcwSoVESgnOiT+DNmClKjdBgHW3/ufRRjjcbmiB7CkV7AfAFAFexEFXI4nKATcjSoLpbrU+no0TeRACbvnQjTAI+ABYm3BnWMdrA6YAvCDh7kYMPWFDuNGykHqVwxcV3FHoBaNb8bFBwQQh7PqDoA1WjGw+jnBCfHABwQdXe585iwz7iv7uTZOnA8GyRsUqGE9ZrQn44YZQfs/zGydI47+KD4Q== 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=GIiudkKqZAU1B0v6vHa1kPT1p3WGmZpzSpeLlcMQ4LQ=; b=AIaeW3k27rW/qqjtWuxfrg7lzX+qkgJZB3Zof1RuTl3eSqnM/kQ6BnvBVlWqX9r3MApXzH5/RR3btXKUDQhYQt3wynI4sT7gTfojZe+10KUktp5r0WPv0nztzhr4j4iPnfmzRMKtYh1tD/YM8fOez2LUg0OEixsjsLgqHNkGlJZivbzfA173sLw8YB+T321i5JpGhKx4Z8tIyK2VfHOJfuRAJ1veUI539QGW50FM/ajcsE49JmtLfpP6vkbCcAhBhjOtgZPQ8P/T+i3EZ6NAB75smtvpJrSF/c6bCuBjMj3iaQJ0LWspzpoIcu+cfjDQaX/4fEIdyruQ/3BCMu4dsQ== 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=GIiudkKqZAU1B0v6vHa1kPT1p3WGmZpzSpeLlcMQ4LQ=; b=dfI/JarVYhyA70qzJ07MDlCTRQyCYRKx4hDeqGrD/Rl5BNWDPUPL82bBN31AEZeRcWSv4WmPntb7NfCKOni5h5yhTkKZeK7i2qwu+Q/MCKKRzVJzyTrfnjxhDbK5NLmgqr6SoP14kLByKhiKzPao6th6+J8pem+hrN+iQr7aOIo= 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 SJ0PR13MB5621.namprd13.prod.outlook.com (2603:10b6:a03:420::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5924.11; Fri, 16 Dec 2022 15:51:26 +0000 Received: from PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::483b:9e84:fadc:da30]) by PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::483b:9e84:fadc:da30%9]) with mapi id 15.20.5880.021; Fri, 16 Dec 2022 15:51:26 +0000 From: Simon Horman To: dev@openvswitch.org Date: Fri, 16 Dec 2022 16:50:49 +0100 Message-Id: <20221216155054.986464-2-simon.horman@corigine.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221216155054.986464-1-simon.horman@corigine.com> References: <20221216155054.986464-1-simon.horman@corigine.com> X-ClientProxiedBy: AM9P250CA0024.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:21c::29) To PH0PR13MB4842.namprd13.prod.outlook.com (2603:10b6:510:78::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH0PR13MB4842:EE_|SJ0PR13MB5621:EE_ X-MS-Office365-Filtering-Correlation-Id: 522ae220-28ea-4f4b-b8ac-08dadf7d6370 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GkJhsJA8XP88Tye48950V6y4QolGqUYXHXCsDbWkUkUeDGvYFNnGdhlzm0tYRHhzMgJc2WeX9xI6f+jsz5LnB4Qje7JaU/kZEZQmxNz+dpcryDcxBGKqwhtREu2zzbl8Ew0VkFD/t0SkHrR70+U+8TKS4m9aGfo/4a2yyWqjHAJQCGirIT8Bz3Oca+2rrDrFOl5bLsXqPJjMggFBubCOSwLSOpekIfAFiUsRe6obF2y24+yqYXrGOJIv/iotUda+4asFJ1RlxEoqz6aZijjbL9e1e11VZJmWtgMCKrS2HHGcVS+UsizGxMzRvAsmB5IIZ4NLc10VE2tmXdZFjKITQYL7tgj+I73IoIqywb365BIFkfzEDEpyms2hn6iHCFhfsCefHpFF+HUhW2RkSMJwKwTpyMOB7G2UvhEd2rdC26xezV+Wdo2So3pGarTw9IJTkDPw1u50rfN8l3flS+8M4krZAPxNgRDlyOTOozpKJdbXpi8DSGwdN0T1RfBabIovMJ7ZXf6JNW4oqNRgIPMjT12CIS/xib81WCX6OCeIcV1SCXXMuhvmbJoY52xxUP6ZZK0o8C0AR1H7JPS/IHrRa/g9XZvGoYSB4KxfaEPzRhhZh11Ivq+NgJ/8zlYoKJjmbAGZymoJ++0guQwgLVf8Rw== 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:(13230022)(4636009)(366004)(136003)(376002)(39840400004)(396003)(346002)(451199015)(36756003)(2906002)(5660300002)(44832011)(86362001)(8936002)(2616005)(38100700002)(1076003)(83380400001)(6916009)(54906003)(316002)(186003)(6512007)(107886003)(41300700001)(6486002)(4326008)(66556008)(6666004)(52116002)(6506007)(478600001)(66476007)(8676002)(66946007); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: CbOqgei/0Eeu6D60uOVuoN9vTiDmVXU1ztkK4FeiaTDzYkclJXMLWQu9Cjx5K9Tfs1vE+jtjiDrG31ZjvVa/5ajhACMFu4No0y8TuU0zplcP8B2etrlqCSZ4LMph7Yx6x5V1JiaCs5FvIPnTzjICbl/tzvOQ8TJFqQUpey7ry16Ty+3qBI4DyUYRem+DTqXuMqE8gAjCtRppR71CUI7HOrtfoXJ0gjBhvFDnlFK/oOkQONQpxWLLQA1ETHjUw6RYu8jW5UaPf+Cngx8846x3fGTDW33CEXbiTMKcDNxm0chvdkN4Ar1xAqCoWyxHmzz9wTCn6fovdKnOQbnio2iqJ4Ym/8RGtkBAGlXIvB+JeOsic5RTweAJM2BYWMX3I2/xe+GJ4g1PXWsC8DjOUNq7Ma/ZucCCCwbqa3Eyqd5ZHhwKIoWPnnI+nm06YRRB3Vc85YF1nnZQkLghDgieCT6/+vu5h8ssa9wn/YbjRAYCIFDnLlAKl+waOQ06u/daLWeHiQmP2YKicN2IOqRhgTQNT7YeJkVFr2z7Kq5XPh2L+FCf6e53pHS9YOlREKazaX6DAPA9CEuBzSwGv2uF2w33HZvVjcBpQ2ek+S1WEFRmD52xJQl2v3qcqH6H5CAeHpaaywAotZRXhfEuEieSDvhsS2+unEhUYXZKDlqPiyWHRG31Kl+9/BtsftwAWlUgdXn12KoRdXVDGg7lfPqDuQFP5H73UKoqqL5qSS0ojpg3bgL9uhIhHcUZ109MXqWUGPfcJrXiGYXpJRX5Iewj+6KiG8VVXWjwO3dqVojpwKeW//jQCHyrWKT5tVoKDaU1UlU0r469dKL99nGOvhovkrJmp4gXVkHV+vL52dDmQJtOPUJQYVJA8QaqRUsGufgxfKV+cdXpDfKybPnj3QKf7hXzhlmBBLmDOxPL5oaAap+l5qWX388AMFf0Jrd65Ea1psnXW/vt8zUgRPWnfn+6YmTeEPx7ly9FCXyeRY0HHHppnKek+4tD4UR8l0RK6oqd6lzTuwHZqLwtikbYbpOfh+jw4vb+HryAMiMVK0NnzXNT40Y0SIT5C7mN+oUbH+zfugaN98u7C484mJGEPRCsQ72+cg5OPschlmNimJ8IhMEDEqf3qw8X2qSiGO44D5idmcC5AzUjcndIU4pcUvmrWTV00TcPlMrvhOHIiHz0Aht036EJBIgsoOCXTcprdSc6b1FblsWcX8Yx2vlTdWUMvAwfsESlr5xMVSwVA9/XplqQfMolnT9eItznd6iaz9d2xJ3jhCdWcrMsX6mhZ/nqneGw0yyciQ08zRi+2qYYAX7kewUk0TdPlJh3fG4wJBHGJKfzEiu3wvIkhB5Hadrle8pRzpDFawdBAwQE6jki8oWUelMILQao0fjpZ2iSU/GSVBf8iLqM4GHzAjzH11Mbz/AkUQV7keC6vx9JrP2KccUZMhBcZ8FuyBE1mfmsJK8mK98yHMvhRqXGrqIJhkqGeGUJ/GCaSX9SRRGmHkY2dMrvQH2BP8TXCCXjEEIlVI0I/JHPSQOqPjO8bK2z7V6JOOyjjbDSm6Zygdc4OeW+IAOYE/cH9brDe42zZUbGAyMZsMOk0zx+alQClovV9rqVnvDdLPPpb4KHXMDFJANgWCPJOCTExg1k7tgjCVJfInYsnFq0dCozAxI2KoKx2vw6XDH4Ag== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 522ae220-28ea-4f4b-b8ac-08dadf7d6370 X-MS-Exchange-CrossTenant-AuthSource: PH0PR13MB4842.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Dec 2022 15:51:26.0314 (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: aAKASE5404gOtJkrDDG3ReRRrMIT1uDAqHsfes2LUhy4dsVu5QzMI6bx+TovmeCrNr/A0z0X+g8WUKEE7K2atX6NOA6UUSLIUBUQvLFH6hM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR13MB5621 Cc: Eli Britstein , Jin Liu , Chaoyong He , oss-drivers@corigine.com, Ilya Maximets , Peng Zhang Subject: [ovs-dev] [PATCH 1/6] netdev-offload: Add DPDK meter offload API 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 Add API to offload DPDK meter to HW, 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 --- Documentation/howto/dpdk.rst | 5 +-- lib/netdev-offload-provider.h | 30 ++++++++++++++++++ lib/netdev-offload.c | 59 +++++++++++++++++++++++++++++++++++ lib/netdev-offload.h | 9 ++++++ 4 files changed, 101 insertions(+), 2 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..7ecbb8d026f1 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -102,6 +102,16 @@ struct netdev_flow_api { int (*meter_set)(ofproto_meter_id meter_id, struct ofputil_meter_config *config); + /* Offloads or modifies the offloaded meter on the netdev with the given + * 'meter_id' and the configuration in 'config'. On failure, a non-zero + * error code is returned. + * + * The meter id specified through 'config->meter_id' is converted as an + * internal meter id. */ + int (*dpdk_meter_set)(struct netdev *, + ofproto_meter_id meter_id, + struct ofputil_meter_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. @@ -113,6 +123,18 @@ struct netdev_flow_api { int (*meter_get)(ofproto_meter_id meter_id, struct ofputil_meter_stats *stats); + /* Queries netdev 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. + * + * 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 (*dpdk_meter_get)(struct netdev *, + ofproto_meter_id meter_id, + struct ofputil_meter_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. * @@ -121,6 +143,14 @@ struct netdev_flow_api { int (*meter_del)(ofproto_meter_id meter_id, struct ofputil_meter_stats *stats); + /* Removes meter 'meter_id' from netdev. Store the stats of dropped packets + * to band 0. On failure, a non-zero error code is returned. + * + * If del success, 'stats' will be set zero. */ + int (*dpdk_meter_del)(struct netdev *, + ofproto_meter_id meter_id, + struct ofputil_meter_stats *stats); + /* Initializies the netdev flow api. * Return 0 if successful, otherwise returns a positive errno value. */ int (*init_flow_api)(struct netdev *); diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 4592262bd34e..6aedf2e5c5e9 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -256,6 +256,65 @@ meter_offload_del(ofproto_meter_id meter_id, struct ofputil_meter_stats *stats) return 0; } +void +dpdk_meter_offload_set(struct netdev *dev, + ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + struct netdev_registered_flow_api *rfa; + + /* Offload APIs could fail, for example, because the offload is not + * supported. This is fine, as the offload API should take care of this. */ + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->dpdk_meter_set) { + int ret = rfa->flow_api->dpdk_meter_set(dev, 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, + ret); + } + } + } +} + +void +dpdk_meter_offload_get(struct netdev *dev, + ofproto_meter_id meter_id, + struct ofputil_meter_stats *stats) +{ + struct netdev_registered_flow_api *rfa; + + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->dpdk_meter_get) { + int ret = rfa->flow_api->dpdk_meter_get(dev, 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, + ret); + } + } + } +} + +void +dpdk_meter_offload_del(struct netdev *dev, + ofproto_meter_id meter_id, + struct ofputil_meter_stats *stats) +{ + struct netdev_registered_flow_api *rfa; + + CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) { + if (rfa->flow_api->dpdk_meter_del) { + int ret = rfa->flow_api->dpdk_meter_del(dev, 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, + ret); + } + } + } +} + int netdev_flow_flush(struct netdev *netdev) { diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index edc843cd99a3..f1907d2db0c0 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(struct netdev *, + ofproto_meter_id, + struct ofputil_meter_config *); +void dpdk_meter_offload_get(struct netdev *, + ofproto_meter_id, + struct ofputil_meter_stats *); +void dpdk_meter_offload_del(struct netdev *, + ofproto_meter_id, + struct ofputil_meter_stats *); #ifdef __cplusplus }