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 "qemu/queue.h"
  17#include "qom/object.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#define TYPE_RNG_BUILTIN "rng-builtin"
  28
  29typedef struct RngRequest RngRequest;
  30typedef struct RngBackendClass RngBackendClass;
  31typedef struct RngBackend RngBackend;
  32
  33typedef void (EntropyReceiveFunc)(void *opaque,
  34                                  const void *data,
  35                                  size_t size);
  36
  37struct RngRequest
  38{
  39    EntropyReceiveFunc *receive_entropy;
  40    uint8_t *data;
  41    void *opaque;
  42    size_t offset;
  43    size_t size;
  44    QSIMPLEQ_ENTRY(RngRequest) next;
  45};
  46
  47struct RngBackendClass
  48{
  49    ObjectClass parent_class;
  50
  51    void (*request_entropy)(RngBackend *s, RngRequest *req);
  52
  53    void (*opened)(RngBackend *s, Error **errp);
  54};
  55
  56struct RngBackend
  57{
  58    Object parent;
  59
  60    /*< protected >*/
  61    bool opened;
  62    QSIMPLEQ_HEAD(, RngRequest) requests;
  63};
  64
  65
  66/**
  67 * rng_backend_request_entropy:
  68 * @s: the backend to request entropy from
  69 * @size: the number of bytes of data to request
  70 * @receive_entropy: a function to be invoked when entropy is available
  71 * @opaque: data that should be passed to @receive_entropy
  72 *
  73 * This function is used by the front-end to request entropy from an entropy
  74 * source.  This function can be called multiple times before @receive_entropy
  75 * is invoked with different values of @receive_entropy and @opaque.  The
  76 * backend will queue each request and handle appropriately.
  77 *
  78 * The backend does not need to pass the full amount of data to @receive_entropy
  79 * but will pass a value greater than 0.
  80 */
  81void rng_backend_request_entropy(RngBackend *s, size_t size,
  82                                 EntropyReceiveFunc *receive_entropy,
  83                                 void *opaque);
  84
  85/**
  86 * rng_backend_free_request:
  87 * @s: the backend that created the request
  88 * @req: the request to finalize
  89 *
  90 * Used by child rng backend classes to finalize requests once they've been
  91 * processed. The request is removed from the list of active requests and
  92 * deleted.
  93 */
  94void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
  95#endif
  96