qemu/ebpf/ebpf.c
<<
>>
Prefs
   1/*
   2 * QEMU eBPF binary declaration routine.
   3 *
   4 * Developed by Daynix Computing LTD (http://www.daynix.com)
   5 *
   6 * Authors:
   7 *  Andrew Melnychenko <andrew@daynix.com>
   8 *
   9 * SPDX-License-Identifier: GPL-2.0-or-later
  10 */
  11
  12#include "qemu/osdep.h"
  13#include "qemu/queue.h"
  14#include "qapi/error.h"
  15#include "qapi/qapi-commands-ebpf.h"
  16#include "ebpf/ebpf.h"
  17
  18typedef struct ElfBinaryDataEntry {
  19    int id;
  20    const void *data;
  21    size_t datalen;
  22
  23    QSLIST_ENTRY(ElfBinaryDataEntry) node;
  24} ElfBinaryDataEntry;
  25
  26static QSLIST_HEAD(, ElfBinaryDataEntry) ebpf_elf_obj_list =
  27                                            QSLIST_HEAD_INITIALIZER();
  28
  29void ebpf_register_binary_data(int id, const void *data, size_t datalen)
  30{
  31    struct ElfBinaryDataEntry *dataentry = NULL;
  32
  33    dataentry = g_new0(struct ElfBinaryDataEntry, 1);
  34    dataentry->data = data;
  35    dataentry->datalen = datalen;
  36    dataentry->id = id;
  37
  38    QSLIST_INSERT_HEAD(&ebpf_elf_obj_list, dataentry, node);
  39}
  40
  41const void *ebpf_find_binary_by_id(int id, size_t *sz, Error **errp)
  42{
  43    struct ElfBinaryDataEntry *it = NULL;
  44    QSLIST_FOREACH(it, &ebpf_elf_obj_list, node) {
  45        if (id == it->id) {
  46            *sz = it->datalen;
  47            return it->data;
  48        }
  49    }
  50
  51    error_setg(errp, "can't find eBPF object with id: %d", id);
  52
  53    return NULL;
  54}
  55
  56EbpfObject *qmp_request_ebpf(EbpfProgramID id, Error **errp)
  57{
  58    EbpfObject *ret = NULL;
  59    size_t size = 0;
  60    const void *data = ebpf_find_binary_by_id(id, &size, errp);
  61    if (!data) {
  62        return NULL;
  63    }
  64
  65    ret = g_new0(EbpfObject, 1);
  66    ret->object = g_base64_encode(data, size);
  67
  68    return ret;
  69}
  70