From patchwork Sun Feb 11 13:29:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sheehan,Georgina" X-Patchwork-Id: 50273 X-Patchwork-Delegate: cristian.dumitrescu@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 61B3E1B3A9; Tue, 12 Feb 2019 15:03:19 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 94DBA1B3A5 for ; Tue, 12 Feb 2019 15:03:17 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2019 06:03:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,362,1544515200"; d="scan'208";a="274432505" Received: from silpixa00399837.ir.intel.com (HELO silpixa00399837.ger.corp.intel.com) ([10.237.223.162]) by orsmga004.jf.intel.com with ESMTP; 12 Feb 2019 06:03:16 -0800 From: "Sheehan,Georgina" To: dev@dpdk.org Cc: cristian.dumitrescu@intel.com, Georgina Sheehan Date: Sun, 11 Feb 2018 13:29:05 +0000 Message-Id: <20180211132905.7502-3-georgina.sheehan@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180211132905.7502-1-georgina.sheehan@intel.com> References: <20180211085722.59717-1-georgina.sheehan@intel.com> <20180211132905.7502-1-georgina.sheehan@intel.com> Subject: [dpdk-dev] [PATCH v2 3/3] net/softnic: add support for DSCP action X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Georgina Sheehan This allows the application to change the DSCP value of incoming packets v2: Added in call of function parse_table_action_dscp in softnic cli file Signed-off-by: Georgina Sheehan --- drivers/net/softnic/rte_eth_softnic_action.c | 14 ++++++ drivers/net/softnic/rte_eth_softnic_cli.c | 48 +++++++++++++++++++ .../net/softnic/rte_eth_softnic_internals.h | 2 + drivers/net/softnic/rte_eth_softnic_thread.c | 10 ++++ 4 files changed, 74 insertions(+) diff --git a/drivers/net/softnic/rte_eth_softnic_action.c b/drivers/net/softnic/rte_eth_softnic_action.c index 92c744dc9..98d03d5ef 100644 --- a/drivers/net/softnic/rte_eth_softnic_action.c +++ b/drivers/net/softnic/rte_eth_softnic_action.c @@ -397,12 +397,26 @@ softnic_table_action_profile_create(struct pmd_internals *p, } } + if (params->action_mask & (1LLU << RTE_TABLE_ACTION_DSCP)) { + status = rte_table_action_profile_action_register(ap, + RTE_TABLE_ACTION_DSCP, + ¶ms->dscp); + + if (status) { + rte_table_action_profile_free(ap); + return NULL; + } + } + + status = rte_table_action_profile_freeze(ap); if (status) { rte_table_action_profile_free(ap); return NULL; } + + /* Node allocation */ profile = calloc(1, sizeof(struct softnic_table_action_profile)); if (profile == NULL) { diff --git a/drivers/net/softnic/rte_eth_softnic_cli.c b/drivers/net/softnic/rte_eth_softnic_cli.c index 76136c2e2..0e94cfc55 100644 --- a/drivers/net/softnic/rte_eth_softnic_cli.c +++ b/drivers/net/softnic/rte_eth_softnic_cli.c @@ -1358,6 +1358,7 @@ cmd_port_in_action_profile(struct pmd_internals *softnic, * [time] * [tag] * [decap] + * [dscp] * */ static void @@ -1787,6 +1788,17 @@ cmd_table_action_profile(struct pmd_internals *softnic, t0 += 5; } /* sym_crypto */ + if (t0 < n_tokens && (strcmp(tokens[t0], "dscp") == 0)) { + if (n_tokens < t0 + 1) { + snprintf(out, out_size, MSG_ARG_MISMATCH, + "table action profile dscp"); + return; + } + + p.action_mask |= 1LLU << RTE_TABLE_ACTION_DSCP; + t0 += 1; + } /** DSCP **/ + if (t0 < n_tokens) { snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]); return; @@ -3432,6 +3444,7 @@ parse_match(char **tokens, * aead_algo aead_key aead_iv aead_aad * digest_size * data_offset ] + * [dscp ] * * where: * ::= g | y | r | drop @@ -4431,6 +4444,27 @@ parse_table_action_decap(char **tokens, return 2; } +static uint32_t +parse_table_action_dscp(char **tokens, + uint32_t n_tokens, + struct softnic_table_rule_action *a) +{ + if (n_tokens < 2 || + strcmp(tokens[0], "dscp")) + return 0; + + uint8_t dscp_val; + + if (softnic_parser_read_uint8(&dscp_val, tokens[1])) + return 0; + + a->dscp.dscp_val = dscp_val; + + a->action_mask |= 1 << RTE_TABLE_ACTION_DSCP; + + return 2; +} + static uint32_t parse_table_action(char **tokens, uint32_t n_tokens, @@ -4616,6 +4650,20 @@ parse_table_action(char **tokens, n_tokens -= n; } + if (n_tokens && (strcmp(tokens[0], "dscp") == 0)) { + uint32_t n; + + n = parse_table_action_dscp(tokens, n_tokens, a); + if (n == 0) { + snprintf(out, out_size, MSG_ARG_INVALID, + "action dscp"); + return 0; + } + + tokens += n; + n_tokens -= n; + } + if (n_tokens0 - n_tokens == 1) { snprintf(out, out_size, MSG_ARG_INVALID, "action"); return 0; diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index 415434d0d..67ba3ecf3 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -333,6 +333,7 @@ struct softnic_table_action_profile_params { struct rte_table_action_ttl_config ttl; struct rte_table_action_stats_config stats; struct rte_table_action_sym_crypto_config sym_crypto; + struct rte_table_action_dscp_config dscp; }; struct softnic_table_action_profile { @@ -962,6 +963,7 @@ struct softnic_table_rule_action { struct rte_table_action_tag_params tag; struct rte_table_action_decap_params decap; struct rte_table_action_sym_crypto_params sym_crypto; + struct rte_table_action_dscp_params dscp; }; struct rte_flow { diff --git a/drivers/net/softnic/rte_eth_softnic_thread.c b/drivers/net/softnic/rte_eth_softnic_thread.c index 57989a5aa..e73d4a704 100644 --- a/drivers/net/softnic/rte_eth_softnic_thread.c +++ b/drivers/net/softnic/rte_eth_softnic_thread.c @@ -2598,6 +2598,16 @@ action_convert(struct rte_table_action *a, return status; } + if (action->action_mask & (1LLU << RTE_TABLE_ACTION_DSCP)) { + status = rte_table_action_apply(a, + data, + RTE_TABLE_ACTION_DSCP, + &action->dscp); + + if (status) + return status; + } + return 0; }