get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 42023,
    "url": "http://patchwork.dpdk.org/api/patches/42023/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20180701164637.978-1-pbhagavatula@caviumnetworks.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20180701164637.978-1-pbhagavatula@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180701164637.978-1-pbhagavatula@caviumnetworks.com",
    "date": "2018-07-01T16:46:37",
    "name": "net/thunderx: add support for Rx VLAN offload",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "6e3691a21a36ead72a4ef3dac238ac378989d2a0",
    "submitter": {
        "id": 768,
        "url": "http://patchwork.dpdk.org/api/people/768/?format=api",
        "name": "Pavan Nikhilesh",
        "email": "pbhagavatula@caviumnetworks.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20180701164637.978-1-pbhagavatula@caviumnetworks.com/mbox/",
    "series": [
        {
            "id": 338,
            "url": "http://patchwork.dpdk.org/api/series/338/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=338",
            "date": "2018-07-01T16:46:37",
            "name": "net/thunderx: add support for Rx VLAN offload",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/338/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/42023/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/42023/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 41FDD1BE4C;\n\tSun,  1 Jul 2018 18:47:17 +0200 (CEST)",
            "from NAM05-DM3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr730051.outbound.protection.outlook.com [40.107.73.51])\n\tby dpdk.org (Postfix) with ESMTP id 662B01BE49\n\tfor <dev@dpdk.org>; Sun,  1 Jul 2018 18:47:15 +0200 (CEST)",
            "from localhost.localdomain (111.93.218.67) by\n\tDM5PR07MB3465.namprd07.prod.outlook.com (2603:10b6:4:67::20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.906.20; Sun, 1 Jul 2018 16:47:10 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=wZpxO6M+KNLcSmTM3TaxVIxYpdVexWXNfuU1dmo7S6M=;\n\tb=XKh2q1K2NMsxINQcgPCeXvcieg2I5L/H9wTZf/i650+6eTY0Z0rc3WuFLlqsKAdGrOEHbaHkfXRXd21u8fdxUa59Md2ygNrwFDeDZ9mNdp/Lstp56NuxwjWfz2nNLU3AqOEr+MeWhi2m7gKdyXdSGWjQkcok/rugrpN2HHLksYQ=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Pavan.Bhagavatula@cavium.com; ",
        "From": "Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>",
        "To": "jerin.jacob@caviumnetworks.com, santosh.shukla@caviumnetworks.com,\n\trkudurumalla@caviumnetworks.com, ferruh.yigit@intel.com",
        "Cc": "dev@dpdk.org, \"Kudurumalla, Rakesh\" <rakesh.kudurumalla@cavium.com>,\n\tPavan Nikhilesh <pbhagavatula@caviumnetworks.com>",
        "Date": "Sun,  1 Jul 2018 22:16:37 +0530",
        "Message-Id": "<20180701164637.978-1-pbhagavatula@caviumnetworks.com>",
        "X-Mailer": "git-send-email 2.18.0",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[111.93.218.67]",
        "X-ClientProxiedBy": "MA1PR0101CA0041.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:a00:22::27) To DM5PR07MB3465.namprd07.prod.outlook.com\n\t(2603:10b6:4:67::20)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "5b0ca0f4-741a-493d-dfb7-08d5df724bae",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600053)(711020)(2017052603328)(7153060)(7193020);\n\tSRVR:DM5PR07MB3465; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM5PR07MB3465;\n\t3:Il36lvDy+Ekb3IiyjVJSpQq1xJBLjlxKnsNhrt+FTskXt1mPKP+cJkZy25YMnDrTLpYxJ1JV2MD66FgftfjbW/7yfvcNbJa36OpoiBxnjzpaMkK3tgJK4Knc0L01ka1XpOOf7qOoX99OH/0Eco3q996AdxkNtkUQY050twb2prBGyOzl6orjrACRHhy15S3rPvEC24MJudKtH1a2PFYSp7XOCrdaOEZxlIxgSfbnMkrmohepacerinLsRJ+FpiPV;\n\t25:u1OHzt0sxkLjfkQqkRVjhTjJDRINLafh0yeGt68XJIvnoUlwtEVUZtFnxqeFtUgAUj5GlEmF5ZaB8dyqX7gQQxgJD+iIL/3VsGqKabmviKiCtCPO07HtBukgcuLK+8SIDpnx/H/kXIhEQKJ3rtrmreJfi/MGc7aXWs/RhAvYMaYNQ8k/amy6H2sH9FR7qoggwvipL9xlfd06aNrI9k5L0fGPH+L79o4yPxNC41rlf8c2Rdc1EGKgru/amYYqxCgxvpY4Azy/r82vmOvAN8HUScCTsl5KqCGPuiO2KWdi0EsEVWZ3aqZTyAtrhB3tISMLVwDoQ8m8Tfy3NdgcWA0sxg==;\n\t31:LsyaEbHvGSVrsO3R2t5HJpBDXxalk029sHuxcpKLMGt1K4lWdRB4PARtnBqFojFl3roZKJgVzjGpNlSLJVqP046u29dKgSfuW9oMrfJjH4OMeB/aB15bPgsLydMpl+X39fcxgdPw3pl7uq7fnQBxGVUMgOMOkIQwti+ORdtePu9DNa1POtCjXILHtIlR4MHDNQVBeQS16XkHUNgxxJ+HnrlpkEFClCorLd9Vl512vLI=",
            "1; DM5PR07MB3465;\n\t20:rHk0KYdJ4DFZ3YR1GLTdk0bhQlYLtOHiasSxBXkAh6SAlq3MPYzxolqTgcDJY12AKO/MSiN1tVwUCP71AMG27ghM4U/5U9RxDKa0QjeE102c/tV3ryQZ4bEx5R5T6NisafispVLXsdcP+qrUnrjKu5SCfb85FRZG+g3NgKiW8CpCFYjL8bEW9A4QWJ8wpqvv+/ylrI76cmLCdd/z+lCQ71ScVMbG9OsN0Dq7VKG0CddeUalsGGA2adiEx2kauqhJ0iEPhpRU37rRD7ThHNL1/Zo6m+4Rp9LaqCTKC5M8rIwecfG5Lj1079qMx+/q57cHEwQ5RUINvR8SHZzto21ffNfk8UVug33WcQF7Oo+NccD6m7ltjW0zVU+1fnmLD1jUn8JCA3Xgewzfluhk3/2k+DpuI4ewrFT/FwSjBPMCIdYfRHGDsv2v9UkJBy7Pvr1WBB1rLp1WyMG6AxbUeekLvPX3P9FKyFY/QvZ9barrj7j+JaMsDyhIXzVJeTLHw3vcwM7Gm3XkvHzN7STbakP2NBnPVopkKiYjfX7H5HzSnVouG/Xdl3xmXWaZUBdotkCpJTp7WXk8fWaMrF4W6rKNyblF8+qBqfUino2MTwsDAVc=;\n\t4:rTOZQafxmOdUmpXMjgGYjMJmLzvZAf4jopeXmtWEAlSvsHUsz24ke+Kz9kU4u6TL2lZJzq/XCHC4vu25hNivJ1cHzXup+dXoSfbYfRqOafM4j/ApZEefsP7+EumCcYS/IDFmmNbntgEJClzn2sb3+rG09n84N7eySAQNGGRVPjNdMgylH694dF2vwqHe0Q1xlpHzumfYVBJaB/8BxuVYlnhlyk0j9bau64DPSICBfq57JM/cDOrtQXviXrBLM13YQRUEbWIJtbKi1scl0MOuHw==",
            "=?us-ascii?Q?1; DM5PR07MB3465;\n\t23:W8JJqysAJLuwCBM8VAHwT6H3QcX+aayklZ9wTFNHR?=\n\tJbdYg/Zg7k/4IMufYGxGEyfS9linDv03cVHNM66kSV0Clp/j334665BCM5XsUNo4PX/C9yYnn7adAu1DBYKFpqSTeHG7R+VmODB5AJlQurRtSd7n2m4eicoSqe6nAqgh4zKSKfYgNvnMIkji8Kk/F+2wlwDILC916Us+k/YILCeE1aPn3A2g+cvCTPVrYu8bXS7BiY8TsXyOHTr2RcxcL+vc0I6ust0yeiMFwoKEYiI4UzpfM4MViKMsip8yKeQPzxh32n2FaP29ATUuEMrM37EKiP+MDsDzMyQz45x3umCRnpgkAdB32pbQMm0h+sI+/rcVWx7DNeHonYAsL5bK/S9W1aOWk/cdmL2Tgysly8UFcJCndZ/GxItxNrmCTGEFB4cqfcW/MPRgF+yS3E9anumjXM+78J08cbnWj5HDqCxcugvj/YRsgLC/omzOx5vaioc3m88zHVjyl+BMdEpkeLR7SzrM1h4QckYWyW2yNVeVy8LRjXqvZDGRzs3qxtail4eyz8f6RTsrKVEYShaENuMTa3ITdlvlzBnhfj7Uwv5jM1Tf3aLuIpjFySO/Dw/ND4IIXJpxYPzZtg5jobipkYpAlR8lKhR1v7ZGCdj7cLDZxw4myt3oNmX8isefoaeYpdb/mFzBGyBuJN5FInSW5Q119dKJfELPFPs+JWB/PdnMn4sDE0J72XpENUW6KwGeMRfpLEVyrZItGxtn2vWQuwPCdv0H2VE3lcvbK4JELc0k5BN7tnlZ2eTE9SLnNEJhR8AMr95KSdzfzTlpi24FwIGPEilWd/EmxrlPZAD0RB5HQiXPHfee6QwMqYsprl7hnUc7KlK0NkeOoyHwmB597PD4L/2OXRml75CfI/ikQoNGDbV/n5dBrfkDXKXUYpBqNdhfWjSSO7NwvXym5HZdJ6ju7LkfISZxDzBiwscvlxVevpDQ26EuRevaFJkyAMYQH60yHSH/UGGFHg809DKjL9ibPOunOeinR7TDrMOogyYVu+iPhl31PGyxm5GIzUsSI0PUyZffjl/qHCO+bJ5U2Rfo3s2Sa5qat3HChfvONcsRLgqBfIVM+wfu9VP1CvPI6ey6ytnX5R9fvrFq5ug1ZbSk+67mAXA1Fx1n6j0yYxD61a5lOQTPjGvFGdcQGOptrCBLfN2rdcRco/ikTEs3XbeJbuZ6S9sHWeYTenKvJKfl2Xs9yJ2RiyQTuaewLwnKviI9d509WdPoIiwWVjg6Tpr",
            "1; DM5PR07MB3465;\n\t6:BQS1ISv8/k5Cni94HkWaph+vo/M4yvBfSTWeP7PRXPa1BHi3mF7nDOlL+aoyLFKnDlca/8mrsuRpU1iknTfV/PCrllP4+7agILt+YravxV8F2kr7NjH8YbRRAiU4cnbTebRtfzWesgsLseno2gkR0TuC2pmb4KBy9tXJI3JxxUhIZwOABw5CYpspGHpf0Y6FrperDZI1GaY2v9xh9Ml8Dr2dplrk5/nHcfbVsFHniEej+rYJb+42/19XRbbx7kJWw5jIh07Hw0niydKLRwXDBoWgIApzbwJzcD1hz3cQHNPFvEH4gz3uixnP84kzql9BfE+HwEiZwjb21WBEXI2k2AhVPSNQBN7wB49a5YVWYh5/aUd/RD+A9jtDekcG/yG97XLoCFx+twLaeS0MvcriIgQ4FwDyGIPOvC+Hc0COeYlBZNIxCfPBCXxEfWFLVfOkP0RB0o500JDLWv8W0o9nVQ==;\n\t5:hYzrDDrp5b5yeKQ4SdLyxNN3R5SGdHGSYjF/zmV9COga/4YmyVME5q7juMSRHaKW+tK+fElHpD79UKPl2S2OScFrd5apFj8UIHPc5nT9ZAnO6LDyJdDDGWgdWRafp3K99wDfpIrtxTTJxLSgeAfLs/ev291tDReiFr08X+rdASc=;\n\t24:0+lWoOQ8dBCvEKfwTVYjcC6ersXcfdIrgu+5sCyJYvnCek7d6nsdEXttcejh56vpHxZdegixW4BJldZqwg6qFYlrR2LD59rzwM3IwcHKC9I=",
            "1; DM5PR07MB3465;\n\t7:ETAblPGoqOGK2QAoLoxSYlNZOOlnEFurkfUwr+A85MzU5wFj4d3EXbCHKAFPXQKKMDmMyycne3AMXvh/4Pr7rvpM2eNwKpzveWSW0ycCrdtoxyzxZg9PUaIvaZ8kLiM8cLCZnHrVzsCTROw/LLluChRxxs1ouHQltci4YlMO5pkBfpqgpONyc7+DLkVeMJ8AKaUnO5S2jwifsloDFbwv9pwRB7s9IxoiWjvWL8ZJ42PDcOZF1t6hZItNL7nCrNvv"
        ],
        "X-MS-TrafficTypeDiagnostic": "DM5PR07MB3465:",
        "X-Microsoft-Antispam-PRVS": "<DM5PR07MB346566E0C99CEC343C28BD65804C0@DM5PR07MB3465.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(3231254)(944501410)(52105095)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(6072148)(201708071742011)(7699016);\n\tSRVR:DM5PR07MB3465; BCL:0; PCL:0; RULEID:; SRVR:DM5PR07MB3465; ",
        "X-Forefront-PRVS": "07200C0526",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(6069001)(376002)(346002)(396003)(366004)(39850400004)(136003)(189003)(199004)(50226002)(6116002)(4326008)(16586007)(6666003)(2906002)(3846002)(316002)(54906003)(8936002)(72206003)(478600001)(1076002)(107886003)(97736004)(53936002)(66066001)(14444005)(68736007)(25786009)(6512007)(5009440100003)(8676002)(81156014)(5660300001)(50466002)(6506007)(7736002)(386003)(51416003)(2616005)(48376002)(956004)(476003)(81166006)(36756003)(1857600001)(105586002)(106356001)(16526019)(42882007)(6486002)(47776003)(305945005)(26005)(52116002)(486006)(42262002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR07MB3465; H:localhost.localdomain;\n\tFPR:; \n\tSPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "sZ2oveZt8W6nIWX9Z1LefxemF+o4KAHwDRKTcyr3bdTugFOquz+9jbyTHCbliGUYZ4CpehFl8D0OWfPeVKcufaVvINgD67VEi5qVGnObcuv930bAZkKld+c1O8yWB/O8dwW/Acp54/KPXZr9Gf4Zjccd2Fk8tDnVdcNPLdxWYkFOzsJYtRxOkvofES6DuUT3T4mRfWlrHQlECJNuUsnFWw6UfNi4KdVVTy80l9AgqRTWu4eGuqULgWRM5ak8Miixq3r07dhlK9x42dn2nQFXHNMS6ryvZdOP5oDNK4FoVD9ardgHG2odQB+/RkXWisT3wbBQRd2PgzIaEKnnWXrwgCtCogKFtsU1iy8vr1VDzbY=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Jul 2018 16:47:10.6497\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "5b0ca0f4-741a-493d-dfb7-08d5df724bae",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR07MB3465",
        "Subject": "[dpdk-dev]  [PATCH] net/thunderx: add support for Rx VLAN offload",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: \"Kudurumalla, Rakesh\" <rakesh.kudurumalla@cavium.com>\n\nThis feature is used to offload stripping of vlan header from recevied\npackets and update vlan_tci field in mbuf when\nDEV_RX_OFFLOAD_VLAN_STRIP & ETH_VLAN_STRIP_MASK flag is set.\n\nSigned-off-by: Rakesh Kudurumalla <rkudurumalla@caviumnetworks.com>\nSigned-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>\n---\n drivers/net/thunderx/base/nicvf_hw.c |  1 +\n drivers/net/thunderx/nicvf_ethdev.c  | 59 +++++++++++++++++------\n drivers/net/thunderx/nicvf_rxtx.c    | 70 ++++++++++++++++++++++++----\n drivers/net/thunderx/nicvf_rxtx.h    | 15 ++++--\n drivers/net/thunderx/nicvf_struct.h  |  1 +\n 5 files changed, 119 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/net/thunderx/base/nicvf_hw.c b/drivers/net/thunderx/base/nicvf_hw.c\nindex b07a2937d..5b1abe201 100644\n--- a/drivers/net/thunderx/base/nicvf_hw.c\n+++ b/drivers/net/thunderx/base/nicvf_hw.c\n@@ -699,6 +699,7 @@ nicvf_vlan_hw_strip(struct nicvf *nic, bool enable)\n \telse\n \t\tval &= ~((STRIP_SECOND_VLAN | STRIP_FIRST_VLAN) << 25);\n \n+\tnic->vlan_strip = enable;\n \tnicvf_reg_write(nic, NIC_VNIC_RQ_GEN_CFG, val);\n }\n \ndiff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c\nindex 76fed9f99..4f58b2e33 100644\n--- a/drivers/net/thunderx/nicvf_ethdev.c\n+++ b/drivers/net/thunderx/nicvf_ethdev.c\n@@ -52,6 +52,8 @@ static void nicvf_dev_stop(struct rte_eth_dev *dev);\n static void nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup);\n static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic,\n \t\t\t  bool cleanup);\n+static int nicvf_vlan_offload_config(struct rte_eth_dev *dev, int mask);\n+static int nicvf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n \n RTE_INIT(nicvf_init_log);\n static void\n@@ -357,11 +359,9 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t}\n \n \tmemcpy((char *)ptypes + copied, &ptypes_end, sizeof(ptypes_end));\n-\tif (dev->rx_pkt_burst == nicvf_recv_pkts ||\n-\t\tdev->rx_pkt_burst == nicvf_recv_pkts_multiseg)\n-\t\treturn ptypes;\n \n-\treturn NULL;\n+\t/* All Ptypes are supported in all Rx functions. */\n+\treturn ptypes;\n }\n \n static void\n@@ -918,13 +918,18 @@ nicvf_set_tx_function(struct rte_eth_dev *dev)\n static void\n nicvf_set_rx_function(struct rte_eth_dev *dev)\n {\n-\tif (dev->data->scattered_rx) {\n-\t\tPMD_DRV_LOG(DEBUG, \"Using multi-segment rx callback\");\n-\t\tdev->rx_pkt_burst = nicvf_recv_pkts_multiseg;\n-\t} else {\n-\t\tPMD_DRV_LOG(DEBUG, \"Using single-segment rx callback\");\n-\t\tdev->rx_pkt_burst = nicvf_recv_pkts;\n-\t}\n+\tstruct nicvf *nic = nicvf_pmd_priv(dev);\n+\n+\tconst eth_rx_burst_t rx_burst_func[2][2] = {\n+\t/* [NORMAL/SCATTER] [VLAN_STRIP/NO_VLAN_STRIP] */\n+\t\t[0][0] = nicvf_recv_pkts_no_offload,\n+\t\t[0][1] = nicvf_recv_pkts_vlan_strip,\n+\t\t[1][0] = nicvf_recv_pkts_multiseg_no_offload,\n+\t\t[1][1] = nicvf_recv_pkts_multiseg_vlan_strip,\n+\t};\n+\n+\tdev->rx_pkt_burst =\n+\t\trx_burst_func[dev->data->scattered_rx][nic->vlan_strip];\n }\n \n static int\n@@ -1469,7 +1474,7 @@ nicvf_vf_start(struct rte_eth_dev *dev, struct nicvf *nic, uint32_t rbdrsz)\n \tstruct rte_mbuf *mbuf;\n \tuint16_t rx_start, rx_end;\n \tuint16_t tx_start, tx_end;\n-\tbool vlan_strip;\n+\tint mask;\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -1590,9 +1595,9 @@ nicvf_vf_start(struct rte_eth_dev *dev, struct nicvf *nic, uint32_t rbdrsz)\n \t\t     nic->rbdr->tail, nb_rbdr_desc, nic->vf_id);\n \n \t/* Configure VLAN Strip */\n-\tvlan_strip = !!(dev->data->dev_conf.rxmode.offloads &\n-\t\t\tDEV_RX_OFFLOAD_VLAN_STRIP);\n-\tnicvf_vlan_hw_strip(nic, vlan_strip);\n+\tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |\n+\t\tETH_VLAN_EXTEND_MASK;\n+\tret = nicvf_vlan_offload_config(dev, mask);\n \n \t/* Based on the packet type(IPv4 or IPv6), the nicvf HW aligns L3 data\n \t * to the 64bit memory address.\n@@ -1983,6 +1988,7 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = {\n \t.dev_infos_get            = nicvf_dev_info_get,\n \t.dev_supported_ptypes_get = nicvf_dev_supported_ptypes_get,\n \t.mtu_set                  = nicvf_dev_set_mtu,\n+\t.vlan_offload_set         = nicvf_vlan_offload_set,\n \t.reta_update              = nicvf_dev_reta_update,\n \t.reta_query               = nicvf_dev_reta_query,\n \t.rss_hash_update          = nicvf_dev_rss_hash_update,\n@@ -1999,6 +2005,29 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = {\n \t.get_reg                  = nicvf_dev_get_regs,\n };\n \n+static int\n+nicvf_vlan_offload_config(struct rte_eth_dev *dev, int mask)\n+{\n+\tstruct rte_eth_rxmode *rxmode;\n+\tstruct nicvf *nic = nicvf_pmd_priv(dev);\n+\trxmode = &dev->data->dev_conf.rxmode;\n+\tif (mask & ETH_VLAN_STRIP_MASK) {\n+\t\tif (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)\n+\t\t\tnicvf_vlan_hw_strip(nic, true);\n+\t\telse\n+\t\t\tnicvf_vlan_hw_strip(nic, false);\n+\t}\n+\treturn 0;\n+}\n+\n+static int\n+nicvf_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n+{\n+\tnicvf_vlan_offload_config(dev, mask);\n+\n+\treturn 0;\n+}\n+\n static inline int\n nicvf_set_first_skip(struct rte_eth_dev *dev)\n {\ndiff --git a/drivers/net/thunderx/nicvf_rxtx.c b/drivers/net/thunderx/nicvf_rxtx.c\nindex 72305d9d2..9454e6455 100644\n--- a/drivers/net/thunderx/nicvf_rxtx.c\n+++ b/drivers/net/thunderx/nicvf_rxtx.c\n@@ -388,8 +388,9 @@ nicvf_rx_offload(cqe_rx_word0_t cqe_rx_w0, cqe_rx_word2_t cqe_rx_w2,\n \t}\n }\n \n-uint16_t __hot\n-nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n+static __rte_always_inline uint16_t\n+nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts,\n+\t\tconst uint16_t flag)\n {\n \tuint32_t i, to_process;\n \tstruct cqe_rx_t *cqe_rx;\n@@ -420,7 +421,18 @@ nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \t\trb0_ptr = *((uint64_t *)cqe_rx + rbptr_offset);\n \t\tpkt = (struct rte_mbuf *)nicvf_mbuff_phy2virt\n \t\t\t\t(rb0_ptr - cqe_rx_w1.align_pad, mbuf_phys_off);\n-\t\tpkt->ol_flags = 0;\n+\n+\t\tif (flag & NICVF_RX_OFFLOAD_NONE)\n+\t\t\tpkt->ol_flags = 0;\n+\t\tif (flag & NICVF_RX_OFFLOAD_VLAN_STRIP) {\n+\t\t\tif (unlikely(cqe_rx_w0.vlan_stripped)) {\n+\t\t\t\tpkt->ol_flags |= PKT_RX_VLAN\n+\t\t\t\t\t\t\t| PKT_RX_VLAN_STRIPPED;\n+\t\t\t\tpkt->vlan_tci =\n+\t\t\t\t\trte_cpu_to_be_16(cqe_rx_w2.vlan_tci);\n+\t\t\t}\n+\t\t}\n+\n \t\tpkt->data_len = cqe_rx_w3.rb0_sz;\n \t\tpkt->pkt_len = cqe_rx_w3.rb0_sz;\n \t\tpkt->packet_type = nicvf_rx_classify_pkt(cqe_rx_w0);\n@@ -445,11 +457,27 @@ nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n \treturn to_process;\n }\n \n-static inline uint16_t __hot\n+uint16_t __hot\n+nicvf_recv_pkts_no_offload(void *rx_queue, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn nicvf_recv_pkts(rx_queue, rx_pkts, nb_pkts,\n+\t\t\tNICVF_RX_OFFLOAD_NONE);\n+}\n+\n+uint16_t __hot\n+nicvf_recv_pkts_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn nicvf_recv_pkts(rx_queue, rx_pkts, nb_pkts,\n+\t\t\tNICVF_RX_OFFLOAD_NONE | NICVF_RX_OFFLOAD_VLAN_STRIP);\n+}\n+\n+static __rte_always_inline uint16_t\n nicvf_process_cq_mseg_entry(struct cqe_rx_t *cqe_rx,\n \t\t\tuint64_t mbuf_phys_off,\n \t\t\tstruct rte_mbuf **rx_pkt, uint8_t rbptr_offset,\n-\t\t\tuint64_t mbuf_init)\n+\t\t\tuint64_t mbuf_init, const uint16_t flag)\n {\n \tstruct rte_mbuf *pkt, *seg, *prev;\n \tcqe_rx_word0_t cqe_rx_w0;\n@@ -467,12 +495,20 @@ nicvf_process_cq_mseg_entry(struct cqe_rx_t *cqe_rx,\n \tpkt = (struct rte_mbuf *)nicvf_mbuff_phy2virt\n \t\t\t(rb_ptr[0] - cqe_rx_w1.align_pad, mbuf_phys_off);\n \n-\tpkt->ol_flags = 0;\n \tpkt->pkt_len = cqe_rx_w1.pkt_len;\n \tpkt->data_len = rb_sz[nicvf_frag_num(0)];\n \tnicvf_mbuff_init_mseg_update(\n \t\t\t\tpkt, mbuf_init, cqe_rx_w1.align_pad, nb_segs);\n \tpkt->packet_type = nicvf_rx_classify_pkt(cqe_rx_w0);\n+\tif (flag & NICVF_RX_OFFLOAD_NONE)\n+\t\tpkt->ol_flags = 0;\n+\tif (flag & NICVF_RX_OFFLOAD_VLAN_STRIP) {\n+\t\tif (unlikely(cqe_rx_w0.vlan_stripped)) {\n+\t\t\tpkt->ol_flags |= PKT_RX_VLAN\n+\t\t\t\t| PKT_RX_VLAN_STRIPPED;\n+\t\t\tpkt->vlan_tci = rte_cpu_to_be_16(cqe_rx_w2.vlan_tci);\n+\t\t}\n+\t}\n \tnicvf_rx_offload(cqe_rx_w0, cqe_rx_w2, pkt);\n \n \t*rx_pkt = pkt;\n@@ -491,9 +527,9 @@ nicvf_process_cq_mseg_entry(struct cqe_rx_t *cqe_rx,\n \treturn nb_segs;\n }\n \n-uint16_t __hot\n+static __rte_always_inline uint16_t\n nicvf_recv_pkts_multiseg(void *rx_queue, struct rte_mbuf **rx_pkts,\n-\t\t\t uint16_t nb_pkts)\n+\t\t\t uint16_t nb_pkts, const uint16_t flag)\n {\n \tunion cq_entry_t *cq_entry;\n \tstruct cqe_rx_t *cqe_rx;\n@@ -515,7 +551,7 @@ nicvf_recv_pkts_multiseg(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\tcq_entry = &desc[cqe_head];\n \t\tcqe_rx = (struct cqe_rx_t *)cq_entry;\n \t\tnb_segs = nicvf_process_cq_mseg_entry(cqe_rx, mbuf_phys_off,\n-\t\t\trx_pkts + i, rbptr_offset, mbuf_init);\n+\t\t\trx_pkts + i, rbptr_offset, mbuf_init, flag);\n \t\tbuffers_consumed += nb_segs;\n \t\tcqe_head = (cqe_head + 1) & cqe_mask;\n \t\tnicvf_prefetch_store_keep(rx_pkts[i]);\n@@ -535,6 +571,22 @@ nicvf_recv_pkts_multiseg(void *rx_queue, struct rte_mbuf **rx_pkts,\n \treturn to_process;\n }\n \n+uint16_t __hot\n+nicvf_recv_pkts_multiseg_no_offload(void *rx_queue, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn nicvf_recv_pkts_multiseg(rx_queue, rx_pkts, nb_pkts,\n+\t\t\tNICVF_RX_OFFLOAD_NONE);\n+}\n+\n+uint16_t __hot\n+nicvf_recv_pkts_multiseg_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn nicvf_recv_pkts_multiseg(rx_queue, rx_pkts, nb_pkts,\n+\t\t\tNICVF_RX_OFFLOAD_NONE | NICVF_RX_OFFLOAD_VLAN_STRIP);\n+}\n+\n uint32_t\n nicvf_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_idx)\n {\ndiff --git a/drivers/net/thunderx/nicvf_rxtx.h b/drivers/net/thunderx/nicvf_rxtx.h\nindex 8bdd582ed..cb309782e 100644\n--- a/drivers/net/thunderx/nicvf_rxtx.h\n+++ b/drivers/net/thunderx/nicvf_rxtx.h\n@@ -8,6 +8,9 @@\n #include <rte_byteorder.h>\n #include <rte_ethdev_driver.h>\n \n+#define NICVF_RX_OFFLOAD_NONE           0x1\n+#define NICVF_RX_OFFLOAD_VLAN_STRIP     0x2\n+\n #define NICVF_TX_OFFLOAD_MASK (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK)\n \n #ifndef __hot\n@@ -86,9 +89,15 @@ nicvf_mbuff_init_mseg_update(struct rte_mbuf *pkt, const uint64_t mbuf_init,\n uint32_t nicvf_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_idx);\n uint32_t nicvf_dev_rbdr_refill(struct rte_eth_dev *dev, uint16_t queue_idx);\n \n-uint16_t nicvf_recv_pkts(void *rxq, struct rte_mbuf **rx_pkts, uint16_t pkts);\n-uint16_t nicvf_recv_pkts_multiseg(void *rx_queue, struct rte_mbuf **rx_pkts,\n-\t\t\t\t  uint16_t nb_pkts);\n+uint16_t nicvf_recv_pkts_no_offload(void *rxq, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t pkts);\n+uint16_t nicvf_recv_pkts_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts);\n+\n+uint16_t nicvf_recv_pkts_multiseg_no_offload(void *rx_queue,\n+\t\tstruct rte_mbuf **rx_pkts, uint16_t nb_pkts);\n+uint16_t nicvf_recv_pkts_multiseg_vlan_strip(void *rx_queue,\n+\t\tstruct rte_mbuf **rx_pkts, uint16_t nb_pkts);\n \n uint16_t nicvf_xmit_pkts(void *txq, struct rte_mbuf **tx_pkts, uint16_t pkts);\n uint16_t nicvf_xmit_pkts_multiseg(void *txq, struct rte_mbuf **tx_pkts,\ndiff --git a/drivers/net/thunderx/nicvf_struct.h b/drivers/net/thunderx/nicvf_struct.h\nindex cf98f7c1a..6dfbeb8ee 100644\n--- a/drivers/net/thunderx/nicvf_struct.h\n+++ b/drivers/net/thunderx/nicvf_struct.h\n@@ -85,6 +85,7 @@ struct nicvf {\n \tbool loopback_supported;\n \tbool pf_acked:1;\n \tbool pf_nacked:1;\n+\tbool vlan_strip:1;\n \tuint64_t hwcap;\n \tuint8_t link_up;\n \tuint8_t\tduplex;\n",
    "prefixes": []
}