ospf_vty.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:217k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* OSPF VTY interface.
  2.  * Copyright (C) 2000 Toshiaki Takada
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include "memory.h"
  23. #include "thread.h"
  24. #include "prefix.h"
  25. #include "table.h"
  26. #include "vty.h"
  27. #include "command.h"
  28. #include "plist.h"
  29. #include "log.h"
  30. #include "zclient.h"
  31. #include "ospfd/ospfd.h"
  32. #include "ospfd/ospf_asbr.h"
  33. #include "ospfd/ospf_lsa.h"
  34. #include "ospfd/ospf_lsdb.h"
  35. #include "ospfd/ospf_ism.h"
  36. #include "ospfd/ospf_interface.h"
  37. #include "ospfd/ospf_nsm.h"
  38. #include "ospfd/ospf_neighbor.h"
  39. #include "ospfd/ospf_flood.h"
  40. #include "ospfd/ospf_abr.h"
  41. #include "ospfd/ospf_spf.h"
  42. #include "ospfd/ospf_route.h"
  43. #include "ospfd/ospf_zebra.h"
  44. /*#include "ospfd/ospf_routemap.h" */
  45. #include "ospfd/ospf_vty.h"
  46. #include "ospfd/ospf_dump.h"
  47. static char *ospf_network_type_str[] =
  48.   {
  49.     "Null",
  50.     "POINTOPOINT",
  51.     "BROADCAST",
  52.     "NBMA",
  53.     "POINTOMULTIPOINT",
  54.     "VIRTUALLINK",
  55.     "LOOPBACK"
  56.   };
  57. /* Utility functions. */
  58. int
  59. ospf_str2area_id (char *str, struct in_addr *area_id, int *format)
  60. {
  61.   char *endptr = NULL;
  62.   unsigned long ret;
  63.   /* match "A.B.C.D". */
  64.   if (strchr (str, '.') != NULL)
  65.     {
  66.       ret = inet_aton (str, area_id);
  67.       if (!ret)
  68.         return -1;
  69.       *format = OSPF_AREA_ID_FORMAT_ADDRESS;
  70.     }
  71.   /* match "<0-4294967295>". */
  72.   else
  73.     {
  74.       ret = strtoul (str, &endptr, 10);
  75.       if (*endptr != '' || (ret == ULONG_MAX && errno == ERANGE))
  76.         return -1;
  77.       area_id->s_addr = htonl (ret);
  78.       *format = OSPF_AREA_ID_FORMAT_DECIMAL;
  79.     }
  80.   return 0;
  81. }
  82. int
  83. str2distribute_source (char *str, int *source)
  84. {
  85.   /* Sanity check. */
  86.   if (str == NULL)
  87.     return 0;
  88.   if (strncmp (str, "k", 1) == 0)
  89.     *source = ZEBRA_ROUTE_KERNEL;
  90.   else if (strncmp (str, "c", 1) == 0)
  91.     *source = ZEBRA_ROUTE_CONNECT;
  92.   else if (strncmp (str, "s", 1) == 0)
  93.     *source = ZEBRA_ROUTE_STATIC;
  94.   else if (strncmp (str, "r", 1) == 0)
  95.     *source = ZEBRA_ROUTE_RIP;
  96.   else if (strncmp (str, "b", 1) == 0)
  97.     *source = ZEBRA_ROUTE_BGP;
  98.   else
  99.     return 0;
  100.   return 1;
  101. }
  102. int
  103. str2metric (char *str, int *metric)
  104. {
  105.   /* Sanity check. */
  106.   if (str == NULL)
  107.     return 0;
  108.   *metric = strtol (str, NULL, 10);
  109.   if (*metric < 0 && *metric > 16777214)
  110.     {
  111.       /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
  112.       return 0;
  113.     }
  114.   return 1;
  115. }
  116. int
  117. str2metric_type (char *str, int *metric_type)
  118. {
  119.   /* Sanity check. */
  120.   if (str == NULL)
  121.     return 0;
  122.   if (strncmp (str, "1", 1) == 0)
  123.     *metric_type = EXTERNAL_METRIC_TYPE_1;
  124.   else if (strncmp (str, "2", 1) == 0)
  125.     *metric_type = EXTERNAL_METRIC_TYPE_2;
  126.   else
  127.     return 0;
  128.   return 1;
  129. }
  130. int
  131. ospf_oi_count (struct interface *ifp)
  132. {
  133.   struct route_node *rn;
  134.   int i = 0;
  135.   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
  136.     if (rn->info)
  137.       i++;
  138.   return i;
  139. }
  140. DEFUN (router_ospf,
  141.        router_ospf_cmd,
  142.        "router ospf",
  143.        "Enable a routing processn"
  144.        "Start OSPF configurationn")
  145. {
  146.   vty->node = OSPF_NODE;
  147.   vty->index = ospf_get ();
  148.  
  149.   return CMD_SUCCESS;
  150. }
  151. DEFUN (no_router_ospf,
  152.        no_router_ospf_cmd,
  153.        "no router ospf",
  154.        NO_STR
  155.        "Enable a routing processn"
  156.        "Start OSPF configurationn")
  157. {
  158.   struct ospf *ospf;
  159.   ospf = ospf_lookup ();
  160.   if (ospf == NULL)
  161.     {
  162.       vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
  163.       return CMD_WARNING;
  164.     }
  165.   ospf_finish (ospf);
  166.   return CMD_SUCCESS;
  167. }
  168. DEFUN (ospf_router_id,
  169.        ospf_router_id_cmd,
  170.        "ospf router-id A.B.C.D",
  171.        "OSPF specific commandsn"
  172.        "router-id for the OSPF processn"
  173.        "OSPF router-id in IP address formatn")
  174. {
  175.   struct ospf *ospf = vty->index;
  176.   struct in_addr router_id;
  177.   int ret;
  178.   ret = inet_aton (argv[0], &router_id);
  179.   if (!ret)
  180.     {
  181.       vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
  182.       return CMD_WARNING;
  183.     }
  184.   ospf->router_id_static = router_id;
  185.   if (ospf->t_router_id_update == NULL)
  186.     OSPF_TIMER_ON (ospf->t_router_id_update, ospf_router_id_update_timer,
  187.    OSPF_ROUTER_ID_UPDATE_DELAY);
  188.   return CMD_SUCCESS;
  189. }
  190. ALIAS (ospf_router_id,
  191.        router_ospf_id_cmd,
  192.        "router-id A.B.C.D",
  193.        "router-id for the OSPF processn"
  194.        "OSPF router-id in IP address formatn");
  195. DEFUN (no_ospf_router_id,
  196.        no_ospf_router_id_cmd,
  197.        "no ospf router-id",
  198.        NO_STR
  199.        "OSPF specific commandsn"
  200.        "router-id for the OSPF processn")
  201. {
  202.   struct ospf *ospf = vty->index;
  203.   ospf->router_id_static.s_addr = 0;
  204.   ospf_router_id_update (ospf);
  205.   return CMD_SUCCESS;
  206. }
  207. ALIAS (no_ospf_router_id,
  208.        no_router_ospf_id_cmd,
  209.        "no router-id",
  210.        NO_STR
  211.        "router-id for the OSPF processn");
  212. DEFUN (ospf_passive_interface,
  213.        ospf_passive_interface_addr_cmd,
  214.        "passive-interface IFNAME A.B.C.D",
  215.        "Suppress routing updates on an interfacen"
  216.        "Interface's namen")
  217. {
  218.   struct interface *ifp;
  219.   struct in_addr addr;
  220.   int ret;
  221.   struct ospf_if_params *params;
  222.   ifp = if_lookup_by_name (argv[0]);
  223.  
  224.   if (ifp == NULL)
  225.     {
  226.       vty_out (vty, "Please specify an existing interface%s", VTY_NEWLINE);
  227.       return CMD_WARNING;
  228.     }
  229.   params = IF_DEF_PARAMS (ifp);
  230.   if (argc == 2)
  231.     {
  232.       ret = inet_aton(argv[1], &addr);
  233.       if (!ret)
  234. {
  235.   vty_out (vty, "Please specify interface address by A.B.C.D%s",
  236.    VTY_NEWLINE);
  237.   return CMD_WARNING;
  238. }
  239.       params = ospf_get_if_params (ifp, addr);
  240.       ospf_if_update_params (ifp, addr);
  241.     }
  242.   SET_IF_PARAM (params, passive_interface);
  243.   params->passive_interface = OSPF_IF_PASSIVE;
  244.  
  245.   return CMD_SUCCESS;
  246. }
  247. ALIAS (ospf_passive_interface,
  248.        ospf_passive_interface_cmd,
  249.        "passive-interface IFNAME",
  250.        "Suppress routing updates on an interfacen"
  251.        "Interface's namen");
  252. DEFUN (no_ospf_passive_interface,
  253.        no_ospf_passive_interface_addr_cmd,
  254.        "no passive-interface IFNAME A.B.C.D",
  255.        NO_STR
  256.        "Allow routing updates on an interfacen"
  257.        "Interface's namen")
  258. {
  259.   struct interface *ifp;
  260.   struct in_addr addr;
  261.   struct ospf_if_params *params;
  262.   int ret;
  263.     
  264.   ifp = if_lookup_by_name (argv[0]);
  265.   
  266.   if (ifp == NULL)
  267.     {
  268.       vty_out (vty, "Please specify an existing interface%s", VTY_NEWLINE);
  269.       return CMD_WARNING;
  270.     }
  271.   params = IF_DEF_PARAMS (ifp);
  272.   if (argc == 2)
  273.     {
  274.       ret = inet_aton(argv[1], &addr);
  275.       if (!ret)
  276. {
  277.   vty_out (vty, "Please specify interface address by A.B.C.D%s",
  278.    VTY_NEWLINE);
  279.   return CMD_WARNING;
  280. }
  281.       params = ospf_lookup_if_params (ifp, addr);
  282.       if (params == NULL)
  283. return CMD_SUCCESS;
  284.     }
  285.   UNSET_IF_PARAM (params, passive_interface);
  286.   params->passive_interface = OSPF_IF_ACTIVE;
  287.   
  288.   if (params != IF_DEF_PARAMS (ifp))
  289.     {
  290.       ospf_free_if_params (ifp, addr);
  291.       ospf_if_update_params (ifp, addr);
  292.     }
  293.   
  294.   return CMD_SUCCESS;
  295. }
  296. ALIAS (no_ospf_passive_interface,
  297.        no_ospf_passive_interface_cmd,
  298.        "no passive-interface IFNAME",
  299.        NO_STR
  300.        "Allow routing updates on an interfacen"
  301.        "Interface's namen");
  302. DEFUN (ospf_network_area,
  303.        ospf_network_area_cmd,
  304.        "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
  305.        "Enable routing on an IP networkn"
  306.        "OSPF network prefixn"
  307.        "Set the OSPF area IDn"
  308.        "OSPF area ID in IP address formatn"
  309.        "OSPF area ID as a decimal valuen")
  310. {
  311.   struct ospf *ospf= vty->index;
  312.   struct prefix_ipv4 p;
  313.   struct in_addr area_id;
  314.   int ret, format;
  315.   /* Get network prefix and Area ID. */
  316.   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
  317.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
  318.   ret = ospf_network_set (ospf, &p, area_id);
  319.   if (ret == 0)
  320.     {
  321.       vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
  322.       return CMD_WARNING;
  323.     }
  324.   return CMD_SUCCESS;
  325. }
  326. DEFUN (no_ospf_network_area,
  327.        no_ospf_network_area_cmd,
  328.        "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
  329.        NO_STR
  330.        "Enable routing on an IP networkn"
  331.        "OSPF network prefixn"
  332.        "Set the OSPF area IDn"
  333.        "OSPF area ID in IP address formatn"
  334.        "OSPF area ID as a decimal valuen")
  335. {
  336.   struct ospf *ospf = (struct ospf *) vty->index;
  337.   struct prefix_ipv4 p;
  338.   struct in_addr area_id;
  339.   int ret, format;
  340.   /* Get network prefix and Area ID. */
  341.   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
  342.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
  343.   ret = ospf_network_unset (ospf, &p, area_id);
  344.   if (ret == 0)
  345.     {
  346.       vty_out (vty, "Can't find specified network area configuration.%s",
  347.        VTY_NEWLINE);
  348.       return CMD_WARNING;
  349.     }
  350.   return CMD_SUCCESS;
  351. }
  352. DEFUN (ospf_area_range,
  353.        ospf_area_range_cmd,
  354.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
  355.        "OSPF area parametersn"
  356.        "OSPF area ID in IP address formatn"
  357.        "OSPF area ID as a decimal valuen"
  358.        "Summarize routes matching address/mask (border routers only)n"
  359.        "Area range prefixn")
  360. {
  361.   struct ospf *ospf = vty->index;
  362.   struct prefix_ipv4 p;
  363.   struct in_addr area_id;
  364.   int format;
  365.   u_int32_t cost;
  366.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  367.   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
  368.   ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
  369.   if (argc > 2)
  370.     {
  371.       VTY_GET_UINT32 ("range cost", cost, argv[2]);
  372.       ospf_area_range_cost_set (ospf, area_id, &p, cost);
  373.     }
  374.   return CMD_SUCCESS;
  375. }
  376. ALIAS (ospf_area_range,
  377.        ospf_area_range_advertise_cmd,
  378.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
  379.        "OSPF area parametersn"
  380.        "OSPF area ID in IP address formatn"
  381.        "OSPF area ID as a decimal valuen"
  382.        "OSPF area range for route advertise (default)n"
  383.        "Area range prefixn"
  384.        "Advertise this range (default)n");
  385. ALIAS (ospf_area_range,
  386.        ospf_area_range_cost_cmd,
  387.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
  388.        "OSPF area parametersn"
  389.        "OSPF area ID in IP address formatn"
  390.        "OSPF area ID as a decimal valuen"
  391.        "Summarize routes matching address/mask (border routers only)n"
  392.        "Area range prefixn"
  393.        "User specified metric for this rangen"
  394.        "Advertised metric for this rangen");
  395. ALIAS (ospf_area_range,
  396.        ospf_area_range_advertise_cost_cmd,
  397.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
  398.        "OSPF area parametersn"
  399.        "OSPF area ID in IP address formatn"
  400.        "OSPF area ID as a decimal valuen"
  401.        "Summarize routes matching address/mask (border routers only)n"
  402.        "Area range prefixn"
  403.        "Advertise this range (default)n"
  404.        "User specified metric for this rangen"
  405.        "Advertised metric for this rangen");
  406. DEFUN (ospf_area_range_not_advertise,
  407.        ospf_area_range_not_advertise_cmd,
  408.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
  409.        "OSPF area parametersn"
  410.        "OSPF area ID in IP address formatn"
  411.        "OSPF area ID as a decimal valuen"
  412.        "Summarize routes matching address/mask (border routers only)n"
  413.        "Area range prefixn"
  414.        "DoNotAdvertise this rangen")
  415. {
  416.   struct ospf *ospf = vty->index;
  417.   struct prefix_ipv4 p;
  418.   struct in_addr area_id;
  419.   int format;
  420.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  421.   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
  422.   ospf_area_range_set (ospf, area_id, &p, 0);
  423.   return CMD_SUCCESS;
  424. }
  425. DEFUN (no_ospf_area_range,
  426.        no_ospf_area_range_cmd,
  427.        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
  428.        NO_STR
  429.        "OSPF area parametersn"
  430.        "OSPF area ID in IP address formatn"
  431.        "OSPF area ID as a decimal valuen"
  432.        "Summarize routes matching address/mask (border routers only)n"
  433.        "Area range prefixn")
  434. {
  435.   struct ospf *ospf = vty->index;
  436.   struct prefix_ipv4 p;
  437.   struct in_addr area_id;
  438.   int format;
  439.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  440.   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
  441.   ospf_area_range_unset (ospf, area_id, &p);
  442.   return CMD_SUCCESS;
  443. }
  444. ALIAS (no_ospf_area_range,
  445.        no_ospf_area_range_advertise_cmd,
  446.        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
  447.        NO_STR
  448.        "OSPF area parametersn"
  449.        "OSPF area ID in IP address formatn"
  450.        "OSPF area ID as a decimal valuen"
  451.        "Summarize routes matching address/mask (border routers only)n"
  452.        "Area range prefixn"
  453.        "Advertise this range (default)n"
  454.        "DoNotAdvertise this rangen");
  455. ALIAS (no_ospf_area_range,
  456.        no_ospf_area_range_cost_cmd,
  457.        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
  458.        NO_STR
  459.        "OSPF area parametersn"
  460.        "OSPF area ID in IP address formatn"
  461.        "OSPF area ID as a decimal valuen"
  462.        "Summarize routes matching address/mask (border routers only)n"
  463.        "Area range prefixn"
  464.        "User specified metric for this rangen"
  465.        "Advertised metric for this rangen");
  466. ALIAS (no_ospf_area_range,
  467.        no_ospf_area_range_advertise_cost_cmd,
  468.        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
  469.        NO_STR
  470.        "OSPF area parametersn"
  471.        "OSPF area ID in IP address formatn"
  472.        "OSPF area ID as a decimal valuen"
  473.        "Summarize routes matching address/mask (border routers only)n"
  474.        "Area range prefixn"
  475.        "Advertise this range (default)n"
  476.        "User specified metric for this rangen"
  477.        "Advertised metric for this rangen");
  478. DEFUN (ospf_area_range_substitute,
  479.        ospf_area_range_substitute_cmd,
  480.        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
  481.        "OSPF area parametersn"
  482.        "OSPF area ID in IP address formatn"
  483.        "OSPF area ID as a decimal valuen"
  484.        "Summarize routes matching address/mask (border routers only)n"
  485.        "Area range prefixn"
  486.        "Announce area range as another prefixn"
  487.        "Network prefix to be announced instead of rangen")
  488. {
  489.   struct ospf *ospf = vty->index;
  490.   struct prefix_ipv4 p, s;
  491.   struct in_addr area_id;
  492.   int format;
  493.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  494.   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
  495.   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
  496.   ospf_area_range_substitute_set (ospf, area_id, &p, &s);
  497.   return CMD_SUCCESS;
  498. }
  499. DEFUN (no_ospf_area_range_substitute,
  500.        no_ospf_area_range_substitute_cmd,
  501.        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
  502.        NO_STR
  503.        "OSPF area parametersn"
  504.        "OSPF area ID in IP address formatn"
  505.        "OSPF area ID as a decimal valuen"
  506.        "Summarize routes matching address/mask (border routers only)n"
  507.        "Area range prefixn"
  508.        "Announce area range as another prefixn"
  509.        "Network prefix to be announced instead of rangen")
  510. {
  511.   struct ospf *ospf = vty->index;
  512.   struct prefix_ipv4 p, s;
  513.   struct in_addr area_id;
  514.   int format;
  515.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  516.   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
  517.   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
  518.   ospf_area_range_substitute_unset (ospf, area_id, &p);
  519.   return CMD_SUCCESS;
  520. }
  521. /* Command Handler Logic in VLink stuff is delicate!!
  522. ALTER AT YOUR OWN RISK!!!!
  523. Various dummy values are used to represent 'NoChange' state for
  524. VLink configuration NOT being changed by a VLink command, and
  525. special syntax is used within the command strings so that the
  526. typed in command verbs can be seen in the configuration command
  527. bacckend handler.  This is to drastically reduce the verbeage
  528. required to coe up with a reasonably compatible Cisco VLink command
  529. - Matthew Grant <grantma@anathoth.gen.nz> 
  530. Wed, 21 Feb 2001 15:13:52 +1300
  531. */
  532. /* Configuration data for virtual links 
  533.  */ 
  534. struct ospf_vl_config_data {
  535.   struct vty *vty; /* vty stuff */
  536.   struct in_addr area_id; /* area ID from command line */
  537.   int format; /* command line area ID format */
  538.   struct in_addr vl_peer; /* command line vl_peer */
  539.   int auth_type; /* Authehntication type, if given */
  540.   char *auth_key; /* simple password if present */
  541.   int crypto_key_id; /* Cryptographic key ID */
  542.   char *md5_key; /* MD5 authentication key */
  543.   int hello_interval;         /* Obvious what these are... */
  544.   int retransmit_interval; 
  545.   int transmit_delay;
  546.   int dead_interval;
  547. };
  548. void
  549. ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config, 
  550.   struct vty *vty)
  551. {
  552.   memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
  553.   vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
  554.   vl_config->vty = vty;
  555. }
  556. struct ospf_vl_data *
  557. ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
  558. {
  559.   struct ospf_area *area;
  560.   struct ospf_vl_data *vl_data;
  561.   struct vty *vty;
  562.   struct in_addr area_id;
  563.   vty = vl_config->vty;
  564.   area_id = vl_config->area_id;
  565.   if (area_id.s_addr == OSPF_AREA_BACKBONE)
  566.     {
  567.       vty_out (vty, 
  568.        "Configuring VLs over the backbone is not allowed%s",
  569.                VTY_NEWLINE);
  570.       return NULL;
  571.     }
  572.   area = ospf_area_get (ospf, area_id, vl_config->format);
  573.   if (area->external_routing != OSPF_AREA_DEFAULT)
  574.     {
  575.       if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
  576. vty_out (vty, "Area %s is %s%s",
  577.  inet_ntoa (area_id),
  578. #ifdef HAVE_NSSA
  579.  area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
  580. #else
  581.  "stub",
  582. #endif /* HAVE_NSSA */  
  583.  VTY_NEWLINE);
  584.       else
  585. vty_out (vty, "Area %ld is %s%s",
  586.  (u_long)ntohl (area_id.s_addr),
  587. #ifdef HAVE_NSSA
  588.  area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
  589. #else
  590.  "stub",
  591. #endif /* HAVE_NSSA */  
  592.  VTY_NEWLINE);
  593.       return NULL;
  594.     }
  595.   
  596.   if ((vl_data = ospf_vl_lookup (area, vl_config->vl_peer)) == NULL)
  597.     {
  598.       vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
  599.       if (vl_data->vl_oi == NULL)
  600. {
  601.   vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
  602.   ospf_vl_add (ospf, vl_data);
  603.   ospf_spf_calculate_schedule (ospf);
  604. }
  605.     }
  606.   return vl_data;
  607. }
  608. int
  609. ospf_vl_set_security (struct ospf_vl_data *vl_data,
  610.       struct ospf_vl_config_data *vl_config)
  611. {
  612.   struct crypt_key *ck;
  613.   struct vty *vty;
  614.   struct interface *ifp = vl_data->vl_oi->ifp;
  615.   vty = vl_config->vty;
  616.   if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
  617.     {
  618.       SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
  619.       IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
  620.     }
  621.   if (vl_config->auth_key)
  622.     {
  623.       memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
  624.       strncpy (IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key, 
  625.        OSPF_AUTH_SIMPLE_SIZE);
  626.     }
  627.   else if (vl_config->md5_key)
  628.     {
  629.       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id) 
  630.   != NULL)
  631. {
  632.   vty_out (vty, "OSPF: Key %d already exists%s",
  633.    vl_config->crypto_key_id, VTY_NEWLINE);
  634.   return CMD_WARNING;
  635. }
  636.       ck = ospf_crypt_key_new ();
  637.       ck->key_id = vl_config->crypto_key_id;
  638.       memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
  639.       strncpy (ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
  640.       
  641.       ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
  642.     }
  643.   else if (vl_config->crypto_key_id != 0)
  644.     {
  645.       /* Delete a key */
  646.       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, 
  647.  vl_config->crypto_key_id) == NULL)
  648. {
  649.   vty_out (vty, "OSPF: Key %d does not exist%s", 
  650.    vl_config->crypto_key_id, VTY_NEWLINE);
  651.   return CMD_WARNING;
  652. }
  653.       
  654.       ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
  655.     }
  656.   
  657.   return CMD_SUCCESS;
  658. }
  659. int
  660. ospf_vl_set_timers (struct ospf_vl_data *vl_data,
  661.     struct ospf_vl_config_data *vl_config)
  662. {
  663.   struct interface *ifp = ifp = vl_data->vl_oi->ifp;
  664.   /* Virtual Link data initialised to defaults, so only set
  665.      if a value given */
  666.   if (vl_config->hello_interval)
  667.     {
  668.       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
  669.       IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
  670.     }
  671.   if (vl_config->dead_interval)
  672.     {
  673.       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
  674.       IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
  675.     }
  676.   if (vl_config->retransmit_interval)
  677.     {
  678.       SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
  679.       IF_DEF_PARAMS (ifp)->retransmit_interval
  680. = vl_config->retransmit_interval;
  681.     }
  682.   
  683.   if (vl_config->transmit_delay)
  684.     {
  685.       SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
  686.       IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
  687.     }
  688.   
  689.   return CMD_SUCCESS;
  690. }
  691. /* The business end of all of the above */
  692. int
  693. ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
  694. {
  695.   struct ospf_vl_data *vl_data;
  696.   int ret;
  697.   vl_data = ospf_find_vl_data (ospf, vl_config);
  698.   if (!vl_data)
  699.     return CMD_WARNING;
  700.   
  701.   /* Process this one first as it can have a fatal result, which can
  702.      only logically occur if the virtual link exists already
  703.      Thus a command error does not result in a change to the
  704.      running configuration such as unexpectedly altered timer 
  705.      values etc.*/
  706.   ret = ospf_vl_set_security (vl_data, vl_config);
  707.   if (ret != CMD_SUCCESS)
  708.     return ret;
  709.   /* Set any time based parameters, these area already range checked */
  710.   ret = ospf_vl_set_timers (vl_data, vl_config);
  711.   if (ret != CMD_SUCCESS)
  712.     return ret;
  713.   return CMD_SUCCESS;
  714. }
  715. /* This stuff exists to make specifying all the alias commands A LOT simpler
  716.  */
  717. #define VLINK_HELPSTR_IPADDR 
  718.        "OSPF area parametersn" 
  719.        "OSPF area ID in IP address formatn" 
  720.        "OSPF area ID as a decimal valuen" 
  721.        "Configure a virtual linkn" 
  722.        "Router ID of the remote ABRn"
  723. #define VLINK_HELPSTR_AUTHTYPE_SIMPLE 
  724.        "Enable authentication on this virtual linkn" 
  725.        "dummy string n" 
  726. #define VLINK_HELPSTR_AUTHTYPE_ALL 
  727.        VLINK_HELPSTR_AUTHTYPE_SIMPLE 
  728.        "Use null authenticationn" 
  729.        "Use message-digest authenticationn"
  730. #define VLINK_HELPSTR_TIME_PARAM_NOSECS 
  731.        "Time between HELLO packetsn" 
  732.        "Time between retransmitting lost link state advertisementsn" 
  733.        "Link state transmit delayn" 
  734.        "Interval after which a neighbor is declared deadn"
  735. #define VLINK_HELPSTR_TIME_PARAM 
  736.        VLINK_HELPSTR_TIME_PARAM_NOSECS 
  737.        "Secondsn"
  738. #define VLINK_HELPSTR_AUTH_SIMPLE 
  739.        "Authentication password (key)n" 
  740.        "The OSPF password (key)"
  741. #define VLINK_HELPSTR_AUTH_MD5 
  742.        "Message digest authentication password (key)n" 
  743.        "dummy string n" 
  744.        "Key IDn" 
  745.        "Use MD5 algorithmn" 
  746.        "The OSPF password (key)"
  747. DEFUN (ospf_area_vlink,
  748.        ospf_area_vlink_cmd,
  749.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
  750.        VLINK_HELPSTR_IPADDR)
  751. {
  752.   struct ospf *ospf = vty->index;
  753.   struct ospf_vl_config_data vl_config;
  754.   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
  755.   char md5_key[OSPF_AUTH_MD5_SIZE+1]; 
  756.   int i;
  757.   int ret;
  758.   
  759.   ospf_vl_config_data_init(&vl_config, vty);
  760.   /* Read off first 2 parameters and check them */
  761.   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
  762.   if (ret < 0)
  763.     {
  764.       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
  765.       return CMD_WARNING;
  766.     }
  767.   ret = inet_aton (argv[1], &vl_config.vl_peer);
  768.   if (! ret)
  769.     {
  770.       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
  771.                VTY_NEWLINE);
  772.       return CMD_WARNING;
  773.     }
  774.   if (argc <=2)
  775.     {
  776.       /* Thats all folks! - BUGS B. strikes again!!!*/
  777.       return  ospf_vl_set (ospf, &vl_config);
  778.     }
  779.   /* Deal with other parameters */
  780.   for (i=2; i < argc; i++)
  781.     {
  782.       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
  783.       switch (argv[i][0])
  784. {
  785. case 'a':
  786.   if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
  787.     {
  788.       /* authentication-key - this option can occur anywhere on 
  789.  command line.  At start of command line
  790.  must check for authentication option. */
  791.       memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
  792.       strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
  793.       vl_config.auth_key = auth_key;
  794.       i++;
  795.     }
  796.   else if (strncmp (argv[i], "authentication", 14) == 0)
  797.     {
  798.       /* authentication  - this option can only occur at start
  799.  of command line */
  800.       vl_config.auth_type = OSPF_AUTH_SIMPLE;
  801.       if ((i+1) < argc)
  802. {
  803.   if (strncmp (argv[i+1], "n", 1) == 0)
  804.     {
  805.       /* "authentication null" */
  806.       vl_config.auth_type = OSPF_AUTH_NULL;
  807.       i++;
  808.     }
  809.   else if (strncmp (argv[i+1], "m", 1) == 0
  810.    && strcmp (argv[i+1], "message-digest-") != 0)
  811.     {
  812.       /* "authentication message-digest" */ 
  813.       vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
  814.       i++;
  815.     }
  816. }
  817.     }
  818.   break;
  819. case 'm':
  820.   /* message-digest-key */
  821.   i++;
  822.   vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
  823.   if (vl_config.crypto_key_id < 0)
  824.     return CMD_WARNING;
  825.   i++;
  826.   memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
  827.   strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
  828.   vl_config.md5_key = md5_key; 
  829.   break;
  830. case 'h':
  831.   /* Hello interval */
  832.   i++;
  833.   vl_config.hello_interval = strtol (argv[i], NULL, 10);
  834.   if (vl_config.hello_interval < 0) 
  835.     return CMD_WARNING;
  836.   break;
  837. case 'r':
  838.   /* Retransmit Interval */
  839.   i++;
  840.   vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
  841.   if (vl_config.retransmit_interval < 0)
  842.     return CMD_WARNING;
  843.   break;
  844. case 't':
  845.   /* Transmit Delay */
  846.   i++;
  847.   vl_config.transmit_delay = strtol (argv[i], NULL, 10);
  848.   if (vl_config.transmit_delay < 0)
  849.     return CMD_WARNING;
  850.   break;
  851. case 'd':
  852.   /* Dead Interval */
  853.   i++;
  854.   vl_config.dead_interval = strtol (argv[i], NULL, 10);
  855.   if (vl_config.dead_interval < 0)
  856.     return CMD_WARNING;
  857.   break;
  858. }
  859.     }
  860.   /* Action configuration */
  861.   return ospf_vl_set (ospf, &vl_config);
  862. }
  863. DEFUN (no_ospf_area_vlink,
  864.        no_ospf_area_vlink_cmd,
  865.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
  866.        NO_STR
  867.        VLINK_HELPSTR_IPADDR)
  868. {
  869.   struct ospf *ospf = vty->index;
  870.   struct ospf_area *area;
  871.   struct ospf_vl_config_data vl_config;
  872.   struct ospf_vl_data *vl_data = NULL;
  873.   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
  874.   int i;
  875.   int ret, format;
  876.   ospf_vl_config_data_init(&vl_config, vty);
  877.   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
  878.   if (ret < 0)
  879.     {
  880.       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
  881.       return CMD_WARNING;
  882.     }
  883.   area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
  884.   if (!area)
  885.     {
  886.       vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
  887.       return CMD_WARNING;
  888.     }
  889.   ret = inet_aton (argv[1], &vl_config.vl_peer);
  890.   if (! ret)
  891.     {
  892.       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
  893.                VTY_NEWLINE);
  894.       return CMD_WARNING;
  895.     }
  896.   if (argc <=2)
  897.     {
  898.       /* Basic VLink no command */
  899.       /* Thats all folks! - BUGS B. strikes again!!!*/
  900.       if ((vl_data = ospf_vl_lookup (area, vl_config.vl_peer)))
  901. ospf_vl_delete (ospf, vl_data);
  902.       ospf_area_check_free (ospf, vl_config.area_id);
  903.       
  904.       return CMD_SUCCESS;
  905.     }
  906.   /* If we are down here, we are reseting parameters */
  907.   /* Deal with other parameters */
  908.   for (i=2; i < argc; i++)
  909.     {
  910.       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
  911.       switch (argv[i][0])
  912. {
  913. case 'a':
  914.   if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
  915.     {
  916.       /* authentication-key - this option can occur anywhere on 
  917.  command line.  At start of command line
  918.  must check for authentication option. */
  919.       memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
  920.       vl_config.auth_key = auth_key;
  921.     }
  922.   else if (strncmp (argv[i], "authentication", 14) == 0)
  923.     {
  924.       /* authentication  - this option can only occur at start
  925.  of command line */
  926.       vl_config.auth_type = OSPF_AUTH_NOTSET;
  927.     }
  928.   break;
  929. case 'm':
  930.   /* message-digest-key */
  931.   /* Delete one key */
  932.   i++;
  933.   vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
  934.   if (vl_config.crypto_key_id < 0)
  935.     return CMD_WARNING;
  936.   vl_config.md5_key = NULL; 
  937.   break;
  938. case 'h':
  939.   /* Hello interval */
  940.   vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
  941.   break;
  942. case 'r':
  943.   /* Retransmit Interval */
  944.   vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
  945.   break;
  946. case 't':
  947.   /* Transmit Delay */
  948.   vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
  949.   break;
  950. case 'd':
  951.   /* Dead Interval */
  952.   i++;
  953.   vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
  954.   break;
  955. }
  956.     }
  957.   /* Action configuration */
  958.   return ospf_vl_set (ospf, &vl_config);
  959. }
  960. ALIAS (ospf_area_vlink,
  961.        ospf_area_vlink_param1_cmd,
  962.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  963.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
  964.        VLINK_HELPSTR_IPADDR
  965.        VLINK_HELPSTR_TIME_PARAM);
  966. ALIAS (no_ospf_area_vlink,
  967.        no_ospf_area_vlink_param1_cmd,
  968.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  969.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
  970.        NO_STR
  971.        VLINK_HELPSTR_IPADDR
  972.        VLINK_HELPSTR_TIME_PARAM);
  973. ALIAS (ospf_area_vlink,
  974.        ospf_area_vlink_param2_cmd,
  975.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  976.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  977.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
  978.        VLINK_HELPSTR_IPADDR
  979.        VLINK_HELPSTR_TIME_PARAM
  980.        VLINK_HELPSTR_TIME_PARAM);
  981. ALIAS (no_ospf_area_vlink,
  982.        no_ospf_area_vlink_param2_cmd,
  983.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  984.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  985.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
  986.        NO_STR
  987.        VLINK_HELPSTR_IPADDR
  988.        VLINK_HELPSTR_TIME_PARAM
  989.        VLINK_HELPSTR_TIME_PARAM);
  990. ALIAS (ospf_area_vlink,
  991.        ospf_area_vlink_param3_cmd,
  992.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  993.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  994.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  995.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
  996.        VLINK_HELPSTR_IPADDR
  997.        VLINK_HELPSTR_TIME_PARAM
  998.        VLINK_HELPSTR_TIME_PARAM
  999.        VLINK_HELPSTR_TIME_PARAM);
  1000. ALIAS (no_ospf_area_vlink,
  1001.        no_ospf_area_vlink_param3_cmd,
  1002.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1003.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  1004.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  1005.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
  1006.        NO_STR
  1007.        VLINK_HELPSTR_IPADDR
  1008.        VLINK_HELPSTR_TIME_PARAM
  1009.        VLINK_HELPSTR_TIME_PARAM
  1010.        VLINK_HELPSTR_TIME_PARAM);
  1011. ALIAS (ospf_area_vlink,
  1012.        ospf_area_vlink_param4_cmd,
  1013.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1014.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  1015.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  1016.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
  1017.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
  1018.        VLINK_HELPSTR_IPADDR
  1019.        VLINK_HELPSTR_TIME_PARAM
  1020.        VLINK_HELPSTR_TIME_PARAM
  1021.        VLINK_HELPSTR_TIME_PARAM
  1022.        VLINK_HELPSTR_TIME_PARAM);
  1023. ALIAS (no_ospf_area_vlink,
  1024.        no_ospf_area_vlink_param4_cmd,
  1025.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1026.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  1027.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  1028.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
  1029.        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
  1030.        NO_STR
  1031.        VLINK_HELPSTR_IPADDR
  1032.        VLINK_HELPSTR_TIME_PARAM
  1033.        VLINK_HELPSTR_TIME_PARAM
  1034.        VLINK_HELPSTR_TIME_PARAM
  1035.        VLINK_HELPSTR_TIME_PARAM);
  1036. ALIAS (ospf_area_vlink,
  1037.        ospf_area_vlink_authtype_args_cmd,
  1038.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1039.        "(authentication|) (message-digest|null)",
  1040.        VLINK_HELPSTR_IPADDR
  1041.        VLINK_HELPSTR_AUTHTYPE_ALL);
  1042. ALIAS (ospf_area_vlink,
  1043.        ospf_area_vlink_authtype_cmd,
  1044.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1045.        "(authentication|)",
  1046.        VLINK_HELPSTR_IPADDR
  1047.        VLINK_HELPSTR_AUTHTYPE_SIMPLE);
  1048. ALIAS (no_ospf_area_vlink,
  1049.        no_ospf_area_vlink_authtype_cmd,
  1050.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1051.        "(authentication|)",
  1052.        NO_STR
  1053.        VLINK_HELPSTR_IPADDR
  1054.        VLINK_HELPSTR_AUTHTYPE_SIMPLE);
  1055. ALIAS (ospf_area_vlink,
  1056.        ospf_area_vlink_md5_cmd,
  1057.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1058.        "(message-digest-key|) <1-255> md5 KEY",
  1059.        VLINK_HELPSTR_IPADDR
  1060.        VLINK_HELPSTR_AUTH_MD5);
  1061. ALIAS (no_ospf_area_vlink,
  1062.        no_ospf_area_vlink_md5_cmd,
  1063.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1064.        "(message-digest-key|) <1-255>",
  1065.        NO_STR
  1066.        VLINK_HELPSTR_IPADDR
  1067.        VLINK_HELPSTR_AUTH_MD5);
  1068. ALIAS (ospf_area_vlink,
  1069.        ospf_area_vlink_authkey_cmd,
  1070.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1071.        "(authentication-key|) AUTH_KEY",
  1072.        VLINK_HELPSTR_IPADDR
  1073.        VLINK_HELPSTR_AUTH_SIMPLE);
  1074. ALIAS (no_ospf_area_vlink,
  1075.        no_ospf_area_vlink_authkey_cmd,
  1076.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1077.        "(authentication-key|)",
  1078.        NO_STR
  1079.        VLINK_HELPSTR_IPADDR
  1080.        VLINK_HELPSTR_AUTH_SIMPLE);
  1081. ALIAS (ospf_area_vlink,
  1082.        ospf_area_vlink_authtype_args_authkey_cmd,
  1083.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1084.        "(authentication|) (message-digest|null) "
  1085.        "(authentication-key|) AUTH_KEY",
  1086.        VLINK_HELPSTR_IPADDR
  1087.        VLINK_HELPSTR_AUTHTYPE_ALL
  1088.        VLINK_HELPSTR_AUTH_SIMPLE);
  1089. ALIAS (ospf_area_vlink,
  1090.        ospf_area_vlink_authtype_authkey_cmd,
  1091.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1092.        "(authentication|) "
  1093.        "(authentication-key|) AUTH_KEY",
  1094.        VLINK_HELPSTR_IPADDR
  1095.        VLINK_HELPSTR_AUTHTYPE_SIMPLE
  1096.        VLINK_HELPSTR_AUTH_SIMPLE);
  1097. ALIAS (no_ospf_area_vlink,
  1098.        no_ospf_area_vlink_authtype_authkey_cmd,
  1099.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1100.        "(authentication|) "
  1101.        "(authentication-key|)",
  1102.        NO_STR
  1103.        VLINK_HELPSTR_IPADDR
  1104.        VLINK_HELPSTR_AUTHTYPE_SIMPLE
  1105.        VLINK_HELPSTR_AUTH_SIMPLE);
  1106. ALIAS (ospf_area_vlink,
  1107.        ospf_area_vlink_authtype_args_md5_cmd,
  1108.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1109.        "(authentication|) (message-digest|null) "
  1110.        "(message-digest-key|) <1-255> md5 KEY",
  1111.        VLINK_HELPSTR_IPADDR
  1112.        VLINK_HELPSTR_AUTHTYPE_ALL
  1113.        VLINK_HELPSTR_AUTH_MD5);
  1114. ALIAS (ospf_area_vlink,
  1115.        ospf_area_vlink_authtype_md5_cmd,
  1116.        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1117.        "(authentication|) "
  1118.        "(message-digest-key|) <1-255> md5 KEY",
  1119.        VLINK_HELPSTR_IPADDR
  1120.        VLINK_HELPSTR_AUTHTYPE_SIMPLE
  1121.        VLINK_HELPSTR_AUTH_MD5);
  1122. ALIAS (no_ospf_area_vlink,
  1123.        no_ospf_area_vlink_authtype_md5_cmd,
  1124.        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
  1125.        "(authentication|) "
  1126.        "(message-digest-key|)",
  1127.        NO_STR
  1128.        VLINK_HELPSTR_IPADDR
  1129.        VLINK_HELPSTR_AUTHTYPE_SIMPLE
  1130.        VLINK_HELPSTR_AUTH_MD5);
  1131. DEFUN (ospf_area_shortcut,
  1132.        ospf_area_shortcut_cmd,
  1133.        "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
  1134.        "OSPF area parametersn"
  1135.        "OSPF area ID in IP address formatn"
  1136.        "OSPF area ID as a decimal valuen"
  1137.        "Configure the area's shortcutting moden"
  1138.        "Set default shortcutting behaviorn"
  1139.        "Enable shortcutting through the arean"
  1140.        "Disable shortcutting through the arean")
  1141. {
  1142.   struct ospf *ospf = vty->index;
  1143.   struct ospf_area *area;
  1144.   struct in_addr area_id;
  1145.   int mode;
  1146.   int format;
  1147.   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
  1148.   area = ospf_area_get (ospf, area_id, format);
  1149.   if (strncmp (argv[1], "de", 2) == 0)
  1150.     mode = OSPF_SHORTCUT_DEFAULT;
  1151.   else if (strncmp (argv[1], "di", 2) == 0)
  1152.     mode = OSPF_SHORTCUT_DISABLE;
  1153.   else if (strncmp (argv[1], "e", 1) == 0)
  1154.     mode = OSPF_SHORTCUT_ENABLE;
  1155.   else
  1156.     return CMD_WARNING;
  1157.   ospf_area_shortcut_set (ospf, area, mode);
  1158.   if (ospf->abr_type != OSPF_ABR_SHORTCUT)
  1159.     vty_out (vty, "Shortcut area setting will take effect "
  1160.      "only when the router is configured as Shortcut ABR%s",
  1161.      VTY_NEWLINE);
  1162.   return CMD_SUCCESS;
  1163. }
  1164. DEFUN (no_ospf_area_shortcut,
  1165.        no_ospf_area_shortcut_cmd,
  1166.        "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
  1167.        NO_STR
  1168.        "OSPF area parametersn"
  1169.        "OSPF area ID in IP address formatn"
  1170.        "OSPF area ID as a decimal valuen"
  1171.        "Deconfigure the area's shortcutting moden"
  1172.        "Deconfigure enabled shortcutting through the arean"
  1173.        "Deconfigure disabled shortcutting through the arean")
  1174. {
  1175.   struct ospf *ospf = vty->index;
  1176.   struct ospf_area *area;
  1177.   struct in_addr area_id;
  1178.   int format;
  1179.   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
  1180.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1181.   if (!area)
  1182.     return CMD_SUCCESS;
  1183.   ospf_area_shortcut_unset (ospf, area);
  1184.   return CMD_SUCCESS;
  1185. }
  1186. DEFUN (ospf_area_stub,
  1187.        ospf_area_stub_cmd,
  1188.        "area (A.B.C.D|<0-4294967295>) stub",
  1189.        "OSPF area parametersn"
  1190.        "OSPF area ID in IP address formatn"
  1191.        "OSPF area ID as a decimal valuen"
  1192.        "Configure OSPF area as stubn")
  1193. {
  1194.   struct ospf *ospf = vty->index;
  1195.   struct in_addr area_id;
  1196.   int ret, format;
  1197.   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
  1198.   ret = ospf_area_stub_set (ospf, area_id);
  1199.   if (ret == 0)
  1200.     {
  1201.       vty_out (vty, "First deconfigure all virtual link through this area%s",
  1202.        VTY_NEWLINE);
  1203.       return CMD_WARNING;
  1204.     }
  1205.   ospf_area_no_summary_unset (ospf, area_id);
  1206.   return CMD_SUCCESS;
  1207. }
  1208. DEFUN (ospf_area_stub_no_summary,
  1209.        ospf_area_stub_no_summary_cmd,
  1210.        "area (A.B.C.D|<0-4294967295>) stub no-summary",
  1211.        "OSPF stub parametersn"
  1212.        "OSPF area ID in IP address formatn"
  1213.        "OSPF area ID as a decimal valuen"
  1214.        "Configure OSPF area as stubn"
  1215.        "Do not inject inter-area routes into stubn")
  1216. {
  1217.   struct ospf *ospf = vty->index;
  1218.   struct in_addr area_id;
  1219.   int ret, format;
  1220.   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
  1221.   ret = ospf_area_stub_set (ospf, area_id);
  1222.   if (ret == 0)
  1223.     {
  1224.       vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
  1225.        VTY_NEWLINE);
  1226.       return CMD_WARNING;
  1227.     }
  1228.   ospf_area_no_summary_set (ospf, area_id);
  1229.   return CMD_SUCCESS;
  1230. }
  1231. DEFUN (no_ospf_area_stub,
  1232.        no_ospf_area_stub_cmd,
  1233.        "no area (A.B.C.D|<0-4294967295>) stub",
  1234.        NO_STR
  1235.        "OSPF area parametersn"
  1236.        "OSPF area ID in IP address formatn"
  1237.        "OSPF area ID as a decimal valuen"
  1238.        "Configure OSPF area as stubn")
  1239. {
  1240.   struct ospf *ospf = vty->index;
  1241.   struct in_addr area_id;
  1242.   int format;
  1243.   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
  1244.   ospf_area_stub_unset (ospf, area_id);
  1245.   ospf_area_no_summary_unset (ospf, area_id);
  1246.   return CMD_SUCCESS;
  1247. }
  1248. DEFUN (no_ospf_area_stub_no_summary,
  1249.        no_ospf_area_stub_no_summary_cmd,
  1250.        "no area (A.B.C.D|<0-4294967295>) stub no-summary",
  1251.        NO_STR
  1252.        "OSPF area parametersn"
  1253.        "OSPF area ID in IP address formatn"
  1254.        "OSPF area ID as a decimal valuen"
  1255.        "Configure OSPF area as stubn"
  1256.        "Do not inject inter-area routes into arean")
  1257. {
  1258.   struct ospf *ospf = vty->index;
  1259.   struct in_addr area_id;
  1260.   int format;
  1261.   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
  1262.   ospf_area_no_summary_unset (ospf, area_id);
  1263.   return CMD_SUCCESS;
  1264. }
  1265. #ifdef HAVE_NSSA
  1266. DEFUN (ospf_area_nssa,
  1267.        ospf_area_nssa_cmd,
  1268.        "area (A.B.C.D|<0-4294967295>) nssa",
  1269.        "OSPF area parametersn"
  1270.        "OSPF area ID in IP address formatn"
  1271.        "OSPF area ID as a decimal valuen"
  1272.        "Configure OSPF area as nssan")
  1273. {
  1274.   struct ospf *ospf = vty->index;
  1275.   struct in_addr area_id;
  1276.   int ret, format;
  1277.   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
  1278.   ret = ospf_area_nssa_set (ospf, area_id);
  1279.   if (ret == 0)
  1280.     {
  1281.       vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
  1282.        VTY_NEWLINE);
  1283.       return CMD_WARNING;
  1284.     }
  1285.   if (argc > 1)
  1286.     {
  1287.       if (strncmp (argv[1], "translate-c", 11) == 0)
  1288. ospf_area_nssa_translator_role_set (ospf, area_id,
  1289.     OSPF_NSSA_ROLE_CANDIDATE);
  1290.       else if (strncmp (argv[1], "translate-n", 11) == 0)
  1291. ospf_area_nssa_translator_role_set (ospf, area_id,
  1292.     OSPF_NSSA_ROLE_NEVER);
  1293.       else if (strncmp (argv[1], "translate-a", 11) == 0)
  1294. ospf_area_nssa_translator_role_set (ospf, area_id,
  1295.     OSPF_NSSA_ROLE_ALWAYS);
  1296.     }
  1297.   if (argc > 2)
  1298.     ospf_area_no_summary_set (ospf, area_id);
  1299.   return CMD_SUCCESS;
  1300. }
  1301. ALIAS (ospf_area_nssa,
  1302.        ospf_area_nssa_translate_no_summary_cmd,
  1303.        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) (no-summary|)",
  1304.        "OSPF area parametersn"
  1305.        "OSPF area ID in IP address formatn"
  1306.        "OSPF area ID as a decimal valuen"
  1307.        "Configure OSPF area as nssan"
  1308.        "Configure NSSA-ABR for translate election (default)n"
  1309.        "Configure NSSA-ABR to never translaten"
  1310.        "Configure NSSA-ABR to always translaten"
  1311.        "Do not inject inter-area routes into nssan"
  1312.        "dummyn");
  1313. ALIAS (ospf_area_nssa,
  1314.        ospf_area_nssa_translate_cmd,
  1315.        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
  1316.        "OSPF area parametersn"
  1317.        "OSPF area ID in IP address formatn"
  1318.        "OSPF area ID as a decimal valuen"
  1319.        "Configure OSPF area as nssan"
  1320.        "Configure NSSA-ABR for translate election (default)n"
  1321.        "Configure NSSA-ABR to never translaten"
  1322.        "Configure NSSA-ABR to always translaten");
  1323. DEFUN (ospf_area_nssa_no_summary,
  1324.        ospf_area_nssa_no_summary_cmd,
  1325.        "area (A.B.C.D|<0-4294967295>) nssa no-summary",
  1326.        "OSPF area parametersn"
  1327.        "OSPF area ID in IP address formatn"
  1328.        "OSPF area ID as a decimal valuen"
  1329.        "Configure OSPF area as nssan"
  1330.        "Do not inject inter-area routes into nssan")
  1331. {
  1332.   struct ospf *ospf = vty->index;
  1333.   struct in_addr area_id;
  1334.   int ret, format;
  1335.   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
  1336.   ret = ospf_area_nssa_set (ospf, area_id);
  1337.   if (ret == 0)
  1338.     {
  1339.       vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
  1340.        VTY_NEWLINE);
  1341.       return CMD_WARNING;
  1342.     }
  1343.   ospf_area_no_summary_set (ospf, area_id);
  1344.   return CMD_SUCCESS;
  1345. }
  1346. DEFUN (no_ospf_area_nssa,
  1347.        no_ospf_area_nssa_cmd,
  1348.        "no area (A.B.C.D|<0-4294967295>) nssa",
  1349.        NO_STR
  1350.        "OSPF area parametersn"
  1351.        "OSPF area ID in IP address formatn"
  1352.        "OSPF area ID as a decimal valuen"
  1353.        "Configure OSPF area as nssan")
  1354. {
  1355.   struct ospf *ospf = vty->index;
  1356.   struct in_addr area_id;
  1357.   int format;
  1358.   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
  1359.   ospf_area_nssa_unset (ospf, area_id);
  1360.   ospf_area_no_summary_unset (ospf, area_id);
  1361.   return CMD_SUCCESS;
  1362. }
  1363. DEFUN (no_ospf_area_nssa_no_summary,
  1364.        no_ospf_area_nssa_no_summary_cmd,
  1365.        "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
  1366.        NO_STR
  1367.        "OSPF area parametersn"
  1368.        "OSPF area ID in IP address formatn"
  1369.        "OSPF area ID as a decimal valuen"
  1370.        "Configure OSPF area as nssan"
  1371.        "Do not inject inter-area routes into nssan")
  1372. {
  1373.   struct ospf *ospf = vty->index;
  1374.   struct in_addr area_id;
  1375.   int format;
  1376.   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
  1377.   ospf_area_no_summary_unset (ospf, area_id);
  1378.   return CMD_SUCCESS;
  1379. }
  1380. #endif /* HAVE_NSSA */
  1381. DEFUN (ospf_area_default_cost,
  1382.        ospf_area_default_cost_cmd,
  1383.        "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
  1384.        "OSPF area parametersn"
  1385.        "OSPF area ID in IP address formatn"
  1386.        "OSPF area ID as a decimal valuen"
  1387.        "Set the summary-default cost of a NSSA or stub arean"
  1388.        "Stub's advertised default summary costn")
  1389. {
  1390.   struct ospf *ospf = vty->index;
  1391.   struct ospf_area *area;
  1392.   struct in_addr area_id;
  1393.   u_int32_t cost;
  1394.   int format;
  1395.   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
  1396.   VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
  1397.   area = ospf_area_get (ospf, area_id, format);
  1398.   if (area->external_routing == OSPF_AREA_DEFAULT)
  1399.     {
  1400.       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
  1401.       return CMD_WARNING;
  1402.     }
  1403.   area->default_cost = cost;
  1404.   return CMD_SUCCESS;
  1405. }
  1406. DEFUN (no_ospf_area_default_cost,
  1407.        no_ospf_area_default_cost_cmd,
  1408.        "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
  1409.        NO_STR
  1410.        "OSPF area parametersn"
  1411.        "OSPF area ID in IP address formatn"
  1412.        "OSPF area ID as a decimal valuen"
  1413.        "Set the summary-default cost of a NSSA or stub arean"
  1414.        "Stub's advertised default summary costn")
  1415. {
  1416.   struct ospf *ospf = vty->index;
  1417.   struct ospf_area *area;
  1418.   struct in_addr area_id;
  1419.   u_int32_t cost;
  1420.   int format;
  1421.   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
  1422.   VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
  1423.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1424.   if (area == NULL)
  1425.     return CMD_SUCCESS;
  1426.   if (area->external_routing == OSPF_AREA_DEFAULT)
  1427.     {
  1428.       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
  1429.       return CMD_WARNING;
  1430.     }
  1431.   area->default_cost = 1;
  1432.   ospf_area_check_free (ospf, area_id);
  1433.   return CMD_SUCCESS;
  1434. }
  1435. DEFUN (ospf_area_export_list,
  1436.        ospf_area_export_list_cmd,
  1437.        "area (A.B.C.D|<0-4294967295>) export-list NAME",
  1438.        "OSPF area parametersn"
  1439.        "OSPF area ID in IP address formatn"
  1440.        "OSPF area ID as a decimal valuen"
  1441.        "Set the filter for networks announced to other areasn"
  1442.        "Name of the access-listn")
  1443. {
  1444.   struct ospf *ospf = vty->index;
  1445.   struct ospf_area *area;
  1446.   struct in_addr area_id;
  1447.   int format;
  1448.   VTY_GET_OSPF_AREA_ID_NO_BB ("export-list", area_id, format, argv[0]);
  1449.   area = ospf_area_get (ospf, area_id, format);
  1450.   ospf_area_export_list_set (ospf, area, argv[1]);
  1451.   return CMD_SUCCESS;
  1452. }
  1453. DEFUN (no_ospf_area_export_list,
  1454.        no_ospf_area_export_list_cmd,
  1455.        "no area (A.B.C.D|<0-4294967295>) export-list NAME",
  1456.        NO_STR
  1457.        "OSPF area parametersn"
  1458.        "OSPF area ID in IP address formatn"
  1459.        "OSPF area ID as a decimal valuen"
  1460.        "Unset the filter for networks announced to other areasn"
  1461.        "Name of the access-listn")
  1462. {
  1463.   struct ospf *ospf = vty->index;
  1464.   struct ospf_area *area;
  1465.   struct in_addr area_id;
  1466.   int format;
  1467.   VTY_GET_OSPF_AREA_ID_NO_BB ("export-list", area_id, format, argv[0]);
  1468.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1469.   if (area == NULL)
  1470.     return CMD_SUCCESS;
  1471.   ospf_area_export_list_unset (ospf, area);
  1472.   return CMD_SUCCESS;
  1473. }
  1474. DEFUN (ospf_area_import_list,
  1475.        ospf_area_import_list_cmd,
  1476.        "area (A.B.C.D|<0-4294967295>) import-list NAME",
  1477.        "OSPF area parametersn"
  1478.        "OSPF area ID in IP address formatn"
  1479.        "OSPF area ID as a decimal valuen"
  1480.        "Set the filter for networks from other areas announced to the specified onen"
  1481.        "Name of the access-listn")
  1482. {
  1483.   struct ospf *ospf = vty->index;
  1484.   struct ospf_area *area;
  1485.   struct in_addr area_id;
  1486.   int format;
  1487.   VTY_GET_OSPF_AREA_ID_NO_BB ("import-list", area_id, format, argv[0]);
  1488.   area = ospf_area_get (ospf, area_id, format);
  1489.   ospf_area_import_list_set (ospf, area, argv[1]);
  1490.   return CMD_SUCCESS;
  1491. }
  1492. DEFUN (no_ospf_area_import_list,
  1493.        no_ospf_area_import_list_cmd,
  1494.        "no area (A.B.C.D|<0-4294967295>) import-list NAME",
  1495.        NO_STR
  1496.        "OSPF area parametersn"
  1497.        "OSPF area ID in IP address formatn"
  1498.        "OSPF area ID as a decimal valuen"
  1499.        "Unset the filter for networks announced to other areasn"
  1500.        "Name of the access-listn")
  1501. {
  1502.   struct ospf *ospf = vty->index;
  1503.   struct ospf_area *area;
  1504.   struct in_addr area_id;
  1505.   int format;
  1506.   VTY_GET_OSPF_AREA_ID_NO_BB ("import-list", area_id, format, argv[0]);
  1507.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1508.   if (area == NULL)
  1509.     return CMD_SUCCESS;
  1510.   ospf_area_import_list_unset (ospf, area);
  1511.   return CMD_SUCCESS;
  1512. }
  1513. DEFUN (ospf_area_filter_list,
  1514.        ospf_area_filter_list_cmd,
  1515.        "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
  1516.        "OSPF area parametersn"
  1517.        "OSPF area ID in IP address formatn"
  1518.        "OSPF area ID as a decimal valuen"
  1519.        "Filter networks between OSPF areasn"
  1520.        "Filter prefixes between OSPF areasn"
  1521.        "Name of an IP prefix-listn"
  1522.        "Filter networks sent to this arean"
  1523.        "Filter networks sent from this arean")
  1524. {
  1525.   struct ospf *ospf = vty->index;
  1526.   struct ospf_area *area;
  1527.   struct in_addr area_id;
  1528.   struct prefix_list *plist;
  1529.   int format;
  1530.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  1531.   area = ospf_area_get (ospf, area_id, format);
  1532.   plist = prefix_list_lookup (AFI_IP, argv[1]);
  1533.   if (strncmp (argv[2], "in", 2) == 0)
  1534.     {
  1535.       PREFIX_LIST_IN (area) = plist;
  1536.       if (PREFIX_NAME_IN (area))
  1537. free (PREFIX_NAME_IN (area));
  1538.       PREFIX_NAME_IN (area) = strdup (argv[1]);
  1539.       ospf_schedule_abr_task (ospf);
  1540.     }
  1541.   else
  1542.     {
  1543.       PREFIX_LIST_OUT (area) = plist;
  1544.       if (PREFIX_NAME_OUT (area))
  1545. free (PREFIX_NAME_OUT (area));
  1546.       PREFIX_NAME_OUT (area) = strdup (argv[1]);
  1547.       ospf_schedule_abr_task (ospf);
  1548.     }
  1549.   return CMD_SUCCESS;
  1550. }
  1551. DEFUN (no_ospf_area_filter_list,
  1552.        no_ospf_area_filter_list_cmd,
  1553.        "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
  1554.        NO_STR
  1555.        "OSPF area parametersn"
  1556.        "OSPF area ID in IP address formatn"
  1557.        "OSPF area ID as a decimal valuen"
  1558.        "Filter networks between OSPF areasn"
  1559.        "Filter prefixes between OSPF areasn"
  1560.        "Name of an IP prefix-listn"
  1561.        "Filter networks sent to this arean"
  1562.        "Filter networks sent from this arean")
  1563. {
  1564.   struct ospf *ospf = vty->index;
  1565.   struct ospf_area *area;
  1566.   struct in_addr area_id;
  1567.   struct prefix_list *plist;
  1568.   int format;
  1569.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  1570.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1571.   plist = prefix_list_lookup (AFI_IP, argv[1]);
  1572.   if (strncmp (argv[2], "in", 2) == 0)
  1573.     {
  1574.       if (PREFIX_NAME_IN (area))
  1575. if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
  1576.   return CMD_SUCCESS;
  1577.       PREFIX_LIST_IN (area) = NULL;
  1578.       if (PREFIX_NAME_IN (area))
  1579. free (PREFIX_NAME_IN (area));
  1580.       PREFIX_NAME_IN (area) = NULL;
  1581.       ospf_schedule_abr_task (ospf);
  1582.     }
  1583.   else
  1584.     {
  1585.       if (PREFIX_NAME_OUT (area))
  1586. if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
  1587.   return CMD_SUCCESS;
  1588.       PREFIX_LIST_OUT (area) = NULL;
  1589.       if (PREFIX_NAME_OUT (area))
  1590. free (PREFIX_NAME_OUT (area));
  1591.       PREFIX_NAME_OUT (area) = NULL;
  1592.       ospf_schedule_abr_task (ospf);
  1593.     }
  1594.   return CMD_SUCCESS;
  1595. }
  1596. DEFUN (ospf_area_authentication_message_digest,
  1597.        ospf_area_authentication_message_digest_cmd,
  1598.        "area (A.B.C.D|<0-4294967295>) authentication message-digest",
  1599.        "OSPF area parametersn"
  1600.        "Enable authenticationn"
  1601.        "Use message-digest authenticationn")
  1602. {
  1603.   struct ospf *ospf = vty->index;
  1604.   struct ospf_area *area;
  1605.   struct in_addr area_id;
  1606.   int format;
  1607.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  1608.   area = ospf_area_get (ospf, area_id, format);
  1609.   area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
  1610.   return CMD_SUCCESS;
  1611. }
  1612. DEFUN (ospf_area_authentication,
  1613.        ospf_area_authentication_cmd,
  1614.        "area (A.B.C.D|<0-4294967295>) authentication",
  1615.        "OSPF area parametersn"
  1616.        "OSPF area ID in IP address formatn"
  1617.        "OSPF area ID as a decimal valuen"
  1618.        "Enable authenticationn")
  1619. {
  1620.   struct ospf *ospf = vty->index;
  1621.   struct ospf_area *area;
  1622.   struct in_addr area_id;
  1623.   int format;
  1624.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  1625.   area = ospf_area_get (ospf, area_id, format);
  1626.   area->auth_type = OSPF_AUTH_SIMPLE;
  1627.   return CMD_SUCCESS;
  1628. }
  1629. DEFUN (no_ospf_area_authentication,
  1630.        no_ospf_area_authentication_cmd,
  1631.        "no area (A.B.C.D|<0-4294967295>) authentication",
  1632.        NO_STR
  1633.        "OSPF area parametersn"
  1634.        "OSPF area ID in IP address formatn"
  1635.        "OSPF area ID as a decimal valuen"
  1636.        "Enable authenticationn")
  1637. {
  1638.   struct ospf *ospf = vty->index;
  1639.   struct ospf_area *area;
  1640.   struct in_addr area_id;
  1641.   int format;
  1642.   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
  1643.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  1644.   if (area == NULL)
  1645.     return CMD_SUCCESS;
  1646.   area->auth_type = OSPF_AUTH_NULL;
  1647.   ospf_area_check_free (ospf, area_id);
  1648.   
  1649.   return CMD_SUCCESS;
  1650. }
  1651. DEFUN (ospf_abr_type,
  1652.        ospf_abr_type_cmd,
  1653.        "ospf abr-type (cisco|ibm|shortcut|standard)",
  1654.        "OSPF specific commandsn"
  1655.        "Set OSPF ABR typen"
  1656.        "Alternative ABR, cisco implementationn"
  1657.        "Alternative ABR, IBM implementationn"
  1658.        "Shortcut ABRn"
  1659.        "Standard behavior (RFC2328)n")
  1660. {
  1661.   struct ospf *ospf = vty->index;
  1662.   u_char abr_type = OSPF_ABR_UNKNOWN;
  1663.   if (strncmp (argv[0], "c", 1) == 0)
  1664.     abr_type = OSPF_ABR_CISCO;
  1665.   else if (strncmp (argv[0], "i", 1) == 0)
  1666.     abr_type = OSPF_ABR_IBM;
  1667.   else if (strncmp (argv[0], "sh", 2) == 0)
  1668.     abr_type = OSPF_ABR_SHORTCUT;
  1669.   else if (strncmp (argv[0], "st", 2) == 0)
  1670.     abr_type = OSPF_ABR_STAND;
  1671.   else
  1672.     return CMD_WARNING;
  1673.   /* If ABR type value is changed, schedule ABR task. */
  1674.   if (ospf->abr_type != abr_type)
  1675.     {
  1676.       ospf->abr_type = abr_type;
  1677.       ospf_schedule_abr_task (ospf);
  1678.     }
  1679.   return CMD_SUCCESS;
  1680. }
  1681. DEFUN (no_ospf_abr_type,
  1682.        no_ospf_abr_type_cmd,
  1683.        "no ospf abr-type (cisco|ibm|shortcut)",
  1684.        NO_STR
  1685.        "OSPF specific commandsn"
  1686.        "Set OSPF ABR typen"
  1687.        "Alternative ABR, cisco implementationn"
  1688.        "Alternative ABR, IBM implementationn"
  1689.        "Shortcut ABRn")
  1690. {
  1691.   struct ospf *ospf = vty->index;
  1692.   u_char abr_type = OSPF_ABR_UNKNOWN;
  1693.   if (strncmp (argv[0], "c", 1) == 0)
  1694.     abr_type = OSPF_ABR_CISCO;
  1695.   else if (strncmp (argv[0], "i", 1) == 0)
  1696.     abr_type = OSPF_ABR_IBM;
  1697.   else if (strncmp (argv[0], "s", 1) == 0)
  1698.     abr_type = OSPF_ABR_SHORTCUT;
  1699.   else
  1700.     return CMD_WARNING;
  1701.   /* If ABR type value is changed, schedule ABR task. */
  1702.   if (ospf->abr_type == abr_type)
  1703.     {
  1704.       ospf->abr_type = OSPF_ABR_STAND;
  1705.       ospf_schedule_abr_task (ospf);
  1706.     }
  1707.   return CMD_SUCCESS;
  1708. }
  1709. DEFUN (ospf_compatible_rfc1583,
  1710.        ospf_compatible_rfc1583_cmd,
  1711.        "compatible rfc1583",
  1712.        "OSPF compatibility listn"
  1713.        "compatible with RFC 1583n")
  1714. {
  1715.   struct ospf *ospf = vty->index;
  1716.   if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
  1717.     {
  1718.       SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
  1719.       ospf_spf_calculate_schedule (ospf);
  1720.     }
  1721.   return CMD_SUCCESS;
  1722. }
  1723. DEFUN (no_ospf_compatible_rfc1583,
  1724.        no_ospf_compatible_rfc1583_cmd,
  1725.        "no compatible rfc1583",
  1726.        NO_STR
  1727.        "OSPF compatibility listn"
  1728.        "compatible with RFC 1583n")
  1729. {
  1730.   struct ospf *ospf = vty->index;
  1731.   if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
  1732.     {
  1733.       UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
  1734.       ospf_spf_calculate_schedule (ospf);
  1735.     }
  1736.   return CMD_SUCCESS;
  1737. }
  1738. ALIAS (ospf_compatible_rfc1583,
  1739.        ospf_rfc1583_flag_cmd,
  1740.        "ospf rfc1583compatibility",
  1741.        "OSPF specific commandsn"
  1742.        "Enable the RFC1583Compatibility flagn");
  1743. ALIAS (no_ospf_compatible_rfc1583,
  1744.        no_ospf_rfc1583_flag_cmd,
  1745.        "no ospf rfc1583compatibility",
  1746.        NO_STR
  1747.        "OSPF specific commandsn"
  1748.        "Disable the RFC1583Compatibility flagn");
  1749. DEFUN (ospf_timers_spf,
  1750.        ospf_timers_spf_cmd,
  1751.        "timers spf <0-4294967295> <0-4294967295>",
  1752.        "Adjust routing timersn"
  1753.        "OSPF SPF timersn"
  1754.        "Delay between receiving a change to SPF calculationn"
  1755.        "Hold time between consecutive SPF calculationsn")
  1756. {
  1757.   struct ospf *ospf = vty->index;
  1758.   u_int32_t delay, hold;
  1759.   VTY_GET_UINT32 ("SPF delay timer", delay, argv[0]);
  1760.   VTY_GET_UINT32 ("SPF hold timer", hold, argv[1]);
  1761.   ospf_timers_spf_set (ospf, delay, hold);
  1762.   return CMD_SUCCESS;
  1763. }
  1764. DEFUN (no_ospf_timers_spf,
  1765.        no_ospf_timers_spf_cmd,
  1766.        "no timers spf",
  1767.        NO_STR
  1768.        "Adjust routing timersn"
  1769.        "OSPF SPF timersn")
  1770. {
  1771.   struct ospf *ospf = vty->index;
  1772.   ospf->spf_delay = OSPF_SPF_DELAY_DEFAULT;
  1773.   ospf->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
  1774.   return CMD_SUCCESS;
  1775. }
  1776. DEFUN (ospf_neighbor,
  1777.        ospf_neighbor_cmd,
  1778.        "neighbor A.B.C.D",
  1779.        NEIGHBOR_STR
  1780.        "Neighbor IP addressn")
  1781. {
  1782.   struct ospf *ospf = vty->index;
  1783.   struct in_addr nbr_addr;
  1784.   int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
  1785.   int interval = OSPF_POLL_INTERVAL_DEFAULT;
  1786.   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
  1787.   if (argc > 1)
  1788.     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
  1789.   if (argc > 2)
  1790.     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
  1791.   ospf_nbr_nbma_set (ospf, nbr_addr);
  1792.   if (argc > 1)
  1793.     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
  1794.   if (argc > 2)
  1795.     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
  1796.   return CMD_SUCCESS;
  1797. }
  1798. ALIAS (ospf_neighbor,
  1799.        ospf_neighbor_priority_poll_interval_cmd,
  1800.        "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
  1801.        NEIGHBOR_STR
  1802.        "Neighbor IP addressn"
  1803.        "Neighbor Priorityn"
  1804.        "Priorityn"
  1805.        "Dead Neighbor Polling intervaln"
  1806.        "Secondsn");
  1807. ALIAS (ospf_neighbor,
  1808.        ospf_neighbor_priority_cmd,
  1809.        "neighbor A.B.C.D priority <0-255>",
  1810.        NEIGHBOR_STR
  1811.        "Neighbor IP addressn"
  1812.        "Neighbor Priorityn"
  1813.        "Secondsn");
  1814. DEFUN (ospf_neighbor_poll_interval,
  1815.        ospf_neighbor_poll_interval_cmd,
  1816.        "neighbor A.B.C.D poll-interval <1-65535>",
  1817.        NEIGHBOR_STR
  1818.        "Neighbor IP addressn"
  1819.        "Dead Neighbor Polling intervaln"
  1820.        "Secondsn")
  1821. {
  1822.   struct ospf *ospf = vty->index;
  1823.   struct in_addr nbr_addr;
  1824.   int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
  1825.   int interval = OSPF_POLL_INTERVAL_DEFAULT;
  1826.   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
  1827.   if (argc > 1)
  1828.     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
  1829.   if (argc > 2)
  1830.     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
  1831.   ospf_nbr_nbma_set (ospf, nbr_addr);
  1832.   if (argc > 1)
  1833.     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
  1834.   if (argc > 2)
  1835.     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
  1836.   return CMD_SUCCESS;
  1837. }
  1838. ALIAS (ospf_neighbor_poll_interval,
  1839.        ospf_neighbor_poll_interval_priority_cmd,
  1840.        "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
  1841.        NEIGHBOR_STR
  1842.        "Neighbor addressn"
  1843.        "OSPF dead-router polling intervaln"
  1844.        "Secondsn"
  1845.        "OSPF priority of non-broadcast neighborn"
  1846.        "Priorityn");
  1847. DEFUN (no_ospf_neighbor,
  1848.        no_ospf_neighbor_cmd,
  1849.        "no neighbor A.B.C.D",
  1850.        NO_STR
  1851.        NEIGHBOR_STR
  1852.        "Neighbor IP addressn")
  1853. {
  1854.   struct ospf *ospf = vty->index;
  1855.   struct in_addr nbr_addr;
  1856.   int ret;
  1857.   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
  1858.   ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
  1859.   return CMD_SUCCESS;
  1860. }
  1861. ALIAS (no_ospf_neighbor,
  1862.        no_ospf_neighbor_priority_cmd,
  1863.        "no neighbor A.B.C.D priority <0-255>",
  1864.        NO_STR
  1865.        NEIGHBOR_STR
  1866.        "Neighbor IP addressn"
  1867.        "Neighbor Priorityn"
  1868.        "Priorityn");
  1869. ALIAS (no_ospf_neighbor,
  1870.        no_ospf_neighbor_poll_interval_cmd,
  1871.        "no neighbor A.B.C.D poll-interval <1-65535>",
  1872.        NO_STR
  1873.        NEIGHBOR_STR
  1874.        "Neighbor IP addressn"
  1875.        "Dead Neighbor Polling intervaln"
  1876.        "Secondsn");
  1877. ALIAS (no_ospf_neighbor,
  1878.        no_ospf_neighbor_priority_pollinterval_cmd,
  1879.        "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
  1880.        NO_STR
  1881.        NEIGHBOR_STR
  1882.        "Neighbor IP addressn"
  1883.        "Neighbor Priorityn"
  1884.        "Priorityn"
  1885.        "Dead Neighbor Polling intervaln"
  1886.        "Secondsn");
  1887. DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
  1888.        "refresh timer <10-1800>",
  1889.        "Adjust refresh parametersn"
  1890.        "Set refresh timern"
  1891.        "Timer value in secondsn")
  1892. {
  1893.   struct ospf *ospf = vty->index;
  1894.   int interval;
  1895.   
  1896.   VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
  1897.   interval = (interval / 10) * 10;
  1898.   ospf_timers_refresh_set (ospf, interval);
  1899.   return CMD_SUCCESS;
  1900. }
  1901. DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
  1902.        "no refresh timer <10-1800>",
  1903.        "Adjust refresh parametersn"
  1904.        "Unset refresh timern"
  1905.        "Timer value in secondsn")
  1906. {
  1907.   struct ospf *ospf = vty->index;
  1908.   int interval;
  1909.   if (argc == 1)
  1910.     {
  1911.       VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
  1912.   
  1913.       if (ospf->lsa_refresh_interval != interval ||
  1914.   interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
  1915. return CMD_SUCCESS;
  1916.     }
  1917.   ospf_timers_refresh_unset (ospf);
  1918.   return CMD_SUCCESS;
  1919. }
  1920. ALIAS (no_ospf_refresh_timer,
  1921.        no_ospf_refresh_timer_cmd,
  1922.        "no refresh timer",
  1923.        "Adjust refresh parametersn"
  1924.        "Unset refresh timern");
  1925. DEFUN (ospf_auto_cost_reference_bandwidth,
  1926.        ospf_auto_cost_reference_bandwidth_cmd,
  1927.        "auto-cost reference-bandwidth <1-4294967>",
  1928.        "Calculate OSPF interface cost according to bandwidthn"
  1929.        "Use reference bandwidth method to assign OSPF costn"
  1930.        "The reference bandwidth in terms of Mbits per secondn")
  1931. {
  1932.   struct ospf *ospf = vty->index;
  1933.   u_int32_t refbw;
  1934.   listnode node;
  1935.   refbw = strtol (argv[0], NULL, 10);
  1936.   if (refbw < 1 || refbw > 4294967)
  1937.     {
  1938.       vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
  1939.       return CMD_WARNING;
  1940.     }
  1941.   /* If reference bandwidth is changed. */
  1942.   if ((refbw * 1000) == ospf->ref_bandwidth)
  1943.     return CMD_SUCCESS;
  1944.   
  1945.   ospf->ref_bandwidth = refbw * 1000;
  1946.   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
  1947.   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
  1948.       
  1949.   for (node = listhead (om->iflist); node; nextnode (node))
  1950.     ospf_if_recalculate_output_cost (getdata (node));
  1951.   
  1952.   return CMD_SUCCESS;
  1953. }
  1954. DEFUN (no_ospf_auto_cost_reference_bandwidth,
  1955.        no_ospf_auto_cost_reference_bandwidth_cmd,
  1956.        "no auto-cost reference-bandwidth",
  1957.        NO_STR
  1958.        "Calculate OSPF interface cost according to bandwidthn"
  1959.        "Use reference bandwidth method to assign OSPF costn")
  1960. {
  1961.   struct ospf *ospf = vty->index;
  1962.   listnode node;
  1963.   if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
  1964.     return CMD_SUCCESS;
  1965.   
  1966.   ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
  1967.   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
  1968.   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
  1969.   for (node = listhead (om->iflist); node; nextnode (node))
  1970.     ospf_if_recalculate_output_cost (getdata (node));
  1971.       
  1972.   return CMD_SUCCESS;
  1973. }
  1974. char *ospf_abr_type_descr_str[] = 
  1975.   {
  1976.     "Unknown",
  1977.     "Standard (RFC2328)",
  1978.     "Alternative IBM",
  1979.     "Alternative Cisco",
  1980.     "Alternative Shortcut"
  1981.   };
  1982. char *ospf_shortcut_mode_descr_str[] = 
  1983.   {
  1984.     "Default",
  1985.     "Enabled",
  1986.     "Disabled"
  1987.   };
  1988. void
  1989. show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
  1990. {
  1991.   /* Show Area ID. */
  1992.   vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
  1993.   /* Show Area type/mode. */
  1994.   if (OSPF_IS_AREA_BACKBONE (area))
  1995.     vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
  1996.   else
  1997.     {
  1998.       if (area->external_routing == OSPF_AREA_STUB)
  1999. vty_out (vty, " (Stub%s%s)",
  2000.  area->no_summary ? ", no summary" : "",
  2001.  area->shortcut_configured ? "; " : "");
  2002. #ifdef HAVE_NSSA
  2003.       else
  2004. if (area->external_routing == OSPF_AREA_NSSA)
  2005.   vty_out (vty, " (NSSA%s%s)",
  2006.    area->no_summary ? ", no summary" : "",
  2007.    area->shortcut_configured ? "; " : "");
  2008. #endif /* HAVE_NSSA */
  2009.       vty_out (vty, "%s", VTY_NEWLINE);
  2010.       vty_out (vty, "   Shortcutting mode: %s",
  2011.        ospf_shortcut_mode_descr_str[area->shortcut_configured]);
  2012.       vty_out (vty, ", S-bit consensus: %s%s",
  2013.        area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
  2014.     }
  2015.   /* Show number of interfaces. */
  2016.   vty_out (vty, "   Number of interfaces in this area: Total: %d, "
  2017.    "Active: %d%s", listcount (area->oiflist),
  2018.    area->act_ints, VTY_NEWLINE);
  2019. #ifdef HAVE_NSSA
  2020.   if (area->external_routing == OSPF_AREA_NSSA)
  2021.     {
  2022.       vty_out (vty, "   It is an NSSA configuration. %s   Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
  2023.       if (! IS_OSPF_ABR (area->ospf))
  2024. vty_out (vty, "   It is not ABR, therefore not Translator. %s",
  2025.  VTY_NEWLINE);
  2026.       else
  2027. {
  2028.   if (area->NSSATranslator)
  2029.     vty_out (vty, "   We are an ABR and the NSSA Elected Translator. %s", VTY_NEWLINE);
  2030.   else
  2031.     vty_out (vty, "   We are an ABR, but not the NSSA Elected Translator. %s", VTY_NEWLINE);
  2032. }
  2033.     }
  2034. #endif /* HAVE_NSSA */
  2035.   /* Show number of fully adjacent neighbors. */
  2036.   vty_out (vty, "   Number of fully adjacent neighbors in this area:"
  2037.    " %d%s", area->full_nbrs, VTY_NEWLINE);
  2038.   /* Show authentication type. */
  2039.   vty_out (vty, "   Area has ");
  2040.   if (area->auth_type == OSPF_AUTH_NULL)
  2041.     vty_out (vty, "no authentication%s", VTY_NEWLINE);
  2042.   else if (area->auth_type == OSPF_AUTH_SIMPLE)
  2043.     vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
  2044.   else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
  2045.     vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
  2046.   if (!OSPF_IS_AREA_BACKBONE (area))
  2047.     vty_out (vty, "   Number of full virtual adjacencies going through"
  2048.      " this area: %d%s", area->full_vls, VTY_NEWLINE);
  2049.   /* Show SPF calculation times. */
  2050.   vty_out (vty, "   SPF algorithm executed %d times%s",
  2051.    area->spf_calculation, VTY_NEWLINE);
  2052.   /* Show number of LSA. */
  2053.   vty_out (vty, "   Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
  2054.   vty_out (vty, "%s", VTY_NEWLINE);
  2055. }
  2056. DEFUN (show_ip_ospf,
  2057.        show_ip_ospf_cmd,
  2058.        "show ip ospf",
  2059.        SHOW_STR
  2060.        IP_STR
  2061.        "OSPF informationn")
  2062. {
  2063.   listnode node;
  2064.   struct ospf_area * area;
  2065.   struct ospf *ospf;
  2066.   /* Check OSPF is enable. */
  2067.   ospf = ospf_lookup ();
  2068.   if (ospf == NULL)
  2069.     {
  2070.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2071.       return CMD_SUCCESS;
  2072.     }
  2073.   /* Show Router ID. */
  2074.   vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
  2075.            inet_ntoa (ospf->router_id),
  2076.            VTY_NEWLINE);
  2077.   /* Show capability. */
  2078.   vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
  2079.   vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
  2080.   vty_out (vty, " RFC1583Compatibility flag is %s%s",
  2081.    CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
  2082.    "enabled" : "disabled", VTY_NEWLINE);
  2083. #ifdef HAVE_OPAQUE_LSA
  2084.   vty_out (vty, " OpaqueCapability flag is %s%s%s",
  2085.    CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
  2086.            "enabled" : "disabled",
  2087.            IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
  2088.            " (origination blocked)" : "",
  2089.            VTY_NEWLINE);
  2090. #endif /* HAVE_OPAQUE_LSA */
  2091.   /* Show SPF timers. */
  2092.   vty_out (vty, " SPF schedule delay %d secs, Hold time between two SPFs %d secs%s",
  2093.    ospf->spf_delay, ospf->spf_holdtime, VTY_NEWLINE);
  2094.   /* Show refresh parameters. */
  2095.   vty_out (vty, " Refresh timer %d secs%s",
  2096.    ospf->lsa_refresh_interval, VTY_NEWLINE);
  2097.    
  2098.   /* Show ABR/ASBR flags. */
  2099.   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
  2100.     vty_out (vty, " This router is an ABR, ABR type is: %s%s",
  2101.              ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
  2102.   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
  2103.     vty_out (vty, " This router is an ASBR "
  2104.              "(injecting external routing information)%s", VTY_NEWLINE);
  2105.   /* Show Number of AS-external-LSAs. */
  2106.   vty_out (vty, " Number of external LSA %ld%s",
  2107.    ospf_lsdb_count_all (ospf->lsdb), VTY_NEWLINE);
  2108.   /* Show number of areas attached. */
  2109.   vty_out (vty, " Number of areas attached to this router: %d%s%s",
  2110.            listcount (ospf->areas), VTY_NEWLINE, VTY_NEWLINE);
  2111.   /* Show each area status. */
  2112.   for (node = listhead (ospf->areas); node; nextnode (node))
  2113.     if ((area = getdata (node)) != NULL)
  2114.       show_ip_ospf_area (vty, area);
  2115.   return CMD_SUCCESS;
  2116. }
  2117. void
  2118. show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
  2119.     struct interface *ifp)
  2120. {
  2121.   struct ospf_neighbor *nbr;
  2122.   int oi_count;
  2123.   struct route_node *rn;
  2124.   char buf[9];
  2125.   oi_count = ospf_oi_count (ifp);
  2126.   
  2127.   /* Is interface up? */
  2128.   if (if_is_up (ifp))
  2129.     vty_out (vty, "%s is up, line protocol is up%s", ifp->name, VTY_NEWLINE);
  2130.   else
  2131.     {
  2132.       vty_out (vty, "%s is down, line protocol is down%s", ifp->name,
  2133.        VTY_NEWLINE);
  2134.       
  2135.       if (oi_count == 0)
  2136. vty_out (vty, "  OSPF not enabled on this interface%s", VTY_NEWLINE);
  2137.       else
  2138. vty_out (vty, "  OSPF is enabled, but not running on this interface%s",
  2139.  VTY_NEWLINE);
  2140.       return;
  2141.     }
  2142.   /* Is interface OSPF enabled? */
  2143.   if (oi_count == 0)
  2144.     {
  2145.       vty_out (vty, "  OSPF not enabled on this interface%s", VTY_NEWLINE);
  2146.       return;
  2147.     }
  2148.   
  2149.   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
  2150.     {
  2151.       struct ospf_interface *oi = rn->info;
  2152.       
  2153.       if (oi == NULL)
  2154. continue;
  2155.       
  2156.       /* Show OSPF interface information. */
  2157.       vty_out (vty, "  Internet Address %s/%d,",
  2158.        inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
  2159.       vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
  2160.        VTY_NEWLINE);
  2161.       vty_out (vty, "  Router ID %s, Network Type %s, Cost: %d%s",
  2162.        inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
  2163.        oi->output_cost, VTY_NEWLINE);
  2164.       vty_out (vty, "  Transmit Delay is %d sec, State %s, Priority %d%s",
  2165.        OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
  2166.        PRIORITY (oi), VTY_NEWLINE);
  2167.       /* Show DR information. */
  2168.       if (DR (oi).s_addr == 0)
  2169. vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
  2170.       else
  2171. {
  2172.   nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
  2173.   if (nbr == NULL)
  2174.     vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
  2175.   else
  2176.     {
  2177.       vty_out (vty, "  Designated Router (ID) %s,",
  2178.        inet_ntoa (nbr->router_id));
  2179.       vty_out (vty, " Interface Address %s%s",
  2180.        inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
  2181.     }
  2182. }
  2183.       /* Show BDR information. */
  2184.       if (BDR (oi).s_addr == 0)
  2185. vty_out (vty, "  No backup designated router on this network%s",
  2186.  VTY_NEWLINE);
  2187.       else
  2188. {
  2189.   nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
  2190.   if (nbr == NULL)
  2191.     vty_out (vty, "  No backup designated router on this network%s",
  2192.      VTY_NEWLINE);
  2193.   else
  2194.     {
  2195.       vty_out (vty, "  Backup Designated Router (ID) %s,",
  2196.        inet_ntoa (nbr->router_id));
  2197.       vty_out (vty, " Interface Address %s%s",
  2198.        inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
  2199.     }
  2200. }
  2201.       vty_out (vty, "  Timer intervals configured,");
  2202.       vty_out (vty, " Hello %d, Dead %d, Wait %d, Retransmit %d%s",
  2203.        OSPF_IF_PARAM (oi, v_hello), OSPF_IF_PARAM (oi, v_wait),
  2204.        OSPF_IF_PARAM (oi, v_wait),
  2205.        OSPF_IF_PARAM (oi, retransmit_interval),
  2206.        VTY_NEWLINE);
  2207.       
  2208.       if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_ACTIVE)
  2209. vty_out (vty, "    Hello due in %s%s",
  2210.  ospf_timer_dump (oi->t_hello, buf, 9), VTY_NEWLINE);
  2211.       else /* OSPF_IF_PASSIVE is set */
  2212. vty_out (vty, "    No Hellos (Passive interface)%s", VTY_NEWLINE);
  2213.       
  2214.       vty_out (vty, "  Neighbor Count is %d, Adjacent neighbor count is %d%s",
  2215.        ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
  2216.        VTY_NEWLINE);
  2217.     }
  2218. }
  2219. DEFUN (show_ip_ospf_interface,
  2220.        show_ip_ospf_interface_cmd,
  2221.        "show ip ospf interface [INTERFACE]",
  2222.        SHOW_STR
  2223.        IP_STR
  2224.        "OSPF informationn"
  2225.        "Interface informationn"
  2226.        "Interface namen")
  2227. {
  2228.   struct interface *ifp;
  2229.   struct ospf *ospf;
  2230.   listnode node;
  2231.   ospf = ospf_lookup ();
  2232.   /* Show All Interfaces. */
  2233.   if (argc == 0)
  2234.     for (node = listhead (iflist); node; nextnode (node))
  2235.       show_ip_ospf_interface_sub (vty, ospf, node->data);
  2236.   /* Interface name is specified. */
  2237.   else
  2238.     {
  2239.       if ((ifp = if_lookup_by_name (argv[0])) == NULL)
  2240.         vty_out (vty, "No such interface name%s", VTY_NEWLINE);
  2241.       else
  2242.         show_ip_ospf_interface_sub (vty, ospf, ifp);
  2243.     }
  2244.   return CMD_SUCCESS;
  2245. }
  2246. void
  2247. show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
  2248. {
  2249.   struct route_node *rn;
  2250.   struct ospf_neighbor *nbr;
  2251.   char msgbuf[16];
  2252.   char timebuf[9];
  2253.   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  2254.     if ((nbr = rn->info))
  2255.       /* Do not show myself. */
  2256.       if (nbr != oi->nbr_self)
  2257. /* Down state is not shown. */
  2258. if (nbr->state != NSM_Down)
  2259.   {
  2260.     ospf_nbr_state_message (nbr, msgbuf, 16);
  2261.     if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
  2262.       vty_out (vty, "%-15s %3d   %-15s %8s    ",
  2263.        "-", nbr->priority,
  2264.        msgbuf, ospf_timer_dump (nbr->t_inactivity, timebuf, 9));
  2265.     else
  2266.       vty_out (vty, "%-15s %3d   %-15s %8s    ",
  2267.        inet_ntoa (nbr->router_id), nbr->priority,
  2268.        msgbuf, ospf_timer_dump (nbr->t_inactivity, timebuf, 9));
  2269.     vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
  2270.     vty_out (vty, "%-15s %5ld %5ld %5d%s",
  2271.      IF_NAME (oi), ospf_ls_retransmit_count (nbr),
  2272.      ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
  2273.      VTY_NEWLINE);
  2274.   }
  2275. }
  2276. DEFUN (show_ip_ospf_neighbor,
  2277.        show_ip_ospf_neighbor_cmd,
  2278.        "show ip ospf neighbor",
  2279.        SHOW_STR
  2280.        IP_STR
  2281.        "OSPF informationn"
  2282.        "Neighbor listn")
  2283. {
  2284.   struct ospf *ospf;
  2285.   listnode node;
  2286.   ospf = ospf_lookup ();
  2287.   if (ospf == NULL)
  2288.     {
  2289.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2290.       return CMD_SUCCESS;
  2291.     }
  2292.   /* Show All neighbors. */
  2293.   vty_out (vty, "%sNeighbor ID     Pri   State           Dead "
  2294.            "Time   Address         Interface           RXmtL "
  2295.            "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE);
  2296.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  2297.     show_ip_ospf_neighbor_sub (vty, getdata (node));
  2298.   return CMD_SUCCESS;
  2299. }
  2300. DEFUN (show_ip_ospf_neighbor_all,
  2301.        show_ip_ospf_neighbor_all_cmd,
  2302.        "show ip ospf neighbor all",
  2303.        SHOW_STR
  2304.        IP_STR
  2305.        "OSPF informationn"
  2306.        "Neighbor listn"
  2307.        "include down status neighborn")
  2308. {
  2309.   struct ospf *ospf = vty->index;
  2310.   listnode node;
  2311.   if (ospf == NULL)
  2312.     {
  2313.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2314.       return CMD_SUCCESS;
  2315.     }
  2316.   /* Show All neighbors. */
  2317.   vty_out (vty, "%sNeighbor ID     Pri   State           Dead "
  2318.            "Time   Address         Interface           RXmtL "
  2319.            "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE);
  2320.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  2321.     {
  2322.       struct ospf_interface *oi = getdata (node);
  2323.       listnode nbr_node;
  2324.       show_ip_ospf_neighbor_sub (vty, oi);
  2325.       /* print Down neighbor status */
  2326.       for (nbr_node = listhead (oi->nbr_nbma); nbr_node; nextnode (nbr_node))
  2327. {
  2328.   struct ospf_nbr_nbma *nbr_nbma;
  2329.   nbr_nbma = getdata (nbr_node);
  2330.   if (nbr_nbma->nbr == NULL
  2331.       || nbr_nbma->nbr->state == NSM_Down)
  2332.     {
  2333.       vty_out (vty, "%-15s %3d   %-15s %8s    ",
  2334.        "-", nbr_nbma->priority, "Down", "-");
  2335.       vty_out (vty, "%-15s %-15s %5d %5d %5d%s", 
  2336.        inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
  2337.        0, 0, 0, VTY_NEWLINE);
  2338.     }
  2339. }
  2340.     }
  2341.   return CMD_SUCCESS;
  2342. }
  2343. DEFUN (show_ip_ospf_neighbor_int,
  2344.        show_ip_ospf_neighbor_int_cmd,
  2345.        "show ip ospf neighbor A.B.C.D",
  2346.        SHOW_STR
  2347.        IP_STR
  2348.        "OSPF informationn"
  2349.        "Neighbor listn"
  2350.        "Interface namen")
  2351. {
  2352.   struct ospf *ospf;
  2353.   struct ospf_interface *oi;
  2354.   struct in_addr addr;
  2355.   int ret;
  2356.   
  2357.   ret = inet_aton (argv[0], &addr);
  2358.   if (!ret)
  2359.     {
  2360.       vty_out (vty, "Please specify interface address by A.B.C.D%s",
  2361.        VTY_NEWLINE);
  2362.       return CMD_WARNING;
  2363.     }
  2364.   ospf = ospf_lookup ();
  2365.   if (ospf == NULL)
  2366.     {
  2367.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2368.       return CMD_SUCCESS;
  2369.     }
  2370.   if ((oi = ospf_if_is_configured (ospf, &addr)) == NULL)
  2371.     vty_out (vty, "No such interface address%s", VTY_NEWLINE);
  2372.   else
  2373.     {
  2374.       vty_out (vty, "%sNeighbor ID     Pri   State           Dead "
  2375.                "Time   Address         Interface           RXmtL "
  2376.                "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE);
  2377.       show_ip_ospf_neighbor_sub (vty, oi);
  2378.     }
  2379.   return CMD_SUCCESS;
  2380. }
  2381. void
  2382. show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
  2383.   struct ospf_nbr_nbma *nbr_nbma)
  2384. {
  2385.   char timebuf[9];
  2386.   /* Show neighbor ID. */
  2387.   vty_out (vty, " Neighbor %s,", "-");
  2388.   /* Show interface address. */
  2389.   vty_out (vty, " interface address %s%s",
  2390.    inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
  2391.   /* Show Area ID. */
  2392.   vty_out (vty, "    In the area %s via interface %s%s",
  2393.    ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
  2394.   /* Show neighbor priority and state. */
  2395.   vty_out (vty, "    Neighbor priority is %d, State is %s,",
  2396.    nbr_nbma->priority, "Down");
  2397.   /* Show state changes. */
  2398.   vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
  2399.   /* Show PollInterval */
  2400.   vty_out (vty, "    Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
  2401.   /* Show poll-interval timer. */
  2402.   vty_out (vty, "    Poll timer due in %s%s",
  2403.    ospf_timer_dump (nbr_nbma->t_poll, timebuf, 9), VTY_NEWLINE);
  2404.   /* Show poll-interval timer thread. */
  2405.   vty_out (vty, "    Thread Poll Timer %s%s", 
  2406.    nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
  2407. }
  2408. void
  2409. show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
  2410.   struct ospf_neighbor *nbr)
  2411. {
  2412.   char timebuf[9];
  2413.   /* Show neighbor ID. */
  2414.   if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
  2415.     vty_out (vty, " Neighbor %s,", "-");
  2416.   else
  2417.     vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
  2418.   /* Show interface address. */
  2419.   vty_out (vty, " interface address %s%s",
  2420.    inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
  2421.   /* Show Area ID. */
  2422.   vty_out (vty, "    In the area %s via interface %s%s",
  2423.    ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
  2424.   /* Show neighbor priority and state. */
  2425.   vty_out (vty, "    Neighbor priority is %d, State is %s,",
  2426.    nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
  2427.   /* Show state changes. */
  2428.   vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
  2429.   /* Show Designated Rotuer ID. */
  2430.   vty_out (vty, "    DR is %s,", inet_ntoa (nbr->d_router));
  2431.   /* Show Backup Designated Rotuer ID. */
  2432.   vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
  2433.   /* Show options. */
  2434.   vty_out (vty, "    Options %d %s%s", nbr->options,
  2435.    ospf_options_dump (nbr->options), VTY_NEWLINE);
  2436.   /* Show Router Dead interval timer. */
  2437.   vty_out (vty, "    Dead timer due in %s%s",
  2438.    ospf_timer_dump (nbr->t_inactivity, timebuf, 9), VTY_NEWLINE);
  2439.   /* Show Database Summary list. */
  2440.   vty_out (vty, "    Database Summary List %d%s",
  2441.    ospf_db_summary_count (nbr), VTY_NEWLINE);
  2442.   /* Show Link State Request list. */
  2443.   vty_out (vty, "    Link State Request List %ld%s",
  2444.    ospf_ls_request_count (nbr), VTY_NEWLINE);
  2445.   /* Show Link State Retransmission list. */
  2446.   vty_out (vty, "    Link State Retransmission List %ld%s",
  2447.    ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
  2448.   /* Show inactivity timer thread. */
  2449.   vty_out (vty, "    Thread Inactivity Timer %s%s", 
  2450.    nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
  2451.   /* Show Database Description retransmission thread. */
  2452.   vty_out (vty, "    Thread Database Description Retransmision %s%s",
  2453.    nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
  2454.   /* Show Link State Request Retransmission thread. */
  2455.   vty_out (vty, "    Thread Link State Request Retransmission %s%s",
  2456.    nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
  2457.   /* Show Link State Update Retransmission thread. */
  2458.   vty_out (vty, "    Thread Link State Update Retransmission %s%s%s",
  2459.    nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
  2460. }
  2461. DEFUN (show_ip_ospf_neighbor_id,
  2462.        show_ip_ospf_neighbor_id_cmd,
  2463.        "show ip ospf neighbor A.B.C.D",
  2464.        SHOW_STR
  2465.        IP_STR
  2466.        "OSPF informationn"
  2467.        "Neighbor listn"
  2468.        "Neighbor IDn")
  2469. {
  2470.   struct ospf *ospf;
  2471.   listnode node;
  2472.   struct ospf_neighbor *nbr;
  2473.   struct in_addr router_id;
  2474.   int ret;
  2475.   ret = inet_aton (argv[0], &router_id);
  2476.   if (!ret)
  2477.     {
  2478.       vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
  2479.       return CMD_WARNING;
  2480.     }
  2481.   ospf = ospf_lookup ();
  2482.   if (ospf == NULL)
  2483.     {
  2484.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2485.       return CMD_SUCCESS;
  2486.     }
  2487.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  2488.     {
  2489.       struct ospf_interface *oi = getdata (node);
  2490.       if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
  2491. {
  2492.   show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
  2493.   return CMD_SUCCESS;
  2494. }
  2495.     }
  2496.   /* Nothing to show. */
  2497.   return CMD_SUCCESS;
  2498. }
  2499. DEFUN (show_ip_ospf_neighbor_detail,
  2500.        show_ip_ospf_neighbor_detail_cmd,
  2501.        "show ip ospf neighbor detail",
  2502.        SHOW_STR
  2503.        IP_STR
  2504.        "OSPF informationn"
  2505.        "Neighbor listn"
  2506.        "detail of all neighborsn")
  2507. {
  2508.   struct ospf *ospf;
  2509.   listnode node;
  2510.   ospf = ospf_lookup ();
  2511.   if (ospf == NULL)
  2512.     {
  2513.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2514.       return CMD_SUCCESS;
  2515.     }
  2516.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  2517.     {
  2518.       struct ospf_interface *oi = getdata (node);
  2519.       struct route_node *rn;
  2520.       struct ospf_neighbor *nbr;
  2521.       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  2522. if ((nbr = rn->info))
  2523.   if (nbr != oi->nbr_self)
  2524.     if (nbr->state != NSM_Down)
  2525.       show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
  2526.     }
  2527.   return CMD_SUCCESS;
  2528. }
  2529. DEFUN (show_ip_ospf_neighbor_detail_all,
  2530.        show_ip_ospf_neighbor_detail_all_cmd,
  2531.        "show ip ospf neighbor detail all",
  2532.        SHOW_STR
  2533.        IP_STR
  2534.        "OSPF informationn"
  2535.        "Neighbor listn"
  2536.        "detail of all neighborsn"
  2537.        "include down status neighborn")
  2538. {
  2539.   struct ospf *ospf;
  2540.   listnode node;
  2541.   ospf = ospf_lookup ();
  2542.   if (ospf == NULL)
  2543.     {
  2544.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2545.       return CMD_SUCCESS;
  2546.     }
  2547.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  2548.     {
  2549.       struct ospf_interface *oi = getdata (node);
  2550.       struct route_node *rn;
  2551.       struct ospf_neighbor *nbr;
  2552.       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  2553. if ((nbr = rn->info))
  2554.   if (nbr != oi->nbr_self)
  2555.     if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
  2556.       show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
  2557.       if (oi->type == OSPF_IFTYPE_NBMA)
  2558. {
  2559.   listnode nd;
  2560.   for (nd = listhead (oi->nbr_nbma); nd; nextnode (nd))
  2561.     {
  2562.       struct ospf_nbr_nbma *nbr_nbma = getdata (nd);
  2563.       if (nbr_nbma->nbr == NULL
  2564.   || nbr_nbma->nbr->state == NSM_Down)
  2565. show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
  2566.     }
  2567. }
  2568.     }
  2569.   return CMD_SUCCESS;
  2570. }
  2571. DEFUN (show_ip_ospf_neighbor_int_detail,
  2572.        show_ip_ospf_neighbor_int_detail_cmd,
  2573.        "show ip ospf neighbor A.B.C.D detail",
  2574.        SHOW_STR
  2575.        IP_STR
  2576.        "OSPF informationn"
  2577.        "Neighbor listn"
  2578.        "Interface addressn"
  2579.        "detail of all neighbors")
  2580. {
  2581.   struct ospf *ospf;
  2582.   struct ospf_interface *oi;
  2583.   struct in_addr addr;
  2584.   int ret;
  2585.   
  2586.   ret = inet_aton (argv[0], &addr);
  2587.   if (!ret)
  2588.     {
  2589.       vty_out (vty, "Please specify interface address by A.B.C.D%s",
  2590.        VTY_NEWLINE);
  2591.       return CMD_WARNING;
  2592.     }
  2593.   ospf = ospf_lookup ();
  2594.   if (ospf == NULL)
  2595.     {
  2596.       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
  2597.       return CMD_SUCCESS;
  2598.     }
  2599.   if ((oi = ospf_if_is_configured (ospf, &addr)) == NULL)
  2600.     vty_out (vty, "No such interface address%s", VTY_NEWLINE);
  2601.   else
  2602.     {
  2603.       struct route_node *rn;
  2604.       struct ospf_neighbor *nbr;
  2605.       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  2606. if ((nbr = rn->info))
  2607.   if (nbr != oi->nbr_self)
  2608.     if (nbr->state != NSM_Down)
  2609.       show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
  2610.     }
  2611.   return CMD_SUCCESS;
  2612. }
  2613. /* Show functions */
  2614. int
  2615. show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
  2616. {
  2617.   struct router_lsa *rl;
  2618.   struct summary_lsa *sl;
  2619.   struct as_external_lsa *asel;
  2620.   struct prefix_ipv4 p;
  2621.   if (lsa != NULL)
  2622.     /* If self option is set, check LSA self flag. */
  2623.     if (self == 0 || IS_LSA_SELF (lsa))
  2624.       {
  2625. /* LSA common part show. */
  2626. vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
  2627. vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
  2628.  inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
  2629.  (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
  2630. /* LSA specific part show. */
  2631. switch (lsa->data->type)
  2632.   {
  2633.   case OSPF_ROUTER_LSA:
  2634.     rl = (struct router_lsa *) lsa->data;
  2635.     vty_out (vty, " %-d", ntohs (rl->links));
  2636.     break;
  2637.   case OSPF_SUMMARY_LSA:
  2638.     sl = (struct summary_lsa *) lsa->data;
  2639.     p.family = AF_INET;
  2640.     p.prefix = sl->header.id;
  2641.     p.prefixlen = ip_masklen (sl->mask);
  2642.     apply_mask_ipv4 (&p);
  2643.     vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
  2644.     break;
  2645.   case OSPF_AS_EXTERNAL_LSA:
  2646. #ifdef HAVE_NSSA
  2647.   case OSPF_AS_NSSA_LSA:
  2648. #endif /* HAVE_NSSA */
  2649.     asel = (struct as_external_lsa *) lsa->data;
  2650.     p.family = AF_INET;
  2651.     p.prefix = asel->header.id;
  2652.     p.prefixlen = ip_masklen (asel->mask);
  2653.     apply_mask_ipv4 (&p);
  2654.     vty_out (vty, " %s %s/%d [0x%lx]",
  2655.      IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
  2656.      inet_ntoa (p.prefix), p.prefixlen,
  2657.      (u_long)ntohl (asel->e[0].route_tag));
  2658.     break;
  2659.   case OSPF_NETWORK_LSA:
  2660.   case OSPF_ASBR_SUMMARY_LSA:
  2661. #ifdef HAVE_OPAQUE_LSA
  2662.   case OSPF_OPAQUE_LINK_LSA:
  2663.   case OSPF_OPAQUE_AREA_LSA:
  2664.   case OSPF_OPAQUE_AS_LSA:
  2665. #endif /* HAVE_OPAQUE_LSA */
  2666.   default:
  2667.     break;
  2668.   }
  2669. vty_out (vty, VTY_NEWLINE);
  2670.       }
  2671.   return 0;
  2672. }
  2673. char *show_database_desc[] =
  2674.   {
  2675.     "unknown",
  2676.     "Router Link States",
  2677.     "Net Link States",
  2678.     "Summary Link States",
  2679.     "ASBR-Summary Link States",
  2680.     "AS External Link States",
  2681. #if defined  (HAVE_NSSA) || defined (HAVE_OPAQUE_LSA)
  2682.     "Group Membership LSA",
  2683.     "NSSA-external Link States",
  2684. #endif /* HAVE_NSSA */
  2685. #ifdef HAVE_OPAQUE_LSA
  2686.     "Type-8 LSA",
  2687.     "Link-Local Opaque-LSA",
  2688.     "Area-Local Opaque-LSA",
  2689.     "AS-external Opaque-LSA",
  2690. #endif /* HAVE_OPAQUE_LSA */
  2691.   };
  2692. #define SHOW_OSPF_COMMON_HEADER 
  2693.   "Link ID         ADV Router      Age  Seq#       CkSum"
  2694. char *show_database_header[] =
  2695.   {
  2696.     "",
  2697.     "Link ID         ADV Router      Age  Seq#       CkSum  Link count",
  2698.     "Link ID         ADV Router      Age  Seq#       CkSum",
  2699.     "Link ID         ADV Router      Age  Seq#       CkSum  Route",
  2700.     "Link ID         ADV Router      Age  Seq#       CkSum",
  2701.     "Link ID         ADV Router      Age  Seq#       CkSum  Route",
  2702. #ifdef HAVE_NSSA
  2703.     " --- header for Group Member ----",
  2704.     "Link ID         ADV Router      Age  Seq#       CkSum  Route",
  2705. #endif /* HAVE_NSSA */
  2706. #ifdef HAVE_OPAQUE_LSA
  2707. #ifndef HAVE_NSSA
  2708.     " --- type-6 ---",
  2709.     " --- type-7 ---",
  2710. #endif /* HAVE_NSSA */
  2711.     " --- type-8 ---",
  2712.     "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
  2713.     "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
  2714.     "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
  2715. #endif /* HAVE_OPAQUE_LSA */
  2716.   };
  2717. void
  2718. show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
  2719. {
  2720.   struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
  2721.   vty_out (vty, "  LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
  2722.   vty_out (vty, "  Options: %d%s", lsa->data->options, VTY_NEWLINE);
  2723.   if (lsa->data->type == OSPF_ROUTER_LSA)
  2724.     {
  2725.       vty_out (vty, "  Flags: 0x%x" , rlsa->flags);
  2726.       if (rlsa->flags)
  2727. vty_out (vty, " :%s%s%s%s",
  2728.  IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
  2729.  IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
  2730.  IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
  2731.  IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
  2732.       vty_out (vty, "%s", VTY_NEWLINE);
  2733.     }
  2734.   vty_out (vty, "  LS Type: %s%s",
  2735.            LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
  2736.   vty_out (vty, "  Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
  2737.            LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
  2738.   vty_out (vty, "  Advertising Router: %s%s",
  2739.            inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
  2740.   vty_out (vty, "  LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
  2741.            VTY_NEWLINE);
  2742.   vty_out (vty, "  Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
  2743.            VTY_NEWLINE);
  2744.   vty_out (vty, "  Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
  2745. }
  2746. char *link_type_desc[] =
  2747.   {
  2748.     "(null)",
  2749.     "another Router (point-to-point)",
  2750.     "a Transit Network",
  2751.     "Stub Network",
  2752.     "a Virtual Link",
  2753.   };
  2754. char *link_id_desc[] =
  2755.   {
  2756.     "(null)",
  2757.     "Neighboring Router ID",
  2758.     "Designated Router address",
  2759.     "Net",
  2760.     "Neighboring Router ID",
  2761.   };
  2762. char *link_data_desc[] =
  2763.   {
  2764.     "(null)",
  2765.     "Router Interface address",
  2766.     "Router Interface address",
  2767.     "Network Mask",
  2768.     "Router Interface address",
  2769.   };
  2770. /* Show router-LSA each Link information. */
  2771. void
  2772. show_ip_ospf_database_router_links (struct vty *vty,
  2773.                                     struct router_lsa *rl)
  2774. {
  2775.   int len, i, type;
  2776.   len = ntohs (rl->header.length) - 4;
  2777.   for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
  2778.     {
  2779.       type = rl->link[i].type;
  2780.       vty_out (vty, "    Link connected to: %s%s",
  2781.        link_type_desc[type], VTY_NEWLINE);
  2782.       vty_out (vty, "     (Link ID) %s: %s%s", link_id_desc[type],
  2783.        inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
  2784.       vty_out (vty, "     (Link Data) %s: %s%s", link_data_desc[type],
  2785.        inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
  2786.       vty_out (vty, "      Number of TOS metrics: 0%s", VTY_NEWLINE);
  2787.       vty_out (vty, "       TOS 0 Metric: %d%s",
  2788.        ntohs (rl->link[i].metric), VTY_NEWLINE);
  2789.       vty_out (vty, "%s", VTY_NEWLINE);
  2790.     }
  2791. }
  2792. /* Show router-LSA detail information. */
  2793. int
  2794. show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2795. {
  2796.   if (lsa != NULL)
  2797.     {
  2798.       struct router_lsa *rl = (struct router_lsa *) lsa->data;
  2799.       show_ip_ospf_database_header (vty, lsa);
  2800.           
  2801.       vty_out (vty, "   Number of Links: %d%s%s", ntohs (rl->links),
  2802.        VTY_NEWLINE, VTY_NEWLINE);
  2803.       show_ip_ospf_database_router_links (vty, rl);
  2804.     }
  2805.   return 0;
  2806. }
  2807. /* Show network-LSA detail information. */
  2808. int
  2809. show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2810. {
  2811.   int length, i;
  2812.   if (lsa != NULL)
  2813.     {
  2814.       struct network_lsa *nl = (struct network_lsa *) lsa->data;
  2815.       show_ip_ospf_database_header (vty, lsa);
  2816.       vty_out (vty, "  Network Mask: /%d%s",
  2817.        ip_masklen (nl->mask), VTY_NEWLINE);
  2818.       length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
  2819.       for (i = 0; length > 0; i++, length -= 4)
  2820. vty_out (vty, "        Attached Router: %s%s",
  2821.  inet_ntoa (nl->routers[i]), VTY_NEWLINE);
  2822.       vty_out (vty, "%s", VTY_NEWLINE);
  2823.     }
  2824.   return 0;
  2825. }
  2826. /* Show summary-LSA detail information. */
  2827. int
  2828. show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2829. {
  2830.   if (lsa != NULL)
  2831.     {
  2832.       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
  2833.       show_ip_ospf_database_header (vty, lsa);
  2834.       vty_out (vty, "  Network Mask: /%d%s", ip_masklen (sl->mask),
  2835.        VTY_NEWLINE);
  2836.       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
  2837.        VTY_NEWLINE);
  2838.     }
  2839.   return 0;
  2840. }
  2841. /* Show summary-ASBR-LSA detail information. */
  2842. int
  2843. show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2844. {
  2845.   if (lsa != NULL)
  2846.     {
  2847.       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
  2848.       show_ip_ospf_database_header (vty, lsa);
  2849.       vty_out (vty, "  Network Mask: /%d%s",
  2850.        ip_masklen (sl->mask), VTY_NEWLINE);
  2851.       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
  2852.        VTY_NEWLINE);
  2853.     }
  2854.   return 0;
  2855. }
  2856. /* Show AS-external-LSA detail information. */
  2857. int
  2858. show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2859. {
  2860.   if (lsa != NULL)
  2861.     {
  2862.       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
  2863.       show_ip_ospf_database_header (vty, lsa);
  2864.       vty_out (vty, "  Network Mask: /%d%s",
  2865.        ip_masklen (al->mask), VTY_NEWLINE);
  2866.       vty_out (vty, "        Metric Type: %s%s",
  2867.        IS_EXTERNAL_METRIC (al->e[0].tos) ?
  2868.        "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
  2869.       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
  2870.       vty_out (vty, "        Metric: %d%s",
  2871.        GET_METRIC (al->e[0].metric), VTY_NEWLINE);
  2872.       vty_out (vty, "        Forward Address: %s%s",
  2873.        inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
  2874.       vty_out (vty, "        External Route Tag: %lu%s%s",
  2875.        (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
  2876.     }
  2877.   return 0;
  2878. }
  2879. #ifdef HAVE_NSSA
  2880. int
  2881. show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
  2882. {
  2883.   struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
  2884.   /* show_ip_ospf_database_header (vty, lsa); */
  2885.   zlog_info( "  Network Mask: /%d%s",
  2886.      ip_masklen (al->mask), "n");
  2887.   zlog_info( "        Metric Type: %s%s",
  2888.      IS_EXTERNAL_METRIC (al->e[0].tos) ?
  2889.      "2 (Larger than any link state path)" : "1", "n");
  2890.   zlog_info( "        TOS: 0%s", "n");
  2891.   zlog_info( "        Metric: %d%s",
  2892.      GET_METRIC (al->e[0].metric), "n");
  2893.   zlog_info( "        Forward Address: %s%s",
  2894.      inet_ntoa (al->e[0].fwd_addr), "n");
  2895.   zlog_info( "        External Route Tag: %u%s%s",
  2896.      ntohl (al->e[0].route_tag), "n", "n");
  2897.   return 0;
  2898. }
  2899. /* Show AS-NSSA-LSA detail information. */
  2900. int
  2901. show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2902. {
  2903.   if (lsa != NULL)
  2904.     {
  2905.       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
  2906.       show_ip_ospf_database_header (vty, lsa);
  2907.       vty_out (vty, "  Network Mask: /%d%s",
  2908.        ip_masklen (al->mask), VTY_NEWLINE);
  2909.       vty_out (vty, "        Metric Type: %s%s",
  2910.        IS_EXTERNAL_METRIC (al->e[0].tos) ?
  2911.        "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
  2912.       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
  2913.       vty_out (vty, "        Metric: %d%s",
  2914.        GET_METRIC (al->e[0].metric), VTY_NEWLINE);
  2915.       vty_out (vty, "        NSSA: Forward Address: %s%s",
  2916.        inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
  2917.       vty_out (vty, "        External Route Tag: %u%s%s",
  2918.        ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
  2919.     }
  2920.   return 0;
  2921. }
  2922. #endif /* HAVE_NSSA */
  2923. int
  2924. show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
  2925. {
  2926.   return 0;
  2927. }
  2928. #ifdef HAVE_OPAQUE_LSA
  2929. int
  2930. show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
  2931. {
  2932.   if (lsa != NULL)
  2933.     {
  2934.       show_ip_ospf_database_header (vty, lsa);
  2935.       show_opaque_info_detail (vty, lsa);
  2936.       vty_out (vty, "%s", VTY_NEWLINE);
  2937.     }
  2938.   return 0;
  2939. }
  2940. #endif /* HAVE_OPAQUE_LSA */
  2941. int (*show_function[])(struct vty *, struct ospf_lsa *) =
  2942. {
  2943.   NULL,
  2944.   show_router_lsa_detail,
  2945.   show_network_lsa_detail,
  2946.   show_summary_lsa_detail,
  2947.   show_summary_asbr_lsa_detail,
  2948.   show_as_external_lsa_detail,
  2949. #ifdef HAVE_NSSA
  2950.   show_func_dummy,
  2951.   show_as_nssa_lsa_detail,  /* almost same as external */
  2952. #endif /* HAVE_NSSA */
  2953. #ifdef HAVE_OPAQUE_LSA
  2954. #ifndef HAVE_NSSA
  2955.   show_func_dummy,
  2956.   show_func_dummy,
  2957. #endif /* HAVE_NSSA */
  2958.   NULL, /* type-8 */
  2959.   show_opaque_lsa_detail,
  2960.   show_opaque_lsa_detail,
  2961.   show_opaque_lsa_detail,
  2962. #endif /* HAVE_OPAQUE_LSA */
  2963. };
  2964. void
  2965. show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
  2966.      struct in_addr *adv_router)
  2967. {
  2968.   memset (lp, 0, sizeof (struct prefix_ls));
  2969.   lp->family = 0;
  2970.   if (id == NULL)
  2971.     lp->prefixlen = 0;
  2972.   else if (adv_router == NULL)
  2973.     {
  2974.       lp->prefixlen = 32;
  2975.       lp->id = *id;
  2976.     }
  2977.   else
  2978.     {
  2979.       lp->prefixlen = 64;
  2980.       lp->id = *id;
  2981.       lp->adv_router = *adv_router;
  2982.     }
  2983. }
  2984. void
  2985. show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
  2986.       struct in_addr *id, struct in_addr *adv_router)
  2987. {
  2988.   struct prefix_ls lp;
  2989.   struct route_node *rn, *start;
  2990.   struct ospf_lsa *lsa;
  2991.   show_lsa_prefix_set (vty, &lp, id, adv_router);
  2992.   start = route_node_get (rt, (struct prefix *) &lp);
  2993.   if (start)
  2994.     {
  2995.       route_lock_node (start);
  2996.       for (rn = start; rn; rn = route_next_until (rn, start))
  2997. if ((lsa = rn->info))
  2998.   {
  2999. #ifdef HAVE_NSSA
  3000.     /* Stay away from any Local Translated Type-7 LSAs */
  3001.     if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
  3002.       continue;
  3003. #endif /* HAVE_NSSA */
  3004.     if (show_function[lsa->data->type] != NULL)
  3005.       show_function[lsa->data->type] (vty, lsa);
  3006.   }
  3007.       route_unlock_node (start);
  3008.     }
  3009. }
  3010. /* Show detail LSA information
  3011.    -- if id is NULL then show all LSAs. */
  3012. void
  3013. show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
  3014.  struct in_addr *id, struct in_addr *adv_router)
  3015. {
  3016.   listnode node;
  3017.   switch (type)
  3018.     {
  3019.     case OSPF_AS_EXTERNAL_LSA:
  3020. #ifdef HAVE_OPAQUE_LSA
  3021.     case OSPF_OPAQUE_AS_LSA:
  3022. #endif /* HAVE_OPAQUE_LSA */
  3023.       vty_out (vty, "                %s %s%s",
  3024.                show_database_desc[type],
  3025.                VTY_NEWLINE, VTY_NEWLINE);
  3026.       show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
  3027.       break;
  3028.     default:
  3029.       for (node = listhead (ospf->areas); node; nextnode (node))
  3030.         {
  3031.           struct ospf_area *area = node->data;
  3032.           vty_out (vty, "%s                %s (Area %s)%s%s",
  3033.                    VTY_NEWLINE, show_database_desc[type],
  3034.                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
  3035.           show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
  3036.         }
  3037.       break;
  3038.     }
  3039. }
  3040. void
  3041. show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
  3042.  struct in_addr *adv_router)
  3043. {
  3044.   struct route_node *rn;
  3045.   struct ospf_lsa *lsa;
  3046.   for (rn = route_top (rt); rn; rn = route_next (rn))
  3047.     if ((lsa = rn->info))
  3048.       if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
  3049. {
  3050. #ifdef HAVE_NSSA
  3051.   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
  3052.     continue;
  3053. #endif /* HAVE_NSSA */
  3054.   if (show_function[lsa->data->type] != NULL)
  3055.     show_function[lsa->data->type] (vty, lsa);
  3056. }
  3057. }
  3058. /* Show detail LSA information. */
  3059. void
  3060. show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
  3061.     struct in_addr *adv_router)
  3062. {
  3063.   listnode node;
  3064.   switch (type)
  3065.     {
  3066.     case OSPF_AS_EXTERNAL_LSA:
  3067. #ifdef HAVE_OPAQUE_LSA
  3068.     case OSPF_OPAQUE_AS_LSA:
  3069. #endif /* HAVE_OPAQUE_LSA */
  3070.       vty_out (vty, "                %s %s%s",
  3071.                show_database_desc[type],
  3072.                VTY_NEWLINE, VTY_NEWLINE);
  3073.       show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
  3074.                                        adv_router);
  3075.       break;
  3076.     default:
  3077.       for (node = listhead (ospf->areas); node; nextnode (node))
  3078.         {
  3079.           struct ospf_area *area = node->data;
  3080.           vty_out (vty, "%s                %s (Area %s)%s%s",
  3081.                    VTY_NEWLINE, show_database_desc[type],
  3082.                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
  3083.           show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
  3084.                                            adv_router);
  3085. }
  3086.       break;
  3087.     }
  3088. }
  3089. void
  3090. show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
  3091. {
  3092.   struct ospf_lsa *lsa;
  3093.   struct route_node *rn;
  3094.   listnode node;
  3095.   int type;
  3096.   for (node = listhead (ospf->areas); node; nextnode (node))
  3097.     {
  3098.       struct ospf_area *area = node->data;
  3099.       for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
  3100. {
  3101.   switch (type)
  3102.     {
  3103.     case OSPF_AS_EXTERNAL_LSA:
  3104. #ifdef HAVE_OPAQUE_LSA
  3105.             case OSPF_OPAQUE_AS_LSA:
  3106. #endif /* HAVE_OPAQUE_LSA */
  3107.       continue;
  3108.     default:
  3109.       break;
  3110.     }
  3111.           if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
  3112.               (!self && ospf_lsdb_count (area->lsdb, type) > 0))
  3113.             {
  3114.               vty_out (vty, "                %s (Area %s)%s%s",
  3115.                        show_database_desc[type],
  3116.        ospf_area_desc_string (area),
  3117.                        VTY_NEWLINE, VTY_NEWLINE);
  3118.               vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
  3119.       LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
  3120. show_lsa_summary (vty, lsa, self);
  3121.               vty_out (vty, "%s", VTY_NEWLINE);
  3122.     }
  3123. }
  3124.     }
  3125.   for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
  3126.     {
  3127.       switch (type)
  3128.         {
  3129. case OSPF_AS_EXTERNAL_LSA:
  3130. #ifdef HAVE_OPAQUE_LSA
  3131. case OSPF_OPAQUE_AS_LSA:
  3132. #endif /* HAVE_OPAQUE_LSA */
  3133.   break;;
  3134. default:
  3135.   continue;
  3136.         }
  3137.       if (ospf_lsdb_count_self (ospf->lsdb, type) ||
  3138.   (!self && ospf_lsdb_count (ospf->lsdb, type)))
  3139.         {
  3140.           vty_out (vty, "                %s%s%s",
  3141.    show_database_desc[type],
  3142.    VTY_NEWLINE, VTY_NEWLINE);
  3143.           vty_out (vty, "%s%s", show_database_header[type],
  3144.    VTY_NEWLINE);
  3145.   LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
  3146.     show_lsa_summary (vty, lsa, self);
  3147.           vty_out (vty, "%s", VTY_NEWLINE);
  3148.         }
  3149.     }
  3150.   vty_out (vty, "%s", VTY_NEWLINE);
  3151. }
  3152. void
  3153. show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
  3154. {
  3155.   listnode node;
  3156.   struct ospf_lsa *lsa;
  3157.   vty_out (vty, "%s                MaxAge Link States:%s%s",
  3158.            VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
  3159.   for (node = listhead (ospf->maxage_lsa); node; nextnode (node))
  3160.     if ((lsa = node->data) != NULL)
  3161.       {
  3162. vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
  3163. vty_out (vty, "Link State ID: %s%s",
  3164.  inet_ntoa (lsa->data->id), VTY_NEWLINE);
  3165. vty_out (vty, "Advertising Router: %s%s",
  3166.  inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
  3167. vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
  3168. vty_out (vty, "%s", VTY_NEWLINE);
  3169.       }
  3170. }
  3171. #ifdef HAVE_NSSA
  3172. #define OSPF_LSA_TYPE_NSSA_DESC      "NSSA external link staten"
  3173. #define OSPF_LSA_TYPE_NSSA_CMD_STR   "|nssa-external"
  3174. #else  /* HAVE_NSSA */
  3175. #define OSPF_LSA_TYPE_NSSA_DESC      ""
  3176. #define OSPF_LSA_TYPE_NSSA_CMD_STR   ""
  3177. #endif /* HAVE_NSSA */
  3178. #ifdef HAVE_OPAQUE_LSA
  3179. #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSAn"
  3180. #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSAn"
  3181. #define OSPF_LSA_TYPE_OPAQUE_AS_DESC   "Link AS Opaque-LSAn"
  3182. #define OSPF_LSA_TYPE_OPAQUE_CMD_STR   "|opaque-link|opaque-area|opaque-as"
  3183. #else /* HAVE_OPAQUE_LSA */
  3184. #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
  3185. #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
  3186. #define OSPF_LSA_TYPE_OPAQUE_AS_DESC   ""
  3187. #define OSPF_LSA_TYPE_OPAQUE_CMD_STR   ""
  3188. #endif /* HAVE_OPAQUE_LSA */
  3189. #define OSPF_LSA_TYPES_CMD_STR                                                
  3190.     "asbr-summary|external|network|router|summary"                            
  3191.     OSPF_LSA_TYPE_NSSA_CMD_STR                                                
  3192.     OSPF_LSA_TYPE_OPAQUE_CMD_STR
  3193. #define OSPF_LSA_TYPES_DESC                                                   
  3194.    "ASBR summary link statesn"                                               
  3195.    "External link statesn"                                                   
  3196.    "Network link statesn"                                                    
  3197.    "Router link statesn"                                                     
  3198.    "Network summary link statesn"                                            
  3199.    OSPF_LSA_TYPE_NSSA_DESC                                                    
  3200.    OSPF_LSA_TYPE_OPAQUE_LINK_DESC                                             
  3201.    OSPF_LSA_TYPE_OPAQUE_AREA_DESC                                             
  3202.    OSPF_LSA_TYPE_OPAQUE_AS_DESC     
  3203. DEFUN (show_ip_ospf_database,
  3204.        show_ip_ospf_database_cmd,
  3205.        "show ip ospf database",
  3206.        SHOW_STR
  3207.        IP_STR
  3208.        "OSPF informationn"
  3209.        "Database summaryn")
  3210. {
  3211.   struct ospf *ospf;
  3212.   int type, ret;
  3213.   struct in_addr id, adv_router;
  3214.   ospf = ospf_lookup ();
  3215.   if (ospf == NULL)
  3216.     return CMD_SUCCESS;
  3217.   vty_out (vty, "%s       OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
  3218.            inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
  3219.   /* Show all LSA. */
  3220.   if (argc == 0)
  3221.     {
  3222.       show_ip_ospf_database_summary (vty, ospf, 0);
  3223.       return CMD_SUCCESS;
  3224.     }
  3225.   /* Set database type to show. */
  3226.   if (strncmp (argv[0], "r", 1) == 0)
  3227.     type = OSPF_ROUTER_LSA;
  3228.   else if (strncmp (argv[0], "ne", 2) == 0)
  3229.     type = OSPF_NETWORK_LSA;
  3230. #ifdef HAVE_NSSA
  3231.   else if (strncmp (argv[0], "ns", 2) == 0)
  3232.     type = OSPF_AS_NSSA_LSA;
  3233. #endif /* HAVE_NSSA */
  3234.   else if (strncmp (argv[0], "su", 2) == 0)
  3235.     type = OSPF_SUMMARY_LSA;
  3236.   else if (strncmp (argv[0], "a", 1) == 0)
  3237.     type = OSPF_ASBR_SUMMARY_LSA;
  3238.   else if (strncmp (argv[0], "e", 1) == 0)
  3239.     type = OSPF_AS_EXTERNAL_LSA;
  3240.   else if (strncmp (argv[0], "se", 2) == 0)
  3241.     {
  3242.       show_ip_ospf_database_summary (vty, ospf, 1);
  3243.       return CMD_SUCCESS;
  3244.     }
  3245.   else if (strncmp (argv[0], "m", 1) == 0)
  3246.     {
  3247.       show_ip_ospf_database_maxage (vty, ospf);
  3248.       return CMD_SUCCESS;
  3249.     }
  3250. #ifdef HAVE_OPAQUE_LSA
  3251.   else if (strncmp (argv[0], "opaque-l", 8) == 0)
  3252.     type = OSPF_OPAQUE_LINK_LSA;
  3253.   else if (strncmp (argv[0], "opaque-ar", 9) == 0)
  3254.     type = OSPF_OPAQUE_AREA_LSA;
  3255.   else if (strncmp (argv[0], "opaque-as", 9) == 0)
  3256.     type = OSPF_OPAQUE_AS_LSA;
  3257. #endif /* HAVE_OPAQUE_LSA */
  3258.   else
  3259.     return CMD_WARNING;
  3260.   /* `show ip ospf database LSA'. */
  3261.   if (argc == 1)
  3262.     show_lsa_detail (vty, ospf, type, NULL, NULL);
  3263.   else if (argc >= 2)
  3264.     {
  3265.       ret = inet_aton (argv[1], &id);
  3266.       if (!ret)
  3267. return CMD_WARNING;
  3268.       
  3269.       /* `show ip ospf database LSA ID'. */
  3270.       if (argc == 2)
  3271. show_lsa_detail (vty, ospf, type, &id, NULL);
  3272.       /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
  3273.       else if (argc == 3)
  3274. {
  3275.   if (strncmp (argv[2], "s", 1) == 0)
  3276.     adv_router = ospf->router_id;
  3277.   else
  3278.     {
  3279.       ret = inet_aton (argv[2], &adv_router);
  3280.       if (!ret)
  3281. return CMD_WARNING;
  3282.     }
  3283.   show_lsa_detail (vty, ospf, type, &id, &adv_router);
  3284. }
  3285.     }
  3286.   return CMD_SUCCESS;
  3287. }
  3288. ALIAS (show_ip_ospf_database,
  3289.        show_ip_ospf_database_type_cmd,
  3290.        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
  3291.        SHOW_STR
  3292.        IP_STR
  3293.        "OSPF informationn"
  3294.        "Database summaryn"
  3295.        OSPF_LSA_TYPES_DESC
  3296.        "LSAs in MaxAge listn"
  3297.        "Self-originated link statesn");
  3298. ALIAS (show_ip_ospf_database,
  3299.        show_ip_ospf_database_type_id_cmd,
  3300.        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
  3301.        SHOW_STR
  3302.        IP_STR
  3303.        "OSPF informationn"
  3304.        "Database summaryn"
  3305.        OSPF_LSA_TYPES_DESC
  3306.        "Link State ID (as an IP address)n");
  3307. ALIAS (show_ip_ospf_database,
  3308.        show_ip_ospf_database_type_id_adv_router_cmd,
  3309.        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",