blob: 45629c4c53256f7479d2ef60a45913533bff389d [file] [log] [blame]
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -05001/*
2 * QEMU Random Number Generator Backend
3 *
4 * Copyright IBM, Corp. 2012
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
12
13#ifndef QEMU_RNG_H
14#define QEMU_RNG_H
15
Paolo Bonzini14cccb62012-12-17 18:19:50 +010016#include "qom/object.h"
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050017#include "qemu-common.h"
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050018
19#define TYPE_RNG_BACKEND "rng-backend"
20#define RNG_BACKEND(obj) \
21 OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND)
22#define RNG_BACKEND_GET_CLASS(obj) \
23 OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND)
24#define RNG_BACKEND_CLASS(klass) \
25 OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
26
Ladi Prosek74074e82016-03-03 09:37:16 +010027typedef struct RngRequest RngRequest;
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050028typedef struct RngBackendClass RngBackendClass;
29typedef struct RngBackend RngBackend;
30
31typedef void (EntropyReceiveFunc)(void *opaque,
32 const void *data,
33 size_t size);
34
Ladi Prosek74074e82016-03-03 09:37:16 +010035struct RngRequest
36{
37 EntropyReceiveFunc *receive_entropy;
38 uint8_t *data;
39 void *opaque;
40 size_t offset;
41 size_t size;
Ladi Prosek443590c2016-03-03 14:16:11 +010042 QSIMPLEQ_ENTRY(RngRequest) next;
Ladi Prosek74074e82016-03-03 09:37:16 +010043};
44
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050045struct RngBackendClass
46{
47 ObjectClass parent_class;
48
Ladi Prosek60253ed2016-03-03 09:37:18 +010049 void (*request_entropy)(RngBackend *s, RngRequest *req);
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050050
51 void (*opened)(RngBackend *s, Error **errp);
52};
53
54struct RngBackend
55{
56 Object parent;
57
58 /*< protected >*/
59 bool opened;
Ladi Prosek443590c2016-03-03 14:16:11 +010060 QSIMPLEQ_HEAD(requests, RngRequest) requests;
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050061};
62
Ladi Prosek9f14b0a2016-03-03 09:37:17 +010063
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050064/**
65 * rng_backend_request_entropy:
66 * @s: the backend to request entropy from
67 * @size: the number of bytes of data to request
68 * @receive_entropy: a function to be invoked when entropy is available
69 * @opaque: data that should be passed to @receive_entropy
70 *
71 * This function is used by the front-end to request entropy from an entropy
72 * source. This function can be called multiple times before @receive_entropy
73 * is invoked with different values of @receive_entropy and @opaque. The
Amit Shah42015c92012-11-21 11:21:21 +053074 * backend will queue each request and handle appropriately.
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050075 *
76 * The backend does not need to pass the full amount of data to @receive_entropy
Amit Shah42015c92012-11-21 11:21:21 +053077 * but will pass a value greater than 0.
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050078 */
79void rng_backend_request_entropy(RngBackend *s, size_t size,
80 EntropyReceiveFunc *receive_entropy,
81 void *opaque);
Ladi Prosek9f14b0a2016-03-03 09:37:17 +010082
83/**
84 * rng_backend_free_request:
85 * @s: the backend that created the request
86 * @req: the request to finalize
87 *
88 * Used by child rng backend classes to finalize requests once they've been
89 * processed. The request is removed from the list of active requests and
90 * deleted.
91 */
92void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
Anthony Liguoria9b7b2a2012-06-25 10:03:47 -050093#endif