netjson: fix NetworkGraph output
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 May 2016 14:33:50 +0000 (15:33 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 May 2016 16:56:33 +0000 (17:56 +0100)
Now show the entire network.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/netjson/src/olsrd_netjson.c
lib/netjson/src/olsrd_netjson_helpers.c
lib/netjson/src/olsrd_netjson_helpers.h

index fca2f4b..ccfaed1 100644 (file)
@@ -163,6 +163,7 @@ void ipc_print_network_graph(struct autobuf *abuf) {
   struct avl_tree nodes;
   struct mid_entry mid_self;
   struct node_entry * node_self;
+  struct tc_entry * tc;
   struct link_entry * link_entry;
   struct neighbor_entry * neighbor;
   int idx;
@@ -198,6 +199,15 @@ void ipc_print_network_graph(struct autobuf *abuf) {
     }
   }
 
+  /* TC */
+  OLSR_FOR_ALL_TC_ENTRIES(tc) {
+    struct tc_edge_entry *tc_edge;
+    netjson_tcIntoNodesTree(&nodes, tc);
+    OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) {
+     netjson_tcEdgeIntoNodesTree(&nodes, tc_edge);
+    } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge);
+  } OLSR_FOR_ALL_TC_ENTRIES_END(tc);
+
   /* LINKS */
   OLSR_FOR_ALL_LINK_ENTRIES(link_entry) {
     netjson_linkIntoNodesTree(&nodes, link_entry, &link_entry->local_iface_addr);
@@ -236,6 +246,10 @@ void ipc_print_network_graph(struct autobuf *abuf) {
           }
           abuf_json_mark_object(&json_session, false, true, abuf, NULL);
         }
+      } else if (node_entry->tc) {
+        /* no local_addresses */
+      } else if (node_entry->tc_edge) {
+        /* no local_addresses */
       } else if (node_entry->link) {
         /* no local_addresses */
       } else if (node_entry->neighbor) {
@@ -260,14 +274,41 @@ void ipc_print_network_graph(struct autobuf *abuf) {
    */
 
   abuf_json_mark_object(&json_session, true, true, abuf, "links");
+
   OLSR_FOR_ALL_LINK_ENTRIES(link_entry) {
     struct lqtextbuffer lqbuf;
+    int link_status = lookup_link_status(link_entry);
+
+    if ((link_status != ASYM_LINK) && (link_status != SYM_LINK)) {
+      continue;
+    }
+
+    /*
+     * link from node to neighbor
+     */
+    if (link_status == SYM_LINK) {
+      abuf_json_mark_array_entry(&json_session, true, abuf);
+
+      /* mandatory */
+      abuf_json_ip_address(&json_session, abuf, "source", &link_entry->local_iface_addr);
+      abuf_json_ip_address(&json_session, abuf, "target", &link_entry->neighbor_iface_addr);
+      abuf_json_float(&json_session, abuf, "cost", get_linkcost_scaled(link_entry->linkcost, false));
+
+      /* optional */
+      abuf_json_string(&json_session, abuf, "cost_text", get_linkcost_text(link_entry->linkcost, false, &lqbuf));
+      // properties
+
+      abuf_json_mark_array_entry(&json_session, false, abuf);
+    }
 
+    /*
+     * link from neighbor to node
+     */
     abuf_json_mark_array_entry(&json_session, true, abuf);
 
     /* mandatory */
-    abuf_json_ip_address(&json_session, abuf, "source", &link_entry->local_iface_addr);
-    abuf_json_ip_address(&json_session, abuf, "target", &link_entry->neighbor_iface_addr);
+    abuf_json_ip_address(&json_session, abuf, "source", &link_entry->neighbor_iface_addr);
+    abuf_json_ip_address(&json_session, abuf, "target", &link_entry->local_iface_addr);
     abuf_json_float(&json_session, abuf, "cost", get_linkcost_scaled(link_entry->linkcost, false));
 
     /* optional */
@@ -276,6 +317,31 @@ void ipc_print_network_graph(struct autobuf *abuf) {
 
     abuf_json_mark_array_entry(&json_session, false, abuf);
   } OLSR_FOR_ALL_LINK_ENTRIES_END(my_link);
+
+  OLSR_FOR_ALL_TC_ENTRIES(tc) {
+    struct tc_edge_entry *tc_edge;
+    OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) {
+      struct lqtextbuffer lqbuf;
+
+      if (ipequal(&olsr_cnf->main_addr, &tc->addr)) {
+        continue;
+      }
+
+      abuf_json_mark_array_entry(&json_session, true, abuf);
+
+      /* mandatory */
+      abuf_json_ip_address(&json_session, abuf, "source", &tc->addr);
+      abuf_json_ip_address(&json_session, abuf, "target", &tc_edge->T_dest_addr);
+      abuf_json_float(&json_session, abuf, "cost", get_linkcost_scaled(tc_edge->cost, false));
+
+      /* optional */
+      abuf_json_string(&json_session, abuf, "cost_text", get_linkcost_text(tc_edge->cost, false, &lqbuf));
+      // properties
+
+      abuf_json_mark_array_entry(&json_session, false, abuf);
+    } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge);
+  } OLSR_FOR_ALL_TC_ENTRIES_END(tc);
+
   abuf_json_mark_object(&json_session, false, true, abuf, NULL);
 }
 
index 4f3066a..6ca53e1 100644 (file)
@@ -164,6 +164,52 @@ void netjson_midIntoNodesTree(struct avl_tree *nodes, struct mid_entry *mid) {
   }
 }
 
+void netjson_tcIntoNodesTree(struct avl_tree *nodes, struct tc_entry *tc) {
+  struct avl_node *avlnode;
+  struct node_entry *node;
+
+  avlnode = avl_find(nodes, &tc->addr);
+  if (avlnode) {
+    /* the IP address is already known */
+    return;
+  }
+
+  /* the IP address is not yet known */
+
+  node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - TC - main");
+  memset(node, 0, sizeof(*node));
+  node->avl.key = &tc->addr;
+  node->isAlias = false;
+  node->tc = tc;
+  if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+    /* duplicate */
+    free(node);
+  }
+}
+
+void netjson_tcEdgeIntoNodesTree(struct avl_tree *nodes, struct tc_edge_entry *tc_edge) {
+  struct avl_node *avlnode;
+  struct node_entry *node;
+
+  avlnode = avl_find(nodes, &tc_edge->T_dest_addr);
+  if (avlnode) {
+    /* the IP address is already known */
+    return;
+  }
+
+  /* the IP address is not yet known */
+
+  node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - TC - main");
+  memset(node, 0, sizeof(*node));
+  node->avl.key = &tc_edge->T_dest_addr;
+  node->isAlias = false;
+  node->tc_edge = tc_edge;
+  if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+    /* duplicate */
+    free(node);
+  }
+}
+
 void netjson_linkIntoNodesTree(struct avl_tree *nodes, struct link_entry *link, union olsr_ip_addr *addr) {
   struct avl_node *avlnode;
   struct node_entry *node;
index 8a3b185..b035675 100644 (file)
@@ -50,6 +50,7 @@
 
 #include "common/avl.h"
 #include "mid_set.h"
+#include "tc_set.h"
 #include "link_set.h"
 #include "neighbor_table.h"
 #include "olsr_types.h"
@@ -58,6 +59,8 @@ struct node_entry {
   struct avl_node avl;
   bool isAlias;
   struct mid_entry *mid;
+  struct tc_entry *tc;
+  struct tc_edge_entry *tc_edge;
   struct link_entry *link;
   struct neighbor_entry *neighbor;
 };
@@ -68,6 +71,8 @@ AVLNODE2STRUCT(avlnode2node, struct node_entry, avl);
 struct node_entry * netjson_constructMidSelf(struct mid_entry *mid);
 void netjson_cleanup_mid_self(struct node_entry *node_entry);
 void netjson_midIntoNodesTree(struct avl_tree *nodes, struct mid_entry *mid);
+void netjson_tcIntoNodesTree(struct avl_tree *nodes, struct tc_entry *tc);
+void netjson_tcEdgeIntoNodesTree(struct avl_tree *nodes, struct tc_edge_entry *tc_edge);
 void netjson_linkIntoNodesTree(struct avl_tree *nodes, struct link_entry *link, union olsr_ip_addr *addr);
 void netjson_neighborIntoNodesTree(struct avl_tree *nodes, struct neighbor_entry *neigh);