2003-04-04 Paul Jakma <paul@dishone.st>

        * Sync to Zebra CVS
        * Fix lib/thread.h leak
        * Fix small Opaque LSA leak
        * Do not configure OSPF interfaces for secondary addresses
        * vtysh fixes from Hasso
        * Dave Watson's missing ntohs fix
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index fff6f65..4100860 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -181,13 +181,16 @@
        "Enable a routing process\n"
        "Start OSPF configuration\n")
 {
-  if (ospf_top == NULL)
+  struct ospf *ospf;
+
+  ospf = ospf_lookup ();
+  if (ospf == NULL)
     {
-      vty_out (vty, "There isn't active ospf instance.%s", VTY_NEWLINE);
+      vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
-  ospf_finish (ospf_top);
+  ospf_finish (ospf);
 
   return CMD_SUCCESS;
 }
@@ -213,9 +216,8 @@
   ospf->router_id_static = router_id;
 
   if (ospf->t_router_id_update == NULL)
-    ospf->t_router_id_update =
-      thread_add_timer (master, ospf_router_id_update_timer, NULL,
-			OSPF_ROUTER_ID_UPDATE_DELAY);
+    OSPF_TIMER_ON (ospf->t_router_id_update, ospf_router_id_update_timer,
+		   OSPF_ROUTER_ID_UPDATE_DELAY);
 
   return CMD_SUCCESS;
 }
@@ -2298,8 +2300,8 @@
   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
       
-  for (node = listhead (ospf->iflist); node; nextnode (node))
-      ospf_if_recalculate_output_cost (getdata (node));
+  for (node = listhead (om->iflist); node; nextnode (node))
+    ospf_if_recalculate_output_cost (getdata (node));
   
   return CMD_SUCCESS;
 }
@@ -2321,8 +2323,8 @@
   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
 
-    for (node = listhead (ospf->iflist); node; nextnode (node))
-      ospf_if_recalculate_output_cost (getdata (node));
+  for (node = listhead (om->iflist); node; nextnode (node))
+    ospf_if_recalculate_output_cost (getdata (node));
       
   return CMD_SUCCESS;
 }
@@ -2386,7 +2388,7 @@
   if (area->external_routing == OSPF_AREA_NSSA)
     {
       vty_out (vty, "   It is an NSSA configuration. %s   Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
-      if (! OSPF_IS_ABR)
+      if (! IS_OSPF_ABR (area->ospf))
 	vty_out (vty, "   It is not ABR, therefore not Translator. %s",
 		 VTY_NEWLINE);
       else
@@ -2435,9 +2437,10 @@
 {
   listnode node;
   struct ospf_area * area;
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
 
   /* Check OSPF is enable. */
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     {
       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
@@ -2618,9 +2621,11 @@
        "Interface name\n")
 {
   struct interface *ifp;
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
 
+  ospf = ospf_lookup ();
+
   /* Show All Interfaces. */
   if (argc == 0)
     for (node = listhead (iflist); node; nextnode (node))
@@ -2678,9 +2683,10 @@
        "OSPF information\n"
        "Neighbor list\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     {
       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
@@ -2693,7 +2699,7 @@
            "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE);
 
   for (node = listhead (ospf->oiflist); node; nextnode (node))
-      show_ip_ospf_neighbor_sub (vty, getdata (node));
+    show_ip_ospf_neighbor_sub (vty, getdata (node));
 
   return CMD_SUCCESS;
 }
@@ -2759,17 +2765,11 @@
        "Neighbor list\n"
        "Interface name\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   struct ospf_interface *oi;
   struct in_addr addr;
   int ret;
   
-  if (ospf == NULL)
-    {
-      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
-      return CMD_SUCCESS;
-    }
-
   ret = inet_aton (argv[0], &addr);
   if (!ret)
     {
@@ -2778,6 +2778,13 @@
       return CMD_WARNING;
     }
 
+  ospf = ospf_lookup ();
+  if (ospf == NULL)
+    {
+      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
+
   if ((oi = ospf_if_is_configured (ospf, &addr)) == NULL)
     vty_out (vty, "No such interface address%s", VTY_NEWLINE);
   else
@@ -2890,7 +2897,7 @@
        "Neighbor list\n"
        "Neighbor ID\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
   struct ospf_neighbor *nbr;
   struct in_addr router_id;
@@ -2903,6 +2910,13 @@
       return CMD_WARNING;
     }
 
+  ospf = ospf_lookup ();
+  if (ospf == NULL)
+    {
+      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
+
   for (node = listhead (ospf->oiflist); node; nextnode (node))
     {
       struct ospf_interface *oi = getdata (node);
@@ -2927,11 +2941,15 @@
        "Neighbor list\n"
        "detail of all neighbors\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
-    return CMD_SUCCESS;
+    {
+      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
 
   for (node = listhead (ospf->oiflist); node; nextnode (node))
     {
@@ -2959,11 +2977,15 @@
        "detail of all neighbors\n"
        "include down status neighbor\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
-    return CMD_SUCCESS;
+    {
+      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
 
   for (node = listhead (ospf->oiflist); node; nextnode (node))
     {
@@ -3004,6 +3026,7 @@
        "Interface address\n"
        "detail of all neighbors")
 {
+  struct ospf *ospf;
   struct ospf_interface *oi;
   struct in_addr addr;
   int ret;
@@ -3016,10 +3039,14 @@
       return CMD_WARNING;
     }
 
-  if (ospf_top == NULL)
-    return CMD_WARNING;
+  ospf = ospf_lookup ();
+  if (ospf == NULL)
+    {
+      vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
 
-  if ((oi = ospf_if_is_configured (ospf_top, &addr)) == NULL)
+  if ((oi = ospf_if_is_configured (ospf, &addr)) == NULL)
     vty_out (vty, "No such interface address%s", VTY_NEWLINE);
   else
     {
@@ -3039,9 +3066,8 @@
 
 /* Show functions */
 int
-show_lsa_summary (struct ospf_lsa *lsa, void *v, int self)
+show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
 {
-  struct vty *vty = (struct vty *) v;
   struct router_lsa *rl;
   struct summary_lsa *sl;
   struct as_external_lsa *asel;
@@ -3500,10 +3526,9 @@
 /* Show detail LSA information
    -- if id is NULL then show all LSAs. */
 void
-show_lsa_detail (struct vty *vty, int type,
+show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
 		 struct in_addr *id, struct in_addr *adv_router)
 {
-  struct ospf *ospf = ospf_top;
   listnode node;
 
   switch (type)
@@ -3552,10 +3577,9 @@
 
 /* Show detail LSA information. */
 void
-show_lsa_detail_adv_router (struct vty *vty, int type,
+show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
 			    struct in_addr *adv_router)
 {
-  struct ospf *ospf = ospf_top;
   listnode node;
 
   switch (type)
@@ -3585,9 +3609,10 @@
 }
 
 void
-show_ip_ospf_database_summary (struct vty *vty, int self)
+show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf_lsa *lsa;
+  struct route_node *rn;
   listnode node;
   int type;
 
@@ -3615,7 +3640,8 @@
                        VTY_NEWLINE, VTY_NEWLINE);
               vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
 
-              foreach_lsa (AREA_LSDB (area, type), vty, self, show_lsa_summary);
+	      LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
+		show_lsa_summary (vty, lsa, self);
 
               vty_out (vty, "%s", VTY_NEWLINE);
 	  }
@@ -3642,7 +3668,10 @@
 	       VTY_NEWLINE, VTY_NEWLINE);
           vty_out (vty, "%s%s", show_database_header[type],
 	       VTY_NEWLINE);
-          foreach_lsa (AS_LSDB (ospf, type), vty, self, show_lsa_summary);
+
+	  LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
+	    show_lsa_summary (vty, lsa, self);
+
           vty_out (vty, "%s", VTY_NEWLINE);
         }
     }
@@ -3651,9 +3680,8 @@
 }
 
 void
-show_ip_ospf_database_maxage (struct vty *vty)
+show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
 {
-  struct ospf *ospf = ospf_top;
   listnode node;
   struct ospf_lsa *lsa;
 
@@ -3717,10 +3745,11 @@
        "OSPF information\n"
        "Database summary\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   int type, ret;
   struct in_addr id, adv_router;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     return CMD_SUCCESS;
 
@@ -3730,7 +3759,7 @@
   /* Show all LSA. */
   if (argc == 0)
     {
-      show_ip_ospf_database_summary (vty, 0);
+      show_ip_ospf_database_summary (vty, ospf, 0);
       return CMD_SUCCESS;
     }
 
@@ -3751,12 +3780,12 @@
     type = OSPF_AS_EXTERNAL_LSA;
   else if (strncmp (argv[0], "se", 2) == 0)
     {
-      show_ip_ospf_database_summary (vty, 1);
+      show_ip_ospf_database_summary (vty, ospf, 1);
       return CMD_SUCCESS;
     }
   else if (strncmp (argv[0], "m", 1) == 0)
     {
-      show_ip_ospf_database_maxage (vty);
+      show_ip_ospf_database_maxage (vty, ospf);
       return CMD_SUCCESS;
     }
 #ifdef HAVE_OPAQUE_LSA
@@ -3772,7 +3801,7 @@
 
   /* `show ip ospf database LSA'. */
   if (argc == 1)
-    show_lsa_detail (vty, type, NULL, NULL);
+    show_lsa_detail (vty, ospf, type, NULL, NULL);
   else if (argc >= 2)
     {
       ret = inet_aton (argv[1], &id);
@@ -3781,7 +3810,7 @@
       
       /* `show ip ospf database LSA ID'. */
       if (argc == 2)
-	show_lsa_detail (vty, type, &id, NULL);
+	show_lsa_detail (vty, ospf, type, &id, NULL);
       /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
       else if (argc == 3)
 	{
@@ -3793,7 +3822,7 @@
 	      if (!ret)
 		return CMD_WARNING;
 	    }
-	  show_lsa_detail (vty, type, &id, &adv_router);
+	  show_lsa_detail (vty, ospf, type, &id, &adv_router);
 	}
     }
 
@@ -3856,10 +3885,11 @@
        "Advertising Router link states\n"
        "Advertising Router (as an IP address)\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   int type, ret;
   struct in_addr adv_router;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     return CMD_SUCCESS;
 
@@ -3905,7 +3935,7 @@
 	return CMD_WARNING;
     }
 
-  show_lsa_detail_adv_router (vty, type, &adv_router);
+  show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
 
   return CMD_SUCCESS;
 }
@@ -4488,8 +4518,10 @@
   struct ospf_if_params *params;
   struct ospf_interface *oi;
   struct route_node *rn;
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
       
+  ospf = ospf_lookup ();
+
   params = IF_DEF_PARAMS (ifp);
 
   seconds = strtol (argv[0], NULL, 10);
@@ -4568,8 +4600,10 @@
   struct ospf_if_params *params;
   struct ospf_interface *oi;
   struct route_node *rn;
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   
+  ospf = ospf_lookup ();
+
   ifp = vty->index;
   params = IF_DEF_PARAMS (ifp);
 
@@ -5262,6 +5296,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
   int type = -1;
   int metric = -1;
@@ -5281,11 +5316,11 @@
       return CMD_WARNING;
 
   if (argc == 4)
-    ospf_routemap_set (source, argv[3]);
+    ospf_routemap_set (ospf, source, argv[3]);
   else
-    ospf_routemap_unset (source);
+    ospf_routemap_unset (ospf, source);
   
-  return ospf_redistribute_set (source, type, metric);
+  return ospf_redistribute_set (ospf, source, type, metric);
 }
 
 ALIAS (ospf_redistribute_source_metric_type,
@@ -5332,6 +5367,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
   int type = -1;
   int metric = -1;
@@ -5351,11 +5387,11 @@
       return CMD_WARNING;
 
   if (argc == 4)
-    ospf_routemap_set (source, argv[3]);
+    ospf_routemap_set (ospf, source, argv[3]);
   else
-    ospf_routemap_unset (source);
+    ospf_routemap_unset (ospf, source);
 
-  return ospf_redistribute_set (source, type, metric);
+  return ospf_redistribute_set (ospf, source, type, metric);
 }
 
 ALIAS (ospf_redistribute_source_type_metric,
@@ -5410,6 +5446,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
   int metric = -1;
 
@@ -5423,11 +5460,11 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (source, argv[2]);
+    ospf_routemap_set (ospf, source, argv[2]);
   else
-    ospf_routemap_unset (source);
+    ospf_routemap_unset (ospf, source);
   
-  return ospf_redistribute_set (source, -1, metric);
+  return ospf_redistribute_set (ospf, source, -1, metric);
 }
 
 DEFUN (ospf_redistribute_source_type_routemap,
@@ -5445,6 +5482,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
   int type = -1;
 
@@ -5458,11 +5496,11 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (source, argv[2]);
+    ospf_routemap_set (ospf, source, argv[2]);
   else
-    ospf_routemap_unset (source);
+    ospf_routemap_unset (ospf, source);
 
-  return ospf_redistribute_set (source, type, -1);
+  return ospf_redistribute_set (ospf, source, type, -1);
 }
 
 DEFUN (ospf_redistribute_source_routemap,
@@ -5477,6 +5515,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
 
   /* Get distribute source. */
@@ -5484,11 +5523,11 @@
     return CMD_WARNING;
 
   if (argc == 2)
-    ospf_routemap_set (source, argv[1]);
+    ospf_routemap_set (ospf, source, argv[1]);
   else
-    ospf_routemap_unset (source);
+    ospf_routemap_unset (ospf, source);
 
-  return ospf_redistribute_set (source, -1, -1);
+  return ospf_redistribute_set (ospf, source, -1, -1);
 }
 
 DEFUN (no_ospf_redistribute_source,
@@ -5502,13 +5541,14 @@
        "Routing Information Protocol (RIP)\n"
        "Border Gateway Protocol (BGP)\n")
 {
+  struct ospf *ospf = vty->index;
   int source;
 
   if (!str2distribute_source (argv[0], &source))
     return CMD_WARNING;
 
-  ospf_routemap_unset (source);
-  return ospf_redistribute_unset (source);
+  ospf_routemap_unset (ospf, source);
+  return ospf_redistribute_unset (ospf, source);
 }
 
 DEFUN (ospf_distribute_list_out,
@@ -5569,6 +5609,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
   int metric = -1;
 
@@ -5583,11 +5624,12 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[2]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ZEBRA, type, metric);
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
+					type, metric);
 }
 
 ALIAS (ospf_default_information_originate_metric_type_routemap,
@@ -5626,6 +5668,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int metric = -1;
 
   /* Get metric value. */
@@ -5634,11 +5677,12 @@
       return CMD_WARNING;
 
   if (argc == 2)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[1]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ZEBRA, -1, metric);
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
+					-1, metric);
 }
 
 /* Default information originate. */
@@ -5650,12 +5694,14 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
-  if (argc == 1)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[0]);
-  else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+  struct ospf *ospf = vty->index;
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ZEBRA, -1, -1);
+  if (argc == 1)
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
+  else
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
+
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
 }
 
 DEFUN (ospf_default_information_originate_type_metric_routemap,
@@ -5671,6 +5717,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
   int metric = -1;
 
@@ -5685,11 +5732,12 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[2]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ZEBRA, type, metric);
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
+					type, metric);
 }
 
 ALIAS (ospf_default_information_originate_type_metric_routemap,
@@ -5723,6 +5771,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
 
   /* Get metric type. */
@@ -5731,11 +5780,12 @@
       return CMD_WARNING;
 
   if (argc == 2)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[1]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ZEBRA, type, -1);
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
+					type, -1);
 }
 
 DEFUN (ospf_default_information_originate_always_metric_type_routemap,
@@ -5752,6 +5802,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
   int metric = -1;
 
@@ -5766,11 +5817,11 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[2]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ALWAYS,
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
 					type, metric);
 }
 
@@ -5814,6 +5865,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int metric = -1;
 
   /* Get metric value. */
@@ -5822,11 +5874,12 @@
       return CMD_WARNING;
 
   if (argc == 2)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[1]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ALWAYS, -1, metric);
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
+					-1, metric);
 }
 
 DEFUN (ospf_default_information_originate_always_routemap,
@@ -5838,12 +5891,14 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
-  if (argc == 1)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[0]);
-  else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+  struct ospf *ospf = vty->index;
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ALWAYS, -1, -1);
+  if (argc == 1)
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
+  else
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
+
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
 }
 
 DEFUN (ospf_default_information_originate_always_type_metric_routemap,
@@ -5860,6 +5915,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
   int metric = -1;
 
@@ -5874,11 +5930,11 @@
       return CMD_WARNING;
 
   if (argc == 3)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[2]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ALWAYS,
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
 					type, metric);
 }
 
@@ -5916,6 +5972,7 @@
        "Route map reference\n"
        "Pointer to route-map entries\n")
 {
+  struct ospf *ospf = vty->index;
   int type = -1;
 
   /* Get metric type. */
@@ -5924,11 +5981,11 @@
       return CMD_WARNING;
 
   if (argc == 2)
-    ospf_routemap_set (DEFAULT_ROUTE, argv[1]);
+    ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
   else
-    ospf_routemap_unset (DEFAULT_ROUTE);
+    ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 
-  return ospf_redistribute_default_set (DEFAULT_ORIGINATE_ALWAYS,
+  return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
 					type, -1);
 }
 
@@ -5955,8 +6012,8 @@
     EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
   }
 
-  ospf_routemap_unset (DEFAULT_ROUTE);
-  return ospf_redistribute_default_unset ();
+  ospf_routemap_unset (ospf, DEFAULT_ROUTE);
+  return ospf_redistribute_default_unset (ospf);
 }
 
 DEFUN (ospf_default_metric,
@@ -6326,7 +6383,9 @@
        "Distance value\n"
        "IP source prefix\n")
 {
-  ospf_distance_set (vty, argv[0], argv[1], NULL);
+  struct ospf *ospf = vty->index;
+
+  ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
 
   return CMD_SUCCESS;
 }
@@ -6339,7 +6398,10 @@
        "Distance value\n"
        "IP source prefix\n")
 {
-  ospf_distance_unset (vty, argv[0], argv[1], NULL);
+  struct ospf *ospf = vty->index;
+
+  ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
+
   return CMD_SUCCESS;
 }
 
@@ -6351,7 +6413,10 @@
        "IP source prefix\n"
        "Access list name\n")
 {
-  ospf_distance_set (vty, argv[0], argv[1], argv[2]);
+  struct ospf *ospf = vty->index;
+
+  ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
+
   return CMD_SUCCESS;
 }
 
@@ -6364,7 +6429,10 @@
        "IP source prefix\n"
        "Access list name\n")
 {
-  ospf_distance_unset (vty, argv[0], argv[1], argv[2]);
+  struct ospf *ospf = vty->index;
+
+  ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
+
   return CMD_SUCCESS;
 }
 
@@ -6527,8 +6595,9 @@
        "show all the ABR's and ASBR's\n"
        "for this area\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     {
       vty_out (vty, "OSPF is not enabled%s", VTY_NEWLINE);
@@ -6542,7 +6611,7 @@
     }
 
   /* Show Network routes.
-  show_ip_ospf_route_network (vty, ospf_top->new_table);   */
+  show_ip_ospf_route_network (vty, ospf->new_table);   */
 
   /* Show Router routes. */
   show_ip_ospf_route_router (vty, ospf->new_rtrs);
@@ -6559,8 +6628,9 @@
        "OSPF information\n"
        "OSPF routing table\n")
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
 
+  ospf = ospf_lookup ();
   if (ospf == NULL)
     {
       vty_out (vty, "OSPF is not enabled%s", VTY_NEWLINE);
@@ -7032,13 +7102,13 @@
       {
         vty_out (vty, " redistribute %s", distribute_str[type]);
 	if (ospf->dmetric[type].value >= 0)
-	  vty_out (vty, " metric %d", ospf_top->dmetric[type].value);
+	  vty_out (vty, " metric %d", ospf->dmetric[type].value);
 	
         if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
 	  vty_out (vty, " metric-type 1");
 
-	if (ROUTEMAP_NAME (type))
-	  vty_out (vty, " route-map %s", ROUTEMAP_NAME (type));
+	if (ROUTEMAP_NAME (ospf, type))
+	  vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
 	
         vty_out (vty, "%s", VTY_NEWLINE);
       }
@@ -7083,8 +7153,9 @@
 	  if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
 	    vty_out (vty, " metric-type 1");
 
-	  if (ROUTEMAP_NAME (DEFAULT_ROUTE))
-	    vty_out (vty, " route-map %s", ROUTEMAP_NAME (DEFAULT_ROUTE));
+	  if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
+	    vty_out (vty, " route-map %s",
+		     ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
 	  
 	  vty_out (vty, "%s", VTY_NEWLINE);
 	}
@@ -7134,10 +7205,11 @@
 int
 ospf_config_write (struct vty *vty)
 {
-  struct ospf *ospf = ospf_top;
+  struct ospf *ospf;
   listnode node;
   int write = 0;
 
+  ospf = ospf_lookup ();
   if (ospf != NULL)
     {
       /* `router ospf' print. */
@@ -7182,7 +7254,7 @@
       config_write_ospf_redistribute (vty, ospf);
 
       /* passive-interface print. */
-      for (node = listhead (ospf->iflist); node; nextnode (node))
+      for (node = listhead (om->iflist); node; nextnode (node))
         {
           struct interface *ifp = getdata (node);
 
@@ -7642,5 +7714,3 @@
   /* Init zebra related vty commands. */
   ospf_vty_zebra_init ();
 }
-
-