From patchwork Mon May 1 11:33:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: miter X-Patchwork-Id: 1775469 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.136; helo=smtp3.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=Aibh/8Ha; dkim-atps=neutral Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (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 4Q91M65pwbz1ymp for ; Mon, 1 May 2023 21:34:10 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id A53D061381; Mon, 1 May 2023 11:34:08 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org A53D061381 Authentication-Results: smtp3.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=Aibh/8Ha 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 y7ks0KKOkW9D; Mon, 1 May 2023 11:34:06 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp3.osuosl.org (Postfix) with ESMTPS id 4745F6134D; Mon, 1 May 2023 11:34:05 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 4745F6134D Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0A97AC008C; Mon, 1 May 2023 11:34:03 +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 F40CEC002A for ; Mon, 1 May 2023 11:34:01 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id CEC5F8133B for ; Mon, 1 May 2023 11:34:01 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org CEC5F8133B Authentication-Results: smtp1.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=Aibh/8Ha 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 u9XSmXKGAASU for ; Mon, 1 May 2023 11:34:00 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org BA94181340 Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2082e.outbound.protection.outlook.com [IPv6:2a01:111:f403:7004::82e]) by smtp1.osuosl.org (Postfix) with ESMTPS id BA94181340 for ; Mon, 1 May 2023 11:33:59 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZDlxis8iap1UjTcHClGI98GzXaBdOLVzna9Z0HFMQYP39/3uCvJ7MfIw3OxXsvDqtFZ+xAx4MLsB32S7+88Nubpb1Zjmsn9teDswMn8W04TrF8Z0tRFK8hEj8lcBSLROthbWu+gb3X+Kyth2IvYfjIzFPgRHZgJkJxUX1oEemM/Oyk+02FTY8nchgXzbKKtMl2juLIPgKVlhVACBX8D+g/VnXRDKAXeH5AwErVyhUnJZcqBZi96H6IW7JyyOXE8ng7HMqWGcwW0Jh2Y9dLicH4RmZIr1xD+f7au51rDnrjaWMmiT7JkRFUm6dMXJuRlsKbRTGfdRSTcMcQ2SowjnWw== 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=FO6KdqOxT/brmtlEAvxFpJl9z3U6T54m6PKsQCk63MA=; b=K3StA9bw+ut3j2/mAFt8iW5N5Lo78hWCkOnFaO7rRcD+t61vICA98rA2Q/YLuS7cLzKo7QUvihFkfBFfu1FdJyAhLGPsd9THd0JK8SiYZIY20ZIPRHQW1+DEKm/Mv8b4j+BnmS6r1iFMghl5lVEpDoZiMllj+K4npPOZAfMI/Lz5pI7HbLZ14/KEU/xhvURqOURJ5zZL4f0OjAsSA7iVH3Nv9HEQ6EKMsir/FrVYeC+MhpCLg9fSwkOejLQ5rdcyyhTqo9OxXpJpnPrGJmwzyIWYaI2wQB/Nzmh6Ujt9dyF60PPf1ZNj1g3kQxFp1R+Mi6Jsc2mMIQmFTaziAscunw== 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=FO6KdqOxT/brmtlEAvxFpJl9z3U6T54m6PKsQCk63MA=; b=Aibh/8Ha4bfsv7mdgTyEfyxMX21SZdptbaGppoySGoG4DlpkSwSrUbS1We6KcLKl904kOIfs/j1FaAa4Y8/gJsCqe1HwBbNNXoCtxMoRSyUDNKO7MjA5aGX2+icO44Bd4UGqRmy8I2BIfwDlYLL5UPpHAvMt2Q9IcgV16Hu3T8aq0Y0Dxbqb10wdnLvHapBeyD02Lo/raJge8wngENT0C3xUSpmHvuDjfcjNg71DoeyH9Ma1fpQCQq66nSAM1heTee6kl/jOYL+ZyTtXlUDupXQsU3Lod/gR5aZTi9gIeucqDACQWe8ynp9Yq3bWau5ybTq3ekTA/YrO4Bhv+OpqNw== Received: from SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) by SY4PR01MB7201.ausprd01.prod.outlook.com (2603:10c6:10:146::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6340.30; Mon, 1 May 2023 11:33:55 +0000 Received: from SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5]) by SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5%2]) with mapi id 15.20.6340.030; Mon, 1 May 2023 11:33:55 +0000 From: miterv@outlook.com To: dev@openvswitch.org, i.maximets@ovn.org, simon.horman@corigine.com Date: Mon, 1 May 2023 19:33:38 +0800 Message-ID: X-Mailer: git-send-email 2.31.1 In-Reply-To: <0> References: <0> X-TMN: [2peMBHuiQtBmSEUGnK0xTQaHxVpg7Nd3] X-ClientProxiedBy: SG2PR02CA0126.apcprd02.prod.outlook.com (2603:1096:4:188::11) To SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) X-Microsoft-Original-Message-ID: <20230501113339.53702-2-miterv@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SY4PR01MB8438:EE_|SY4PR01MB7201:EE_ X-MS-Office365-Filtering-Correlation-Id: 5dae9397-633e-4067-bf00-08db4a37f220 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZOb8x/BoTl2wstHm7aLfbPlJdoYXuNlhf94OuMbQRIADthdY/hUBYlL01hsisCnSsNp6r3hQ7knoOL85QxKaQj6r9nvxY4puGOZifnWB/NIK6cdtD3oKZOLYWZbIi1qMLRdia+QWI+gJReBle264PxeG/rJDDigt02WQxmUZG3R+gh4DP7lP5bOVbKnK9r5kAtS08z5+KtxxiHy8AF/6Cg00QEkXDZlFPaKfFHSVcIYX+nYfh58BPbHALWGxNLSwqQFSJv8KNP1twFe1cg6raZAAL0cfazDs8Y3UMeJFiyecDt7t7ZazrnISHtUnfHOjc89R/yHmS+IiCod/NoIpCR4tdVVk1m1H90J9WHTe4wZmshO/82Ufeo4LR9IZYsR07iXrQiY2+e/aNP1XbO6WWJvJVbUUz8b+2F+0otFRRzw7LbbvuwuzB8pf/KnkuxVAeSf7Sbk+TbSlfWqs61MCY6CIx4CE598ldC/BLVpopU6CSU8Doj188vN1RAon1pcHlsZmHW2hh+i3+cfm3bnv2sIc1iRJ91ScdawDCHbNahYeHV4MqOFDbhZp+QDVpu87 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 41L5Rn3NYL5rvzkeeDVSqiStF5T3dLRQyX5sF99nUP//iwYuOFDkUUYVW0eDAkaeg+dXYNoO76bo0Ev9qut2lyVueFpopZyFhpk3HxzKhlMtDPEkCDACCQ0Jh0rm5EcDKaFiRtLzWRGGGocjA6T4oVOmm3Ql4aEot8zk8kXxBgFCYMwwzTwg+LpS426R29/sG5TjmnxQhMO/M/HTubX0a/iirI912Y8/OvyG4RuqtGKqOVjCx43jBkFiEZ17RXXLtYBPUK/OdkKxIKS1owYTccITA2WuCmhYD/v4DOWrusVhUJ5VxPkGQLTDSsXzU8PbQsdAyvnKpTeemKUPxW4RA0kGtZxCtNMcZHXzQEps1nO8U3z9HJuvSpspjaEsEzcuFFMeXYN5fGkG2I11+RV0/9d/LGVhuKk0vY1RVpghc4zPqnE4/T/ODp/jtJet0Fq0Cul7hLkSRrXOor6ktfYc6eEaoNAvmrKx5Ise0Qtai9dvXaM1fyHdZIBBYwnbUineCVZ12oLhBU0/CGYTtzDpt1WkuRiV1jhbHcsKFRypp5wVZWKkypxu1xLe5+BMylp4FehjeX3uCtmZJ95r/75QKFaopxLRHa/oSplGoaRgzOgr1xRLALZ8yPL64j7S+FIx3zsky6ABtWwVebU1BDyOk/HeFC2uoeCpSbJiZ/oJXYX0+U8f+A6OmTrtXnxwefVBpFbEVQ7tD4fJqEEPH1fPpuQ3kiLp+RJGjmmV1YsQTnL8d+ZngBA7kgviMxmsdMLYvbYC6BaEcH9C4JmM3cPcsVxefS0+qcKlJZjatALLSMkJL9SgbwqDiJGRpxqxH5YroflV2/uSfUtOwHJJroG4cOqIG72yqp2WAeZTaAaMLLoZlbNqWVyeO1GHIXF2rKCJqWvY7leCbkoSvOe+qT6nZymSQyXync4dko93Tpjqi3af4F39Ky3IOl2vgieYeaPJZvL6SadBLTDxb6mxs02Ewcf6k5Zjl7HMJLnKLePorVywaDixUcoA0PvxLd3rYPHX9QW5mRFkC7tYV9cq0OAIWV5SwilhfT0HZM+KGVG+DTptPzx0XE20oySdrgMtR6kj4wPrlyS4dsjwLYs8PG0/vjiykQ6+rCYX7ttJ7ydbEA9WN8/FXgCIEAgvsbUnhiIqGV8WALAJkDj1SBD5V9y8FaI/g77zbxNQ1e4gKU/icIJceo64KvM/Ru7eTxP4KpONBN74n8cZaD02o9AEepD5qw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5dae9397-633e-4067-bf00-08db4a37f220 X-MS-Exchange-CrossTenant-AuthSource: SY4PR01MB8438.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 May 2023 11:33:55.2724 (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: SY4PR01MB7201 Cc: Lin Huang Subject: [ovs-dev] [PATCH v3 1/2] netdev-dpdk: Add support for userspace port-based egress 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 egress 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 add new configuration option 'kpkts_rate' and 'kpkts_burst' for egress-policer QoS type which now supports setting packet-per-second limits in addition to the previously configurable byte rate settings. Examples: $ovs-vsctl set port vhost-user0 qos=@newqos -- --id=@newqos create qos type=egress-policer \ other-config:cir=123000 other-config:cbs=123000 other-config:kpkts_rate=123 other-config:kpkts_burst=123 Add some unit tests for egress packet-per-second policing. Signed-off-by: Lin Huang --- NEWS | 7 ++ lib/netdev-dpdk.c | 96 +++++++++++++++++++--- tests/system-dpdk.at | 186 ++++++++++++++++++++++++++++++++++++++++++- vswitchd/vswitch.xml | 10 +++ 4 files changed, 285 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index b6418c36e..c41c6adf6 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,13 @@ Post-v3.1.0 process extra privileges when mapping physical interconnect memory. - SRv6 Tunnel Protocol * Added support for userspace datapath (only). + - Userspace datapath: + * Added new configuration options 'kpkts_rate' and 'kpkts_burst' for + 'egress-policer' to support packet-per-second policing. + Examples: + ovs-vsctl set port vhost-user0 qos=@newqos -- \ + --id=@newqos create qos type=egress-policer \ + other-config:kpkts_rate=123 other-config:kpkts_burst=123 v3.1.0 - 16 Feb 2023 diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index fb0dd43f7..bcd13c116 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -59,6 +60,7 @@ #include "openvswitch/ofp-parse.h" #include "openvswitch/ofp-print.h" #include "openvswitch/shash.h" +#include "openvswitch/token-bucket.h" #include "openvswitch/vlog.h" #include "ovs-numa.h" #include "ovs-rcu.h" @@ -91,6 +93,8 @@ static bool per_port_memory = false; /* Status of per port memory support */ #define OVS_CACHE_LINE_SIZE CACHE_LINE_SIZE #define OVS_VPORT_DPDK "ovs_dpdk" +#define MAX_KPKTS_PARAMETER 4294967U /* UINT32_MAX / 1000 */ + /* * need to reserve tons of extra space in the mbufs so we can align the * DMA addresses to 4KB. @@ -400,6 +404,11 @@ struct dpdk_tx_queue { ); }; +enum policer_type { + POLICER_BPS = 1 << 0, /* Rate value in bytes/sec. */ + POLICER_PKTPS = 1 << 1, /* Rate value in packet/sec. */ +}; + struct ingress_policer { struct rte_meter_srtcm_params app_srtcm_params; struct rte_meter_srtcm in_policer; @@ -2335,6 +2344,22 @@ srtcm_policer_run_single_packet(struct rte_meter_srtcm *meter, return cnt; } +static int +pkts_policer_run_single_packet(struct token_bucket *tb, struct rte_mbuf **pkts, + int pkt_cnt, bool should_steal) +{ + int cnt = 0; + + if (token_bucket_withdraw(tb, pkt_cnt)) { + /* Handle packet by batch. */ + cnt = pkt_cnt; + } else if (should_steal) { + rte_pktmbuf_free_bulk(pkts, pkt_cnt); + } + + return cnt; +} + static int ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, int pkt_cnt, bool should_steal) @@ -4757,6 +4782,10 @@ netdev_dpdk_queue_dump_done(const struct netdev *netdev OVS_UNUSED, struct egress_policer { struct qos_conf qos_conf; + enum policer_type type; + uint32_t kpkts_rate; + uint32_t kpkts_burst; + struct token_bucket egress_tb; struct rte_meter_srtcm_params app_srtcm_params; struct rte_meter_srtcm egress_meter; struct rte_meter_srtcm_profile egress_prof; @@ -4776,26 +4805,53 @@ static int egress_policer_qos_construct(const struct smap *details, struct qos_conf **conf) { + uint32_t kpkts_burst, kpkts_rate; struct egress_policer *policer; int err = 0; - policer = xmalloc(sizeof *policer); + policer = xzalloc(sizeof *policer); + if (!policer) { + return ENOMEM; + } + qos_conf_init(&policer->qos_conf, &egress_policer_ops); egress_policer_details_to_param(details, &policer->app_srtcm_params); err = rte_meter_srtcm_profile_config(&policer->egress_prof, - &policer->app_srtcm_params); + &policer->app_srtcm_params); if (!err) { err = rte_meter_srtcm_config(&policer->egress_meter, - &policer->egress_prof); + &policer->egress_prof); + } + if (err) { + VLOG_ERR("Could not create rte meter for egress policer"); + err = -err; + } else { + policer->type |= POLICER_BPS; } - if (!err) { - *conf = &policer->qos_conf; + kpkts_rate = smap_get_uint(details, "kpkts_rate", 0); + kpkts_burst = smap_get_uint(details, "kpkts_burst", 0); + if (kpkts_rate > MAX_KPKTS_PARAMETER || kpkts_burst > MAX_KPKTS_PARAMETER + || kpkts_rate == 0 || kpkts_burst == 0) { + /* Paramters between (1 ~ MAX_KPKTS_PARAMETER). */ + err = EINVAL; + VLOG_ERR("Could not create tocken bucket for egress policer"); } else { - VLOG_ERR("Could not create rte meter for egress policer"); + /* Rate in kilo-packets/second, bucket 1000 packets. */ + /* msec * kilo-packets/sec = 1 packets. */ + token_bucket_set(&policer->egress_tb, kpkts_rate, kpkts_burst * 1000); + policer->kpkts_burst = kpkts_burst; + policer->kpkts_rate = kpkts_rate; + policer->type |= POLICER_PKTPS; + } + + if (!policer->type) { + /* both bps and kpkts contrsruct failed.*/ free(policer); *conf = NULL; - err = -err; + } else { + err = 0; + *conf = &policer->qos_conf; } return err; @@ -4817,6 +4873,8 @@ egress_policer_qos_get(const struct qos_conf *conf, struct smap *details) smap_add_format(details, "cir", "%"PRIu64, policer->app_srtcm_params.cir); smap_add_format(details, "cbs", "%"PRIu64, policer->app_srtcm_params.cbs); + smap_add_format(details, "kpkts_rate", "%"PRIu32, policer->kpkts_rate); + smap_add_format(details, "kpkts_burst", "%"PRIu32, policer->kpkts_burst); return 0; } @@ -4828,25 +4886,37 @@ egress_policer_qos_is_equal(const struct qos_conf *conf, struct egress_policer *policer = CONTAINER_OF(conf, struct egress_policer, qos_conf); struct rte_meter_srtcm_params params; + uint32_t kpkts_burst, kpkts_rate; egress_policer_details_to_param(details, ¶ms); - return !memcmp(¶ms, &policer->app_srtcm_params, sizeof params); + kpkts_rate = smap_get_uint(details, "kpkts_rate", 0); + kpkts_burst = smap_get_uint(details, "kpkts_burst", 0); + + return (!memcmp(¶ms, &policer->app_srtcm_params, sizeof params)) + && (policer->kpkts_rate == kpkts_rate + && policer->kpkts_burst == kpkts_burst); } static int egress_policer_run(struct qos_conf *conf, struct rte_mbuf **pkts, int pkt_cnt, bool should_steal) { - int cnt = 0; struct egress_policer *policer = CONTAINER_OF(conf, struct egress_policer, qos_conf); - cnt = srtcm_policer_run_single_packet(&policer->egress_meter, - &policer->egress_prof, pkts, - pkt_cnt, should_steal); + if (policer->type & POLICER_BPS) { + pkt_cnt = srtcm_policer_run_single_packet(&policer->egress_meter, + &policer->egress_prof, pkts, + pkt_cnt, should_steal); + } - return cnt; + if (policer->type & POLICER_PKTPS) { + pkt_cnt = pkts_policer_run_single_packet(&policer->egress_tb, pkts, + pkt_cnt, should_steal); + } + + return pkt_cnt; } static const struct dpdk_qos_ops egress_policer_ops = { diff --git a/tests/system-dpdk.at b/tests/system-dpdk.at index cb6c6d590..75a6ab7f5 100644 --- a/tests/system-dpdk.at +++ b/tests/system-dpdk.at @@ -453,7 +453,9 @@ AT_CHECK([grep -E 'QoS not configured on phy0' stdout], [], [stdout]) dnl Clean up AT_CHECK([ovs-vsctl del-port br10 phy0], [], [stdout], [stderr]) -OVS_VSWITCHD_STOP("[SYSTEM_DPDK_ALLOWED_LOGS]") +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create tocken bucket for egress policer@d +])") AT_CLEANUP dnl -------------------------------------------------------------------------- @@ -493,6 +495,7 @@ AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [std 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 tocken bucket for egress policer@d \@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d ])") AT_CLEANUP @@ -528,6 +531,7 @@ 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 \@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d \@Failed to set QoS type egress-policer on port dpdkvhostuserclient0: Invalid argument@d ])") AT_CLEANUP @@ -563,6 +567,7 @@ 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 \@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d \@Failed to set QoS type egress-policer on port dpdkvhostuserclient0: Invalid argument@d ])") AT_CLEANUP @@ -570,6 +575,185 @@ dnl -------------------------------------------------------------------------- +dnl -------------------------------------------------------------------------- +dnl QoS (kpkts) create delete vport port +AT_SETUP([OVS-DPDK - QoS (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 egress policer +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]) +OVS_WAIT_UNTIL([ovs-vsctl set port dpdkvhostuserclient0 qos=@newqos -- --id=@newqos create qos type=egress-policer other-config:kpkts_rate=123 other-config:kpkts_burst=456]) +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +sleep 2 + +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 Remove egress policer +AT_CHECK([ovs-vsctl destroy QoS dpdkvhostuserclient0 -- clear Port dpdkvhostuserclient0 qos]) + +dnl Check egress policer was removed correctly +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [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 +\@Failed to set QoS type egress-policer on port dpdkvhostuserclient0@d +\@Could not create rte meter for egress policer@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl QoS (kpkts) no rate +AT_SETUP([OVS-DPDK - QoS (kpkts) no rate]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add egress policer +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]) +OVS_WAIT_UNTIL([ovs-vsctl set port dpdkvhostuserclient0 qos=@newqos -- --id=@newqos create qos type=egress-policer other-config:kpkts_burst=123]) +sleep 2 + +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 Check egress policer was not created +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [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 +\@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d +\@Failed to set QoS type egress-policer on port dpdkvhostuserclient0@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl QoS (kpkts) no burst +AT_SETUP([OVS-DPDK - QoS (kpkts) no burst]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add egress policer +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]) +OVS_WAIT_UNTIL([ovs-vsctl set port dpdkvhostuserclient0 qos=@newqos -- --id=@newqos create qos type=egress-policer other-config:kpkts_rate=123]) +sleep 2 + +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 Check egress policer was not created +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [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 +\@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d +\@Failed to set QoS type egress-policer on port dpdkvhostuserclient0@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + + +dnl -------------------------------------------------------------------------- +dnl QoS (kpkts) max rate +AT_SETUP([OVS-DPDK - QoS (kpkts) max rate]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add egress policer +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]) +OVS_WAIT_UNTIL([ovs-vsctl set port dpdkvhostuserclient0 qos=@newqos -- --id=@newqos create qos type=egress-policer other-config:kpkts_rate=42949671]) +sleep 2 + +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 Check egress policer was not created +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [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 +\@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d +\@Failed to set QoS type egress-policer on port dpdkvhostuserclient0@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- + + +dnl -------------------------------------------------------------------------- +dnl QoS (kpkts) max burst +AT_SETUP([OVS-DPDK - QoS (kpkts) max burst]) +AT_KEYWORDS([dpdk]) + +OVS_DPDK_PRE_CHECK() +OVS_DPDK_START() + +dnl Add userspace bridge and attach it to OVS and add egress policer +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]) +OVS_WAIT_UNTIL([ovs-vsctl set port dpdkvhostuserclient0 qos=@newqos -- --id=@newqos create qos type=egress-policer other-config:kpkts_burst=42949671]) +sleep 2 + +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 Check egress policer was not created +AT_CHECK([ovs-appctl -t ovs-vswitchd qos/show dpdkvhostuserclient0], [], [stdout]) +AT_CHECK([grep -E 'QoS not configured on dpdkvhostuserclient0' stdout], [], [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 +\@Could not create rte meter for egress policer@d +\@Could not create tocken bucket for egress policer@d +\@Failed to set QoS type egress-policer on port dpdkvhostuserclient0@d +])") +AT_CLEANUP +dnl -------------------------------------------------------------------------- dnl -------------------------------------------------------------------------- dnl MTU increase phy port diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index edb5eafa0..252e9e324 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -4894,6 +4894,16 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \ bytes/tokens of the packet. If there are not enough tokens in the cbs bucket the packet might be dropped. + + The Packets Per Second (PPS) represents the packet per second rate at + which the token bucket will be updated. + + + The Packets Per Second Burst Size is measured in count and represents a + token bucket. + From patchwork Mon May 1 11:33:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: miter X-Patchwork-Id: 1775470 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::137; helo=smtp4.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=ekvUStm7; dkim-atps=neutral Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (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 4Q91MC497Gz1ymp for ; Mon, 1 May 2023 21:34:15 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 45DF5417CD; Mon, 1 May 2023 11:34:13 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 45DF5417CD Authentication-Results: smtp4.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=ekvUStm7 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yePvjyrVInFp; Mon, 1 May 2023 11:34:10 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id 2851B409F2; Mon, 1 May 2023 11:34:07 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 2851B409F2 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0012DC0098; Mon, 1 May 2023 11:34:04 +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 552A4C0091 for ; Mon, 1 May 2023 11:34:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 1656681340 for ; Mon, 1 May 2023 11:34:02 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 1656681340 Authentication-Results: smtp1.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=ekvUStm7 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 tv1eQxXME--Q for ; Mon, 1 May 2023 11:34:00 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 9B95781343 Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2082e.outbound.protection.outlook.com [IPv6:2a01:111:f403:7004::82e]) by smtp1.osuosl.org (Postfix) with ESMTPS id 9B95781343 for ; Mon, 1 May 2023 11:34:00 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NCf3MkFyNESwENwPMPpz9CXTB0Nt4cokmncTjt3cl0OjIxjMoLALrfK407shjVcczWjhhI7U9Qs17eQG5VMCN4VNDjLzqBjsVJH8nDAR0/YXXPQ+9/zVsfOptfWvK6PLz3hBtX9YQTYaFd4b6oS0rJhyA+W67BUTn+9cctbYs6gYI72+MkAl8MBIcRO/PKXDimTh9G1pEK3gVv/wOh3EEOwWGbGxX0L1b4h6GpMCsNdoLoEltvYP/sB0dvDEwAtVTAgi8G0z+Ge73ctx1pcFKF54s1Ied/6FVxYl/lKRz+rwILanqxsgin1AxsIm6sSfCOPJOaaOmaXS3ofLXnVwJQ== 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=iHVfxtnG1KXphxQ+32Duani7f1uBKKc/C7ePfY6TlrA=; b=kBvVm027Kp9yZaIg0P5sTsqRzMZN6ogfNYwhkPSq3xEz6ivbRhqoROLMiPbyTzbnjdSoFBuJr8DtQlAm1WI/x4854XwKNBrDeoCFOWrPnOcFQ5MnlaMzS5FUcxXJSaoKCU/IrEfVbsOoHKWNdMMb09lyrhDxlOvr4Zx9FPTBWhadIGJD/8h1LmBhoFvl0ZOJfv5UkT5iUGIf4PLFuAedXp7tX0O29uXP0K2QmMMFs5K94p0dxpzmNp3GjTtT8Cm2quEXeOg4v5wPtKDDp8MTTAeRkznLx70imofr7nv0SaSOl3x6JoKIjFbTyxJ4UoHG8HukdlXmB5Z8EocUb5hwhA== 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=iHVfxtnG1KXphxQ+32Duani7f1uBKKc/C7ePfY6TlrA=; b=ekvUStm78zuF85crfCMZZP6t7/fSJUsbZ2GiXxW+L34SpsrP+5rIStnVlhy+g35yDR4zGwb+vWHAOtVAhAl9rQp6lqtXkMwZJ/2draNlcFxSP0TQ8l9zNcZgsPpn7o1yWdrIWlHSNhO40DZXCfU91FcvNYRYoejL1l1wDkPYBFcSrMft110wolrZyULxgBcUJQAITfKrFsHYqBjoJ1BbJ511r8yrkYZsmDhYrQsgy9VkLdUly7Qe8/8bGD/AMK+POLuijNAAKrLMm7fqiuzHmxh6mfNdCeU4VlndDWrTdkh1Ll1aBcHyzxqqdnqWsmgcV1p+MznURx53xMyVMS90cw== Received: from SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) by SY4PR01MB7201.ausprd01.prod.outlook.com (2603:10c6:10:146::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6340.30; Mon, 1 May 2023 11:33:57 +0000 Received: from SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5]) by SY4PR01MB8438.ausprd01.prod.outlook.com ([fe80::4790:4ece:97e0:4db5%2]) with mapi id 15.20.6340.030; Mon, 1 May 2023 11:33:57 +0000 From: miterv@outlook.com To: dev@openvswitch.org, i.maximets@ovn.org, simon.horman@corigine.com Date: Mon, 1 May 2023 19:33:39 +0800 Message-ID: X-Mailer: git-send-email 2.31.1 In-Reply-To: <0> References: <0> X-TMN: [sc+/6c3NXB6HXSG508IZ0He5xvCEe8S2] X-ClientProxiedBy: SG2PR02CA0126.apcprd02.prod.outlook.com (2603:1096:4:188::11) To SY4PR01MB8438.ausprd01.prod.outlook.com (2603:10c6:10:19e::10) X-Microsoft-Original-Message-ID: <20230501113339.53702-3-miterv@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SY4PR01MB8438:EE_|SY4PR01MB7201:EE_ X-MS-Office365-Filtering-Correlation-Id: 926933cb-a4ff-4ffd-f475-08db4a37f345 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DwNBE1tE7r9A3aEyROKXPyhQ8LLPvnSTPrIvWkRVcZ4BRLwGD41F1NyA3oJIQ3UxzFCtUtOGrczP52tJyFak6OHvcGQUHdyLND8lFJUOetZaLG7SLr06I66PoM3fZEgiAN35gtm0fxYt2+HdUN1Zaeex/0mhzESWj5ga3DQmjhMr1ctU1nc4oSSOZ+wfkDb6gWTZBVH231xxUoH/EuDNiCn9EIvzGXUC4RxRWpdCWoFcNdDFTOJ1bUqbFg8ScmSaW0cSgS49M1cphKuemnBRDCsxVxQMWWZ4Z/apE3BezrYjCXia/KOv2FKFfCO14exrtg1wmOwBGY57G+YwBBVzl/VzkSl3eA5xv6GVD05+AbOJ7ZZpkmcx71DCfABRosv3tOHtPxb2y7hHa8hVh+XojqdSu5RS80+j2qpzR9JgJ9vLhE4LfaPno0Ts6xw0P2/cjSLlWiJHsE8l1LRlfV83v8nQkCp65xBPsFk7mf08nix5cfsN3FaUhNjYYeAk0uWbEQ1aqZOBgQbxgkcRrdqiKP5ew1bZExm86/3pujgc61uRXgFN4zQCOO2xT/oUm9N+ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: v1fhtOcPhRZftchBCBgeXkJwNGjk83HTM6CNWS3Yp5Idh9Mj4FNK6po3fb2rK2L7+nWtfqmhyxRKdMqERoHaDJ2fvLXxfTxyc5CaC0ZssFARmcD23Y9+ryfaYEMxVE3ulOOct2pAj/yClwcmXMC6keuoWIM83qpUWtvWMk17j3x8SOam80uVrDqpJcRyMJhTA/fpuEnvnXGgMxltC5wssf04Vcd0JJIiqCS1rQE6Li8ppZIY/QXo2Qmm/Vm76+BccPN87NrRMTOWFCJgpXJ/9KCY/wcgTP5RzunZ8Ve/Mb9KDDN+54cEIVCuvFY98/FJQhucPldax56REKCfzo4wlBDRl4BNH3FhesmtFSAO6q4LHtjkatvhQPMqLQ8GE35/5oZz85n0KYiIan6QXLcKO48CB/z0skIyAPTgLpjZav6n0+niZEcFnwttG6p7SEdTUsROxGjEh6R9P61ebGDPvj50LXhRL6NBO6G8KiXC4+EZkBLHWdfM9ip1gpiQgHKYA+gb+tZXyfP65SFltc8K6jODFTVAsrnRJ0donStKX/tsFb3IRmgIDTykIMOMEScq5UwIcMGf6jkvPqCzoM3ncFCqHimR8ssSRgYeafLeelft98S4AHQLLWQZHxj90dFOnAD/H1eRPYwjU9lhfUSa6MDqc3zUynBmE4k7AMpEg14ATJXAZrDU1mmvr275FQcwcMXLiJo0RIpX/W2BwKHfptyt5kXD6bS6JWqIa9Icgiov0CFqIaIKywPPxAs7L9DctRf6IUyKvUSfWoHI7MjR8f4hb2kK7KIzcoxuoE7iph5zYvr3EPNTDGt3cvv3qDHUe27c6XlpRVCCBp0tEy8fCJgCCqFWh55Uu61esdolEYK8eIijyZjaXsl3atoXisdkDm1IcYABO10+ngDco7/sPX5Kw4UVXxLlIRSez24NkY5SFxejq8qFZeJ0PVJLM67nPLKS1C/qX1cc2rUYvqIXXnpSp24+kVvzE9Q52nB85rgLIGxJUQ3rhY6uaPLNct0eOwOSjBMKEzncfVGEaPoYbfKNrPqOXjsBOlHarqSJ+ZSUdDdE4CAz1pxidgp+wutryfF24XVLnpW7O5EUgYYjfButvQQu80XM7PK0AgsfafYsVg09vCqiy6S44OabOC0RaOW/XDlkBuTPH0gh2nS4GmlBG/KN1BeosbZp8776lzMeVZ5wp2vjcbKyaTJo76/URbtva835idAAqms8B8fpVQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 926933cb-a4ff-4ffd-f475-08db4a37f345 X-MS-Exchange-CrossTenant-AuthSource: SY4PR01MB8438.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 May 2023 11:33:57.0460 (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: SY4PR01MB7201 Cc: Lin Huang Subject: [ovs-dev] [PATCH v3 2/2] netdev-dpdk: Add support for userspace port-based 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 --- NEWS | 4 + lib/netdev-dpdk.c | 78 +++++++++++++--- tests/system-dpdk.at | 216 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 285 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index c41c6adf6..53adbed82 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,10 @@ Post-v3.1.0 ovs-vsctl set port vhost-user0 qos=@newqos -- \ --id=@newqos create qos type=egress-policer \ other-config:kpkts_rate=123 other-config:kpkts_burst=123 + * Added support for ingress packet-per-second policing. + Examples: + $ ovs-vsctl set interface dpdk0 ingress_policing_kpkts_rate=123 + $ ovs-vsctl set interface dpdk0 ingress_policing_kpkts_burst=123 v3.1.0 - 16 Feb 2023 diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index bcd13c116..a717edc5e 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; @@ -2367,9 +2374,16 @@ ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, 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) { + cnt = srtcm_policer_run_single_packet(&policer->in_policer, + &policer->in_prof, + pkts, pkt_cnt, should_steal); + } + + if (policer->type & POLICER_PKTPS) { + cnt = pkts_policer_run_single_packet(&policer->tb, pkts, pkt_cnt, + should_steal); + } rte_spinlock_unlock(&policer->policer_lock); return cnt; @@ -3531,7 +3545,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; @@ -3539,6 +3554,9 @@ netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst) int err = 0; policer = xmalloc(sizeof *policer); + if (!policer) { + return NULL; + } rte_spinlock_init(&policer->policer_lock); /* rte_meter requires bytes so convert kbits rate and burst to bytes. */ @@ -3556,8 +3574,29 @@ netdev_dpdk_policer_construct(uint32_t rate, uint32_t burst) } if (err) { VLOG_ERR("Could not create rte meter for ingress policer"); + } else { + policer->type |= POLICER_BPS; + } + + if (kpkts_rate > MAX_KPKTS_PARAMETER || kpkts_burst > MAX_KPKTS_PARAMETER + || kpkts_rate == 0 || kpkts_burst == 0) { + /* Paramters between (1 ~ MAX_KPKTS_PARAMETER). */ + /* Zero means not to police the flow. */ + VLOG_ERR("Could not create tocken bucket for ingress policer"); + } else { + /* + * By default token is added per millisecond. + * Rate in kilo-packets/second, bucket 1000 packets. + * msec * kilo-packets/sec = 1 packets. + */ + token_bucket_init(&policer->tb, kpkts_rate, kpkts_burst * 1000); + policer->type |= POLICER_PKTPS; + } + + if (!policer->type) { + /* Neither kbps nor kpkts policer is configured. */ free(policer); - return NULL; + policer = NULL; } return policer; @@ -3566,8 +3605,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; @@ -3580,13 +3619,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; @@ -3597,14 +3646,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 75a6ab7f5..492bc2f55 100644 --- a/tests/system-dpdk.at +++ b/tests/system-dpdk.at @@ -297,7 +297,9 @@ AT_CHECK([grep -E 'ingress_policing_rate: 0' stdout], [], [stdout]) dnl Clean up AT_CHECK([ovs-vsctl del-port br10 phy0], [], [stdout], [stderr]) -OVS_VSWITCHD_STOP("[SYSTEM_DPDK_ALLOWED_LOGS]") +OVS_VSWITCHD_STOP("m4_join([], [SYSTEM_DPDK_ALLOWED_LOGS], [ +\@Could not create tocken bucket for ingress policer@d +])") AT_CLEANUP dnl -------------------------------------------------------------------------- @@ -339,6 +341,7 @@ AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ov 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 tocken bucket for ingress policer@d \@VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) failed to connect: No such file or directory@d ])") AT_CLEANUP @@ -420,12 +423,223 @@ AT_CHECK([grep "VHOST_CONFIG: ($OVS_RUNDIR/dpdkvhostclient0) reconnecting..." ov 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 tocken bucket 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) 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-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 tocken 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-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 tocken 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-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 tocken 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-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 not be created +AT_CHECK([grep "Could not create tocken 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: 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 tocken 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-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 tocken 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 tocken 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])