Most list head structs need not be given a name. In most cases the name is given just in case one is going to use QTAILQ_LAST, QTAILQ_PREV or reverse iteration, but this does not apply to lists of other kinds, and even for QTAILQ in practice this is only rarely needed. In addition, we will soon reimplement those macros completely so that they do not need a name for the head struct. So clean up everything, not giving a name except in the rare case where it is necessary. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
94 lines
2.6 KiB
C
94 lines
2.6 KiB
C
/*
|
|
* 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 "qom/object.h"
|
|
#include "qemu-common.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 RngRequest RngRequest;
|
|
typedef struct RngBackendClass RngBackendClass;
|
|
typedef struct RngBackend RngBackend;
|
|
|
|
typedef void (EntropyReceiveFunc)(void *opaque,
|
|
const void *data,
|
|
size_t size);
|
|
|
|
struct RngRequest
|
|
{
|
|
EntropyReceiveFunc *receive_entropy;
|
|
uint8_t *data;
|
|
void *opaque;
|
|
size_t offset;
|
|
size_t size;
|
|
QSIMPLEQ_ENTRY(RngRequest) next;
|
|
};
|
|
|
|
struct RngBackendClass
|
|
{
|
|
ObjectClass parent_class;
|
|
|
|
void (*request_entropy)(RngBackend *s, RngRequest *req);
|
|
|
|
void (*opened)(RngBackend *s, Error **errp);
|
|
};
|
|
|
|
struct RngBackend
|
|
{
|
|
Object parent;
|
|
|
|
/*< protected >*/
|
|
bool opened;
|
|
QSIMPLEQ_HEAD(, RngRequest) requests;
|
|
};
|
|
|
|
|
|
/**
|
|
* 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 appropriately.
|
|
*
|
|
* The backend does not need to pass the full amount of data to @receive_entropy
|
|
* but will pass a value greater than 0.
|
|
*/
|
|
void rng_backend_request_entropy(RngBackend *s, size_t size,
|
|
EntropyReceiveFunc *receive_entropy,
|
|
void *opaque);
|
|
|
|
/**
|
|
* rng_backend_free_request:
|
|
* @s: the backend that created the request
|
|
* @req: the request to finalize
|
|
*
|
|
* Used by child rng backend classes to finalize requests once they've been
|
|
* processed. The request is removed from the list of active requests and
|
|
* deleted.
|
|
*/
|
|
void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
|
|
#endif
|