get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/128304/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 128304,
    "url": "http://patches.dpdk.org/api/patches/128304/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230607130245.8048-16-ivan.malov@arknetworks.am/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20230607130245.8048-16-ivan.malov@arknetworks.am>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230607130245.8048-16-ivan.malov@arknetworks.am",
    "date": "2023-06-07T13:02:26",
    "name": "[v4,15/34] net/sfc: extend generic flow API to allow for internal flows",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "2ac73b7031bbb8c099ea111618bb505118cb3dc9",
    "submitter": {
        "id": 2962,
        "url": "http://patches.dpdk.org/api/people/2962/?format=api",
        "name": "Ivan Malov",
        "email": "ivan.malov@arknetworks.am"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230607130245.8048-16-ivan.malov@arknetworks.am/mbox/",
    "series": [
        {
            "id": 28390,
            "url": "http://patches.dpdk.org/api/series/28390/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=28390",
            "date": "2023-06-07T13:02:11",
            "name": "net/sfc: support HW conntrack assistance",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/28390/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/128304/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/128304/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 6DF0A42C4D;\n\tWed,  7 Jun 2023 15:05:08 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DAC5642D8B;\n\tWed,  7 Jun 2023 15:03:05 +0200 (CEST)",
            "from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80])\n by mails.dpdk.org (Postfix) with ESMTP id 71E0242D20\n for <dev@dpdk.org>; Wed,  7 Jun 2023 15:02:55 +0200 (CEST)",
            "from localhost.localdomain (unknown [78.109.69.83])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by agw.arknetworks.am (Postfix) with ESMTPSA id F1398E12C4;\n Wed,  7 Jun 2023 17:02:54 +0400 (+04)"
        ],
        "From": "Ivan Malov <ivan.malov@arknetworks.am>",
        "To": "dev@dpdk.org",
        "Cc": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Ferruh Yigit <ferruh.yigit@amd.com>, Andy Moreton <amoreton@xilinx.com>",
        "Subject": "[PATCH v4 15/34] net/sfc: extend generic flow API to allow for\n internal flows",
        "Date": "Wed,  7 Jun 2023 17:02:26 +0400",
        "Message-Id": "<20230607130245.8048-16-ivan.malov@arknetworks.am>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20230607130245.8048-1-ivan.malov@arknetworks.am>",
        "References": "<20230601195538.8265-1-ivan.malov@arknetworks.am>\n <20230607130245.8048-1-ivan.malov@arknetworks.am>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "At the moment, driver-internal flow rules are provisioned by\nfunctions that are separate from the generic flow management\nframework. In order to use the latter for such rules, extend\nit accordingly. This will be actually used in the next patch.\n\nSigned-off-by: Ivan Malov <ivan.malov@arknetworks.am>\nReviewed-by: Andy Moreton <amoreton@xilinx.com>\n---\n drivers/net/sfc/sfc.c      |  9 ++++-----\n drivers/net/sfc/sfc_flow.c | 37 +++++++++++++++++++++++++++----------\n drivers/net/sfc/sfc_flow.h |  5 ++++-\n drivers/net/sfc/sfc_mae.c  | 31 +++++++++++++++++++++++++++----\n drivers/net/sfc/sfc_mae.h  |  5 +++--\n 5 files changed, 65 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c\nindex a56521696a..2cfff20f47 100644\n--- a/drivers/net/sfc/sfc.c\n+++ b/drivers/net/sfc/sfc.c\n@@ -975,6 +975,8 @@ sfc_attach(struct sfc_adapter *sa)\n \tif (rc != 0)\n \t\tgoto fail_rss_attach;\n \n+\tsfc_flow_init(sa);\n+\n \trc = sfc_flow_rss_attach(sa);\n \tif (rc != 0)\n \t\tgoto fail_flow_rss_attach;\n@@ -1006,8 +1008,6 @@ sfc_attach(struct sfc_adapter *sa)\n \tsfc_log_init(sa, \"fini nic\");\n \tefx_nic_fini(enp);\n \n-\tsfc_flow_init(sa);\n-\n \trc = sfc_sw_xstats_init(sa);\n \tif (rc != 0)\n \t\tgoto fail_sw_xstats_init;\n@@ -1030,7 +1030,6 @@ sfc_attach(struct sfc_adapter *sa)\n \tsfc_sw_xstats_close(sa);\n \n fail_sw_xstats_init:\n-\tsfc_flow_fini(sa);\n \tsfc_repr_proxy_detach(sa);\n \n fail_repr_proxy_attach:\n@@ -1052,6 +1051,7 @@ sfc_attach(struct sfc_adapter *sa)\n \tsfc_flow_rss_detach(sa);\n \n fail_flow_rss_attach:\n+\tsfc_flow_fini(sa);\n \tsfc_rss_detach(sa);\n \n fail_rss_attach:\n@@ -1099,8 +1099,6 @@ sfc_detach(struct sfc_adapter *sa)\n \n \tsfc_sriov_vswitch_destroy(sa);\n \n-\tsfc_flow_fini(sa);\n-\n \tsfc_repr_proxy_detach(sa);\n \tsfc_mae_switchdev_fini(sa);\n \tsfc_tbls_detach(sa);\n@@ -1108,6 +1106,7 @@ sfc_detach(struct sfc_adapter *sa)\n \tsfc_mae_counter_rxq_detach(sa);\n \tsfc_filter_detach(sa);\n \tsfc_flow_rss_detach(sa);\n+\tsfc_flow_fini(sa);\n \tsfc_rss_detach(sa);\n \tsfc_port_detach(sa);\n \tsfc_ev_detach(sa);\ndiff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c\nindex 432295ea62..f6d1ae2a5b 100644\n--- a/drivers/net/sfc/sfc_flow.c\n+++ b/drivers/net/sfc/sfc_flow.c\n@@ -7,6 +7,8 @@\n  * for Solarflare) and Solarflare Communications, Inc.\n  */\n \n+#include <stdbool.h>\n+\n #include <rte_byteorder.h>\n #include <rte_tailq.h>\n #include <rte_common.h>\n@@ -2405,7 +2407,7 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev,\n \tif (rc != 0)\n \t\tgoto fail;\n \n-\trc = sfc_mae_rule_parse_pattern(sa, pattern, spec_mae, error);\n+\trc = sfc_mae_rule_parse_pattern(sa, pattern, flow, error);\n \tif (rc != 0)\n \t\tgoto fail;\n \n@@ -2421,7 +2423,7 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev,\n \t\t */\n \t}\n \n-\trc = sfc_mae_rule_parse_actions(sa, actions, spec_mae, error);\n+\trc = sfc_mae_rule_parse_actions(sa, actions, flow, error);\n \tif (rc != 0)\n \t\tgoto fail;\n \n@@ -2613,14 +2615,14 @@ sfc_flow_create(struct rte_eth_dev *dev,\n \tstruct rte_flow *flow;\n \n \tsfc_adapter_lock(sa);\n-\tflow = sfc_flow_create_locked(sa, attr, pattern, actions, error);\n+\tflow = sfc_flow_create_locked(sa, false, attr, pattern, actions, error);\n \tsfc_adapter_unlock(sa);\n \n \treturn flow;\n }\n \n struct rte_flow *\n-sfc_flow_create_locked(struct sfc_adapter *sa,\n+sfc_flow_create_locked(struct sfc_adapter *sa, bool internal,\n \t\t       const struct rte_flow_attr *attr,\n \t\t       const struct rte_flow_item pattern[],\n \t\t       const struct rte_flow_action actions[],\n@@ -2635,13 +2637,15 @@ sfc_flow_create_locked(struct sfc_adapter *sa,\n \tif (flow == NULL)\n \t\tgoto fail_no_mem;\n \n+\tflow->internal = internal;\n+\n \trc = sfc_flow_parse(sa->eth_dev, attr, pattern, actions, flow, error);\n \tif (rc != 0)\n \t\tgoto fail_bad_value;\n \n \tTAILQ_INSERT_TAIL(&sa->flow_list, flow, entries);\n \n-\tif (sa->state == SFC_ETHDEV_STARTED) {\n+\tif (flow->internal || sa->state == SFC_ETHDEV_STARTED) {\n \t\trc = sfc_flow_insert(sa, flow, error);\n \t\tif (rc != 0)\n \t\t\tgoto fail_flow_insert;\n@@ -2694,7 +2698,7 @@ sfc_flow_destroy_locked(struct sfc_adapter *sa, struct rte_flow *flow,\n \t\tgoto fail_bad_value;\n \t}\n \n-\tif (sa->state == SFC_ETHDEV_STARTED)\n+\tif (flow->internal || sa->state == SFC_ETHDEV_STARTED)\n \t\trc = sfc_flow_remove(sa, flow, error);\n \n \tTAILQ_REMOVE(&sa->flow_list, flow, entries);\n@@ -2711,10 +2715,14 @@ sfc_flow_flush(struct rte_eth_dev *dev,\n \tstruct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);\n \tstruct rte_flow *flow;\n \tint ret = 0;\n+\tvoid *tmp;\n \n \tsfc_adapter_lock(sa);\n \n-\twhile ((flow = TAILQ_FIRST(&sa->flow_list)) != NULL) {\n+\tRTE_TAILQ_FOREACH_SAFE(flow, &sa->flow_list, entries, tmp) {\n+\t\tif (flow->internal)\n+\t\t\tcontinue;\n+\n \t\tif (sa->state == SFC_ETHDEV_STARTED) {\n \t\t\tint rc;\n \n@@ -2842,10 +2850,14 @@ void\n sfc_flow_fini(struct sfc_adapter *sa)\n {\n \tstruct rte_flow *flow;\n+\tvoid *tmp;\n \n \tSFC_ASSERT(sfc_adapter_is_locked(sa));\n \n-\twhile ((flow = TAILQ_FIRST(&sa->flow_list)) != NULL) {\n+\tRTE_TAILQ_FOREACH_SAFE(flow, &sa->flow_list, entries, tmp) {\n+\t\tif (flow->internal)\n+\t\t\tcontinue;\n+\n \t\tTAILQ_REMOVE(&sa->flow_list, flow, entries);\n \t\tsfc_flow_free(sa, flow);\n \t}\n@@ -2858,8 +2870,10 @@ sfc_flow_stop(struct sfc_adapter *sa)\n \n \tSFC_ASSERT(sfc_adapter_is_locked(sa));\n \n-\tTAILQ_FOREACH(flow, &sa->flow_list, entries)\n-\t\tsfc_flow_remove(sa, flow, NULL);\n+\tTAILQ_FOREACH(flow, &sa->flow_list, entries) {\n+\t\tif (!flow->internal)\n+\t\t\tsfc_flow_remove(sa, flow, NULL);\n+\t}\n \n \t/*\n \t * MAE counter service is not stopped on flow rule remove to avoid\n@@ -2881,6 +2895,9 @@ sfc_flow_start(struct sfc_adapter *sa)\n \tsfc_ft_counters_reset(sa);\n \n \tTAILQ_FOREACH(flow, &sa->flow_list, entries) {\n+\t\tif (flow->internal)\n+\t\t\tcontinue;\n+\n \t\trc = sfc_flow_insert(sa, flow, NULL);\n \t\tif (rc != 0)\n \t\t\tgoto fail_bad_flow;\ndiff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h\nindex a3ca09f225..ec5e29f257 100644\n--- a/drivers/net/sfc/sfc_flow.h\n+++ b/drivers/net/sfc/sfc_flow.h\n@@ -10,6 +10,8 @@\n #ifndef _SFC_FLOW_H\n #define _SFC_FLOW_H\n \n+#include <stdbool.h>\n+\n #include <rte_tailq.h>\n #include <rte_flow_driver.h>\n \n@@ -101,6 +103,7 @@ struct sfc_flow_spec {\n struct rte_flow {\n \tstruct sfc_flow_spec spec;\t/* flow specification */\n \tTAILQ_ENTRY(rte_flow) entries;\t/* flow list entries */\n+\tbool internal;\t\t\t/* true for internal rules */\n };\n \n TAILQ_HEAD(sfc_flow_list, rte_flow);\n@@ -195,7 +198,7 @@ typedef int (sfc_flow_query_cb_t)(struct rte_eth_dev *dev,\n \t\t\t\t  void *data,\n \t\t\t\t  struct rte_flow_error *error);\n \n-struct rte_flow *sfc_flow_create_locked(struct sfc_adapter *sa,\n+struct rte_flow *sfc_flow_create_locked(struct sfc_adapter *sa, bool internal,\n \t\t\t\t\tconst struct rte_flow_attr *attr,\n \t\t\t\t\tconst struct rte_flow_item pattern[],\n \t\t\t\t\tconst struct rte_flow_action actions[],\ndiff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c\nindex 89fa75281f..f7bf682c11 100644\n--- a/drivers/net/sfc/sfc_mae.c\n+++ b/drivers/net/sfc/sfc_mae.c\n@@ -2537,6 +2537,20 @@ sfc_mae_rule_process_outer(struct sfc_adapter *sa,\n \tefx_mae_rule_id_t invalid_rule_id = { .id = EFX_MAE_RSRC_ID_INVALID };\n \tint rc;\n \n+\tif (ctx->internal) {\n+\t\t/*\n+\t\t * A driver-internal flow may not comprise an outer rule,\n+\t\t * but it must not match on invalid outer rule ID since\n+\t\t * it must catch all missed packets, including those\n+\t\t * that hit an outer rule of another flow entry but\n+\t\t * do not hit a higher-priority action rule later.\n+\t\t * So do not set match on outer rule ID here.\n+\t\t */\n+\t\tSFC_ASSERT(ctx->match_spec_outer == NULL);\n+\t\t*rulep = NULL;\n+\t\treturn 0;\n+\t}\n+\n \tif (ctx->encap_type == EFX_TUNNEL_PROTOCOL_NONE) {\n \t\t*rulep = NULL;\n \t\tgoto no_or_id;\n@@ -2823,9 +2837,10 @@ sfc_mae_rule_encap_parse_fini(struct sfc_adapter *sa,\n int\n sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,\n \t\t\t   const struct rte_flow_item pattern[],\n-\t\t\t   struct sfc_flow_spec_mae *spec,\n+\t\t\t   struct rte_flow *flow,\n \t\t\t   struct rte_flow_error *error)\n {\n+\tstruct sfc_flow_spec_mae *spec = &flow->spec.mae;\n \tstruct sfc_mae_parse_ctx ctx_mae;\n \tunsigned int priority_shift = 0;\n \tstruct sfc_flow_parse_ctx ctx;\n@@ -2833,6 +2848,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,\n \n \tmemset(&ctx_mae, 0, sizeof(ctx_mae));\n \tctx_mae.ft_rule_type = spec->ft_rule_type;\n+\tctx_mae.internal = flow->internal;\n \tctx_mae.priority = spec->priority;\n \tctx_mae.ft_ctx = spec->ft_ctx;\n \tctx_mae.sa = sa;\n@@ -3642,11 +3658,12 @@ static const char * const action_names[] = {\n static int\n sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n \t\t\t  const struct rte_flow_action *action,\n-\t\t\t  const struct sfc_flow_spec_mae *spec_mae,\n+\t\t\t  const struct rte_flow *flow,\n \t\t\t  struct sfc_mae_actions_bundle *bundle,\n \t\t\t  struct sfc_mae_aset_ctx *ctx,\n \t\t\t  struct rte_flow_error *error)\n {\n+\tconst struct sfc_flow_spec_mae *spec_mae = &flow->spec.mae;\n \tconst struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule;\n \tconst uint64_t rx_metadata = sa->negotiated_rx_metadata;\n \tefx_mae_actions_t *spec = ctx->spec;\n@@ -3770,6 +3787,11 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n \n \t\tswitch_port_type_mask = 1U << SFC_MAE_SWITCH_PORT_INDEPENDENT;\n \n+\t\tif (flow->internal) {\n+\t\t\tswitch_port_type_mask |=\n+\t\t\t\t\t1U << SFC_MAE_SWITCH_PORT_REPRESENTOR;\n+\t\t}\n+\n \t\trc = sfc_mae_rule_parse_action_port_representor(sa,\n \t\t\t\taction->conf, switch_port_type_mask, spec);\n \t\tbreak;\n@@ -3840,9 +3862,10 @@ sfc_mae_process_encap_header(struct sfc_adapter *sa,\n int\n sfc_mae_rule_parse_actions(struct sfc_adapter *sa,\n \t\t\t   const struct rte_flow_action actions[],\n-\t\t\t   struct sfc_flow_spec_mae *spec_mae,\n+\t\t\t   struct rte_flow *flow,\n \t\t\t   struct rte_flow_error *error)\n {\n+\tstruct sfc_flow_spec_mae *spec_mae = &flow->spec.mae;\n \tstruct sfc_mae_actions_bundle bundle = {0};\n \tconst struct rte_flow_action *action;\n \tstruct sfc_mae_aset_ctx ctx = {0};\n@@ -3899,7 +3922,7 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa,\n \t\tif (rc != 0)\n \t\t\tgoto fail_rule_parse_action;\n \n-\t\trc = sfc_mae_rule_parse_action(sa, action, spec_mae,\n+\t\trc = sfc_mae_rule_parse_action(sa, action, flow,\n \t\t\t\t\t       &bundle, &ctx, error);\n \t\tif (rc != 0)\n \t\t\tgoto fail_rule_parse_action;\ndiff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h\nindex d2995ded88..307236ea11 100644\n--- a/drivers/net/sfc/sfc_mae.h\n+++ b/drivers/net/sfc/sfc_mae.h\n@@ -363,6 +363,7 @@ struct sfc_mae_parse_ctx {\n \tsize_t\t\t\t\ttunnel_def_mask_size;\n \tconst void\t\t\t*tunnel_def_mask;\n \tbool\t\t\t\tmatch_mport_set;\n+\tbool\t\t\t\tinternal;\n \tenum sfc_ft_rule_type\t\tft_rule_type;\n \tstruct sfc_mae_pattern_data\tpattern_data;\n \tefx_tunnel_protocol_t\t\tencap_type;\n@@ -376,11 +377,11 @@ void sfc_mae_detach(struct sfc_adapter *sa);\n sfc_flow_cleanup_cb_t sfc_mae_flow_cleanup;\n int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,\n \t\t\t       const struct rte_flow_item pattern[],\n-\t\t\t       struct sfc_flow_spec_mae *spec,\n+\t\t\t       struct rte_flow *flow,\n \t\t\t       struct rte_flow_error *error);\n int sfc_mae_rule_parse_actions(struct sfc_adapter *sa,\n \t\t\t       const struct rte_flow_action actions[],\n-\t\t\t       struct sfc_flow_spec_mae *spec_mae,\n+\t\t\t       struct rte_flow *flow,\n \t\t\t       struct rte_flow_error *error);\n sfc_flow_verify_cb_t sfc_mae_flow_verify;\n sfc_flow_insert_cb_t sfc_mae_flow_insert;\n",
    "prefixes": [
        "v4",
        "15/34"
    ]
}