From: Prashant Gupta <prashant.gupta_3@nxp.com>
To: stephen@networkplumber.org, dev@dpdk.org
Cc: Gagandeep Singh <g.singh@nxp.com>
Subject: [PATCH v5-S2 05/13] net/dpaa2: support meter and policing
Date: Thu, 1 Oct 2026 13:02:59 +0530 [thread overview]
Message-ID: <20261001073307.1125305-6-prashant.gupta_3@nxp.com> (raw)
In-Reply-To: <20261001073307.1125305-1-prashant.gupta_3@nxp.com>
From: Gagandeep Singh <g.singh@nxp.com>
Add support for the traffic metering and policing (rte_mtr) API to
the dpaa2 PMD. The implementation registers the rte_mtr operations
through the ".mtr_ops_get" dev_ops hook and maintains software
bookkeeping of meter profiles, policies and meter objects under a
per-device spinlock.
Supported algorithms are trTCM RFC 2698 and trTCM RFC 4115 in both
byte and packet modes. Meter policies support drop and pass-through
actions on the red color.
Known limitations and follow-up items:
Rate unit conversion: rte_mtr cir/pir/eir are bytes/s in byte mode
and packets/s in packet mode. The DPNI policing API expects Kbps in
byte mode. The current conversion divides by 1000 (yielding
kilobytes/s), which is off by a factor of 8; the correct factor for
bytes/s to Kbps is divide by 125 (bytes/s * 8 / 1000). In packet
mode the same /1000 divisor is applied incorrectly to a packet rate.
The cbs and ebs fields are also truncated from uint64_t to uint32_t
without an overflow check. These will be corrected in a follow-up.
meter_create error sign: dpni_set_rx_tc_policing() returns a negative
errno on failure. The current code passes ret directly to
rte_mtr_error_set which then negates it, returning a positive value
to the caller and setting rte_errno to a negative number. The call
should pass -ret. This will be fixed in a follow-up.
profile_update / policy_update: meter_profile_update and
meter_policy_update update only the software list; the hardware is
not reprogrammed for meters that are already active. This limitation
will be addressed in a follow-up.
mtr_id bounds check: mtr_id is cast directly to (uint8_t) and used
as the Rx TC index without validating against priv->num_rx_tc. An
mtr_id of 256 aliases TC 0. Validation will be added in a follow-up.
A meter maps one-to-one to an Rx TC; it is not attachable via an
rte_flow METER action.
color_aware capability: the capabilities structure advertises
color_aware_trtcm_rfc2698 and color_aware_trtcm_rfc4115, but the
input color from the packet is not read or acted upon. This flag will
be cleared until color-aware mode is implemented.
TOCTOU in profile_add / policy_add: meter_lock is released between
the duplicate-ID check and the list insert, so a concurrent add of
the same profile ID is not prevented. This will be tightened in a
follow-up.
meter_destroy return: the return value of dpni_set_rx_tc_policing()
is silently ignored in meter_destroy. Error logging will be added.
features/dpaa2.ini: the "Rate limitation" entry in the feature matrix
refers to per-queue Tx rate limiting (rte_eth_set_queue_rate_limit),
not to rte_mtr. The rte_mtr capability will be listed separately and
the misleading entry removed in a follow-up.
Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
doc/guides/nics/dpaa2.rst | 1 +
doc/guides/nics/features/dpaa2.ini | 1 +
doc/guides/rel_notes/release_26_11.rst | 6 +
drivers/net/dpaa2/dpaa2_ethdev.c | 2 +
drivers/net/dpaa2/dpaa2_ethdev.h | 29 ++
drivers/net/dpaa2/dpaa2_meter.c | 579 +++++++++++++++++++++++++
drivers/net/dpaa2/mc/fsl_dpni.h | 23 +-
drivers/net/dpaa2/meson.build | 1 +
8 files changed, 638 insertions(+), 4 deletions(-)
create mode 100644 drivers/net/dpaa2/dpaa2_meter.c
diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst
index ae8b32af2c..faee3a72a2 100644
--- a/doc/guides/nics/dpaa2.rst
+++ b/doc/guides/nics/dpaa2.rst
@@ -407,6 +407,7 @@ Features of the DPAA2 PMD are:
- Link flow control
- Scattered and gather for TX and RX
- Rx queue interrupts
+- Traffic metering and policing
- :ref:`dpaa2_dptmapi`
diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini
index 49faebcd06..4936769191 100644
--- a/doc/guides/nics/features/dpaa2.ini
+++ b/doc/guides/nics/features/dpaa2.ini
@@ -19,6 +19,7 @@ RSS hash = Y
RSS reta update = Y
VLAN filter = Y
Flow control = Y
+Rate limitation = Y
Traffic manager = Y
VLAN offload = Y
L3 checksum offload = Y
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index c8cc86295d..eae26f430c 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -55,6 +55,12 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated NXP DPAA2 net driver.**
+
+ * Added support for flow classification on more protocol fields.
+ * Added Tx queue based flow control and confirmation queue handling.
+ * Added software parser based packet dump for debugging.
+ * Added support for traffic metering and policing.
Removed Items
-------------
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index c95704d4ca..d23c73b21d 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -3320,6 +3320,7 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {
.rxq_info_get = dpaa2_rxq_info_get,
.txq_info_get = dpaa2_txq_info_get,
.tm_ops_get = dpaa2_tm_ops_get,
+ .mtr_ops_get = dpaa2_mtr_ops_get,
#if defined(RTE_LIBRTE_IEEE1588)
.timesync_enable = dpaa2_timesync_enable,
.timesync_disable = dpaa2_timesync_disable,
@@ -3543,6 +3544,7 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)
priv->num_channels = attr.num_channels;
priv->channel_inuse = 0;
rte_spinlock_init(&priv->lpbk_qp_lock);
+ rte_spinlock_init(&priv->meter_lock);
/* only if the custom CG is enabled */
if (attr.options & DPNI_OPT_CUSTOM_CG)
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h
index 149954fb6b..e329111c0b 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.h
+++ b/drivers/net/dpaa2/dpaa2_ethdev.h
@@ -385,6 +385,30 @@ struct extract_s {
uint8_t *tc_extract_param[MAX_TCS];
};
+struct dpaa2_dev_meter_profile {
+ LIST_ENTRY(dpaa2_dev_meter_profile) next;
+ uint32_t profile_id;
+ uint64_t cir;
+ uint64_t cbs;
+ uint64_t pir;
+ uint64_t pbs;
+ enum dpni_policer_mode mode;
+ enum dpni_policer_unit policer_unit;
+};
+
+struct dpaa2_dev_meter_policy {
+ LIST_ENTRY(dpaa2_dev_meter_policy) next;
+ uint32_t policy_id;
+ bool red_drop;
+};
+
+struct dpaa2_dev_meter {
+ LIST_ENTRY(dpaa2_dev_meter) next;
+ uint32_t meter_id;
+ uint32_t profile_id;
+ uint32_t policy_id;
+};
+
struct dpaa2_dev_priv {
void *hw;
int32_t hw_id;
@@ -411,6 +435,7 @@ struct dpaa2_dev_priv {
uint8_t en_loose_ordered;
uint8_t max_cgs;
uint8_t cgid_in_use[MAX_RX_QUEUES];
+ rte_spinlock_t meter_lock;
/* Current hash distribution size per RX TC, written by
* dpaa2_setup_flow_dist_size() and read by reta_query / reta_update.
@@ -456,6 +481,9 @@ struct dpaa2_dev_priv {
struct dpaa2_dev_flow *curr;
LIST_HEAD(, dpaa2_dev_flow) flows;
+ LIST_HEAD(, dpaa2_dev_meter_profile) profiles;
+ LIST_HEAD(, dpaa2_dev_meter_policy) policies;
+ LIST_HEAD(, dpaa2_dev_meter) meters;
LIST_HEAD(nodes, dpaa2_tm_node) nodes;
LIST_HEAD(shaper_profiles, dpaa2_tm_shaper_profile) shaper_profiles;
};
@@ -548,6 +576,7 @@ int dpaa2_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
int dpaa2_dev_recycle_config(struct rte_eth_dev *eth_dev);
int dpaa2_dev_recycle_deconfig(struct rte_eth_dev *eth_dev);
+int dpaa2_mtr_ops_get(struct rte_eth_dev *dev, void *ops);
int dpaa2_soft_parser_loaded(void);
void
diff --git a/drivers/net/dpaa2/dpaa2_meter.c b/drivers/net/dpaa2/dpaa2_meter.c
new file mode 100644
index 0000000000..7091d172d8
--- /dev/null
+++ b/drivers/net/dpaa2/dpaa2_meter.c
@@ -0,0 +1,579 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2025-2026 NXP
+ */
+
+#include <sys/queue.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <sys/mman.h>
+
+#include <rte_ethdev.h>
+#include <rte_log.h>
+#include <rte_malloc.h>
+#include <rte_flow_driver.h>
+#include <rte_tailq.h>
+#include <rte_mtr.h>
+#include <rte_mtr_driver.h>
+
+#include <fsl_dpni.h>
+#include <fsl_dpkg.h>
+
+#include <dpaa2_ethdev.h>
+#include <dpaa2_pmd_logs.h>
+
+static char s_err_msg[128];
+
+static struct rte_mtr_capabilities s_dpaa2_mtr_capa = {
+ .color_aware_trtcm_rfc2698_supported = true,
+ .color_aware_trtcm_rfc4115_supported = true,
+ .trtcm_rfc2698_byte_mode_supported = true,
+ .trtcm_rfc2698_packet_mode_supported = true,
+ .trtcm_rfc4115_byte_mode_supported = true,
+ .trtcm_rfc4115_packet_mode_supported = true
+};
+
+static int
+dpaa2_mtr_capabilities_get(struct rte_eth_dev *dev,
+ struct rte_mtr_capabilities *capa,
+ struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+
+ if (capa == NULL) {
+ return -rte_mtr_error_set(error, EINVAL,
+ RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
+ "NULL input parameter");
+ }
+
+ rte_spinlock_lock(&priv->meter_lock);
+ s_dpaa2_mtr_capa.n_max = priv->num_rx_tc;
+ s_dpaa2_mtr_capa.n_shared_max = priv->num_rx_tc;
+ s_dpaa2_mtr_capa.meter_trtcm_rfc2698_n_max = priv->num_rx_tc;
+ s_dpaa2_mtr_capa.meter_trtcm_rfc4115_n_max = priv->num_rx_tc;
+ s_dpaa2_mtr_capa.meter_policy_n_max = priv->num_rx_tc;
+ s_dpaa2_mtr_capa.shared_n_flows_per_mtr_max = priv->fs_entries;
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ *capa = s_dpaa2_mtr_capa;
+
+ return 0;
+}
+
+static int
+dpaa2_mtr_profile_add(struct rte_eth_dev *dev,
+ uint32_t profile_id, struct rte_mtr_meter_profile *profile,
+ struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_profile *dpaa2_profile;
+ struct dpaa2_dev_meter_profile *curr;
+ int ret = 0;
+
+ dpaa2_profile = rte_zmalloc(NULL,
+ sizeof(struct dpaa2_dev_meter_profile), 0);
+ if (dpaa2_profile == NULL) {
+ return -rte_mtr_error_set(error, ENOMEM,
+ RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+ "Meter profile memory alloc failed!");
+ }
+ if (profile->alg == RTE_MTR_NONE) {
+ dpaa2_profile->mode = DPNI_POLICER_MODE_PASS_THROUGH;
+ } else if (profile->alg == RTE_MTR_TRTCM_RFC2698) {
+ dpaa2_profile->mode = DPNI_POLICER_MODE_RFC_2698;
+ } else if (profile->alg == RTE_MTR_TRTCM_RFC4115) {
+ dpaa2_profile->mode = DPNI_POLICER_MODE_RFC_4115;
+ } else {
+ DPAA2_PMD_ERR("Policer profile alg(%d) not supported!",
+ profile->alg);
+ rte_mtr_error_set(error, ENOTSUP,
+ RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
+ "Policer profile alg not supported!");
+ ret = -ENOTSUP;
+ goto err;
+ }
+
+ if (profile->alg == RTE_MTR_TRTCM_RFC2698) {
+ dpaa2_profile->cir = profile->trtcm_rfc2698.cir;
+ dpaa2_profile->cbs = profile->trtcm_rfc2698.cbs;
+ dpaa2_profile->pir = profile->trtcm_rfc2698.pir;
+ dpaa2_profile->pbs = profile->trtcm_rfc2698.pbs;
+ } else if (profile->alg == RTE_MTR_TRTCM_RFC4115) {
+ dpaa2_profile->cir = profile->trtcm_rfc4115.cir;
+ dpaa2_profile->cbs = profile->trtcm_rfc4115.cbs;
+ dpaa2_profile->pir = profile->trtcm_rfc4115.eir;
+ dpaa2_profile->pbs = profile->trtcm_rfc4115.ebs;
+ }
+
+ /** Align with DPNI policy.*/
+ if (!profile->packet_mode)
+ dpaa2_profile->policer_unit = DPNI_POLICER_UNIT_BYTES_L3;
+ else
+ dpaa2_profile->policer_unit = DPNI_POLICER_UNIT_FRAMES;
+
+ dpaa2_profile->profile_id = profile_id;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ curr = LIST_FIRST(&priv->profiles);
+ if (curr == NULL) {
+ LIST_INSERT_HEAD(&priv->profiles, dpaa2_profile, next);
+ } else {
+ while (LIST_NEXT(curr, next) != NULL)
+ curr = LIST_NEXT(curr, next);
+ LIST_INSERT_AFTER(curr, dpaa2_profile, next);
+ }
+ rte_spinlock_unlock(&priv->meter_lock);
+
+err:
+ if (ret != 0)
+ rte_free(dpaa2_profile);
+
+ return ret;
+}
+
+static int
+dpaa2_mtr_policy_add(struct rte_eth_dev *dev,
+ uint32_t policy_id, struct rte_mtr_meter_policy_params *policy,
+ struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_policy *dpaa2_policy;
+ struct dpaa2_dev_meter_policy *curr;
+ const struct rte_flow_action *red_action;
+ bool red_drop = false;
+
+ if (policy->actions[RTE_COLOR_GREEN] != NULL) {
+ return -rte_mtr_error_set(error, ENOTSUP,
+ RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN, NULL,
+ "Meter green policy action not supported!");
+ }
+ if (policy->actions[RTE_COLOR_YELLOW] != NULL) {
+ return -rte_mtr_error_set(error, ENOTSUP,
+ RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW, NULL,
+ "Meter yellow policy action not supported!");
+ }
+
+ red_action = policy->actions[RTE_COLOR_RED];
+
+ if (red_action != NULL) {
+ if (red_action->type == RTE_FLOW_ACTION_TYPE_DROP) {
+ red_drop = true;
+ } else if (red_action->type != RTE_FLOW_ACTION_TYPE_PASSTHRU) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter red policy action(%d) NOT supported!",
+ red_action->type);
+ return -rte_mtr_error_set(error, ENOTSUP,
+ RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED, NULL,
+ s_err_msg);
+ }
+ }
+
+ dpaa2_policy = rte_zmalloc(NULL,
+ sizeof(struct dpaa2_dev_meter_policy), 0);
+ if (dpaa2_policy == NULL) {
+ return -rte_mtr_error_set(error, ENOMEM,
+ RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+ "Meter policy memory alloc failed!");
+ }
+
+ dpaa2_policy->policy_id = policy_id;
+ dpaa2_policy->red_drop = red_drop;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ curr = LIST_FIRST(&priv->policies);
+ if (curr == NULL) {
+ LIST_INSERT_HEAD(&priv->policies, dpaa2_policy, next);
+ } else {
+ while (LIST_NEXT(curr, next) != NULL)
+ curr = LIST_NEXT(curr, next);
+ LIST_INSERT_AFTER(curr, dpaa2_policy, next);
+ }
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return 0;
+}
+
+static struct rte_flow_meter_profile *
+dpaa2_mtr_profile_get(struct rte_eth_dev *dev,
+ uint32_t meter_profile_id, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_profile *dpaa2_profile;
+
+ RTE_SET_USED(error);
+
+ rte_spinlock_lock(&priv->meter_lock);
+ dpaa2_profile = LIST_FIRST(&priv->profiles);
+ while (dpaa2_profile != NULL) {
+ if (dpaa2_profile->profile_id == meter_profile_id) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return (struct rte_flow_meter_profile *)dpaa2_profile;
+ }
+ dpaa2_profile = LIST_NEXT(dpaa2_profile, next);
+ }
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return NULL;
+}
+
+static struct rte_flow_meter_policy *
+dpaa2_mtr_policy_get(struct rte_eth_dev *dev,
+ uint32_t policy_id, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_policy *dpaa2_policy;
+
+ RTE_SET_USED(error);
+
+ rte_spinlock_lock(&priv->meter_lock);
+ dpaa2_policy = LIST_FIRST(&priv->policies);
+ while (dpaa2_policy != NULL) {
+ if (dpaa2_policy->policy_id == policy_id) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return (struct rte_flow_meter_policy *)dpaa2_policy;
+ }
+ dpaa2_policy = LIST_NEXT(dpaa2_policy, next);
+ }
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return NULL;
+}
+
+static int
+dpaa2_mtr_profile_delete(struct rte_eth_dev *dev,
+ uint32_t profile_id, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_profile *dpaa2_profile = NULL, *curr;
+ struct dpaa2_dev_meter *meter;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ curr = LIST_FIRST(&priv->profiles);
+ while (curr != NULL) {
+ if (curr->profile_id == profile_id) {
+ dpaa2_profile = curr;
+ break;
+ }
+ curr = LIST_NEXT(curr, next);
+ }
+ if (dpaa2_profile == NULL) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return -rte_mtr_error_set(error, ENOENT,
+ RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+ &profile_id, "Meter profile is invalid.");
+ }
+
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->profile_id == profile_id) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return -rte_mtr_error_set(error, EBUSY,
+ RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+ &profile_id, "Meter profile is in use.");
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+
+ LIST_REMOVE(dpaa2_profile, next);
+ rte_free(dpaa2_profile);
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return 0;
+}
+
+static int
+dpaa2_mtr_policy_delete(struct rte_eth_dev *dev,
+ uint32_t policy_id, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_policy *dpaa2_policy = NULL, *curr;
+ struct dpaa2_dev_meter *meter;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ curr = LIST_FIRST(&priv->policies);
+ while (curr != NULL) {
+ if (curr->policy_id == policy_id) {
+ dpaa2_policy = curr;
+ break;
+ }
+ curr = LIST_NEXT(curr, next);
+ }
+ if (dpaa2_policy == NULL) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return -rte_mtr_error_set(error, ENOENT,
+ RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+ NULL, "Meter policy is invalid.");
+ }
+
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->policy_id == policy_id) {
+ rte_spinlock_unlock(&priv->meter_lock);
+ return -rte_mtr_error_set(error, EBUSY,
+ RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+ NULL, "Meter policy is in use.");
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+
+ LIST_REMOVE(dpaa2_policy, next);
+ rte_free(dpaa2_policy);
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return 0;
+}
+
+static int
+dpaa2_mtr_meter_create(struct rte_eth_dev *dev,
+ uint32_t mtr_id, struct rte_mtr_params *params,
+ int shared, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_profile *profile;
+ struct dpaa2_dev_meter_policy *policy;
+ struct dpaa2_dev_meter *meter, *curr;
+ uint32_t profile_id, policy_id;
+ enum rte_mtr_error_type err_type = RTE_MTR_ERROR_TYPE_NONE;
+ bool found = false;
+ int ret = 0;
+
+ RTE_SET_USED(shared);
+ profile_id = params->meter_profile_id;
+ policy_id = params->meter_policy_id;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ profile = LIST_FIRST(&priv->profiles);
+ while (profile != NULL) {
+ if (profile->profile_id == profile_id) {
+ found = true;
+ break;
+ }
+ profile = LIST_NEXT(profile, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter profile ID(%d) not exist!", profile_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_METER_PROFILE_ID;
+ goto quit;
+ }
+
+ found = false;
+ policy = LIST_FIRST(&priv->policies);
+ while (policy != NULL) {
+ if (policy->policy_id == policy_id) {
+ found = true;
+ break;
+ }
+ policy = LIST_NEXT(policy, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter policy ID(%d) not exist!", policy_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_METER_POLICY_ID;
+ goto quit;
+ }
+
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->meter_id == mtr_id) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter ID(%d) exist!", mtr_id);
+ ret = EEXIST;
+ err_type = RTE_MTR_ERROR_TYPE_MTR_ID;
+ goto quit;
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+ meter = rte_zmalloc(NULL, sizeof(struct dpaa2_dev_meter), 0);
+ if (meter == NULL) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter memory alloc failed!");
+ ret = ENOMEM;
+ err_type = RTE_MTR_ERROR_TYPE_UNSPECIFIED;
+ goto quit;
+ }
+ meter->meter_id = mtr_id;
+ meter->profile_id = profile_id;
+ meter->policy_id = policy_id;
+
+ curr = LIST_FIRST(&priv->meters);
+ if (curr == NULL) {
+ LIST_INSERT_HEAD(&priv->meters, meter, next);
+ } else {
+ while (LIST_NEXT(curr, next) != NULL)
+ curr = LIST_NEXT(curr, next);
+ LIST_INSERT_AFTER(curr, meter, next);
+ }
+
+quit:
+ rte_spinlock_unlock(&priv->meter_lock);
+ if (ret != 0)
+ return -rte_mtr_error_set(error, ret, err_type, NULL, s_err_msg);
+
+ return 0;
+}
+
+static int
+dpaa2_mtr_meter_destroy(struct rte_eth_dev *dev,
+ uint32_t mtr_id, struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter *meter;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->meter_id == mtr_id) {
+ LIST_REMOVE(meter, next);
+ rte_free(meter);
+ rte_spinlock_unlock(&priv->meter_lock);
+
+ return 0;
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter ID(%d) does not exist!", mtr_id);
+ rte_spinlock_unlock(&priv->meter_lock);
+ return -rte_mtr_error_set(error, ENOENT,
+ RTE_MTR_ERROR_TYPE_MTR_ID, NULL, s_err_msg);
+}
+
+static int
+dpaa2_mtr_meter_profile_update(struct rte_eth_dev *dev,
+ uint32_t mtr_id, uint32_t profile_id,
+ struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_profile *profile;
+ struct dpaa2_dev_meter *meter;
+ enum rte_mtr_error_type err_type = RTE_MTR_ERROR_TYPE_NONE;
+ bool found = false;
+ int ret = 0;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->meter_id == mtr_id) {
+ found = true;
+ break;
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter ID(%d) not found!", mtr_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_MTR_ID;
+ goto quit;
+ }
+
+ found = false;
+ profile = LIST_FIRST(&priv->profiles);
+ while (profile != NULL) {
+ if (profile->profile_id == profile_id) {
+ found = true;
+ break;
+ }
+ profile = LIST_NEXT(profile, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Profile ID(%d) not found!", profile_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_METER_PROFILE_ID;
+ goto quit;
+ }
+ meter->profile_id = profile_id;
+
+quit:
+ rte_spinlock_unlock(&priv->meter_lock);
+ if (ret != 0)
+ return -rte_mtr_error_set(error, ret, err_type, NULL, s_err_msg);
+
+ return 0;
+}
+
+static int
+dpaa2_mtr_meter_policy_update(struct rte_eth_dev *dev,
+ uint32_t mtr_id, uint32_t policy_id,
+ struct rte_mtr_error *error)
+{
+ struct dpaa2_dev_priv *priv = dev->data->dev_private;
+ struct dpaa2_dev_meter_policy *policy;
+ struct dpaa2_dev_meter *meter;
+ enum rte_mtr_error_type err_type = RTE_MTR_ERROR_TYPE_NONE;
+ bool found = false;
+ int ret = 0;
+
+ rte_spinlock_lock(&priv->meter_lock);
+ meter = LIST_FIRST(&priv->meters);
+ while (meter != NULL) {
+ if (meter->meter_id == mtr_id) {
+ found = true;
+ break;
+ }
+ meter = LIST_NEXT(meter, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Meter ID(%d) not found!", mtr_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_MTR_ID;
+ goto quit;
+ }
+
+ found = false;
+ policy = LIST_FIRST(&priv->policies);
+ while (policy != NULL) {
+ if (policy->policy_id == policy_id) {
+ found = true;
+ break;
+ }
+ policy = LIST_NEXT(policy, next);
+ }
+ if (!found) {
+ snprintf(s_err_msg, sizeof(s_err_msg),
+ "Profile ID(%d) not found!", policy_id);
+ ret = ENOENT;
+ err_type = RTE_MTR_ERROR_TYPE_METER_POLICY_ID;
+ goto quit;
+ }
+ meter->policy_id = policy_id;
+
+quit:
+ rte_spinlock_unlock(&priv->meter_lock);
+ if (ret != 0)
+ return -rte_mtr_error_set(error, ret, err_type, NULL, s_err_msg);
+
+ return 0;
+}
+
+static const struct rte_mtr_ops dpaa2_meter_ops = {
+ .capabilities_get = dpaa2_mtr_capabilities_get,
+ .meter_profile_add = dpaa2_mtr_profile_add,
+ .meter_profile_delete = dpaa2_mtr_profile_delete,
+ .meter_policy_add = dpaa2_mtr_policy_add,
+ .meter_policy_delete = dpaa2_mtr_policy_delete,
+ .meter_profile_get = dpaa2_mtr_profile_get,
+ .meter_policy_get = dpaa2_mtr_policy_get,
+ .create = dpaa2_mtr_meter_create,
+ .destroy = dpaa2_mtr_meter_destroy,
+ .meter_profile_update = dpaa2_mtr_meter_profile_update,
+ .meter_policy_update = dpaa2_mtr_meter_policy_update,
+};
+
+int
+dpaa2_mtr_ops_get(struct rte_eth_dev *dev, void *ops)
+{
+ RTE_SET_USED(dev);
+
+ *(const void **)ops = &dpaa2_meter_ops;
+ return 0;
+}
diff --git a/drivers/net/dpaa2/mc/fsl_dpni.h b/drivers/net/dpaa2/mc/fsl_dpni.h
index 8913b408e7..d227025e01 100644
--- a/drivers/net/dpaa2/mc/fsl_dpni.h
+++ b/drivers/net/dpaa2/mc/fsl_dpni.h
@@ -1111,6 +1111,11 @@ int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
*/
#define DPNI_POLICER_OPT_DISCARD_RED 0x00000002
+/**
+ * Do NOT reset counters generally for policer update
+ */
+#define DPNI_POLICER_OPT_DO_NOT_RESET_COUNTERS 0x00000004
+
/**
* enum dpni_policer_mode - selecting the policer mode
* @DPNI_POLICER_MODE_NONE: Policer is disabled
@@ -1127,12 +1132,17 @@ enum dpni_policer_mode {
/**
* enum dpni_policer_unit - DPNI policer units
- * @DPNI_POLICER_UNIT_BYTES: bytes units
+ * @DPNI_POLICER_UNIT_BYTES_L3: bytes units (for each frame takes into account
+ * FD length - L3 offset)
* @DPNI_POLICER_UNIT_FRAMES: frames units
+ * @DPNI_POLICER_UNIT_BYTES_L2_WITHOUT_FCS: bytes units (for each frame takes
+ * into account FD length - L2 offset, which means L2 size without the 4 bytes
+ * for the FCS)
*/
enum dpni_policer_unit {
- DPNI_POLICER_UNIT_BYTES = 0,
- DPNI_POLICER_UNIT_FRAMES
+ DPNI_POLICER_UNIT_BYTES_L3 = 0,
+ DPNI_POLICER_UNIT_FRAMES,
+ DPNI_POLICER_UNIT_BYTES_L2_WITHOUT_FCS,
};
/**
@@ -1173,13 +1183,18 @@ struct dpni_rx_tc_policing_cfg {
uint32_t ebs;
};
-
int dpni_set_rx_tc_policing(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
uint8_t tc_id,
const struct dpni_rx_tc_policing_cfg *cfg);
+int dpni_set_rx_tc_policing_v1(struct fsl_mc_io *mc_io,
+ uint32_t cmd_flags,
+ uint16_t token,
+ uint8_t tc_id,
+ const struct dpni_rx_tc_policing_cfg *cfg);
+
int dpni_get_rx_tc_policing(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
diff --git a/drivers/net/dpaa2/meson.build b/drivers/net/dpaa2/meson.build
index 4094ea02ba..808dad8112 100644
--- a/drivers/net/dpaa2/meson.build
+++ b/drivers/net/dpaa2/meson.build
@@ -11,6 +11,7 @@ sources = files(
'base/dpaa2_hw_dpni.c',
'base/dpaa2_tlu_hash.c',
'dpaa2_tm.c',
+ 'dpaa2_meter.c',
'dpaa2_mux.c',
'dpaa2_ethdev.c',
'dpaa2_flow.c',
--
2.43.0
next prev parent reply other threads:[~2026-10-01 7:33 UTC|newest]
Thread overview: 205+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 13:53 [PATCH 00/45] net/dpaa2: features and fixes for NXP DPAA2 drivers Prashant Gupta
2026-09-03 13:53 ` [PATCH 01/45] crypto/dpaa2_sec: fix buffer overflow in GCM decrypt Prashant Gupta
2026-09-03 13:53 ` [PATCH 02/45] crypto/dpaa2_sec: fix FLE pool leak on sec FD build failure Prashant Gupta
2026-09-03 13:53 ` [PATCH 03/45] crypto/dpaa2_sec: support AES-GMAC Prashant Gupta
2026-09-03 13:53 ` [PATCH 04/45] crypto/dpaa2_sec: increase ivsize range for AES-CTR Prashant Gupta
2026-09-03 13:53 ` [PATCH 05/45] crypto/dpaa2_sec: add missing ECN capability Prashant Gupta
2026-09-03 13:53 ` [PATCH 06/45] crypto/dpaa2_sec: add support for env variables Prashant Gupta
2026-09-03 13:53 ` [PATCH 07/45] drivers: fix double free of dpaa2 device on uninit Prashant Gupta
2026-09-03 14:05 ` David Marchand
2026-09-03 13:53 ` [PATCH 08/45] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-09-03 13:53 ` [PATCH 09/45] dma/dpaa2: fix array-bounds warning in dequeue path Prashant Gupta
2026-09-03 13:53 ` [PATCH 10/45] bus/fslmc: defer bus initialization to probe Prashant Gupta
2026-09-03 13:53 ` [PATCH 11/45] dma/dpaa2: validate IOVA in pre-populate helpers Prashant Gupta
2026-09-03 13:53 ` [PATCH 12/45] dma/dpaa2: optimize context index ring enqueue Prashant Gupta
2026-09-03 13:53 ` [PATCH 13/45] drivers: add dpaa2 DMA bypass memory translation option Prashant Gupta
2026-09-03 13:53 ` [PATCH 14/45] mempool/dpaa2: support ops index from primary in secondary Prashant Gupta
2026-09-03 13:53 ` [PATCH 15/45] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-09-03 13:53 ` [PATCH 16/45] drivers: optimize dpaa2 Tx queue and channel mapping Prashant Gupta
2026-09-03 13:53 ` [PATCH 17/45] net/dpaa2: support larger burst size Prashant Gupta
2026-09-03 13:53 ` [PATCH 18/45] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-09-03 13:53 ` [PATCH 19/45] net/dpaa2: support meter and policing Prashant Gupta
2026-09-03 13:53 ` [PATCH 20/45] net/dpaa2: support flow drop action Prashant Gupta
2026-09-03 13:53 ` [PATCH 21/45] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-09-03 13:53 ` [PATCH 22/45] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-09-03 13:53 ` [PATCH 23/45] net/dpaa2: add minimum key size support Prashant Gupta
2026-09-03 13:53 ` [PATCH 24/45] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-09-03 13:53 ` [PATCH 25/45] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-09-03 13:53 ` [PATCH 26/45] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-09-03 13:53 ` [PATCH 27/45] drivers: refresh dpaa2 MC and SoC version info Prashant Gupta
2026-09-03 13:53 ` [PATCH 28/45] drivers: identify dpaa2 soft parser protocol Prashant Gupta
2026-09-03 13:53 ` [PATCH 29/45] drivers: assign dpaa2 Rx CGID per traffic class Prashant Gupta
2026-09-03 13:53 ` [PATCH 30/45] drivers: inherit dpaa2 rxq config for event queue Prashant Gupta
2026-09-03 13:53 ` [PATCH 31/45] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-09-03 13:53 ` [PATCH 32/45] drivers: rework dpaa2 Tx confirmation Prashant Gupta
2026-09-03 13:53 ` [PATCH 33/45] net/dpaa2: ptp enhancements Prashant Gupta
2026-09-03 13:53 ` [PATCH 34/45] net/dpaa2: remove unused soft parser Tx code Prashant Gupta
2026-09-03 13:53 ` [PATCH 35/45] net/dpaa2: update MC dpni QoS and flow steering API Prashant Gupta
2026-09-03 13:53 ` [PATCH 36/45] net/dpaa2: enhance xstat implementation Prashant Gupta
2026-09-03 13:53 ` [PATCH 37/45] net/dpaa2: rework flow engine Prashant Gupta
2026-09-03 13:53 ` [PATCH 38/45] net/dpaa2: support Rx mempool per traffic class Prashant Gupta
2026-09-03 13:53 ` [PATCH 39/45] drivers: consume dpaa2 DQRR entries in batches Prashant Gupta
2026-09-03 13:53 ` [PATCH 40/45] drivers: resolve dpaa2 endpoint in the net driver Prashant Gupta
2026-09-03 13:53 ` [PATCH 41/45] drivers: align dpaa2 event port depths with hardware rings Prashant Gupta
2026-09-03 13:53 ` [PATCH 42/45] net/dpaa2: read MC version from device private data Prashant Gupta
2026-09-03 13:53 ` [PATCH 43/45] net/dpaa2: do not overwrite mbuf hash with drop priority Prashant Gupta
2026-09-03 13:53 ` [PATCH 44/45] bus/fslmc: reduce probe-time logging and MC traffic Prashant Gupta
2026-09-03 13:53 ` [PATCH 45/45] net/dpaa2: reject Rx queue deferred start Prashant Gupta
2026-09-07 20:35 ` [PATCH 00/45] net/dpaa2: features and fixes for NXP DPAA2 drivers Stephen Hemminger
2026-09-07 20:47 ` Stephen Hemminger
2026-09-07 21:03 ` Stephen Hemminger
2026-09-07 21:10 ` Stephen Hemminger
2026-09-07 21:22 ` Stephen Hemminger
2026-09-10 13:51 ` [PATCH v2 00/47] NXP DPAA2 driver updates and fixes Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 01/47] crypto/dpaa2_sec: fix buffer overflow in GCM decrypt Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 02/47] crypto/dpaa2_sec: fix FLE pool leak on sec FD build failure Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 03/47] crypto/dpaa2_sec: support AES-GMAC Prashant Gupta
2026-09-24 10:32 ` [EXTERNAL] " Akhil Goyal
2026-09-10 13:51 ` [PATCH v2 04/47] crypto/dpaa2_sec: increase ivsize range for AES-CTR Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 05/47] crypto/dpaa2_sec: add missing ECN capability Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 06/47] crypto/dpaa2_sec: add support for env variables Prashant Gupta
2026-09-24 10:33 ` [EXTERNAL] " Akhil Goyal
2026-09-10 13:51 ` [PATCH v2 07/47] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 08/47] dma/dpaa2: fix array-bounds warning in dequeue path Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 09/47] bus/fslmc: defer bus initialization to probe Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 10/47] dma/dpaa2: validate IOVA in pre-populate helpers Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 11/47] dma/dpaa2: optimize context index ring enqueue Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 12/47] drivers: add dpaa2 DMA bypass memory translation option Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 13/47] mempool/dpaa2: support ops index from primary in secondary Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 14/47] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 15/47] drivers: optimize dpaa2 Tx queue and channel mapping Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 16/47] net/dpaa2: support larger burst size Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 17/47] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 18/47] net/dpaa2: support meter and policing Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 19/47] net/dpaa2: support flow drop action Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 20/47] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 21/47] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 22/47] net/dpaa2: add minimum key size support Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 23/47] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 24/47] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 25/47] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 26/47] drivers: refresh dpaa2 MC and SoC version info Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 27/47] drivers: identify dpaa2 soft parser protocol Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 28/47] drivers: assign dpaa2 Rx CGID per traffic class Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 29/47] drivers: inherit dpaa2 rxq config for event queue Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 30/47] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 31/47] drivers: rework dpaa2 Tx confirmation Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 32/47] net/dpaa2: ptp enhancements Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 33/47] net/dpaa2: remove unused soft parser Tx code Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 34/47] net/dpaa2: update MC dpni QoS and flow steering API Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 35/47] net/dpaa2: enhance xstat implementation Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 36/47] net/dpaa2: rework flow engine Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 37/47] net/dpaa2: support GENEVE flow item Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 38/47] net/dpaa2: support flow meter and policer actions Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 39/47] net/dpaa2: support flow table miss actions Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 40/47] net/dpaa2: support Rx mempool per traffic class Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 41/47] drivers: consume dpaa2 DQRR entries in batches Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 42/47] drivers: resolve dpaa2 endpoint in the net driver Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 43/47] drivers: align dpaa2 event port depths with hardware rings Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 44/47] net/dpaa2: read MC version from device private data Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 45/47] net/dpaa2: do not overwrite mbuf hash with drop priority Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 46/47] bus/fslmc: reduce probe-time logging and MC traffic Prashant Gupta
2026-09-10 13:51 ` [PATCH v2 47/47] net/dpaa2: reject Rx queue deferred start Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 00/13] net/dpaa2: flow, meter and parser features Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 05/13] net/dpaa2: support meter and policing Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-09-15 11:34 ` [PATCH v3-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-09-15 12:01 ` [PATCH v3-S3 00/10] net/dpaa2: bus, DMA, eventdev and datapath rework Prashant Gupta
2026-09-15 12:01 ` [PATCH v3-S3 01/10] drivers: add dpaa2 DMA bypass memory translation option Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 02/10] drivers: optimize dpaa2 Tx queue and channel mapping Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 03/10] drivers: refresh dpaa2 MC and SoC version info Prashant Gupta
2026-09-17 6:51 ` David Marchand
2026-09-15 12:02 ` [PATCH v3-S3 04/10] drivers: identify dpaa2 soft parser protocol Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 05/10] drivers: assign dpaa2 Rx CGID per traffic class Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 06/10] drivers: inherit dpaa2 rxq config for event queue Prashant Gupta
2026-09-17 6:52 ` David Marchand
2026-09-15 12:02 ` [PATCH v3-S3 07/10] drivers: rework dpaa2 Tx confirmation Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 08/10] drivers: consume dpaa2 DQRR entries in batches Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 09/10] drivers: resolve dpaa2 endpoint in the net driver Prashant Gupta
2026-09-15 12:02 ` [PATCH v3-S3 10/10] drivers: align dpaa2 event port depths with hardware rings Prashant Gupta
2026-09-15 15:42 ` [PATCH v3-S2 00/13] net/dpaa2: flow, meter and parser features Stephen Hemminger
2026-09-22 9:55 ` [PATCH v4-S2 " Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 05/13] net/dpaa2: support meter and policing Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-09-22 9:55 ` [PATCH v4-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-09-22 13:39 ` [PATCH v4-S2 00/13] net/dpaa2: flow, meter and parser features Stephen Hemminger
2026-10-01 7:32 ` [PATCH v5-S2 " Prashant Gupta
2026-10-01 7:32 ` [PATCH v5-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-10-01 7:32 ` [PATCH v5-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-10-01 7:32 ` [PATCH v5-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-10-01 7:32 ` [PATCH v5-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-10-01 7:32 ` Prashant Gupta [this message]
2026-10-01 7:33 ` [PATCH v5-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-10-01 7:33 ` [PATCH v5-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-10-02 16:42 ` [PATCH v5-S2 00/13] net/dpaa2: flow, meter and parser features Stephen Hemminger
2026-10-06 15:09 ` [PATCH v6-S2 " Prashant Gupta
2026-10-06 15:09 ` [PATCH v6-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-10-06 15:09 ` [PATCH v6-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-10-06 15:09 ` [PATCH v6-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 05/13] net/dpaa2: support meter and policing Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-10-06 15:10 ` [PATCH v6-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 00/13] net/dpaa2: flow, meter and parser features Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 05/13] net/dpaa2: support meter and policing Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-10-07 6:02 ` [PATCH v7-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-10-07 16:25 ` [PATCH v7-S2 00/13] net/dpaa2: flow, meter and parser features Stephen Hemminger
2026-10-09 10:48 ` [PATCH v8-S2 00/13] net/dpaa2 updates Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 01/13] net/dpaa2: fix integer overflow in CCSR region mapping Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 02/13] net/dpaa2: set Tx confirmation on device init Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 03/13] net/dpaa2: support larger burst size Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 04/13] net/dpaa2: support MPLS and PPPoE flow distribution Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 05/13] net/dpaa2: support meter and policing Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 06/13] net/dpaa2: support flow drop action Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 07/13] net/dpaa2: set default flow miss action per device Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 08/13] net/dpaa2: identify Rx mbuf hash information by FLC Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 09/13] net/dpaa2: add minimum key size support Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 10/13] net/dpaa2: restructure dpaa2 parser processing Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 11/13] net/dpaa2: parse tunnel and fragmented packet types Prashant Gupta
2026-10-09 10:48 ` [PATCH v8-S2 12/13] net/dpaa2: remove unused soft parser driver Prashant Gupta
2026-10-09 10:49 ` [PATCH v8-S2 13/13] net/dpaa2: rename Rx queue flags Prashant Gupta
2026-10-09 19:09 ` [PATCH v8-S2 00/13] net/dpaa2 updates Stephen Hemminger
2026-09-10 16:57 ` [PATCH v2 00/47] NXP DPAA2 driver updates and fixes Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261001073307.1125305-6-prashant.gupta_3@nxp.com \
--to=prashant.gupta_3@nxp.com \
--cc=dev@dpdk.org \
--cc=g.singh@nxp.com \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.