Message ID | SY4PR01MB843809BE1B6A92B7D432A9C6CD5EA@SY4PR01MB8438.ausprd01.prod.outlook.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [ovs-dev,v1] dpif-netdev: Update meter timestamp when dp_netdev_run_meter been called. | expand |
On 6/18/23 15:58, miterv@outlook.com wrote: > From: Lin Huang <linhuang@ruijie.com.cn> > > 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 <linhuang@ruijie.com.cn> > --- > Documentation/topics/dpdk/qos.rst | 14 +- > NEWS | 2 + > lib/netdev-dpdk.c | 77 +++++++++-- > tests/system-dpdk.at | 218 ++++++++++++++++++++++++++++++ > 4 files changed, 293 insertions(+), 18 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 <vhost-user>` 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 <vhost-user>` 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..cf4ae1b13 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 ee5d557b0..9a4543b0e 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; > @@ -2418,14 +2425,27 @@ ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, > int pkt_cnt, bool should_steal) > { > int cnt = 0; > + int bps_drop = 0; > + int pps_drop = 0; Please, re-order these in a reverse x-mass tree style. i.e. longer lines first. > > rte_spinlock_lock(&policer->policer_lock); > - cnt = srtcm_policer_run_single_packet(&policer->in_policer, > - &policer->in_prof, > - pkts, pkt_cnt); > + if (policer->type & POLICER_BPS) { > + bps_drop = srtcm_policer_run_single_packet(&policer->in_policer, > + &policer->in_prof, > + pkts, pkt_cnt); > + } > + > + if (policer->type & POLICER_PKTPS) { > + pps_drop = pkts_policer_run_single_packet(&policer->tb, pkts, pkt_cnt); > + } > rte_spinlock_unlock(&policer->policer_lock); > > - return cnt; > + cnt = MAX(bps_drop, pps_drop); > + if (should_steal && cnt) { > + rte_pktmbuf_free_bulk(&pkts[pkt_cnt - cnt], cnt); > + } The actual packet freeing should be moved to patch #2 to avoid leaks if only patch #2 is applied. > + > + return pkt_cnt - cnt; > } > > static bool > @@ -3584,7 +3604,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; > @@ -3608,9 +3629,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. */ Same here, we should probbaly add a message at the VLOG_ERR level here. > free(policer); > - return NULL; > + policer = NULL; > } > > return policer; > @@ -3619,8 +3653,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; > @@ -3633,13 +3667,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; > @@ -3650,14 +3694,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. */ s/both/Both/ > 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 233f7e493..1a3215801 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([--no-pci]) > > 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([--no-pci]) > > 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([--no-pci]) > > 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 -------------------------------------------------------------------------- > + > +
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 <vhost-user>` 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 <vhost-user>` 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..cf4ae1b13 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 ee5d557b0..9a4543b0e 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; @@ -2418,14 +2425,27 @@ ingress_policer_run(struct ingress_policer *policer, struct rte_mbuf **pkts, int pkt_cnt, bool should_steal) { int cnt = 0; + int bps_drop = 0; + int pps_drop = 0; rte_spinlock_lock(&policer->policer_lock); - cnt = srtcm_policer_run_single_packet(&policer->in_policer, - &policer->in_prof, - pkts, pkt_cnt); + if (policer->type & POLICER_BPS) { + bps_drop = srtcm_policer_run_single_packet(&policer->in_policer, + &policer->in_prof, + pkts, pkt_cnt); + } + + if (policer->type & POLICER_PKTPS) { + pps_drop = pkts_policer_run_single_packet(&policer->tb, pkts, pkt_cnt); + } rte_spinlock_unlock(&policer->policer_lock); - return cnt; + cnt = MAX(bps_drop, pps_drop); + if (should_steal && cnt) { + rte_pktmbuf_free_bulk(&pkts[pkt_cnt - cnt], cnt); + } + + return pkt_cnt - cnt; } static bool @@ -3584,7 +3604,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; @@ -3608,9 +3629,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; @@ -3619,8 +3653,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; @@ -3633,13 +3667,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; @@ -3650,14 +3694,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 233f7e493..1a3215801 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([--no-pci]) 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([--no-pci]) 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([--no-pci]) 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 -------------------------------------------------------------------------- + +