ospf6d: Fixing a couple of issues with ospf6_route_remove () routine.

When a route_node has multiple ospf6_routes under it (common subnet case),
then the current implementation has an issue in adjusting the route_node->info
on a ospf6_route_remove() call.

The main reason is that it ends up using exact match to determine if the next
ospf6_route belongs to the same route_node or not. Fixing that part to use
rnode (the existing back-pointer to the route_node) from the ospf6_route to
determine that.

Also fixing some of the walks to turn them safe so that the route deletion is
fine.

Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
diff --git a/ospf6d/ospf6_abr.c b/ospf6d/ospf6_abr.c
index bb79900..7e94cef 100644
--- a/ospf6d/ospf6_abr.c
+++ b/ospf6d/ospf6_abr.c
@@ -106,14 +106,14 @@
 ospf6_abr_disable_area (struct ospf6_area *area)
 {
   struct ospf6_area *oa;
-  struct ospf6_route *ro;
+  struct ospf6_route *ro, *nro;
   struct ospf6_lsa *old;
   struct listnode *node, *nnode;
 
   /* Withdraw all summary prefixes previously originated */
-  for (ro = ospf6_route_head (area->summary_prefix); ro;
-       ro = ospf6_route_next (ro))
+  for (ro = ospf6_route_head (area->summary_prefix); ro; ro = nro)
     {
+      nro = ospf6_route_next (ro);
       old = ospf6_lsdb_lookup (ro->path.origin.type, ro->path.origin.id,
                                area->ospf6->router_id, area->lsdb);
       if (old)
@@ -122,9 +122,9 @@
     }
 
   /* Withdraw all summary router-routes previously originated */
-  for (ro = ospf6_route_head (area->summary_router); ro;
-       ro = ospf6_route_next (ro))
+  for (ro = ospf6_route_head (area->summary_router); ro; ro = nro)
     {
+      nro = ospf6_route_next (ro);
       old = ospf6_lsdb_lookup (ro->path.origin.type, ro->path.origin.id,
                                area->ospf6->router_id, area->lsdb);
       if (old)