get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 66307,
    "url": "http://patches.dpdk.org/api/patches/66307/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200305153454.724874-5-pablo.de.lara.guarch@intel.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": "<20200305153454.724874-5-pablo.de.lara.guarch@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200305153454.724874-5-pablo.de.lara.guarch@intel.com",
    "date": "2020-03-05T15:34:53",
    "name": "[RFC,4/5] crypto/aesni_mb: support IPSec MB library v0.53",
    "commit_ref": null,
    "pull_url": null,
    "state": "not-applicable",
    "archived": true,
    "hash": "fdb99214a91183f452a350cd7753c6f104520d1f",
    "submitter": {
        "id": 9,
        "url": "http://patches.dpdk.org/api/people/9/?format=api",
        "name": "De Lara Guarch, Pablo",
        "email": "pablo.de.lara.guarch@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200305153454.724874-5-pablo.de.lara.guarch@intel.com/mbox/",
    "series": [
        {
            "id": 8802,
            "url": "http://patches.dpdk.org/api/series/8802/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8802",
            "date": "2020-03-05T15:34:49",
            "name": "Support Intel IPSec MB v0.53 in DPDK 18.11",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8802/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/66307/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/66307/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 58AFDA0564;\n\tThu,  5 Mar 2020 18:10:26 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 8C9531BFFE;\n\tThu,  5 Mar 2020 18:09:45 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by dpdk.org (Postfix) with ESMTP id 460491BFE2\n for <dev@dpdk.org>; Thu,  5 Mar 2020 18:09:41 +0100 (CET)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n 05 Mar 2020 09:09:40 -0800",
            "from silpixa00400565.ir.intel.com (HELO\n silpixa00400565.ger.corp.intel.com) ([10.237.222.249])\n by fmsmga002.fm.intel.com with ESMTP; 05 Mar 2020 09:09:39 -0800"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.70,518,1574150400\"; d=\"scan'208\";a=\"275173399\"",
        "From": "Pablo de Lara <pablo.de.lara.guarch@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "Pablo de Lara <pablo.de.lara.guarch@intel.com>",
        "Date": "Thu,  5 Mar 2020 15:34:53 +0000",
        "Message-Id": "<20200305153454.724874-5-pablo.de.lara.guarch@intel.com>",
        "X-Mailer": "git-send-email 2.24.1",
        "In-Reply-To": "<20200305153454.724874-1-pablo.de.lara.guarch@intel.com>",
        "References": "<20200305153454.724874-1-pablo.de.lara.guarch@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [RFC PATCH 4/5] crypto/aesni_mb: support IPSec MB\n\tlibrary v0.53",
        "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": "Add support for underlying IPSec Multi-buffer library v0.53.\n\nSigned-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>\n---\n drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c    | 476 ++++++++++++------\n .../crypto/aesni_mb/rte_aesni_mb_pmd_ops.c    | 205 +++++---\n .../aesni_mb/rte_aesni_mb_pmd_private.h       |  30 +-\n 3 files changed, 489 insertions(+), 222 deletions(-)",
    "diff": "diff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\nindex 83250e32c..9dfa89f71 100644\n--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n@@ -35,7 +35,7 @@ typedef void (*aes_keyexp_t)(const void *key, void *enc_exp_keys, void *dec_exp_\n static void\n calculate_auth_precomputes(hash_one_block_t one_block_hash,\n \t\tuint8_t *ipad, uint8_t *opad,\n-\t\tuint8_t *hkey, uint16_t hkey_len,\n+\t\tconst uint8_t *hkey, uint16_t hkey_len,\n \t\tuint16_t blocksize)\n {\n \tunsigned i, length;\n@@ -85,6 +85,25 @@ aesni_mb_get_chain_order(const struct rte_crypto_sym_xform *xform)\n \t\t\treturn AESNI_MB_OP_HASH_CIPHER;\n \t}\n \n+#if IMB_VERSION_NUM > IMB_VERSION(0, 52, 0)\n+\tif (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD) {\n+\t\tif (xform->aead.op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {\n+\t\t\t/*\n+\t\t\t * CCM requires to hash first and cipher later\n+\t\t\t * when encrypting\n+\t\t\t */\n+\t\t\tif (xform->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)\n+\t\t\t\treturn AESNI_MB_OP_AEAD_HASH_CIPHER;\n+\t\t\telse\n+\t\t\t\treturn AESNI_MB_OP_AEAD_CIPHER_HASH;\n+\t\t} else {\n+\t\t\tif (xform->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)\n+\t\t\t\treturn AESNI_MB_OP_AEAD_CIPHER_HASH;\n+\t\t\telse\n+\t\t\t\treturn AESNI_MB_OP_AEAD_HASH_CIPHER;\n+\t\t}\n+\t}\n+#else\n \tif (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD) {\n \t\tif (xform->aead.algo == RTE_CRYPTO_AEAD_AES_CCM ||\n \t\t\t\txform->aead.algo == RTE_CRYPTO_AEAD_AES_GCM) {\n@@ -94,19 +113,21 @@ aesni_mb_get_chain_order(const struct rte_crypto_sym_xform *xform)\n \t\t\t\treturn AESNI_MB_OP_AEAD_HASH_CIPHER;\n \t\t}\n \t}\n+#endif\n \n \treturn AESNI_MB_OP_NOT_SUPPORTED;\n }\n \n /** Set session authentication parameters */\n static int\n-aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n+aesni_mb_set_session_auth_parameters(const MB_MGR *mb_mgr,\n \t\tstruct aesni_mb_session *sess,\n \t\tconst struct rte_crypto_sym_xform *xform)\n {\n-\thash_one_block_t hash_oneblock_fn;\n+\thash_one_block_t hash_oneblock_fn = NULL;\n \tunsigned int key_larger_block_size = 0;\n \tuint8_t hashed_key[HMAC_MAX_BLOCK_SIZE] = { 0 };\n+\tuint32_t auth_precompute = 1;\n \n \tif (xform == NULL) {\n \t\tsess->auth.algo = NULL_HASH;\n@@ -135,13 +156,16 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t\treturn -EINVAL;\n \t\t}\n \t\tsess->auth.gen_digest_len = sess->auth.req_digest_len;\n-\t\t(*mb_ops->aux.keyexp.aes_xcbc)(xform->auth.key.data,\n+\n+\t\tIMB_AES_XCBC_KEYEXP(mb_mgr, xform->auth.key.data,\n \t\t\t\tsess->auth.xcbc.k1_expanded,\n \t\t\t\tsess->auth.xcbc.k2, sess->auth.xcbc.k3);\n \t\treturn 0;\n \t}\n \n \tif (xform->auth.algo == RTE_CRYPTO_AUTH_AES_CMAC) {\n+\t\tuint32_t dust[4*15];\n+\n \t\tsess->auth.algo = AES_CMAC;\n \n \t\tuint16_t cmac_digest_len = get_digest_byte_length(AES_CMAC);\n@@ -150,102 +174,144 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid digest size\\n\");\n \t\t\treturn -EINVAL;\n \t\t}\n+\t\tif (sess->auth.req_digest_len < 4)\n+\t\t\tsess->auth.gen_digest_len = cmac_digest_len;\n+\t\telse\n+\t\t\tsess->auth.gen_digest_len = sess->auth.req_digest_len;\n+\t\tIMB_AES_KEYEXP_128(mb_mgr, xform->auth.key.data,\n+\t\t\t\tsess->auth.cmac.expkey, dust);\n+\t\tIMB_AES_CMAC_SUBKEY_GEN_128(mb_mgr, sess->auth.cmac.expkey,\n+\t\t\t\tsess->auth.cmac.skey1, sess->auth.cmac.skey2);\n+\t\treturn 0;\n+\t}\n+\n+\tif (xform->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC) {\n+\t\tif (xform->auth.op == RTE_CRYPTO_AUTH_OP_GENERATE) {\n+\t\t\tsess->cipher.direction = ENCRYPT;\n+\t\t\tsess->chain_order = CIPHER_HASH;\n+\t\t} else\n+\t\t\tsess->cipher.direction = DECRYPT;\n+\n+\t\tsess->auth.algo = AES_GMAC;\n \t\t/*\n-\t\t * Multi-buffer lib supports digest sizes from 4 to 16 bytes\n-\t\t * in version 0.50 and sizes of 12 and 16 bytes,\n-\t\t * in version 0.49.\n+\t\t * Multi-buffer lib supports 8, 12 and 16 bytes of digest.\n \t\t * If size requested is different, generate the full digest\n \t\t * (16 bytes) in a temporary location and then memcpy\n \t\t * the requested number of bytes.\n \t\t */\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n-\t\tif (sess->auth.req_digest_len < 4)\n-#else\n-\t\tuint16_t cmac_trunc_digest_len =\n-\t\t\t\tget_truncated_digest_byte_length(AES_CMAC);\n-\t\tif (sess->auth.req_digest_len != cmac_digest_len &&\n-\t\t\t\tsess->auth.req_digest_len != cmac_trunc_digest_len)\n-#endif\n-\t\t\tsess->auth.gen_digest_len = cmac_digest_len;\n-\t\telse\n+\t\tif (sess->auth.req_digest_len != 16 &&\n+\t\t\t\tsess->auth.req_digest_len != 12 &&\n+\t\t\t\tsess->auth.req_digest_len != 8) {\n+\t\t\tsess->auth.gen_digest_len = 16;\n+\t\t} else {\n \t\t\tsess->auth.gen_digest_len = sess->auth.req_digest_len;\n-\t\t(*mb_ops->aux.keyexp.aes_cmac_expkey)(xform->auth.key.data,\n-\t\t\t\tsess->auth.cmac.expkey);\n+\t\t}\n+\t\tsess->iv.length = xform->auth.iv.length;\n+\t\tsess->iv.offset = xform->auth.iv.offset;\n+\n+\t\tswitch (xform->auth.key.length) {\n+\t\tcase AES_128_BYTES:\n+\t\t\tIMB_AES128_GCM_PRE(mb_mgr, xform->auth.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n+\t\t\tsess->cipher.key_length_in_bytes = AES_128_BYTES;\n+\t\t\tbreak;\n+\t\tcase AES_192_BYTES:\n+\t\t\tIMB_AES192_GCM_PRE(mb_mgr, xform->auth.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n+\t\t\tsess->cipher.key_length_in_bytes = AES_192_BYTES;\n+\t\t\tbreak;\n+\t\tcase AES_256_BYTES:\n+\t\t\tIMB_AES256_GCM_PRE(mb_mgr, xform->auth.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n+\t\t\tsess->cipher.key_length_in_bytes = AES_256_BYTES;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tRTE_LOG(ERR, PMD, \"failed to parse test type\\n\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n \n-\t\t(*mb_ops->aux.keyexp.aes_cmac_subkey)(sess->auth.cmac.expkey,\n-\t\t\t\tsess->auth.cmac.skey1, sess->auth.cmac.skey2);\n \t\treturn 0;\n \t}\n \n \tswitch (xform->auth.algo) {\n \tcase RTE_CRYPTO_AUTH_MD5_HMAC:\n \t\tsess->auth.algo = MD5;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.md5;\n+\t\thash_oneblock_fn = mb_mgr->md5_one_block;\n \t\tbreak;\n \tcase RTE_CRYPTO_AUTH_SHA1_HMAC:\n \t\tsess->auth.algo = SHA1;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.sha1;\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n+\t\thash_oneblock_fn = mb_mgr->sha1_one_block;\n \t\tif (xform->auth.key.length > get_auth_algo_blocksize(SHA1)) {\n-\t\t\tmb_ops->aux.multi_block.sha1(\n+\t\t\tIMB_SHA1(mb_mgr,\n \t\t\t\txform->auth.key.data,\n \t\t\t\txform->auth.key.length,\n \t\t\t\thashed_key);\n \t\t\tkey_larger_block_size = 1;\n \t\t}\n-#endif\n+\t\tbreak;\n+\tcase RTE_CRYPTO_AUTH_SHA1:\n+\t\tsess->auth.algo = PLAIN_SHA1;\n+\t\tauth_precompute = 0;\n \t\tbreak;\n \tcase RTE_CRYPTO_AUTH_SHA224_HMAC:\n \t\tsess->auth.algo = SHA_224;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.sha224;\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n+\t\thash_oneblock_fn = mb_mgr->sha224_one_block;\n \t\tif (xform->auth.key.length > get_auth_algo_blocksize(SHA_224)) {\n-\t\t\tmb_ops->aux.multi_block.sha224(\n+\t\t\tIMB_SHA224(mb_mgr,\n \t\t\t\txform->auth.key.data,\n \t\t\t\txform->auth.key.length,\n \t\t\t\thashed_key);\n \t\t\tkey_larger_block_size = 1;\n \t\t}\n-#endif\n+\t\tbreak;\n+\tcase RTE_CRYPTO_AUTH_SHA224:\n+\t\tsess->auth.algo = PLAIN_SHA_224;\n+\t\tauth_precompute = 0;\n \t\tbreak;\n \tcase RTE_CRYPTO_AUTH_SHA256_HMAC:\n \t\tsess->auth.algo = SHA_256;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.sha256;\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n+\t\thash_oneblock_fn = mb_mgr->sha256_one_block;\n \t\tif (xform->auth.key.length > get_auth_algo_blocksize(SHA_256)) {\n-\t\t\tmb_ops->aux.multi_block.sha256(\n+\t\t\tIMB_SHA256(mb_mgr,\n \t\t\t\txform->auth.key.data,\n \t\t\t\txform->auth.key.length,\n \t\t\t\thashed_key);\n \t\t\tkey_larger_block_size = 1;\n \t\t}\n-#endif\n+\t\tbreak;\n+\tcase RTE_CRYPTO_AUTH_SHA256:\n+\t\tsess->auth.algo = PLAIN_SHA_256;\n+\t\tauth_precompute = 0;\n \t\tbreak;\n \tcase RTE_CRYPTO_AUTH_SHA384_HMAC:\n \t\tsess->auth.algo = SHA_384;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.sha384;\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n+\t\thash_oneblock_fn = mb_mgr->sha384_one_block;\n \t\tif (xform->auth.key.length > get_auth_algo_blocksize(SHA_384)) {\n-\t\t\tmb_ops->aux.multi_block.sha384(\n+\t\t\tIMB_SHA384(mb_mgr,\n \t\t\t\txform->auth.key.data,\n \t\t\t\txform->auth.key.length,\n \t\t\t\thashed_key);\n \t\t\tkey_larger_block_size = 1;\n \t\t}\n-#endif\n+\t\tbreak;\n+\tcase RTE_CRYPTO_AUTH_SHA384:\n+\t\tsess->auth.algo = PLAIN_SHA_384;\n+\t\tauth_precompute = 0;\n \t\tbreak;\n \tcase RTE_CRYPTO_AUTH_SHA512_HMAC:\n \t\tsess->auth.algo = SHA_512;\n-\t\thash_oneblock_fn = mb_ops->aux.one_block.sha512;\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n+\t\thash_oneblock_fn = mb_mgr->sha512_one_block;\n \t\tif (xform->auth.key.length > get_auth_algo_blocksize(SHA_512)) {\n-\t\t\tmb_ops->aux.multi_block.sha512(\n+\t\t\tIMB_SHA512(mb_mgr,\n \t\t\t\txform->auth.key.data,\n \t\t\t\txform->auth.key.length,\n \t\t\t\thashed_key);\n \t\t\tkey_larger_block_size = 1;\n \t\t}\n-#endif\n+\t\tbreak;\n+\tcase RTE_CRYPTO_AUTH_SHA512:\n+\t\tsess->auth.algo = PLAIN_SHA_512;\n+\t\tauth_precompute = 0;\n \t\tbreak;\n \tdefault:\n \t\tAESNI_MB_LOG(ERR, \"Unsupported authentication algorithm selection\");\n@@ -256,12 +322,8 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n \tuint16_t full_digest_size =\n \t\t\tget_digest_byte_length(sess->auth.algo);\n \n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \tif (sess->auth.req_digest_len > full_digest_size ||\n \t\t\tsess->auth.req_digest_len == 0) {\n-#else\n-\tif (sess->auth.req_digest_len != trunc_digest_size) {\n-#endif\n \t\tAESNI_MB_LOG(ERR, \"Invalid digest size\\n\");\n \t\treturn -EINVAL;\n \t}\n@@ -272,6 +334,10 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n \telse\n \t\tsess->auth.gen_digest_len = sess->auth.req_digest_len;\n \n+\t/* Plain SHA does not require precompute key */\n+\tif (auth_precompute == 0)\n+\t\treturn 0;\n+\n \t/* Calculate Authentication precomputes */\n \tif (key_larger_block_size) {\n \t\tcalculate_auth_precomputes(hash_oneblock_fn,\n@@ -292,13 +358,12 @@ aesni_mb_set_session_auth_parameters(const struct aesni_mb_op_fns *mb_ops,\n \n /** Set session cipher parameters */\n static int\n-aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n+aesni_mb_set_session_cipher_parameters(const MB_MGR *mb_mgr,\n \t\tstruct aesni_mb_session *sess,\n \t\tconst struct rte_crypto_sym_xform *xform)\n {\n \tuint8_t is_aes = 0;\n \tuint8_t is_3DES = 0;\n-\taes_keyexp_t aes_keyexp_fn;\n \n \tif (xform == NULL) {\n \t\tsess->cipher.mode = NULL_CIPHER;\n@@ -361,26 +426,26 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\tswitch (xform->cipher.key.length) {\n \t\tcase AES_128_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_128_BYTES;\n-\t\t\taes_keyexp_fn = mb_ops->aux.keyexp.aes128;\n+\t\t\tIMB_AES_KEYEXP_128(mb_mgr, xform->cipher.key.data,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n \t\t\tbreak;\n \t\tcase AES_192_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_192_BYTES;\n-\t\t\taes_keyexp_fn = mb_ops->aux.keyexp.aes192;\n+\t\t\tIMB_AES_KEYEXP_192(mb_mgr, xform->cipher.key.data,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n \t\t\tbreak;\n \t\tcase AES_256_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_256_BYTES;\n-\t\t\taes_keyexp_fn = mb_ops->aux.keyexp.aes256;\n+\t\t\tIMB_AES_KEYEXP_256(mb_mgr, xform->cipher.key.data,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid cipher key length\");\n \t\t\treturn -EINVAL;\n \t\t}\n-\n-\t\t/* Expanded cipher keys */\n-\t\t(*aes_keyexp_fn)(xform->cipher.key.data,\n-\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n-\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n-\n \t} else if (is_3DES) {\n \t\tuint64_t *keys[3] = {sess->cipher.exp_3des_keys.key[0],\n \t\t\t\tsess->cipher.exp_3des_keys.key[1],\n@@ -388,9 +453,12 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \n \t\tswitch (xform->cipher.key.length) {\n \t\tcase  24:\n-\t\t\tdes_key_schedule(keys[0], xform->cipher.key.data);\n-\t\t\tdes_key_schedule(keys[1], xform->cipher.key.data+8);\n-\t\t\tdes_key_schedule(keys[2], xform->cipher.key.data+16);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[0],\n+\t\t\t\t\txform->cipher.key.data);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[1],\n+\t\t\t\t\txform->cipher.key.data + 8);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[2],\n+\t\t\t\t\txform->cipher.key.data + 16);\n \n \t\t\t/* Initialize keys - 24 bytes: [K1-K2-K3] */\n \t\t\tsess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];\n@@ -398,8 +466,10 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t\tsess->cipher.exp_3des_keys.ks_ptr[2] = keys[2];\n \t\t\tbreak;\n \t\tcase 16:\n-\t\t\tdes_key_schedule(keys[0], xform->cipher.key.data);\n-\t\t\tdes_key_schedule(keys[1], xform->cipher.key.data+8);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[0],\n+\t\t\t\t\txform->cipher.key.data);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[1],\n+\t\t\t\t\txform->cipher.key.data + 8);\n \n \t\t\t/* Initialize keys - 16 bytes: [K1=K1,K2=K2,K3=K1] */\n \t\t\tsess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];\n@@ -407,7 +477,8 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t\tsess->cipher.exp_3des_keys.ks_ptr[2] = keys[0];\n \t\t\tbreak;\n \t\tcase 8:\n-\t\t\tdes_key_schedule(keys[0], xform->cipher.key.data);\n+\t\t\tIMB_DES_KEYSCHED(mb_mgr, keys[0],\n+\t\t\t\t\txform->cipher.key.data);\n \n \t\t\t/* Initialize keys - 8 bytes: [K1 = K2 = K3] */\n \t\t\tsess->cipher.exp_3des_keys.ks_ptr[0] = keys[0];\n@@ -419,11 +490,7 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t\treturn -EINVAL;\n \t\t}\n \n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\tsess->cipher.key_length_in_bytes = 24;\n-#else\n-\t\tsess->cipher.key_length_in_bytes = 8;\n-#endif\n \t} else {\n \t\tif (xform->cipher.key.length != 8) {\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid cipher key length\");\n@@ -431,9 +498,11 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\t}\n \t\tsess->cipher.key_length_in_bytes = 8;\n \n-\t\tdes_key_schedule((uint64_t *)sess->cipher.expanded_aes_keys.encode,\n+\t\tIMB_DES_KEYSCHED(mb_mgr,\n+\t\t\t(uint64_t *)sess->cipher.expanded_aes_keys.encode,\n \t\t\t\txform->cipher.key.data);\n-\t\tdes_key_schedule((uint64_t *)sess->cipher.expanded_aes_keys.decode,\n+\t\tIMB_DES_KEYSCHED(mb_mgr,\n+\t\t\t(uint64_t *)sess->cipher.expanded_aes_keys.decode,\n \t\t\t\txform->cipher.key.data);\n \t}\n \n@@ -441,15 +510,10 @@ aesni_mb_set_session_cipher_parameters(const struct aesni_mb_op_fns *mb_ops,\n }\n \n static int\n-aesni_mb_set_session_aead_parameters(const struct aesni_mb_op_fns *mb_ops,\n+aesni_mb_set_session_aead_parameters(const MB_MGR *mb_mgr,\n \t\tstruct aesni_mb_session *sess,\n \t\tconst struct rte_crypto_sym_xform *xform)\n {\n-\tunion {\n-\t\taes_keyexp_t aes_keyexp_fn;\n-\t\taes_gcm_keyexp_t aes_gcm_keyexp_fn;\n-\t} keyexp;\n-\n \tswitch (xform->aead.op) {\n \tcase RTE_CRYPTO_AEAD_OP_ENCRYPT:\n \t\tsess->cipher.direction = ENCRYPT;\n@@ -473,17 +537,15 @@ aesni_mb_set_session_aead_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\tswitch (xform->aead.key.length) {\n \t\tcase AES_128_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_128_BYTES;\n-\t\t\tkeyexp.aes_keyexp_fn = mb_ops->aux.keyexp.aes128;\n+\t\t\tIMB_AES_KEYEXP_128(mb_mgr, xform->aead.key.data,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n+\t\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid cipher key length\");\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\t/* Expanded cipher keys */\n-\t\t(*keyexp.aes_keyexp_fn)(xform->aead.key.data,\n-\t\t\t\tsess->cipher.expanded_aes_keys.encode,\n-\t\t\t\tsess->cipher.expanded_aes_keys.decode);\n \t\tbreak;\n \n \tcase RTE_CRYPTO_AEAD_AES_GCM:\n@@ -493,26 +555,24 @@ aesni_mb_set_session_aead_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t\tswitch (xform->aead.key.length) {\n \t\tcase AES_128_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_128_BYTES;\n-\t\t\tkeyexp.aes_gcm_keyexp_fn =\n-\t\t\t\t\tmb_ops->aux.keyexp.aes_gcm_128;\n+\t\t\tIMB_AES128_GCM_PRE(mb_mgr, xform->aead.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n \t\t\tbreak;\n \t\tcase AES_192_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_192_BYTES;\n-\t\t\tkeyexp.aes_gcm_keyexp_fn =\n-\t\t\t\t\tmb_ops->aux.keyexp.aes_gcm_192;\n+\t\t\tIMB_AES192_GCM_PRE(mb_mgr, xform->aead.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n \t\t\tbreak;\n \t\tcase AES_256_BYTES:\n \t\t\tsess->cipher.key_length_in_bytes = AES_256_BYTES;\n-\t\t\tkeyexp.aes_gcm_keyexp_fn =\n-\t\t\t\t\tmb_ops->aux.keyexp.aes_gcm_256;\n+\t\t\tIMB_AES256_GCM_PRE(mb_mgr, xform->aead.key.data,\n+\t\t\t\t&sess->cipher.gcm_key);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid cipher key length\");\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\t(keyexp.aes_gcm_keyexp_fn)(xform->aead.key.data,\n-\t\t\t\t&sess->cipher.gcm_key);\n \t\tbreak;\n \n \tdefault:\n@@ -539,7 +599,7 @@ aesni_mb_set_session_aead_parameters(const struct aesni_mb_op_fns *mb_ops,\n \n /** Parse crypto xform chain and set private session parameters */\n int\n-aesni_mb_set_session_parameters(const struct aesni_mb_op_fns *mb_ops,\n+aesni_mb_set_session_parameters(const MB_MGR *mb_mgr,\n \t\tstruct aesni_mb_session *sess,\n \t\tconst struct rte_crypto_sym_xform *xform)\n {\n@@ -598,13 +658,13 @@ aesni_mb_set_session_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t/* Default IV length = 0 */\n \tsess->iv.length = 0;\n \n-\tret = aesni_mb_set_session_auth_parameters(mb_ops, sess, auth_xform);\n+\tret = aesni_mb_set_session_auth_parameters(mb_mgr, sess, auth_xform);\n \tif (ret != 0) {\n \t\tAESNI_MB_LOG(ERR, \"Invalid/unsupported authentication parameters\");\n \t\treturn ret;\n \t}\n \n-\tret = aesni_mb_set_session_cipher_parameters(mb_ops, sess,\n+\tret = aesni_mb_set_session_cipher_parameters(mb_mgr, sess,\n \t\t\tcipher_xform);\n \tif (ret != 0) {\n \t\tAESNI_MB_LOG(ERR, \"Invalid/unsupported cipher parameters\");\n@@ -612,7 +672,7 @@ aesni_mb_set_session_parameters(const struct aesni_mb_op_fns *mb_ops,\n \t}\n \n \tif (aead_xform) {\n-\t\tret = aesni_mb_set_session_aead_parameters(mb_ops, sess,\n+\t\tret = aesni_mb_set_session_aead_parameters(mb_mgr, sess,\n \t\t\t\taead_xform);\n \t\tif (ret != 0) {\n \t\t\tAESNI_MB_LOG(ERR, \"Invalid/unsupported aead parameters\");\n@@ -673,7 +733,7 @@ get_session(struct aesni_mb_qp *qp, struct rte_crypto_op *op)\n \n \t\tsess = (struct aesni_mb_session *)_sess_private_data;\n \n-\t\tif (unlikely(aesni_mb_set_session_parameters(qp->op_fns,\n+\t\tif (unlikely(aesni_mb_set_session_parameters(qp->mb_mgr,\n \t\t\t\tsess, op->sym->xform) != 0)) {\n \t\t\trte_mempool_put(qp->sess_mp, _sess);\n \t\t\trte_mempool_put(qp->sess_mp, _sess_private_data);\n@@ -690,6 +750,56 @@ get_session(struct aesni_mb_qp *qp, struct rte_crypto_op *op)\n \treturn sess;\n }\n \n+static inline uint64_t\n+auth_start_offset(struct rte_crypto_op *op, struct aesni_mb_session *session,\n+\t\tuint32_t oop)\n+{\n+\tstruct rte_mbuf *m_src, *m_dst;\n+\tuint8_t *p_src, *p_dst;\n+\tuintptr_t u_src, u_dst;\n+\tuint32_t cipher_end, auth_end;\n+\n+\t/* Only cipher then hash needs special calculation. */\n+\tif (!oop || session->chain_order != CIPHER_HASH)\n+\t\treturn op->sym->auth.data.offset;\n+\n+\tm_src = op->sym->m_src;\n+\tm_dst = op->sym->m_dst;\n+\n+\tp_src = rte_pktmbuf_mtod(m_src, uint8_t *);\n+\tp_dst = rte_pktmbuf_mtod(m_dst, uint8_t *);\n+\tu_src = (uintptr_t)p_src;\n+\tu_dst = (uintptr_t)p_dst + op->sym->auth.data.offset;\n+\n+\t/**\n+\t * Copy the content between cipher offset and auth offset for generating\n+\t * correct digest.\n+\t */\n+\tif (op->sym->cipher.data.offset > op->sym->auth.data.offset)\n+\t\tmemcpy(p_dst + op->sym->auth.data.offset,\n+\t\t\t\tp_src + op->sym->auth.data.offset,\n+\t\t\t\top->sym->cipher.data.offset -\n+\t\t\t\top->sym->auth.data.offset);\n+\n+\t/**\n+\t * Copy the content between (cipher offset + length) and (auth offset +\n+\t * length) for generating correct digest\n+\t */\n+\tcipher_end = op->sym->cipher.data.offset + op->sym->cipher.data.length;\n+\tauth_end = op->sym->auth.data.offset + op->sym->auth.data.length;\n+\tif (cipher_end < auth_end)\n+\t\tmemcpy(p_dst + cipher_end, p_src + cipher_end,\n+\t\t\t\tauth_end - cipher_end);\n+\n+\t/**\n+\t * Since intel-ipsec-mb only supports positive values,\n+\t * we need to deduct the correct offset between src and dst.\n+\t */\n+\n+\treturn u_src < u_dst ? (u_dst - u_src) :\n+\t\t\t(UINT64_MAX - u_src + u_dst + 1);\n+}\n+\n /**\n  * Process a crypto operation and complete a JOB_AES_HMAC job structure for\n  * submission to the multi buffer library for processing.\n@@ -708,7 +818,7 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n {\n \tstruct rte_mbuf *m_src = op->sym->m_src, *m_dst;\n \tstruct aesni_mb_session *session;\n-\tuint16_t m_offset = 0;\n+\tuint32_t m_offset, oop;\n \n \tsession = get_session(qp, op);\n \tif (session == NULL) {\n@@ -760,8 +870,16 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n \t\tbreak;\n \n \tcase AES_GMAC:\n-\t\tjob->u.GCM.aad = op->sym->aead.aad.data;\n-\t\tjob->u.GCM.aad_len_in_bytes = session->aead.aad_len;\n+\t\tif (session->cipher.mode == GCM) {\n+\t\t\tjob->u.GCM.aad = op->sym->aead.aad.data;\n+\t\t\tjob->u.GCM.aad_len_in_bytes = session->aead.aad_len;\n+\t\t} else {\n+\t\t\t/* For GMAC */\n+\t\t\tjob->u.GCM.aad = rte_pktmbuf_mtod_offset(m_src,\n+\t\t\t\t\tuint8_t *, op->sym->auth.data.offset);\n+\t\t\tjob->u.GCM.aad_len_in_bytes = op->sym->auth.data.length;\n+\t\t\tjob->cipher_mode = GCM;\n+\t\t}\n \t\tjob->aes_enc_key_expanded = &session->cipher.gcm_key;\n \t\tjob->aes_dec_key_expanded = &session->cipher.gcm_key;\n \t\tbreak;\n@@ -783,37 +901,34 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n \t\t}\n \t}\n \n-\t/* Mutable crypto operation parameters */\n-\tif (op->sym->m_dst) {\n-\t\tm_src = m_dst = op->sym->m_dst;\n-\n-\t\t/* append space for output data to mbuf */\n-\t\tchar *odata = rte_pktmbuf_append(m_dst,\n-\t\t\t\trte_pktmbuf_data_len(op->sym->m_src));\n-\t\tif (odata == NULL) {\n-\t\t\tAESNI_MB_LOG(ERR, \"failed to allocate space in destination \"\n-\t\t\t\t\t\"mbuf for source data\");\n-\t\t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tmemcpy(odata, rte_pktmbuf_mtod(op->sym->m_src, void*),\n-\t\t\t\trte_pktmbuf_data_len(op->sym->m_src));\n-\t} else {\n+\tif (!op->sym->m_dst) {\n+\t\t/* in-place operation */\n \t\tm_dst = m_src;\n-\t\tif (job->hash_alg == AES_CCM || job->hash_alg == AES_GMAC)\n-\t\t\tm_offset = op->sym->aead.data.offset;\n-\t\telse\n-\t\t\tm_offset = op->sym->cipher.data.offset;\n+\t\toop = 0;\n+\t} else if (op->sym->m_dst == op->sym->m_src) {\n+\t\t/* in-place operation */\n+\t\tm_dst = m_src;\n+\t\toop = 0;\n+\t} else {\n+\t\t/* out-of-place operation */\n+\t\tm_dst = op->sym->m_dst;\n+\t\toop = 1;\n \t}\n \n+\tif (job->hash_alg == AES_CCM || (job->hash_alg == AES_GMAC &&\n+\t\t\tsession->cipher.mode == GCM))\n+\t\tm_offset = op->sym->aead.data.offset;\n+\telse\n+\t\tm_offset = op->sym->cipher.data.offset;\n+\n \t/* Set digest output location */\n \tif (job->hash_alg != NULL_HASH &&\n \t\t\tsession->auth.operation == RTE_CRYPTO_AUTH_OP_VERIFY) {\n \t\tjob->auth_tag_output = qp->temp_digests[*digest_idx];\n \t\t*digest_idx = (*digest_idx + 1) % MAX_JOBS;\n \t} else {\n-\t\tif (job->hash_alg == AES_CCM || job->hash_alg == AES_GMAC)\n+\t\tif (job->hash_alg == AES_CCM || (job->hash_alg == AES_GMAC &&\n+\t\t\t\tsession->cipher.mode == GCM))\n \t\t\tjob->auth_tag_output = op->sym->aead.digest.data;\n \t\telse\n \t\t\tjob->auth_tag_output = op->sym->auth.digest.data;\n@@ -834,7 +949,7 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n \t/* Set IV parameters */\n \tjob->iv_len_in_bytes = session->iv.length;\n \n-\t/* Data  Parameter */\n+\t/* Data Parameters */\n \tjob->src = rte_pktmbuf_mtod(m_src, uint8_t *);\n \tjob->dst = rte_pktmbuf_mtod_offset(m_dst, uint8_t *, m_offset);\n \n@@ -851,11 +966,24 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n \t\tbreak;\n \n \tcase AES_GMAC:\n-\t\tjob->cipher_start_src_offset_in_bytes =\n-\t\t\t\top->sym->aead.data.offset;\n-\t\tjob->hash_start_src_offset_in_bytes = op->sym->aead.data.offset;\n-\t\tjob->msg_len_to_cipher_in_bytes = op->sym->aead.data.length;\n-\t\tjob->msg_len_to_hash_in_bytes = job->msg_len_to_cipher_in_bytes;\n+\t\tif (session->cipher.mode == GCM) {\n+\t\t\tjob->cipher_start_src_offset_in_bytes =\n+\t\t\t\t\top->sym->aead.data.offset;\n+\t\t\tjob->hash_start_src_offset_in_bytes =\n+\t\t\t\t\top->sym->aead.data.offset;\n+\t\t\tjob->msg_len_to_cipher_in_bytes =\n+\t\t\t\t\top->sym->aead.data.length;\n+\t\t\tjob->msg_len_to_hash_in_bytes =\n+\t\t\t\t\top->sym->aead.data.length;\n+\t\t} else {\n+\t\t\tjob->cipher_start_src_offset_in_bytes =\n+\t\t\t\t\top->sym->auth.data.offset;\n+\t\t\tjob->hash_start_src_offset_in_bytes =\n+\t\t\t\t\top->sym->auth.data.offset;\n+\t\t\tjob->msg_len_to_cipher_in_bytes = 0;\n+\t\t\tjob->msg_len_to_hash_in_bytes = 0;\n+\t\t}\n+\n \t\tjob->iv = rte_crypto_op_ctod_offset(op, uint8_t *,\n \t\t\t\tsession->iv.offset);\n \t\tbreak;\n@@ -865,7 +993,8 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n \t\t\t\top->sym->cipher.data.offset;\n \t\tjob->msg_len_to_cipher_in_bytes = op->sym->cipher.data.length;\n \n-\t\tjob->hash_start_src_offset_in_bytes = op->sym->auth.data.offset;\n+\t\tjob->hash_start_src_offset_in_bytes = auth_start_offset(op,\n+\t\t\t\tsession, oop);\n \t\tjob->msg_len_to_hash_in_bytes = op->sym->auth.data.length;\n \n \t\tjob->iv = rte_crypto_op_ctod_offset(op, uint8_t *,\n@@ -879,26 +1008,18 @@ set_mb_job_params(JOB_AES_HMAC *job, struct aesni_mb_qp *qp,\n }\n \n static inline void\n-verify_digest(JOB_AES_HMAC *job, struct rte_crypto_op *op,\n-\t\tstruct aesni_mb_session *sess)\n+verify_digest(JOB_AES_HMAC *job, void *digest, uint16_t len, uint8_t *status)\n {\n \t/* Verify digest if required */\n-\tif (job->hash_alg == AES_CCM || job->hash_alg == AES_GMAC) {\n-\t\tif (memcmp(job->auth_tag_output, op->sym->aead.digest.data,\n-\t\t\t\tsess->auth.req_digest_len) != 0)\n-\t\t\top->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;\n-\t} else {\n-\t\tif (memcmp(job->auth_tag_output, op->sym->auth.digest.data,\n-\t\t\t\tsess->auth.req_digest_len) != 0)\n-\t\t\top->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;\n-\t}\n+\tif (memcmp(job->auth_tag_output, digest, len) != 0)\n+\t\t*status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;\n }\n \n static inline void\n generate_digest(JOB_AES_HMAC *job, struct rte_crypto_op *op,\n \t\tstruct aesni_mb_session *sess)\n {\n-\t/* No extra copy neeed */\n+\t/* No extra copy needed */\n \tif (likely(sess->auth.req_digest_len == sess->auth.gen_digest_len))\n \t\treturn;\n \n@@ -933,13 +1054,24 @@ post_process_mb_job(struct aesni_mb_qp *qp, JOB_AES_HMAC *job)\n \t\tcase STS_COMPLETED:\n \t\t\top->status = RTE_CRYPTO_OP_STATUS_SUCCESS;\n \n-\t\t\tif (job->hash_alg != NULL_HASH) {\n-\t\t\t\tif (sess->auth.operation ==\n-\t\t\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY)\n-\t\t\t\t\tverify_digest(job, op, sess);\n+\t\t\tif (job->hash_alg == NULL_HASH)\n+\t\t\t\tbreak;\n+\n+\t\t\tif (sess->auth.operation == RTE_CRYPTO_AUTH_OP_VERIFY) {\n+\t\t\t\tif (job->hash_alg == AES_CCM ||\n+\t\t\t\t\t(job->hash_alg == AES_GMAC &&\n+\t\t\t\t\t\tsess->cipher.mode == GCM))\n+\t\t\t\t\tverify_digest(job,\n+\t\t\t\t\t\top->sym->aead.digest.data,\n+\t\t\t\t\t\tsess->auth.req_digest_len,\n+\t\t\t\t\t\t&op->status);\n \t\t\t\telse\n-\t\t\t\t\tgenerate_digest(job, op, sess);\n-\t\t\t}\n+\t\t\t\t\tverify_digest(job,\n+\t\t\t\t\t\top->sym->auth.digest.data,\n+\t\t\t\t\t\tsess->auth.req_digest_len,\n+\t\t\t\t\t\t&op->status);\n+\t\t\t} else\n+\t\t\t\tgenerate_digest(job, op, sess);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n@@ -989,7 +1121,7 @@ handle_completed_jobs(struct aesni_mb_qp *qp, JOB_AES_HMAC *job,\n \t\tif (processed_jobs == nb_ops)\n \t\t\tbreak;\n \n-\t\tjob = (*qp->op_fns->job.get_completed_job)(qp->mb_mgr);\n+\t\tjob = IMB_GET_COMPLETED_JOB(qp->mb_mgr);\n \t}\n \n \treturn processed_jobs;\n@@ -1002,7 +1134,7 @@ flush_mb_mgr(struct aesni_mb_qp *qp, struct rte_crypto_op **ops,\n \tint processed_ops = 0;\n \n \t/* Flush the remaining jobs */\n-\tJOB_AES_HMAC *job = (*qp->op_fns->job.flush_job)(qp->mb_mgr);\n+\tJOB_AES_HMAC *job = IMB_FLUSH_JOB(qp->mb_mgr);\n \n \tif (job)\n \t\tprocessed_ops += handle_completed_jobs(qp, job,\n@@ -1042,7 +1174,7 @@ aesni_mb_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,\n \tuint8_t digest_idx = qp->digest_idx;\n \tdo {\n \t\t/* Get next free mb job struct from mb manager */\n-\t\tjob = (*qp->op_fns->job.get_next)(qp->mb_mgr);\n+\t\tjob = IMB_GET_NEXT_JOB(qp->mb_mgr);\n \t\tif (unlikely(job == NULL)) {\n \t\t\t/* if no free mb job structs we need to flush mb_mgr */\n \t\t\tprocessed_jobs += flush_mb_mgr(qp,\n@@ -1052,7 +1184,7 @@ aesni_mb_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,\n \t\t\tif (nb_ops == processed_jobs)\n \t\t\t\tbreak;\n \n-\t\t\tjob = (*qp->op_fns->job.get_next)(qp->mb_mgr);\n+\t\t\tjob = IMB_GET_NEXT_JOB(qp->mb_mgr);\n \t\t}\n \n \t\t/*\n@@ -1072,8 +1204,11 @@ aesni_mb_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,\n \t\t}\n \n \t\t/* Submit job to multi-buffer for processing */\n-\t\tjob = (*qp->op_fns->job.submit)(qp->mb_mgr);\n-\n+#ifdef RTE_LIBRTE_PMD_AESNI_MB_DEBUG\n+\t\tjob = IMB_SUBMIT_JOB(qp->mb_mgr);\n+#else\n+\t\tjob = IMB_SUBMIT_JOB_NOCHECK(qp->mb_mgr);\n+#endif\n \t\t/*\n \t\t * If submit returns a processed job then handle it,\n \t\t * before submitting subsequent jobs\n@@ -1105,12 +1240,7 @@ cryptodev_aesni_mb_create(const char *name,\n \tstruct rte_cryptodev *dev;\n \tstruct aesni_mb_private *internals;\n \tenum aesni_mb_vector_mode vector_mode;\n-\n-\t/* Check CPU for support for AES instruction set */\n-\tif (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AES)) {\n-\t\tAESNI_MB_LOG(ERR, \"AES instructions not supported by CPU\");\n-\t\treturn -EFAULT;\n-\t}\n+\tMB_MGR *mb_mgr;\n \n \tdev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);\n \tif (dev == NULL) {\n@@ -1137,23 +1267,38 @@ cryptodev_aesni_mb_create(const char *name,\n \n \tdev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO |\n \t\t\tRTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |\n-\t\t\tRTE_CRYPTODEV_FF_CPU_AESNI;\n+\t\t\tRTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT;\n+\n+\t/* Check CPU for support for AES instruction set */\n+\tif (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AES))\n+\t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AESNI;\n+\telse\n+\t\tAESNI_MB_LOG(WARNING, \"AES instructions not supported by CPU\");\n+\n+\tmb_mgr = alloc_mb_mgr(0);\n+\tif (mb_mgr == NULL)\n+\t\treturn -ENOMEM;\n \n \tswitch (vector_mode) {\n \tcase RTE_AESNI_MB_SSE:\n \t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_SSE;\n+\t\tinit_mb_mgr_sse(mb_mgr);\n \t\tbreak;\n \tcase RTE_AESNI_MB_AVX:\n \t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX;\n+\t\tinit_mb_mgr_avx(mb_mgr);\n \t\tbreak;\n \tcase RTE_AESNI_MB_AVX2:\n \t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX2;\n+\t\tinit_mb_mgr_avx2(mb_mgr);\n \t\tbreak;\n \tcase RTE_AESNI_MB_AVX512:\n \t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX512;\n+\t\tinit_mb_mgr_avx512(mb_mgr);\n \t\tbreak;\n \tdefault:\n-\t\tbreak;\n+\t\tAESNI_MB_LOG(ERR, \"Unsupported vector mode %u\\n\", vector_mode);\n+\t\tgoto error_exit;\n \t}\n \n \t/* Set vector instructions mode supported */\n@@ -1161,15 +1306,19 @@ cryptodev_aesni_mb_create(const char *name,\n \n \tinternals->vector_mode = vector_mode;\n \tinternals->max_nb_queue_pairs = init_params->max_nb_queue_pairs;\n+\tinternals->mb_mgr = mb_mgr;\n \n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \tAESNI_MB_LOG(INFO, \"IPSec Multi-buffer library version used: %s\\n\",\n \t\t\timb_get_version_str());\n-#else\n-\tAESNI_MB_LOG(INFO, \"IPSec Multi-buffer library version used: 0.49.0\\n\");\n-#endif\n \n \treturn 0;\n+error_exit:\n+\tif (mb_mgr)\n+\t\tfree_mb_mgr(mb_mgr);\n+\n+\trte_cryptodev_pmd_destroy(dev);\n+\n+\treturn -1;\n }\n \n static int\n@@ -1204,6 +1353,7 @@ static int\n cryptodev_aesni_mb_remove(struct rte_vdev_device *vdev)\n {\n \tstruct rte_cryptodev *cryptodev;\n+\tstruct aesni_mb_private *internals;\n \tconst char *name;\n \n \tname = rte_vdev_device_name(vdev);\n@@ -1214,6 +1364,10 @@ cryptodev_aesni_mb_remove(struct rte_vdev_device *vdev)\n \tif (cryptodev == NULL)\n \t\treturn -ENODEV;\n \n+\tinternals = cryptodev->data->dev_private;\n+\n+\tfree_mb_mgr(internals->mb_mgr);\n+\n \treturn rte_cryptodev_pmd_destroy(cryptodev);\n }\n \ndiff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c\nindex f3eff2685..e58dfa33b 100644\n--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c\n+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c\n@@ -25,15 +25,9 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 16,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 12,\n-\t\t\t\t\t.max = 12,\n-\t\t\t\t\t.increment = 0\n-#endif\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -48,23 +42,34 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t.block_size = 64,\n \t\t\t\t.key_size = {\n \t\t\t\t\t.min = 1,\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.max = 65535,\n-#else\n-\t\t\t\t\t.max = 64,\n-#endif\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 20,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 12,\n-\t\t\t\t\t.max = 12,\n+\t\t\t\t},\n+\t\t\t\t.iv_size = { 0 }\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n+\t{\t/* SHA1 */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_SHA1,\n+\t\t\t\t.block_size = 64,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 0,\n+\t\t\t\t\t.max = 0,\n \t\t\t\t\t.increment = 0\n-#endif\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 1,\n+\t\t\t\t\t.max = 20,\n+\t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -79,23 +84,34 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t.block_size = 64,\n \t\t\t\t.key_size = {\n \t\t\t\t\t.min = 1,\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.max = 65535,\n-#else\n-\t\t\t\t\t.max = 64,\n-#endif\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 28,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 14,\n-\t\t\t\t\t.max = 14,\n+\t\t\t\t},\n+\t\t\t\t.iv_size = { 0 }\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n+\t{\t/* SHA224 */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_SHA224,\n+\t\t\t\t.block_size = 64,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 0,\n+\t\t\t\t\t.max = 0,\n \t\t\t\t\t.increment = 0\n-#endif\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 1,\n+\t\t\t\t\t.max = 28,\n+\t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -110,23 +126,34 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t.block_size = 64,\n \t\t\t\t.key_size = {\n \t\t\t\t\t.min = 1,\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.max = 65535,\n-#else\n-\t\t\t\t\t.max = 64,\n-#endif\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 32,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 16,\n-\t\t\t\t\t.max = 16,\n+\t\t\t\t},\n+\t\t\t\t.iv_size = { 0 }\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n+\t{\t/* SHA256 */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_SHA256,\n+\t\t\t\t.block_size = 64,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 0,\n+\t\t\t\t\t.max = 0,\n \t\t\t\t\t.increment = 0\n-#endif\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 1,\n+\t\t\t\t\t.max = 32,\n+\t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -141,23 +168,34 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t.block_size = 128,\n \t\t\t\t.key_size = {\n \t\t\t\t\t.min = 1,\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.max = 65535,\n-#else\n-\t\t\t\t\t.max = 128,\n-#endif\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 48,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 24,\n-\t\t\t\t\t.max = 24,\n+\t\t\t\t},\n+\t\t\t\t.iv_size = { 0 }\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n+\t{\t/* SHA384 */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_SHA384,\n+\t\t\t\t.block_size = 128,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 0,\n+\t\t\t\t\t.max = 0,\n \t\t\t\t\t.increment = 0\n-#endif\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 1,\n+\t\t\t\t\t.max = 48,\n+\t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -172,23 +210,34 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t\t.block_size = 128,\n \t\t\t\t.key_size = {\n \t\t\t\t\t.min = 1,\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.max = 65535,\n-#else\n-\t\t\t\t\t.max = 128,\n-#endif\n \t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.digest_size = {\n-#if IMB_VERSION_NUM >= IMB_VERSION(0, 50, 0)\n \t\t\t\t\t.min = 1,\n \t\t\t\t\t.max = 64,\n \t\t\t\t\t.increment = 1\n-#else\n-\t\t\t\t\t.min = 32,\n-\t\t\t\t\t.max = 32,\n+\t\t\t\t},\n+\t\t\t\t.iv_size = { 0 }\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n+\t{\t/* SHA512  */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_SHA512,\n+\t\t\t\t.block_size = 128,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 0,\n+\t\t\t\t\t.max = 0,\n \t\t\t\t\t.increment = 0\n-#endif\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 1,\n+\t\t\t\t\t.max = 64,\n+\t\t\t\t\t.increment = 1\n \t\t\t\t},\n \t\t\t\t.iv_size = { 0 }\n \t\t\t}, }\n@@ -416,6 +465,31 @@ static const struct rte_cryptodev_capabilities aesni_mb_pmd_capabilities[] = {\n \t\t\t}, }\n \t\t}, }\n \t},\n+\t{\t/* AES GMAC (AUTH) */\n+\t\t.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t{.sym = {\n+\t\t\t.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t{.auth = {\n+\t\t\t\t.algo = RTE_CRYPTO_AUTH_AES_GMAC,\n+\t\t\t\t.block_size = 16,\n+\t\t\t\t.key_size = {\n+\t\t\t\t\t.min = 16,\n+\t\t\t\t\t.max = 32,\n+\t\t\t\t\t.increment = 8\n+\t\t\t\t},\n+\t\t\t\t.digest_size = {\n+\t\t\t\t\t.min = 8,\n+\t\t\t\t\t.max = 16,\n+\t\t\t\t\t.increment = 4\n+\t\t\t\t},\n+\t\t\t\t.iv_size = {\n+\t\t\t\t\t.min = 12,\n+\t\t\t\t\t.max = 12,\n+\t\t\t\t\t.increment = 0\n+\t\t\t\t}\n+\t\t\t}, }\n+\t\t}, }\n+\t},\n \tRTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()\n };\n \n@@ -595,7 +669,28 @@ aesni_mb_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,\n \t\tgoto qp_setup_cleanup;\n \t}\n \n-\tqp->op_fns = &job_ops[internals->vector_mode];\n+\tswitch (internals->vector_mode) {\n+\tcase RTE_AESNI_MB_SSE:\n+\t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_SSE;\n+\t\tinit_mb_mgr_sse(qp->mb_mgr);\n+\t\tbreak;\n+\tcase RTE_AESNI_MB_AVX:\n+\t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX;\n+\t\tinit_mb_mgr_avx(qp->mb_mgr);\n+\t\tbreak;\n+\tcase RTE_AESNI_MB_AVX2:\n+\t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX2;\n+\t\tinit_mb_mgr_avx2(qp->mb_mgr);\n+\t\tbreak;\n+\tcase RTE_AESNI_MB_AVX512:\n+\t\tdev->feature_flags |= RTE_CRYPTODEV_FF_CPU_AVX512;\n+\t\tinit_mb_mgr_avx512(qp->mb_mgr);\n+\t\tbreak;\n+\tdefault:\n+\t\tAESNI_MB_LOG(ERR, \"Unsupported vector mode %u\\n\",\n+\t\t\t\tinternals->vector_mode);\n+\t\tgoto qp_setup_cleanup;\n+\t}\n \n \tqp->ingress_queue = aesni_mb_pmd_qp_create_processed_ops_ring(qp,\n \t\t\tqp_conf->nb_descriptors, socket_id);\n@@ -613,13 +708,11 @@ aesni_mb_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,\n \tsnprintf(mp_name, RTE_MEMPOOL_NAMESIZE,\n \t\t\t\t\"digest_mp_%u_%u\", dev->data->dev_id, qp_id);\n \n-\t/* Initialise multi-buffer manager */\n-\t(*qp->op_fns->job.init_mgr)(qp->mb_mgr);\n \treturn 0;\n \n qp_setup_cleanup:\n \tif (qp) {\n-\t\tif (qp->mb_mgr == NULL)\n+\t\tif (qp->mb_mgr)\n \t\t\tfree_mb_mgr(qp->mb_mgr);\n \t\trte_free(qp);\n \t}\n@@ -663,7 +756,7 @@ aesni_mb_pmd_sym_session_configure(struct rte_cryptodev *dev,\n \t\treturn -ENOMEM;\n \t}\n \n-\tret = aesni_mb_set_session_parameters(&job_ops[internals->vector_mode],\n+\tret = aesni_mb_set_session_parameters(internals->mb_mgr,\n \t\t\tsess_private_data, xform);\n \tif (ret != 0) {\n \t\tAESNI_MB_LOG(ERR, \"failed configure session parameters\");\ndiff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_private.h b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_private.h\nindex d8021cdaa..6a5df942c 100644\n--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_private.h\n+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd_private.h\n@@ -25,6 +25,7 @@ int aesni_mb_logtype_driver;\n /* Maximum length for digest */\n #define DIGEST_LENGTH_MAX 64\n static const unsigned auth_blocksize[] = {\n+\t\t[NULL_HASH]\t= 0,\n \t\t[MD5]\t\t= 64,\n \t\t[SHA1]\t\t= 64,\n \t\t[SHA_224]\t= 64,\n@@ -33,6 +34,13 @@ static const unsigned auth_blocksize[] = {\n \t\t[SHA_512]\t= 128,\n \t\t[AES_XCBC]\t= 16,\n \t\t[AES_CCM]\t= 16,\n+\t\t[AES_CMAC]\t= 16,\n+\t\t[AES_GMAC]\t= 16,\n+\t\t[PLAIN_SHA1]\t= 64,\n+\t\t[PLAIN_SHA_224]\t= 64,\n+\t\t[PLAIN_SHA_256]\t= 64,\n+\t\t[PLAIN_SHA_384]\t= 128,\n+\t\t[PLAIN_SHA_512]\t= 128\n };\n \n /**\n@@ -57,7 +65,13 @@ static const unsigned auth_truncated_digest_byte_lengths[] = {\n \t\t[AES_XCBC]\t= 12,\n \t\t[AES_CMAC]\t= 12,\n \t\t[AES_CCM]\t= 8,\n-\t\t[NULL_HASH]\t= 0\n+\t\t[NULL_HASH]\t= 0,\n+\t\t[AES_GMAC]\t= 16,\n+\t\t[PLAIN_SHA1]\t= 20,\n+\t\t[PLAIN_SHA_224]\t= 28,\n+\t\t[PLAIN_SHA_256]\t= 32,\n+\t\t[PLAIN_SHA_384]\t= 48,\n+\t\t[PLAIN_SHA_512]\t= 64\n };\n \n /**\n@@ -82,8 +96,14 @@ static const unsigned auth_digest_byte_lengths[] = {\n \t\t[SHA_512]\t= 64,\n \t\t[AES_XCBC]\t= 16,\n \t\t[AES_CMAC]\t= 16,\n+\t\t[AES_CCM]\t= 16,\n \t\t[AES_GMAC]\t= 12,\n-\t\t[NULL_HASH]\t\t= 0\n+\t\t[NULL_HASH]\t= 0,\n+\t\t[PLAIN_SHA1]\t= 20,\n+\t\t[PLAIN_SHA_224]\t= 28,\n+\t\t[PLAIN_SHA_256]\t= 32,\n+\t\t[PLAIN_SHA_384]\t= 48,\n+\t\t[PLAIN_SHA_512]\t= 64\n };\n \n /**\n@@ -115,6 +135,8 @@ struct aesni_mb_private {\n \t/**< CPU vector instruction set mode */\n \tunsigned max_nb_queue_pairs;\n \t/**< Max number of queue pairs supported by device */\n+\tMB_MGR *mb_mgr;\n+\t/**< Multi-buffer instance */\n };\n \n /** AESNI Multi buffer queue pair */\n@@ -123,8 +145,6 @@ struct aesni_mb_qp {\n \t/**< Queue Pair Identifier */\n \tchar name[RTE_CRYPTODEV_NAME_MAX_LEN];\n \t/**< Unique Queue Pair Name */\n-\tconst struct aesni_mb_op_fns *op_fns;\n-\t/**< Vector mode dependent pointer table of the multi-buffer APIs */\n \tMB_MGR *mb_mgr;\n \t/**< Multi-buffer instance */\n \tstruct rte_ring *ingress_queue;\n@@ -238,7 +258,7 @@ struct aesni_mb_session {\n  *\n  */\n extern int\n-aesni_mb_set_session_parameters(const struct aesni_mb_op_fns *mb_ops,\n+aesni_mb_set_session_parameters(const MB_MGR *mb_mgr,\n \t\tstruct aesni_mb_session *sess,\n \t\tconst struct rte_crypto_sym_xform *xform);\n \n",
    "prefixes": [
        "RFC",
        "4/5"
    ]
}