2003-06-19 Paul Jakma <paul@dishone.st>

	* ospf_vty.c (ospf_area_stub_no_summary): fix typo.
	  (ospf_area_nssa_cmd_handler): new function to handle the
	  area.*nssa commands.
	  (ospf_area_nssa_cmd): changed to call ospf_area_nssa_cmd_handler
	  (ospf_area_nssa_translate_cmd) ditto
	  (ospf_area_nssa_translate_cmd): changed from ALIAS to defun, call
	  ospf_area_nssa_cmd_handler
	  (ospf_area_nssa_translate_no_summary_cmd): ditto
	  (no_ospf_area_nssa_cmd): call ospf_schedule_abr_task()
	  (show_ip_ospf_area): Formatting cleanups. Properly print out NSSA
          area configuration.
	  show_router_lsa_detail: Add missing newline
	  (show_network_lsa_detail): ditto
	  (show_summary_lsa_detail): ditto
	  (show_summary_asbr_lsa_detail): ditto
	  (show_ip_ospf_route_router): fix spacing
	  (config_write_ospf_area): actually write out proper state for NSSA
	  area.
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index ed4b4fd..d02214d 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -1427,7 +1427,7 @@
   ret = ospf_area_stub_set (ospf, area_id);
   if (ret == 0)
     {
-      vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
+      vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
 	       VTY_NEWLINE);
       return CMD_WARNING;
     }
@@ -1479,13 +1479,8 @@
 }
 
 #ifdef HAVE_NSSA
-DEFUN (ospf_area_nssa,
-       ospf_area_nssa_cmd,
-       "area (A.B.C.D|<0-4294967295>) nssa",
-       "OSPF area parameters\n"
-       "OSPF area ID in IP address format\n"
-       "OSPF area ID as a decimal value\n"
-       "Configure OSPF area as nssa\n")
+int
+ospf_area_nssa_cmd_handler (struct vty *vty, int argc, char **argv, int nosum)
 {
   struct ospf *ospf = vty->index;
   struct in_addr area_id;
@@ -1504,25 +1499,34 @@
   if (argc > 1)
     {
       if (strncmp (argv[1], "translate-c", 11) == 0)
-	ospf_area_nssa_translator_role_set (ospf, area_id,
+        ospf_area_nssa_translator_role_set (ospf, area_id,
 					    OSPF_NSSA_ROLE_CANDIDATE);
       else if (strncmp (argv[1], "translate-n", 11) == 0)
-	ospf_area_nssa_translator_role_set (ospf, area_id,
+        ospf_area_nssa_translator_role_set (ospf, area_id,
 					    OSPF_NSSA_ROLE_NEVER);
       else if (strncmp (argv[1], "translate-a", 11) == 0)
-	ospf_area_nssa_translator_role_set (ospf, area_id,
+        ospf_area_nssa_translator_role_set (ospf, area_id,
 					    OSPF_NSSA_ROLE_ALWAYS);
     }
+  else
+    {
+      ospf_area_nssa_translator_role_set (ospf, area_id,
+                        OSPF_NSSA_ROLE_CANDIDATE);
+    }
 
-  if (argc > 2)
+  if (nosum)
     ospf_area_no_summary_set (ospf, area_id);
+  else
+    ospf_area_no_summary_unset (ospf, area_id);
 
+  ospf_schedule_abr_task (ospf);
+    
   return CMD_SUCCESS;
 }
 
-ALIAS (ospf_area_nssa,
+DEFUN (ospf_area_nssa_translate_no_summary,
        ospf_area_nssa_translate_no_summary_cmd,
-       "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) (no-summary|)",
+       "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
        "OSPF area parameters\n"
        "OSPF area ID in IP address format\n"
        "OSPF area ID as a decimal value\n"
@@ -1530,10 +1534,12 @@
        "Configure NSSA-ABR for translate election (default)\n"
        "Configure NSSA-ABR to never translate\n"
        "Configure NSSA-ABR to always translate\n"
-       "Do not inject inter-area routes into nssa\n"
-       "dummy\n")
+       "Do not inject inter-area routes into nssa\n")
+{
+   return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
+}
 
-ALIAS (ospf_area_nssa,
+DEFUN (ospf_area_nssa_translate,
        ospf_area_nssa_translate_cmd,
        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
        "OSPF area parameters\n"
@@ -1543,6 +1549,20 @@
        "Configure NSSA-ABR for translate election (default)\n"
        "Configure NSSA-ABR to never translate\n"
        "Configure NSSA-ABR to always translate\n")
+{
+  return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
+}
+
+DEFUN (ospf_area_nssa,
+       ospf_area_nssa_cmd,
+       "area (A.B.C.D|<0-4294967295>) nssa",
+       "OSPF area parameters\n"
+       "OSPF area ID in IP address format\n"
+       "OSPF area ID as a decimal value\n"
+       "Configure OSPF area as nssa\n")
+{
+  return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
+}
 
 DEFUN (ospf_area_nssa_no_summary,
        ospf_area_nssa_no_summary_cmd,
@@ -1553,23 +1573,7 @@
        "Configure OSPF area as nssa\n"
        "Do not inject inter-area routes into nssa\n")
 {
-  struct ospf *ospf = vty->index;
-  struct in_addr area_id;
-  int ret, format;
-
-  VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
-
-  ret = ospf_area_nssa_set (ospf, area_id);
-  if (ret == 0)
-    {
-      vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
-	       VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  ospf_area_no_summary_set (ospf, area_id);
-
-  return CMD_SUCCESS;
+  return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
 }
 
 DEFUN (no_ospf_area_nssa,
@@ -1590,6 +1594,8 @@
   ospf_area_nssa_unset (ospf, area_id);
   ospf_area_no_summary_unset (ospf, area_id);
 
+  ospf_schedule_abr_task (ospf);
+
   return CMD_SUCCESS;
 }
 
@@ -2359,24 +2365,23 @@
   else
     {
       if (area->external_routing == OSPF_AREA_STUB)
-	vty_out (vty, " (Stub%s%s)",
-		 area->no_summary ? ", no summary" : "",
-		 area->shortcut_configured ? "; " : "");
+        vty_out (vty, " (Stub%s%s)",
+		         area->no_summary ? ", no summary" : "",
+		         area->shortcut_configured ? "; " : "");
 
 #ifdef HAVE_NSSA
 
-      else
-      if (area->external_routing == OSPF_AREA_NSSA)
-	vty_out (vty, " (NSSA%s%s)",
-		 area->no_summary ? ", no summary" : "",
-		 area->shortcut_configured ? "; " : "");
+      else if (area->external_routing == OSPF_AREA_NSSA)
+        vty_out (vty, " (NSSA%s%s)",
+                 area->no_summary ? ", no summary" : "",
+                 area->shortcut_configured ? "; " : "");
 #endif /* HAVE_NSSA */
 
       vty_out (vty, "%s", VTY_NEWLINE);
       vty_out (vty, "   Shortcutting mode: %s",
-	       ospf_shortcut_mode_descr_str[area->shortcut_configured]);
+               ospf_shortcut_mode_descr_str[area->shortcut_configured]);
       vty_out (vty, ", S-bit consensus: %s%s",
-	       area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
+               area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
     }
 
   /* Show number of interfaces. */
@@ -2389,21 +2394,34 @@
     {
       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 (! IS_OSPF_ABR (area->ospf))
-	vty_out (vty, "   It is not ABR, therefore not Translator. %s",
-		 VTY_NEWLINE);
+        vty_out (vty, "   It is not ABR, therefore not Translator. %s",
+                 VTY_NEWLINE);
+      else if (area->NSSATranslatorState)
+       {
+         vty_out (vty, "   We are an ABR and ");
+         if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
+           vty_out (vty, "the NSSA Elected Translator. %s", 
+	                VTY_NEWLINE);
+         else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
+           vty_out (vty, "always an NSSA Translator. %s",
+                    VTY_NEWLINE);
+       }
       else
-	{
-	  if (area->NSSATranslator)
-	    vty_out (vty, "   We are an ABR and the NSSA Elected Translator. %s", VTY_NEWLINE);
-	  else
-	    vty_out (vty, "   We are an ABR, but not the NSSA Elected Translator. %s", VTY_NEWLINE);
-	}
+       {
+         vty_out (vty, "   We are an ABR, but ");
+         if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
+           vty_out (vty, "not the NSSA Elected Translator. %s",
+                    VTY_NEWLINE);
+         else
+           vty_out (vty, "not the NSSA Elected Translator. %s", 
+	             VTY_NEWLINE);
+	   }
     }
 #endif /* HAVE_NSSA */
 
   /* Show number of fully adjacent neighbors. */
   vty_out (vty, "   Number of fully adjacent neighbors in this area:"
-	   " %d%s", area->full_nbrs, VTY_NEWLINE);
+                " %d%s", area->full_nbrs, VTY_NEWLINE);
 
   /* Show authentication type. */
   vty_out (vty, "   Area has ");
@@ -3278,6 +3296,7 @@
 	       VTY_NEWLINE, VTY_NEWLINE);
 
       show_ip_ospf_database_router_links (vty, rl);
+      vty_out (vty, "%s", VTY_NEWLINE);
     }
 
   return 0;
@@ -3324,6 +3343,7 @@
 	       VTY_NEWLINE);
       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
 	       VTY_NEWLINE);
+	  vty_out (vty, "%s", VTY_NEWLINE);
     }
 
   return 0;
@@ -3343,6 +3363,7 @@
 	       ip_masklen (sl->mask), VTY_NEWLINE);
       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
 	       VTY_NEWLINE);
+	  vty_out (vty, "%s", VTY_NEWLINE);
     }
 
   return 0;
@@ -6514,7 +6535,7 @@
 	  if ((or = getdata (nn)) != NULL)
 	    {
 	      if (flag++)
-		vty_out(vty,"                              " );
+            vty_out (vty, "%24s", "");
 
 	      /* Show path. */
 	      vty_out (vty, "%s [%d] area: %s",
@@ -6945,12 +6966,26 @@
 #endif /* HAVE_NSSA */
 	  )
 	{
-#ifdef HAVE_NSSA
-	  if (area->external_routing == OSPF_AREA_NSSA)
-	    vty_out (vty, " area %s nssa", buf);
-	  else
-#endif /* HAVE_NSSA */
+	  if (area->external_routing == OSPF_AREA_STUB)
 	    vty_out (vty, " area %s stub", buf);
+#ifdef HAVE_NSSA
+	  else if (area->external_routing == OSPF_AREA_NSSA)
+	    {
+	      vty_out (vty, " area %s nssa", buf);
+	      switch (area->NSSATranslatorRole)
+	        {
+	          case OSPF_NSSA_ROLE_NEVER:
+	            vty_out (vty, " translate-never");
+	            break;
+	          case OSPF_NSSA_ROLE_ALWAYS:
+	            vty_out (vty, " translate-always");
+	            break;
+	          case OSPF_NSSA_ROLE_CANDIDATE:
+	          default:
+	            vty_out (vty, " translate-candidate");
+	        }
+	    }
+#endif /* HAVE_NSSA */
 
 	  if (area->no_summary)
 	    vty_out (vty, " no-summary");