rng: add RndBackend abstract object class
This is the backend used by devices that need to request entropy. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
0e5588438d
commit
a9b7b2ad7b
@ -100,6 +100,8 @@ common-obj-y += vl.o
|
||||
|
||||
common-obj-$(CONFIG_SLIRP) += slirp/
|
||||
|
||||
common-obj-y += backends/
|
||||
|
||||
######################################################################
|
||||
# libseccomp
|
||||
ifeq ($(CONFIG_SECCOMP),y)
|
||||
|
1
backends/Makefile.objs
Normal file
1
backends/Makefile.objs
Normal file
@ -0,0 +1 @@
|
||||
common-obj-y += rng.o
|
93
backends/rng.c
Normal file
93
backends/rng.c
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
* QEMU Random Number Generator Backend
|
||||
*
|
||||
* Copyright IBM, Corp. 2012
|
||||
*
|
||||
* Authors:
|
||||
* Anthony Liguori <aliguori@us.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#include "qemu/rng.h"
|
||||
#include "qerror.h"
|
||||
|
||||
void rng_backend_request_entropy(RngBackend *s, size_t size,
|
||||
EntropyReceiveFunc *receive_entropy,
|
||||
void *opaque)
|
||||
{
|
||||
RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
|
||||
|
||||
if (k->request_entropy) {
|
||||
k->request_entropy(s, size, receive_entropy, opaque);
|
||||
}
|
||||
}
|
||||
|
||||
void rng_backend_cancel_requests(RngBackend *s)
|
||||
{
|
||||
RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
|
||||
|
||||
if (k->cancel_requests) {
|
||||
k->cancel_requests(s);
|
||||
}
|
||||
}
|
||||
|
||||
static bool rng_backend_prop_get_opened(Object *obj, Error **errp)
|
||||
{
|
||||
RngBackend *s = RNG_BACKEND(obj);
|
||||
|
||||
return s->opened;
|
||||
}
|
||||
|
||||
void rng_backend_open(RngBackend *s, Error **errp)
|
||||
{
|
||||
object_property_set_bool(OBJECT(s), true, "opened", errp);
|
||||
}
|
||||
|
||||
static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
RngBackend *s = RNG_BACKEND(obj);
|
||||
RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
|
||||
|
||||
if (value == s->opened) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!value && s->opened) {
|
||||
error_set(errp, QERR_PERMISSION_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (k->opened) {
|
||||
k->opened(s, errp);
|
||||
}
|
||||
|
||||
if (!error_is_set(errp)) {
|
||||
s->opened = value;
|
||||
}
|
||||
}
|
||||
|
||||
static void rng_backend_init(Object *obj)
|
||||
{
|
||||
object_property_add_bool(obj, "opened",
|
||||
rng_backend_prop_get_opened,
|
||||
rng_backend_prop_set_opened,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static TypeInfo rng_backend_info = {
|
||||
.name = TYPE_RNG_BACKEND,
|
||||
.parent = TYPE_OBJECT,
|
||||
.instance_size = sizeof(RngBackend),
|
||||
.instance_init = rng_backend_init,
|
||||
.class_size = sizeof(RngBackendClass),
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
static void register_types(void)
|
||||
{
|
||||
type_register_static(&rng_backend_info);
|
||||
}
|
||||
|
||||
type_init(register_types);
|
93
include/qemu/rng.h
Normal file
93
include/qemu/rng.h
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
* QEMU Random Number Generator Backend
|
||||
*
|
||||
* Copyright IBM, Corp. 2012
|
||||
*
|
||||
* Authors:
|
||||
* Anthony Liguori <aliguori@us.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef QEMU_RNG_H
|
||||
#define QEMU_RNG_H
|
||||
|
||||
#include "qemu/object.h"
|
||||
#include "qemu-common.h"
|
||||
#include "error.h"
|
||||
|
||||
#define TYPE_RNG_BACKEND "rng-backend"
|
||||
#define RNG_BACKEND(obj) \
|
||||
OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND)
|
||||
#define RNG_BACKEND_GET_CLASS(obj) \
|
||||
OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND)
|
||||
#define RNG_BACKEND_CLASS(klass) \
|
||||
OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
|
||||
|
||||
typedef struct RngBackendClass RngBackendClass;
|
||||
typedef struct RngBackend RngBackend;
|
||||
|
||||
typedef void (EntropyReceiveFunc)(void *opaque,
|
||||
const void *data,
|
||||
size_t size);
|
||||
|
||||
struct RngBackendClass
|
||||
{
|
||||
ObjectClass parent_class;
|
||||
|
||||
void (*request_entropy)(RngBackend *s, size_t size,
|
||||
EntropyReceiveFunc *recieve_entropy, void *opaque);
|
||||
void (*cancel_requests)(RngBackend *s);
|
||||
|
||||
void (*opened)(RngBackend *s, Error **errp);
|
||||
};
|
||||
|
||||
struct RngBackend
|
||||
{
|
||||
Object parent;
|
||||
|
||||
/*< protected >*/
|
||||
bool opened;
|
||||
};
|
||||
|
||||
/**
|
||||
* rng_backend_request_entropy:
|
||||
* @s: the backend to request entropy from
|
||||
* @size: the number of bytes of data to request
|
||||
* @receive_entropy: a function to be invoked when entropy is available
|
||||
* @opaque: data that should be passed to @receive_entropy
|
||||
*
|
||||
* This function is used by the front-end to request entropy from an entropy
|
||||
* source. This function can be called multiple times before @receive_entropy
|
||||
* is invoked with different values of @receive_entropy and @opaque. The
|
||||
* backend will queue each request and handle appropriate.
|
||||
*
|
||||
* The backend does not need to pass the full amount of data to @receive_entropy
|
||||
* but will pass at a value greater than 0.
|
||||
*/
|
||||
void rng_backend_request_entropy(RngBackend *s, size_t size,
|
||||
EntropyReceiveFunc *receive_entropy,
|
||||
void *opaque);
|
||||
|
||||
/**
|
||||
* rng_backend_cancel_requests:
|
||||
* @s: the backend to cancel all pending requests in
|
||||
*
|
||||
* Cancels all pending requests submitted by @rng_backend_request_entropy. This
|
||||
* should be used by a device during reset or in preparation for live migration
|
||||
* to stop tracking any request.
|
||||
*/
|
||||
void rng_backend_cancel_requests(RngBackend *s);
|
||||
|
||||
/**
|
||||
* rng_backend_open:
|
||||
* @s: the backend to open
|
||||
* @errp: a pointer to return the #Error object if an error occurs.
|
||||
*
|
||||
* This function will open the backend if it is not already open. Calling this
|
||||
* function on an already opened backend will not result in an error.
|
||||
*/
|
||||
void rng_backend_open(RngBackend *s, Error **errp);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user