get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 84698,
    "url": "https://patches.dpdk.org/api/patches/84698/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201202101212.4717-26-lironh@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20201202101212.4717-26-lironh@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201202101212.4717-26-lironh@marvell.com",
    "date": "2020-12-02T10:11:59",
    "name": "[v1,25/38] net/mvpp2: support udf configuration",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "5220b7282869131f1738094edccb94a8d39b6aef",
    "submitter": {
        "id": 996,
        "url": "https://patches.dpdk.org/api/people/996/?format=api",
        "name": "Liron Himi",
        "email": "lironh@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "https://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20201202101212.4717-26-lironh@marvell.com/mbox/",
    "series": [
        {
            "id": 14168,
            "url": "https://patches.dpdk.org/api/series/14168/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14168",
            "date": "2020-12-02T10:11:34",
            "name": "net/mvpp2: misc updates",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/14168/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/84698/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/84698/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id CFF76A04DB;\n\tWed,  2 Dec 2020 11:20:58 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 6D6A3CB26;\n\tWed,  2 Dec 2020 11:13:11 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id B89DECB04\n for <dev@dpdk.org>; Wed,  2 Dec 2020 11:13:07 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 0B2AAT4e024223 for <dev@dpdk.org>; Wed, 2 Dec 2020 02:13:06 -0800",
            "from sc-exch02.marvell.com ([199.233.58.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 355w509r63-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Wed, 02 Dec 2020 02:13:06 -0800",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH02.marvell.com\n (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Wed, 2 Dec 2020 02:13:04 -0800",
            "from pt-lxl0023.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Wed, 2 Dec 2020 02:13:03 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=MucO+9jUkQ1YvaBiPRiGX6VkXy7XCzxpJnsQj0qMvOM=;\n b=G50XSLky99IAyvMlq03yF77xEhJYOrfKhEfLXHBoQCpJThXO5U4IECWH5KD9vA8DkFQ5\n NMuoiaT2BifmOQtHIQs/n/XaCtZerDckYC7xBntKkB6G8LsKO4Fjzuj9XmxhcWEvNwBQ\n Yw1vE1f0CEVfXtXZ8hsPFRkOQ0/0vo2cnj+ungcwXml6i/qMPq9/QepIWinRYFGcl5HS\n f2RjSZmx870KMYkRVKtB8y211iDMEXUllVKknREULFSF4Cae8vStBKp0KcExIk6OUrZq\n 8MWqgxcGpwifnPseDIGG/O+A2/1rwbdpFQHY7RguDoMdpDN19F3Z9v23/j3/zQ/8JIri sQ==",
        "From": "<lironh@marvell.com>",
        "To": "<jerinj@marvell.com>",
        "CC": "<dev@dpdk.org>, Liron Himi <lironh@marvell.com>",
        "Date": "Wed, 2 Dec 2020 12:11:59 +0200",
        "Message-ID": "<20201202101212.4717-26-lironh@marvell.com>",
        "X-Mailer": "git-send-email 2.28.0",
        "In-Reply-To": "<20201202101212.4717-1-lironh@marvell.com>",
        "References": "<20201202101212.4717-1-lironh@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.312, 18.0.737\n definitions=2020-12-02_04:2020-11-30,\n 2020-12-02 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v1 25/38] net/mvpp2: support udf configuration",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Liron Himi <lironh@marvell.com>\n\nextend the config file with 'udf' (user-defined) settings\n\nSigned-off-by: Liron Himi <lironh@marvell.com>\nReviewed-by: Liron Himi <lironh@marvell.com>\n---\n drivers/net/mvpp2/mrvl_ethdev.c |   4 +-\n drivers/net/mvpp2/mrvl_qos.c    | 212 ++++++++++++++++++++++++++++++++\n drivers/net/mvpp2/mrvl_qos.h    |   3 +\n 3 files changed, 218 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c\nindex 6bd3b0430..5ff11e2c9 100644\n--- a/drivers/net/mvpp2/mrvl_ethdev.c\n+++ b/drivers/net/mvpp2/mrvl_ethdev.c\n@@ -3027,7 +3027,9 @@ mrvl_init_pp2(void)\n \tinit_params.hif_reserved_map = MRVL_MUSDK_HIFS_RESERVED;\n \tinit_params.bm_pool_reserved_map = MRVL_MUSDK_BPOOLS_RESERVED;\n \tinit_params.rss_tbl_reserved_map = MRVL_MUSDK_RSS_RESERVED;\n-\n+\tif (mrvl_cfg && mrvl_cfg->pp2_cfg.prs_udfs.num_udfs)\n+\t\tmemcpy(&init_params.prs_udfs, &mrvl_cfg->pp2_cfg.prs_udfs,\n+\t\t       sizeof(struct pp2_parse_udfs));\n \treturn pp2_init(&init_params);\n }\n \ndiff --git a/drivers/net/mvpp2/mrvl_qos.c b/drivers/net/mvpp2/mrvl_qos.c\nindex 1c65b5276..f5275efc7 100644\n--- a/drivers/net/mvpp2/mrvl_qos.c\n+++ b/drivers/net/mvpp2/mrvl_qos.c\n@@ -35,6 +35,7 @@\n #define MRVL_TOK_TXQ \"txq\"\n #define MRVL_TOK_VLAN \"vlan\"\n #define MRVL_TOK_VLAN_IP \"vlan/ip\"\n+#define MRVL_TOK_PARSER_UDF \"parser udf\"\n \n /* egress specific configuration tokens */\n #define MRVL_TOK_BURST_SIZE \"burst_size\"\n@@ -62,6 +63,18 @@\n #define MRVL_TOK_PLCR_DEFAULT_COLOR_YELLOW \"yellow\"\n #define MRVL_TOK_PLCR_DEFAULT_COLOR_RED \"red\"\n \n+/* paser udf specific configuration tokens */\n+#define MRVL_TOK_PARSER_UDF_PROTO \"proto\"\n+#define MRVL_TOK_PARSER_UDF_FIELD \"field\"\n+#define MRVL_TOK_PARSER_UDF_KEY \"key\"\n+#define MRVL_TOK_PARSER_UDF_MASK \"mask\"\n+#define MRVL_TOK_PARSER_UDF_OFFSET \"offset\"\n+#define MRVL_TOK_PARSER_UDF_PROTO_ETH \"eth\"\n+#define MRVL_TOK_PARSER_UDF_FIELD_ETH_TYPE \"type\"\n+#define MRVL_TOK_PARSER_UDF_PROTO_UDP \"udp\"\n+#define MRVL_TOK_PARSER_UDF_FIELD_UDP_DPORT \"dport\"\n+\n+\n /** Number of tokens in range a-b = 2. */\n #define MAX_RNG_TOKENS 2\n \n@@ -453,6 +466,175 @@ parse_policer(struct rte_cfgfile *file, int port, const char *sec_name,\n \treturn 0;\n }\n \n+/**\n+ * Parse parser udf.\n+ *\n+ * @param file Config file handle.\n+ * @param sec_name section name\n+ * @param udf udf index\n+ * @param cfg[out] Parsing results.\n+ * @returns 0 in case of success, negative value otherwise.\n+ */\n+static int\n+parse_udf(struct rte_cfgfile *file, const char *sec_name, int udf,\n+\t  struct mrvl_cfg *cfg)\n+{\n+\tstruct pp2_parse_udf_params *udf_params;\n+\tconst char *entry, *entry_field;\n+\tuint32_t val, i;\n+\tuint8_t field_size;\n+\tchar malloc_name[32], tmp_arr[3];\n+\t/* field len in chars equal to '0x' + rest of data */\n+#define FIELD_LEN_IN_CHARS(field_size)\t(uint32_t)(2 + (field_size) * 2)\n+\n+\tudf_params = &cfg->pp2_cfg.prs_udfs.udfs[udf];\n+\n+\t/* Read 'proto' field */\n+\tentry = rte_cfgfile_get_entry(file, sec_name,\n+\t\t\t\t      MRVL_TOK_PARSER_UDF_PROTO);\n+\tif (!entry) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must be set\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_PROTO);\n+\t\treturn -1;\n+\t}\n+\n+\t/* Read 'field' field */\n+\tentry_field = rte_cfgfile_get_entry(file, sec_name,\n+\t\t\t\t       MRVL_TOK_PARSER_UDF_FIELD);\n+\tif (!entry_field) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must be set\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_FIELD);\n+\t\treturn -1;\n+\t}\n+\n+\tif (!strncmp(entry, MRVL_TOK_PARSER_UDF_PROTO_ETH,\n+\t\t\t\tsizeof(MRVL_TOK_PARSER_UDF_PROTO_ETH))) {\n+\t\tudf_params->match_proto = MV_NET_PROTO_ETH;\n+\t\tif (!strncmp(entry_field, MRVL_TOK_PARSER_UDF_FIELD_ETH_TYPE,\n+\t\t\t     sizeof(MRVL_TOK_PARSER_UDF_FIELD_ETH_TYPE))) {\n+\t\t\tudf_params->match_field.eth = MV_NET_ETH_F_TYPE;\n+\t\t\tfield_size = 2;\n+\t\t} else {\n+\t\t\tMRVL_LOG(ERR, \"UDF[%d]: mismatch between '%s' proto \"\n+\t\t\t\t \"and '%s' field\\n\", udf,\n+\t\t\t\t MRVL_TOK_PARSER_UDF_PROTO_ETH,\n+\t\t\t\t entry_field);\n+\t\t\treturn -1;\n+\t\t}\n+\t} else if (!strncmp(entry, MRVL_TOK_PARSER_UDF_PROTO_UDP,\n+\t\t\t\tsizeof(MRVL_TOK_PARSER_UDF_PROTO_UDP))) {\n+\t\tudf_params->match_proto = MV_NET_PROTO_UDP;\n+\t\tif (!strncmp(entry_field, MRVL_TOK_PARSER_UDF_FIELD_UDP_DPORT,\n+\t\t\t     sizeof(MRVL_TOK_PARSER_UDF_FIELD_UDP_DPORT))) {\n+\t\t\tudf_params->match_field.udp = MV_NET_UDP_F_DP;\n+\t\t\tfield_size = 2;\n+\t\t} else {\n+\t\t\tMRVL_LOG(ERR, \"UDF[%d]: mismatch between '%s' proto \"\n+\t\t\t\t \"and '%s' field\\n\", udf,\n+\t\t\t\t MRVL_TOK_PARSER_UDF_PROTO_UDP,\n+\t\t\t\t entry_field);\n+\t\t\treturn -1;\n+\t\t}\n+\t} else {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: Unsupported '%s' proto\\n\", udf, entry);\n+\t\treturn -1;\n+\t}\n+\n+\tsnprintf(malloc_name, sizeof(malloc_name), \"mrvl_udf_%d_key\", udf);\n+\tudf_params->match_key = rte_zmalloc(malloc_name, field_size, 0);\n+\tif (udf_params->match_key == NULL) {\n+\t\tMRVL_LOG(ERR, \"Cannot allocate udf %d key\\n\", udf);\n+\t\treturn -1;\n+\t}\n+\tsnprintf(malloc_name, sizeof(malloc_name), \"mrvl_udf_%d_mask\", udf);\n+\tudf_params->match_mask = rte_zmalloc(malloc_name, field_size, 0);\n+\tif (udf_params->match_mask == NULL) {\n+\t\tMRVL_LOG(ERR, \"Cannot allocate udf %d mask\\n\", udf);\n+\t\treturn -1;\n+\t}\n+\n+\t/* Read 'key' field */\n+\tentry = rte_cfgfile_get_entry(file, sec_name, MRVL_TOK_PARSER_UDF_KEY);\n+\tif (!entry) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must be set\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_KEY);\n+\t\treturn -1;\n+\t}\n+\n+\tif (strncmp(entry, \"0x\", 2) != 0)  {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must start with '0x'\\n\",\n+\t\t\t udf, MRVL_TOK_PARSER_UDF_KEY);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (strlen(entry) != FIELD_LEN_IN_CHARS(field_size)) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field's len must be %d\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_KEY,\n+\t\t\t FIELD_LEN_IN_CHARS(field_size));\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tentry += 2; /* skip the '0x' */\n+\tfor (i = 0; i < field_size; i++) {\n+\t\tstrncpy(tmp_arr, entry, 2);\n+\t\ttmp_arr[2] = '\\0';\n+\t\tif (get_val_securely8(tmp_arr, 16,\n+\t\t\t\t      &udf_params->match_key[i]) < 0) {\n+\t\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field's value is not in \"\n+\t\t\t\t\"hex format\\n\", udf, MRVL_TOK_PARSER_UDF_KEY);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tentry += 2;\n+\t}\n+\n+\t/* Read 'mask' field */\n+\tentry = rte_cfgfile_get_entry(file, sec_name, MRVL_TOK_PARSER_UDF_MASK);\n+\tif (!entry) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must be set\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_MASK);\n+\t\treturn -1;\n+\t}\n+\tif (strncmp(entry, \"0x\", 2) != 0) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must start with '0x'\\n\",\n+\t\t\t udf, MRVL_TOK_PARSER_UDF_MASK);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (strlen(entry) != FIELD_LEN_IN_CHARS(field_size)) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field's len must be %d\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_MASK,\n+\t\t\t FIELD_LEN_IN_CHARS(field_size));\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tentry += 2; /* skip the '0x' */\n+\tfor (i = 0; i < field_size; i++) {\n+\t\tstrncpy(tmp_arr, entry, 2);\n+\t\ttmp_arr[2] = '\\0';\n+\t\tif (get_val_securely8(tmp_arr, 16,\n+\t\t\t\t      &udf_params->match_mask[i]) < 0) {\n+\t\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field's value is not in \"\n+\t\t\t\t\"hex format\\n\", udf, MRVL_TOK_PARSER_UDF_MASK);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tentry += 2;\n+\t}\n+\n+\t/* Read offset */\n+\tentry = rte_cfgfile_get_entry(file, sec_name,\n+\t\t\t\t      MRVL_TOK_PARSER_UDF_OFFSET);\n+\tif (!entry) {\n+\t\tMRVL_LOG(ERR, \"UDF[%d]: '%s' field must be set\\n\", udf,\n+\t\t\t MRVL_TOK_PARSER_UDF_OFFSET);\n+\t\treturn -1;\n+\t}\n+\tif (get_val_securely(entry, &val) < 0)\n+\t\treturn -1;\n+\tudf_params->offset = val;\n+\n+\treturn 0;\n+}\n+\n /**\n  * Parse configuration - rte_kvargs_process handler.\n  *\n@@ -487,6 +669,36 @@ mrvl_get_cfg(const char *key __rte_unused, const char *path, void *extra_args)\n \t\treturn -1;\n \t}\n \n+\t/* PP2 configuration */\n+\tn = rte_cfgfile_num_sections(file, MRVL_TOK_PARSER_UDF,\n+\t\tsizeof(MRVL_TOK_PARSER_UDF) - 1);\n+\n+\tif (n && n > PP2_MAX_UDFS_SUPPORTED) {\n+\t\tMRVL_LOG(ERR, \"found %d udf sections, but only %d are supported\\n\",\n+\t\t\t n, PP2_MAX_UDFS_SUPPORTED);\n+\t\treturn -1;\n+\t}\n+\t(*cfg)->pp2_cfg.prs_udfs.num_udfs = n;\n+\tfor (i = 0; i < n; i++) {\n+\t\tsnprintf(sec_name, sizeof(sec_name), \"%s %d\",\n+\t\t\t\tMRVL_TOK_PARSER_UDF, i);\n+\n+\t\t/* udf sections must be sequential. */\n+\t\tif (rte_cfgfile_num_sections(file, sec_name,\n+\t\t\t\tstrlen(sec_name)) <= 0) {\n+\t\t\tMRVL_LOG(ERR, \"udf sections must be sequential (0 - %d)\\n\",\n+\t\t\t\t PP2_MAX_UDFS_SUPPORTED - 1);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tret = parse_udf(file, sec_name, i, *cfg);\n+\t\tif (ret) {\n+\t\t\tMRVL_LOG(ERR, \"Error in parsing %s!\\n\", sec_name);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\t/* PP2 Ports configuration */\n \tn = rte_cfgfile_num_sections(file, MRVL_TOK_PORT,\n \t\tsizeof(MRVL_TOK_PORT) - 1);\n \ndiff --git a/drivers/net/mvpp2/mrvl_qos.h b/drivers/net/mvpp2/mrvl_qos.h\nindex 928cfe366..daf4776ec 100644\n--- a/drivers/net/mvpp2/mrvl_qos.h\n+++ b/drivers/net/mvpp2/mrvl_qos.h\n@@ -19,6 +19,9 @@\n \n /* config. */\n struct mrvl_cfg {\n+\tstruct  {\n+\t\tstruct pp2_parse_udfs\tprs_udfs;\n+\t} pp2_cfg;\n \tstruct port_cfg {\n \t\tenum pp2_ppio_eth_start_hdr eth_start_hdr;\n \t\tint rate_limit_enable;\n",
    "prefixes": [
        "v1",
        "25/38"
    ]
}