From patchwork Thu Aug 4 16:58:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Dumitrescu X-Patchwork-Id: 114626 X-Patchwork-Delegate: andrew.rybchenko@oktetlabs.ru Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7AF14A00C4; Thu, 4 Aug 2022 18:59:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E2AC142C00; Thu, 4 Aug 2022 18:58:57 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id C32D34067C for ; Thu, 4 Aug 2022 18:58:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659632333; x=1691168333; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0SHXydqNuJHPkP4rbNsDBy2cHD2oK9rRF0WI7AJ9OJQ=; b=knOJ7UtzcLC3bMlhFhEYrqedmvcsomITuWF2qQkkjjwAEeJtkM3RB1de nAfxc7YPXZ4HEtWEpHfzApZFT9toHaoqPhTvYpmYWj75QCDpgljrbeo9X z8pn3M7HFELOFg5GUrFUJi5ZA66LlbM2PaX0u0G62FVQacbS2UNOwQKB1 kZRI5XtQ1TBHwcPKb/kLjIgW7QzRvqcxkFyll6WNxanGSKfwzA8e727hW UMAL+crIoWEav9+9ZKlRzZSnWZWBO7fdjaHQNYcMpr1VVSjFvEvKCDBTg CndNYSXn1lG3whiPAB2Wsg389MJyHoNNM9zdRzKO7KwqsgBY/7FEvk3I1 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10429"; a="290000092" X-IronPort-AV: E=Sophos;i="5.93,216,1654585200"; d="scan'208";a="290000092" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2022 09:58:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,216,1654585200"; d="scan'208";a="636163099" Received: from silpixa00400573.ir.intel.com (HELO silpixa00400573.ger.corp.intel.com) ([10.237.223.157]) by orsmga001.jf.intel.com with ESMTP; 04 Aug 2022 09:58:46 -0700 From: Cristian Dumitrescu To: dev@dpdk.org Cc: jasvinder.singh@intel.com, yogesh.jangra@intel.com Subject: [PATCH 03/21] net/softnic: remove the meter support Date: Thu, 4 Aug 2022 16:58:21 +0000 Message-Id: <20220804165839.1074817-4-cristian.dumitrescu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220804165839.1074817-1-cristian.dumitrescu@intel.com> References: <20220804165839.1074817-1-cristian.dumitrescu@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Remove the Ethernet device meter API support. Signed-off-by: Cristian Dumitrescu Signed-off-by: Yogesh Jangra --- drivers/net/softnic/meson.build | 1 - drivers/net/softnic/rte_eth_softnic.c | 16 - .../net/softnic/rte_eth_softnic_internals.h | 117 --- drivers/net/softnic/rte_eth_softnic_meter.c | 945 ------------------ .../net/softnic/rte_eth_softnic_pipeline.c | 12 - 5 files changed, 1091 deletions(-) delete mode 100644 drivers/net/softnic/rte_eth_softnic_meter.c diff --git a/drivers/net/softnic/meson.build b/drivers/net/softnic/meson.build index 4ebe60921c..d466dc7700 100644 --- a/drivers/net/softnic/meson.build +++ b/drivers/net/softnic/meson.build @@ -15,7 +15,6 @@ sources = files( 'rte_eth_softnic_cryptodev.c', 'rte_eth_softnic_link.c', 'rte_eth_softnic_mempool.c', - 'rte_eth_softnic_meter.c', 'rte_eth_softnic_pipeline.c', 'rte_eth_softnic_swq.c', 'rte_eth_softnic_tap.c', diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c index 8e361adbad..a7136bb0c0 100644 --- a/drivers/net/softnic/rte_eth_softnic.c +++ b/drivers/net/softnic/rte_eth_softnic.c @@ -13,7 +13,6 @@ #include #include #include -#include #include "rte_eth_softnic.h" #include "rte_eth_softnic_internals.h" @@ -168,8 +167,6 @@ pmd_dev_stop(struct rte_eth_dev *dev) softnic_softnic_swq_free_keep_rxq_txq(p); softnic_mempool_free(p); - softnic_mtr_free(p); - return 0; } @@ -191,8 +188,6 @@ pmd_free(struct pmd_internals *p) softnic_swq_free(p); softnic_mempool_free(p); - softnic_mtr_free(p); - rte_free(p); } @@ -215,14 +210,6 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused, return 0; } -static int -pmd_mtr_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg) -{ - *(const struct rte_mtr_ops **)arg = &pmd_mtr_ops; - - return 0; -} - static const struct eth_dev_ops pmd_ops = { .dev_configure = pmd_dev_configure, .dev_start = pmd_dev_start, @@ -232,7 +219,6 @@ static const struct eth_dev_ops pmd_ops = { .dev_infos_get = pmd_dev_infos_get, .rx_queue_setup = pmd_rx_queue_setup, .tx_queue_setup = pmd_tx_queue_setup, - .mtr_ops_get = pmd_mtr_ops_get, }; static uint16_t @@ -274,8 +260,6 @@ pmd_init(struct pmd_params *params) memcpy(&p->params, params, sizeof(p->params)); /* Resources */ - softnic_mtr_init(p); - softnic_mempool_init(p); softnic_swq_init(p); softnic_link_init(p); diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index 4cc98b7aad..d578cb1f25 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -19,8 +19,6 @@ #include #include -#include -#include #include "rte_eth_softnic.h" #include "conn.h" @@ -40,68 +38,6 @@ struct pmd_params { int sc; /**< Service cores. */ }; -/** - * Ethdev Flow API - */ -struct rte_flow; - -TAILQ_HEAD(flow_list, rte_flow); - -struct flow_attr_map { - char pipeline_name[NAME_SIZE]; - uint32_t table_id; - int valid; -}; - -#ifndef SOFTNIC_FLOW_MAX_GROUPS -#define SOFTNIC_FLOW_MAX_GROUPS 64 -#endif - -struct flow_internals { - struct flow_attr_map ingress_map[SOFTNIC_FLOW_MAX_GROUPS]; - struct flow_attr_map egress_map[SOFTNIC_FLOW_MAX_GROUPS]; -}; - -/** - * Meter - */ - -/* MTR meter profile */ -struct softnic_mtr_meter_profile { - TAILQ_ENTRY(softnic_mtr_meter_profile) node; - uint32_t meter_profile_id; - struct rte_mtr_meter_profile params; - uint32_t n_users; -}; - -TAILQ_HEAD(softnic_mtr_meter_profile_list, softnic_mtr_meter_profile); - -/* MTR meter policy */ -struct softnic_mtr_meter_policy { - TAILQ_ENTRY(softnic_mtr_meter_policy) node; - uint32_t meter_policy_id; - enum rte_table_action_policer policer[RTE_COLORS]; - uint32_t n_users; -}; - -TAILQ_HEAD(softnic_mtr_meter_policy_list, softnic_mtr_meter_policy); - -/* MTR meter object */ -struct softnic_mtr { - TAILQ_ENTRY(softnic_mtr) node; - uint32_t mtr_id; - struct rte_mtr_params params; - struct rte_flow *flow; -}; - -TAILQ_HEAD(softnic_mtr_list, softnic_mtr); - -struct mtr_internals { - struct softnic_mtr_meter_profile_list meter_profiles; - struct softnic_mtr_meter_policy_list meter_policies; - struct softnic_mtr_list mtrs; -}; - /** * MEMPOOL */ @@ -383,7 +319,6 @@ struct softnic_table { struct softnic_table_params params; struct softnic_table_action_profile *ap; struct rte_table_action *a; - struct flow_list flows; struct rte_table_action_dscp_table dscp_table; struct softnic_table_meter_profile_list meter_profiles; }; @@ -481,9 +416,6 @@ struct pmd_internals { /** Params */ struct pmd_params params; - struct flow_internals flow; - struct mtr_internals mtr; - struct softnic_conn *conn; struct softnic_mempool_list mempool_list; struct softnic_swq_list swq_list; @@ -513,46 +445,6 @@ ETHDEV(struct pmd_internals *softnic) return &rte_eth_devices[port_id]; } -/** - * Ethdev Flow API - */ -int -flow_attr_map_set(struct pmd_internals *softnic, - uint32_t group_id, - int ingress, - const char *pipeline_name, - uint32_t table_id); - -struct flow_attr_map * -flow_attr_map_get(struct pmd_internals *softnic, - uint32_t group_id, - int ingress); - -extern const struct rte_flow_ops pmd_flow_ops; - -/** - * Meter - */ -int -softnic_mtr_init(struct pmd_internals *p); - -void -softnic_mtr_free(struct pmd_internals *p); - -struct softnic_mtr * -softnic_mtr_find(struct pmd_internals *p, - uint32_t mtr_id); - -struct softnic_mtr_meter_profile * -softnic_mtr_meter_profile_find(struct pmd_internals *p, - uint32_t meter_profile_id); - -struct softnic_mtr_meter_policy * -softnic_mtr_meter_policy_find(struct pmd_internals *p, - uint32_t meter_policy_id); - -extern const struct rte_mtr_ops pmd_mtr_ops; - /** * MEMPOOL */ @@ -814,15 +706,6 @@ struct softnic_table_rule_action { uint8_t sym_crypto_key[SYM_CRYPTO_MAX_KEY_SIZE]; }; -struct rte_flow { - TAILQ_ENTRY(rte_flow) node; - struct softnic_table_rule_match match; - struct softnic_table_rule_action action; - void *data; - struct pipeline *pipeline; - uint32_t table_id; -}; - int softnic_pipeline_port_in_stats_read(struct pmd_internals *p, const char *pipeline_name, diff --git a/drivers/net/softnic/rte_eth_softnic_meter.c b/drivers/net/softnic/rte_eth_softnic_meter.c deleted file mode 100644 index 6b02f43e31..0000000000 --- a/drivers/net/softnic/rte_eth_softnic_meter.c +++ /dev/null @@ -1,945 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2018 Intel Corporation - */ - -#include -#include -#include - -#include -#include - -#include "rte_eth_softnic_internals.h" - -int -softnic_mtr_init(struct pmd_internals *p) -{ - /* Initialize meter profiles list */ - TAILQ_INIT(&p->mtr.meter_profiles); - - /* Initialize meter policies list */ - TAILQ_INIT(&p->mtr.meter_policies); - - /* Initialize MTR objects list */ - TAILQ_INIT(&p->mtr.mtrs); - - return 0; -} - -void -softnic_mtr_free(struct pmd_internals *p) -{ - /* Remove MTR objects */ - for ( ; ; ) { - struct softnic_mtr *m; - - m = TAILQ_FIRST(&p->mtr.mtrs); - if (m == NULL) - break; - - TAILQ_REMOVE(&p->mtr.mtrs, m, node); - free(m); - } - - /* Remove meter profiles */ - for ( ; ; ) { - struct softnic_mtr_meter_profile *mp; - - mp = TAILQ_FIRST(&p->mtr.meter_profiles); - if (mp == NULL) - break; - - TAILQ_REMOVE(&p->mtr.meter_profiles, mp, node); - free(mp); - } - - /* Remove meter policies */ - for ( ; ; ) { - struct softnic_mtr_meter_policy *mp; - - mp = TAILQ_FIRST(&p->mtr.meter_policies); - if (mp == NULL) - break; - - TAILQ_REMOVE(&p->mtr.meter_policies, mp, node); - free(mp); - } -} - -struct softnic_mtr_meter_profile * -softnic_mtr_meter_profile_find(struct pmd_internals *p, - uint32_t meter_profile_id) -{ - struct softnic_mtr_meter_profile_list *mpl = &p->mtr.meter_profiles; - struct softnic_mtr_meter_profile *mp; - - TAILQ_FOREACH(mp, mpl, node) - if (meter_profile_id == mp->meter_profile_id) - return mp; - - return NULL; -} - -static int -meter_profile_check(struct rte_eth_dev *dev, - uint32_t meter_profile_id, - struct rte_mtr_meter_profile *profile, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_profile *mp; - - /* Meter profile ID must be valid. */ - if (meter_profile_id == UINT32_MAX) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter profile id not valid"); - - /* Meter profile must not exist. */ - mp = softnic_mtr_meter_profile_find(p, meter_profile_id); - if (mp) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter prfile already exists"); - - /* Profile must not be NULL. */ - if (profile == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE, - NULL, - "profile null"); - - /* Traffic metering algorithm : TRTCM_RFC2698 */ - if (profile->alg != RTE_MTR_TRTCM_RFC2698) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE, - NULL, - "Metering alg not supported"); - - /* Not support packet mode, just support byte mode. */ - if (profile->packet_mode) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_PACKET_MODE, - NULL, - "Meter packet mode not supported"); - - return 0; -} - -/* MTR meter profile add */ -static int -pmd_mtr_meter_profile_add(struct rte_eth_dev *dev, - uint32_t meter_profile_id, - struct rte_mtr_meter_profile *profile, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_profile_list *mpl = &p->mtr.meter_profiles; - struct softnic_mtr_meter_profile *mp; - int status; - - /* Check input params */ - status = meter_profile_check(dev, meter_profile_id, profile, error); - if (status) - return status; - - /* Memory allocation */ - mp = calloc(1, sizeof(struct softnic_mtr_meter_profile)); - if (mp == NULL) - return -rte_mtr_error_set(error, - ENOMEM, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Memory alloc failed"); - - /* Fill in */ - mp->meter_profile_id = meter_profile_id; - memcpy(&mp->params, profile, sizeof(mp->params)); - - /* Add to list */ - TAILQ_INSERT_TAIL(mpl, mp, node); - - return 0; -} - -/* MTR meter profile delete */ -static int -pmd_mtr_meter_profile_delete(struct rte_eth_dev *dev, - uint32_t meter_profile_id, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_profile *mp; - - /* Meter profile must exist */ - mp = softnic_mtr_meter_profile_find(p, meter_profile_id); - if (mp == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter profile id invalid"); - - /* Check unused */ - if (mp->n_users) - return -rte_mtr_error_set(error, - EBUSY, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter profile in use"); - - /* Remove from list */ - TAILQ_REMOVE(&p->mtr.meter_profiles, mp, node); - free(mp); - - return 0; -} - -struct softnic_mtr_meter_policy * -softnic_mtr_meter_policy_find(struct pmd_internals *p, - uint32_t meter_policy_id) -{ - struct softnic_mtr_meter_policy_list *mpl = &p->mtr.meter_policies; - struct softnic_mtr_meter_policy *mp; - - TAILQ_FOREACH(mp, mpl, node) - if (meter_policy_id == mp->meter_policy_id) - return mp; - - return NULL; -} - -/* MTR meter policy add */ -static int -pmd_mtr_meter_policy_add(struct rte_eth_dev *dev, - uint32_t meter_policy_id, - struct rte_mtr_meter_policy_params *policy, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_policy_list *mpl = &p->mtr.meter_policies; - struct softnic_mtr_meter_policy *mp; - const struct rte_flow_action *act; - const struct rte_flow_action_meter_color *recolor; - uint32_t i; - bool valid_act_found; - - if (policy == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY, - NULL, - "Null meter policy invalid"); - - /* Meter policy must not exist. */ - mp = softnic_mtr_meter_policy_find(p, meter_policy_id); - if (mp != NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Meter policy already exists"); - - for (i = 0; i < RTE_COLORS; i++) { - if (policy->actions[i] == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY, - NULL, - "Null action list"); - for (act = policy->actions[i], valid_act_found = false; - act->type != RTE_FLOW_ACTION_TYPE_END; act++) { - if (act->type == RTE_FLOW_ACTION_TYPE_VOID) - continue; - /* - * Support one (and one only) of - * METER_COLOR or DROP action. - */ - if ((act->type != RTE_FLOW_ACTION_TYPE_METER_COLOR && - act->type != RTE_FLOW_ACTION_TYPE_DROP) || - valid_act_found) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY, - NULL, - "Action invalid"); - valid_act_found = true; - } - if (!valid_act_found) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY, - NULL, - "No valid action found"); - } - - /* Memory allocation */ - mp = calloc(1, sizeof(struct softnic_mtr_meter_policy)); - if (mp == NULL) - return -rte_mtr_error_set(error, - ENOMEM, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Memory alloc failed"); - - /* Fill in */ - mp->meter_policy_id = meter_policy_id; - for (i = 0; i < RTE_COLORS; i++) { - mp->policer[i] = RTE_TABLE_ACTION_POLICER_DROP; - act = policy->actions[i]; - if (!act) - continue; - if (act->type == RTE_FLOW_ACTION_TYPE_METER_COLOR) { - recolor = act->conf; - switch (recolor->color) { - case RTE_COLOR_GREEN: - mp->policer[i] = - RTE_TABLE_ACTION_POLICER_COLOR_GREEN; - break; - case RTE_COLOR_YELLOW: - mp->policer[i] = - RTE_TABLE_ACTION_POLICER_COLOR_YELLOW; - break; - case RTE_COLOR_RED: - mp->policer[i] = - RTE_TABLE_ACTION_POLICER_COLOR_RED; - break; - default: - break; - } - } - } - - /* Add to list */ - TAILQ_INSERT_TAIL(mpl, mp, node); - - return 0; -} - -/* MTR meter policy delete */ -static int -pmd_mtr_meter_policy_delete(struct rte_eth_dev *dev, - uint32_t meter_policy_id, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_policy *mp; - - /* Meter policy must exist */ - mp = softnic_mtr_meter_policy_find(p, meter_policy_id); - if (mp == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Meter policy id invalid"); - - /* Check unused */ - if (mp->n_users) - return -rte_mtr_error_set(error, - EBUSY, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Meter policy in use"); - - /* Remove from list */ - TAILQ_REMOVE(&p->mtr.meter_policies, mp, node); - free(mp); - - return 0; -} - -struct softnic_mtr * -softnic_mtr_find(struct pmd_internals *p, uint32_t mtr_id) -{ - struct softnic_mtr_list *ml = &p->mtr.mtrs; - struct softnic_mtr *m; - - TAILQ_FOREACH(m, ml, node) - if (m->mtr_id == mtr_id) - return m; - - return NULL; -} - - -static int -mtr_check(struct pmd_internals *p, - uint32_t mtr_id, - struct rte_mtr_params *params, - int shared, - struct rte_mtr_error *error) -{ - /* MTR id valid */ - if (softnic_mtr_find(p, mtr_id)) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object already exists"); - - /* MTR params must not be NULL */ - if (params == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_MTR_PARAMS, - NULL, - "MTR object params null"); - - /* Previous meter color not supported */ - if (params->use_prev_mtr_color) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_MTR_PARAMS, - NULL, - "Previous meter color not supported"); - - /* Shared MTR object not supported */ - if (shared) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_SHARED, - NULL, - "Shared MTR object not supported"); - - return 0; -} - -/* MTR object create */ -static int -pmd_mtr_create(struct rte_eth_dev *dev, - uint32_t mtr_id, - struct rte_mtr_params *params, - int shared, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_list *ml = &p->mtr.mtrs; - struct softnic_mtr_meter_profile *mp; - struct softnic_mtr_meter_policy *policy; - struct softnic_mtr *m; - int status; - - /* Check parameters */ - status = mtr_check(p, mtr_id, params, shared, error); - if (status) - return status; - - /* Meter profile must exist */ - mp = softnic_mtr_meter_profile_find(p, params->meter_profile_id); - if (mp == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter profile id not valid"); - - /* Meter policy must exist */ - policy = softnic_mtr_meter_policy_find(p, params->meter_policy_id); - if (policy == NULL) { - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Meter policy id invalid"); - } - - /* Memory allocation */ - m = calloc(1, sizeof(struct softnic_mtr)); - if (m == NULL) - return -rte_mtr_error_set(error, - ENOMEM, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Memory alloc failed"); - - /* Fill in */ - m->mtr_id = mtr_id; - memcpy(&m->params, params, sizeof(m->params)); - - /* Add to list */ - TAILQ_INSERT_TAIL(ml, m, node); - - /* Update dependencies */ - mp->n_users++; - policy->n_users++; - - return 0; -} - -/* MTR object destroy */ -static int -pmd_mtr_destroy(struct rte_eth_dev *dev, - uint32_t mtr_id, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_list *ml = &p->mtr.mtrs; - struct softnic_mtr_meter_profile *mp; - struct softnic_mtr *m; - struct softnic_mtr_meter_policy *policy; - - /* MTR object must exist */ - m = softnic_mtr_find(p, mtr_id); - if (m == NULL) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object id not valid"); - - /* MTR object must not have any owner */ - if (m->flow != NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "MTR object is being used"); - - /* Get meter profile */ - mp = softnic_mtr_meter_profile_find(p, m->params.meter_profile_id); - if (mp == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "MTR object meter profile invalid"); - - /* Meter policy must exist */ - policy = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id); - if (policy == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "MTR object meter policy invalid"); - - /* Update dependencies */ - mp->n_users--; - policy->n_users--; - - /* Remove from list */ - TAILQ_REMOVE(ml, m, node); - free(m); - - return 0; -} - -/* MTR object meter profile update */ -static int -pmd_mtr_meter_profile_update(struct rte_eth_dev *dev, - uint32_t mtr_id, - uint32_t meter_profile_id, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr_meter_profile *mp_new, *mp_old; - struct softnic_mtr *m; - int status; - - /* MTR object id must be valid */ - m = softnic_mtr_find(p, mtr_id); - if (m == NULL) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object id not valid"); - - /* Meter profile id must be valid */ - mp_new = softnic_mtr_meter_profile_find(p, meter_profile_id); - if (mp_new == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, - NULL, - "Meter profile not valid"); - - /* MTR object already set to meter profile id */ - if (m->params.meter_profile_id == meter_profile_id) - return 0; - - /* MTR object owner table update */ - if (m->flow) { - uint32_t table_id = m->flow->table_id; - struct softnic_table *table = &m->flow->pipeline->table[table_id]; - struct softnic_table_rule_action action; - - if (!softnic_pipeline_table_meter_profile_find(table, - meter_profile_id)) { - struct rte_table_action_meter_profile profile; - - memset(&profile, 0, sizeof(profile)); - - profile.alg = RTE_TABLE_ACTION_METER_TRTCM; - profile.trtcm.cir = mp_new->params.trtcm_rfc2698.cir; - profile.trtcm.pir = mp_new->params.trtcm_rfc2698.pir; - profile.trtcm.cbs = mp_new->params.trtcm_rfc2698.cbs; - profile.trtcm.pbs = mp_new->params.trtcm_rfc2698.pbs; - - /* Add meter profile to pipeline table */ - status = softnic_pipeline_table_mtr_profile_add(p, - m->flow->pipeline->name, - table_id, - meter_profile_id, - &profile); - if (status) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Table meter profile add failed"); - } - - /* Set meter action */ - memcpy(&action, &m->flow->action, sizeof(action)); - - action.mtr.mtr[0].meter_profile_id = meter_profile_id; - - /* Re-add rule */ - status = softnic_pipeline_table_rule_add(p, - m->flow->pipeline->name, - table_id, - &m->flow->match, - &action, - &m->flow->data); - if (status) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Pipeline table rule add failed"); - - /* Flow: update meter action */ - memcpy(&m->flow->action, &action, sizeof(m->flow->action)); - } - - mp_old = softnic_mtr_meter_profile_find(p, m->params.meter_profile_id); - - /* Meter: Set meter profile */ - m->params.meter_profile_id = meter_profile_id; - - /* Update dependencies*/ - mp_old->n_users--; - mp_new->n_users++; - - return 0; -} - -/* MTR object meter DSCP table update */ -static int -pmd_mtr_meter_dscp_table_update(struct rte_eth_dev *dev, - uint32_t mtr_id, - enum rte_color *dscp_table, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct rte_table_action_dscp_table dt; - struct pipeline *pipeline; - struct softnic_table *table; - struct softnic_mtr *m; - uint32_t table_id, i; - int status; - - /* MTR object id must be valid */ - m = softnic_mtr_find(p, mtr_id); - if (m == NULL) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object id not valid"); - - /* MTR object owner valid? */ - if (m->flow == NULL) - return 0; - - pipeline = m->flow->pipeline; - table_id = m->flow->table_id; - table = &pipeline->table[table_id]; - - memcpy(&dt, &table->dscp_table, sizeof(dt)); - for (i = 0; i < RTE_DIM(dt.entry); i++) - dt.entry[i].color = (enum rte_color)dscp_table[i]; - - /* Update table */ - status = softnic_pipeline_table_dscp_table_update(p, - pipeline->name, - table_id, - UINT64_MAX, - &dt); - if (status) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Table action dscp table update failed"); - - return 0; -} - -/* MTR object policy update */ -static int -pmd_mtr_meter_policy_update(struct rte_eth_dev *dev, - uint32_t mtr_id, - uint32_t meter_policy_id, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct softnic_mtr *m; - uint32_t i; - int status; - struct softnic_mtr_meter_policy *mp_new, *mp_old; - - /* MTR object id must be valid */ - m = softnic_mtr_find(p, mtr_id); - if (m == NULL) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object id not valid"); - - if (m->params.meter_policy_id == meter_policy_id) - return 0; - - /* Meter policy must exist */ - mp_new = softnic_mtr_meter_policy_find(p, meter_policy_id); - if (mp_new == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Meter policy id invalid"); - - /* MTR object owner valid? */ - if (m->flow) { - struct pipeline *pipeline = m->flow->pipeline; - struct softnic_table *table = &pipeline->table[m->flow->table_id]; - struct softnic_table_rule_action action; - - memcpy(&action, &m->flow->action, sizeof(action)); - - /* Set action */ - for (i = 0; i < RTE_COLORS; i++) - action.mtr.mtr[0].policer[i] = mp_new->policer[i]; - - /* Re-add the rule */ - status = softnic_pipeline_table_rule_add(p, - pipeline->name, - m->flow->table_id, - &m->flow->match, - &action, - &m->flow->data); - if (status) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Pipeline table rule re-add failed"); - - /* Flow: Update meter action */ - memcpy(&m->flow->action, &action, sizeof(m->flow->action)); - - /* Reset the meter stats */ - rte_table_action_meter_read(table->a, m->flow->data, - 1, NULL, 1); - } - - mp_old = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id); - if (mp_old == NULL) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, - "Old meter policy id invalid"); - - /* Meter: Set meter profile */ - m->params.meter_policy_id = meter_policy_id; - - /* Update dependencies*/ - mp_old->n_users--; - mp_new->n_users++; - - return 0; -} - -#define MTR_STATS_PKTS_DEFAULT (RTE_MTR_STATS_N_PKTS_GREEN | \ - RTE_MTR_STATS_N_PKTS_YELLOW | \ - RTE_MTR_STATS_N_PKTS_RED | \ - RTE_MTR_STATS_N_PKTS_DROPPED) - -#define MTR_STATS_BYTES_DEFAULT (RTE_MTR_STATS_N_BYTES_GREEN | \ - RTE_MTR_STATS_N_BYTES_YELLOW | \ - RTE_MTR_STATS_N_BYTES_RED | \ - RTE_MTR_STATS_N_BYTES_DROPPED) - -/* MTR object stats read */ -static void -mtr_stats_convert(struct pmd_internals *p, - struct softnic_mtr *m, - struct rte_table_action_mtr_counters_tc *in, - struct rte_mtr_stats *out, - uint64_t *out_mask) -{ - struct softnic_mtr_meter_policy *mp; - - memset(&out, 0, sizeof(out)); - *out_mask = 0; - - /* Meter policy must exist */ - mp = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id); - if (mp == NULL) - return; - - if (in->n_packets_valid) { - uint32_t i; - - for (i = 0; i < RTE_COLORS; i++) { - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_GREEN) - out->n_pkts[RTE_COLOR_GREEN] += in->n_packets[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_YELLOW) - out->n_pkts[RTE_COLOR_YELLOW] += in->n_packets[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_RED) - out->n_pkts[RTE_COLOR_RED] += in->n_packets[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_DROP) - out->n_pkts_dropped += in->n_packets[i]; - } - - *out_mask |= MTR_STATS_PKTS_DEFAULT; - } - - if (in->n_bytes_valid) { - uint32_t i; - - for (i = 0; i < RTE_COLORS; i++) { - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_GREEN) - out->n_bytes[RTE_COLOR_GREEN] += in->n_bytes[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_YELLOW) - out->n_bytes[RTE_COLOR_YELLOW] += in->n_bytes[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_COLOR_RED) - out->n_bytes[RTE_COLOR_RED] += in->n_bytes[i]; - - if (mp->policer[i] == - RTE_TABLE_ACTION_POLICER_DROP) - out->n_bytes_dropped += in->n_bytes[i]; - } - - *out_mask |= MTR_STATS_BYTES_DEFAULT; - } -} - -/* MTR object stats read */ -static int -pmd_mtr_stats_read(struct rte_eth_dev *dev, - uint32_t mtr_id, - struct rte_mtr_stats *stats, - uint64_t *stats_mask, - int clear, - struct rte_mtr_error *error) -{ - struct pmd_internals *p = dev->data->dev_private; - struct rte_table_action_mtr_counters counters; - struct pipeline *pipeline; - struct softnic_table *table; - struct softnic_mtr *m; - int status; - - /* MTR object id must be valid */ - m = softnic_mtr_find(p, mtr_id); - if (m == NULL) - return -rte_mtr_error_set(error, - EEXIST, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, - "MTR object id not valid"); - - /* MTR meter object owner valid? */ - if (m->flow == NULL) { - if (stats != NULL) - memset(stats, 0, sizeof(*stats)); - - if (stats_mask) - *stats_mask = MTR_STATS_PKTS_DEFAULT | - MTR_STATS_BYTES_DEFAULT; - - return 0; - } - - pipeline = m->flow->pipeline; - table = &pipeline->table[m->flow->table_id]; - - /* Meter stats read. */ - status = rte_table_action_meter_read(table->a, - m->flow->data, - 1, - &counters, - clear); - if (status) - return -rte_mtr_error_set(error, - EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, - "Meter stats read failed"); - - /* Stats format conversion. */ - if (stats || stats_mask) { - struct rte_mtr_stats s; - uint64_t s_mask = 0; - - mtr_stats_convert(p, - m, - &counters.stats[0], - &s, - &s_mask); - - if (stats) - memcpy(stats, &s, sizeof(*stats)); - - if (stats_mask) - *stats_mask = s_mask; - } - - return 0; -} - -const struct rte_mtr_ops pmd_mtr_ops = { - .capabilities_get = NULL, - - .meter_profile_add = pmd_mtr_meter_profile_add, - .meter_profile_delete = pmd_mtr_meter_profile_delete, - - .meter_policy_add = pmd_mtr_meter_policy_add, - .meter_policy_delete = pmd_mtr_meter_policy_delete, - - .create = pmd_mtr_create, - .destroy = pmd_mtr_destroy, - .meter_enable = NULL, - .meter_disable = NULL, - - .meter_profile_update = pmd_mtr_meter_profile_update, - .meter_dscp_table_update = pmd_mtr_meter_dscp_table_update, - .meter_policy_update = pmd_mtr_meter_policy_update, - .stats_update = NULL, - - .stats_read = pmd_mtr_stats_read, -}; diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c b/drivers/net/softnic/rte_eth_softnic_pipeline.c index c7d2a7de19..2cf7fa52d1 100644 --- a/drivers/net/softnic/rte_eth_softnic_pipeline.c +++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c @@ -46,17 +46,6 @@ softnic_pipeline_init(struct pmd_internals *p) static void softnic_pipeline_table_free(struct softnic_table *table) { - for ( ; ; ) { - struct rte_flow *flow; - - flow = TAILQ_FIRST(&table->flows); - if (flow == NULL) - break; - - TAILQ_REMOVE(&table->flows, flow, node); - free(flow); - } - for ( ; ; ) { struct softnic_table_meter_profile *mp; @@ -1035,7 +1024,6 @@ softnic_pipeline_table_create(struct pmd_internals *softnic, memcpy(&table->params, params, sizeof(*params)); table->ap = ap; table->a = action; - TAILQ_INIT(&table->flows); TAILQ_INIT(&table->meter_profiles); memset(&table->dscp_table, 0, sizeof(table->dscp_table)); pipeline->n_tables++;