From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id C326A1B7FA for ; Tue, 3 Apr 2018 17:09:28 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Apr 2018 08:09:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,401,1517904000"; d="scan'208";a="33892217" Received: from irsmsx105.ger.corp.intel.com ([163.33.3.28]) by fmsmga002.fm.intel.com with ESMTP; 03 Apr 2018 08:09:26 -0700 Received: from irsmsx155.ger.corp.intel.com (163.33.192.3) by irsmsx105.ger.corp.intel.com (163.33.3.28) with Microsoft SMTP Server (TLS) id 14.3.319.2; Tue, 3 Apr 2018 16:09:26 +0100 Received: from irsmsx101.ger.corp.intel.com ([169.254.1.176]) by irsmsx155.ger.corp.intel.com ([169.254.14.50]) with mapi id 14.03.0319.002; Tue, 3 Apr 2018 16:09:25 +0100 From: "Zhang, Roy Fan" To: "Tan, Jianfeng" , "dev@dpdk.org" CC: "maxime.coquelin@redhat.com" , "jianjay.zhou@huawei.com" Thread-Topic: [PATCH v4 3/8] lib/librte_vhost: add session message handler Thread-Index: AQHTx28FahBaYpC2LUKy9J0ENfHSEqPvKpDA Date: Tue, 3 Apr 2018 15:09:25 +0000 Message-ID: <9F7182E3F746AB4EA17801C148F3C6043310A80E@IRSMSX101.ger.corp.intel.com> References: <20180326095114.11605-1-roy.fan.zhang@intel.com> <1522327975-28769-1-git-send-email-roy.fan.zhang@intel.com> <1522327975-28769-4-git-send-email-roy.fan.zhang@intel.com> In-Reply-To: Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNzczYjRmMGItMTc3Mi00NDk1LWFhOGEtNjc1MDk1NWMxZTIwIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE2LjUuOS4zIiwiVHJ1c3RlZExhYmVsSGFzaCI6IlwvdVwvVGJ6NzYyZGpnYUFXeUJ3bGI2WUdIOGZNcjVWQ1hjWkhkWDJZVUFyTT0ifQ== dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [163.33.239.181] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v4 3/8] lib/librte_vhost: add session message handler X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Apr 2018 15:09:29 -0000 Hi Jianfeng, Thanks for the review. > -----Original Message----- > From: Tan, Jianfeng > Sent: Thursday, March 29, 2018 4:03 PM > To: Zhang, Roy Fan ; dev@dpdk.org > Cc: maxime.coquelin@redhat.com; jianjay.zhou@huawei.com > Subject: Re: [PATCH v4 3/8] lib/librte_vhost: add session message handler >=20 > For the title prefix, "vhost" is just fine. >=20 >=20 > On 3/29/2018 8:52 PM, Fan Zhang wrote: > > This patch adds session message handler to vhost crypto. > > > > Signed-off-by: Fan Zhang > > --- > > lib/librte_vhost/vhost_crypto.c | 428 > ++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 428 insertions(+) > > create mode 100644 lib/librte_vhost/vhost_crypto.c > > > > diff --git a/lib/librte_vhost/vhost_crypto.c > > b/lib/librte_vhost/vhost_crypto.c new file mode 100644 index > > 0000000..c639b20 > > --- /dev/null > > +++ b/lib/librte_vhost/vhost_crypto.c > > @@ -0,0 +1,428 @@ > > +/* SPDX-License-Identifier: BSD-3-Clause > > + * Copyright(c) 2017-2018 Intel Corporation */ > > + > > +#include >=20 > No bool variable below? >=20 I found a compile error when not adding this header. " In file included from /root/dpdk/lib/librte_vhost/vhost_crypto.c:12:0: /root/dpdk/lib/librte_vhost/vhost.h:366:44: error: unknown type name 'bool' void vhost_set_builtin_virtio_net(int vid, bool enable); " > > + > > +#include > > +#include > > +#include > > +#ifdef RTE_LIBRTE_VHOST_DEBUG >=20 > No need to add the ifdef. >=20 > > +#include >=20 > Actually I don't see why we need this header file. This header help dump the content of request message for debugging reason. = I can remove it. >=20 > > +#endif > > +#include "vhost.h" > > +#include "vhost_user.h" > > +#include "rte_vhost_crypto.h" > > + > > +#define NB_MEMPOOL_OBJS (1024) > > +#define NB_CRYPTO_DESCRIPTORS (1024) > > +#define NB_CACHE_OBJS (128) > > + > > +#define SESSION_MAP_ENTRIES (1024) /**< Max nb sessions > per vdev */ > > +#define MAX_KEY_SIZE (32) > > +#define VHOST_CRYPTO_MAX_IV_LEN (16) > > +#define MAX_COUNT_DOWN_TIMES (100) > > + > > +#define INHDR_LEN (sizeof(struct virtio_crypto_inhdr)) > > +#define IV_OFFSET (sizeof(struct rte_crypto_op) + \ > > + sizeof(struct rte_crypto_sym_op)) >=20 > Some of above macros are not used in lib which we shall delete. Most are used in 4th patch in this patchset. Do you think I should move th= em To it then? >=20 > > + > > +#ifdef RTE_LIBRTE_VHOST_DEBUG > > +#define VC_LOG_ERR(fmt, args...) \ > > + RTE_LOG(ERR, USER1, "[%s] %s() line %u: " fmt "\n", \ > > + "Vhost-Crypto", __func__, __LINE__, ## args) > > +#define VC_LOG_INFO(fmt, args...) \ > > + RTE_LOG(INFO, USER1, "[%s] %s() line %u: " fmt "\n", \ > > + "Vhost-Crypto", __func__, __LINE__, ## args) > > + > > +#define VC_LOG_DBG(fmt, args...) \ > > + RTE_LOG(DEBUG, USER1, "[%s] %s() line %u: " fmt "\n", \ > > + "Vhost-Crypto", __func__, __LINE__, ## args) > > +#else > > +#define VC_LOG_ERR(fmt, args...) \ > > + RTE_LOG(ERR, USER1, "[VHOST-Crypto]: " fmt "\n", ## args) > > +#define VC_LOG_INFO(fmt, args...) \ > > + RTE_LOG(INFO, USER1, "[VHOST-Crypto]: " fmt "\n", ## args) > #define > > +VC_LOG_DBG(fmt, args...) #endif > > + > > +#define VIRTIO_CRYPTO_FEATURES ((1 << VIRTIO_F_NOTIFY_ON_EMPTY) > | \ > > + (1 << VIRTIO_RING_F_INDIRECT_DESC) | > \ > > + (1 << VIRTIO_RING_F_EVENT_IDX) | \ > > + (1 << VIRTIO_CRYPTO_SERVICE_CIPHER) | > \ > > + (1 << VIRTIO_CRYPTO_SERVICE_HASH) | > \ > > + (1 << VIRTIO_CRYPTO_SERVICE_MAC) | > \ > > + (1 << VIRTIO_CRYPTO_SERVICE_AEAD) | > \ > > + (1 << VIRTIO_NET_F_CTRL_VQ)) >=20 > Just wonder if the above are required features or supported features? Some are supported, but not all. I will fix it. >=20 > And if it's only used by 5/8 patch, shall we move the definition there? > Let this patch to focus on "session message handler". Ok. >=20 > > + > > + > > +#define GPA_TO_VVA(t, m, a) > ((t)(uintptr_t)rte_vhost_gpa_to_vva(m, a)) > > + > > +/* Macro to get the buffer at the end of rte_crypto_op */ > > +#define REQ_OP_OFFSET (IV_OFFSET + > VHOST_CRYPTO_MAX_IV_LEN) >=20 > Another unused macro? I will move it to 4/8. >=20 > > + > > +/** > > + * 1-to-1 mapping between RTE_CRYPTO_*ALGO* and > VIRTIO_CRYPTO_*ALGO*, > > +for > > + * algorithms not supported by RTE_CRYPTODEV, the > > +-VIRTIO_CRYPTO_NOTSUPP is > > + * returned. > > + */ > > +static int cipher_algo_transform[] =3D { >=20 > s/transform/map? >=20 > > + RTE_CRYPTO_CIPHER_NULL, > > + RTE_CRYPTO_CIPHER_ARC4, > > + RTE_CRYPTO_CIPHER_AES_ECB, > > + RTE_CRYPTO_CIPHER_AES_CBC, > > + RTE_CRYPTO_CIPHER_AES_CTR, > > + -VIRTIO_CRYPTO_NOTSUPP, /* > VIRTIO_CRYPTO_CIPHER_DES_ECB */ > > + RTE_CRYPTO_CIPHER_DES_CBC, > > + RTE_CRYPTO_CIPHER_3DES_ECB, > > + RTE_CRYPTO_CIPHER_3DES_CBC, > > + RTE_CRYPTO_CIPHER_3DES_CTR, > > + RTE_CRYPTO_CIPHER_KASUMI_F8, > > + RTE_CRYPTO_CIPHER_SNOW3G_UEA2, > > + RTE_CRYPTO_CIPHER_AES_F8, > > + RTE_CRYPTO_CIPHER_AES_XTS, > > + RTE_CRYPTO_CIPHER_ZUC_EEA3 > > +}; >=20 > How do we check if an input overflows the array? I will change them to functions. >=20 > > + > > +/** > > + * VIRTIO_CRYTPO_AUTH_* indexes are not sequential, the gaps are > > +filled with > > + * -VIRTIO_CRYPTO_BADMSG errors. > > + */ > > +static int auth_algo_transform[] =3D { > > + RTE_CRYPTO_AUTH_NULL, > > + RTE_CRYPTO_AUTH_MD5_HMAC, > > + RTE_CRYPTO_AUTH_SHA1_HMAC, > > + RTE_CRYPTO_AUTH_SHA224_HMAC, > > + RTE_CRYPTO_AUTH_SHA256_HMAC, > > + RTE_CRYPTO_AUTH_SHA384_HMAC, > > + RTE_CRYPTO_AUTH_SHA512_HMAC, > > + -VIRTIO_CRYPTO_BADMSG, >=20 > Where is this macro defined? They are defined in linux/virtio_crypto.h. I will move them to this file. >=20 > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_NOTSUPP, /* > VIRTIO_CRYPTO_MAC_CMAC_3DES */ > > + RTE_CRYPTO_AUTH_AES_CMAC, > > + RTE_CRYPTO_AUTH_KASUMI_F9, > > + RTE_CRYPTO_AUTH_SNOW3G_UIA2, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + -VIRTIO_CRYPTO_BADMSG, > > + RTE_CRYPTO_AUTH_AES_GMAC, > > + -VIRTIO_CRYPTO_NOTSUPP, /* > VIRTIO_CRYPTO_MAC_GMAC_TWOFISH */ > > + RTE_CRYPTO_AUTH_AES_CBC_MAC, > > + -VIRTIO_CRYPTO_NOTSUPP, /* > VIRTIO_CRYPTO_MAC_CBCMAC_KASUMI_F9 */ > > + RTE_CRYPTO_AUTH_AES_XCBC_MAC > > +}; >=20 > Ditto. >=20 > > + > > +static int cipher_op_transform[] =3D { > > + -VIRTIO_CRYPTO_BADMSG, /* meaningless */ > > + RTE_CRYPTO_CIPHER_OP_ENCRYPT, > > + RTE_CRYPTO_CIPHER_OP_DECRYPT > > +}; >=20 > Ditto. >=20 > > + > > +static int iv_lens[] =3D { > > + -1, /* Invalid input */ > > + 0, /* RTE_CRYPTO_CIPHER_NULL */ > > + 8, /* RTE_CRYPTO_CIPHER_3DES_CBC */ > > + 8, /* RTE_CRYPTO_CIPHER_3DES_CTR */ > > + 8, /* RTE_CRYPTO_CIPHER_3DES_ECB */ > > + 16, /* RTE_CRYPTO_CIPHER_AES_CBC */ > > + /* TODO: add common algos */ > > +}; >=20 > Ditto. >=20 > > + > > +/** > > + * vhost_crypto struct is used to maintain a number of virtio_cryptos > > +and > > + * one DPDK crypto device that deals with all crypto workloads. It is > > +declared > > + * here and defined in vhost_crypto.c >=20 > The last note is not valid now. >=20 > > + */ > > +struct vhost_crypto { > > + /** Used to lookup DPDK Cryptodev Session based on VIRTIO crypto > > + * session ID. > > + */ > > + struct rte_hash *session_map; > > + struct rte_mempool *mbuf_pool; > > + struct rte_mempool *sess_pool; > > + > > + /** DPDK cryptodev ID */ > > + uint8_t cid; > > + uint16_t nb_qps; > > + > > + uint64_t last_session_id; > > + > > + uint64_t cache_session_id; > > + struct rte_cryptodev_sym_session *cache_session; > > + /** socket id for the device */ > > + int socket_id; > > + > > + struct virtio_net *dev; > > + > > + uint8_t option; > > +} __rte_cache_aligned; > > + > > +struct vhost_crypto_data_req { > > + struct vring_desc *head; > > + struct rte_vhost_memory *mem; > > + struct virtio_crypto_inhdr *inhdr; > > + > > + uint16_t desc_idx; > > + uint32_t len; > > + struct vhost_virtqueue *vq; > > + > > + uint8_t zero_copy; > > + > > + int vid; > > + > > + struct vring_desc *wb_desc; > > + uint16_t wb_len; > > +}; >=20 > You might want to adjust the sequence of the fields so that we will not h= ave > some holes. Ok. >=20 > > + > > +static int > > +transform_cipher_param(struct rte_crypto_sym_xform *xform, > > + VhostUserCryptoSessionParam *param) { > > + int ret; > > + > > + ret =3D cipher_algo_transform[param->cipher_algo]; > > + if (unlikely(ret < 0)) > > + return ret; > > + > > + xform->type =3D RTE_CRYPTO_SYM_XFORM_CIPHER; > > + xform->cipher.algo =3D ret; > > + xform->cipher.key.length =3D param->cipher_key_len; > > + if (xform->cipher.key.length > 0) > > + xform->cipher.key.data =3D param->cipher_key_buf; > > + ret =3D cipher_op_transform[param->dir]; > > + if (unlikely(ret < 0)) { > > + VC_LOG_DBG("Bad operation type"); > > + return ret; > > + } > > + xform->cipher.op =3D ret; > > + ret =3D iv_lens[xform->cipher.algo]; > > + if (unlikely(ret < 0)) > > + return ret; > > + xform->cipher.iv.length =3D ret; > > + xform->cipher.iv.offset =3D IV_OFFSET; > > + return 0; > > +} > > + > > +static int > > +transform_chain_param(struct rte_crypto_sym_xform *xforms, > > + VhostUserCryptoSessionParam *param) { > > + struct rte_crypto_sym_xform *xform_cipher, *xform_auth; > > + int ret; > > + > > + switch (param->chaining_dir) { > > + case > VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER: > > + xform_auth =3D xforms; > > + xform_cipher =3D xforms->next; > > + xform_cipher->cipher.op =3D > RTE_CRYPTO_CIPHER_OP_DECRYPT; > > + xform_auth->auth.op =3D RTE_CRYPTO_AUTH_OP_VERIFY; > > + break; > > + case > VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH: > > + xform_cipher =3D xforms; > > + xform_auth =3D xforms->next; > > + xform_cipher->cipher.op =3D > RTE_CRYPTO_CIPHER_OP_ENCRYPT; > > + xform_auth->auth.op =3D RTE_CRYPTO_AUTH_OP_GENERATE; > > + break; > > + default: > > + return -VIRTIO_CRYPTO_BADMSG; > > + } > > + > > + /* cipher */ > > + ret =3D cipher_algo_transform[param->cipher_algo]; > > + if (unlikely(ret < 0)) > > + return ret; > > + xform_cipher->type =3D RTE_CRYPTO_SYM_XFORM_CIPHER; > > + xform_cipher->cipher.algo =3D ret; > > + xform_cipher->cipher.key.length =3D param->cipher_key_len; > > + xform_cipher->cipher.key.data =3D param->cipher_key_buf; > > + ret =3D iv_lens[xform_cipher->cipher.algo]; > > + if (unlikely(ret < 0)) > > + return ret; > > + xform_cipher->cipher.iv.length =3D ret; > > + xform_cipher->cipher.iv.offset =3D IV_OFFSET; > > + > > + /* auth */ > > + xform_auth->type =3D RTE_CRYPTO_SYM_XFORM_AUTH; > > + ret =3D auth_algo_transform[param->hash_algo]; > > + if (unlikely(ret < 0)) > > + return ret; > > + xform_auth->auth.algo =3D ret; > > + xform_auth->auth.digest_length =3D param->digest_len; > > + xform_auth->auth.key.length =3D param->auth_key_len; > > + xform_auth->auth.key.data =3D param->auth_key_buf; > > + > > + return 0; > > +} > > + > > +static void > > +vhost_crypto_create_sess(struct vhost_crypto *vcrypto, > > + VhostUserCryptoSessionParam *sess_param) { > > + struct rte_crypto_sym_xform xform1 =3D {0}, xform2 =3D {0}; > > + struct rte_cryptodev_sym_session *session; > > + int ret; > > + > > + switch (sess_param->op_type) { > > + case VIRTIO_CRYPTO_SYM_OP_NONE: > > + case VIRTIO_CRYPTO_SYM_OP_CIPHER: > > + ret =3D transform_cipher_param(&xform1, sess_param); > > + if (unlikely(ret)) { > > + VC_LOG_ERR("Error transform session msg (%i)", ret); > > + sess_param->session_id =3D ret; > > + return; > > + } > > + break; > > + case VIRTIO_CRYPTO_SYM_OP_ALGORITHM_CHAINING: > > + if (unlikely(sess_param->hash_mode !=3D > > + VIRTIO_CRYPTO_SYM_HASH_MODE_AUTH)) > { > > + sess_param->session_id =3D - > VIRTIO_CRYPTO_NOTSUPP; > > + VC_LOG_ERR("Error transform session message (%i)", > > + -VIRTIO_CRYPTO_NOTSUPP); > > + return; > > + } > > + > > + xform1.next =3D &xform2; > > + > > + ret =3D transform_chain_param(&xform1, sess_param); > > + if (unlikely(ret)) { > > + VC_LOG_ERR("Error transform session message (%i)", > ret); > > + sess_param->session_id =3D ret; > > + return; > > + } > > + > > + break; > > + default: > > + VC_LOG_ERR("Algorithm not yet supported"); > > + sess_param->session_id =3D -VIRTIO_CRYPTO_NOTSUPP; > > + return; > > + } > > + > > + session =3D rte_cryptodev_sym_session_create(vcrypto->sess_pool); > > + if (!session) { > > + VC_LOG_ERR("Failed to create session"); > > + sess_param->session_id =3D -VIRTIO_CRYPTO_ERR; > > + return; > > + } > > + > > + if (rte_cryptodev_sym_session_init(vcrypto->cid, session, &xform1, > > + vcrypto->sess_pool) < 0) { > > + VC_LOG_ERR("Failed to initialize session"); > > + sess_param->session_id =3D -VIRTIO_CRYPTO_ERR; > > + return; > > + } > > + > > + /* insert hash to map */ > > + if (rte_hash_add_key_data(vcrypto->session_map, > > + &vcrypto->last_session_id, session) < 0) { > > + VC_LOG_ERR("Failed to insert session to hash table"); > > + > > + if (rte_cryptodev_sym_session_clear(vcrypto->cid, session) > < 0) > > + VC_LOG_ERR("Failed to clear session"); > > + else { > > + if (rte_cryptodev_sym_session_free(session) < 0) > > + VC_LOG_ERR("Failed to free session"); > > + } > > + sess_param->session_id =3D -VIRTIO_CRYPTO_ERR; > > + return; > > + } > > + > > + VC_LOG_DBG("Session (key %lu, session %p) created.", > > + vcrypto->last_session_id, session); > > + > > + sess_param->session_id =3D vcrypto->last_session_id; > > + vcrypto->last_session_id++; > > +} > > + > > +static int > > +vhost_crypto_close_sess(struct vhost_crypto *vcrypto, uint64_t > > +session_id) { > > + struct rte_cryptodev_sym_session *session; > > + uint64_t sess_id =3D session_id; > > + int ret; > > + > > + ret =3D rte_hash_lookup_data(vcrypto->session_map, &sess_id, > > + (void **)&session); > > + > > + if (unlikely(ret < 0)) { > > + VC_LOG_ERR("Failed to delete session (key %lu).", > session_id); > > + return -VIRTIO_CRYPTO_INVSESS; > > + } > > + > > + if (rte_cryptodev_sym_session_clear(vcrypto->cid, session) < 0) { > > + VC_LOG_DBG("Failed to delete session"); > > + return -VIRTIO_CRYPTO_ERR; > > + } > > + > > + if (rte_cryptodev_sym_session_free(session) < 0) { > > + VC_LOG_DBG("Failed to delete session"); > > + return -VIRTIO_CRYPTO_ERR; > > + } > > + > > + if (rte_hash_del_key(vcrypto->session_map, &sess_id) < 0) { > > + VC_LOG_DBG("Failed to delete session from hash table."); > > + return -VIRTIO_CRYPTO_ERR; > > + } > > + > > + VC_LOG_DBG("Session (key %lu, session %p) deleted.", sess_id, > > + session); > > + > > + return 0; > > +} > > + > > +static int > > +vhost_crypto_msg_post_handler(int vid, void *msg, uint32_t > > +*require_reply) { > > + struct virtio_net *dev =3D get_device(vid); > > + struct vhost_crypto *vcrypto; > > + VhostUserMsg *vmsg =3D msg; > > + int ret =3D 0; > > + > > + if (dev =3D=3D NULL || require_reply =3D=3D NULL) { > > + VC_LOG_ERR("Invalid vid %i", vid); > > + return -EINVAL; > > + } > > + > > + vcrypto =3D dev->extern_data; > > + if (vcrypto =3D=3D NULL) { > > + VC_LOG_ERR("Cannot find required data, is it initialized?"); > > + return -ENOENT; > > + } > > + > > + *require_reply =3D 0; > > + > > + if (vmsg->request.master =3D=3D VHOST_USER_CRYPTO_CREATE_SESS) { > > + vhost_crypto_create_sess(vcrypto, > > + &vmsg->payload.crypto_session); > > + *require_reply =3D 1; > > + } else if (vmsg->request.master =3D=3D > VHOST_USER_CRYPTO_CLOSE_SESS) > > + ret =3D vhost_crypto_close_sess(vcrypto, vmsg->payload.u64); > > + else > > + ret =3D -EINVAL; > > + > > + return ret; > > +}