get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 42722,
    "url": "http://patches.dpdk.org/api/patches/42722/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1531236801-5931-3-git-send-email-shally.verma@caviumnetworks.com/",
    "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": "<1531236801-5931-3-git-send-email-shally.verma@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1531236801-5931-3-git-send-email-shally.verma@caviumnetworks.com",
    "date": "2018-07-10T15:33:19",
    "name": "[v5,2/4] cryptodev: support asymmetric operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "6fd310027e99969de671c3fc161f9f7e4597f78a",
    "submitter": {
        "id": 960,
        "url": "http://patches.dpdk.org/api/people/960/?format=api",
        "name": "Shally Verma",
        "email": "shally.verma@caviumnetworks.com"
    },
    "delegate": {
        "id": 22,
        "url": "http://patches.dpdk.org/api/users/22/?format=api",
        "username": "pdelarag",
        "first_name": "Pablo",
        "last_name": "de Lara Guarch",
        "email": "pablo.de.lara.guarch@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1531236801-5931-3-git-send-email-shally.verma@caviumnetworks.com/mbox/",
    "series": [
        {
            "id": 499,
            "url": "http://patches.dpdk.org/api/series/499/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=499",
            "date": "2018-07-10T15:33:17",
            "name": "crypto: add asym crypto support",
            "version": 5,
            "mbox": "http://patches.dpdk.org/series/499/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/42722/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/42722/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 D20071B49E;\n\tTue, 10 Jul 2018 17:34:05 +0200 (CEST)",
            "from NAM04-SN1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr700045.outbound.protection.outlook.com [40.107.70.45])\n\tby dpdk.org (Postfix) with ESMTP id DD4A91B477\n\tfor <dev@dpdk.org>; Tue, 10 Jul 2018 17:34:03 +0200 (CEST)",
            "from hyd1sverma-dt.caveonetworks.com (115.113.156.2) by\n\tDM5PR0701MB3639.namprd07.prod.outlook.com (2603:10b6:4:7e::11) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.930.20; Tue, 10 Jul 2018 15:34:00 +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=PAM2ikgL0kwKe+FoWhQ2dVax8HrcTlAh1NLDkLonDRk=;\n\tb=EQRYy6cYa94ljJMaSULXdhFfmWFNv/TN0B2UWTh6fv3XKY+wj8lRxFaC/rS/LPku4Q5hOh3rUj9GFOi6cuF4CCWiMLk0CKfg9be9c7Puo4pt70iulEiuZ169jdgBvVj/e8RHJ/s83iONrwza7ysTe3ss254J2aE/AzrlPCTpRu4=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Shally.Verma@cavium.com; ",
        "From": "Shally Verma <shally.verma@caviumnetworks.com>",
        "To": "pablo.de.lara.guarch@intel.com",
        "Cc": "dev@dpdk.org, pathreya@caviumnetworks.com, nmurthy@caviumnetworks.com,\n\tAshish Gupta <ashish.gupta@caviumnetworks.com>,\n\tSunila Sahu <sunila.sahu@caviumnetworks.com>,\n\tUmesh Kartha <umesh.kartha@caviumnetworks.com>",
        "Date": "Tue, 10 Jul 2018 21:03:19 +0530",
        "Message-Id": "<1531236801-5931-3-git-send-email-shally.verma@caviumnetworks.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1531236801-5931-1-git-send-email-shally.verma@caviumnetworks.com>",
        "References": "<1531236801-5931-1-git-send-email-shally.verma@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[115.113.156.2]",
        "X-ClientProxiedBy": "BM1PR0101CA0007.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:b00:18::17) To DM5PR0701MB3639.namprd07.prod.outlook.com\n\t(2603:10b6:4:7e::11)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "0e2e037c-2fda-4548-b415-08d5e67a9053",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600053)(711020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020);\n\tSRVR:DM5PR0701MB3639; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM5PR0701MB3639;\n\t3:rPV0BX2dHjOLCtxV9ruSx18bqRLGZ3D//yaPLIqSj7F89PJHPhN0jMrdEaX8oyYmbHgciZ0ibYvU5ZkGu+A+Hq4lkdVaxEXTVoREED6MowDzbLRIqmg3b78Ka7jlkZ4F670f5AEowgeveLInjX7AXMkonk+kWR7jYrGsIrKXIraI4a68n8+b22zOT+g6IIeHUmIgh2HkZn4fJdA8cJGdF6pxsAv5/hY8y7O4Cq0/nZvfNTo0WYdrkelKEZbn0GXQ;\n\t25:kQEYFEV//xG5of8/JWCDA8H3VamnnGs0QwGA/KxBjwQimJLHn0iA3y5gG2q02m6LW61iuauJMY3XpbqURmZ61NXD8yxTmPwGCZdHm7Rcv/eAqrhH9bgtgOmsHBqZlHcDC1en0x/KaVxH821y5dnulLrQkTHE05KDRkoIovS4KkkZn5bBHg+PuYsSaPXhAc6pYEGtiI47wnAU2+IN6wjsTQo+gQO+IkViqGdrCSev0e6WrnabMuD8i7gb7tY3Jv9sQqqsb1U5ocnFNQSLe7OH9omDizGta2psvpmg+JWUmShpp7xcmGk/DTeJD11EGYNT3PBeD9EJPG05cIIH4AaiZA==;\n\t31:vUtayplynshOtu9gdh46uPJAsW2RBhlebrbhL3iPCetkSiRqgEJIL7+kudh99iDXGDzgIEqEEeCtLJ3dHxwoGXg2DoNdUCbpY3rOpbnVaTJUeJdemH5bEJUG9BjikEhIxAxUkYCgrHDmTrZ8xMkM/HghlU/RtIqfOOqGaqK4X11zFKRQhv86RuISD4kZqOXUA7k5UmPlQzfrxuGZ+D5NU8NsPK63tsgNl8kQFeX82uE=",
            "1; DM5PR0701MB3639;\n\t20:Tv/ozfkEjboTWHqiqeqBhrJU9qM7qaacYUxw4PdZuPIr8tjhhgFF8vRh6FqQCxODNcodQd66lG5V0pcoamNacrlKCjr9z1iHAQA5N2kDv7SaNzjoxsAxMU+PE7SAD6qxccN+9qQNqyaIwdtAyKAV8hJMrwNbzutCZMl5MZpH0B4vj9IasRhiWRr0qKZggoMu3OKFbX3PlmW5JEKDNSY6IBbRIQPwVLL608qumHOL4KEaJgL+HJEoFK7ATPb/FnT65gjAelykc0biraTijQraoGvvy+P7A7RGTFNl6l9HpWxEiOnPA58HY2WC3Izo4qIvgEnrwuC/kpoXRu7B4vxMFz59jMpf6rNubfWMj4jH47gnLlVFziZhcnBy4eLAXKrHNkbvL4Xs7Jx+YbguxTDrxIpRfI/ClKiHkczv6w66mn7aWuRS9sHQl7EFkcjeYRIgHc/9s18S3hSHM74Nto6m8dpHH3cUUj8LKZ0avuGdNH6pKhH5GYiS/ld+cYcuasspHkvAcpSf/9r/gylhL7+0dYol7mP3663zRFLhrI1GCQ5Hg3bbU/CN895w1N/cPaZsnD4TN+KjIOvTt9aLWSzA4Z528V2JxQu/OK2WrWWRszc=;\n\t4:eROAq6eTfIJPJecsX2yUAplvZTp6x71ADtXLP+13xxRXZ9uLyOjLwiRUY4VOqzti2Kzx310DPC9lLGt7V7qRo6JDyBn5L5bD3im3oc1Ace0KuOW8Mp8+1OkmKDGoxDCJsBtgAKwBtmCDRJQb78kmORaz8j+2oMCC1XOU9N3dyNHhHg9gHY19JQ9nVpALy5C1alS7r537+CKViNEu/0Sd1XBaTUcIceOxp/Art6GsncN2aXkSEiHFP1XyozTwKpqYpstfBFu1Amm1mvDeKbsOEA==",
            "=?us-ascii?Q?1; DM5PR0701MB3639;\n\t23:xpCcGJl3b8Hjbd/zaKJquzkPcJ+n2E3iXcXFmkm?=\n\tZa0tdBEgiQiwJbNsfxrTkpUQqpa+UF/6DCkFyKWbZD2hdR8C9JXtQhy8E2Y0tlAZLNbEvr8oDf3UQlyRi4MBRAILap5Qs9+GU5BP/K1iSt0qeEBtVu/0cnZzk5ObTXg2M552WoUaA/KwXqJuUMJSOqz2yhYbZz/cKPCdRiTqDH+zuCJdWkxlm8Yot18GA6We+sny52q8uPlAllmV9dY1BIZV/ae3gnntJL9k812gVNMnw3uAG5Ync5OgUQWQZhaXvGzb9WgA7kWxSg6zFCkFeHiAZk7BQYrXQWVzlVkotAS3metamgSDYAgMrCu1vteFZ/NLR8HqKuTCVrTGyhkEs48QyKiFFvF7IEpXTL9712CNfVAEN1LYF/ogiWZ+SEbaG6+iPaQvjTf5sM+qLwMWr4F+3LkQ1PCm5CvDGFaO/jBkgPyyeE9oZFE1yYvyBnTjqhRVNdnuhjhEHKGP/ovn8NV1UO8YinpKy/mon0/l5fSDR6ecTheXxZxnmvXjEcVktEUR51FSPkUrr9Sre5ipft8mqjwf+4Jjf2bQfxM6egKmPMG7ugG+uopCmL+d/OqccA6xg6X1Qv7FtuWSL+fGF4uWpVi/VsPQcT5pqoQYL0s3gJwqTtrbekbh5Ihslx+7zAK+u8Vwl/BST99ktgaEG9J6qm+Ck0wvxobD1CYlo/4qr2cO5kQXgAHA7f8cwMBkyxAE27N1EpcGQcWesPfHMIoFqdDtZcXL9BJy3DIM/JKa7V2+51Mlq7DmdOwfgfC8FmooV8ywpcVHcYe6gq94wc7/6u8e70gxEYvO61d77aG3va9MJXxa5mE8yVf2hk3hBu/eRMAHVidfzyThvJRZlT/DS3bZ40K7CPyfbF+lY6KaQQr09OMtxtORoQEorpzvjGQV7sjVjkgeWa/D4Gr5Jan8n7rUuSeHU3KSoRfXUHVueCrLsU+9+oi4M+XT8Y4n8Wd86fffgClagU0o0kOlICwZEW17Z91hT2xxJeXPNQsSD99FfCx5HlrQfxLACAuZlrDIKD2+OqWPj0RjMbfo1eZFPWjg1dgsoTxEdMpBtDBeg0yG3ZWlxcNDnWzFVZSQc6p9ffdztVjFxceBW3rPjrLUz5YgMgtzgUtLE8PZiVW+to3qF33VA8+9k6WfXOk6QNUMNKAJQMcwbuzZ9gDr7qBmFwGJjV6HfnltjKr0EzX2mfyOiCYF5ATH931gHT9rD4Mv7sMCEAN+dvb8HK5HlN6u5xSR+OOMQkmv+89Nyho0WDaPB9KXxkHQuys3YiHY2a8RmgvnH61Mn9CoddeQb7qOnuWORd5SpbOIzmH4D5vMz7M0//BGLEILF3eLdTadFF+9xmbaXTsvNZpQJm1InvhPxdKa1JCuqXMBqOYGKhVbjhw==",
            "1; DM5PR0701MB3639;\n\t6:SBB6JYEuBOAKCDYb5jUnT9xAxx383CQZHBMAyiADq9GLW5yd+hA1ysBHlvRXV4EySxMcXC0tJyXXTSxPHjZyMspKwoxonltw6vPMNLw65FEpgzwPj4iS6DqNQ2vghg6X28cExTzagDC3yWvuaeOm8stoiiMwFFH/GdZfHJWc0BuYqeVkvuN4uTcdxY5AgoEzMmL3GJ9dmVGPw8Tay+CtN7QQa1zPLxXQBXlSXh0jqZvUNDFm5YjNeli+4q0l3mRT45FTRvFgDiTMD3ANw9ZVSBCj/ddkQEH+x/5w6/+ZFNOgF05eLanq4DLLZELth5yvP4lIW8SeYBUr/uTHWitaEpFpLo2+djyspPpZJZ5yY3e+m/VKpBQ40Mnw0R+qcUcqqUebSgrxD8svjc/yzhEgEIXWJiBzHvMM64yTDQ+zQRvWtUZsUdV0dFXxCNs6JTWxsWiMTn0VPQ2B5lSH5S4dGQ==;\n\t5:LAAJRcy5JBhwnBw932xRf6SFptulezgMm5EP6DjlOED1f90st6De6H9CxrMXOp/z+JbPSe3OJ2A3krUXa86en3uU4+t5ITPBN+KtJbd9nr53cshnyMCO3DK4P6WskVI8ChYmU92qZLoArc3dJQIor2bXnEhDuD7j8sKg1ZxZhUw=;\n\t24:NG26dUjroNh8wDCMo+UySim6/ss2+aX5ViDHTfdcyGPV4fCoKuZWE8EiVNmJFojbSCKR2d9fGevq568MUjHoDRUh/0wlHv+6VK89SnOHo5M=",
            "1; DM5PR0701MB3639;\n\t7:MewHvYovr5BIxRVnm3s+erVavNNmtX7XZ0Y0FdG1/S7qMCpbq6u0CbjwP6JygbVJi8i3CpeoRPCJfLDrOVy3lpWJ6Yn/6LtJ3vNega5ZanBQOAb+xDiB8vetwGsbYLQehBGojFCgK1BP4XPVPK+JFc/bD4DFV3e3jakwFOS9lG9C58VQ96X/wPVRG/b0qmKw7rs5iUlGQ+kZ16T2kyz/U7fp40iDwmCBQ0elaMSKyAznxf6GTIkGqty+JS/aa97h"
        ],
        "X-MS-TrafficTypeDiagnostic": "DM5PR0701MB3639:",
        "X-Microsoft-Antispam-PRVS": "<DM5PR0701MB363905A2D75EF05CCB527B04F05B0@DM5PR0701MB3639.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)(8121501046)(5005006)(10201501046)(93006095)(3002001)(3231311)(944501410)(52105095)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123564045)(20161123558120)(6072148)(201708071742011)(7699016);\n\tSRVR:DM5PR0701MB3639; BCL:0; PCL:0; RULEID:; SRVR:DM5PR0701MB3639; ",
        "X-Forefront-PRVS": "0729050452",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(396003)(346002)(376002)(366004)(39860400002)(136003)(199004)(189003)(47776003)(2361001)(68736007)(53416004)(76176011)(66066001)(6486002)(6666003)(186003)(105586002)(16586007)(316002)(6916009)(51416003)(50466002)(97736004)(48376002)(72206003)(54906003)(8676002)(14444005)(4326008)(478600001)(5660300001)(16526019)(5024004)(50226002)(6512007)(2906002)(386003)(3846002)(6506007)(44832011)(106356001)(107886003)(2616005)(26005)(55236004)(69596002)(6116002)(956004)(81166006)(2351001)(305945005)(25786009)(81156014)(53936002)(36756003)(8936002)(11346002)(52116002)(476003)(7736002)(575784001)(486006)(42882007)(446003);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR0701MB3639;\n\tH:hyd1sverma-dt.caveonetworks.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; A:1; MX:1; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "D8lxPLwVvpw8DBOtDinBT4O8qkWgw89MbqygvbHRGG1UtxMbku1uPM3kolURvDCtFOGTY8XOnNfcFFnBjndRXQGewaAoU2GE1gWwgephTOcgBWhBvCjP5k3V11pI2pjbGy0Vgz4psobDkKmnK8qycfm4aobq8jYHgXWL3uNRqCr+VzrTu10XkAxvvZJ1m1CrjdQfz0D1nJnU8aD/sBCqVvE8uDNAHN9EdHxKuvEBBTw2kORusqIPQ7ShdSWeZg1DfmQPUq9oAp7zCwzehkDLkckq5r6EUXgyjqnH7WiwAHEREvYTAdHt8JukQQJjtPcTk0Ko+2LJZFyqyR4ovCgEfdFGzvpB+MxLmT9tM+4R5qw=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "10 Jul 2018 15:34:00.0749\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "0e2e037c-2fda-4548-b415-08d5e67a9053",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR0701MB3639",
        "Subject": "[dpdk-dev] [PATCH v5 2/4] cryptodev: support asymmetric operations",
        "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: Ashish Gupta <ashish.gupta@caviumnetworks.com>\n\nExtend DPDK librte_cryptodev to:\n- define asym op type in rte_crypto_op_type and associated\n  op pool create/alloc APIs\n- define asym session and associated session APIs\n\nIf PMD shows in its feature flag that it supports both sym and\nasym then it must support those on all its qps.\n\nSigned-off-by: Shally Verma <shally.verma@caviumnetworks.com>\nSigned-off-by: Sunila Sahu <sunila.sahu@caviumnetworks.com>\nSigned-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>\nSigned-off-by: Umesh Kartha <umesh.kartha@caviumnetworks.com>\n---\n lib/librte_cryptodev/rte_crypto.h              |  37 +++++-\n lib/librte_cryptodev/rte_cryptodev.c           | 166 ++++++++++++++++++++++++-\n lib/librte_cryptodev/rte_cryptodev.h           |  91 +++++++++++++-\n lib/librte_cryptodev/rte_cryptodev_pmd.h       |  57 ++++++++-\n lib/librte_cryptodev/rte_cryptodev_version.map |   6 +\n 5 files changed, 352 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/lib/librte_cryptodev/rte_crypto.h b/lib/librte_cryptodev/rte_crypto.h\nindex a16be65..fd5ef3a 100644\n--- a/lib/librte_cryptodev/rte_crypto.h\n+++ b/lib/librte_cryptodev/rte_crypto.h\n@@ -23,6 +23,7 @@ extern \"C\" {\n #include <rte_common.h>\n \n #include \"rte_crypto_sym.h\"\n+#include \"rte_crypto_asym.h\"\n \n /** Crypto operation types */\n enum rte_crypto_op_type {\n@@ -30,6 +31,8 @@ enum rte_crypto_op_type {\n \t/**< Undefined operation type */\n \tRTE_CRYPTO_OP_TYPE_SYMMETRIC,\n \t/**< Symmetric operation */\n+\tRTE_CRYPTO_OP_TYPE_ASYMMETRIC\n+\t/**< Asymmetric operation */\n };\n \n /** Status of crypto operation */\n@@ -114,6 +117,10 @@ struct rte_crypto_op {\n \tunion {\n \t\tstruct rte_crypto_sym_op sym[0];\n \t\t/**< Symmetric operation parameters */\n+\n+\t\tstruct rte_crypto_asym_op asym[0];\n+\t\t/**< Asymmetric operation parameters */\n+\n \t}; /**< operation specific parameters */\n };\n \n@@ -134,6 +141,9 @@ __rte_crypto_op_reset(struct rte_crypto_op *op, enum rte_crypto_op_type type)\n \tcase RTE_CRYPTO_OP_TYPE_SYMMETRIC:\n \t\t__rte_crypto_sym_op_reset(op->sym);\n \t\tbreak;\n+\tcase RTE_CRYPTO_OP_TYPE_ASYMMETRIC:\n+\t\tmemset(op->asym, 0, sizeof(struct rte_crypto_asym_op));\n+\tbreak;\n \tcase RTE_CRYPTO_OP_TYPE_UNDEFINED:\n \tdefault:\n \t\tbreak;\n@@ -300,9 +310,14 @@ __rte_crypto_op_get_priv_data(struct rte_crypto_op *op, uint32_t size)\n \tif (likely(op->mempool != NULL)) {\n \t\tpriv_size = __rte_crypto_op_get_priv_data_size(op->mempool);\n \n-\t\tif (likely(priv_size >= size))\n-\t\t\treturn (void *)((uint8_t *)(op + 1) +\n+\t\tif (likely(priv_size >= size)) {\n+\t\t\tif (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)\n+\t\t\t\treturn (void *)((uint8_t *)(op + 1) +\n \t\t\t\t\tsizeof(struct rte_crypto_sym_op));\n+\t\t\tif (op->type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC)\n+\t\t\t\treturn (void *)((uint8_t *)(op + 1) +\n+\t\t\t\t\tsizeof(struct rte_crypto_asym_op));\n+\t\t}\n \t}\n \n \treturn NULL;\n@@ -405,6 +420,24 @@ rte_crypto_op_attach_sym_session(struct rte_crypto_op *op,\n \treturn __rte_crypto_sym_op_attach_sym_session(op->sym, sess);\n }\n \n+/**\n+ * Attach a asymmetric session to a crypto operation\n+ *\n+ * @param\top\tcrypto operation, must be of type asymmetric\n+ * @param\tsess\tcryptodev session\n+ */\n+static inline int\n+rte_crypto_op_attach_asym_session(struct rte_crypto_op *op,\n+\t\tstruct rte_cryptodev_asym_session *sess)\n+{\n+\tif (unlikely(op->type != RTE_CRYPTO_OP_TYPE_ASYMMETRIC))\n+\t\treturn -1;\n+\n+\top->sess_type = RTE_CRYPTO_OP_WITH_SESSION;\n+\top->asym->session = sess;\n+\treturn 0;\n+}\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c\nindex fd1e738..da0d322 100644\n--- a/lib/librte_cryptodev/rte_cryptodev.c\n+++ b/lib/librte_cryptodev/rte_cryptodev.c\n@@ -166,6 +166,31 @@ rte_crypto_aead_operation_strings[] = {\n \t[RTE_CRYPTO_AEAD_OP_DECRYPT]\t= \"decrypt\"\n };\n \n+/**\n+ * Asymmetric crypto transform operation strings identifiers.\n+ */\n+const char *rte_crypto_asym_xform_strings[] = {\n+\t[RTE_CRYPTO_ASYM_XFORM_NONE]\t= \"none\",\n+\t[RTE_CRYPTO_ASYM_XFORM_RSA]\t= \"rsa\",\n+\t[RTE_CRYPTO_ASYM_XFORM_MODEX]\t= \"modexp\",\n+\t[RTE_CRYPTO_ASYM_XFORM_MODINV]\t= \"modinv\",\n+\t[RTE_CRYPTO_ASYM_XFORM_DH]\t= \"dh\",\n+\t[RTE_CRYPTO_ASYM_XFORM_DSA]\t= \"dsa\",\n+};\n+\n+/**\n+ * Asymmetric crypto operation strings identifiers.\n+ */\n+const char *rte_crypto_asym_op_strings[] = {\n+\t[RTE_CRYPTO_ASYM_OP_ENCRYPT]\t= \"encrypt\",\n+\t[RTE_CRYPTO_ASYM_OP_DECRYPT]\t= \"decrypt\",\n+\t[RTE_CRYPTO_ASYM_OP_SIGN]\t= \"sign\",\n+\t[RTE_CRYPTO_ASYM_OP_VERIFY]\t= \"verify\",\n+\t[RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE]\t= \"priv_key_generate\",\n+\t[RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE] = \"pub_key_generate\",\n+\t[RTE_CRYPTO_ASYM_OP_SHARED_SECRET_COMPUTE] = \"sharedsecret_compute\",\n+};\n+\n int\n rte_cryptodev_get_cipher_algo_enum(enum rte_crypto_cipher_algorithm *algo_enum,\n \t\tconst char *algo_string)\n@@ -1079,6 +1104,41 @@ rte_cryptodev_sym_session_init(uint8_t dev_id,\n \treturn 0;\n }\n \n+int __rte_experimental\n+rte_cryptodev_asym_session_init(uint8_t dev_id,\n+\t\tstruct rte_cryptodev_asym_session *sess,\n+\t\tstruct rte_crypto_asym_xform *xforms,\n+\t\tstruct rte_mempool *mp)\n+{\n+\tstruct rte_cryptodev *dev;\n+\tuint8_t index;\n+\tint ret;\n+\n+\tdev = rte_cryptodev_pmd_get_dev(dev_id);\n+\n+\tif (sess == NULL || xforms == NULL || dev == NULL)\n+\t\treturn -EINVAL;\n+\n+\tindex = dev->driver_id;\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->asym_session_configure,\n+\t\t\t\t-ENOTSUP);\n+\n+\tif (sess->sess_private_data[index] == NULL) {\n+\t\tret = dev->dev_ops->asym_session_configure(dev,\n+\t\t\t\t\t\t\txforms,\n+\t\t\t\t\t\t\tsess, mp);\n+\t\tif (ret < 0) {\n+\t\t\tCDEV_LOG_ERR(\n+\t\t\t\t\"dev_id %d failed to configure session details\",\n+\t\t\t\tdev_id);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n struct rte_cryptodev_sym_session *\n rte_cryptodev_sym_session_create(struct rte_mempool *mp)\n {\n@@ -1098,6 +1158,25 @@ rte_cryptodev_sym_session_create(struct rte_mempool *mp)\n \treturn sess;\n }\n \n+struct rte_cryptodev_asym_session * __rte_experimental\n+rte_cryptodev_asym_session_create(struct rte_mempool *mp)\n+{\n+\tstruct rte_cryptodev_asym_session *sess;\n+\n+\t/* Allocate a session structure from the session pool */\n+\tif (rte_mempool_get(mp, (void **)&sess)) {\n+\t\tCDEV_LOG_ERR(\"couldn't get object from session mempool\");\n+\t\treturn NULL;\n+\t}\n+\n+\t/* Clear device session pointer.\n+\t * Include the flag indicating presence of private data\n+\t */\n+\tmemset(sess, 0, (sizeof(void *) * nb_drivers) + sizeof(uint8_t));\n+\n+\treturn sess;\n+}\n+\n int\n rte_cryptodev_sym_session_clear(uint8_t dev_id,\n \t\tstruct rte_cryptodev_sym_session *sess)\n@@ -1116,6 +1195,24 @@ rte_cryptodev_sym_session_clear(uint8_t dev_id,\n \treturn 0;\n }\n \n+int __rte_experimental\n+rte_cryptodev_asym_session_clear(uint8_t dev_id,\n+\t\tstruct rte_cryptodev_asym_session *sess)\n+{\n+\tstruct rte_cryptodev *dev;\n+\n+\tdev = rte_cryptodev_pmd_get_dev(dev_id);\n+\n+\tif (dev == NULL || sess == NULL)\n+\t\treturn -EINVAL;\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->asym_session_clear, -ENOTSUP);\n+\n+\tdev->dev_ops->asym_session_clear(dev, sess);\n+\n+\treturn 0;\n+}\n+\n int\n rte_cryptodev_sym_session_free(struct rte_cryptodev_sym_session *sess)\n {\n@@ -1140,6 +1237,31 @@ rte_cryptodev_sym_session_free(struct rte_cryptodev_sym_session *sess)\n \treturn 0;\n }\n \n+int __rte_experimental\n+rte_cryptodev_asym_session_free(struct rte_cryptodev_asym_session *sess)\n+{\n+\tuint8_t i;\n+\tvoid *sess_priv;\n+\tstruct rte_mempool *sess_mp;\n+\n+\tif (sess == NULL)\n+\t\treturn -EINVAL;\n+\n+\t/* Check that all device private data has been freed */\n+\tfor (i = 0; i < nb_drivers; i++) {\n+\t\tsess_priv = get_asym_session_private_data(sess, i);\n+\t\tif (sess_priv != NULL)\n+\t\t\treturn -EBUSY;\n+\t}\n+\n+\t/* Return session to mempool */\n+\tsess_mp = rte_mempool_from_obj(sess);\n+\trte_mempool_put(sess_mp, sess);\n+\n+\treturn 0;\n+}\n+\n+\n unsigned int\n rte_cryptodev_sym_get_header_session_size(void)\n {\n@@ -1151,6 +1273,17 @@ rte_cryptodev_sym_get_header_session_size(void)\n \treturn ((sizeof(void *) * nb_drivers) + sizeof(uint8_t));\n }\n \n+unsigned int __rte_experimental\n+rte_cryptodev_asym_get_header_session_size(void)\n+{\n+\t/*\n+\t * Header contains pointers to the private data\n+\t * of all registered drivers, and a flag which\n+\t * indicates presence of private data\n+\t */\n+\treturn ((sizeof(void *) * nb_drivers) + sizeof(uint8_t));\n+}\n+\n unsigned int\n rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)\n {\n@@ -1180,6 +1313,29 @@ rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)\n \n }\n \n+unsigned int __rte_experimental\n+rte_cryptodev_asym_get_private_session_size(uint8_t dev_id)\n+{\n+\tstruct rte_cryptodev *dev;\n+\tunsigned int header_size = sizeof(void *) * nb_drivers;\n+\tunsigned int priv_sess_size;\n+\n+\tif (!rte_cryptodev_pmd_is_valid_dev(dev_id))\n+\t\treturn 0;\n+\n+\tdev = rte_cryptodev_pmd_get_dev(dev_id);\n+\n+\tif (*dev->dev_ops->asym_session_get_size == NULL)\n+\t\treturn 0;\n+\n+\tpriv_sess_size = (*dev->dev_ops->asym_session_get_size)(dev);\n+\tif (priv_sess_size < header_size)\n+\t\treturn header_size;\n+\n+\treturn priv_sess_size;\n+\n+}\n+\n int __rte_experimental\n rte_cryptodev_sym_session_set_user_data(\n \t\t\t\t\tstruct rte_cryptodev_sym_session *sess,\n@@ -1239,9 +1395,17 @@ rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,\n \tstruct rte_crypto_op_pool_private *priv;\n \n \tunsigned elt_size = sizeof(struct rte_crypto_op) +\n-\t\t\tsizeof(struct rte_crypto_sym_op) +\n \t\t\tpriv_size;\n \n+\tif (type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {\n+\t\telt_size += sizeof(struct rte_crypto_sym_op);\n+\t} else if (type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {\n+\t\telt_size += sizeof(struct rte_crypto_asym_op);\n+\t} else {\n+\t\tCDEV_LOG_ERR(\"Invalid op_type\\n\");\n+\t\treturn NULL;\n+\t}\n+\n \t/* lookup mempool in case already allocated */\n \tstruct rte_mempool *mp = rte_mempool_lookup(name);\n \ndiff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h\nindex 4b279f8..f93dc71 100644\n--- a/lib/librte_cryptodev/rte_cryptodev.h\n+++ b/lib/librte_cryptodev/rte_cryptodev.h\n@@ -848,9 +848,14 @@ rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,\n  */\n struct rte_cryptodev_sym_session {\n \t__extension__ void *sess_private_data[0];\n-\t/**< Private session material */\n+\t/**< Private symmetric session material */\n };\n \n+/** Cryptodev asymmetric crypto session */\n+struct rte_cryptodev_asym_session {\n+\t__extension__ void *sess_private_data[0];\n+\t/**< Private asymmetric session material */\n+};\n \n /**\n  * Create symmetric crypto session header (generic with no private data)\n@@ -865,6 +870,18 @@ struct rte_cryptodev_sym_session *\n rte_cryptodev_sym_session_create(struct rte_mempool *mempool);\n \n /**\n+ * Create asymmetric crypto session header (generic with no private data)\n+ *\n+ * @param   mempool    mempool to allocate asymmetric session\n+ *                     objects from\n+ * @return\n+ *  - On success return pointer to asym-session\n+ *  - On failure returns NULL\n+ */\n+struct rte_cryptodev_asym_session * __rte_experimental\n+rte_cryptodev_asym_session_create(struct rte_mempool *mempool);\n+\n+/**\n  * Frees symmetric crypto session header, after checking that all\n  * the device private data has been freed, returning it\n  * to its original mempool.\n@@ -880,6 +897,21 @@ int\n rte_cryptodev_sym_session_free(struct rte_cryptodev_sym_session *sess);\n \n /**\n+ * Frees asymmetric crypto session header, after checking that all\n+ * the device private data has been freed, returning it\n+ * to its original mempool.\n+ *\n+ * @param   sess     Session header to be freed.\n+ *\n+ * @return\n+ *  - 0 if successful.\n+ *  - -EINVAL if session is NULL.\n+ *  - -EBUSY if not all device private data has been freed.\n+ */\n+int __rte_experimental\n+rte_cryptodev_asym_session_free(struct rte_cryptodev_asym_session *sess);\n+\n+/**\n  * Fill out private data for the device id, based on its device type.\n  *\n  * @param   dev_id   ID of device that we want the session to be used on\n@@ -902,6 +934,27 @@ rte_cryptodev_sym_session_init(uint8_t dev_id,\n \t\t\tstruct rte_mempool *mempool);\n \n /**\n+ * Initialize asymmetric session on a device with specific asymmetric xform\n+ *\n+ * @param   dev_id   ID of device that we want the session to be used on\n+ * @param   sess     Session to be set up on a device\n+ * @param   xforms   Asymmetric crypto transform operations to apply on flow\n+ *                   processed with this session\n+ * @param   mempool  Mempool to be used for internal allocation.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - -EINVAL if input parameters are invalid.\n+ *  - -ENOTSUP if crypto device does not support the crypto transform.\n+ *  - -ENOMEM if the private session could not be allocated.\n+ */\n+int __rte_experimental\n+rte_cryptodev_asym_session_init(uint8_t dev_id,\n+\t\t\tstruct rte_cryptodev_asym_session *sess,\n+\t\t\tstruct rte_crypto_asym_xform *xforms,\n+\t\t\tstruct rte_mempool *mempool);\n+\n+/**\n  * Frees private data for the device id, based on its device type,\n  * returning it to its mempool. It is the application's responsibility\n  * to ensure that private session data is not cleared while there are\n@@ -920,6 +973,20 @@ rte_cryptodev_sym_session_clear(uint8_t dev_id,\n \t\t\tstruct rte_cryptodev_sym_session *sess);\n \n /**\n+ * Frees resources held by asymmetric session during rte_cryptodev_session_init\n+ *\n+ * @param   dev_id   ID of device that uses the asymmetric session.\n+ * @param   sess     Asymmetric session setup on device using\n+ *\t\t\t\t\t rte_cryptodev_session_init\n+ * @return\n+ *  - 0 if successful.\n+ *  - -EINVAL if device is invalid or session is NULL.\n+ */\n+int __rte_experimental\n+rte_cryptodev_asym_session_clear(uint8_t dev_id,\n+\t\t\tstruct rte_cryptodev_asym_session *sess);\n+\n+/**\n  * Get the size of the header session, for all registered drivers.\n  *\n  * @return\n@@ -929,6 +996,15 @@ unsigned int\n rte_cryptodev_sym_get_header_session_size(void);\n \n /**\n+ * Get the size of the asymmetric session header, for all registered drivers.\n+ *\n+ * @return\n+ *   Size of the asymmetric header session.\n+ */\n+unsigned int __rte_experimental\n+rte_cryptodev_asym_get_header_session_size(void);\n+\n+/**\n  * Get the size of the private symmetric session data\n  * for a device.\n  *\n@@ -943,6 +1019,19 @@ unsigned int\n rte_cryptodev_sym_get_private_session_size(uint8_t dev_id);\n \n /**\n+ * Get the size of the private data for asymmetric session\n+ * on device\n+ *\n+ * @param\tdev_id\t\tThe device identifier.\n+ *\n+ * @return\n+ *   - Size of the asymmetric private data, if successful\n+ *   - 0 if device is invalid or does not have private session\n+ */\n+unsigned int __rte_experimental\n+rte_cryptodev_asym_get_private_session_size(uint8_t dev_id);\n+\n+/**\n  * Provide driver identifier.\n  *\n  * @param name\ndiff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/librte_cryptodev/rte_cryptodev_pmd.h\nindex ac6a1c4..92763d7 100644\n--- a/lib/librte_cryptodev/rte_cryptodev_pmd.h\n+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.h\n@@ -249,6 +249,17 @@ typedef int (*cryptodev_sym_create_session_pool_t)(\n  */\n typedef unsigned (*cryptodev_sym_get_session_private_size_t)(\n \t\tstruct rte_cryptodev *dev);\n+/**\n+ * Get the size of a asymmetric cryptodev session\n+ *\n+ * @param\tdev\t\tCrypto device pointer\n+ *\n+ * @return\n+ *  - On success returns the size of the session structure for device\n+ *  - On failure returns 0\n+ */\n+typedef unsigned int (*cryptodev_asym_get_session_private_size_t)(\n+\t\tstruct rte_cryptodev *dev);\n \n /**\n  * Configure a Crypto session on a device.\n@@ -268,7 +279,24 @@ typedef int (*cryptodev_sym_configure_session_t)(struct rte_cryptodev *dev,\n \t\tstruct rte_crypto_sym_xform *xform,\n \t\tstruct rte_cryptodev_sym_session *session,\n \t\tstruct rte_mempool *mp);\n-\n+/**\n+ * Configure a Crypto asymmetric session on a device.\n+ *\n+ * @param\tdev\t\tCrypto device pointer\n+ * @param\txform\t\tSingle or chain of crypto xforms\n+ * @param\tpriv_sess\tPointer to cryptodev's private session structure\n+ * @param\tmp\t\tMempool where the private session is allocated\n+ *\n+ * @return\n+ *  - Returns 0 if private session structure have been created successfully.\n+ *  - Returns -EINVAL if input parameters are invalid.\n+ *  - Returns -ENOTSUP if crypto device does not support the crypto transform.\n+ *  - Returns -ENOMEM if the private session could not be allocated.\n+ */\n+typedef int (*cryptodev_asym_configure_session_t)(struct rte_cryptodev *dev,\n+\t\tstruct rte_crypto_asym_xform *xform,\n+\t\tstruct rte_cryptodev_asym_session *session,\n+\t\tstruct rte_mempool *mp);\n /**\n  * Free driver private session data.\n  *\n@@ -277,6 +305,14 @@ typedef int (*cryptodev_sym_configure_session_t)(struct rte_cryptodev *dev,\n  */\n typedef void (*cryptodev_sym_free_session_t)(struct rte_cryptodev *dev,\n \t\tstruct rte_cryptodev_sym_session *sess);\n+/**\n+ * Free asymmetric session private data.\n+ *\n+ * @param\tdev\t\tCrypto device pointer\n+ * @param\tsess\t\tCryptodev session structure\n+ */\n+typedef void (*cryptodev_asym_free_session_t)(struct rte_cryptodev *dev,\n+\t\tstruct rte_cryptodev_asym_session *sess);\n \n /** Crypto device operations function pointer table */\n struct rte_cryptodev_ops {\n@@ -301,10 +337,16 @@ struct rte_cryptodev_ops {\n \n \tcryptodev_sym_get_session_private_size_t sym_session_get_size;\n \t/**< Return private session. */\n+\tcryptodev_asym_get_session_private_size_t asym_session_get_size;\n+\t/**< Return asym session private size. */\n \tcryptodev_sym_configure_session_t sym_session_configure;\n \t/**< Configure a Crypto session. */\n+\tcryptodev_asym_configure_session_t asym_session_configure;\n+\t/**< Configure asymmetric Crypto session. */\n \tcryptodev_sym_free_session_t sym_session_clear;\n \t/**< Clear a Crypto sessions private data. */\n+\tcryptodev_asym_free_session_t asym_session_clear;\n+\t/**< Clear a Crypto sessions private data. */\n };\n \n \n@@ -448,6 +490,19 @@ set_sym_session_private_data(struct rte_cryptodev_sym_session *sess,\n \tsess->sess_private_data[driver_id] = private_data;\n }\n \n+static inline void *\n+get_asym_session_private_data(const struct rte_cryptodev_asym_session *sess,\n+\t\tuint8_t driver_id) {\n+\treturn sess->sess_private_data[driver_id];\n+}\n+\n+static inline void\n+set_asym_session_private_data(struct rte_cryptodev_asym_session *sess,\n+\t\tuint8_t driver_id, void *private_data)\n+{\n+\tsess->sess_private_data[driver_id] = private_data;\n+}\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map\nindex 93c7090..e63b51a 100644\n--- a/lib/librte_cryptodev/rte_cryptodev_version.map\n+++ b/lib/librte_cryptodev/rte_cryptodev_version.map\n@@ -91,6 +91,12 @@ DPDK_18.05 {\n EXPERIMENTAL {\n         global:\n \n+\trte_cryptodev_asym_get_header_session_size;\n+\trte_cryptodev_asym_get_private_session_size;\n+\trte_cryptodev_asym_session_clear;\n+\trte_cryptodev_asym_session_create;\n+\trte_cryptodev_asym_session_free;\n+\trte_cryptodev_asym_session_init;\n \trte_cryptodev_sym_session_get_user_data;\n \trte_cryptodev_sym_session_set_user_data;\n };\n",
    "prefixes": [
        "v5",
        "2/4"
    ]
}