babeld: add command: "show_babel_database".
diff --git a/babeld/babel_interface.c b/babeld/babel_interface.c
index bd32d26..d4c84b3 100644
--- a/babeld/babel_interface.c
+++ b/babeld/babel_interface.c
@@ -52,6 +52,8 @@
 #include "route.h"
 #include "babel_zebra.h"
 #include "neighbour.h"
+#include "route.h"
+#include "xroute.h"
 
 
 static int babel_enable_if_lookup (const char *ifname);
@@ -773,6 +775,60 @@
     return CMD_SUCCESS;
 }
 
+static void
+show_babel_routes_sub (struct vty *vty, struct babel_route *route)
+{
+    const unsigned char *nexthop =
+        memcmp(route->nexthop, route->neigh->address, 16) == 0 ?
+        NULL : route->nexthop;
+
+    vty_out(vty,
+            "%s metric %d refmetric %d id %s seqno %d age %d "
+            "via %s neigh %s%s%s%s%s",
+            format_prefix(route->src->prefix, route->src->plen),
+            route_metric(route), route->refmetric,
+            format_eui64(route->src->id),
+            (int)route->seqno,
+            (int)(babel_now.tv_sec - route->time),
+            route->neigh->ifp->name,
+            format_address(route->neigh->address),
+            nexthop ? " nexthop " : "",
+            nexthop ? format_address(nexthop) : "",
+            route->installed ? " (installed)" :
+            route_feasible(route) ? " (feasible)" : "",
+            VTY_NEWLINE);
+}
+
+static void
+show_babel_xroutes_sub (struct vty *vty, struct xroute *xroute)
+{
+    vty_out(vty, "%s metric %d (exported)%s",
+            format_prefix(xroutes->prefix, xroute->plen),
+            xroutes->metric,
+            VTY_NEWLINE);
+}
+
+DEFUN (show_babel_database,
+       show_babel_database_cmd,
+       "show babel database",
+       SHOW_STR
+       IP_STR
+       "Babel information\n"
+       "Database information\n"
+       "No attributes\n")
+{
+    int i;
+
+    for(i = 0; i < numroutes; i++) {
+        show_babel_routes_sub(vty, &routes[i]);
+    }
+    for(i = 0; i < numxroutes; i++) {
+        show_babel_xroutes_sub(vty, &xroutes[i]);
+    }
+
+    return CMD_SUCCESS;
+}
+
 void
 babel_if_init ()
 {
@@ -806,6 +862,8 @@
   install_element (ENABLE_NODE, &show_babel_interface_cmd);
     install_element(VIEW_NODE, &show_babel_neighbour_cmd);
     install_element(ENABLE_NODE, &show_babel_neighbour_cmd);
+    install_element(VIEW_NODE, &show_babel_database_cmd);
+    install_element(ENABLE_NODE, &show_babel_database_cmd);
 }
 
 /* hooks: functions called respectively when struct interface is
diff --git a/babeld/route.h b/babeld/route.h
index e38f157..c08332a 100644
--- a/babeld/route.h
+++ b/babeld/route.h
@@ -37,6 +37,9 @@
 THE SOFTWARE.
 */
 
+#ifndef BABEL_ROUTE_H
+#define BABEL_ROUTE_H
+
 #include "babel_interface.h"
 #include "source.h"
 
@@ -102,3 +105,5 @@
 
 void babel_uninstall_all_routes(void);
 struct babel_route *babel_route_get_by_source(struct source *src);
+
+#endif