SVN revision 907 from Zebra cvs repository.
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index b1c1644..4a33d47 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -30,7 +30,6 @@
 #include "thread.h"
 #include "command.h"
 
-#include "ospf6d.h"
 #include "ospf6_proto.h"
 #include "ospf6_message.h"
 #include "ospf6_lsa.h"
@@ -44,6 +43,8 @@
 #include "ospf6_neighbor.h"
 
 #include "ospf6_asbr.h"
+#include "ospf6_abr.h"
+#include "ospf6d.h"
 
 /* global ospf6d variable */
 struct ospf6 *ospf6;
@@ -80,6 +81,20 @@
     }
 }
 
+void
+ospf6_top_route_hook_add (struct ospf6_route *route)
+{
+  ospf6_abr_originate_prefix (route, ospf6);
+  ospf6_zebra_route_update_add (route);
+}
+
+void
+ospf6_top_route_hook_remove (struct ospf6_route *route)
+{
+  ospf6_abr_originate_prefix (route, ospf6);
+  ospf6_zebra_route_update_remove (route);
+}
+
 struct ospf6 *
 ospf6_create ()
 {
@@ -97,13 +112,15 @@
   o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove;
 
   o->route_table = ospf6_route_table_create ();
-  o->route_table->hook_add = ospf6_zebra_route_update_add;
-  o->route_table->hook_remove = ospf6_zebra_route_update_remove;
+  o->route_table->hook_add = ospf6_top_route_hook_add;
+  o->route_table->hook_remove = ospf6_top_route_hook_remove;
 
   o->asbr_table = ospf6_route_table_create ();
   o->asbr_table->hook_add = ospf6_asbr_lsentry_add;
   o->asbr_table->hook_remove = ospf6_asbr_lsentry_remove;
 
+  o->brouter_table = ospf6_route_table_create ();
+
   o->external_table = ospf6_route_table_create ();
   o->external_id_table = route_table_init ();
 
@@ -126,6 +143,7 @@
 
   ospf6_route_table_delete (o->route_table);
   ospf6_route_table_delete (o->asbr_table);
+  ospf6_route_table_delete (o->brouter_table);
 
   ospf6_route_table_delete (o->external_table);
   route_table_finish (o->external_id_table);
@@ -257,7 +275,7 @@
        OSPF6_ROUTER_STR)
 {
   if (ospf6 == NULL || CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
-    vty_out (vty, "OSPFv3 is not running%s", VTY_NEWLINE);
+    vty_out (vty, "OSPFv3 is not running%s", VNL);
   else
     ospf6_disable (ospf6);
 
@@ -284,7 +302,7 @@
   ret = inet_pton (AF_INET, argv[0], &router_id);
   if (ret == 0)
     {
-      vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VTY_NEWLINE);
+      vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VNL);
       return CMD_SUCCESS;
     }
 
@@ -317,14 +335,14 @@
   if (oi->area)
     {
       vty_out (vty, "%s already attached to Area %s%s",
-               oi->interface->name, oi->area->name, VTY_NEWLINE);
+               oi->interface->name, oi->area->name, VNL);
       return CMD_SUCCESS;
     }
 
   /* parse Area-ID */
   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
     {
-      vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VTY_NEWLINE);
+      vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
       return CMD_SUCCESS;
     }
 
@@ -362,28 +380,28 @@
   ifp = if_lookup_by_name (argv[0]);
   if (ifp == NULL)
     {
-      vty_out (vty, "No such interface %s%s", argv[0], VTY_NEWLINE);
+      vty_out (vty, "No such interface %s%s", argv[0], VNL);
       return CMD_SUCCESS;
     }
 
   oi = (struct ospf6_interface *) ifp->info;
   if (oi == NULL)
     {
-      vty_out (vty, "Interface %s not enabled%s", ifp->name, VTY_NEWLINE);
+      vty_out (vty, "Interface %s not enabled%s", ifp->name, VNL);
       return CMD_SUCCESS;
     }
 
   /* parse Area-ID */
   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
     {
-      vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VTY_NEWLINE);
+      vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
       return CMD_SUCCESS;
     }
 
   if (oi->area->area_id != area_id)
     {
       vty_out (vty, "Wrong Area-ID: %s is attached to area %s%s",
-               oi->interface->name, oi->area->name, VTY_NEWLINE);
+               oi->interface->name, oi->area->name, VNL);
       return CMD_SUCCESS;
     }
 
@@ -406,24 +424,24 @@
   /* process id, router id */
   inet_ntop (AF_INET, &o->router_id, router_id, sizeof (router_id));
   vty_out (vty, " OSPFv3 Routing Process (0) with Router-ID %s%s",
-           router_id, VTY_NEWLINE);
+           router_id, VNL);
 
   /* running time */
   gettimeofday (&now, (struct timezone *)NULL);
   timersub (&now, &o->starttime, &running);
   timerstring (&running, duration, sizeof (duration));
-  vty_out (vty, " Running %s%s", duration, VTY_NEWLINE);
+  vty_out (vty, " Running %s%s", duration, VNL);
 
   /* Redistribute configuration */
   /* XXX */
 
   /* LSAs */
   vty_out (vty, " Number of AS scoped LSAs is %u%s",
-           o->lsdb->count, VTY_NEWLINE);
+           o->lsdb->count, VNL);
 
   /* Areas */
   vty_out (vty, " Number of areas in this router is %u%s",
-           listcount (o->area_list), VTY_NEWLINE);
+           listcount (o->area_list), VNL);
   for (n = listhead (o->area_list); n; nextnode (n))
     {
       oa = (struct ospf6_area *) getdata (n);
@@ -540,8 +558,8 @@
     return CMD_SUCCESS;
 
   inet_ntop (AF_INET, &ospf6->router_id, router_id, sizeof (router_id));
-  vty_out (vty, "router ospf6%s", VTY_NEWLINE);
-  vty_out (vty, " router-id %s%s", router_id, VTY_NEWLINE);
+  vty_out (vty, "router ospf6%s", VNL);
+  vty_out (vty, " router-id %s%s", router_id, VNL);
 
   ospf6_redistribute_config_write (vty);
 
@@ -552,10 +570,10 @@
         {
           oi = (struct ospf6_interface *) getdata (k);
           vty_out (vty, " interface %s area %s%s",
-                   oi->interface->name, oa->name, VTY_NEWLINE);
+                   oi->interface->name, oa->name, VNL);
         }
     }
-  vty_out (vty, "!%s", VTY_NEWLINE);
+  vty_out (vty, "!%s", VNL);
   return 0;
 }