graph: implement Graphviz export
authorJerin Jacob <jerinj@marvell.com>
Sat, 11 Apr 2020 14:14:08 +0000 (19:44 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 5 May 2020 21:31:41 +0000 (23:31 +0200)
Adding API implementation support exporting the graph object to file.
This will export the graph to a file in Graphviz format.
It can be viewed in many viewers such as
https://dreampuf.github.io/GraphvizOnline/

Signed-off-by: Jerin Jacob <jerinj@marvell.com>
Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
lib/librte_graph/graph.c
lib/librte_graph/rte_graph_version.map

index 7a77cb5..61e212e 100644 (file)
@@ -473,6 +473,59 @@ __rte_node_stream_alloc(struct rte_graph *graph, struct rte_node *node)
        node->realloc_count++;
 }
 
+static int
+graph_to_dot(FILE *f, struct graph *graph)
+{
+       const char *src_edge_color = " [color=blue]\n";
+       const char *edge_color = "\n";
+       struct graph_node *graph_node;
+       char *node_name;
+       rte_edge_t i;
+       int rc;
+
+       rc = fprintf(f, "Digraph %s {\n\trankdir=LR;\n", graph->name);
+       if (rc < 0)
+               goto end;
+
+       STAILQ_FOREACH(graph_node, &graph->node_list, next) {
+               node_name = graph_node->node->name;
+               for (i = 0; i < graph_node->node->nb_edges; i++) {
+                       rc = fprintf(f, "\t\"%s\"->\"%s\"%s", node_name,
+                                    graph_node->adjacency_list[i]->node->name,
+                                    graph_node->node->flags & RTE_NODE_SOURCE_F
+                                            ? src_edge_color
+                                            : edge_color);
+                       if (rc < 0)
+                               goto end;
+               }
+       }
+       rc = fprintf(f, "}\n");
+       if (rc < 0)
+               goto end;
+
+       return 0;
+end:
+       rte_errno = EBADF;
+       return -rte_errno;
+}
+
+int
+rte_graph_export(const char *name, FILE *f)
+{
+       struct graph *graph;
+       int rc = ENOENT;
+
+       STAILQ_FOREACH(graph, &graph_list, next) {
+               if (strncmp(graph->name, name, RTE_GRAPH_NAMESIZE) == 0) {
+                       rc = graph_to_dot(f, graph);
+                       goto end;
+               }
+       }
+end:
+       return -rc;
+}
+
+
 rte_graph_t
 rte_graph_max_count(void)
 {
index 5a2b132..2797be0 100644 (file)
@@ -6,6 +6,7 @@ EXPERIMENTAL {
 
        rte_graph_create;
        rte_graph_destroy;
+       rte_graph_export;
        rte_graph_from_name;
        rte_graph_id_to_name;
        rte_graph_lookup;