xref: /qemu/include/sysemu/rng.h (revision 4f7ab0cd)
1 /*
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 
16 #include "qom/object.h"
17 #include "qemu-common.h"
18 
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 
27 typedef struct RngBackendClass RngBackendClass;
28 typedef struct RngBackend RngBackend;
29 
30 typedef void (EntropyReceiveFunc)(void *opaque,
31                                   const void *data,
32                                   size_t size);
33 
34 struct RngBackendClass
35 {
36     ObjectClass parent_class;
37 
38     void (*request_entropy)(RngBackend *s, size_t size,
39                             EntropyReceiveFunc *receive_entropy, void *opaque);
40     void (*cancel_requests)(RngBackend *s);
41 
42     void (*opened)(RngBackend *s, Error **errp);
43 };
44 
45 struct RngBackend
46 {
47     Object parent;
48 
49     /*< protected >*/
50     bool opened;
51 };
52 
53 /**
54  * rng_backend_request_entropy:
55  * @s: the backend to request entropy from
56  * @size: the number of bytes of data to request
57  * @receive_entropy: a function to be invoked when entropy is available
58  * @opaque: data that should be passed to @receive_entropy
59  *
60  * This function is used by the front-end to request entropy from an entropy
61  * source.  This function can be called multiple times before @receive_entropy
62  * is invoked with different values of @receive_entropy and @opaque.  The
63  * backend will queue each request and handle appropriately.
64  *
65  * The backend does not need to pass the full amount of data to @receive_entropy
66  * but will pass a value greater than 0.
67  */
68 void rng_backend_request_entropy(RngBackend *s, size_t size,
69                                  EntropyReceiveFunc *receive_entropy,
70                                  void *opaque);
71 
72 /**
73  * rng_backend_cancel_requests:
74  * @s: the backend to cancel all pending requests in
75  *
76  * Cancels all pending requests submitted by @rng_backend_request_entropy.  This
77  * should be used by a device during reset or in preparation for live migration
78  * to stop tracking any request.
79  */
80 void rng_backend_cancel_requests(RngBackend *s);
81 #endif
82