From patchwork Tue May 16 15:20:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: miter X-Patchwork-Id: 1782126 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" (2048-bit key; unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=pM4u9I0L; 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 4QLKgn5MyZz20dX for ; Wed, 17 May 2023 01:20:53 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 4365441E41; Tue, 16 May 2023 15:20:51 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 4365441E41 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=pM4u9I0L 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 b-TB-IaDHH2g; Tue, 16 May 2023 15:20:47 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp2.osuosl.org (Postfix) with ESMTPS id 8767241E22; Tue, 16 May 2023 15:20:46 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 8767241E22 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B6A94C0097; Tue, 16 May 2023 15:20:44 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id A3DFCC002A for ; Tue, 16 May 2023 15:20:42 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 4FB3C40481 for ; Tue, 16 May 2023 15:20:41 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 4FB3C40481 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 oEZkfBa9zVE5 for ; Tue, 16 May 2023 15:20:39 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 9EAB341E07 Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2081b.outbound.protection.outlook.com [IPv6:2a01:111:f403:7004::81b]) by smtp2.osuosl.org (Postfix) with ESMTPS id 9EAB341E07 for ; Tue, 16 May 2023 15:20:39 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kJSkNdRyNd10yqRbVCGtD/thS+Ov5yQU9Jmjq07a2Yfxg2NeVCHaYAmhQvwY/uvrdbhxekULo76KNnAY863WM7Ky7iQh0DQNf1m2A7RitAyffzxygqiEh4VykEx/sCZJS7Wlzl4xaPjsj4ZwLiTSXq9qY19+EcVHFub7q39nmsgI1EVOnc2yebZTWi+ote8tM/dhiNWJq/a3Vb6ljt1kkj1GVnL+M2qix42KHtnSdxpSQBlhtah4F+tC9X9/hyq9Jki7uNsg4vuGW8xNXgt5S5aNwKYeKaghXeIWO43BIHvqmMi3T0FQUbAz1nAhaUlzX2cCYpby/Ig0IYSpIdxCKA== 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=hcvuf3uS/+EEy9Xe99xx9zF15AChkRIVWk+TAjshlQw=; b=DvZhCwdByYAd8xbGpqPIAHma21UY89F+eFLaKdsLxWrW9kr6YZk4FldmpDcb62NFqFd81o7M2+XurHk8GKsWx0DEAsEDYRRyVJ8qmq5KZO0SasslTUdvrLQ0gjAXfH1SMh/pDszsQ1lktiH0KeZOKWKgoyI0E5iQbKM/bBaMz26MGgNus+0FViTPcgXarMJ97NOsXFw5+kbkDfGHbyEsmHEGysX3Kt9dXvcBWrquGyMjYce97TDcZe1U24Uug04qVLHnuk7s/qLEGkeufD8DNMs3zC08r+GWp1G2S1njckBeQLq3++FUYAZA2ial8sRrjbLClP7zIEpckfhMfIqNXg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hcvuf3uS/+EEy9Xe99xx9zF15AChkRIVWk+TAjshlQw=; b=pM4u9I0LHn7LlaAf6WjbtpIC9opUD17mzIGBK8hVXURiZlmzMKkqen2sf8GFta+JTC+elfwvp9WSwg5OLVCzBMvzi0xuNtVACyg5Ce+OhRTVmE/XWZZMMpd9g/2rOXYKIudZ7eaipr7LX2GbNH96xF0/z9fegRj1Nlr9+/Oe5rbfn13h9UkMXIKO5zmtIrQ3HU4xbGB1PpTzVk6IMeprvRJ2movTTOeLgZPgpl+wsCcro3QtliYpRijXPawlJiRdi6hYtphvla2zpwnzv5XScHMrH5Gn2DXGUna88qqu4wUqFWHZ8BtMsolO69hTviDMu75E9yjVo3bJ37NveZxD9A== Received: from SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) by MEYPR01MB7887.ausprd01.prod.outlook.com (2603:10c6:220:17d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.33; Tue, 16 May 2023 15:20:33 +0000 Received: from SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5]) by SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5%6]) with mapi id 15.20.6387.032; Tue, 16 May 2023 15:20:33 +0000 From: miterv@outlook.com To: dev@openvswitch.org, i.maximets@ovn.org, simon.horman@corigine.com Date: Tue, 16 May 2023 23:20:20 +0800 Message-ID: X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230516152020.2409-1-miterv@outlook.com> References: <20230516152020.2409-1-miterv@outlook.com> X-TMN: [gsbQVTn0ZTOknrsB3MROGrvUSt8ScBSx] X-ClientProxiedBy: SI2PR02CA0001.apcprd02.prod.outlook.com (2603:1096:4:194::10) To SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) X-Microsoft-Original-Message-ID: <20230516152020.2409-3-miterv@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SY4PR01MB8438:EE_|MEYPR01MB7887:EE_ X-MS-Office365-Filtering-Correlation-Id: dcc737c9-d316-4a41-6b0d-08db562117cc X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +7u3OyeAbeSLV540cHe6yyqipymuJqZyemMUEI8wmstlSR+4S972oj0eu/GsOmkpdRinT4Vhj7OL1nEIPcQqDUg72WHkMWYwoGLfJZcztxuhwLBNxy/qsQKLUWkQ+GG37ZFOdX5jh82c3ICorUBhd37xFR/rECWbzxS0YaHbg5xaif79Ij2MH+4/qiBJyHIcqK7cuI1czbLVeXOri75saecvV0gMTGrmShIhyDZ1Qp+NkT5D+twPlOfIYDPzN+6Ltrdg/cgTrxvWrkxWWZOSIxuSu0VOhbYstqrTmjqNc/68H1Zgdv6pZ5KgChzIdkD1KrhDFW6tr2rfglZzHYw2/dlTExnMIHzkqoPbLeaN8nBTRm8XO7uZNwbkVR34r6cNZ+8077LP6mxht8bTv/N3dq3VDpx6kYtVhU/gpy90rB4KGIn6LnyVYagJ7dbxXC3LjAQrwmj2+ppIMbVZdQcC4WAH2CoxbDxc3OnQJCGL5sJpJaN43dJvOUCbQaVJPzhGzpE4TwuXdeROq3rHu5NNLrtCLXAARXWcPTnpa9B2fDLB+yqgQuVGmnqEbl48dAG5 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?xzH+erz2S2i/VzIiez8msheddpoj?= =?utf-8?q?IDIu775oWnZQkysBwTISqKjdfX0Q/Np4+i7WAinYA39WPQXa01Ck9TqztinrUMLMf?= =?utf-8?q?0EQzeLtPwPvKKZIalo/6OCAByCAf2JmMitSlXy34aPiwp4bO6X6vPvuC79agvn3rm?= =?utf-8?q?xlOlESENrxINm6304OkkBkLhgdf9jX2KdqaWEOg3+pHi5lJnQUj/c4Hc3uxPLSyEK?= =?utf-8?q?mSy+M00e9ecag9DDAeQ+UUuA9xrQLV8R4k+vK1+AnMxH4SEmLZd4DR1H9rc+lhu94?= =?utf-8?q?TCVzXc5+odiSaxZQjLd/HS+vwcGEuyzri1C2bp7TQ5EhkYOXsKCY8rrfvCg6tNcs2?= =?utf-8?q?KWwP809fX+iLN03qrKZR/p7uUiryNIzhLttXp4fh19swZ1taF2ijKZ90QAM8bsWAY?= =?utf-8?q?wO5so2/s8LXYKM+pQrDY9P1YwbgmYw6jF/2+fbLrK60WDltcB648WbnWPJ5bNbwPF?= =?utf-8?q?SDpLnmDHb7DFDis3IgI1THctdpA3DZ3EMutFgqCQBFu1TTOFBqRQi5Y6yG2WcNPiP?= =?utf-8?q?fJas5Slwn9H8TEwS483nUh/9mn6AajEhq+zXMnvzaNZO9eERhb28Xj9YJyimsKvRe?= =?utf-8?q?8M3s/uiClFOI3kBtnX5oyJII4CERULbUSGN8qGglmxM3w/HZC26mhPpuCMjGe/Ar3?= =?utf-8?q?21/7qpAgbWandhXl/FCBzEByK5Luf/jRQA4mSb51/qFQYWDA6/4GqDEejsLSwOuAq?= =?utf-8?q?d1Wg3l/GJb/nHma/0SophUU1FDE8YYY+kW73Y+5yFbcHxp1Vj7gxLCfzbOsGNkthu?= =?utf-8?q?8azR9l4u7STtLNFk7JaKMTXGrIFEoAV3B6YnEUBxgoSmXVUhuaWabKY0TXwrN1Zzt?= =?utf-8?q?A+SKDd1bs1RBkJU78xCEKrekEawdOjUw48nRoI28PlPRsUpab/J7bN9KcCY9CcbjC?= =?utf-8?q?sgrGqbhg4Vh8/sHOtpDwLSXIPgDRbQ4MGG8K/BxeoESt0kWP4dxxZgza3P3ZeK+Qc?= =?utf-8?q?OyWVQ/zG/pl0WBkaSOldoy82jN/pnyo+NZ9rAZQkWa1wADOIkr/p3mECsGxpCj0mF?= =?utf-8?q?lhw0li5uiBekzADcwA3c5KPsmDYID/ECcDED58FxYchrdORBbcv0CvWLm1cVk+MOP?= =?utf-8?q?n4QLcIOTSOYFXHFhP/YElNvV66jL6ZAuZFJdJZz7h69uC+mZ8R+I4FyE8t6t7Rk0m?= =?utf-8?q?YQZq5oeNJ8xXz5hlg3mJYpK/3J3ifVEnxgIbfiag=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: dcc737c9-d316-4a41-6b0d-08db562117cc X-MS-Exchange-CrossTenant-AuthSource: SY4PR01MB8438.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2023 15:20:33.8998 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7887 Cc: Lin Huang Subject: [ovs-dev] [PATCH v4 2/2] netdev-dpdk: Add support for ingress packet-per-second policing. 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: Lin Huang OvS has supported packet-per-second policer which can be set at ingress and egress side in kernel datapath. But the userspace datapath dosen't support for ingress and egress packet-per-second policing now. So, this patch add support for userspace ingress pps policing by using native ovs token bucket library. Token bucket is accumulated by 'rate' tokens per millisecond and store maxiumim tokens at 'burst' bucket size. One token in the bucket means one packet (1 kpkts * millisecond) which will drop or pass by policer. This patch reuse 'ingress_policing_kpkts_rate' and 'ingress_policing_kpkts_burst' options at interface table. Now userspace ingress policer supports setting packet-per-second limits in addition to the previously configurable byte rate settings. Examples: $ ovs-vsctl set interface dpdk0 ingress_policing_rate=12300 $ ovs-vsctl set interface dpdk0 ingress_policing_burst=12300 $ ovs-vsctl set interface dpdk0 ingress_policing_kpkts_rate=123 $ ovs-vsctl set interface dpdk0 ingress_policing_kpkts_burst=123 Add some unit tests for ingress packet-per-second policing. Signed-off-by: Lin Huang --- Documentation/topics/dpdk/qos.rst | 14 +- NEWS | 2 + lib/netdev-dpdk.c | 73 +++++++--- tests/system-dpdk.at | 218 ++++++++++++++++++++++++++++++ 4 files changed, 287 insertions(+), 20 deletions(-) diff --git a/Documentation/topics/dpdk/qos.rst b/Documentation/topics/dpdk/qos.rst index 5f0b1469a..e7cc3d2a7 100644 --- a/Documentation/topics/dpdk/qos.rst +++ b/Documentation/topics/dpdk/qos.rst @@ -106,11 +106,17 @@ Refer to ``vswitch.xml`` for more details on egress policer. Rate Limiting (Ingress Policing) -------------------------------- -Assuming you have a :doc:`vhost-user port ` receiving traffic -consisting of packets of size 64 bytes, the following command would limit the -reception rate of the port to ~1,000,000 packets per second:: +Assuming you have a :doc:`vhost-user port ` receiving traffic, +the following command would limit the reception rate of the port to +~1,000,000 bits per second:: - $ ovs-vsctl set interface vhost-user0 ingress_policing_rate=368000 \ + $ ovs-vsctl set interface vhost-user0 ingress_policing_rate=1000 \ + ingress_policing_burst=1000` + +or, the following command would limit the reception rate of the port to +~1,000,000 packets per second:: + + $ ovs-vsctl set interface dpdk0 ingress_policing_kpkts_rate=1000 \ ingress_policing_burst=1000` To examine the ingress policer configuration of the port:: diff --git a/NEWS b/NEWS index 3c33acbbf..36661ff30 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,8 @@ Post-v3.1.0 - Userspace datapath: * Added new configuration options 'kpkts_rate' and 'kpkts_burst' for 'egress-policer' to support packet-per-second policing. + * Added support for ingress packet-per-second policingļ¼Œconfigured by + ingress_policing_kpkts_rate/burst options. v3.1.0 - 16 Feb 2023 diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 518267414..55ab8c3f7 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -413,6 +413,8 @@ struct ingress_policer { struct rte_meter_srtcm_params app_srtcm_params; struct rte_meter_srtcm in_policer; struct rte_meter_srtcm_profile in_prof; + struct token_bucket tb; + enum policer_type type; rte_spinlock_t policer_lock; }; @@ -496,6 +498,9 @@ struct netdev_dpdk { uint32_t policer_rate; uint32_t policer_burst; + uint32_t policer_kpkts_rate; + uint32_t policer_kpkts_burst; + /* Array of vhost rxq states, see vring_state_changed. */ bool *vhost_rxq_enabled; ); @@ -1315,6 +1320,8 @@ common_construct(struct netdev *netdev, dpdk_port_t port_no, ovsrcu_init(&dev->ingress_policer, NULL); dev->policer_rate = 0; dev->policer_burst = 0; + dev->policer_kpkts_rate = 0; + dev->policer_kpkts_burst = 0; netdev->n_rxq = 0; netdev->n_txq = 0; @@ -2387,15 +2394,20 @@ static int ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, int pkt_cnt, bool should_steal) { - int cnt = 0; - rte_spinlock_lock(&policer->policer_lock); - cnt = srtcm_policer_run_single_packet(&policer->in_policer, - &policer->in_prof, - pkts, pkt_cnt, should_steal); + if (policer->type & POLICER_BPS) { + pkt_cnt = srtcm_policer_run_single_packet(&policer->in_policer, + &policer->in_prof, + pkts, pkt_cnt, should_steal); + } + + if (policer->type & POLICER_PKTPS) { + pkt_cnt = pkts_policer_run_single_packet(&policer->tb, pkts, pkt_cnt, + should_steal); + } rte_spinlock_unlock(&policer->policer_lock); - return cnt; + return pkt_cnt; } static bool @@ -3554,7 +3566,8 @@ netdev_dpdk_get_features(const struct netdev *netdev, } static struct ingress_policer * -netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst) +netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst, + uint32_t kpkts_rate, uint32_t kpkts_burst) { struct ingress_policer *policer = NULL; uint64_t rate_bytes; @@ -3578,9 +3591,22 @@ netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst) &policer->in_prof); } if (err) { - VLOG_ERR("Could not create rte meter for ingress policer"); + VLOG_DBG("Could not create rte meter for ingress policer"); + } else { + policer->type |= POLICER_BPS; + } + + err = pkts_policer_profile_config(&policer->tb, kpkts_rate, kpkts_burst); + if (err) { + VLOG_DBG("Could not create tocken bucket for ingress policer"); + } else { + policer->type |= POLICER_PKTPS; + } + + if (!policer->type) { + /* Neither kbps nor kpkts policer is configured. */ free(policer); - return NULL; + policer = NULL; } return policer; @@ -3589,8 +3615,8 @@ netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst) static int netdev_dpdk_set_policing(struct netdev* netdev, uint32_t policer_rate, uint32_t policer_burst, - uint32_t policer_kpkts_rate OVS_UNUSED, - uint32_t policer_kpkts_burst OVS_UNUSED) + uint32_t policer_kpkts_rate, + uint32_t policer_kpkts_burst) { struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); struct ingress_policer *policer; @@ -3603,13 +3629,23 @@ netdev_dpdk_set_policing(struct netdev* netdev, uint32_t policer_rate, : !policer_burst ? 8000 : policer_burst); + /* + * Force to 0 if no rate specified, + * default to rate value if burst is 0, + * else stick with user-specified value. + */ + policer_kpkts_burst = (!policer_kpkts_rate ? 0 + : !policer_kpkts_burst ? policer_kpkts_rate + : policer_kpkts_burst); ovs_mutex_lock(&dev->mutex); policer = ovsrcu_get_protected(struct ingress_policer *, - &dev->ingress_policer); + &dev->ingress_policer); if (dev->policer_rate == policer_rate && - dev->policer_burst == policer_burst) { + dev->policer_burst == policer_burst && + dev->policer_kpkts_rate == policer_kpkts_rate && + dev->policer_kpkts_burst == policer_kpkts_burst) { /* Assume that settings haven't changed since we last set them. */ ovs_mutex_unlock(&dev->mutex); return 0; @@ -3620,14 +3656,19 @@ netdev_dpdk_set_policing(struct netdev* netdev, uint32_t policer_rate, ovsrcu_postpone(free, policer); } - if (policer_rate != 0) { - policer = netdev_dpdk_policer_construct(policer_rate, policer_burst); - } else { + if (!policer_rate && !policer_kpkts_rate) { + /* both policers are zero. */ policer = NULL; + } else { + policer = netdev_dpdk_policer_construct(policer_rate, policer_burst, + policer_kpkts_rate, + policer_kpkts_burst); } ovsrcu_set(&dev->ingress_policer, policer); dev->policer_rate = policer_rate; dev->policer_burst = policer_burst; + dev->policer_kpkts_rate = policer_kpkts_rate; + dev->policer_kpkts_burst = policer_kpkts_burst; ovs_mutex_unlock(&dev->mutex); return 0; diff --git a/tests/system-dpdk.at b/tests/system-dpdk.at index 63de044e9..a76a906ec 100644 --- a/tests/system-dpdk.at +++ b/tests/system-dpdk.at @@ -276,6 +276,7 @@ OVS_DPDK_PRE_PHY_SKIP() OVS_DPDK_START() dnl Add userspace bridge and attach it to OVS and add policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) AT_CHECK([ovs-vsctl add-port br10 phy0 -- set Interface phy0 type=dpdk options:dpdk-devargs=$(cat PCI_ADDR)], [], [stdout], [stderr]) AT_CHECK([ovs-vsctl set interface phy0 ingress_policing_rate=10000 ingress_policing_burst=1000]) @@ -312,6 +313,7 @@ OVS_DPDK_PRE_CHECK() OVS_DPDK_START() dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_rate=10000 ingress_policing_burst=1000]) @@ -355,6 +357,7 @@ OVS_DPDK_PRE_CHECK() OVS_DPDK_START() dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_burst=1000]) @@ -396,6 +399,7 @@ OVS_DPDK_PRE_CHECK() OVS_DPDK_START() dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_rate=10000]) @@ -426,6 +430,218 @@ AT_CLEANUP dnl -------------------------------------------------------------------------- +dnl -------------------------------------------------------------------------- +dnl Ingress policing (kpkts) create delete vport port +AT_SETUP([OVS-DPDK - Ingress policing (kpkts) create delete vport port]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) +AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_rate=10000 ingress_policing_kpkts_burst=10000]) +AT_CHECK([ovs-vsctl show], [], [stdout]) +sleep 2 + +dnl Remove ingress policer +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_rate=0 ingress_policing_kpkts_burst=0]) + +dnl Fail if ingress policer could not be created +AT_FAIL_IF([grep "Could not create token bucket for ingress policer" ovs-vswitchd.log], [], [stdout]) + +dnl Check ingress policer was removed correctly +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_burst: 0' stdout], [], [stdout]) + +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_rate: 0' stdout], [], [stdout]) + +dnl Parse log file +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) vhost-user client: socket created" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ovs-vswitchd.log], [], [stdout]) + +dnl Clean up +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr]) +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create rte meter for ingress policer@d +\@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl Ingress policing (kpkts) no policing rate +AT_SETUP([OVS-DPDK - Ingress policing (kpkts) no policing rate]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) +AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_burst=1000]) +AT_CHECK([ovs-vsctl show], [], [stdout]) +sleep 2 + +dnl check ingress policer not be created +AT_FAIL_IF([grep "Could not create token bucket for ingress policer" ovs-vswitchd.log], [], [stdout]) + +dnl Check ingress policer was created correctly +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_burst: 1000' stdout], [], [stdout]) + +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_rate: 0' stdout], [], [stdout]) + + +dnl Parse log file +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) vhost-user client: socket created" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ovs-vswitchd.log], [], [stdout]) + +dnl Clean up +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr]) +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl Ingress policing (kpkts) no policing burst +AT_SETUP([OVS-DPDK - Ingress policing (kpkts) no policing burst]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) +AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_rate=10000]) +AT_CHECK([ovs-vsctl show], [], [stdout]) +sleep 2 + +dnl check ingress policer not be created +AT_FAIL_IF([grep "Could not create token bucket for ingress policer" ovs-vswitchd.log], [], [stdout]) + +dnl Check ingress policer was created correctly +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_burst: 0' stdout], [], [stdout]) + +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_rate: 10000' stdout], [], [stdout]) + +dnl Parse log file +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) vhost-user client: socket created" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ovs-vswitchd.log], [], [stdout]) + +dnl Clean up +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr]) +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create rte meter for ingress policer@d +\@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl Ingress policing (kpkts) max policing rate +AT_SETUP([OVS-DPDK - Ingress policing (kpkts) max policing rate]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) +AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_rate=42949671]) +AT_CHECK([ovs-vsctl show], [], [stdout]) +sleep 2 + +dnl Check ingress policer was created correctly +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_burst: 0' stdout], [], [stdout]) + +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_rate: 42949671' stdout], [], [stdout]) + +dnl Parse log file +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) vhost-user client: socket created" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ovs-vswitchd.log], [], [stdout]) + +dnl Clean up +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr]) +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create token bucket for ingress policer@d +\@Could not create rte meter for ingress policer@d +\@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl Ingress policing (kpkts) max policing burst +AT_SETUP([OVS-DPDK - Ingress policing (kpkts) max policing burst]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add ingress policer +AT_CHECK([ovs-appctl vlog/set netdev_dpdk:dbg], [], [stdout]) +AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev]) +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface dpdkvhostuserclient0 type=dpdkvhostuserclient options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [], [stdout], [stderr]) +AT_CHECK([ovs-vsctl set interface dpdkvhostuserclient0 ingress_policing_kpkts_burst=42949671]) +AT_CHECK([ovs-vsctl show], [], [stdout]) +sleep 2 + +dnl check ingress policer not be created +AT_FAIL_IF([grep "Could not create token bucket for ingress policer" ovs-vswitchd.log], [], [stdout]) + +dnl Check ingress policer was created correctly +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_burst: 42949671' stdout], [], [stdout]) + +AT_CHECK([ovs-vsctl list interface dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'ingress_policing_kpkts_rate: 0' stdout], [], [stdout]) + +dnl Parse log file +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) vhost-user client: socket created" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "vHost User device 'dpdkvhostuserclient0' created in 'client' mode, using client socket" ovs-vswitchd.log], [], [stdout]) +AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ovs-vswitchd.log], [], [stdout]) + +dnl Clean up +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr]) +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create token bucket for ingress policer@d +\@Could not create rte meter for ingress policer@d +\@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + dnl -------------------------------------------------------------------------- dnl QoS create delete phy port AT_SETUP([OVS-DPDK - QoS create delete phy port]) @@ -1390,3 +1606,5 @@ OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ ])") AT_CLEANUP dnl -------------------------------------------------------------------------- + +