netjson: add plugin
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 15 Apr 2016 11:07:25 +0000 (13:07 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 15 Apr 2016 11:16:17 +0000 (13:16 +0200)
Currently supports the commands:
- NetworkRoutes
- NetworkGraph
- NetworkCollection

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
Makefile
lib/netjson/Makefile [new file with mode: 0644]
lib/netjson/README_NETJSON [new file with mode: 0644]
lib/netjson/src/olsrd_netjson.c [new file with mode: 0644]
lib/netjson/src/olsrd_netjson.h [new file with mode: 0644]
lib/netjson/src/olsrd_netjson_helpers.c [new file with mode: 0644]
lib/netjson/src/olsrd_netjson_helpers.h [new file with mode: 0644]
lib/netjson/src/olsrd_plugin.c [new file with mode: 0644]
lib/netjson/src/olsrd_plugin.h [new file with mode: 0644]
lib/netjson/version-script.txt [new file with mode: 0644]
openwrt/olsrd-stable-git/Makefile

index 4ecfc36..86b3f5c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -224,15 +224,15 @@ rpm:
 
 # This is quite ugly but at least it works
 ifeq ($(OS),linux)
-SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo info jsoninfo mdns mini nameservice p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog
+SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo info jsoninfo mdns mini nameservice netjson p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog
 else
 ifeq ($(OS),win32)
-SUBDIRS := dot_draw httpinfo info jsoninfo mini pgraph secure txtinfo
+SUBDIRS := dot_draw httpinfo info jsoninfo mini netjson pgraph secure txtinfo
 else
 ifeq ($(OS),android)
-SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo info jsoninfo mdns mini nameservice p2pd pgraph pud secure sgwdynspeed txtinfo watchdog
+SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo info jsoninfo mdns mini nameservice netjson p2pd pgraph pud secure sgwdynspeed txtinfo watchdog
 else
-SUBDIRS := dot_draw httpinfo info jsoninfo mini nameservice pgraph secure txtinfo watchdog
+SUBDIRS := dot_draw httpinfo info jsoninfo mini nameservice netjson pgraph secure txtinfo watchdog
 endif
 endif
 endif
@@ -389,6 +389,18 @@ nameservice_install:
 nameservice_uninstall:
                $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) uninstall
 
+netjson: info
+               $(MAKECMDPREFIX)$(MAKECMD) -C lib/netjson
+
+netjson_clean: info_clean
+               $(MAKECMDPREFIX)$(MAKECMD) -C lib/netjson DESTDIR=$(DESTDIR) clean
+
+netjson_install: info_install
+               $(MAKECMDPREFIX)$(MAKECMD) -C lib/netjson DESTDIR=$(DESTDIR) install
+
+netjson_uninstall: info_uninstall
+               $(MAKECMDPREFIX)$(MAKECMD) -C lib/netjson DESTDIR=$(DESTDIR) uninstall
+
 p2pd:
                $(MAKECMDPREFIX)$(MAKECMD) -C lib/p2pd
 
diff --git a/lib/netjson/Makefile b/lib/netjson/Makefile
new file mode 100644 (file)
index 0000000..3d3a3a4
--- /dev/null
@@ -0,0 +1,70 @@
+# The olsr.org Optimized Link-State Routing daemon (olsrd)
+#
+# (c) by the OLSR project
+#
+# See our Git repository to find out who worked on this file
+# and thus is a copyright holder on it.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in
+#   the documentation and/or other materials provided with the
+#   distribution.
+# * Neither the name of olsr.org, olsrd nor the names of its
+#   contributors may be used to endorse or promote products derived
+#   from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Visit http://www.olsr.org for more information.
+#
+# If you find this software useful feel free to make a donation
+# to the project. For more information see the website or contact
+# the copyright holders.
+#
+
+OLSRD_PLUGIN = true
+PLUGIN_NAME =  olsrd_netjson
+PLUGIN_VER =   1.0
+
+TOPDIR =       ../..
+include $(TOPDIR)/Makefile.inc
+
+COMMONINFO = $(wildcard ../info/*.c)
+OBJS += $(COMMONINFO:%.c=%.o)
+
+default_target: $(PLUGIN_FULLNAME)
+
+$(PLUGIN_FULLNAME): $(OBJS) version-script.txt
+ifeq ($(VERBOSE),0)
+               @echo "[LD] $@"
+endif
+               $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
+
+install:       $(PLUGIN_FULLNAME)
+               $(STRIP) $(PLUGIN_FULLNAME)
+               $(INSTALL_LIB)
+
+uninstall:
+               $(UNINSTALL_LIB)
+
+clean:
+               rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
diff --git a/lib/netjson/README_NETJSON b/lib/netjson/README_NETJSON
new file mode 100644 (file)
index 0000000..fcff7b9
--- /dev/null
@@ -0,0 +1,31 @@
+============
+INTRODUCTION
+============
+
+The netjson plugin is an info plugin.
+
+Please first read what's written in the file lib/info/README_INFO.
+
+
+==================
+SUPPORTED COMMANDS
+==================
+
+* /NetworkRoutes
+* /NetworkGraph
+* /DeviceConfiguration (not currently supported)
+* /DeviceMonitoring    (not currently supported)
+* /NetworkCollection
+
+====================
+PLUGIN CONFIGURATION
+====================
+
+The plugin is configured with the generic info plugin configuration parameters.
+
+The port in the generic info plugin configuration is set to 2005.
+
+LoadPlugin "olsrd_netjson.so.0.0"
+{
+  # <generic info plugin configuration>
+}
diff --git a/lib/netjson/src/olsrd_netjson.c b/lib/netjson/src/olsrd_netjson.c
new file mode 100644 (file)
index 0000000..d441258
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "olsrd_netjson.h"
+
+#include <unistd.h>
+
+#include "olsrd_netjson_helpers.h"
+#include "info/info_types.h"
+#include "info/http_headers.h"
+#include "info/json_helpers.h"
+#include "common/avl.h"
+#include "olsr.h"
+#include "builddata.h"
+#include "routing_table.h"
+#include "mid_set.h"
+#include "link_set.h"
+
+#define NETJSON_PROTOCOL "olsrv1"
+
+unsigned long long get_supported_commands_mask(void) {
+  return SIW_NETJSON & ~(SIW_NETJSON_DEVICE_CONFIGURATION | SIW_NETJSON_DEVICE_MONITORING);
+}
+
+bool isCommand(const char *str, unsigned long long siw) {
+  const char * cmd = NULL;
+  switch (siw) {
+    case SIW_NETJSON_NETWORK_ROUTES:
+      cmd = "/NetworkRoutes";
+      break;
+
+    case SIW_NETJSON_NETWORK_GRAPH:
+      cmd = "/NetworkGraph";
+      break;
+
+    case SIW_NETJSON_NETWORK_COLLECTION:
+      cmd = "/NetworkCollection";
+      break;
+
+    default:
+      return false;
+  }
+
+  return !strcmp(str, cmd);
+}
+
+const char * determine_mime_type(unsigned int send_what __attribute__((unused))) {
+  return "application/json; charset=utf-8";
+}
+
+void output_start(struct autobuf *abuf) {
+  /* global variables for tracking when to put a comma in for JSON */
+  abuf_json_reset_entry_number_and_depth();
+  abuf_json_mark_output(true, abuf);
+}
+
+void output_end(struct autobuf *abuf) {
+  abuf_json_mark_output(false, abuf);
+  abuf_puts(abuf, "\n");
+}
+
+void output_error(struct autobuf *abuf, unsigned int status, const char * req __attribute__((unused)), bool http_headers) {
+  if (http_headers || (status == INFO_HTTP_OK)) {
+    return;
+  }
+
+  /* !http_headers && !INFO_HTTP_OK */
+
+  output_start(abuf);
+
+  if (status == INFO_HTTP_NOCONTENT) {
+    /* do nothing */
+  } else {
+    abuf_json_string(abuf, "error", httpStatusToReply(status));
+  }
+
+  output_end(abuf);
+}
+
+void ipc_print_network_routes(struct autobuf *abuf) {
+  struct rt_entry *rt;
+
+  /* mandatory */
+  abuf_json_string(abuf, "type", "NetworkRoutes");
+  abuf_json_string(abuf, "protocol", NETJSON_PROTOCOL);
+  abuf_json_string(abuf, "version", release_version);
+  abuf_json_string(abuf, "metric", olsr_cnf->lq_algorithm);
+
+  /* optional */
+  abuf_json_string(abuf, "revision", olsrd_version);
+  // topology_id
+  abuf_json_ip_address(abuf, "router_id", &olsr_cnf->main_addr);
+
+  /* Walk the route table */
+  abuf_json_mark_object(true, true, abuf, "routes");
+  OLSR_FOR_ALL_RT_ENTRIES(rt) {
+    if (rt->rt_best) {
+      struct lqtextbuffer lqbuf;
+
+      abuf_json_mark_array_entry(true, abuf);
+      /* mandatory */
+      abuf_json_prefix(abuf, "destination", &rt->rt_dst);
+      abuf_json_ip_address(abuf, "next", &rt->rt_best->rtp_nexthop.gateway);
+      abuf_json_string(abuf, "device", if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index));
+      abuf_json_float(abuf, "cost", get_linkcost_scaled(rt->rt_best->rtp_metric.cost, true));
+
+      /* optional */
+      abuf_json_string(abuf, "cost_text", get_linkcost_text(rt->rt_best->rtp_metric.cost, true, &lqbuf));
+      // source
+
+      abuf_json_mark_array_entry(false, abuf);
+    }
+  } OLSR_FOR_ALL_RT_ENTRIES_END(rt);
+  abuf_json_mark_object(false, true, abuf, NULL);
+}
+
+void ipc_print_network_graph(struct autobuf *abuf) {
+  struct avl_tree nodes;
+  struct mid_entry mid_self;
+  struct node_entry * node_self;
+  struct link_entry * link_entry;
+  struct neighbor_entry * neighbor;
+  int idx;
+
+  avl_init(&nodes, (olsr_cnf->ip_version == AF_INET) ? avl_comp_ipv4 : avl_comp_ipv6);
+
+  /* mandatory */
+  abuf_json_string(abuf, "type", "NetworkGraph");
+  abuf_json_string(abuf, "protocol", NETJSON_PROTOCOL);
+  abuf_json_string(abuf, "version", release_version);
+  abuf_json_string(abuf, "metric", olsr_cnf->lq_algorithm);
+
+  /* optional */
+  abuf_json_string(abuf, "revision", olsrd_version);
+  // topology_id
+  abuf_json_ip_address(abuf, "router_id", &olsr_cnf->main_addr);
+  // label
+
+  /*
+   * Collect all nodes
+   */
+
+  /* MID Self */
+  node_self = netjson_constructMidSelf(&mid_self);
+  netjson_midIntoNodesTree(&nodes, &mid_self);
+
+  /* MID */
+  for (idx = 0; idx < HASHSIZE; idx++) {
+    struct mid_entry * entry = mid_set[idx].next;
+    while (entry != &mid_set[idx]) {
+      netjson_midIntoNodesTree(&nodes, entry);
+      entry = entry->next;
+    }
+  }
+
+  /* LINKS */
+  OLSR_FOR_ALL_LINK_ENTRIES(link_entry) {
+    netjson_linkIntoNodesTree(&nodes, link_entry, &link_entry->local_iface_addr);
+    netjson_linkIntoNodesTree(&nodes, link_entry, &link_entry->neighbor_iface_addr);
+  } OLSR_FOR_ALL_LINK_ENTRIES_END(link_entry);
+
+  /* NEIGHBORS */
+  OLSR_FOR_ALL_NBR_ENTRIES(neighbor) {
+    netjson_neighborIntoNodesTree(&nodes, neighbor);
+  } OLSR_FOR_ALL_NBR_ENTRIES_END(neighbor);
+
+  /*
+   * Output Nodes
+   */
+
+  abuf_json_mark_object(true, true, abuf, "nodes");
+  while (nodes.count > 0) {
+    struct avl_node *node = avl_walk_first(&nodes);
+    struct node_entry *node_entry = avlnode2node(node);
+
+    if (!node_entry->isAlias) {
+      abuf_json_mark_array_entry(true, abuf);
+
+      /* mandatory */
+      abuf_json_ip_address(abuf, "id", node->key);
+
+      /* optional */
+      // label
+      if (node_entry->mid) {
+        struct mid_address * alias = node_entry->mid->aliases;
+        if (alias) {
+          abuf_json_mark_object(true, true, abuf, "local_addresses");
+          while (alias) {
+            abuf_json_ip_address(abuf, NULL, &alias->alias);
+            alias = alias->next_alias;
+          }
+          abuf_json_mark_object(false, true, abuf, NULL);
+        }
+      } else if (node_entry->link) {
+        /* no local_addresses */
+      } else if (node_entry->neighbor) {
+        /* no local_addresses */
+      }
+      // properties
+
+      abuf_json_mark_array_entry(false, abuf);
+    }
+
+    if (node_entry == node_self) {
+      netjson_cleanup_mid_self(node_self);
+    }
+
+    avl_delete(&nodes, node);
+    free(node);
+  }
+  abuf_json_mark_object(false, true, abuf, NULL);
+
+  /*
+   * Output Links
+   */
+
+  abuf_json_mark_object(true, true, abuf, "links");
+  OLSR_FOR_ALL_LINK_ENTRIES(link_entry) {
+    struct lqtextbuffer lqbuf;
+
+    abuf_json_mark_array_entry(true, abuf);
+
+    /* mandatory */
+    abuf_json_ip_address(abuf, "source", &link_entry->local_iface_addr);
+    abuf_json_ip_address(abuf, "target", &link_entry->neighbor_iface_addr);
+    abuf_json_float(abuf, "cost", get_linkcost_scaled(link_entry->linkcost, false));
+
+    /* optional */
+    abuf_json_string(abuf, "cost_text", get_linkcost_text(link_entry->linkcost, false, &lqbuf));
+    // properties
+
+    abuf_json_mark_array_entry(false, abuf);
+  } OLSR_FOR_ALL_LINK_ENTRIES_END(my_link);
+  abuf_json_mark_object(false, true, abuf, NULL);
+}
+
+void ipc_print_network_collection(struct autobuf *abuf) {
+  /* mandatory */
+  abuf_json_string(abuf, "type", "NetworkCollection");
+
+  abuf_json_mark_object(true, true, abuf, "collection");
+
+  abuf_json_mark_array_entry(true, abuf);
+  ipc_print_network_routes(abuf);
+  abuf_json_mark_array_entry(false, abuf);
+
+  abuf_json_mark_array_entry(true, abuf);
+  ipc_print_network_graph(abuf);
+  abuf_json_mark_array_entry(false, abuf);
+
+  abuf_json_mark_object(false, true, abuf, NULL);
+}
diff --git a/lib/netjson/src/olsrd_netjson.h b/lib/netjson/src/olsrd_netjson.h
new file mode 100644 (file)
index 0000000..349289c
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef LIB_NETJSON_SRC_OLSRD_NETJSON_H_
+#define LIB_NETJSON_SRC_OLSRD_NETJSON_H_
+
+#include <stdbool.h>
+
+#include "common/autobuf.h"
+
+unsigned long long get_supported_commands_mask(void);
+bool isCommand(const char *str, unsigned long long siw);
+
+const char * determine_mime_type(unsigned int send_what);
+
+void output_start(struct autobuf *abuf);
+void output_end(struct autobuf *abuf);
+void output_error(struct autobuf *abuf, unsigned int status, const char * req, bool http_headers);
+
+void ipc_print_network_routes(struct autobuf *abuf);
+void ipc_print_network_graph(struct autobuf *abuf);
+void ipc_print_network_collection(struct autobuf *abuf);
+
+#endif /* LIB_NETJSON_SRC_OLSRD_NETJSON_H_ */
diff --git a/lib/netjson/src/olsrd_netjson_helpers.c b/lib/netjson/src/olsrd_netjson_helpers.c
new file mode 100644 (file)
index 0000000..a706e6d
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "olsrd_netjson_helpers.h"
+
+#include "olsr.h"
+#include <unistd.h>
+
+struct node_entry * netjson_constructMidSelf(struct mid_entry *mid) {
+  struct node_entry * node;
+  struct olsr_if *ifs;
+
+  memset(mid, 0, sizeof(*mid));
+  mid->main_addr = olsr_cnf->main_addr;
+
+  node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - self");
+  node->avl.key = &mid->main_addr;
+  node->isAlias = false;
+  node->mid = mid;
+  node->link = NULL;
+  node->neighbor = NULL;
+
+  for (ifs = olsr_cnf->interfaces; ifs != NULL ; ifs = ifs->next) {
+    struct node_entry * node_self_alias;
+    union olsr_ip_addr *addr = NULL;
+
+    if (!ifs->configured) {
+      continue;
+    }
+
+    if (ifs->host_emul) {
+      addr = &ifs->hemu_ip;
+    } else {
+      struct interface_olsr *iface = ifs->interf;
+      if (!iface) {
+        continue;
+      }
+
+      if (olsr_cnf->ip_version == AF_INET) {
+        addr = (union olsr_ip_addr *) &iface->ip_addr.v4;
+      } else {
+        addr = (union olsr_ip_addr *) &iface->int6_addr.sin6_addr;
+      }
+    }
+
+    node_self_alias = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - self alias");
+    node_self_alias->avl.key = addr;
+    node_self_alias->isAlias = true;
+    node_self_alias->mid = mid;
+    node_self_alias->link = NULL;
+    node_self_alias->neighbor = NULL;
+
+    {
+      bool is_self_main = (olsr_cnf->ip_version == AF_INET) //
+          ? ip4equal(&mid->main_addr.v4, &addr->v4) //
+              : ip6equal(&mid->main_addr.v6, &addr->v6);
+      if (!is_self_main) {
+        struct mid_address *alias = olsr_malloc(sizeof(struct mid_address), "netjson NetworkGraph node - MID - self alias");
+        struct mid_address *aliases_saved;
+
+        alias->alias = *addr;
+        alias->main_entry = mid;
+        alias->next_alias = NULL;
+        alias->vtime = 0;
+
+        aliases_saved = mid->aliases;
+        mid->aliases = alias;
+        alias->next_alias = aliases_saved;
+      }
+    }
+  }
+
+  return node;
+}
+
+void netjson_cleanup_mid_self(struct node_entry *node_entry) {
+  struct mid_address *alias = node_entry->mid->aliases;
+  while (alias) {
+    struct mid_address *alias_to_free = alias;
+    alias = alias->next_alias;
+    free(alias_to_free);
+  }
+  node_entry->mid->aliases = NULL;
+}
+
+void netjson_midIntoNodesTree(struct avl_tree *nodes, struct mid_entry *mid) {
+  struct mid_address * alias = mid->aliases;
+  struct node_entry * node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - main");
+  node->avl.key = &mid->main_addr;
+  node->isAlias = false;
+  node->mid = mid;
+  node->link = NULL;
+  node->neighbor = NULL;
+  if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+    /* duplicate */
+    free(node);
+  }
+
+  if (alias) {
+    while (alias) {
+      node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - alias");
+      node->avl.key = &alias->alias;
+      node->isAlias = true;
+      node->mid = mid;
+      node->link = NULL;
+      node->neighbor = NULL;
+      if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+        /* duplicate */
+        free(node);
+      }
+
+      alias = alias->next_alias;
+    }
+  }
+}
+
+void netjson_linkIntoNodesTree(struct avl_tree *nodes, struct link_entry *link, union olsr_ip_addr *addr) {
+  struct avl_node *avlnode;
+  struct node_entry *node;
+
+  avlnode = avl_find(nodes, addr);
+  if (!avlnode) {
+    /* the IP address is not yet known */
+    node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - link");
+
+    node->avl.key = addr;
+    node->isAlias = false;
+    node->mid = NULL;
+    node->link = link;
+    node->neighbor = NULL;
+    if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+      /* duplicate */
+      free(node);
+    }
+  }
+}
+
+void netjson_neighborIntoNodesTree(struct avl_tree *nodes, struct neighbor_entry *neighbor) {
+  struct avl_node *avlnode;
+  struct node_entry *node;
+
+  union olsr_ip_addr *addr = &neighbor->neighbor_main_addr;
+  avlnode = avl_find(nodes, addr);
+  if (!avlnode) {
+    /* the IP address is not yet known */
+    node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - neighbor");
+
+    node->avl.key = addr;
+    node->isAlias = false;
+    node->mid = NULL;
+    node->link = NULL;
+    node->neighbor = neighbor;
+    if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
+      /* duplicate */
+      free(node);
+    }
+  }
+}
diff --git a/lib/netjson/src/olsrd_netjson_helpers.h b/lib/netjson/src/olsrd_netjson_helpers.h
new file mode 100644 (file)
index 0000000..4c852d8
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef LIB_NETJSON_SRC_OLSRD_NETJSON_HELPERS_H_
+#define LIB_NETJSON_SRC_OLSRD_NETJSON_HELPERS_H_
+
+#include <stdbool.h>
+
+#include "common/avl.h"
+#include "mid_set.h"
+#include "link_set.h"
+#include "neighbor_table.h"
+
+struct node_entry {
+  struct avl_node avl;
+  bool isAlias;
+  struct mid_entry *mid;
+  struct link_entry *link;
+  struct neighbor_entry *neighbor;
+};
+
+/* static inline struct node_entry * avlnode2node(struct avl_node *ptr) */
+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_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);
+
+#endif /* LIB_NETJSON_SRC_OLSRD_NETJSON_HELPERS_H_ */
diff --git a/lib/netjson/src/olsrd_plugin.c b/lib/netjson/src/olsrd_plugin.c
new file mode 100644 (file)
index 0000000..0f4efa4
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "olsrd_plugin.h"
+#include "info/olsrd_info.h"
+#include "olsrd_netjson.h"
+#include "olsr.h"
+#include "builddata.h"
+
+#define PLUGIN_NAME              "NETJSON"
+#define PLUGIN_TITLE             "OLSRD netjson plugin"
+#define PLUGIN_INTERFACE_VERSION 5
+
+info_plugin_functions_t functions;
+info_plugin_config_t config;
+
+static void my_init(void) __attribute__ ((constructor));
+static void my_fini(void) __attribute__ ((destructor));
+
+/**
+ *Constructor
+ */
+static void my_init(void) {
+  /* Print plugin info to stdout */
+  olsr_printf(0, "%s (%s)\n", PLUGIN_TITLE, git_descriptor);
+
+  info_plugin_config_init(&config, 2005);
+}
+
+/**
+ *Destructor
+ */
+static void my_fini(void) {
+  /* Calls the destruction function
+   * olsr_plugin_exit()
+   * This function should be present in your
+   * sourcefile and all data destruction
+   * should happen there - NOT HERE!
+   */
+  olsr_plugin_exit();
+}
+
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int olsrd_plugin_init(void) {
+  memset(&functions, 0, sizeof(functions));
+
+  functions.supportsCompositeCommands = false;
+  functions.supported_commands_mask = get_supported_commands_mask;
+  functions.is_command = isCommand;
+  functions.cache_timeout = cache_timeout_generic;
+  functions.determine_mime_type = determine_mime_type;
+  functions.output_start = output_start;
+  functions.output_end = output_end;
+  functions.output_error = output_error;
+
+  functions.networkRoutes = ipc_print_network_routes;
+  functions.networkGraph = ipc_print_network_graph;
+  functions.networkCollection = ipc_print_network_collection;
+
+  return info_plugin_init(PLUGIN_NAME, &functions, &config);
+}
+
+/**
+ * destructor - called at unload
+ */
+void olsr_plugin_exit(void) {
+  info_plugin_exit();
+}
+
+int olsrd_plugin_interface_version(void) {
+  return PLUGIN_INTERFACE_VERSION;
+}
+
+static const struct olsrd_plugin_parameters plugin_parameters[] = { //
+    //
+        INFO_PLUGIN_CONFIG_PLUGIN_PARAMETERS(config), //
+    };
+
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) {
+  *params = plugin_parameters;
+  *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters);
+}
diff --git a/lib/netjson/src/olsrd_plugin.h b/lib/netjson/src/olsrd_plugin.h
new file mode 100644 (file)
index 0000000..b1bfb1e
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef LIB_NETJSON_SRC_OLSRD_PLUGIN_H_
+#define LIB_NETJSON_SRC_OLSRD_PLUGIN_H_
+
+#include "plugin_util.h"
+#include "info/info_types.h"
+
+extern info_plugin_config_t config;
+
+int olsrd_plugin_interface_version(void);
+int olsrd_plugin_init(void);
+void olsr_plugin_exit(void);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
+
+#endif /* LIB_NETJSON_SRC_OLSRD_PLUGIN_H_ */
diff --git a/lib/netjson/version-script.txt b/lib/netjson/version-script.txt
new file mode 100644 (file)
index 0000000..a145659
--- /dev/null
@@ -0,0 +1,10 @@
+VERS_1.0
+{
+  global:
+    olsrd_plugin_interface_version;
+    olsrd_plugin_init;
+    olsrd_get_plugin_parameters;
+
+  local:
+    *;
+};
index 92e3850..14b8dd2 100644 (file)
@@ -95,6 +95,12 @@ define Package/olsrd-stable-git-mod-nameservice
   TITLE:=Lightweight hostname resolver plugin
 endef
 
+define Package/olsrd-stable-git-mod-netjson
+  $(call Package/olsrd-stable-git/template)
+  DEPENDS:=olsrd-stable-git
+  TITLE:=netjson output information plugin
+endef
+
 define Package/olsrd-stable-git-mod-p2pd
   $(call Package/olsrd-stable-git/template)
   DEPENDS:=olsrd-stable-git
@@ -135,7 +141,7 @@ MAKE_FLAGS+= \
        DESTDIR="$(PKG_INSTALL_DIR)" \
        STRIP="true" \
        INSTALL_LIB="true" \
-       SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns nameservice quagga secure txtinfo watchdog"
+       SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns nameservice netjson quagga secure txtinfo watchdog"
 
 define Build/Compile
        $(call Build/Compile/Default,clean)
@@ -203,6 +209,11 @@ define Package/olsrd-stable-git-mod-nameservice/install
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/nameservice/olsrd_nameservice.so.* $(1)/usr/lib/
 endef
 
+define Package/olsrd-stable-git-mod-netjson/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/netjson/olsrd_netjson.so.* $(1)/usr/lib/
+endef
+
 define Package/olsrd-stable-git-mod-quagga/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/quagga/olsrd_quagga.so.* $(1)/usr/lib/
@@ -235,6 +246,7 @@ $(eval $(call BuildPackage,olsrd-stable-git-mod-httpinfo))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-jsoninfo))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-mdns))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-nameservice))
+$(eval $(call BuildPackage,olsrd-stable-git-mod-netjson))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-quagga))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-secure))
 $(eval $(call BuildPackage,olsrd-stable-git-mod-txtinfo))