qemu/include/sysemu/rng.h
<<
>>
Prefs
   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
  27typedef struct RngRequest RngRequest;
  28typedef struct RngBackendClass RngBackendClass;
  29typedef struct RngBackend RngBackend;
  30
  31typedef void (EntropyReceiveFunc)(void *opaque,
  32                                  const void *data,
  33                                  size_t size);
  34
  35struct RngRequest
  36{
  37    EntropyReceiveFunc *receive_entropy;
  38    uint8_t *data;
  39    void *opaque;
  40    size_t offset;
  41    size_t size;
  42    QSIMPLEQ_ENTRY(RngRequest) next;
  43};
  44
  45struct RngBackendClass
  46{
  47    ObjectClass parent_class;
  48
  49    void (*request_entropy)(RngBackend *s, RngRequest *req);
  50
  51    void (*opened)(RngBackend *s, Error **errp);
  52};
  53
  54struct RngBackend
  55{
  56    Object parent;
  57
  58    /*< protected >*/
  59    bool opened;
  60    QSIMPLEQ_HEAD(requests, RngRequest) requests;
  61};
  62
  63
  64/**
  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
  74 * backend will queue each request and handle appropriately.
  75 *
  76 * The backend does not need to pass the full amount of data to @receive_entropy
  77 * but will pass a value greater than 0.
  78 */
  79void rng_backend_request_entropy(RngBackend *s, size_t size,
  80                                 EntropyReceiveFunc *receive_entropy,
  81                                 void *opaque);
  82
  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);
  93#endif
  94