From patchwork Tue Sep 13 03:52:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gonglei (Arei)" X-Patchwork-Id: 9328329 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0B1C36089F for ; Tue, 13 Sep 2016 03:54:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0027C2903C for ; Tue, 13 Sep 2016 03:54:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E8B9A29097; Tue, 13 Sep 2016 03:54:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 79DB72903C for ; Tue, 13 Sep 2016 03:54:02 +0000 (UTC) Received: from localhost ([::1]:46309 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjenJ-0006RP-K3 for patchwork-qemu-devel@patchwork.kernel.org; Mon, 12 Sep 2016 23:54:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37572) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjemn-0006Pv-9Y for qemu-devel@nongnu.org; Mon, 12 Sep 2016 23:53:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bjemj-00035X-6O for qemu-devel@nongnu.org; Mon, 12 Sep 2016 23:53:29 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:40355) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjemi-00034x-Go for qemu-devel@nongnu.org; Mon, 12 Sep 2016 23:53:25 -0400 Received: from 172.24.1.60 (EHLO szxeml422-hub.china.huawei.com) ([172.24.1.60]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DMZ70117; Tue, 13 Sep 2016 11:52:56 +0800 (CST) Received: from localhost (10.177.18.62) by szxeml422-hub.china.huawei.com (10.82.67.152) with Microsoft SMTP Server id 14.3.235.1; Tue, 13 Sep 2016 11:52:47 +0800 From: Gonglei To: , Date: Tue, 13 Sep 2016 11:52:09 +0800 Message-ID: <1473738741-220600-4-git-send-email-arei.gonglei@huawei.com> X-Mailer: git-send-email 2.6.3.windows.1 In-Reply-To: <1473738741-220600-1-git-send-email-arei.gonglei@huawei.com> References: <1473738741-220600-1-git-send-email-arei.gonglei@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.18.62] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020204.57D77818.0130, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: b84a52033230b6b889a134b70dd5c7b8 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.65 Subject: [Qemu-devel] [PATCH v2 03/15] crypto: add cryptoLegacyHW stuff X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: claudio.fontana@huawei.com, mst@redhat.com, xin.zeng@intel.com, luonengjun@huawei.com, peter.huangpeng@huawei.com, agraf@suse.de, nmorey@kalray.eu, mike.caraman@nxp.com, Gonglei , stefanha@redhat.com, pbonzini@redhat.com, vincent.jardin@6wind.com, weidong.huang@huawei.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP In previous patch, we define CryptoLegacyHWOptions in qapi-schema.json. we introduce the new/delete funciton about crypto legacy hardware device. Note: legacy cryptographic device support muliple queue. Signed-off-by: Gonglei --- crypto/crypto.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ include/crypto/crypto.h | 29 +++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/crypto/crypto.c b/crypto/crypto.c index a0e4a34..3f760fd 100644 --- a/crypto/crypto.c +++ b/crypto/crypto.c @@ -197,3 +197,77 @@ int qemu_send_crypto_packet_async(CryptoClientState *sender, return qemu_crypto_queue_send(queue, flags, sender, opaque, sent_cb); } + +CryptoLegacyHWState * +qemu_new_crypto_legacy_hw(CryptoClientInfo *info, + CryptoLegacyHWConf *conf, + const char *model, + const char *name, + void *opaque) +{ + CryptoLegacyHWState *crypto; + CryptoClientState **peers = conf->peers.ccs; + int i, queues = MAX(1, conf->peers.queues); + + assert(info->type == CRYPTO_CLIENT_OPTIONS_KIND_LEGACY_HW); + assert(info->size >= sizeof(CryptoLegacyHWState)); + + crypto = g_malloc0(info->size + sizeof(CryptoClientState) * queues); + crypto->ccs = (void *)crypto + info->size; + crypto->opaque = opaque; + crypto->conf = conf; + + for (i = 0; i < queues; i++) { + crypto_client_setup(&crypto->ccs[i], info, peers[i], model, name, + NULL); + crypto->ccs[i].queue_index = i; + crypto->ccs[i].ready = true; + } + + return crypto; +} + +static void qemu_cleanup_crypto_client(CryptoClientState *cc) +{ + QTAILQ_REMOVE(&crypto_clients, cc, next); + + if (cc->info->cleanup) { + cc->info->cleanup(cc); + } +} + +static void qemu_free_crypto_client(CryptoClientState *cc) +{ + if (cc->incoming_queue) { + qemu_del_crypto_queue(cc->incoming_queue); + } + if (cc->peer) { + cc->peer->peer = NULL; + } + g_free(cc->model); + g_free(cc->name); + + if (cc->destructor) { + cc->destructor(cc); + } +} + +CryptoClientState * +qemu_get_crypto_subqueue(CryptoLegacyHWState *crypto, int queue_index) +{ + return crypto->ccs + queue_index; +} + +void qemu_del_crypto_legacy_hw(CryptoLegacyHWState *crypto) +{ + int i, queues = MAX(crypto->conf->peers.queues, 1); + + for (i = queues - 1; i >= 0; i--) { + CryptoClientState *cc = qemu_get_crypto_subqueue(crypto, i); + + qemu_cleanup_crypto_client(cc); + qemu_free_crypto_client(cc); + } + + g_free(crypto); +} diff --git a/include/crypto/crypto.h b/include/crypto/crypto.h index 46b3b9e..4f0efb7 100644 --- a/include/crypto/crypto.h +++ b/include/crypto/crypto.h @@ -31,6 +31,7 @@ #include "qapi-types.h" #include "crypto/crypto-queue.h" +#define MAX_CRYPTO_QUEUE_NUM 64 typedef void (CryptoPoll)(CryptoClientState *, bool); typedef void (CryptoCleanup) (CryptoClientState *); @@ -59,6 +60,24 @@ struct CryptoClientState { CryptoClientDestructor *destructor; }; +/* qdev crypto legacy hardware properties */ + +typedef struct CryptoLegacyHWPeers { + CryptoClientState *ccs[MAX_CRYPTO_QUEUE_NUM]; + int32_t queues; +} CryptoLegacyHWPeers; + +typedef struct CryptoLegacyHWConf { + CryptoLegacyHWPeers peers; +} CryptoLegacyHWConf; + +typedef struct CryptoLegacyHWState { + CryptoClientState *ccs; + void *opaque; + CryptoLegacyHWConf *conf; + bool peer_deleted; +} CryptoLegacyHWState; + int crypto_client_init(QemuOpts *opts, Error **errp); int crypto_init_clients(void); @@ -74,5 +93,15 @@ int qemu_send_crypto_packet_async(CryptoClientState *sender, unsigned flags, void *opaque, CryptoPacketSent *sent_cb); +CryptoLegacyHWState * +qemu_new_crypto_legacy_hw(CryptoClientInfo *info, + CryptoLegacyHWConf *conf, + const char *model, + const char *name, + void *opaque); +void qemu_del_crypto_legacy_hw(CryptoLegacyHWState *crypto); + +CryptoClientState * +qemu_get_crypto_subqueue(CryptoLegacyHWState *crypto, int queue_index); #endif /* QCRYPTO_CRYPTO_H__ */