From patchwork Wed Nov 10 16:28:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 1553500 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.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=cs0ThyPU; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4Hq9L22yp0z9sf8 for ; Thu, 11 Nov 2021 03:29:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id AB4DA40485; Wed, 10 Nov 2021 16:29:43 +0000 (UTC) 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 Qn89UVDyRKZg; Wed, 10 Nov 2021 16:29:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 6674C4044F; Wed, 10 Nov 2021 16:29:39 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8FB1BC0037; Wed, 10 Nov 2021 16:29:38 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0533BC0019 for ; Wed, 10 Nov 2021 16:29:38 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 65A0680CF9 for ; Wed, 10 Nov 2021 16:29:36 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp1.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=corigine.onmicrosoft.com 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 HZoVRSpBP3Ce for ; Wed, 10 Nov 2021 16:29:35 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on20726.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe59::726]) by smtp1.osuosl.org (Postfix) with ESMTPS id E2C6E81024 for ; Wed, 10 Nov 2021 16:29:34 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Do2x7+EGIwR2iSwqKLLVN+Ee8xOgBA7vZZYrZBj/cVIFyb2USC0ENXPhR3J8zg/LDuS4KWKx2mZC9bHA9EW1dcLr3bLqV0qnMF6v4xNF5oExGIPkJtMRCJCQrFnJqZmqZT+liKcdpSE31ZcqLBIwkh9qtrejY/wGe8U3AkWGC2EhHDKV7HE5hrPiZqJr0c2M9gqARycQiOExiPPvZbvjVzH9vx2iPYvWESfI4BNMQrg785elHW9t66C0iHLOVS2L5owCqYnmluW3MLve1/gdDmuAJ7wIm4zV8oCuZAag9h+8S/02q5AWK5yScwlPQG4Nu4DuuWss2VyfW+NyoqfeRQ== 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=WJSURw5DmZW8xia6t4S6ttmCWpxHr8qenWH6bh8isSI=; b=VgXVtS+1tCIo3trgHcYODBUZz6hBMDYZeffABC0Tm2H7uBd3LGiqmt7KZvPOcZHK06hzY0IcMu/xGqP5r4j9vgf85Cj99iojolQg3za5ibR7dknQq+krf705qEAubG1OU/XnKHZd+V80Yvt2s06VnGpCPtxde5XX4P8bjWMg4Tl1sIg7+Vk/j9NNkY00sROJ/8csicrgR85sg6X8IJ+LAKf8Ggds7ezryuSobBCKAJNttystQB7K50Z6/As/SkDT/BbiBfVCAZCkiRbmNpD/+mOGOAWw08gG4bemrzWsfv9ST9No3kC0XVDVG9BsF5bYktDppORxHLRc0wkM02jeUA== 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=WJSURw5DmZW8xia6t4S6ttmCWpxHr8qenWH6bh8isSI=; b=cs0ThyPUjEDgzTRz5jZF+Rd3Vk678yq67A1StunZcreG8zu/MnHAnySzFqJmK1Kl+cFa7Cj8yNaWT0By7icRUyR4hmf9/8TxdBUHjFCBkBs+Yx9HTKuDx296mnjjzMrysm8ZXDBGb6NExHz1u7Kr+HNT8yN0xmt3t6PQxrKPZVQ= 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 PH0PR13MB5639.namprd13.prod.outlook.com (2603:10b6:510:12a::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.14; Wed, 10 Nov 2021 16:29:31 +0000 Received: from PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::e1d9:64d0:cb4f:3e90]) by PH0PR13MB4842.namprd13.prod.outlook.com ([fe80::e1d9:64d0:cb4f:3e90%9]) with mapi id 15.20.4690.005; Wed, 10 Nov 2021 16:29:31 +0000 From: Simon Horman To: dev@openvswitch.org Date: Wed, 10 Nov 2021 17:28:57 +0100 Message-Id: <20211110162858.20101-7-simon.horman@corigine.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20211110162858.20101-1-simon.horman@corigine.com> References: <20211110162858.20101-1-simon.horman@corigine.com> X-ClientProxiedBy: AM0PR02CA0224.eurprd02.prod.outlook.com (2603:10a6:20b:28f::31) To PH0PR13MB4842.namprd13.prod.outlook.com (2603:10b6:510:78::6) MIME-Version: 1.0 Received: from madeliefje.horms.nl (80.113.23.202) by AM0PR02CA0224.eurprd02.prod.outlook.com (2603:10a6:20b:28f::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.15 via Frontend Transport; Wed, 10 Nov 2021 16:29:29 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0c5a3fd2-f39d-4892-cf7d-08d9a46745c4 X-MS-TrafficTypeDiagnostic: PH0PR13MB5639: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:279; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bBJgaVAtOT0SDBhLaagUs8hG8Ck47B8/J0TCJqHFUsbT9kdYbfbzg2MhpKBDlaalkvSwVcqYPDvtjAH8hXtjRXxI/IEqsfWrb1mE0iU7DOGPYrRAk/8ce+Rr0OPf5UpbrVFmAVYSJ0vu5Hcogd3nrHLlHOF2WBF6Brt9FFemEmEZ9zZdphIDGRpy+WRACbSLVo4j3+05xjtip3O+evIYrepMWLdIQimLpYlKsWQEO0zC2AJ8YfyrBvAtJIecY4EE+LctczcOCIZyU/0Ak0AYELlXfM/ATNTqq/qVziq5xQj1mtCcxnDznpv3FKTaK/6g1IjNywtupYMc4b+AxzpDuezgcGcst6RhJ7WBXNZeOX4Zl9jwc61a+ehz+pyJfJ6Gl+MYwJtZK4yXlYDZEH2UNlHvOVvYtS0+K7omCJJRwh1n/Wj+HEtlIsgf5MQJfcXZTHGcHlWs61VYUpWzi9ZpWd/6jGH23askI+jnFbK2V0fwfp1fJ/+0g75y4SI7uDBxgLdiKBQ4OmU7Q2P3nrWhYq9z/UUpYI0GRwoN7B/FrxR8mwf2FxdAkGlolFc2t4SSQeX4LvtrURa1aYtC/4NM99b78G+ROQiLWf1zYpybVDUWAfHpWVOKAL9XwUNaAE1kCsh6Pj4XLVVC0w4rwtXoHLedxPiRsgNCxAYA8x1/eGaQoLCcw0IjiFYPeCC1CzKeVgSyxn38OdrzeVlgNKg9wEGLVoik7gE0fu0MdHl5fS0= 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:(346002)(376002)(396003)(39830400003)(366004)(136003)(1076003)(36756003)(86362001)(8676002)(66946007)(54906003)(107886003)(6512007)(44832011)(6666004)(316002)(30864003)(83380400001)(6916009)(956004)(66476007)(508600001)(4326008)(5660300002)(8936002)(2906002)(6506007)(52116002)(186003)(6486002)(26005)(38100700002)(38350700002)(66556008)(2616005)(309714004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: s3TrEvRulBOXlojtU48oHGaOU35M1bAc4RuZOc3y1bJXB93LGrldtavqxavTBDEWoof37W+Ls4v3QFsko++hNEizfuClRWFNzV8kF5Ijao2eUhUQhtG5nWmpa9lZISYsd+GldCTi5NVT8c+eWqhuzPpmIUN6FNXPFZst/jCIH52Z8D+U3cH6t9Ukt7Gbm+NWzUjmA4zqFj0FMe9X+62j13zMCcQUJqOo3wGATRa+Rmm5+NXXXbD5ebcCy5crVpPg7+3hLXISkuDubpSFm/0mlb658oO1Gbl/CRluA3jA9Cp6ZxXRSvQ+NzzugLxhOPEiVY69RjhWFSS9x4LWX/S0WILCVGi7YQuftLP170pnBwl2W08x2TaOAx6Zwlid3Qk3lVOVuZzLzqxslzKMcbWUAbaXoJe/xVJZ+fVlWIXbYI9qPKKiHn6/5PrRTGRHEkPeNiLM3JeF54489NtIHLRIyLDOKYhRLpJCY+MNUU7flsgl62yAsNc9hFHxLk+u4syhGys/XW6pGb+f/2b2XeC6z/iVdpfYyqP9NTxdSOidOM/alTB7Satz/ef69juCPWWZ1MixnV+fG2mY5AWE/5lMKEjiSEEqUSYk0JuT/RapR+eVHbFZk3sw0HI33u4sQiaCpDERdlvusguPfv0LafaK0ffTnNKMTTQYmHWfnAJsHmtVd6BwyT6VnjhGVBCwd8iCPZYZ9V96YkqRm+aj93l6BpiHE3bUNN49N6xhOGdq7pE/6ddLFrT73tV6xSpn0giMgZBxqM1BM6WJGBVxRyaZXA8HcIZStzcRO6g2T/P6F/owbXGq+wtsO6mlQyUHmW9hD6/RIOz2Me+QJoXPCUPg5PDsqUZgtfD2ccWkQ4JAdaHazUsrBIldM/RNBUtwdcjLi1KvD4ef4hpqi+eF5qlHUEwdEoFNHjSlzHZg3Vq97CDFMIvgX2e+Umi1VuW4kdxY4hKQenUfADlngCFEt6hDlsZTQKAhj9f4TJBqHXa0EPS70BXCBOf65HwJm0tksrxWSmh9LEOQ1o8QHZpFSCX30Km+LcmymHojYt3nnORDqGafvTz7icKqVav3HbukJUOIUP1UeEFJ6q2l/io7ZoR9MTFDFZrjS33SwNlLP8YpDBuBcp0nfC6B+/UnrZAdhy06a6ca+IBI23aCobge92kPaiMvvwcH1za4GdfWxpkLyt1Op97r1dMsIJGDC45d2fIQ2G124RMoUVgdtVjPIco42KCyn9Qnigv6HaTTUP3DA3wgEL65ftBcuuAfz+HzxudJbVJI3I/B6X4/L9Jo2zn8327Cw+s7rUn7tOLws0KAdtRLvbziPGS2QygIXxTMvywxcu/3uPIisLFAzJwM69clu0a8TZ1kaos666nuTPnbv+PXomJX99Q0AgfY1+4sn6hbwh8goiIiwhEqgcW9Pf6wZBotoqCiOQC2BwbY3180anH0kNhqp86tvTihMTGDbFqMOh32pKKUfJArGwjPOzn6JARy+zw0SgzyMmctAQVcFiAPXEblL8uPp3E1XaBPGIhUaY4TWCi8dWd8zWyntehTCOy5m20Pn8I2mXT3Fk6Ueu4QvsUA4c67qAHptSEigbDaC2d/BGjpKI6RIVgdGhM3f63XeH/MGGHZYMnmr3EuZwUYgjKKnRtYxmrE+ShswmnjhDqWvz9djXp1f6lSHNxQVg== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c5a3fd2-f39d-4892-cf7d-08d9a46745c4 X-MS-Exchange-CrossTenant-AuthSource: PH0PR13MB4842.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Nov 2021 16:29:31.2004 (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: lKbejjhHjrz5frQC2hzdq8N0pe8ZGf8gdVMwBqv7rPkeSSeElbJEHc3M2NsBqK9r8WcGphK9KA+6iQkHOEARPaEse+r30bu3w4O4vB8Qo9k= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR13MB5639 Cc: Baowen Zheng , Tianyu Yuan , oss-drivers@corigine.com Subject: [ovs-dev] [PATCH/RFC 6/7] ofproto-dpif: add offloaded meter revalidatation 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: Baowen Zheng When meter deleted the deletion of the corresponding TC police action, used to facilitate offload via OVS-TC, may fail. This is occurs when the TC police action instance still in use by a TC flower classifiers (flows added to the TC datapath). In this commit, i add a revalidate process to clean the police action that offloaded relatewith a meter. Signed-off-by: Baowen Zheng Signed-off-by: Tianyu Yuan Signed-off-by: Simon Horman --- lib/dpif-netdev.c | 1 + lib/dpif-netlink.c | 172 ++++++++++++++++++++++++++++++++++ lib/dpif-provider.h | 4 + lib/dpif.c | 6 ++ lib/id-pool.c | 6 ++ lib/id-pool.h | 1 + lib/tc.c | 6 -- lib/tc.h | 7 ++ ofproto/ofproto-dpif-upcall.c | 1 + ofproto/ofproto-dpif.h | 2 + 10 files changed, 200 insertions(+), 6 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index bf4de3cf4..0c0a0249e 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -8809,6 +8809,7 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_meter_set, dpif_netdev_meter_get, dpif_netdev_meter_del, + NULL, /* meter_revalidate */ dpif_netdev_bond_add, dpif_netdev_bond_del, dpif_netdev_bond_stats_get, diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index d270dbbd2..aff78abcc 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -49,6 +49,7 @@ #include "netlink.h" #include "netnsid.h" #include "odp-util.h" +#include "ofproto/ofproto-dpif.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/flow.h" #include "openvswitch/hmap.h" @@ -4035,6 +4036,12 @@ dpif_netlink_meter_transact(struct ofpbuf *request, struct ofpbuf **replyp, return 0; } +static const struct nl_policy police_policy[] = { + [TCA_POLICE_TBF] = { .type = NL_A_UNSPEC, + .min_len = sizeof(struct tc_police), + .optional = false, }, +}; + static void dpif_netlink_meter_get_features(const struct dpif *dpif_, struct ofputil_meter_features *features) @@ -4294,6 +4301,170 @@ dpif_netlink_meter_set(struct dpif *dpif_, ofproto_meter_id meter_id, return dpif_netlink_meter_set__(dpif_, meter_id, add, config); } +static const struct nl_policy tca_root_policy[] = { + [TCA_ACT_TAB] = { .type = NL_A_NESTED, .optional = false }, + [TCA_ROOT_COUNT] = { .type = NL_A_U32, .optional = false }, +}; + +static const struct nl_policy act_policy[] = { + [TCA_ACT_KIND] = { .type = NL_A_STRING, .optional = false, }, + [TCA_ACT_COOKIE] = { .type = NL_A_UNSPEC, .optional = true, }, + [TCA_ACT_OPTIONS] = { .type = NL_A_NESTED, .optional = true, }, + [TCA_ACT_STATS] = { .type = NL_A_NESTED, .optional = false, }, +}; + +static bool dpif_netlink_meter_should_revalidate(struct dpif_backer *backer, + uint32_t meter_id) +{ + return !id_pool_id_exist(backer->meter_ids, meter_id); +} + +static void +dpif_tc_meter_revalidate(struct dpif *dpif_ OVS_UNUSED, + struct dpif_backer *backer, struct ofpbuf *reply) +{ + static struct nl_policy actions_orders_policy[ACT_MAX_NUM + 1] = {}; + struct nlattr *actions_orders[ARRAY_SIZE(actions_orders_policy)]; + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); + struct nlattr *action_root_attrs[ARRAY_SIZE(tca_root_policy)]; + struct nlattr *action_police_tab[ARRAY_SIZE(police_policy)]; + struct nlattr *action_police_attrs[ARRAY_SIZE(act_policy)]; + const int max_size = ARRAY_SIZE(actions_orders_policy); + const struct tc_police *tc_police = NULL; + struct ofputil_meter_stats stats; + ofproto_meter_id meter_id; + size_t revalidate_num; + size_t act_count; + uint32_t index; + int i; + + if (!reply) { + VLOG_ERR_RL(&rl, "get null reply message when meter revalidate \n"); + return; + } + + if (!nl_policy_parse(reply, NLMSG_HDRLEN + sizeof(struct tcamsg), + tca_root_policy, action_root_attrs, + ARRAY_SIZE(action_root_attrs))) { + VLOG_ERR_RL(&rl, "failed to parse reply message when meter " + "revalidate \n"); + return; + } + + act_count = nl_attr_get_u32(action_root_attrs[TCA_ROOT_COUNT]); + if (!act_count) { + VLOG_ERR_RL(&rl, "there is no police action returned in message when " + "meter revalidate \n"); + return; + } + + for (i = 0; i < max_size; i++) { + actions_orders_policy[i].type = NL_A_NESTED; + actions_orders_policy[i].optional = true; + } + + revalidate_num = act_count > ACT_MAX_NUM ? + (ACT_MAX_NUM + 1) : (act_count + 1); + + if (!nl_parse_nested(action_root_attrs[TCA_ACT_TAB], actions_orders_policy, + actions_orders, revalidate_num) ) { + VLOG_ERR_RL(&rl, "failed to parse TCA_ACT_TAB when meter revalidate " + "for act_count %lu", act_count); + return; + } + + for (i = 0; i < revalidate_num; i++) { + if (!actions_orders[i]) { + continue; + } + + if (!nl_parse_nested(actions_orders[i], act_policy, + action_police_attrs, ARRAY_SIZE(act_policy))) { + VLOG_ERR_RL(&rl, "failed to parse police action when meter " + "revalidate\n"); + return; + } + if (strcmp(nl_attr_get_string(action_police_attrs[TCA_KIND]), + "police")) { + VLOG_EMER("get none police action when meter revalidate\n"); + continue; + } + if (!nl_parse_nested(action_police_attrs[TCA_ACT_OPTIONS], + police_policy, action_police_tab, + ARRAY_SIZE(action_police_tab))) { + VLOG_ERR_RL(&rl, "failed to parse the single police action when " + "meter revalidate\n"); + return; + } + tc_police = nl_attr_get_unspec(action_police_tab[TCA_POLICE_TBF], + sizeof *tc_police); + if (!tc_police) { + VLOG_ERR_RL(&rl, "can not get police struct in police order %u " + "when meter revalidate\n", i); + continue; + } + index = tc_police->index; + if (UNLIKELY_METER_ACTION(index)) { + continue; + } + + index = POLICY_INDEX_TO_METER_ID(index); + if (dpif_netlink_meter_should_revalidate(backer, index)) { + meter_id.uint32 = index; + VLOG_ERR_RL(&rl, "revalidate the meter id %u for police index " + "%08x\n", index, tc_police->index); + dpif_netlink_meter_del_police(meter_id, &stats, 1); + } + } +} + +static void +dpif_netlink_meter_revalidate__(struct dpif *dpif_ OVS_UNUSED, + struct dpif_backer *backer) +{ + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); + struct nla_bitfield32 dump_flags = { TCA_DUMP_FLAGS_TERSE, + TCA_DUMP_FLAGS_TERSE }; + struct ofpbuf request; + struct ofpbuf *reply; + struct tcamsg *tcmsg; + size_t total_offset; + size_t act_offset; + int prio = 0; + int error; + + if (!netdev_is_flow_api_enabled()) { + return; + } + tcmsg = tc_act_make_request(RTM_GETACTION, NLM_F_DUMP, &request); + if (!tcmsg) { + return; + } + dpif_netlink_police_start_nested(&request, &prio, &total_offset, + &act_offset); + nl_msg_put_string(&request, TCA_KIND, "police"); + dpif_netlink_police_end_nested(&request, &total_offset, &act_offset); + nl_msg_put_unspec(&request, TCA_ROOT_FLAGS, &dump_flags, + sizeof dump_flags); + error = tc_transact(&request, &reply); + if (error) { + VLOG_ERR_RL(&rl, "failed to send dump netlink msg for revalidate " + "error %d\n", error); + return; + } + dpif_tc_meter_revalidate(dpif_, backer, reply); + ofpbuf_delete(reply); +} + +static void +dpif_netlink_meter_revalidate(struct dpif *dpif_, struct dpif_backer *backer) +{ + if (probe_broken_meters(dpif_)) { + return; + } + dpif_netlink_meter_revalidate__(dpif_, backer); +} + /* Retrieve statistics and/or delete meter 'meter_id'. Statistics are * stored in 'stats', if it is not null. If 'command' is * OVS_METER_CMD_DEL, the meter is deleted and statistics are optionally @@ -4617,6 +4788,7 @@ const struct dpif_class dpif_netlink_class = { dpif_netlink_meter_set, dpif_netlink_meter_get, dpif_netlink_meter_del, + dpif_netlink_meter_revalidate, NULL, /* bond_add */ NULL, /* bond_del */ NULL, /* bond_stats_get */ diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 0d092de9b..f3893b2d1 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -25,6 +25,7 @@ #include "openflow/openflow.h" #include "dpif.h" #include "util.h" +#include "ofproto/ofproto-dpif.h" #ifdef __cplusplus extern "C" { @@ -624,6 +625,9 @@ struct dpif_class { int (*meter_del)(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); + /* revalidate meter entries in offload cases */ + void (*meter_revalidate)(struct dpif *, struct dpif_backer *); + /* Adds a bond with 'bond_id' and the member-map to 'dpif'. */ int (*bond_add)(struct dpif *dpif, uint32_t bond_id, odp_port_t *member_map); diff --git a/lib/dpif.c b/lib/dpif.c index 3d4eae1a6..984b20fef 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -2090,3 +2090,9 @@ dpif_cache_set_size(struct dpif *dpif, uint32_t level, uint32_t size) ? dpif->dpif_class->cache_set_size(dpif, level, size) : EOPNOTSUPP; } + +void +dpif_meter_revalidate(struct dpif *dpif, struct dpif_backer *backer) +{ + dpif->dpif_class->meter_revalidate(dpif, backer); +} diff --git a/lib/id-pool.c b/lib/id-pool.c index 69910ad08..50999a096 100644 --- a/lib/id-pool.c +++ b/lib/id-pool.c @@ -155,3 +155,9 @@ id_pool_free_id(struct id_pool *pool, uint32_t id) } } } + +bool +id_pool_id_exist(struct id_pool *pool, uint32_t id) +{ + return !!id_pool_find(pool, id); +} diff --git a/lib/id-pool.h b/lib/id-pool.h index 8721f8793..08fba6d43 100644 --- a/lib/id-pool.h +++ b/lib/id-pool.h @@ -29,6 +29,7 @@ void id_pool_destroy(struct id_pool *); bool id_pool_alloc_id(struct id_pool *, uint32_t *id); void id_pool_free_id(struct id_pool *, uint32_t id); void id_pool_add(struct id_pool *, uint32_t id); +bool id_pool_id_exist(struct id_pool *pool, uint32_t id); /* * ID pool. diff --git a/lib/tc.c b/lib/tc.c index 3993498b0..5d89560f8 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -51,10 +51,6 @@ #define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU) #endif -#ifndef TCA_DUMP_FLAGS_TERSE -#define TCA_DUMP_FLAGS_TERSE (1 << 0) -#endif - #if TCA_MAX < 15 #define TCA_CHAIN 11 #define TCA_INGRESS_BLOCK 13 @@ -1821,8 +1817,6 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower, return 0; } -#define TCA_ACT_MIN_PRIO 1 - static int nl_parse_flower_actions(struct nlattr **attrs, struct tc_flower *flower, bool terse) diff --git a/lib/tc.h b/lib/tc.h index 0f7de8677..5b1c934d8 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -58,6 +58,8 @@ enum tc_flower_reserved_prio { #define METER_ID_TO_POLICY_INDEX(meter_id) 0xff << 24 | (meter_id + 1) << 8 /* Mapping policy_index to meter_id */ #define POLICY_INDEX_TO_METER_ID(index) (((index >> 8) & 0xffff) - 1) +/* Ckeck if given policy action is meter action*/ +#define UNLIKELY_METER_ACTION(index) !(index & (0xff << 24)) || !((index >> 8) & 0xffff) enum tc_qdisc_hook { TC_INGRESS, @@ -284,7 +286,12 @@ enum tc_offloaded_state { TC_OFFLOADED_STATE_NOT_IN_HW, }; +#ifndef TCA_DUMP_FLAGS_TERSE +#define TCA_DUMP_FLAGS_TERSE (1 << 0) +#endif +#define ACT_MAX_NUM 1024 #define TCA_ACT_MAX_NUM 16 +#define TCA_ACT_MIN_PRIO 1 struct tcf_id { enum tc_qdisc_hook hook; diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 1c9c720f0..091b0a626 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -2794,6 +2794,7 @@ revalidate(struct revalidator *revalidator) ovsrcu_quiesce(); } dpif_flow_dump_thread_destroy(dump_thread); + dpif_meter_revalidate(udpif->dpif, udpif->backer); ofpbuf_uninit(&odp_actions); } diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index 191cfcb0d..cf7ebc29d 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -401,4 +401,6 @@ bool ofproto_dpif_ct_zone_timeout_policy_get_name( bool ovs_explicit_drop_action_supported(struct ofproto_dpif *); +void dpif_meter_revalidate(struct dpif *dpif, struct dpif_backer *backer); + #endif /* ofproto-dpif.h */