qemu/tests/libqos/qgraph_internal.h
<<
>>
Prefs
   1/*
   2 * libqos driver framework
   3 *
   4 * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
   5 *
   6 * This library is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU Lesser General Public
   8 * License version 2 as published by the Free Software Foundation.
   9 *
  10 * This library is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * Lesser General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU Lesser General Public
  16 * License along with this library; if not, see <http://www.gnu.org/licenses/>
  17 */
  18
  19#ifndef QGRAPH_EXTRA_H
  20#define QGRAPH_EXTRA_H
  21
  22/* This header is declaring additional helper functions defined in
  23 * libqos/qgraph.c
  24 * It should not be included in tests
  25 */
  26
  27#include "libqos/qgraph.h"
  28
  29typedef struct QOSGraphMachine QOSGraphMachine;
  30typedef enum QOSEdgeType QOSEdgeType;
  31typedef enum QOSNodeType QOSNodeType;
  32
  33/* callback called when the walk path algorithm found a
  34 * valid path
  35 */
  36typedef void (*QOSTestCallback) (QOSGraphNode *path, int len);
  37
  38/* edge types*/
  39enum QOSEdgeType {
  40    QEDGE_CONTAINS,
  41    QEDGE_PRODUCES,
  42    QEDGE_CONSUMED_BY
  43};
  44
  45/* node types*/
  46enum QOSNodeType {
  47    QNODE_MACHINE,
  48    QNODE_DRIVER,
  49    QNODE_INTERFACE,
  50    QNODE_TEST
  51};
  52
  53/* Graph Node */
  54struct QOSGraphNode {
  55    QOSNodeType type;
  56    bool available;     /* set by QEMU via QMP, used during graph walk */
  57    bool visited;       /* used during graph walk */
  58    char *name;         /* used to identify the node */
  59    char *command_line; /* used to start QEMU at test execution */
  60    union {
  61        struct {
  62            QOSCreateDriverFunc constructor;
  63        } driver;
  64        struct {
  65            QOSCreateMachineFunc constructor;
  66        } machine;
  67        struct {
  68            QOSTestFunc function;
  69            void *arg;
  70            QOSBeforeTest before;
  71            bool subprocess;
  72        } test;
  73    } u;
  74
  75    /**
  76     * only used when traversing the path, never rely on that except in the
  77     * qos_traverse_graph callback function
  78     */
  79    QOSGraphEdge *path_edge;
  80};
  81
  82/**
  83 * qos_graph_get_node(): returns the node mapped to that @key.
  84 * It performs an hash map search O(1)
  85 *
  86 * Returns: on success: the %QOSGraphNode
  87 *          otherwise: #NULL
  88 */
  89QOSGraphNode *qos_graph_get_node(const char *key);
  90
  91/**
  92 * qos_graph_has_node(): returns #TRUE if the node
  93 * has map has a node mapped to that @key.
  94 */
  95bool qos_graph_has_node(const char *node);
  96
  97/**
  98 * qos_graph_get_node_type(): returns the %QOSNodeType
  99 * of the node @node.
 100 * It performs an hash map search O(1)
 101 * Returns: on success: the %QOSNodeType
 102 *          otherwise: #-1
 103 */
 104QOSNodeType qos_graph_get_node_type(const char *node);
 105
 106/**
 107 * qos_graph_get_node_availability(): returns the availability (boolean)
 108 * of the node @node.
 109 */
 110bool qos_graph_get_node_availability(const char *node);
 111
 112/**
 113 * qos_graph_get_edge(): returns the edge
 114 * linking of the node @node with @dest.
 115 *
 116 * Returns: on success: the %QOSGraphEdge
 117 *          otherwise: #NULL
 118 */
 119QOSGraphEdge *qos_graph_get_edge(const char *node, const char *dest);
 120
 121/**
 122 * qos_graph_edge_get_type(): returns the edge type
 123 * of the edge @edge.
 124 *
 125 * Returns: on success: the %QOSEdgeType
 126 *          otherwise: #-1
 127 */
 128QOSEdgeType qos_graph_edge_get_type(QOSGraphEdge *edge);
 129
 130/**
 131 * qos_graph_edge_get_dest(): returns the name of the node
 132 * pointed as destination of edge @edge.
 133 *
 134 * Returns: on success: the destination
 135 *          otherwise: #NULL
 136 */
 137char *qos_graph_edge_get_dest(QOSGraphEdge *edge);
 138
 139/**
 140 * qos_graph_has_edge(): returns #TRUE if there
 141 * exists an edge from @start to @dest.
 142 */
 143bool qos_graph_has_edge(const char *start, const char *dest);
 144
 145/**
 146 * qos_graph_edge_get_arg(): returns the args assigned
 147 * to that @edge.
 148 *
 149 * Returns: on success: the arg
 150 *          otherwise: #NULL
 151 */
 152void *qos_graph_edge_get_arg(QOSGraphEdge *edge);
 153
 154/**
 155 * qos_graph_edge_get_after_cmd_line(): returns the edge
 156 * command line that will be added after all the node arguments
 157 * and all the before_cmd_line arguments.
 158 *
 159 * Returns: on success: the char* arg
 160 *          otherwise: #NULL
 161 */
 162char *qos_graph_edge_get_after_cmd_line(QOSGraphEdge *edge);
 163
 164/**
 165 * qos_graph_edge_get_before_cmd_line(): returns the edge
 166 * command line that will be added before the node command
 167 * line argument.
 168 *
 169 * Returns: on success: the char* arg
 170 *          otherwise: #NULL
 171 */
 172char *qos_graph_edge_get_before_cmd_line(QOSGraphEdge *edge);
 173
 174/**
 175 * qos_graph_edge_get_extra_device_opts(): returns the arg
 176 * command line that will be added to the node command
 177 * line argument.
 178 *
 179 * Returns: on success: the char* arg
 180 *          otherwise: #NULL
 181 */
 182char *qos_graph_edge_get_extra_device_opts(QOSGraphEdge *edge);
 183
 184/**
 185 * qos_graph_edge_get_name(): returns the name
 186 * assigned to the destination node (different only)
 187 * if there are multiple devices with the same node name
 188 * e.g. a node has two "generic-sdhci", "emmc" and "sdcard"
 189 * there will be two edges with edge_name ="emmc" and "sdcard"
 190 *
 191 * Returns always the char* edge_name
 192 */
 193char *qos_graph_edge_get_name(QOSGraphEdge *edge);
 194
 195/**
 196 * qos_graph_get_machine(): returns the machine assigned
 197 * to that @node name.
 198 *
 199 * It performs a search only trough the list of machines
 200 * (i.e. the QOS_ROOT child).
 201 *
 202 * Returns: on success: the %QOSGraphNode
 203 *          otherwise: #NULL
 204 */
 205QOSGraphNode *qos_graph_get_machine(const char *node);
 206
 207/**
 208 * qos_graph_has_machine(): returns #TRUE if the node
 209 * has map has a node mapped to that @node.
 210 */
 211bool qos_graph_has_machine(const char *node);
 212
 213
 214/**
 215 * qos_print_graph(): walks the graph and prints
 216 * all machine-to-test paths.
 217 */
 218void qos_print_graph(void);
 219
 220/**
 221 * qos_graph_foreach_test_path(): executes the Depth First search
 222 * algorithm and applies @fn to all discovered paths.
 223 *
 224 * See qos_traverse_graph() in qgraph.c for more info on
 225 * how it works.
 226 */
 227void qos_graph_foreach_test_path(QOSTestCallback fn);
 228
 229/**
 230 * qos_get_machine_type(): return QEMU machine type for a machine node.
 231 * This function requires every machine @name to be in the form
 232 * <arch>/<machine_name>, like "arm/raspi2" or "x86_64/pc".
 233 *
 234 * The function will validate the format and return a pointer to
 235 * @machine to <machine_name>.  For example, when passed "x86_64/pc"
 236 * it will return "pc".
 237 *
 238 * Note that this function *does not* allocate any new string.
 239 */
 240char *qos_get_machine_type(char *name);
 241
 242/**
 243 * qos_delete_cmd_line(): delete the
 244 * command line present in node mapped with key @name.
 245 *
 246 * This function is called when the QMP query returns a node with
 247 * { "abstract" : true } attribute.
 248 */
 249void qos_delete_cmd_line(const char *name);
 250
 251/**
 252 * qos_graph_node_set_availability(): sets the node identified
 253 * by @node with availability @av.
 254 */
 255void qos_graph_node_set_availability(const char *node, bool av);
 256
 257#endif
 258