Merge tag 'upstream/1.2.4'
[quagga-debian.git] / ospfd / ospf_vty.c
1 /* OSPF VTY interface.
2  * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
3  * Copyright (C) 2000 Toshiaki Takada
4  *
5  * This file is part of GNU Zebra.
6  *
7  * GNU Zebra is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * later version.
11  *
12  * GNU Zebra is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
19  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20  * 02111-1307, USA.  
21  */
22
23 #include <zebra.h>
24
25 #include "memory.h"
26 #include "thread.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "vty.h"
30 #include "command.h"
31 #include "plist.h"
32 #include "log.h"
33 #include "zclient.h"
34
35 #include "ospfd/ospfd.h"
36 #include "ospfd/ospf_asbr.h"
37 #include "ospfd/ospf_lsa.h"
38 #include "ospfd/ospf_lsdb.h"
39 #include "ospfd/ospf_ism.h"
40 #include "ospfd/ospf_interface.h"
41 #include "ospfd/ospf_nsm.h"
42 #include "ospfd/ospf_neighbor.h"
43 #include "ospfd/ospf_flood.h"
44 #include "ospfd/ospf_abr.h"
45 #include "ospfd/ospf_spf.h"
46 #include "ospfd/ospf_route.h"
47 #include "ospfd/ospf_zebra.h"
48 /*#include "ospfd/ospf_routemap.h" */
49 #include "ospfd/ospf_vty.h"
50 #include "ospfd/ospf_dump.h"
51
52
53 static const char *ospf_network_type_str[] =
54 {
55   "Null",
56   "POINTOPOINT",
57   "BROADCAST",
58   "NBMA",
59   "POINTOMULTIPOINT",
60   "VIRTUALLINK",
61   "LOOPBACK"
62 };
63
64
65 /* Utility functions. */
66 int
67 ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
68 {
69   char *endptr = NULL;
70   unsigned long ret;
71
72   /* match "A.B.C.D". */
73   if (strchr (str, '.') != NULL)
74     {
75       ret = inet_aton (str, area_id);
76       if (!ret)
77         return -1;
78       *format = OSPF_AREA_ID_FORMAT_ADDRESS;
79     }
80   /* match "<0-4294967295>". */
81   else
82     {
83       if (*str == '-')
84         return -1;
85       errno = 0;
86       ret = strtoul (str, &endptr, 10);
87       if (*endptr != '\0' || errno || ret > UINT32_MAX)
88         return -1;
89
90       area_id->s_addr = htonl (ret);
91       *format = OSPF_AREA_ID_FORMAT_DECIMAL;
92     }
93
94   return 0;
95 }
96
97
98 static int
99 str2metric (const char *str, int *metric)
100 {
101   /* Sanity check. */
102   if (str == NULL)
103     return 0;
104
105   *metric = strtol (str, NULL, 10);
106   if (*metric < 0 && *metric > 16777214)
107     {
108       /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
109       return 0;
110     }
111
112   return 1;
113 }
114
115 static int
116 str2metric_type (const char *str, int *metric_type)
117 {
118   /* Sanity check. */
119   if (str == NULL)
120     return 0;
121
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
129   return 1;
130 }
131
132 int
133 ospf_oi_count (struct interface *ifp)
134 {
135   struct route_node *rn;
136   int i = 0;
137
138   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
139     if (rn->info)
140       i++;
141
142   return i;
143 }
144
145
146 DEFUN (router_ospf,
147        router_ospf_cmd,
148        "router ospf",
149        "Enable a routing process\n"
150        "Start OSPF configuration\n")
151 {
152   vty->node = OSPF_NODE;
153   vty->index = ospf_get ();
154  
155   return CMD_SUCCESS;
156 }
157
158 DEFUN (no_router_ospf,
159        no_router_ospf_cmd,
160        "no router ospf",
161        NO_STR
162        "Enable a routing process\n"
163        "Start OSPF configuration\n")
164 {
165   struct ospf *ospf;
166
167   ospf = ospf_lookup ();
168   if (ospf == NULL)
169     {
170       vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
171       return CMD_WARNING;
172     }
173
174   ospf_finish (ospf);
175
176   return CMD_SUCCESS;
177 }
178
179 DEFUN (ospf_router_id,
180        ospf_router_id_cmd,
181        "ospf router-id A.B.C.D",
182        "OSPF specific commands\n"
183        "router-id for the OSPF process\n"
184        "OSPF router-id in IP address format\n")
185 {
186   struct ospf *ospf = vty->index;
187   struct in_addr router_id;
188   int ret;
189
190   ret = inet_aton (argv[0], &router_id);
191   if (!ret)
192     {
193       vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
194       return CMD_WARNING;
195     }
196
197   ospf->router_id_static = router_id;
198   
199   ospf_router_id_update (ospf);
200   
201   return CMD_SUCCESS;
202 }
203
204 ALIAS (ospf_router_id,
205        router_ospf_id_cmd,
206        "router-id A.B.C.D",
207        "router-id for the OSPF process\n"
208        "OSPF router-id in IP address format\n")
209
210 DEFUN (no_ospf_router_id,
211        no_ospf_router_id_cmd,
212        "no ospf router-id",
213        NO_STR
214        "OSPF specific commands\n"
215        "router-id for the OSPF process\n")
216 {
217   struct ospf *ospf = vty->index;
218
219   ospf->router_id_static.s_addr = 0;
220
221   ospf_router_id_update (ospf);
222
223   return CMD_SUCCESS;
224 }
225
226 ALIAS (no_ospf_router_id,
227        no_router_ospf_id_cmd,
228        "no router-id",
229        NO_STR
230        "router-id for the OSPF process\n")
231
232 static void
233 ospf_passive_interface_default (struct ospf *ospf, u_char newval)
234 {
235   struct listnode *ln;
236   struct interface *ifp;
237   struct ospf_interface *oi;
238   
239   ospf->passive_interface_default = newval;
240
241   for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
242     {
243       if (ifp &&
244           OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
245         UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
246     }
247   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
248     {
249       if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
250         UNSET_IF_PARAM (oi->params, passive_interface);
251       /* update multicast memberships */
252       ospf_if_set_multicast(oi);
253     }
254 }
255
256 static void
257 ospf_passive_interface_update_addr (struct ospf *ospf, struct interface *ifp,
258                                struct ospf_if_params *params, u_char value,
259                                struct in_addr addr)
260 {
261   u_char dflt;
262   
263   params->passive_interface = value;
264   if (params != IF_DEF_PARAMS (ifp))
265     {
266       if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
267         dflt = IF_DEF_PARAMS (ifp)->passive_interface;
268       else
269         dflt = ospf->passive_interface_default;
270       
271       if (value != dflt)
272         SET_IF_PARAM (params, passive_interface);
273       else
274         UNSET_IF_PARAM (params, passive_interface);
275       
276       ospf_free_if_params (ifp, addr);
277       ospf_if_update_params (ifp, addr);
278     }
279 }
280
281 static void
282 ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
283                                struct ospf_if_params *params, u_char value)
284 {
285   params->passive_interface = value;
286   if (params == IF_DEF_PARAMS (ifp))
287     {
288       if (value != ospf->passive_interface_default)
289         SET_IF_PARAM (params, passive_interface);
290       else
291         UNSET_IF_PARAM (params, passive_interface);
292     }
293 }
294
295 /* get the appropriate ospf parameters structure, checking if
296  * there's a valid interface address at the argi'th argv index
297  */
298 enum {
299   VTY_SET = 0,
300   VTY_UNSET,
301 };
302 #define OSPF_VTY_GET_IF_PARAMS(ifp,params,argi,addr,set) \
303   (params) = IF_DEF_PARAMS ((ifp));           \
304                                               \
305   if (argc == (argi) + 1)                     \
306     {                                         \
307       int ret = inet_aton(argv[(argi)], &(addr)); \
308       if (!ret)                               \
309         {                                     \
310           vty_out (vty, "Please specify interface address by A.B.C.D%s", \
311                    VTY_NEWLINE);              \
312           return CMD_WARNING;                 \
313         }                                     \
314       (params) = ospf_get_if_params ((ifp), (addr)); \
315                                               \
316       if (set)                                \
317         ospf_if_update_params ((ifp), (addr));  \
318       else if ((params) == NULL)              \
319         return CMD_SUCCESS;                   \
320     }
321
322 #define OSPF_VTY_PARAM_UNSET(params,var,ifp,addr) \
323   UNSET_IF_PARAM ((params), var);               \
324     if ((params) != IF_DEF_PARAMS ((ifp)))        \
325     {                                             \
326       ospf_free_if_params ((ifp), (addr));        \
327       ospf_if_update_params ((ifp), (addr));      \
328     }
329
330 DEFUN (ospf_passive_interface,
331        ospf_passive_interface_addr_cmd,
332        "passive-interface IFNAME A.B.C.D",
333        "Suppress routing updates on an interface\n"
334        "Interface's name\n")
335 {
336   struct interface *ifp;
337   struct in_addr addr;
338   int ret;
339   struct ospf_if_params *params;
340   struct route_node *rn;
341   struct ospf *ospf = vty->index;
342
343   if (argc == 0)
344     {
345       ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
346       return CMD_SUCCESS;
347     }
348
349   ifp = if_get_by_name (argv[0]);
350
351   params = IF_DEF_PARAMS (ifp);
352
353   if (argc == 2)
354     {
355       ret = inet_aton(argv[1], &addr);
356       if (!ret)
357         {
358           vty_out (vty, "Please specify interface address by A.B.C.D%s",
359                    VTY_NEWLINE);
360           return CMD_WARNING;
361         }
362
363       params = ospf_get_if_params (ifp, addr);
364       ospf_if_update_params (ifp, addr);
365       ospf_passive_interface_update_addr (ospf, ifp, params,
366                                           OSPF_IF_PASSIVE, addr);
367     }
368   
369   ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_PASSIVE);
370
371   /* XXX We should call ospf_if_set_multicast on exactly those
372    * interfaces for which the passive property changed.  It is too much
373    * work to determine this set, so we do this for every interface.
374    * This is safe and reasonable because ospf_if_set_multicast uses a
375    * record of joined groups to avoid systems calls if the desired
376    * memberships match the current memership.
377    */
378
379   for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
380     {
381       struct ospf_interface *oi = rn->info;
382
383       if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
384         ospf_if_set_multicast(oi);
385     }
386   /*
387    * XXX It is not clear what state transitions the interface needs to
388    * undergo when going from active to passive.  Fixing this will
389    * require precise identification of interfaces having such a
390    * transition.
391    */
392
393  return CMD_SUCCESS;
394 }
395
396 ALIAS (ospf_passive_interface,
397        ospf_passive_interface_cmd,
398        "passive-interface IFNAME",
399        "Suppress routing updates on an interface\n"
400        "Interface's name\n")
401
402 ALIAS (ospf_passive_interface,
403        ospf_passive_interface_default_cmd,
404        "passive-interface default",
405        "Suppress routing updates on an interface\n"
406        "Suppress routing updates on interfaces by default\n")
407
408 DEFUN (no_ospf_passive_interface,
409        no_ospf_passive_interface_addr_cmd,
410        "no passive-interface IFNAME A.B.C.D",
411        NO_STR
412        "Allow routing updates on an interface\n"
413        "Interface's name\n")
414 {
415   struct interface *ifp;
416   struct in_addr addr;
417   struct ospf_if_params *params;
418   int ret;
419   struct route_node *rn;
420   struct ospf *ospf = vty->index;
421
422   if (argc == 0)
423     {
424       ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
425       return CMD_SUCCESS;
426     }
427     
428   ifp = if_get_by_name (argv[0]);
429
430   params = IF_DEF_PARAMS (ifp);
431
432   if (argc == 2)
433     {
434       ret = inet_aton(argv[1], &addr);
435       if (!ret)
436         {
437           vty_out (vty, "Please specify interface address by A.B.C.D%s",
438                    VTY_NEWLINE);
439           return CMD_WARNING;
440         }
441
442       params = ospf_lookup_if_params (ifp, addr);
443       if (params == NULL)
444         return CMD_SUCCESS;
445       ospf_passive_interface_update_addr (ospf, ifp, params, OSPF_IF_ACTIVE, 
446                                           addr);
447     }
448   ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_ACTIVE);
449   
450   /* XXX We should call ospf_if_set_multicast on exactly those
451    * interfaces for which the passive property changed.  It is too much
452    * work to determine this set, so we do this for every interface.
453    * This is safe and reasonable because ospf_if_set_multicast uses a
454    * record of joined groups to avoid systems calls if the desired
455    * memberships match the current memership.
456    */
457   for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
458     {
459       struct ospf_interface *oi = rn->info;
460
461       if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
462         ospf_if_set_multicast(oi);
463     }
464
465   return CMD_SUCCESS;
466 }
467
468 ALIAS (no_ospf_passive_interface,
469        no_ospf_passive_interface_cmd,
470        "no passive-interface IFNAME",
471        NO_STR
472        "Allow routing updates on an interface\n"
473        "Interface's name\n")
474
475 ALIAS (no_ospf_passive_interface,
476        no_ospf_passive_interface_default_cmd,
477        "no passive-interface default",
478        NO_STR
479        "Allow routing updates on an interface\n"
480        "Allow routing updates on interfaces by default\n")
481        
482 DEFUN (ospf_network_area,
483        ospf_network_area_cmd,
484        "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
485        "Enable routing on an IP network\n"
486        "OSPF network prefix\n"
487        "Set the OSPF area ID\n"
488        "OSPF area ID in IP address format\n"
489        "OSPF area ID as a decimal value\n")
490 {
491   struct ospf *ospf = vty->index;
492   struct prefix_ipv4 p;
493   struct in_addr area_id;
494   int ret, format;
495
496   /* Get network prefix and Area ID. */
497   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
498   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
499
500   ret = ospf_network_set (ospf, &p, area_id);
501   if (ret == 0)
502     {
503       vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
504       return CMD_WARNING;
505     }
506
507   return CMD_SUCCESS;
508 }
509
510 DEFUN (no_ospf_network_area,
511        no_ospf_network_area_cmd,
512        "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
513        NO_STR
514        "Enable routing on an IP network\n"
515        "OSPF network prefix\n"
516        "Set the OSPF area ID\n"
517        "OSPF area ID in IP address format\n"
518        "OSPF area ID as a decimal value\n")
519 {
520   struct ospf *ospf = (struct ospf *) vty->index;
521   struct prefix_ipv4 p;
522   struct in_addr area_id;
523   int ret, format;
524
525   /* Get network prefix and Area ID. */
526   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
527   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
528
529   ret = ospf_network_unset (ospf, &p, area_id);
530   if (ret == 0)
531     {
532       vty_out (vty, "Can't find specified network area configuration.%s",
533                VTY_NEWLINE);
534       return CMD_WARNING;
535     }
536
537   return CMD_SUCCESS;
538 }
539
540
541 DEFUN (ospf_area_range,
542        ospf_area_range_cmd,
543        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
544        "OSPF area parameters\n"
545        "OSPF area ID in IP address format\n"
546        "OSPF area ID as a decimal value\n"
547        "Summarize routes matching address/mask (border routers only)\n"
548        "Area range prefix\n")
549 {
550   struct ospf *ospf = vty->index;
551   struct prefix_ipv4 p;
552   struct in_addr area_id;
553   int format;
554   u_int32_t cost;
555
556   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
557   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
558
559   ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
560   if (argc > 2)
561     {
562       VTY_GET_INTEGER ("range cost", cost, argv[2]);
563       ospf_area_range_cost_set (ospf, area_id, &p, cost);
564     }
565
566   return CMD_SUCCESS;
567 }
568
569 ALIAS (ospf_area_range,
570        ospf_area_range_advertise_cmd,
571        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
572        "OSPF area parameters\n"
573        "OSPF area ID in IP address format\n"
574        "OSPF area ID as a decimal value\n"
575        "OSPF area range for route advertise (default)\n"
576        "Area range prefix\n"
577        "Advertise this range (default)\n")
578
579 ALIAS (ospf_area_range,
580        ospf_area_range_cost_cmd,
581        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
582        "OSPF area parameters\n"
583        "OSPF area ID in IP address format\n"
584        "OSPF area ID as a decimal value\n"
585        "Summarize routes matching address/mask (border routers only)\n"
586        "Area range prefix\n"
587        "User specified metric for this range\n"
588        "Advertised metric for this range\n")
589
590 ALIAS (ospf_area_range,
591        ospf_area_range_advertise_cost_cmd,
592        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
593        "OSPF area parameters\n"
594        "OSPF area ID in IP address format\n"
595        "OSPF area ID as a decimal value\n"
596        "Summarize routes matching address/mask (border routers only)\n"
597        "Area range prefix\n"
598        "Advertise this range (default)\n"
599        "User specified metric for this range\n"
600        "Advertised metric for this range\n")
601
602 DEFUN (ospf_area_range_not_advertise,
603        ospf_area_range_not_advertise_cmd,
604        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
605        "OSPF area parameters\n"
606        "OSPF area ID in IP address format\n"
607        "OSPF area ID as a decimal value\n"
608        "Summarize routes matching address/mask (border routers only)\n"
609        "Area range prefix\n"
610        "DoNotAdvertise this range\n")
611 {
612   struct ospf *ospf = vty->index;
613   struct prefix_ipv4 p;
614   struct in_addr area_id;
615   int format;
616
617   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
618   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
619
620   ospf_area_range_set (ospf, area_id, &p, 0);
621
622   return CMD_SUCCESS;
623 }
624
625 DEFUN (no_ospf_area_range,
626        no_ospf_area_range_cmd,
627        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
628        NO_STR
629        "OSPF area parameters\n"
630        "OSPF area ID in IP address format\n"
631        "OSPF area ID as a decimal value\n"
632        "Summarize routes matching address/mask (border routers only)\n"
633        "Area range prefix\n")
634 {
635   struct ospf *ospf = vty->index;
636   struct prefix_ipv4 p;
637   struct in_addr area_id;
638   int format;
639
640   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
641   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
642
643   ospf_area_range_unset (ospf, area_id, &p);
644
645   return CMD_SUCCESS;
646 }
647
648 ALIAS (no_ospf_area_range,
649        no_ospf_area_range_advertise_cmd,
650        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
651        NO_STR
652        "OSPF area parameters\n"
653        "OSPF area ID in IP address format\n"
654        "OSPF area ID as a decimal value\n"
655        "Summarize routes matching address/mask (border routers only)\n"
656        "Area range prefix\n"
657        "Advertise this range (default)\n"
658        "DoNotAdvertise this range\n")
659
660 ALIAS (no_ospf_area_range,
661        no_ospf_area_range_cost_cmd,
662        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
663        NO_STR
664        "OSPF area parameters\n"
665        "OSPF area ID in IP address format\n"
666        "OSPF area ID as a decimal value\n"
667        "Summarize routes matching address/mask (border routers only)\n"
668        "Area range prefix\n"
669        "User specified metric for this range\n"
670        "Advertised metric for this range\n")
671
672 ALIAS (no_ospf_area_range,
673        no_ospf_area_range_advertise_cost_cmd,
674        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
675        NO_STR
676        "OSPF area parameters\n"
677        "OSPF area ID in IP address format\n"
678        "OSPF area ID as a decimal value\n"
679        "Summarize routes matching address/mask (border routers only)\n"
680        "Area range prefix\n"
681        "Advertise this range (default)\n"
682        "User specified metric for this range\n"
683        "Advertised metric for this range\n")
684
685 DEFUN (ospf_area_range_substitute,
686        ospf_area_range_substitute_cmd,
687        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
688        "OSPF area parameters\n"
689        "OSPF area ID in IP address format\n"
690        "OSPF area ID as a decimal value\n"
691        "Summarize routes matching address/mask (border routers only)\n"
692        "Area range prefix\n"
693        "Announce area range as another prefix\n"
694        "Network prefix to be announced instead of range\n")
695 {
696   struct ospf *ospf = vty->index;
697   struct prefix_ipv4 p, s;
698   struct in_addr area_id;
699   int format;
700
701   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
702   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
703   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
704
705   ospf_area_range_substitute_set (ospf, area_id, &p, &s);
706
707   return CMD_SUCCESS;
708 }
709
710 DEFUN (no_ospf_area_range_substitute,
711        no_ospf_area_range_substitute_cmd,
712        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
713        NO_STR
714        "OSPF area parameters\n"
715        "OSPF area ID in IP address format\n"
716        "OSPF area ID as a decimal value\n"
717        "Summarize routes matching address/mask (border routers only)\n"
718        "Area range prefix\n"
719        "Announce area range as another prefix\n"
720        "Network prefix to be announced instead of range\n")
721 {
722   struct ospf *ospf = vty->index;
723   struct prefix_ipv4 p, s;
724   struct in_addr area_id;
725   int format;
726
727   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
728   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
729   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
730
731   ospf_area_range_substitute_unset (ospf, area_id, &p);
732
733   return CMD_SUCCESS;
734 }
735
736
737 /* Command Handler Logic in VLink stuff is delicate!!
738
739         ALTER AT YOUR OWN RISK!!!!
740
741         Various dummy values are used to represent 'NoChange' state for
742         VLink configuration NOT being changed by a VLink command, and
743         special syntax is used within the command strings so that the
744         typed in command verbs can be seen in the configuration command
745         bacckend handler.  This is to drastically reduce the verbeage
746         required to coe up with a reasonably compatible Cisco VLink command
747
748         - Matthew Grant <grantma@anathoth.gen.nz> 
749         Wed, 21 Feb 2001 15:13:52 +1300
750  */
751
752
753 /* Configuration data for virtual links 
754  */ 
755 struct ospf_vl_config_data {
756   struct vty *vty;              /* vty stuff */
757   struct in_addr area_id;       /* area ID from command line */
758   int format;                   /* command line area ID format */
759   struct in_addr vl_peer;       /* command line vl_peer */
760   int auth_type;                /* Authehntication type, if given */
761   char *auth_key;               /* simple password if present */
762   int crypto_key_id;            /* Cryptographic key ID */
763   char *md5_key;                /* MD5 authentication key */
764   int hello_interval;           /* Obvious what these are... */
765   int retransmit_interval; 
766   int transmit_delay;
767   int dead_interval;
768 };
769
770 static void
771 ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config, 
772                           struct vty *vty)
773 {
774   memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
775   vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
776   vl_config->vty = vty;
777 }
778
779 static struct ospf_vl_data *
780 ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
781 {
782   struct ospf_area *area;
783   struct ospf_vl_data *vl_data;
784   struct vty *vty;
785   struct in_addr area_id;
786
787   vty = vl_config->vty;
788   area_id = vl_config->area_id;
789
790   if (area_id.s_addr == OSPF_AREA_BACKBONE)
791     {
792       vty_out (vty, 
793                "Configuring VLs over the backbone is not allowed%s",
794                VTY_NEWLINE);
795       return NULL;
796     }
797   area = ospf_area_get (ospf, area_id, vl_config->format);
798
799   if (area->external_routing != OSPF_AREA_DEFAULT)
800     {
801       if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
802         vty_out (vty, "Area %s is %s%s",
803                  inet_ntoa (area_id),
804                  area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
805                  VTY_NEWLINE);
806       else
807         vty_out (vty, "Area %ld is %s%s",
808                  (u_long)ntohl (area_id.s_addr),
809                  area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
810                  VTY_NEWLINE);  
811       return NULL;
812     }
813   
814   if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
815     {
816       vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
817       if (vl_data->vl_oi == NULL)
818         {
819           vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
820           ospf_vl_add (ospf, vl_data);
821           ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
822         }
823     }
824   return vl_data;
825 }
826
827
828 static int
829 ospf_vl_set_security (struct ospf_vl_data *vl_data,
830                       struct ospf_vl_config_data *vl_config)
831 {
832   struct crypt_key *ck;
833   struct vty *vty;
834   struct interface *ifp = vl_data->vl_oi->ifp;
835
836   vty = vl_config->vty;
837
838   if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
839     {
840       SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
841       IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
842     }
843
844   if (vl_config->auth_key)
845     {
846       memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
847       strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key, 
848                OSPF_AUTH_SIMPLE_SIZE);
849     }
850   else if (vl_config->md5_key)
851     {
852       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id) 
853           != NULL)
854         {
855           vty_out (vty, "OSPF: Key %d already exists%s",
856                    vl_config->crypto_key_id, VTY_NEWLINE);
857           return CMD_WARNING;
858         }
859       ck = ospf_crypt_key_new ();
860       ck->key_id = vl_config->crypto_key_id;
861       memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
862       strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
863       
864       ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
865     }
866   else if (vl_config->crypto_key_id != 0)
867     {
868       /* Delete a key */
869
870       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, 
871                                  vl_config->crypto_key_id) == NULL)
872         {
873           vty_out (vty, "OSPF: Key %d does not exist%s", 
874                    vl_config->crypto_key_id, VTY_NEWLINE);
875           return CMD_WARNING;
876         }
877       
878       ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
879
880     }
881   
882   return CMD_SUCCESS;
883 }
884
885 static int
886 ospf_vl_set_timers (struct ospf_vl_data *vl_data,
887                     struct ospf_vl_config_data *vl_config)
888 {
889   struct interface *ifp = vl_data->vl_oi->ifp;
890   /* Virtual Link data initialised to defaults, so only set
891      if a value given */
892   if (vl_config->hello_interval)
893     {
894       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
895       IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
896     }
897
898   if (vl_config->dead_interval)
899     {
900       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
901       IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
902     }
903
904   if (vl_config->retransmit_interval)
905     {
906       SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
907       IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
908     }
909   
910   if (vl_config->transmit_delay)
911     {
912       SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
913       IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
914     }
915   
916   return CMD_SUCCESS;
917 }
918
919
920
921 /* The business end of all of the above */
922 static int
923 ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
924 {
925   struct ospf_vl_data *vl_data;
926   int ret;
927
928   vl_data = ospf_find_vl_data (ospf, vl_config);
929   if (!vl_data)
930     return CMD_WARNING;
931   
932   /* Process this one first as it can have a fatal result, which can
933      only logically occur if the virtual link exists already
934      Thus a command error does not result in a change to the
935      running configuration such as unexpectedly altered timer 
936      values etc.*/
937   ret = ospf_vl_set_security (vl_data, vl_config);
938   if (ret != CMD_SUCCESS)
939     return ret;
940
941   /* Set any time based parameters, these area already range checked */
942
943   ret = ospf_vl_set_timers (vl_data, vl_config);
944   if (ret != CMD_SUCCESS)
945     return ret;
946
947   return CMD_SUCCESS;
948
949 }
950
951 /* This stuff exists to make specifying all the alias commands A LOT simpler
952  */
953 #define VLINK_HELPSTR_IPADDR \
954        "OSPF area parameters\n" \
955        "OSPF area ID in IP address format\n" \
956        "OSPF area ID as a decimal value\n" \
957        "Configure a virtual link\n" \
958        "Router ID of the remote ABR\n"
959
960 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
961        "Enable authentication on this virtual link\n" \
962        "dummy string \n" 
963
964 #define VLINK_HELPSTR_AUTHTYPE_ALL \
965        VLINK_HELPSTR_AUTHTYPE_SIMPLE \
966        "Use null authentication\n" \
967        "Use message-digest authentication\n"
968
969 #define VLINK_HELPSTR_TIME_PARAM_NOSECS \
970        "Time between HELLO packets\n" \
971        "Time between retransmitting lost link state advertisements\n" \
972        "Link state transmit delay\n" \
973        "Interval after which a neighbor is declared dead\n"
974
975 #define VLINK_HELPSTR_TIME_PARAM \
976        VLINK_HELPSTR_TIME_PARAM_NOSECS \
977        "Seconds\n"
978
979 #define VLINK_HELPSTR_AUTH_SIMPLE \
980        "Authentication password (key)\n" \
981        "The OSPF password (key)"
982
983 #define VLINK_HELPSTR_AUTH_MD5 \
984        "Message digest authentication password (key)\n" \
985        "dummy string \n" \
986        "Key ID\n" \
987        "Use MD5 algorithm\n" \
988        "The OSPF password (key)"
989
990 DEFUN (ospf_area_vlink,
991        ospf_area_vlink_cmd,
992        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
993        VLINK_HELPSTR_IPADDR)
994 {
995   struct ospf *ospf = vty->index;
996   struct ospf_vl_config_data vl_config;
997   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
998   char md5_key[OSPF_AUTH_MD5_SIZE+1]; 
999   int i;
1000   int ret;
1001   
1002   ospf_vl_config_data_init(&vl_config, vty);
1003
1004   /* Read off first 2 parameters and check them */
1005   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
1006   if (ret < 0)
1007     {
1008       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1009       return CMD_WARNING;
1010     }
1011
1012   ret = inet_aton (argv[1], &vl_config.vl_peer);
1013   if (! ret)
1014     {
1015       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1016                VTY_NEWLINE);
1017       return CMD_WARNING;
1018     }
1019
1020   if (argc <=2)
1021     {
1022       /* Thats all folks! - BUGS B. strikes again!!!*/
1023
1024       return  ospf_vl_set (ospf, &vl_config);
1025     }
1026
1027   /* Deal with other parameters */
1028   for (i=2; i < argc; i++)
1029     {
1030
1031       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1032
1033       switch (argv[i][0])
1034         {
1035
1036         case 'a':
1037           if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1038             {
1039               /* authentication-key - this option can occur anywhere on 
1040                                       command line.  At start of command line
1041                                       must check for authentication option. */
1042               memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1043               strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
1044               vl_config.auth_key = auth_key;
1045               i++;
1046             }
1047           else if (strncmp (argv[i], "authentication", 14) == 0)
1048             {
1049               /* authentication  - this option can only occur at start
1050                                    of command line */
1051               vl_config.auth_type = OSPF_AUTH_SIMPLE;
1052               if ((i+1) < argc)
1053                 {
1054                   if (strncmp (argv[i+1], "n", 1) == 0)
1055                     {
1056                       /* "authentication null" */
1057                       vl_config.auth_type = OSPF_AUTH_NULL;
1058                       i++;
1059                     }
1060                   else if (strncmp (argv[i+1], "m", 1) == 0
1061                            && strcmp (argv[i+1], "message-digest-") != 0)
1062                     {
1063                       /* "authentication message-digest" */ 
1064                       vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1065                       i++;
1066                     }
1067                 }
1068             }
1069           break;
1070
1071         case 'm':
1072           /* message-digest-key */
1073           i++;
1074           vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1075           if (vl_config.crypto_key_id < 0)
1076             return CMD_WARNING;
1077           i++;
1078           memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1079           strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1080           vl_config.md5_key = md5_key; 
1081           break;
1082
1083         case 'h':
1084           /* Hello interval */
1085           i++;
1086           vl_config.hello_interval = strtol (argv[i], NULL, 10);
1087           if (vl_config.hello_interval < 0) 
1088             return CMD_WARNING;
1089           break;
1090
1091         case 'r':
1092           /* Retransmit Interval */
1093           i++;
1094           vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1095           if (vl_config.retransmit_interval < 0)
1096             return CMD_WARNING;
1097           break;
1098
1099         case 't':
1100           /* Transmit Delay */
1101           i++;
1102           vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1103           if (vl_config.transmit_delay < 0)
1104             return CMD_WARNING;
1105           break;
1106
1107         case 'd':
1108           /* Dead Interval */
1109           i++;
1110           vl_config.dead_interval = strtol (argv[i], NULL, 10);
1111           if (vl_config.dead_interval < 0)
1112             return CMD_WARNING;
1113           break;
1114         }
1115     }
1116
1117
1118   /* Action configuration */
1119
1120   return ospf_vl_set (ospf, &vl_config);
1121
1122 }
1123
1124 DEFUN (no_ospf_area_vlink,
1125        no_ospf_area_vlink_cmd,
1126        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1127        NO_STR
1128        VLINK_HELPSTR_IPADDR)
1129 {
1130   struct ospf *ospf = vty->index;
1131   struct ospf_area *area;
1132   struct ospf_vl_config_data vl_config;
1133   struct ospf_vl_data *vl_data = NULL;
1134   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1135   int i;
1136   int ret, format;
1137
1138   ospf_vl_config_data_init(&vl_config, vty);
1139
1140   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1141   if (ret < 0)
1142     {
1143       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1144       return CMD_WARNING;
1145     }
1146
1147   area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
1148   if (!area)
1149     {
1150       vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1151       return CMD_WARNING;
1152     }
1153
1154   ret = inet_aton (argv[1], &vl_config.vl_peer);
1155   if (! ret)
1156     {
1157       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1158                VTY_NEWLINE);
1159       return CMD_WARNING;
1160     }
1161
1162   if (argc <=2)
1163     {
1164       /* Basic VLink no command */
1165       /* Thats all folks! - BUGS B. strikes again!!!*/
1166       if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
1167         ospf_vl_delete (ospf, vl_data);
1168
1169       ospf_area_check_free (ospf, vl_config.area_id);
1170       
1171       return CMD_SUCCESS;
1172     }
1173
1174   /* If we are down here, we are reseting parameters */
1175
1176   /* Deal with other parameters */
1177   for (i=2; i < argc; i++)
1178     {
1179       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1180
1181       switch (argv[i][0])
1182         {
1183
1184         case 'a':
1185           if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1186             {
1187               /* authentication-key - this option can occur anywhere on 
1188                                       command line.  At start of command line
1189                                       must check for authentication option. */
1190               memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1191               vl_config.auth_key = auth_key;
1192             }
1193           else if (strncmp (argv[i], "authentication", 14) == 0)
1194             {
1195               /* authentication  - this option can only occur at start
1196                                    of command line */
1197               vl_config.auth_type = OSPF_AUTH_NOTSET;
1198             }
1199           break;
1200
1201         case 'm':
1202           /* message-digest-key */
1203           /* Delete one key */
1204           i++;
1205           vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1206           if (vl_config.crypto_key_id < 0)
1207             return CMD_WARNING;
1208           vl_config.md5_key = NULL; 
1209           break;
1210
1211         case 'h':
1212           /* Hello interval */
1213           vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1214           break;
1215
1216         case 'r':
1217           /* Retransmit Interval */
1218           vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1219           break;
1220
1221         case 't':
1222           /* Transmit Delay */
1223           vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1224           break;
1225
1226         case 'd':
1227           /* Dead Interval */
1228           i++;
1229           vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1230           break;
1231         }
1232     }
1233
1234
1235   /* Action configuration */
1236
1237   return ospf_vl_set (ospf, &vl_config);
1238 }
1239
1240 ALIAS (ospf_area_vlink,
1241        ospf_area_vlink_param1_cmd,
1242        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1243        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1244        VLINK_HELPSTR_IPADDR
1245        VLINK_HELPSTR_TIME_PARAM)
1246
1247 ALIAS (no_ospf_area_vlink,
1248        no_ospf_area_vlink_param1_cmd,
1249        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1250        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1251        NO_STR
1252        VLINK_HELPSTR_IPADDR
1253        VLINK_HELPSTR_TIME_PARAM)
1254
1255 ALIAS (ospf_area_vlink,
1256        ospf_area_vlink_param2_cmd,
1257        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1258        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1259        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1260        VLINK_HELPSTR_IPADDR
1261        VLINK_HELPSTR_TIME_PARAM
1262        VLINK_HELPSTR_TIME_PARAM)
1263
1264 ALIAS (no_ospf_area_vlink,
1265        no_ospf_area_vlink_param2_cmd,
1266        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1267        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1268        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1269        NO_STR
1270        VLINK_HELPSTR_IPADDR
1271        VLINK_HELPSTR_TIME_PARAM
1272        VLINK_HELPSTR_TIME_PARAM)
1273
1274 ALIAS (ospf_area_vlink,
1275        ospf_area_vlink_param3_cmd,
1276        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1277        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1278        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1279        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1280        VLINK_HELPSTR_IPADDR
1281        VLINK_HELPSTR_TIME_PARAM
1282        VLINK_HELPSTR_TIME_PARAM
1283        VLINK_HELPSTR_TIME_PARAM)
1284
1285 ALIAS (no_ospf_area_vlink,
1286        no_ospf_area_vlink_param3_cmd,
1287        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1288        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1289        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1290        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1291        NO_STR
1292        VLINK_HELPSTR_IPADDR
1293        VLINK_HELPSTR_TIME_PARAM
1294        VLINK_HELPSTR_TIME_PARAM
1295        VLINK_HELPSTR_TIME_PARAM)
1296
1297 ALIAS (ospf_area_vlink,
1298        ospf_area_vlink_param4_cmd,
1299        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1300        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1301        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1302        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1303        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1304        VLINK_HELPSTR_IPADDR
1305        VLINK_HELPSTR_TIME_PARAM
1306        VLINK_HELPSTR_TIME_PARAM
1307        VLINK_HELPSTR_TIME_PARAM
1308        VLINK_HELPSTR_TIME_PARAM)
1309
1310 ALIAS (no_ospf_area_vlink,
1311        no_ospf_area_vlink_param4_cmd,
1312        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1313        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1314        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1315        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1316        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1317        NO_STR
1318        VLINK_HELPSTR_IPADDR
1319        VLINK_HELPSTR_TIME_PARAM
1320        VLINK_HELPSTR_TIME_PARAM
1321        VLINK_HELPSTR_TIME_PARAM
1322        VLINK_HELPSTR_TIME_PARAM)
1323
1324 ALIAS (ospf_area_vlink,
1325        ospf_area_vlink_authtype_args_cmd,
1326        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1327        "(authentication|) (message-digest|null)",
1328        VLINK_HELPSTR_IPADDR
1329        VLINK_HELPSTR_AUTHTYPE_ALL)
1330
1331 ALIAS (ospf_area_vlink,
1332        ospf_area_vlink_authtype_cmd,
1333        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1334        "(authentication|)",
1335        VLINK_HELPSTR_IPADDR
1336        VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1337
1338 ALIAS (no_ospf_area_vlink,
1339        no_ospf_area_vlink_authtype_cmd,
1340        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1341        "(authentication|)",
1342        NO_STR
1343        VLINK_HELPSTR_IPADDR
1344        VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1345
1346 ALIAS (ospf_area_vlink,
1347        ospf_area_vlink_md5_cmd,
1348        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1349        "(message-digest-key|) <1-255> md5 KEY",
1350        VLINK_HELPSTR_IPADDR
1351        VLINK_HELPSTR_AUTH_MD5)
1352
1353 ALIAS (no_ospf_area_vlink,
1354        no_ospf_area_vlink_md5_cmd,
1355        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1356        "(message-digest-key|) <1-255>",
1357        NO_STR
1358        VLINK_HELPSTR_IPADDR
1359        VLINK_HELPSTR_AUTH_MD5)
1360
1361 ALIAS (ospf_area_vlink,
1362        ospf_area_vlink_authkey_cmd,
1363        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1364        "(authentication-key|) AUTH_KEY",
1365        VLINK_HELPSTR_IPADDR
1366        VLINK_HELPSTR_AUTH_SIMPLE)
1367
1368 ALIAS (no_ospf_area_vlink,
1369        no_ospf_area_vlink_authkey_cmd,
1370        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1371        "(authentication-key|)",
1372        NO_STR
1373        VLINK_HELPSTR_IPADDR
1374        VLINK_HELPSTR_AUTH_SIMPLE)
1375
1376 ALIAS (ospf_area_vlink,
1377        ospf_area_vlink_authtype_args_authkey_cmd,
1378        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1379        "(authentication|) (message-digest|null) "
1380        "(authentication-key|) AUTH_KEY",
1381        VLINK_HELPSTR_IPADDR
1382        VLINK_HELPSTR_AUTHTYPE_ALL
1383        VLINK_HELPSTR_AUTH_SIMPLE)
1384
1385 ALIAS (ospf_area_vlink,
1386        ospf_area_vlink_authtype_authkey_cmd,
1387        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1388        "(authentication|) "
1389        "(authentication-key|) AUTH_KEY",
1390        VLINK_HELPSTR_IPADDR
1391        VLINK_HELPSTR_AUTHTYPE_SIMPLE
1392        VLINK_HELPSTR_AUTH_SIMPLE)
1393
1394 ALIAS (no_ospf_area_vlink,
1395        no_ospf_area_vlink_authtype_authkey_cmd,
1396        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1397        "(authentication|) "
1398        "(authentication-key|)",
1399        NO_STR
1400        VLINK_HELPSTR_IPADDR
1401        VLINK_HELPSTR_AUTHTYPE_SIMPLE
1402        VLINK_HELPSTR_AUTH_SIMPLE)
1403
1404 ALIAS (ospf_area_vlink,
1405        ospf_area_vlink_authtype_args_md5_cmd,
1406        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1407        "(authentication|) (message-digest|null) "
1408        "(message-digest-key|) <1-255> md5 KEY",
1409        VLINK_HELPSTR_IPADDR
1410        VLINK_HELPSTR_AUTHTYPE_ALL
1411        VLINK_HELPSTR_AUTH_MD5)
1412
1413 ALIAS (ospf_area_vlink,
1414        ospf_area_vlink_authtype_md5_cmd,
1415        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1416        "(authentication|) "
1417        "(message-digest-key|) <1-255> md5 KEY",
1418        VLINK_HELPSTR_IPADDR
1419        VLINK_HELPSTR_AUTHTYPE_SIMPLE
1420        VLINK_HELPSTR_AUTH_MD5)
1421
1422 ALIAS (no_ospf_area_vlink,
1423        no_ospf_area_vlink_authtype_md5_cmd,
1424        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1425        "(authentication|) "
1426        "(message-digest-key|)",
1427        NO_STR
1428        VLINK_HELPSTR_IPADDR
1429        VLINK_HELPSTR_AUTHTYPE_SIMPLE
1430        VLINK_HELPSTR_AUTH_MD5)
1431
1432
1433 DEFUN (ospf_area_shortcut,
1434        ospf_area_shortcut_cmd,
1435        "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1436        "OSPF area parameters\n"
1437        "OSPF area ID in IP address format\n"
1438        "OSPF area ID as a decimal value\n"
1439        "Configure the area's shortcutting mode\n"
1440        "Set default shortcutting behavior\n"
1441        "Enable shortcutting through the area\n"
1442        "Disable shortcutting through the area\n")
1443 {
1444   struct ospf *ospf = vty->index;
1445   struct ospf_area *area;
1446   struct in_addr area_id;
1447   int mode;
1448   int format;
1449
1450   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1451
1452   area = ospf_area_get (ospf, area_id, format);
1453
1454   if (strncmp (argv[1], "de", 2) == 0)
1455     mode = OSPF_SHORTCUT_DEFAULT;
1456   else if (strncmp (argv[1], "di", 2) == 0)
1457     mode = OSPF_SHORTCUT_DISABLE;
1458   else if (strncmp (argv[1], "e", 1) == 0)
1459     mode = OSPF_SHORTCUT_ENABLE;
1460   else
1461     return CMD_WARNING;
1462
1463   ospf_area_shortcut_set (ospf, area, mode);
1464
1465   if (ospf->abr_type != OSPF_ABR_SHORTCUT)
1466     vty_out (vty, "Shortcut area setting will take effect "
1467              "only when the router is configured as Shortcut ABR%s",
1468              VTY_NEWLINE);
1469
1470   return CMD_SUCCESS;
1471 }
1472
1473 DEFUN (no_ospf_area_shortcut,
1474        no_ospf_area_shortcut_cmd,
1475        "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1476        NO_STR
1477        "OSPF area parameters\n"
1478        "OSPF area ID in IP address format\n"
1479        "OSPF area ID as a decimal value\n"
1480        "Deconfigure the area's shortcutting mode\n"
1481        "Deconfigure enabled shortcutting through the area\n"
1482        "Deconfigure disabled shortcutting through the area\n")
1483 {
1484   struct ospf *ospf = vty->index;
1485   struct ospf_area *area;
1486   struct in_addr area_id;
1487   int format;
1488
1489   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1490
1491   area = ospf_area_lookup_by_area_id (ospf, area_id);
1492   if (!area)
1493     return CMD_SUCCESS;
1494
1495   ospf_area_shortcut_unset (ospf, area);
1496
1497   return CMD_SUCCESS;
1498 }
1499
1500
1501 DEFUN (ospf_area_stub,
1502        ospf_area_stub_cmd,
1503        "area (A.B.C.D|<0-4294967295>) stub",
1504        "OSPF area parameters\n"
1505        "OSPF area ID in IP address format\n"
1506        "OSPF area ID as a decimal value\n"
1507        "Configure OSPF area as stub\n")
1508 {
1509   struct ospf *ospf = vty->index;
1510   struct in_addr area_id;
1511   int ret, format;
1512
1513   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1514
1515   ret = ospf_area_stub_set (ospf, area_id);
1516   if (ret == 0)
1517     {
1518       vty_out (vty, "First deconfigure all virtual link through this area%s",
1519                VTY_NEWLINE);
1520       return CMD_WARNING;
1521     }
1522
1523   ospf_area_no_summary_unset (ospf, area_id);
1524
1525   return CMD_SUCCESS;
1526 }
1527
1528 DEFUN (ospf_area_stub_no_summary,
1529        ospf_area_stub_no_summary_cmd,
1530        "area (A.B.C.D|<0-4294967295>) stub no-summary",
1531        "OSPF stub parameters\n"
1532        "OSPF area ID in IP address format\n"
1533        "OSPF area ID as a decimal value\n"
1534        "Configure OSPF area as stub\n"
1535        "Do not inject inter-area routes into stub\n")
1536 {
1537   struct ospf *ospf = vty->index;
1538   struct in_addr area_id;
1539   int ret, format;
1540
1541   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1542
1543   ret = ospf_area_stub_set (ospf, area_id);
1544   if (ret == 0)
1545     {
1546       vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
1547                VTY_NEWLINE);
1548       return CMD_WARNING;
1549     }
1550
1551   ospf_area_no_summary_set (ospf, area_id);
1552
1553   return CMD_SUCCESS;
1554 }
1555
1556 DEFUN (no_ospf_area_stub,
1557        no_ospf_area_stub_cmd,
1558        "no area (A.B.C.D|<0-4294967295>) stub",
1559        NO_STR
1560        "OSPF area parameters\n"
1561        "OSPF area ID in IP address format\n"
1562        "OSPF area ID as a decimal value\n"
1563        "Configure OSPF area as stub\n")
1564 {
1565   struct ospf *ospf = vty->index;
1566   struct in_addr area_id;
1567   int format;
1568
1569   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1570
1571   ospf_area_stub_unset (ospf, area_id);
1572   ospf_area_no_summary_unset (ospf, area_id);
1573
1574   return CMD_SUCCESS;
1575 }
1576
1577 DEFUN (no_ospf_area_stub_no_summary,
1578        no_ospf_area_stub_no_summary_cmd,
1579        "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1580        NO_STR
1581        "OSPF area parameters\n"
1582        "OSPF area ID in IP address format\n"
1583        "OSPF area ID as a decimal value\n"
1584        "Configure OSPF area as stub\n"
1585        "Do not inject inter-area routes into area\n")
1586 {
1587   struct ospf *ospf = vty->index;
1588   struct in_addr area_id;
1589   int format;
1590
1591   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1592   ospf_area_no_summary_unset (ospf, area_id);
1593
1594   return CMD_SUCCESS;
1595 }
1596
1597 static int
1598 ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[], 
1599                             int nosum)
1600 {
1601   struct ospf *ospf = vty->index;
1602   struct in_addr area_id;
1603   int ret, format;
1604
1605   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1606
1607   ret = ospf_area_nssa_set (ospf, area_id);
1608   if (ret == 0)
1609     {
1610       vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1611                VTY_NEWLINE);
1612       return CMD_WARNING;
1613     }
1614
1615   if (argc > 1)
1616     {
1617       if (strncmp (argv[1], "translate-c", 11) == 0)
1618         ospf_area_nssa_translator_role_set (ospf, area_id,
1619                                             OSPF_NSSA_ROLE_CANDIDATE);
1620       else if (strncmp (argv[1], "translate-n", 11) == 0)
1621         ospf_area_nssa_translator_role_set (ospf, area_id,
1622                                             OSPF_NSSA_ROLE_NEVER);
1623       else if (strncmp (argv[1], "translate-a", 11) == 0)
1624         ospf_area_nssa_translator_role_set (ospf, area_id,
1625                                             OSPF_NSSA_ROLE_ALWAYS);
1626     }
1627   else
1628     {
1629       ospf_area_nssa_translator_role_set (ospf, area_id,
1630                         OSPF_NSSA_ROLE_CANDIDATE);
1631     }
1632
1633   if (nosum)
1634     ospf_area_no_summary_set (ospf, area_id);
1635   else
1636     ospf_area_no_summary_unset (ospf, area_id);
1637
1638   ospf_schedule_abr_task (ospf);
1639     
1640   return CMD_SUCCESS;
1641 }
1642
1643 DEFUN (ospf_area_nssa_translate_no_summary,
1644        ospf_area_nssa_translate_no_summary_cmd,
1645        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
1646        "OSPF area parameters\n"
1647        "OSPF area ID in IP address format\n"
1648        "OSPF area ID as a decimal value\n"
1649        "Configure OSPF area as nssa\n"
1650        "Configure NSSA-ABR for translate election (default)\n"
1651        "Configure NSSA-ABR to never translate\n"
1652        "Configure NSSA-ABR to always translate\n"
1653        "Do not inject inter-area routes into nssa\n")
1654 {
1655    return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1656 }
1657
1658 DEFUN (ospf_area_nssa_translate,
1659        ospf_area_nssa_translate_cmd,
1660        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1661        "OSPF area parameters\n"
1662        "OSPF area ID in IP address format\n"
1663        "OSPF area ID as a decimal value\n"
1664        "Configure OSPF area as nssa\n"
1665        "Configure NSSA-ABR for translate election (default)\n"
1666        "Configure NSSA-ABR to never translate\n"
1667        "Configure NSSA-ABR to always translate\n")
1668 {
1669   return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1670 }
1671
1672 DEFUN (ospf_area_nssa,
1673        ospf_area_nssa_cmd,
1674        "area (A.B.C.D|<0-4294967295>) nssa",
1675        "OSPF area parameters\n"
1676        "OSPF area ID in IP address format\n"
1677        "OSPF area ID as a decimal value\n"
1678        "Configure OSPF area as nssa\n")
1679 {
1680   return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1681 }
1682
1683 DEFUN (ospf_area_nssa_no_summary,
1684        ospf_area_nssa_no_summary_cmd,
1685        "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1686        "OSPF area parameters\n"
1687        "OSPF area ID in IP address format\n"
1688        "OSPF area ID as a decimal value\n"
1689        "Configure OSPF area as nssa\n"
1690        "Do not inject inter-area routes into nssa\n")
1691 {
1692   return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1693 }
1694
1695 DEFUN (no_ospf_area_nssa,
1696        no_ospf_area_nssa_cmd,
1697        "no area (A.B.C.D|<0-4294967295>) nssa",
1698        NO_STR
1699        "OSPF area parameters\n"
1700        "OSPF area ID in IP address format\n"
1701        "OSPF area ID as a decimal value\n"
1702        "Configure OSPF area as nssa\n")
1703 {
1704   struct ospf *ospf = vty->index;
1705   struct in_addr area_id;
1706   int format;
1707
1708   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1709
1710   ospf_area_nssa_unset (ospf, area_id);
1711   ospf_area_no_summary_unset (ospf, area_id);
1712
1713   ospf_schedule_abr_task (ospf);
1714
1715   return CMD_SUCCESS;
1716 }
1717
1718 DEFUN (no_ospf_area_nssa_no_summary,
1719        no_ospf_area_nssa_no_summary_cmd,
1720        "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1721        NO_STR
1722        "OSPF area parameters\n"
1723        "OSPF area ID in IP address format\n"
1724        "OSPF area ID as a decimal value\n"
1725        "Configure OSPF area as nssa\n"
1726        "Do not inject inter-area routes into nssa\n")
1727 {
1728   struct ospf *ospf = vty->index;
1729   struct in_addr area_id;
1730   int format;
1731
1732   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1733   ospf_area_no_summary_unset (ospf, area_id);
1734
1735   return CMD_SUCCESS;
1736 }
1737
1738 DEFUN (ospf_area_default_cost,
1739        ospf_area_default_cost_cmd,
1740        "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1741        "OSPF area parameters\n"
1742        "OSPF area ID in IP address format\n"
1743        "OSPF area ID as a decimal value\n"
1744        "Set the summary-default cost of a NSSA or stub area\n"
1745        "Stub's advertised default summary cost\n")
1746 {
1747   struct ospf *ospf = vty->index;
1748   struct ospf_area *area;
1749   struct in_addr area_id;
1750   u_int32_t cost;
1751   int format;
1752   struct prefix_ipv4 p;
1753
1754   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1755   VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1756
1757   area = ospf_area_get (ospf, area_id, format);
1758
1759   if (area->external_routing == OSPF_AREA_DEFAULT)
1760     {
1761       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1762       return CMD_WARNING;
1763     }
1764
1765   area->default_cost = cost;
1766
1767   p.family = AF_INET;
1768   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1769   p.prefixlen = 0;
1770   if (IS_DEBUG_OSPF_EVENT)
1771     zlog_debug ("ospf_abr_announce_stub_defaults(): "
1772                 "announcing 0.0.0.0/0 to area %s",
1773                inet_ntoa (area->area_id));
1774   ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1775
1776   return CMD_SUCCESS;
1777 }
1778
1779 DEFUN (no_ospf_area_default_cost,
1780        no_ospf_area_default_cost_cmd,
1781        "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1782        NO_STR
1783        "OSPF area parameters\n"
1784        "OSPF area ID in IP address format\n"
1785        "OSPF area ID as a decimal value\n"
1786        "Set the summary-default cost of a NSSA or stub area\n"
1787        "Stub's advertised default summary cost\n")
1788 {
1789   struct ospf *ospf = vty->index;
1790   struct ospf_area *area;
1791   struct in_addr area_id;
1792   int format;
1793   struct prefix_ipv4 p;
1794
1795   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1796   VTY_CHECK_INTEGER_RANGE ("stub default cost", argv[1], 0, OSPF_LS_INFINITY);
1797
1798   area = ospf_area_lookup_by_area_id (ospf, area_id);
1799   if (area == NULL)
1800     return CMD_SUCCESS;
1801
1802   if (area->external_routing == OSPF_AREA_DEFAULT)
1803     {
1804       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1805       return CMD_WARNING;
1806     }
1807
1808   area->default_cost = 1;
1809
1810   p.family = AF_INET;
1811   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1812   p.prefixlen = 0;
1813   if (IS_DEBUG_OSPF_EVENT)
1814     zlog_debug ("ospf_abr_announce_stub_defaults(): "
1815                 "announcing 0.0.0.0/0 to area %s",
1816                inet_ntoa (area->area_id));
1817   ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1818
1819
1820   ospf_area_check_free (ospf, area_id);
1821
1822   return CMD_SUCCESS;
1823 }
1824
1825 DEFUN (ospf_area_export_list,
1826        ospf_area_export_list_cmd,
1827        "area (A.B.C.D|<0-4294967295>) export-list NAME",
1828        "OSPF area parameters\n"
1829        "OSPF area ID in IP address format\n"
1830        "OSPF area ID as a decimal value\n"
1831        "Set the filter for networks announced to other areas\n"
1832        "Name of the access-list\n")
1833 {
1834   struct ospf *ospf = vty->index;
1835   struct ospf_area *area;
1836   struct in_addr area_id;
1837   int format;
1838
1839   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1840
1841   area = ospf_area_get (ospf, area_id, format);
1842   ospf_area_export_list_set (ospf, area, argv[1]);
1843
1844   return CMD_SUCCESS;
1845 }
1846
1847 DEFUN (no_ospf_area_export_list,
1848        no_ospf_area_export_list_cmd,
1849        "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1850        NO_STR
1851        "OSPF area parameters\n"
1852        "OSPF area ID in IP address format\n"
1853        "OSPF area ID as a decimal value\n"
1854        "Unset the filter for networks announced to other areas\n"
1855        "Name of the access-list\n")
1856 {
1857   struct ospf *ospf = vty->index;
1858   struct ospf_area *area;
1859   struct in_addr area_id;
1860   int format;
1861
1862   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1863
1864   area = ospf_area_lookup_by_area_id (ospf, area_id);
1865   if (area == NULL)
1866     return CMD_SUCCESS;
1867
1868   ospf_area_export_list_unset (ospf, area);
1869
1870   return CMD_SUCCESS;
1871 }
1872
1873
1874 DEFUN (ospf_area_import_list,
1875        ospf_area_import_list_cmd,
1876        "area (A.B.C.D|<0-4294967295>) import-list NAME",
1877        "OSPF area parameters\n"
1878        "OSPF area ID in IP address format\n"
1879        "OSPF area ID as a decimal value\n"
1880        "Set the filter for networks from other areas announced to the specified one\n"
1881        "Name of the access-list\n")
1882 {
1883   struct ospf *ospf = vty->index;
1884   struct ospf_area *area;
1885   struct in_addr area_id;
1886   int format;
1887
1888   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1889
1890   area = ospf_area_get (ospf, area_id, format);
1891   ospf_area_import_list_set (ospf, area, argv[1]);
1892
1893   return CMD_SUCCESS;
1894 }
1895
1896 DEFUN (no_ospf_area_import_list,
1897        no_ospf_area_import_list_cmd,
1898        "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1899        NO_STR
1900        "OSPF area parameters\n"
1901        "OSPF area ID in IP address format\n"
1902        "OSPF area ID as a decimal value\n"
1903        "Unset the filter for networks announced to other areas\n"
1904        "Name of the access-list\n")
1905 {
1906   struct ospf *ospf = vty->index;
1907   struct ospf_area *area;
1908   struct in_addr area_id;
1909   int format;
1910
1911   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1912
1913   area = ospf_area_lookup_by_area_id (ospf, area_id);
1914   if (area == NULL)
1915     return CMD_SUCCESS;
1916
1917   ospf_area_import_list_unset (ospf, area);
1918
1919   return CMD_SUCCESS;
1920 }
1921
1922 DEFUN (ospf_area_filter_list,
1923        ospf_area_filter_list_cmd,
1924        "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1925        "OSPF area parameters\n"
1926        "OSPF area ID in IP address format\n"
1927        "OSPF area ID as a decimal value\n"
1928        "Filter networks between OSPF areas\n"
1929        "Filter prefixes between OSPF areas\n"
1930        "Name of an IP prefix-list\n"
1931        "Filter networks sent to this area\n"
1932        "Filter networks sent from this area\n")
1933 {
1934   struct ospf *ospf = vty->index;
1935   struct ospf_area *area;
1936   struct in_addr area_id;
1937   struct prefix_list *plist;
1938   int format;
1939
1940   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1941
1942   area = ospf_area_get (ospf, area_id, format);
1943   plist = prefix_list_lookup (AFI_IP, argv[1]);
1944   if (strncmp (argv[2], "in", 2) == 0)
1945     {
1946       PREFIX_LIST_IN (area) = plist;
1947       if (PREFIX_NAME_IN (area))
1948         free (PREFIX_NAME_IN (area));
1949
1950       PREFIX_NAME_IN (area) = strdup (argv[1]);
1951       ospf_schedule_abr_task (ospf);
1952     }
1953   else
1954     {
1955       PREFIX_LIST_OUT (area) = plist;
1956       if (PREFIX_NAME_OUT (area))
1957         free (PREFIX_NAME_OUT (area));
1958
1959       PREFIX_NAME_OUT (area) = strdup (argv[1]);
1960       ospf_schedule_abr_task (ospf);
1961     }
1962
1963   return CMD_SUCCESS;
1964 }
1965
1966 DEFUN (no_ospf_area_filter_list,
1967        no_ospf_area_filter_list_cmd,
1968        "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1969        NO_STR
1970        "OSPF area parameters\n"
1971        "OSPF area ID in IP address format\n"
1972        "OSPF area ID as a decimal value\n"
1973        "Filter networks between OSPF areas\n"
1974        "Filter prefixes between OSPF areas\n"
1975        "Name of an IP prefix-list\n"
1976        "Filter networks sent to this area\n"
1977        "Filter networks sent from this area\n")
1978 {
1979   struct ospf *ospf = vty->index;
1980   struct ospf_area *area;
1981   struct in_addr area_id;
1982   int format;
1983
1984   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1985
1986   if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1987     return CMD_SUCCESS;
1988   
1989   if (strncmp (argv[2], "in", 2) == 0)
1990     {
1991       if (PREFIX_NAME_IN (area))
1992         if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1993           return CMD_SUCCESS;
1994
1995       PREFIX_LIST_IN (area) = NULL;
1996       if (PREFIX_NAME_IN (area))
1997         free (PREFIX_NAME_IN (area));
1998
1999       PREFIX_NAME_IN (area) = NULL;
2000
2001       ospf_schedule_abr_task (ospf);
2002     }
2003   else
2004     {
2005       if (PREFIX_NAME_OUT (area))
2006         if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
2007           return CMD_SUCCESS;
2008
2009       PREFIX_LIST_OUT (area) = NULL;
2010       if (PREFIX_NAME_OUT (area))
2011         free (PREFIX_NAME_OUT (area));
2012
2013       PREFIX_NAME_OUT (area) = NULL;
2014
2015       ospf_schedule_abr_task (ospf);
2016     }
2017
2018   return CMD_SUCCESS;
2019 }
2020
2021
2022 DEFUN (ospf_area_authentication_message_digest,
2023        ospf_area_authentication_message_digest_cmd,
2024        "area (A.B.C.D|<0-4294967295>) authentication message-digest",
2025        "OSPF area parameters\n"
2026        "OSPF area ID in IP address format\n"
2027        "OSPF area ID as a decimal value\n"
2028        "Enable authentication\n"
2029        "Use message-digest authentication\n")
2030 {
2031   struct ospf *ospf = vty->index;
2032   struct ospf_area *area;
2033   struct in_addr area_id;
2034   int format;
2035
2036   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2037
2038   area = ospf_area_get (ospf, area_id, format);
2039   area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
2040
2041   return CMD_SUCCESS;
2042 }
2043
2044 DEFUN (ospf_area_authentication,
2045        ospf_area_authentication_cmd,
2046        "area (A.B.C.D|<0-4294967295>) authentication",
2047        "OSPF area parameters\n"
2048        "OSPF area ID in IP address format\n"
2049        "OSPF area ID as a decimal value\n"
2050        "Enable authentication\n")
2051 {
2052   struct ospf *ospf = vty->index;
2053   struct ospf_area *area;
2054   struct in_addr area_id;
2055   int format;
2056
2057   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2058
2059   area = ospf_area_get (ospf, area_id, format);
2060   area->auth_type = OSPF_AUTH_SIMPLE;
2061
2062   return CMD_SUCCESS;
2063 }
2064
2065 DEFUN (no_ospf_area_authentication,
2066        no_ospf_area_authentication_cmd,
2067        "no area (A.B.C.D|<0-4294967295>) authentication",
2068        NO_STR
2069        "OSPF area parameters\n"
2070        "OSPF area ID in IP address format\n"
2071        "OSPF area ID as a decimal value\n"
2072        "Enable authentication\n")
2073 {
2074   struct ospf *ospf = vty->index;
2075   struct ospf_area *area;
2076   struct in_addr area_id;
2077   int format;
2078
2079   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2080
2081   area = ospf_area_lookup_by_area_id (ospf, area_id);
2082   if (area == NULL)
2083     return CMD_SUCCESS;
2084
2085   area->auth_type = OSPF_AUTH_NULL;
2086
2087   ospf_area_check_free (ospf, area_id);
2088   
2089   return CMD_SUCCESS;
2090 }
2091
2092
2093 DEFUN (ospf_abr_type,
2094        ospf_abr_type_cmd,
2095        "ospf abr-type (cisco|ibm|shortcut|standard)",
2096        "OSPF specific commands\n"
2097        "Set OSPF ABR type\n"
2098        "Alternative ABR, cisco implementation\n"
2099        "Alternative ABR, IBM implementation\n"
2100        "Shortcut ABR\n"
2101        "Standard behavior (RFC2328)\n")
2102 {
2103   struct ospf *ospf = vty->index;
2104   u_char abr_type = OSPF_ABR_UNKNOWN;
2105
2106   if (strncmp (argv[0], "c", 1) == 0)
2107     abr_type = OSPF_ABR_CISCO;
2108   else if (strncmp (argv[0], "i", 1) == 0)
2109     abr_type = OSPF_ABR_IBM;
2110   else if (strncmp (argv[0], "sh", 2) == 0)
2111     abr_type = OSPF_ABR_SHORTCUT;
2112   else if (strncmp (argv[0], "st", 2) == 0)
2113     abr_type = OSPF_ABR_STAND;
2114   else
2115     return CMD_WARNING;
2116
2117   /* If ABR type value is changed, schedule ABR task. */
2118   if (ospf->abr_type != abr_type)
2119     {
2120       ospf->abr_type = abr_type;
2121       ospf_schedule_abr_task (ospf);
2122     }
2123
2124   return CMD_SUCCESS;
2125 }
2126
2127 DEFUN (no_ospf_abr_type,
2128        no_ospf_abr_type_cmd,
2129        "no ospf abr-type (cisco|ibm|shortcut|standard)",
2130        NO_STR
2131        "OSPF specific commands\n"
2132        "Set OSPF ABR type\n"
2133        "Alternative ABR, cisco implementation\n"
2134        "Alternative ABR, IBM implementation\n"
2135        "Shortcut ABR\n")
2136 {
2137   struct ospf *ospf = vty->index;
2138   u_char abr_type = OSPF_ABR_UNKNOWN;
2139
2140   if (strncmp (argv[0], "c", 1) == 0)
2141     abr_type = OSPF_ABR_CISCO;
2142   else if (strncmp (argv[0], "i", 1) == 0)
2143     abr_type = OSPF_ABR_IBM;
2144   else if (strncmp (argv[0], "sh", 2) == 0)
2145     abr_type = OSPF_ABR_SHORTCUT;
2146   else if (strncmp (argv[0], "st", 2) == 0)
2147     abr_type = OSPF_ABR_STAND;
2148   else
2149     return CMD_WARNING;
2150
2151   /* If ABR type value is changed, schedule ABR task. */
2152   if (ospf->abr_type == abr_type)
2153     {
2154       ospf->abr_type = OSPF_ABR_DEFAULT;
2155       ospf_schedule_abr_task (ospf);
2156     }
2157
2158   return CMD_SUCCESS;
2159 }
2160
2161 DEFUN (ospf_log_adjacency_changes,
2162        ospf_log_adjacency_changes_cmd,
2163        "log-adjacency-changes",
2164        "Log changes in adjacency state\n")
2165 {
2166   struct ospf *ospf = vty->index;
2167
2168   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2169   return CMD_SUCCESS;
2170 }
2171
2172 DEFUN (ospf_log_adjacency_changes_detail,
2173        ospf_log_adjacency_changes_detail_cmd,
2174        "log-adjacency-changes detail",
2175        "Log changes in adjacency state\n"
2176        "Log all state changes\n")
2177 {
2178   struct ospf *ospf = vty->index;
2179
2180   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2181   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2182   return CMD_SUCCESS;
2183 }
2184
2185 DEFUN (no_ospf_log_adjacency_changes,
2186        no_ospf_log_adjacency_changes_cmd,
2187        "no log-adjacency-changes",
2188        NO_STR
2189        "Log changes in adjacency state\n")
2190 {
2191   struct ospf *ospf = vty->index;
2192
2193   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2194   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2195   return CMD_SUCCESS;
2196 }
2197
2198 DEFUN (no_ospf_log_adjacency_changes_detail,
2199        no_ospf_log_adjacency_changes_detail_cmd,
2200        "no log-adjacency-changes detail",
2201        NO_STR
2202        "Log changes in adjacency state\n"
2203        "Log all state changes\n")
2204 {
2205   struct ospf *ospf = vty->index;
2206
2207   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2208   return CMD_SUCCESS;
2209 }
2210
2211 DEFUN (ospf_compatible_rfc1583,
2212        ospf_compatible_rfc1583_cmd,
2213        "compatible rfc1583",
2214        "OSPF compatibility list\n"
2215        "compatible with RFC 1583\n")
2216 {
2217   struct ospf *ospf = vty->index;
2218
2219   if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2220     {
2221       SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
2222       ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
2223     }
2224   return CMD_SUCCESS;
2225 }
2226
2227 DEFUN (no_ospf_compatible_rfc1583,
2228        no_ospf_compatible_rfc1583_cmd,
2229        "no compatible rfc1583",
2230        NO_STR
2231        "OSPF compatibility list\n"
2232        "compatible with RFC 1583\n")
2233 {
2234   struct ospf *ospf = vty->index;
2235
2236   if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2237     {
2238       UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
2239       ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
2240     }
2241   return CMD_SUCCESS;
2242 }
2243
2244 ALIAS (ospf_compatible_rfc1583,
2245        ospf_rfc1583_flag_cmd,
2246        "ospf rfc1583compatibility",
2247        "OSPF specific commands\n"
2248        "Enable the RFC1583Compatibility flag\n")
2249
2250 ALIAS (no_ospf_compatible_rfc1583,
2251        no_ospf_rfc1583_flag_cmd,
2252        "no ospf rfc1583compatibility",
2253        NO_STR
2254        "OSPF specific commands\n"
2255        "Disable the RFC1583Compatibility flag\n")
2256
2257 static int
2258 ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2259                      unsigned int hold,
2260                      unsigned int max)
2261 {
2262   struct ospf *ospf = vty->index;
2263   
2264   ospf->spf_delay = delay;
2265   ospf->spf_holdtime = hold;
2266   ospf->spf_max_holdtime = max;
2267   
2268   return CMD_SUCCESS;
2269 }
2270
2271 DEFUN (ospf_timers_min_ls_interval,
2272        ospf_timers_min_ls_interval_cmd,
2273        "timers throttle lsa all <0-5000>",
2274        "Adjust routing timers\n"
2275        "Throttling adaptive timer\n"
2276        "LSA delay between transmissions\n"
2277        NO_STR
2278        "Delay (msec) between sending LSAs\n")
2279 {
2280   struct ospf *ospf = vty->index;
2281   unsigned int interval;
2282
2283   if (argc != 1)
2284     {
2285       vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2286       return CMD_WARNING;
2287     }
2288
2289   VTY_GET_INTEGER ("LSA interval", interval, argv[0]);
2290
2291   ospf->min_ls_interval = interval;
2292
2293   return CMD_SUCCESS;
2294 }
2295
2296 DEFUN (no_ospf_timers_min_ls_interval,
2297        no_ospf_timers_min_ls_interval_cmd,
2298        "no timers throttle lsa all",
2299        NO_STR
2300        "Adjust routing timers\n"
2301        "Throttling adaptive timer\n"
2302        "LSA delay between transmissions\n")
2303 {
2304   struct ospf *ospf = vty->index;
2305   ospf->min_ls_interval = OSPF_MIN_LS_INTERVAL;
2306
2307   return CMD_SUCCESS;
2308 }
2309
2310 DEFUN (ospf_timers_min_ls_arrival,
2311        ospf_timers_min_ls_arrival_cmd,
2312        "timers lsa arrival <0-1000>",
2313        "Adjust routing timers\n"
2314        "Throttling link state advertisement delays\n"
2315        "OSPF minimum arrival interval delay\n"
2316        "Delay (msec) between accepted LSAs\n")
2317 {
2318   struct ospf *ospf = vty->index;
2319   unsigned int arrival;
2320
2321   if (argc != 1)
2322     {
2323       vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2324       return CMD_WARNING;
2325     }
2326
2327   VTY_GET_INTEGER_RANGE ("minimum LSA inter-arrival time", arrival, argv[0], 0, 1000);
2328
2329   ospf->min_ls_arrival = arrival;
2330
2331   return CMD_SUCCESS;
2332 }
2333
2334 DEFUN (no_ospf_timers_min_ls_arrival,
2335        no_ospf_timers_min_ls_arrival_cmd,
2336        "no timers lsa arrival",
2337        NO_STR
2338        "Adjust routing timers\n"
2339        "Throttling link state advertisement delays\n"
2340        "OSPF minimum arrival interval delay\n")
2341 {
2342   struct ospf *ospf = vty->index;
2343   ospf->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
2344
2345   return CMD_SUCCESS;
2346 }
2347
2348 DEFUN (ospf_timers_throttle_spf,
2349        ospf_timers_throttle_spf_cmd,
2350        "timers throttle spf <0-600000> <0-600000> <0-600000>",
2351        "Adjust routing timers\n"
2352        "Throttling adaptive timer\n"
2353        "OSPF SPF timers\n"
2354        "Delay (msec) from first change received till SPF calculation\n"
2355        "Initial hold time (msec) between consecutive SPF calculations\n"
2356        "Maximum hold time (msec)\n")
2357 {
2358   unsigned int delay, hold, max;
2359   
2360   if (argc != 3)
2361     {
2362       vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2363       return CMD_WARNING;
2364     }
2365   
2366   VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2367   VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2368   VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2369   
2370   return ospf_timers_spf_set (vty, delay, hold, max);
2371 }
2372
2373 DEFUN_DEPRECATED (ospf_timers_spf,
2374        ospf_timers_spf_cmd,
2375        "timers spf <0-4294967295> <0-4294967295>",
2376        "Adjust routing timers\n"
2377        "OSPF SPF timers\n"
2378        "Delay (s) between receiving a change to SPF calculation\n"
2379        "Hold time (s) between consecutive SPF calculations\n")
2380 {
2381   unsigned int delay, hold;
2382   
2383   if (argc != 2)
2384     {
2385       vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2386       return CMD_WARNING;
2387     }
2388   
2389   VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2390   VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
2391   
2392   /* truncate down the second values if they're greater than 600000ms */
2393   if (delay > (600000 / 1000))
2394     delay = 600000;
2395   else if (delay == 0)
2396     /* 0s delay was probably specified because of lack of ms resolution */
2397     delay = OSPF_SPF_DELAY_DEFAULT;
2398   if (hold > (600000 / 1000))
2399     hold = 600000;
2400       
2401   return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
2402 }
2403
2404 DEFUN (no_ospf_timers_throttle_spf,
2405        no_ospf_timers_throttle_spf_cmd,
2406        "no timers throttle spf",
2407        NO_STR
2408        "Adjust routing timers\n"
2409        "Throttling adaptive timer\n"
2410        "OSPF SPF timers\n")
2411 {
2412   return ospf_timers_spf_set (vty,
2413                               OSPF_SPF_DELAY_DEFAULT,
2414                               OSPF_SPF_HOLDTIME_DEFAULT,
2415                               OSPF_SPF_MAX_HOLDTIME_DEFAULT);
2416 }
2417
2418 ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2419                   no_ospf_timers_spf_cmd,
2420                   "no timers spf",
2421                   NO_STR
2422                   "Adjust routing timers\n"
2423                   "OSPF SPF timers\n")
2424
2425 DEFUN (ospf_neighbor,
2426        ospf_neighbor_cmd,
2427        "neighbor A.B.C.D",
2428        NEIGHBOR_STR
2429        "Neighbor IP address\n")
2430 {
2431   struct ospf *ospf = vty->index;
2432   struct in_addr nbr_addr;
2433   unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2434   unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
2435
2436   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2437
2438   if (argc > 1)
2439     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2440
2441   if (argc > 2)
2442     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2443
2444   ospf_nbr_nbma_set (ospf, nbr_addr);
2445   if (argc > 1)
2446     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2447   if (argc > 2)
2448     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2449
2450   return CMD_SUCCESS;
2451 }
2452
2453 ALIAS (ospf_neighbor,
2454        ospf_neighbor_priority_poll_interval_cmd,
2455        "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2456        NEIGHBOR_STR
2457        "Neighbor IP address\n"
2458        "Neighbor Priority\n"
2459        "Priority\n"
2460        "Dead Neighbor Polling interval\n"
2461        "Seconds\n")
2462
2463 ALIAS (ospf_neighbor,
2464        ospf_neighbor_priority_cmd,
2465        "neighbor A.B.C.D priority <0-255>",
2466        NEIGHBOR_STR
2467        "Neighbor IP address\n"
2468        "Neighbor Priority\n"
2469        "Seconds\n")
2470
2471 DEFUN (ospf_neighbor_poll_interval,
2472        ospf_neighbor_poll_interval_cmd,
2473        "neighbor A.B.C.D poll-interval <1-65535>",
2474        NEIGHBOR_STR
2475        "Neighbor IP address\n"
2476        "Dead Neighbor Polling interval\n"
2477        "Seconds\n")
2478 {
2479   struct ospf *ospf = vty->index;
2480   struct in_addr nbr_addr;
2481   unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2482   unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
2483
2484   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2485
2486   if (argc > 1)
2487     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2488
2489   if (argc > 2)
2490     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2491
2492   ospf_nbr_nbma_set (ospf, nbr_addr);
2493   if (argc > 1)
2494     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2495   if (argc > 2)
2496     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2497
2498   return CMD_SUCCESS;
2499 }
2500
2501 ALIAS (ospf_neighbor_poll_interval,
2502        ospf_neighbor_poll_interval_priority_cmd,
2503        "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2504        NEIGHBOR_STR
2505        "Neighbor address\n"
2506        "OSPF dead-router polling interval\n"
2507        "Seconds\n"
2508        "OSPF priority of non-broadcast neighbor\n"
2509        "Priority\n")
2510
2511 DEFUN (no_ospf_neighbor,
2512        no_ospf_neighbor_cmd,
2513        "no neighbor A.B.C.D",
2514        NO_STR
2515        NEIGHBOR_STR
2516        "Neighbor IP address\n")
2517 {
2518   struct ospf *ospf = vty->index;
2519   struct in_addr nbr_addr;
2520
2521   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2522
2523   (void)ospf_nbr_nbma_unset (ospf, nbr_addr);
2524
2525   return CMD_SUCCESS;
2526 }
2527
2528 ALIAS (no_ospf_neighbor,
2529        no_ospf_neighbor_priority_cmd,
2530        "no neighbor A.B.C.D priority <0-255>",
2531        NO_STR
2532        NEIGHBOR_STR
2533        "Neighbor IP address\n"
2534        "Neighbor Priority\n"
2535        "Priority\n")
2536
2537 ALIAS (no_ospf_neighbor,
2538        no_ospf_neighbor_poll_interval_cmd,
2539        "no neighbor A.B.C.D poll-interval <1-65535>",
2540        NO_STR
2541        NEIGHBOR_STR
2542        "Neighbor IP address\n"
2543        "Dead Neighbor Polling interval\n"
2544        "Seconds\n")
2545
2546 ALIAS (no_ospf_neighbor,
2547        no_ospf_neighbor_priority_pollinterval_cmd,
2548        "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2549        NO_STR
2550        NEIGHBOR_STR
2551        "Neighbor IP address\n"
2552        "Neighbor Priority\n"
2553        "Priority\n"
2554        "Dead Neighbor Polling interval\n"
2555        "Seconds\n")
2556
2557
2558 DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
2559        "refresh timer <10-1800>",
2560        "Adjust refresh parameters\n"
2561        "Set refresh timer\n"
2562        "Timer value in seconds\n")
2563 {
2564   struct ospf *ospf = vty->index;
2565   unsigned int interval;
2566   
2567   VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2568   interval = (interval / 10) * 10;
2569
2570   ospf_timers_refresh_set (ospf, interval);
2571
2572   return CMD_SUCCESS;
2573 }
2574
2575 DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
2576        "no refresh timer <10-1800>",
2577        "Adjust refresh parameters\n"
2578        "Unset refresh timer\n"
2579        "Timer value in seconds\n")
2580 {
2581   struct ospf *ospf = vty->index;
2582   unsigned int interval;
2583
2584   if (argc == 1)
2585     {
2586       VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2587   
2588       if (ospf->lsa_refresh_interval != interval ||
2589           interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2590         return CMD_SUCCESS;
2591     }
2592
2593   ospf_timers_refresh_unset (ospf);
2594
2595   return CMD_SUCCESS;
2596 }
2597
2598 ALIAS (no_ospf_refresh_timer,
2599        no_ospf_refresh_timer_cmd,
2600        "no refresh timer",
2601        "Adjust refresh parameters\n"
2602        "Unset refresh timer\n")
2603
2604 DEFUN (ospf_auto_cost_reference_bandwidth,
2605        ospf_auto_cost_reference_bandwidth_cmd,
2606        "auto-cost reference-bandwidth <1-4294967>",
2607        "Calculate OSPF interface cost according to bandwidth\n"
2608        "Use reference bandwidth method to assign OSPF cost\n"
2609        "The reference bandwidth in terms of Mbits per second\n")
2610 {
2611   struct ospf *ospf = vty->index;
2612   u_int32_t refbw;
2613   struct listnode *node;
2614   struct interface *ifp;
2615
2616   refbw = strtol (argv[0], NULL, 10);
2617   if (refbw < 1 || refbw > 4294967)
2618     {
2619       vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2620       return CMD_WARNING;
2621     }
2622
2623   /* If reference bandwidth is changed. */
2624   if ((refbw * 1000) == ospf->ref_bandwidth)
2625     return CMD_SUCCESS;
2626   
2627   ospf->ref_bandwidth = refbw * 1000;
2628   for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2629     ospf_if_recalculate_output_cost (ifp);
2630   
2631   return CMD_SUCCESS;
2632 }
2633
2634 DEFUN (no_ospf_auto_cost_reference_bandwidth,
2635        no_ospf_auto_cost_reference_bandwidth_cmd,
2636        "no auto-cost reference-bandwidth",
2637        NO_STR
2638        "Calculate OSPF interface cost according to bandwidth\n"
2639        "Use reference bandwidth method to assign OSPF cost\n")
2640 {
2641   struct ospf *ospf = vty->index;
2642   struct listnode *node, *nnode;
2643   struct interface *ifp;
2644
2645   if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
2646     return CMD_SUCCESS;
2647   
2648   ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
2649   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2650   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2651
2652   for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2653     ospf_if_recalculate_output_cost (ifp);
2654       
2655   return CMD_SUCCESS;
2656 }
2657
2658 const char *ospf_abr_type_descr_str[] = 
2659 {
2660   "Unknown",
2661   "Standard (RFC2328)",
2662   "Alternative IBM",
2663   "Alternative Cisco",
2664   "Alternative Shortcut"
2665 };
2666
2667 const char *ospf_shortcut_mode_descr_str[] = 
2668 {
2669   "Default",
2670   "Enabled",
2671   "Disabled"
2672 };
2673
2674
2675
2676 static void
2677 show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2678 {
2679   /* Show Area ID. */
2680   vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2681
2682   /* Show Area type/mode. */
2683   if (OSPF_IS_AREA_BACKBONE (area))
2684     vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2685   else
2686     {
2687       if (area->external_routing == OSPF_AREA_STUB)
2688         vty_out (vty, " (Stub%s%s)",
2689                          area->no_summary ? ", no summary" : "",
2690                          area->shortcut_configured ? "; " : "");
2691
2692       else if (area->external_routing == OSPF_AREA_NSSA)
2693         vty_out (vty, " (NSSA%s%s)",
2694                  area->no_summary ? ", no summary" : "",
2695                  area->shortcut_configured ? "; " : "");
2696
2697       vty_out (vty, "%s", VTY_NEWLINE);
2698       vty_out (vty, "   Shortcutting mode: %s",
2699                ospf_shortcut_mode_descr_str[area->shortcut_configured]);
2700       vty_out (vty, ", S-bit consensus: %s%s",
2701                area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
2702     }
2703
2704   /* Show number of interfaces. */
2705   vty_out (vty, "   Number of interfaces in this area: Total: %d, "
2706            "Active: %d%s", listcount (area->oiflist),
2707            area->act_ints, VTY_NEWLINE);
2708
2709   if (area->external_routing == OSPF_AREA_NSSA)
2710     {
2711       vty_out (vty, "   It is an NSSA configuration. %s   Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
2712       if (! IS_OSPF_ABR (area->ospf))
2713         vty_out (vty, "   It is not ABR, therefore not Translator. %s",
2714                  VTY_NEWLINE);
2715       else if (area->NSSATranslatorState)
2716        {
2717          vty_out (vty, "   We are an ABR and ");
2718          if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2719            vty_out (vty, "the NSSA Elected Translator. %s", 
2720                         VTY_NEWLINE);
2721          else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2722            vty_out (vty, "always an NSSA Translator. %s",
2723                     VTY_NEWLINE);
2724        }
2725       else
2726        {
2727          vty_out (vty, "   We are an ABR, but ");
2728          if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2729            vty_out (vty, "not the NSSA Elected Translator. %s",
2730                     VTY_NEWLINE);
2731          else
2732            vty_out (vty, "never an NSSA Translator. %s", 
2733                      VTY_NEWLINE);
2734            }
2735     }
2736   /* Stub-router state for this area */
2737   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2738     {
2739       char timebuf[OSPF_TIME_DUMP_SIZE];
2740       vty_out (vty, "   Originating stub / maximum-distance Router-LSA%s",
2741                VTY_NEWLINE);
2742       if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2743         vty_out (vty, "     Administratively activated (indefinitely)%s",
2744                  VTY_NEWLINE);
2745       if (area->t_stub_router)
2746         vty_out (vty, "     Active from startup, %s remaining%s",
2747                  ospf_timer_dump (area->t_stub_router, timebuf, 
2748                                   sizeof(timebuf)), VTY_NEWLINE);
2749     }
2750   
2751   /* Show number of fully adjacent neighbors. */
2752   vty_out (vty, "   Number of fully adjacent neighbors in this area:"
2753                 " %d%s", area->full_nbrs, VTY_NEWLINE);
2754
2755   /* Show authentication type. */
2756   vty_out (vty, "   Area has ");
2757   if (area->auth_type == OSPF_AUTH_NULL)
2758     vty_out (vty, "no authentication%s", VTY_NEWLINE);
2759   else if (area->auth_type == OSPF_AUTH_SIMPLE)
2760     vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2761   else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2762     vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2763
2764   if (!OSPF_IS_AREA_BACKBONE (area))
2765     vty_out (vty, "   Number of full virtual adjacencies going through"
2766              " this area: %d%s", area->full_vls, VTY_NEWLINE);
2767
2768   /* Show SPF calculation times. */
2769   vty_out (vty, "   SPF algorithm executed %d times%s",
2770            area->spf_calculation, VTY_NEWLINE);
2771
2772   /* Show number of LSA. */
2773   vty_out (vty, "   Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
2774   vty_out (vty, "   Number of router LSA %ld. Checksum Sum 0x%08x%s",
2775            ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2776            ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2777   vty_out (vty, "   Number of network LSA %ld. Checksum Sum 0x%08x%s",
2778            ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2779            ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2780   vty_out (vty, "   Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2781            ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2782            ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2783   vty_out (vty, "   Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2784            ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2785            ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2786   vty_out (vty, "   Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2787            ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2788            ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2789   vty_out (vty, "   Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2790            ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2791            ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2792   vty_out (vty, "   Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2793            ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2794            ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2795   vty_out (vty, "%s", VTY_NEWLINE);
2796 }
2797
2798 DEFUN (show_ip_ospf,
2799        show_ip_ospf_cmd,
2800        "show ip ospf",
2801        SHOW_STR
2802        IP_STR
2803        "OSPF information\n")
2804 {
2805   struct listnode *node, *nnode;
2806   struct ospf_area * area;
2807   struct ospf *ospf;
2808   struct timeval result;
2809   char timebuf[OSPF_TIME_DUMP_SIZE];
2810
2811   /* Check OSPF is enable. */
2812   ospf = ospf_lookup ();
2813   if (ospf == NULL)
2814     {
2815       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2816       return CMD_SUCCESS;
2817     }
2818
2819   /* Show Router ID. */
2820   vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
2821            inet_ntoa (ospf->router_id),
2822            VTY_NEWLINE);
2823   
2824   /* Graceful shutdown */
2825   if (ospf->t_deferred_shutdown)
2826     vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2827              ospf_timer_dump (ospf->t_deferred_shutdown,
2828                               timebuf, sizeof (timebuf)), VTY_NEWLINE);
2829   /* Show capability. */
2830   vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2831   vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2832   vty_out (vty, " RFC1583Compatibility flag is %s%s",
2833            CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
2834            "enabled" : "disabled", VTY_NEWLINE);
2835   vty_out (vty, " OpaqueCapability flag is %s%s",
2836            CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
2837            "enabled" : "disabled",
2838            VTY_NEWLINE);
2839   
2840   /* Show stub-router configuration */
2841   if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2842       || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2843     {
2844       vty_out (vty, " Stub router advertisement is configured%s",
2845                VTY_NEWLINE);
2846       if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2847         vty_out (vty, "   Enabled for %us after start-up%s",
2848                  ospf->stub_router_startup_time, VTY_NEWLINE);
2849       if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2850         vty_out (vty, "   Enabled for %us prior to full shutdown%s",
2851                  ospf->stub_router_shutdown_time, VTY_NEWLINE);
2852     }
2853   
2854   /* Show SPF timers. */
2855   vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2856                 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2857                 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2858                 " Hold time multiplier is currently %d%s",
2859           ospf->spf_delay, VTY_NEWLINE,
2860           ospf->spf_holdtime, VTY_NEWLINE,
2861           ospf->spf_max_holdtime, VTY_NEWLINE,
2862           ospf->spf_hold_multiplier, VTY_NEWLINE);
2863   vty_out (vty, " SPF algorithm ");
2864   if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2865     {
2866       result = tv_sub (recent_relative_time (), ospf->ts_spf);
2867       vty_out (vty, "last executed %s ago%s",
2868                ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2869                VTY_NEWLINE);
2870       vty_out (vty, " Last SPF duration %s%s",
2871                ospf_timeval_dump (&ospf->ts_spf_duration, timebuf, sizeof (timebuf)),
2872                VTY_NEWLINE);
2873     }
2874   else
2875     vty_out (vty, "has not been run%s", VTY_NEWLINE);
2876   vty_out (vty, " SPF timer %s%s%s",
2877            (ospf->t_spf_calc ? "due in " : "is "),
2878            ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2879            VTY_NEWLINE);
2880   
2881   /* Show refresh parameters. */
2882   vty_out (vty, " Refresh timer %d secs%s",
2883            ospf->lsa_refresh_interval, VTY_NEWLINE);
2884            
2885   /* Show ABR/ASBR flags. */
2886   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
2887     vty_out (vty, " This router is an ABR, ABR type is: %s%s",
2888              ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
2889
2890   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
2891     vty_out (vty, " This router is an ASBR "
2892              "(injecting external routing information)%s", VTY_NEWLINE);
2893
2894   /* Show Number of AS-external-LSAs. */
2895   vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2896            ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2897            ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2898   vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2899            ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2900            ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2901   /* Show number of areas attached. */
2902   vty_out (vty, " Number of areas attached to this router: %d%s",
2903            listcount (ospf->areas), VTY_NEWLINE);
2904
2905   if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2906     {
2907       if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2908         vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2909       else
2910         vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2911     }
2912
2913   vty_out (vty, "%s",VTY_NEWLINE);
2914
2915   /* Show each area status. */
2916   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2917     show_ip_ospf_area (vty, area);
2918
2919   return CMD_SUCCESS;
2920 }
2921
2922
2923 static void
2924 show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2925                             struct interface *ifp)
2926 {
2927   int is_up;
2928   struct ospf_neighbor *nbr;
2929   struct route_node *rn;
2930
2931   /* Is interface up? */
2932   vty_out (vty, "%s is %s%s", ifp->name,
2933            ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
2934   vty_out (vty, "  ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2935            ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2936            VTY_NEWLINE);
2937
2938   /* Is interface OSPF enabled? */
2939   if (ospf_oi_count(ifp) == 0)
2940     {
2941       vty_out (vty, "  OSPF not enabled on this interface%s", VTY_NEWLINE);
2942       return;
2943     }
2944   else if (!is_up)
2945     {
2946       vty_out (vty, "  OSPF is enabled, but not running on this interface%s",
2947                VTY_NEWLINE);
2948       return;
2949     }
2950
2951   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2952     {
2953       struct ospf_interface *oi = rn->info;
2954       
2955       if (oi == NULL)
2956         continue;
2957       
2958       /* Show OSPF interface information. */
2959       vty_out (vty, "  Internet Address %s/%d,",
2960                inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2961
2962       if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2963         {
2964           struct in_addr *dest;
2965           const char *dstr;
2966           
2967           if (CONNECTED_PEER(oi->connected)
2968               || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2969             dstr = "Peer";
2970           else
2971             dstr = "Broadcast";
2972           
2973           /* For Vlinks, showing the peer address is probably more
2974            * informative than the local interface that is being used
2975            */
2976           if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2977             dest = &oi->vl_data->peer_addr;
2978           else
2979             dest = &oi->connected->destination->u.prefix4;
2980           
2981           vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2982         }
2983
2984       vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2985                VTY_NEWLINE);
2986
2987       vty_out (vty, "  MTU mismatch detection:%s%s",
2988            OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2989
2990       vty_out (vty, "  Router ID %s, Network Type %s, Cost: %d%s",
2991                inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
2992                oi->output_cost, VTY_NEWLINE);
2993
2994       vty_out (vty, "  Transmit Delay is %d sec, State %s, Priority %d%s",
2995                OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2996                PRIORITY (oi), VTY_NEWLINE);
2997
2998   /* Show DR information. */
2999       if (DR (oi).s_addr == 0)
3000         vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
3001       else
3002         {
3003           nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
3004           if (nbr == NULL)
3005             vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
3006           else
3007             {
3008               vty_out (vty, "  Designated Router (ID) %s,",
3009                        inet_ntoa (nbr->router_id));
3010               vty_out (vty, " Interface Address %s%s",
3011                        inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3012             }
3013         }
3014
3015       /* Show BDR information. */
3016       if (BDR (oi).s_addr == 0)
3017         vty_out (vty, "  No backup designated router on this network%s",
3018                  VTY_NEWLINE);
3019       else
3020         {
3021           nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
3022           if (nbr == NULL)
3023             vty_out (vty, "  No backup designated router on this network%s",
3024                      VTY_NEWLINE);
3025           else
3026             {
3027               vty_out (vty, "  Backup Designated Router (ID) %s,",
3028                        inet_ntoa (nbr->router_id));
3029               vty_out (vty, " Interface Address %s%s",
3030                        inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3031             }
3032         }
3033       
3034       /* Next network-LSA sequence number we'll use, if we're elected DR */
3035       if (oi->params && ntohl (oi->params->network_lsa_seqnum)
3036                           != OSPF_INITIAL_SEQUENCE_NUMBER)
3037         vty_out (vty, "  Saved Network-LSA sequence number 0x%x%s",
3038                  ntohl (oi->params->network_lsa_seqnum), VTY_NEWLINE);
3039       
3040       vty_out (vty, "  Multicast group memberships:");
3041       if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
3042           || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
3043         {
3044           if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
3045             vty_out (vty, " OSPFAllRouters");
3046           if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
3047             vty_out (vty, " OSPFDesignatedRouters");
3048         }
3049       else
3050         vty_out (vty, " <None>");
3051       vty_out (vty, "%s", VTY_NEWLINE);
3052
3053       vty_out (vty, "  Timer intervals configured,");
3054       vty_out (vty, " Hello ");
3055       if (OSPF_IF_PARAM (oi, fast_hello) == 0)
3056         vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
3057       else
3058         vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
3059       vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
3060                OSPF_IF_PARAM (oi, v_wait),
3061                OSPF_IF_PARAM (oi, v_wait),
3062                OSPF_IF_PARAM (oi, retransmit_interval),
3063                VTY_NEWLINE);
3064       
3065       if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
3066         {
3067           char timebuf[OSPF_TIME_DUMP_SIZE];
3068           vty_out (vty, "    Hello due in %s%s",
3069                    ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)), 
3070                    VTY_NEWLINE);
3071         }
3072       else /* passive-interface is set */
3073         vty_out (vty, "    No Hellos (Passive interface)%s", VTY_NEWLINE);
3074       
3075       vty_out (vty, "  Neighbor Count is %d, Adjacent neighbor count is %d%s",
3076                ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
3077                VTY_NEWLINE);
3078     }
3079 }
3080
3081 DEFUN (show_ip_ospf_interface,
3082        show_ip_ospf_interface_cmd,
3083        "show ip ospf interface [INTERFACE]",
3084        SHOW_STR
3085        IP_STR
3086        "OSPF information\n"
3087        "Interface information\n"
3088        "Interface name\n")
3089 {
3090   struct interface *ifp;
3091   struct ospf *ospf;
3092   struct listnode *node;
3093
3094   ospf = ospf_lookup ();
3095   if (ospf == NULL)
3096     {
3097       vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
3098       return CMD_SUCCESS;
3099     }
3100
3101   /* Show All Interfaces. */
3102   if (argc == 0)
3103     for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
3104       show_ip_ospf_interface_sub (vty, ospf, ifp);
3105   /* Interface name is specified. */
3106   else
3107     {
3108       if ((ifp = if_lookup_by_name (argv[0])) == NULL)
3109         vty_out (vty, "No such interface name%s", VTY_NEWLINE);
3110       else
3111         show_ip_ospf_interface_sub (vty, ospf, ifp);
3112     }
3113
3114   return CMD_SUCCESS;
3115 }
3116
3117 static void
3118 show_ip_ospf_neighbour_header (struct vty *vty)
3119 {
3120   vty_out (vty, "%s%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3121            VTY_NEWLINE,
3122            "Neighbor ID", "Pri", "State", "Dead Time",
3123            "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3124            VTY_NEWLINE);
3125 }
3126
3127 static void
3128 show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3129 {
3130   struct route_node *rn;
3131   struct ospf_neighbor *nbr;
3132   char msgbuf[16];
3133   char timebuf[OSPF_TIME_DUMP_SIZE];
3134
3135   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3136     if ((nbr = rn->info))
3137       /* Do not show myself. */
3138       if (nbr != oi->nbr_self)
3139         /* Down state is not shown. */
3140         if (nbr->state != NSM_Down)
3141           {
3142             ospf_nbr_state_message (nbr, msgbuf, 16);
3143
3144             if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3145               vty_out (vty, "%-15s %3d %-15s ",
3146                        "-", nbr->priority,
3147                        msgbuf);
3148             else
3149               vty_out (vty, "%-15s %3d %-15s ",
3150                        inet_ntoa (nbr->router_id), nbr->priority,
3151                        msgbuf);
3152             
3153             vty_out (vty, "%9s ",
3154                      ospf_timer_dump (nbr->t_inactivity, timebuf, 
3155                                       sizeof(timebuf)));
3156             
3157             vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
3158             vty_out (vty, "%-20s %5ld %5ld %5d%s",
3159                      IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3160                      ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3161                      VTY_NEWLINE);
3162           }
3163 }
3164
3165 DEFUN (show_ip_ospf_neighbor,
3166        show_ip_ospf_neighbor_cmd,
3167        "show ip ospf neighbor",
3168        SHOW_STR
3169        IP_STR
3170        "OSPF information\n"
3171        "Neighbor list\n")
3172 {
3173   struct ospf *ospf;
3174   struct ospf_interface *oi;
3175   struct listnode *node;
3176
3177   ospf = ospf_lookup ();
3178   if (ospf == NULL)
3179     {
3180       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3181       return CMD_SUCCESS;
3182     }
3183
3184   show_ip_ospf_neighbour_header (vty);
3185
3186   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3187     show_ip_ospf_neighbor_sub (vty, oi);
3188
3189   return CMD_SUCCESS;
3190 }
3191
3192 DEFUN (show_ip_ospf_neighbor_all,
3193        show_ip_ospf_neighbor_all_cmd,
3194        "show ip ospf neighbor all",
3195        SHOW_STR
3196        IP_STR
3197        "OSPF information\n"
3198        "Neighbor list\n"
3199        "include down status neighbor\n")
3200 {
3201   struct ospf *ospf = ospf_lookup ();
3202   struct listnode *node;
3203   struct ospf_interface *oi;
3204
3205   if (ospf == NULL)
3206     {
3207       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3208       return CMD_SUCCESS;
3209     }
3210   
3211   show_ip_ospf_neighbour_header (vty);
3212   
3213   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3214     {
3215       struct listnode *nbr_node;
3216       struct ospf_nbr_nbma *nbr_nbma;
3217
3218       show_ip_ospf_neighbor_sub (vty, oi);
3219
3220     /* print Down neighbor status */
3221     for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
3222       {
3223         if (nbr_nbma->nbr == NULL
3224             || nbr_nbma->nbr->state == NSM_Down)
3225           {
3226             vty_out (vty, "%-15s %3d %-15s %9s ",
3227                      "-", nbr_nbma->priority, "Down", "-");
3228             vty_out (vty, "%-15s %-20s %5d %5d %5d%s", 
3229                      inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3230                      0, 0, 0, VTY_NEWLINE);
3231           }
3232       }
3233     }
3234
3235   return CMD_SUCCESS;
3236 }
3237
3238 DEFUN (show_ip_ospf_neighbor_int,
3239        show_ip_ospf_neighbor_int_cmd,
3240        "show ip ospf neighbor IFNAME",
3241        SHOW_STR
3242        IP_STR
3243        "OSPF information\n"
3244        "Neighbor list\n"
3245        "Interface name\n")
3246 {
3247   struct ospf *ospf;
3248   struct interface *ifp;
3249   struct route_node *rn;
3250  
3251   ifp = if_lookup_by_name (argv[0]);
3252   if (!ifp)
3253     {
3254       vty_out (vty, "No such interface.%s", VTY_NEWLINE);
3255       return CMD_WARNING;
3256     }
3257
3258   ospf = ospf_lookup ();
3259   if (ospf == NULL)
3260     {
3261       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3262       return CMD_SUCCESS;
3263     }
3264   
3265   show_ip_ospf_neighbour_header (vty);
3266   
3267   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3268     {
3269       struct ospf_interface *oi = rn->info;
3270
3271       if (oi == NULL)
3272         continue;
3273
3274       show_ip_ospf_neighbor_sub (vty, oi);
3275     }
3276
3277   return CMD_SUCCESS;
3278 }
3279
3280 static void
3281 show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3282                                   struct ospf_nbr_nbma *nbr_nbma)
3283 {
3284   char timebuf[OSPF_TIME_DUMP_SIZE];
3285
3286   /* Show neighbor ID. */
3287   vty_out (vty, " Neighbor %s,", "-");
3288
3289   /* Show interface address. */
3290   vty_out (vty, " interface address %s%s",
3291            inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3292   /* Show Area ID. */
3293   vty_out (vty, "    In the area %s via interface %s%s",
3294            ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3295   /* Show neighbor priority and state. */
3296   vty_out (vty, "    Neighbor priority is %d, State is %s,",
3297            nbr_nbma->priority, "Down");
3298   /* Show state changes. */
3299   vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3300
3301   /* Show PollInterval */
3302   vty_out (vty, "    Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3303
3304   /* Show poll-interval timer. */
3305   vty_out (vty, "    Poll timer due in %s%s",
3306            ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3307            VTY_NEWLINE);
3308
3309   /* Show poll-interval timer thread. */
3310   vty_out (vty, "    Thread Poll Timer %s%s", 
3311            nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3312 }
3313
3314 static void
3315 show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3316                                   struct ospf_neighbor *nbr)
3317 {
3318   char timebuf[OSPF_TIME_DUMP_SIZE];
3319
3320   /* Show neighbor ID. */
3321   if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3322     vty_out (vty, " Neighbor %s,", "-");
3323   else
3324   vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3325
3326   /* Show interface address. */
3327   vty_out (vty, " interface address %s%s",
3328            inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3329   /* Show Area ID. */
3330   vty_out (vty, "    In the area %s via interface %s%s",
3331            ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3332   /* Show neighbor priority and state. */
3333   vty_out (vty, "    Neighbor priority is %d, State is %s,",
3334            nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3335   /* Show state changes. */
3336   vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
3337   if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
3338     {
3339       struct timeval res
3340         = tv_sub (recent_relative_time (), nbr->ts_last_progress);
3341       vty_out (vty, "    Most recent state change statistics:%s",
3342                VTY_NEWLINE);
3343       vty_out (vty, "      Progressive change %s ago%s",
3344                ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3345                VTY_NEWLINE);
3346     }
3347   if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3348     {
3349       struct timeval res
3350         = tv_sub (recent_relative_time (), nbr->ts_last_regress);
3351       vty_out (vty, "      Regressive change %s ago, due to %s%s",
3352                ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3353                (nbr->last_regress_str ? nbr->last_regress_str : "??"),
3354                VTY_NEWLINE);
3355     }
3356   /* Show Designated Rotuer ID. */
3357   vty_out (vty, "    DR is %s,", inet_ntoa (nbr->d_router));
3358   /* Show Backup Designated Rotuer ID. */
3359   vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3360   /* Show options. */
3361   vty_out (vty, "    Options %d %s%s", nbr->options,
3362            ospf_options_dump (nbr->options), VTY_NEWLINE);
3363   /* Show Router Dead interval timer. */
3364   vty_out (vty, "    Dead timer due in %s%s",
3365            ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3366            VTY_NEWLINE);
3367   /* Show Database Summary list. */
3368   vty_out (vty, "    Database Summary List %d%s",
3369            ospf_db_summary_count (nbr), VTY_NEWLINE);
3370   /* Show Link State Request list. */
3371   vty_out (vty, "    Link State Request List %ld%s",
3372            ospf_ls_request_count (nbr), VTY_NEWLINE);
3373   /* Show Link State Retransmission list. */
3374   vty_out (vty, "    Link State Retransmission List %ld%s",
3375            ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3376   /* Show inactivity timer thread. */
3377   vty_out (vty, "    Thread Inactivity Timer %s%s", 
3378            nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3379   /* Show Database Description retransmission thread. */
3380   vty_out (vty, "    Thread Database Description Retransmision %s%s",
3381            nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3382   /* Show Link State Request Retransmission thread. */
3383   vty_out (vty, "    Thread Link State Request Retransmission %s%s",
3384            nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3385   /* Show Link State Update Retransmission thread. */
3386   vty_out (vty, "    Thread Link State Update Retransmission %s%s%s",
3387            nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3388 }
3389
3390 DEFUN (show_ip_ospf_neighbor_id,
3391        show_ip_ospf_neighbor_id_cmd,
3392        "show ip ospf neighbor A.B.C.D",
3393        SHOW_STR
3394        IP_STR
3395        "OSPF information\n"
3396        "Neighbor list\n"
3397        "Neighbor ID\n")
3398 {
3399   struct ospf *ospf;
3400   struct listnode *node;
3401   struct ospf_neighbor *nbr;
3402   struct ospf_interface *oi;
3403   struct in_addr router_id;
3404   int ret;
3405
3406   ret = inet_aton (argv[0], &router_id);
3407   if (!ret)
3408     {
3409       vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3410       return CMD_WARNING;
3411     }
3412
3413   ospf = ospf_lookup ();
3414   if (ospf == NULL)
3415     {
3416       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3417       return CMD_SUCCESS;
3418     }
3419
3420   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3421     if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
3422       show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3423
3424   return CMD_SUCCESS;
3425 }
3426
3427 DEFUN (show_ip_ospf_neighbor_detail,
3428        show_ip_ospf_neighbor_detail_cmd,
3429        "show ip ospf neighbor detail",
3430        SHOW_STR
3431        IP_STR
3432        "OSPF information\n"
3433        "Neighbor list\n"
3434        "detail of all neighbors\n")
3435 {
3436   struct ospf *ospf;
3437   struct ospf_interface *oi;
3438   struct listnode *node;
3439
3440   ospf = ospf_lookup ();
3441   if (ospf == NULL)
3442     {
3443       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3444       return CMD_SUCCESS;
3445     }
3446
3447   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3448     {
3449       struct route_node *rn;
3450       struct ospf_neighbor *nbr;
3451
3452       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3453         if ((nbr = rn->info))
3454           if (nbr != oi->nbr_self)
3455             if (nbr->state != NSM_Down)
3456               show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3457     }
3458
3459   return CMD_SUCCESS;
3460 }
3461
3462 DEFUN (show_ip_ospf_neighbor_detail_all,
3463        show_ip_ospf_neighbor_detail_all_cmd,
3464        "show ip ospf neighbor detail all",
3465        SHOW_STR
3466        IP_STR
3467        "OSPF information\n"
3468        "Neighbor list\n"
3469        "detail of all neighbors\n"
3470        "include down status neighbor\n")
3471 {
3472   struct ospf *ospf;
3473   struct listnode *node;
3474   struct ospf_interface *oi;
3475
3476   ospf = ospf_lookup ();
3477   if (ospf == NULL)
3478     {
3479       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3480       return CMD_SUCCESS;
3481     }
3482
3483   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3484     {
3485       struct route_node *rn;
3486       struct ospf_neighbor *nbr;
3487       struct ospf_nbr_nbma *nbr_nbma;
3488
3489       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3490         if ((nbr = rn->info))
3491           if (nbr != oi->nbr_self)
3492             if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3493               show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3494
3495       if (oi->type == OSPF_IFTYPE_NBMA)
3496         {
3497           struct listnode *nd;
3498
3499           for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3500             if (nbr_nbma->nbr == NULL
3501                 || nbr_nbma->nbr->state == NSM_Down)
3502               show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
3503         }
3504     }
3505
3506   return CMD_SUCCESS;
3507 }
3508
3509 DEFUN (show_ip_ospf_neighbor_int_detail,
3510        show_ip_ospf_neighbor_int_detail_cmd,
3511        "show ip ospf neighbor IFNAME detail",
3512        SHOW_STR
3513        IP_STR
3514        "OSPF information\n"
3515        "Neighbor list\n"
3516        "Interface name\n"
3517        "detail of all neighbors")
3518 {
3519   struct ospf *ospf;
3520   struct ospf_interface *oi;
3521   struct interface *ifp;
3522   struct route_node *rn, *nrn;
3523   struct ospf_neighbor *nbr;
3524
3525   ifp = if_lookup_by_name (argv[0]);
3526   if (!ifp)
3527     {
3528       vty_out (vty, "No such interface.%s", VTY_NEWLINE);
3529       return CMD_WARNING;
3530     }
3531
3532   ospf = ospf_lookup ();
3533   if (ospf == NULL)
3534     {
3535       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3536       return CMD_SUCCESS;
3537     }
3538
3539
3540   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3541     if ((oi = rn->info))
3542       for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3543         if ((nbr = nrn->info))
3544           if (nbr != oi->nbr_self)
3545             if (nbr->state != NSM_Down)
3546               show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3547
3548   return CMD_SUCCESS;
3549 }
3550
3551
3552 /* Show functions */
3553 static int
3554 show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
3555 {
3556   struct router_lsa *rl;
3557   struct summary_lsa *sl;
3558   struct as_external_lsa *asel;
3559   struct prefix_ipv4 p;
3560
3561   if (lsa != NULL)
3562     /* If self option is set, check LSA self flag. */
3563     if (self == 0 || IS_LSA_SELF (lsa))
3564       {
3565         /* LSA common part show. */
3566         vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3567         vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3568                  inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3569                  (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3570         /* LSA specific part show. */
3571         switch (lsa->data->type)
3572           {
3573           case OSPF_ROUTER_LSA:
3574             rl = (struct router_lsa *) lsa->data;
3575             vty_out (vty, " %-d", ntohs (rl->links));
3576             break;
3577           case OSPF_SUMMARY_LSA:
3578             sl = (struct summary_lsa *) lsa->data;
3579
3580             p.family = AF_INET;
3581             p.prefix = sl->header.id;
3582             p.prefixlen = ip_masklen (sl->mask);
3583             apply_mask_ipv4 (&p);
3584
3585             vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3586             break;
3587           case OSPF_AS_EXTERNAL_LSA:
3588           case OSPF_AS_NSSA_LSA:
3589             asel = (struct as_external_lsa *) lsa->data;
3590
3591             p.family = AF_INET;
3592             p.prefix = asel->header.id;
3593             p.prefixlen = ip_masklen (asel->mask);
3594             apply_mask_ipv4 (&p);
3595
3596             vty_out (vty, " %s %s/%d [0x%lx]",
3597                      IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3598                      inet_ntoa (p.prefix), p.prefixlen,
3599                      (u_long)ntohl (asel->e[0].route_tag));
3600             break;
3601           case OSPF_NETWORK_LSA:
3602           case OSPF_ASBR_SUMMARY_LSA:
3603           case OSPF_OPAQUE_LINK_LSA:
3604           case OSPF_OPAQUE_AREA_LSA:
3605           case OSPF_OPAQUE_AS_LSA:
3606           default:
3607             break;
3608           }
3609         vty_out (vty, VTY_NEWLINE);
3610       }
3611
3612   return 0;
3613 }
3614
3615 static const char *show_database_desc[] =
3616 {
3617   "unknown",
3618   "Router Link States",
3619   "Net Link States",
3620   "Summary Link States",
3621   "ASBR-Summary Link States",
3622   "AS External Link States",
3623   "Group Membership LSA",
3624   "NSSA-external Link States",
3625   "Type-8 LSA",
3626   "Link-Local Opaque-LSA",
3627   "Area-Local Opaque-LSA",
3628   "AS-external Opaque-LSA",
3629 };
3630
3631 static const char *show_database_header[] =
3632 {
3633   "",
3634   "Link ID         ADV Router      Age  Seq#       CkSum  Link count",
3635   "Link ID         ADV Router      Age  Seq#       CkSum",
3636   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
3637   "Link ID         ADV Router      Age  Seq#       CkSum",
3638   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
3639   " --- header for Group Member ----",
3640   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
3641   " --- type-8 ---",
3642   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
3643   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
3644   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
3645 };
3646
3647 static void
3648 show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3649 {
3650   struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
3651   
3652   vty_out (vty, "  LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
3653   vty_out (vty, "  Options: 0x%-2x : %s%s", 
3654            lsa->data->options,
3655            ospf_options_dump(lsa->data->options), 
3656            VTY_NEWLINE);
3657   vty_out (vty, "  LS Flags: 0x%-2x %s%s",
3658            lsa->flags,
3659            ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3660            VTY_NEWLINE);
3661
3662   if (lsa->data->type == OSPF_ROUTER_LSA)
3663     {
3664       vty_out (vty, "  Flags: 0x%x" , rlsa->flags);
3665
3666       if (rlsa->flags)
3667         vty_out (vty, " :%s%s%s%s",
3668                  IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3669                  IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3670                  IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3671                  IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3672
3673       vty_out (vty, "%s", VTY_NEWLINE);
3674     }
3675   vty_out (vty, "  LS Type: %s%s",
3676            LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3677   vty_out (vty, "  Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3678            LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3679   vty_out (vty, "  Advertising Router: %s%s",
3680            inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3681   vty_out (vty, "  LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3682            VTY_NEWLINE);
3683   vty_out (vty, "  Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3684            VTY_NEWLINE);
3685   vty_out (vty, "  Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3686 }
3687
3688 const char *link_type_desc[] =
3689 {
3690   "(null)",
3691   "another Router (point-to-point)",
3692   "a Transit Network",
3693   "Stub Network",
3694   "a Virtual Link",
3695 };
3696
3697 const char *link_id_desc[] =
3698 {
3699   "(null)",
3700   "Neighboring Router ID",
3701   "Designated Router address",
3702   "Net",
3703   "Neighboring Router ID",
3704 };
3705
3706 const char *link_data_desc[] =
3707 {
3708   "(null)",
3709   "Router Interface address",
3710   "Router Interface address",
3711   "Network Mask",
3712   "Router Interface address",
3713 };
3714
3715 /* Show router-LSA each Link information. */
3716 static void
3717 show_ip_ospf_database_router_links (struct vty *vty,
3718                                     struct router_lsa *rl)
3719 {
3720   int len, type;
3721   unsigned int i;
3722
3723   len = ntohs (rl->header.length) - 4;
3724   for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3725     {
3726       type = rl->link[i].type;
3727
3728       vty_out (vty, "    Link connected to: %s%s",
3729                link_type_desc[type], VTY_NEWLINE);
3730       vty_out (vty, "     (Link ID) %s: %s%s", link_id_desc[type],
3731                inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3732       vty_out (vty, "     (Link Data) %s: %s%s", link_data_desc[type],
3733                inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3734       vty_out (vty, "      Number of TOS metrics: 0%s", VTY_NEWLINE);
3735       vty_out (vty, "       TOS 0 Metric: %d%s",
3736                ntohs (rl->link[i].metric), VTY_NEWLINE);
3737       vty_out (vty, "%s", VTY_NEWLINE);
3738     }
3739 }
3740
3741 /* Show router-LSA detail information. */
3742 static int
3743 show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3744 {
3745   if (lsa != NULL)
3746     {
3747       struct router_lsa *rl = (struct router_lsa *) lsa->data;
3748
3749       show_ip_ospf_database_header (vty, lsa);
3750           
3751       vty_out (vty, "   Number of Links: %d%s%s", ntohs (rl->links),
3752                VTY_NEWLINE, VTY_NEWLINE);
3753
3754       show_ip_ospf_database_router_links (vty, rl);
3755       vty_out (vty, "%s", VTY_NEWLINE);
3756     }
3757
3758   return 0;
3759 }
3760
3761 /* Show network-LSA detail information. */
3762 static int
3763 show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3764 {
3765   int length, i;
3766
3767   if (lsa != NULL)
3768     {
3769       struct network_lsa *nl = (struct network_lsa *) lsa->data;
3770
3771       show_ip_ospf_database_header (vty, lsa);
3772
3773       vty_out (vty, "  Network Mask: /%d%s",
3774                ip_masklen (nl->mask), VTY_NEWLINE);
3775
3776       length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3777
3778       for (i = 0; length > 0; i++, length -= 4)
3779         vty_out (vty, "        Attached Router: %s%s",
3780                  inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3781
3782       vty_out (vty, "%s", VTY_NEWLINE);
3783     }
3784
3785   return 0;
3786 }
3787
3788 /* Show summary-LSA detail information. */
3789 static int
3790 show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3791 {
3792   if (lsa != NULL)
3793     {
3794       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3795
3796       show_ip_ospf_database_header (vty, lsa);
3797
3798       vty_out (vty, "  Network Mask: /%d%s", ip_masklen (sl->mask),
3799                VTY_NEWLINE);
3800       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
3801                VTY_NEWLINE);
3802           vty_out (vty, "%s", VTY_NEWLINE);
3803     }
3804
3805   return 0;
3806 }
3807
3808 /* Show summary-ASBR-LSA detail information. */
3809 static int
3810 show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3811 {
3812   if (lsa != NULL)
3813     {
3814       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3815
3816       show_ip_ospf_database_header (vty, lsa);
3817
3818       vty_out (vty, "  Network Mask: /%d%s",
3819                ip_masklen (sl->mask), VTY_NEWLINE);
3820       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
3821                VTY_NEWLINE);
3822           vty_out (vty, "%s", VTY_NEWLINE);
3823     }
3824
3825   return 0;
3826 }
3827
3828 /* Show AS-external-LSA detail information. */
3829 static int
3830 show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3831 {
3832   if (lsa != NULL)
3833     {
3834       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3835
3836       show_ip_ospf_database_header (vty, lsa);
3837
3838       vty_out (vty, "  Network Mask: /%d%s",
3839                ip_masklen (al->mask), VTY_NEWLINE);
3840       vty_out (vty, "        Metric Type: %s%s",
3841                IS_EXTERNAL_METRIC (al->e[0].tos) ?
3842                "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3843       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
3844       vty_out (vty, "        Metric: %d%s",
3845                GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3846       vty_out (vty, "        Forward Address: %s%s",
3847                inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3848
3849       vty_out (vty, "        External Route Tag: %lu%s%s",
3850                (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3851     }
3852
3853   return 0;
3854 }
3855
3856 #if 0
3857 static int
3858 show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3859 {
3860   struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3861
3862   /* show_ip_ospf_database_header (vty, lsa); */
3863
3864   zlog_debug( "  Network Mask: /%d%s",
3865              ip_masklen (al->mask), "\n");
3866   zlog_debug( "        Metric Type: %s%s",
3867              IS_EXTERNAL_METRIC (al->e[0].tos) ?
3868              "2 (Larger than any link state path)" : "1", "\n");
3869   zlog_debug( "        TOS: 0%s", "\n");
3870   zlog_debug( "        Metric: %d%s",
3871              GET_METRIC (al->e[0].metric), "\n");
3872   zlog_debug( "        Forward Address: %s%s",
3873              inet_ntoa (al->e[0].fwd_addr), "\n");
3874
3875   zlog_debug( "        External Route Tag: %lu%s%s",
3876              (u_long)ntohl (al->e[0].route_tag), "\n", "\n");
3877
3878   return 0;
3879 }
3880 #endif
3881
3882 /* Show AS-NSSA-LSA detail information. */
3883 static int
3884 show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3885 {
3886   if (lsa != NULL)
3887     {
3888       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3889
3890       show_ip_ospf_database_header (vty, lsa);
3891
3892       vty_out (vty, "  Network Mask: /%d%s",
3893                ip_masklen (al->mask), VTY_NEWLINE);
3894       vty_out (vty, "        Metric Type: %s%s",
3895                IS_EXTERNAL_METRIC (al->e[0].tos) ?
3896                "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3897       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
3898       vty_out (vty, "        Metric: %d%s",
3899                GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3900       vty_out (vty, "        NSSA: Forward Address: %s%s",
3901                inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3902
3903       vty_out (vty, "        External Route Tag: %lu%s%s",
3904                (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3905     }
3906
3907   return 0;
3908 }
3909
3910 static int
3911 show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3912 {
3913   return 0;
3914 }
3915
3916 static int
3917 show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3918 {
3919   if (lsa != NULL)
3920     {
3921       show_ip_ospf_database_header (vty, lsa);
3922       show_opaque_info_detail (vty, lsa);
3923
3924       vty_out (vty, "%s", VTY_NEWLINE);
3925     }
3926   return 0;
3927 }
3928
3929 int (*show_function[])(struct vty *, struct ospf_lsa *) =
3930 {
3931   NULL,
3932   show_router_lsa_detail,
3933   show_network_lsa_detail,
3934   show_summary_lsa_detail,
3935   show_summary_asbr_lsa_detail,
3936   show_as_external_lsa_detail,
3937   show_func_dummy,
3938   show_as_nssa_lsa_detail,  /* almost same as external */
3939   NULL,                         /* type-8 */
3940   show_opaque_lsa_detail,
3941   show_opaque_lsa_detail,
3942   show_opaque_lsa_detail,
3943 };
3944
3945 static void
3946 show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3947                      struct in_addr *adv_router)
3948 {
3949   memset (lp, 0, sizeof (struct prefix_ls));
3950   lp->family = 0;
3951   if (id == NULL)
3952     lp->prefixlen = 0;
3953   else if (adv_router == NULL)
3954     {
3955       lp->prefixlen = 32;
3956       lp->id = *id;
3957     }
3958   else
3959     {
3960       lp->prefixlen = 64;
3961       lp->id = *id;
3962       lp->adv_router = *adv_router;
3963     }
3964 }
3965
3966 static void
3967 show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3968                       struct in_addr *id, struct in_addr *adv_router)
3969 {
3970   struct prefix_ls lp;
3971   struct route_node *rn, *start;
3972   struct ospf_lsa *lsa;
3973
3974   show_lsa_prefix_set (vty, &lp, id, adv_router);
3975   start = route_node_get (rt, (struct prefix *) &lp);
3976   if (start)
3977     {
3978       route_lock_node (start);
3979       for (rn = start; rn; rn = route_next_until (rn, start))
3980         if ((lsa = rn->info))
3981           {
3982             if (show_function[lsa->data->type] != NULL)
3983               show_function[lsa->data->type] (vty, lsa);
3984           }
3985       route_unlock_node (start);
3986     }
3987 }
3988
3989 /* Show detail LSA information
3990    -- if id is NULL then show all LSAs. */
3991 static void
3992 show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
3993                  struct in_addr *id, struct in_addr *adv_router)
3994 {
3995   struct listnode *node;
3996   struct ospf_area *area;
3997   
3998   switch (type)
3999     {
4000     case OSPF_AS_EXTERNAL_LSA:
4001     case OSPF_OPAQUE_AS_LSA:
4002       vty_out (vty, "                %s %s%s",
4003                show_database_desc[type],
4004                VTY_NEWLINE, VTY_NEWLINE);
4005       show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
4006       break;
4007     default:
4008       for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
4009         {
4010           vty_out (vty, "%s                %s (Area %s)%s%s",
4011                    VTY_NEWLINE, show_database_desc[type],
4012                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
4013           show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
4014         }
4015       break;
4016     }
4017 }
4018
4019 static void
4020 show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
4021                                  struct in_addr *adv_router)
4022 {
4023   struct route_node *rn;
4024   struct ospf_lsa *lsa;
4025
4026   for (rn = route_top (rt); rn; rn = route_next (rn))
4027     if ((lsa = rn->info))
4028       if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
4029         {
4030           if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
4031             continue;
4032           if (show_function[lsa->data->type] != NULL)
4033             show_function[lsa->data->type] (vty, lsa);
4034         }
4035 }
4036
4037 /* Show detail LSA information. */
4038 static void
4039 show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
4040                             struct in_addr *adv_router)
4041 {
4042   struct listnode *node;
4043   struct ospf_area *area;
4044
4045   switch (type)
4046     {
4047     case OSPF_AS_EXTERNAL_LSA:
4048     case OSPF_OPAQUE_AS_LSA:
4049       vty_out (vty, "                %s %s%s",
4050                show_database_desc[type],
4051                VTY_NEWLINE, VTY_NEWLINE);
4052       show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
4053                                        adv_router);
4054       break;
4055     default:
4056       for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
4057         {
4058           vty_out (vty, "%s                %s (Area %s)%s%s",
4059                    VTY_NEWLINE, show_database_desc[type],
4060                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
4061           show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
4062                                            adv_router);
4063         }
4064       break;
4065     }
4066 }
4067
4068 static void
4069 show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
4070 {
4071   struct ospf_lsa *lsa;
4072   struct route_node *rn;
4073   struct ospf_area *area;
4074   struct listnode *node;
4075   int type;
4076
4077   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
4078     {
4079       for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4080         {
4081           switch (type)
4082             {
4083             case OSPF_AS_EXTERNAL_LSA:
4084             case OSPF_OPAQUE_AS_LSA:
4085               continue;
4086             default:
4087               break;
4088             }
4089           if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
4090               (!self && ospf_lsdb_count (area->lsdb, type) > 0))
4091             {
4092               vty_out (vty, "                %s (Area %s)%s%s",
4093                        show_database_desc[type],
4094                        ospf_area_desc_string (area),
4095                        VTY_NEWLINE, VTY_NEWLINE);
4096               vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
4097
4098               LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
4099                 show_lsa_summary (vty, lsa, self);
4100
4101               vty_out (vty, "%s", VTY_NEWLINE);
4102           }
4103         }
4104     }
4105
4106   for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4107     {
4108       switch (type)
4109         {
4110           case OSPF_AS_EXTERNAL_LSA:
4111           case OSPF_OPAQUE_AS_LSA:
4112             break;
4113           default:
4114             continue;
4115         }
4116       if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4117          (!self && ospf_lsdb_count (ospf->lsdb, type)))
4118         {
4119           vty_out (vty, "                %s%s%s",
4120                show_database_desc[type],
4121                VTY_NEWLINE, VTY_NEWLINE);
4122           vty_out (vty, "%s%s", show_database_header[type],
4123                VTY_NEWLINE);
4124
4125           LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4126             show_lsa_summary (vty, lsa, self);
4127
4128           vty_out (vty, "%s", VTY_NEWLINE);
4129         }
4130     }
4131
4132   vty_out (vty, "%s", VTY_NEWLINE);
4133 }
4134
4135 static void
4136 show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
4137 {
4138   struct route_node *rn;
4139
4140   vty_out (vty, "%s                MaxAge Link States:%s%s",
4141            VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4142
4143   for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
4144     {
4145       struct ospf_lsa *lsa;
4146
4147       if ((lsa = rn->info) != NULL)
4148         {
4149           vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4150           vty_out (vty, "Link State ID: %s%s",
4151                    inet_ntoa (lsa->data->id), VTY_NEWLINE);
4152           vty_out (vty, "Advertising Router: %s%s",
4153                    inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4154           vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4155           vty_out (vty, "%s", VTY_NEWLINE);
4156         }
4157     }
4158 }
4159
4160 #define OSPF_LSA_TYPE_NSSA_DESC      "NSSA external link state\n"
4161 #define OSPF_LSA_TYPE_NSSA_CMD_STR   "|nssa-external"
4162
4163 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4164 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4165 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC   "Link AS Opaque-LSA\n"
4166 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR   "|opaque-link|opaque-area|opaque-as"
4167
4168 #define OSPF_LSA_TYPES_CMD_STR                                                \
4169     "asbr-summary|external|network|router|summary"                            \
4170     OSPF_LSA_TYPE_NSSA_CMD_STR                                                \
4171     OSPF_LSA_TYPE_OPAQUE_CMD_STR
4172
4173 #define OSPF_LSA_TYPES_DESC                                                   \
4174    "ASBR summary link states\n"                                               \
4175    "External link states\n"                                                   \
4176    "Network link states\n"                                                    \
4177    "Router link states\n"                                                     \
4178    "Network summary link states\n"                                            \
4179    OSPF_LSA_TYPE_NSSA_DESC                                                    \
4180    OSPF_LSA_TYPE_OPAQUE_LINK_DESC                                             \
4181    OSPF_LSA_TYPE_OPAQUE_AREA_DESC                                             \
4182    OSPF_LSA_TYPE_OPAQUE_AS_DESC     
4183
4184 DEFUN (show_ip_ospf_database,
4185        show_ip_ospf_database_cmd,
4186        "show ip ospf database",
4187        SHOW_STR
4188        IP_STR
4189        "OSPF information\n"
4190        "Database summary\n")
4191 {
4192   struct ospf *ospf;
4193   int type, ret;
4194   struct in_addr id, adv_router;
4195
4196   ospf = ospf_lookup ();
4197   if (ospf == NULL)
4198     {
4199       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4200       return CMD_SUCCESS;
4201     }
4202
4203   vty_out (vty, "%s       OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
4204            inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
4205
4206   /* Show all LSA. */
4207   if (argc == 0)
4208     {
4209       show_ip_ospf_database_summary (vty, ospf, 0);
4210       return CMD_SUCCESS;
4211     }
4212
4213   /* Set database type to show. */
4214   if (strncmp (argv[0], "r", 1) == 0)
4215     type = OSPF_ROUTER_LSA;
4216   else if (strncmp (argv[0], "ne", 2) == 0)
4217     type = OSPF_NETWORK_LSA;
4218   else if (strncmp (argv[0], "ns", 2) == 0)
4219     type = OSPF_AS_NSSA_LSA;
4220   else if (strncmp (argv[0], "su", 2) == 0)
4221     type = OSPF_SUMMARY_LSA;
4222   else if (strncmp (argv[0], "a", 1) == 0)
4223     type = OSPF_ASBR_SUMMARY_LSA;
4224   else if (strncmp (argv[0], "e", 1) == 0)
4225     type = OSPF_AS_EXTERNAL_LSA;
4226   else if (strncmp (argv[0], "se", 2) == 0)
4227     {
4228       show_ip_ospf_database_summary (vty, ospf, 1);
4229       return CMD_SUCCESS;
4230     }
4231   else if (strncmp (argv[0], "m", 1) == 0)
4232     {
4233       show_ip_ospf_database_maxage (vty, ospf);
4234       return CMD_SUCCESS;
4235     }
4236   else if (strncmp (argv[0], "opaque-l", 8) == 0)
4237     type = OSPF_OPAQUE_LINK_LSA;
4238   else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4239     type = OSPF_OPAQUE_AREA_LSA;
4240   else if (strncmp (argv[0], "opaque-as", 9) == 0)
4241     type = OSPF_OPAQUE_AS_LSA;
4242   else
4243     return CMD_WARNING;
4244
4245   /* `show ip ospf database LSA'. */
4246   if (argc == 1)
4247     show_lsa_detail (vty, ospf, type, NULL, NULL);
4248   else if (argc >= 2)
4249     {
4250       ret = inet_aton (argv[1], &id);
4251       if (!ret)
4252         return CMD_WARNING;
4253       
4254       /* `show ip ospf database LSA ID'. */
4255       if (argc == 2)
4256         show_lsa_detail (vty, ospf, type, &id, NULL);
4257       /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4258       else if (argc == 3)
4259         {
4260           if (strncmp (argv[2], "s", 1) == 0)
4261             adv_router = ospf->router_id;
4262           else
4263             {
4264               ret = inet_aton (argv[2], &adv_router);
4265               if (!ret)
4266                 return CMD_WARNING;
4267             }
4268           show_lsa_detail (vty, ospf, type, &id, &adv_router);
4269         }
4270     }
4271
4272   return CMD_SUCCESS;
4273 }
4274
4275 ALIAS (show_ip_ospf_database,
4276        show_ip_ospf_database_type_cmd,
4277        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4278        SHOW_STR
4279        IP_STR
4280        "OSPF information\n"
4281        "Database summary\n"
4282        OSPF_LSA_TYPES_DESC
4283        "LSAs in MaxAge list\n"
4284        "Self-originated link states\n")
4285
4286 ALIAS (show_ip_ospf_database,
4287        show_ip_ospf_database_type_id_cmd,
4288        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4289        SHOW_STR
4290        IP_STR
4291        "OSPF information\n"
4292        "Database summary\n"
4293        OSPF_LSA_TYPES_DESC
4294        "Link State ID (as an IP address)\n")
4295
4296 ALIAS (show_ip_ospf_database,
4297        show_ip_ospf_database_type_id_adv_router_cmd,
4298        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4299        SHOW_STR
4300        IP_STR
4301        "OSPF information\n"
4302        "Database summary\n"
4303        OSPF_LSA_TYPES_DESC
4304        "Link State ID (as an IP address)\n"
4305        "Advertising Router link states\n"
4306        "Advertising Router (as an IP address)\n")
4307
4308 ALIAS (show_ip_ospf_database,
4309        show_ip_ospf_database_type_id_self_cmd,
4310        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4311        SHOW_STR
4312        IP_STR
4313        "OSPF information\n"
4314        "Database summary\n"
4315        OSPF_LSA_TYPES_DESC
4316        "Link State ID (as an IP address)\n"
4317        "Self-originated link states\n"
4318        "\n")
4319
4320 DEFUN (show_ip_ospf_database_type_adv_router,
4321        show_ip_ospf_database_type_adv_router_cmd,
4322        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4323        SHOW_STR
4324        IP_STR
4325        "OSPF information\n"
4326        "Database summary\n"
4327        OSPF_LSA_TYPES_DESC
4328        "Advertising Router link states\n"
4329        "Advertising Router (as an IP address)\n")
4330 {
4331   struct ospf *ospf;
4332   int type, ret;
4333   struct in_addr adv_router;
4334
4335   ospf = ospf_lookup ();
4336   if (ospf == NULL)
4337     {
4338       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4339       return CMD_SUCCESS;
4340     }
4341
4342   vty_out (vty, "%s       OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
4343            inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
4344
4345   if (argc != 2)
4346     return CMD_WARNING;
4347
4348   /* Set database type to show. */
4349   if (strncmp (argv[0], "r", 1) == 0)
4350     type = OSPF_ROUTER_LSA;
4351   else if (strncmp (argv[0], "ne", 2) == 0)
4352     type = OSPF_NETWORK_LSA;
4353   else if (strncmp (argv[0], "ns", 2) == 0)
4354     type = OSPF_AS_NSSA_LSA;
4355   else if (strncmp (argv[0], "s", 1) == 0)
4356     type = OSPF_SUMMARY_LSA;
4357   else if (strncmp (argv[0], "a", 1) == 0)
4358     type = OSPF_ASBR_SUMMARY_LSA;
4359   else if (strncmp (argv[0], "e", 1) == 0)
4360     type = OSPF_AS_EXTERNAL_LSA;
4361   else if (strncmp (argv[0], "opaque-l", 8) == 0)
4362     type = OSPF_OPAQUE_LINK_LSA;
4363   else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4364     type = OSPF_OPAQUE_AREA_LSA;
4365   else if (strncmp (argv[0], "opaque-as", 9) == 0)
4366     type = OSPF_OPAQUE_AS_LSA;
4367   else
4368     return CMD_WARNING;
4369
4370   /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4371   if (strncmp (argv[1], "s", 1) == 0)
4372     adv_router = ospf->router_id;
4373   else
4374     {
4375       ret = inet_aton (argv[1], &adv_router);
4376       if (!ret)
4377         return CMD_WARNING;
4378     }
4379
4380   show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
4381
4382   return CMD_SUCCESS;
4383 }
4384
4385 ALIAS (show_ip_ospf_database_type_adv_router,
4386        show_ip_ospf_database_type_self_cmd,
4387        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4388        SHOW_STR
4389        IP_STR
4390        "OSPF information\n"
4391        "Database summary\n"
4392        OSPF_LSA_TYPES_DESC
4393        "Self-originated link states\n")
4394
4395
4396 DEFUN (ip_ospf_authentication_args,
4397        ip_ospf_authentication_args_addr_cmd,
4398        "ip ospf authentication (null|message-digest) A.B.C.D",
4399        "IP Information\n"
4400        "OSPF interface commands\n"
4401        "Enable authentication on this interface\n"
4402        "Use null authentication\n"
4403        "Use message-digest authentication\n"
4404        "Address of interface")
4405 {
4406   struct interface *ifp;
4407   struct in_addr addr;
4408   int ret;
4409   struct ospf_if_params *params;
4410   
4411   ifp = vty->index;
4412   params = IF_DEF_PARAMS (ifp);
4413
4414   if (argc == 2)
4415     {
4416       ret = inet_aton(argv[1], &addr);
4417       if (!ret)
4418         {
4419           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4420                    VTY_NEWLINE);
4421           return CMD_WARNING;
4422         }
4423
4424       params = ospf_get_if_params (ifp, addr);
4425       ospf_if_update_params (ifp, addr);
4426     }
4427
4428   /* Handle null authentication */
4429   if ( argv[0][0] == 'n' )
4430     {
4431       SET_IF_PARAM (params, auth_type);
4432       params->auth_type = OSPF_AUTH_NULL;
4433       return CMD_SUCCESS;
4434     }
4435
4436   /* Handle message-digest authentication */
4437   if ( argv[0][0] == 'm' )
4438     {
4439       SET_IF_PARAM (params, auth_type);
4440       params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4441       return CMD_SUCCESS;
4442     }
4443
4444   vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4445   return CMD_WARNING;
4446 }
4447
4448 ALIAS (ip_ospf_authentication_args,
4449        ip_ospf_authentication_args_cmd,
4450        "ip ospf authentication (null|message-digest)",
4451        "IP Information\n"
4452        "OSPF interface commands\n"
4453        "Enable authentication on this interface\n"
4454        "Use null authentication\n"
4455        "Use message-digest authentication\n")
4456
4457 DEFUN (ip_ospf_authentication,
4458        ip_ospf_authentication_addr_cmd,
4459        "ip ospf authentication A.B.C.D",
4460        "IP Information\n"
4461        "OSPF interface commands\n"
4462        "Enable authentication on this interface\n"
4463        "Address of interface")
4464 {
4465   struct interface *ifp;
4466   struct in_addr addr;
4467   int ret;
4468   struct ospf_if_params *params;
4469   
4470   ifp = vty->index;
4471   params = IF_DEF_PARAMS (ifp);
4472
4473   if (argc == 1)
4474     {
4475       ret = inet_aton(argv[0], &addr);
4476       if (!ret)
4477         {
4478           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4479                    VTY_NEWLINE);
4480           return CMD_WARNING;
4481         }
4482
4483       params = ospf_get_if_params (ifp, addr);
4484       ospf_if_update_params (ifp, addr);
4485     }
4486   
4487   SET_IF_PARAM (params, auth_type);
4488   params->auth_type = OSPF_AUTH_SIMPLE;
4489
4490   return CMD_SUCCESS;
4491 }
4492
4493 ALIAS (ip_ospf_authentication,
4494        ip_ospf_authentication_cmd,
4495        "ip ospf authentication",
4496        "IP Information\n"
4497        "OSPF interface commands\n"
4498        "Enable authentication on this interface\n")
4499
4500 DEFUN (no_ip_ospf_authentication,
4501        no_ip_ospf_authentication_addr_cmd,
4502        "no ip ospf authentication A.B.C.D",
4503        NO_STR
4504        "IP Information\n"
4505        "OSPF interface commands\n"
4506        "Enable authentication on this interface\n"
4507        "Address of interface")
4508 {
4509   struct interface *ifp;
4510   struct in_addr addr;
4511   int ret;
4512   struct ospf_if_params *params;
4513   
4514   ifp = vty->index;
4515   params = IF_DEF_PARAMS (ifp);
4516
4517   if (argc == 1)
4518     {
4519       ret = inet_aton(argv[0], &addr);
4520       if (!ret)
4521         {
4522           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4523                    VTY_NEWLINE);
4524           return CMD_WARNING;
4525         }
4526
4527       params = ospf_lookup_if_params (ifp, addr);
4528       if (params == NULL)
4529         return CMD_SUCCESS;
4530     }
4531
4532   params->auth_type = OSPF_AUTH_NOTSET;
4533   UNSET_IF_PARAM (params, auth_type);
4534   
4535   if (params != IF_DEF_PARAMS (ifp))
4536     {
4537       ospf_free_if_params (ifp, addr);
4538       ospf_if_update_params (ifp, addr);
4539     }
4540   
4541   return CMD_SUCCESS;
4542 }
4543
4544 ALIAS (no_ip_ospf_authentication,
4545        no_ip_ospf_authentication_cmd,
4546        "no ip ospf authentication",
4547        NO_STR
4548        "IP Information\n"
4549        "OSPF interface commands\n"
4550        "Enable authentication on this interface\n")
4551
4552 DEFUN (ip_ospf_authentication_key,
4553        ip_ospf_authentication_key_addr_cmd,
4554        "ip ospf authentication-key AUTH_KEY A.B.C.D",
4555        "IP Information\n"
4556        "OSPF interface commands\n"
4557        "Authentication password (key)\n"
4558        "The OSPF password (key)\n"
4559        "Address of interface")
4560 {
4561   struct interface *ifp;
4562   struct in_addr addr;
4563   int ret;
4564   struct ospf_if_params *params;
4565   
4566   ifp = vty->index;
4567   params = IF_DEF_PARAMS (ifp);
4568
4569   if (argc == 2)
4570     {
4571       ret = inet_aton(argv[1], &addr);
4572       if (!ret)
4573         {
4574           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4575                    VTY_NEWLINE);
4576           return CMD_WARNING;
4577         }
4578
4579       params = ospf_get_if_params (ifp, addr);
4580       ospf_if_update_params (ifp, addr);
4581     }
4582
4583
4584   memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
4585   strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
4586   SET_IF_PARAM (params, auth_simple);
4587
4588   return CMD_SUCCESS;
4589 }
4590
4591 ALIAS (ip_ospf_authentication_key,
4592        ip_ospf_authentication_key_cmd,
4593        "ip ospf authentication-key AUTH_KEY",
4594        "IP Information\n"
4595        "OSPF interface commands\n"
4596        "Authentication password (key)\n"
4597        "The OSPF password (key)")
4598
4599 ALIAS (ip_ospf_authentication_key,
4600        ospf_authentication_key_cmd,
4601        "ospf authentication-key AUTH_KEY",
4602        "OSPF interface commands\n"
4603        "Authentication password (key)\n"
4604        "The OSPF password (key)")
4605
4606 DEFUN (no_ip_ospf_authentication_key,
4607        no_ip_ospf_authentication_key_addr_cmd,
4608        "no ip ospf authentication-key A.B.C.D",
4609        NO_STR
4610        "IP Information\n"
4611        "OSPF interface commands\n"
4612        "Authentication password (key)\n"
4613        "Address of interface")
4614 {
4615   struct interface *ifp;
4616   struct in_addr addr;
4617   int ret;
4618   struct ospf_if_params *params;
4619   
4620   ifp = vty->index;
4621   params = IF_DEF_PARAMS (ifp);
4622
4623   if (argc == 1)
4624     {
4625       ret = inet_aton(argv[0], &addr);
4626       if (!ret)
4627         {
4628           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4629                    VTY_NEWLINE);
4630           return CMD_WARNING;
4631         }
4632
4633       params = ospf_lookup_if_params (ifp, addr);
4634       if (params == NULL)
4635         return CMD_SUCCESS;
4636     }
4637
4638   memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4639   UNSET_IF_PARAM (params, auth_simple);
4640   
4641   if (params != IF_DEF_PARAMS (ifp))
4642     {
4643       ospf_free_if_params (ifp, addr);
4644       ospf_if_update_params (ifp, addr);
4645     }
4646   
4647   return CMD_SUCCESS;
4648 }
4649
4650 ALIAS (no_ip_ospf_authentication_key,
4651        no_ip_ospf_authentication_key_cmd,
4652        "no ip ospf authentication-key",
4653        NO_STR
4654        "IP Information\n"
4655        "OSPF interface commands\n"
4656        "Authentication password (key)\n")
4657
4658 ALIAS (no_ip_ospf_authentication_key,
4659        no_ospf_authentication_key_cmd,
4660        "no ospf authentication-key",
4661        NO_STR
4662        "OSPF interface commands\n"
4663        "Authentication password (key)\n")
4664
4665 DEFUN (ip_ospf_message_digest_key,
4666        ip_ospf_message_digest_key_addr_cmd,
4667        "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4668        "IP Information\n"
4669        "OSPF interface commands\n"
4670        "Message digest authentication password (key)\n"
4671        "Key ID\n"
4672        "Use MD5 algorithm\n"
4673        "The OSPF password (key)"
4674        "Address of interface")
4675 {
4676   struct interface *ifp;
4677   struct crypt_key *ck;
4678   u_char key_id;
4679   struct in_addr addr;
4680   int ret;
4681   struct ospf_if_params *params;
4682   
4683   ifp = vty->index;
4684   params = IF_DEF_PARAMS (ifp);
4685
4686   if (argc == 3)
4687     {
4688       ret = inet_aton(argv[2], &addr);
4689       if (!ret)
4690         {
4691           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4692                    VTY_NEWLINE);
4693           return CMD_WARNING;
4694         }
4695
4696       params = ospf_get_if_params (ifp, addr);
4697       ospf_if_update_params (ifp, addr);
4698     }
4699
4700   key_id = strtol (argv[0], NULL, 10);
4701   if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4702     {
4703       vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4704       return CMD_WARNING;
4705     }
4706
4707   ck = ospf_crypt_key_new ();
4708   ck->key_id = (u_char) key_id;
4709   memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
4710   strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
4711
4712   ospf_crypt_key_add (params->auth_crypt, ck);
4713   SET_IF_PARAM (params, auth_crypt);
4714   
4715   return CMD_SUCCESS;
4716 }
4717
4718 ALIAS (ip_ospf_message_digest_key,
4719        ip_ospf_message_digest_key_cmd,
4720        "ip ospf message-digest-key <1-255> md5 KEY",
4721        "IP Information\n"
4722        "OSPF interface commands\n"
4723        "Message digest authentication password (key)\n"
4724        "Key ID\n"
4725        "Use MD5 algorithm\n"
4726        "The OSPF password (key)")
4727
4728 ALIAS (ip_ospf_message_digest_key,
4729        ospf_message_digest_key_cmd,
4730        "ospf message-digest-key <1-255> md5 KEY",
4731        "OSPF interface commands\n"
4732        "Message digest authentication password (key)\n"
4733        "Key ID\n"
4734        "Use MD5 algorithm\n"
4735        "The OSPF password (key)")
4736
4737 DEFUN (no_ip_ospf_message_digest_key,
4738        no_ip_ospf_message_digest_key_addr_cmd,
4739        "no ip ospf message-digest-key <1-255> A.B.C.D",
4740        NO_STR
4741        "IP Information\n"
4742        "OSPF interface commands\n"
4743        "Message digest authentication password (key)\n"
4744        "Key ID\n"
4745        "Address of interface")
4746 {
4747   struct interface *ifp;
4748   struct crypt_key *ck;
4749   int key_id;
4750   struct in_addr addr;
4751   int ret;
4752   struct ospf_if_params *params;
4753   
4754   ifp = vty->index;
4755   params = IF_DEF_PARAMS (ifp);
4756
4757   if (argc == 2)
4758     {
4759       ret = inet_aton(argv[1], &addr);
4760       if (!ret)
4761         {
4762           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4763                    VTY_NEWLINE);
4764           return CMD_WARNING;
4765         }
4766
4767       params = ospf_lookup_if_params (ifp, addr);
4768       if (params == NULL)
4769         return CMD_SUCCESS;
4770     }
4771
4772   key_id = strtol (argv[0], NULL, 10);
4773   ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4774   if (ck == NULL)
4775     {
4776       vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4777       return CMD_WARNING;
4778     }
4779
4780   ospf_crypt_key_delete (params->auth_crypt, key_id);
4781
4782   if (params != IF_DEF_PARAMS (ifp))
4783     {
4784       ospf_free_if_params (ifp, addr);
4785       ospf_if_update_params (ifp, addr);
4786     }
4787   
4788   return CMD_SUCCESS;
4789 }
4790
4791 ALIAS (no_ip_ospf_message_digest_key,
4792        no_ip_ospf_message_digest_key_cmd,
4793        "no ip ospf message-digest-key <1-255>",
4794        NO_STR
4795        "IP Information\n"
4796        "OSPF interface commands\n"
4797        "Message digest authentication password (key)\n"
4798        "Key ID\n")
4799      
4800 ALIAS (no_ip_ospf_message_digest_key,
4801        no_ospf_message_digest_key_cmd,
4802        "no ospf message-digest-key <1-255>",
4803        NO_STR
4804        "OSPF interface commands\n"
4805        "Message digest authentication password (key)\n"
4806        "Key ID\n")
4807
4808 DEFUN (ip_ospf_cost,
4809        ip_ospf_cost_u32_inet4_cmd,
4810        "ip ospf cost <1-65535> A.B.C.D",
4811        "IP Information\n"
4812        "OSPF interface commands\n"
4813        "Interface cost\n"
4814        "Cost\n"
4815        "Address of interface")
4816 {
4817   struct interface *ifp = vty->index;
4818   u_int32_t cost;
4819   struct in_addr addr;
4820   int ret;
4821   struct ospf_if_params *params;
4822       
4823   params = IF_DEF_PARAMS (ifp);
4824
4825   cost = strtol (argv[0], NULL, 10);
4826
4827   /* cost range is <1-65535>. */
4828   if (cost < 1 || cost > 65535)
4829     {
4830       vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4831       return CMD_WARNING;
4832     }
4833
4834   if (argc == 2)
4835     {
4836       ret = inet_aton(argv[1], &addr);
4837       if (!ret)
4838         {
4839           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4840                    VTY_NEWLINE);
4841           return CMD_WARNING;
4842         }
4843
4844       params = ospf_get_if_params (ifp, addr);
4845       ospf_if_update_params (ifp, addr);
4846     }
4847
4848   SET_IF_PARAM (params, output_cost_cmd);
4849   params->output_cost_cmd = cost;
4850
4851   ospf_if_recalculate_output_cost (ifp);
4852     
4853   return CMD_SUCCESS;
4854 }
4855
4856 ALIAS (ip_ospf_cost,
4857        ip_ospf_cost_u32_cmd,
4858        "ip ospf cost <1-65535>",
4859        "IP Information\n"
4860        "OSPF interface commands\n"
4861        "Interface cost\n"
4862        "Cost")
4863
4864 ALIAS (ip_ospf_cost,
4865        ospf_cost_u32_cmd,
4866        "ospf cost <1-65535>",
4867        "OSPF interface commands\n"
4868        "Interface cost\n"
4869        "Cost")
4870
4871 ALIAS (ip_ospf_cost,
4872        ospf_cost_u32_inet4_cmd,
4873        "ospf cost <1-65535> A.B.C.D",
4874        "OSPF interface commands\n"
4875        "Interface cost\n"
4876        "Cost\n"
4877        "Address of interface")
4878
4879 DEFUN (no_ip_ospf_cost,
4880        no_ip_ospf_cost_inet4_cmd,
4881        "no ip ospf cost A.B.C.D",
4882        NO_STR
4883        "IP Information\n"
4884        "OSPF interface commands\n"
4885        "Interface cost\n"
4886        "Address of interface")
4887 {
4888   struct interface *ifp = vty->index;
4889   struct in_addr addr;
4890   int ret;
4891   struct ospf_if_params *params;
4892   
4893   ifp = vty->index;
4894   params = IF_DEF_PARAMS (ifp);
4895
4896   if (argc == 1)
4897     {
4898       ret = inet_aton(argv[0], &addr);
4899       if (!ret)
4900         {
4901           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4902                    VTY_NEWLINE);
4903           return CMD_WARNING;
4904         }
4905
4906       params = ospf_lookup_if_params (ifp, addr);
4907       if (params == NULL)
4908         return CMD_SUCCESS;
4909     }
4910
4911   UNSET_IF_PARAM (params, output_cost_cmd);
4912
4913   if (params != IF_DEF_PARAMS (ifp))
4914     {
4915       ospf_free_if_params (ifp, addr);
4916       ospf_if_update_params (ifp, addr);
4917     }
4918
4919   ospf_if_recalculate_output_cost (ifp);
4920   
4921   return CMD_SUCCESS;
4922 }
4923
4924 ALIAS (no_ip_ospf_cost,
4925        no_ip_ospf_cost_cmd,
4926        "no ip ospf cost",
4927        NO_STR
4928        "IP Information\n"
4929        "OSPF interface commands\n"
4930        "Interface cost\n")
4931
4932 ALIAS (no_ip_ospf_cost,
4933        no_ospf_cost_cmd,
4934        "no ospf cost",
4935        NO_STR
4936        "OSPF interface commands\n"
4937        "Interface cost\n")
4938
4939 ALIAS (no_ip_ospf_cost,
4940        no_ospf_cost_inet4_cmd,
4941        "no ospf cost A.B.C.D",
4942        NO_STR
4943        "OSPF interface commands\n"
4944        "Interface cost\n"
4945        "Address of interface")
4946
4947 DEFUN (no_ip_ospf_cost2,
4948        no_ip_ospf_cost_u32_cmd,
4949        "no ip ospf cost <1-65535>",
4950        NO_STR
4951        "IP Information\n"
4952        "OSPF interface commands\n"
4953        "Interface cost\n"
4954        "Cost")
4955 {
4956   struct interface *ifp = vty->index;
4957   struct in_addr addr;
4958   u_int32_t cost;
4959   int ret;
4960   struct ospf_if_params *params;
4961
4962   ifp = vty->index;
4963   params = IF_DEF_PARAMS (ifp);
4964
4965   /* According to the semantics we are mimicking "no ip ospf cost N" is
4966    * always treated as "no ip ospf cost" regardless of the actual value
4967    * of N already configured for the interface. Thus the first argument
4968    * is always checked to be a number, but is ignored after that.
4969    */
4970   cost = strtol (argv[0], NULL, 10);
4971   if (cost < 1 || cost > 65535)
4972     {
4973       vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4974       return CMD_WARNING;
4975     }
4976
4977   if (argc == 2)
4978     {
4979       ret = inet_aton(argv[1], &addr);
4980       if (!ret)
4981         {
4982           vty_out (vty, "Please specify interface address by A.B.C.D%s",
4983                    VTY_NEWLINE);
4984           return CMD_WARNING;
4985         }
4986
4987       params = ospf_lookup_if_params (ifp, addr);
4988       if (params == NULL)
4989         return CMD_SUCCESS;
4990     }
4991
4992   UNSET_IF_PARAM (params, output_cost_cmd);
4993
4994   if (params != IF_DEF_PARAMS (ifp))
4995     {
4996       ospf_free_if_params (ifp, addr);
4997       ospf_if_update_params (ifp, addr);
4998     }
4999
5000   ospf_if_recalculate_output_cost (ifp);
5001
5002   return CMD_SUCCESS;
5003 }
5004
5005 ALIAS (no_ip_ospf_cost2,
5006        no_ospf_cost_u32_cmd,
5007        "no ospf cost <1-65535>",
5008        NO_STR
5009        "OSPF interface commands\n"
5010        "Interface cost\n"
5011        "Cost")
5012
5013 ALIAS (no_ip_ospf_cost2,
5014        no_ip_ospf_cost_u32_inet4_cmd,
5015        "no ip ospf cost <1-65535> A.B.C.D",
5016        NO_STR
5017        "IP Information\n"
5018        "OSPF interface commands\n"
5019        "Interface cost\n"
5020        "Cost\n"
5021        "Address of interface")
5022
5023 ALIAS (no_ip_ospf_cost2,
5024        no_ospf_cost_u32_inet4_cmd,
5025        "no ospf cost <1-65535> A.B.C.D",
5026        NO_STR
5027        "OSPF interface commands\n"
5028        "Interface cost\n"
5029        "Cost\n"
5030        "Address of interface")
5031
5032 static void
5033 ospf_nbr_timer_update (struct ospf_interface *oi)
5034 {
5035   struct route_node *rn;
5036   struct ospf_neighbor *nbr;
5037
5038   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
5039     if ((nbr = rn->info))
5040       {
5041         nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
5042         nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
5043         nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
5044         nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
5045       }
5046 }
5047
5048 static int
5049 ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
5050                             const char *nbr_str,
5051                             const char *fast_hello_str)
5052 {
5053   struct interface *ifp = vty->index;
5054   u_int32_t seconds;
5055   u_char hellomult;
5056   struct in_addr addr;
5057   int ret;
5058   struct ospf_if_params *params;
5059   struct ospf_interface *oi;
5060   struct route_node *rn;
5061       
5062   params = IF_DEF_PARAMS (ifp);
5063   
5064   if (nbr_str)
5065     {
5066       ret = inet_aton(nbr_str, &addr);
5067       if (!ret)
5068         {
5069           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5070                    VTY_NEWLINE);
5071           return CMD_WARNING;
5072         }
5073
5074       params = ospf_get_if_params (ifp, addr);
5075       ospf_if_update_params (ifp, addr);
5076     }
5077
5078   if (interval_str)
5079     {
5080       VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
5081                              1, 65535);
5082                              
5083       /* reset fast_hello too, just to be sure */
5084       UNSET_IF_PARAM (params, fast_hello);
5085       params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5086     }
5087   else if (fast_hello_str)
5088     {
5089       VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
5090                              1, 10);
5091       /* 1s dead-interval with sub-second hellos desired */
5092       seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
5093       SET_IF_PARAM (params, fast_hello);
5094       params->fast_hello = hellomult;
5095     }
5096   else
5097     {
5098       vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
5099               VTY_NEWLINE);
5100       return CMD_WARNING;
5101     }
5102     
5103   SET_IF_PARAM (params, v_wait);
5104   params->v_wait = seconds;
5105   
5106   /* Update timer values in neighbor structure. */
5107   if (nbr_str)
5108     {
5109       struct ospf *ospf;
5110       if ((ospf = ospf_lookup()))
5111         {
5112           oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5113           if (oi)
5114             ospf_nbr_timer_update (oi);
5115         }
5116     }
5117   else
5118     {
5119       for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5120         if ((oi = rn->info))
5121           ospf_nbr_timer_update (oi);
5122     }
5123
5124   return CMD_SUCCESS;
5125 }
5126
5127
5128 DEFUN (ip_ospf_dead_interval,
5129        ip_ospf_dead_interval_addr_cmd,
5130        "ip ospf dead-interval <1-65535> A.B.C.D",
5131        "IP Information\n"
5132        "OSPF interface commands\n"
5133        "Interval after which a neighbor is declared dead\n"
5134        "Seconds\n"
5135        "Address of interface\n")
5136 {
5137   if (argc == 2)
5138     return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
5139   else
5140     return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
5141 }
5142
5143 ALIAS (ip_ospf_dead_interval,
5144        ip_ospf_dead_interval_cmd,
5145        "ip ospf dead-interval <1-65535>",
5146        "IP Information\n"
5147        "OSPF interface commands\n"
5148        "Interval after which a neighbor is declared dead\n"
5149        "Seconds\n")
5150
5151 ALIAS (ip_ospf_dead_interval,
5152        ospf_dead_interval_cmd,
5153        "ospf dead-interval <1-65535>",
5154        "OSPF interface commands\n"
5155        "Interval after which a neighbor is declared dead\n"
5156        "Seconds\n")
5157
5158 DEFUN (ip_ospf_dead_interval_minimal,
5159        ip_ospf_dead_interval_minimal_addr_cmd,
5160        "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5161        "IP Information\n"
5162        "OSPF interface commands\n"
5163        "Interval after which a neighbor is declared dead\n"
5164        "Minimal 1s dead-interval with fast sub-second hellos\n"
5165        "Hello multiplier factor\n"
5166        "Number of Hellos to send each second\n"
5167        "Address of interface\n")
5168 {
5169   if (argc == 2)
5170     return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5171   else
5172     return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5173 }
5174
5175 ALIAS (ip_ospf_dead_interval_minimal,
5176        ip_ospf_dead_interval_minimal_cmd,
5177        "ip ospf dead-interval minimal hello-multiplier <1-10>",
5178        "IP Information\n"
5179        "OSPF interface commands\n"
5180        "Interval after which a neighbor is declared dead\n"
5181        "Minimal 1s dead-interval with fast sub-second hellos\n"
5182        "Hello multiplier factor\n"
5183        "Number of Hellos to send each second\n")
5184
5185 DEFUN (no_ip_ospf_dead_interval,
5186        no_ip_ospf_dead_interval_addr_cmd,
5187        "no ip ospf dead-interval <1-65535> A.B.C.D",
5188        NO_STR
5189        "IP Information\n"
5190        "OSPF interface commands\n"
5191        "Interval after which a neighbor is declared dead\n"
5192        "Seconds\n"
5193        "Address of interface")
5194 {
5195   struct interface *ifp = vty->index;
5196   struct in_addr addr;
5197   int ret;
5198   struct ospf_if_params *params;
5199   struct ospf_interface *oi;
5200   struct route_node *rn;
5201
5202   ifp = vty->index;
5203   params = IF_DEF_PARAMS (ifp);
5204
5205   if (argc == 2)
5206     {
5207       ret = inet_aton(argv[1], &addr);
5208       if (!ret)
5209         {
5210           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5211                    VTY_NEWLINE);
5212           return CMD_WARNING;
5213         }
5214
5215       params = ospf_lookup_if_params (ifp, addr);
5216       if (params == NULL)
5217         return CMD_SUCCESS;
5218     }
5219
5220   UNSET_IF_PARAM (params, v_wait);
5221   params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
5222   
5223   UNSET_IF_PARAM (params, fast_hello);
5224   params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5225   
5226   if (params != IF_DEF_PARAMS (ifp))
5227     {
5228       ospf_free_if_params (ifp, addr);
5229       ospf_if_update_params (ifp, addr);
5230     }
5231
5232   /* Update timer values in neighbor structure. */
5233   if (argc == 1)
5234     {
5235       struct ospf *ospf;
5236       
5237       if ((ospf = ospf_lookup()))
5238         {
5239           oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5240           if (oi)
5241             ospf_nbr_timer_update (oi);
5242         }
5243     }
5244   else
5245     {
5246       for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5247         if ((oi = rn->info))
5248           ospf_nbr_timer_update (oi);
5249     }
5250
5251   return CMD_SUCCESS;
5252 }
5253
5254 ALIAS (no_ip_ospf_dead_interval,
5255        no_ip_ospf_dead_interval_seconds_cmd,
5256        "no ip ospf dead-interval <1-65535>",
5257        NO_STR
5258        "IP Information\n"
5259        "OSPF interface commands\n"
5260        "Interval after which a neighbor is declared dead\n"
5261        "Seconds\n")
5262
5263 ALIAS (no_ip_ospf_dead_interval,
5264        no_ip_ospf_dead_interval_cmd,
5265        "no ip ospf dead-interval",
5266        NO_STR
5267        "IP Information\n"
5268        "OSPF interface commands\n"
5269        "Interval after which a neighbor is declared dead\n")
5270
5271 ALIAS (no_ip_ospf_dead_interval,
5272        no_ospf_dead_interval_cmd,
5273        "no ospf dead-interval",
5274        NO_STR
5275        "OSPF interface commands\n"
5276        "Interval after which a neighbor is declared dead\n")
5277
5278 DEFUN (ip_ospf_hello_interval,
5279        ip_ospf_hello_interval_addr_cmd,
5280        "ip ospf hello-interval <1-65535> A.B.C.D",
5281        "IP Information\n"
5282        "OSPF interface commands\n"
5283        "Time between HELLO packets\n"
5284        "Seconds\n"
5285        "Address of interface")
5286 {
5287   struct interface *ifp = vty->index;
5288   u_int32_t seconds;
5289   struct in_addr addr;
5290   int ret;
5291   struct ospf_if_params *params;
5292       
5293   params = IF_DEF_PARAMS (ifp);
5294
5295   seconds = strtol (argv[0], NULL, 10);
5296   
5297   /* HelloInterval range is <1-65535>. */
5298   if (seconds < 1 || seconds > 65535)
5299     {
5300       vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5301       return CMD_WARNING;
5302     }
5303
5304   if (argc == 2)
5305     {
5306       ret = inet_aton(argv[1], &addr);
5307       if (!ret)
5308         {
5309           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5310                    VTY_NEWLINE);
5311           return CMD_WARNING;
5312         }
5313
5314       params = ospf_get_if_params (ifp, addr);
5315       ospf_if_update_params (ifp, addr);
5316     }
5317
5318   SET_IF_PARAM (params, v_hello);
5319   params->v_hello = seconds;
5320
5321   return CMD_SUCCESS;
5322 }
5323
5324 ALIAS (ip_ospf_hello_interval,
5325        ip_ospf_hello_interval_cmd,
5326        "ip ospf hello-interval <1-65535>",
5327        "IP Information\n"
5328        "OSPF interface commands\n"
5329        "Time between HELLO packets\n"
5330        "Seconds\n")
5331
5332 ALIAS (ip_ospf_hello_interval,
5333        ospf_hello_interval_cmd,
5334        "ospf hello-interval <1-65535>",
5335        "OSPF interface commands\n"
5336        "Time between HELLO packets\n"
5337        "Seconds\n")
5338
5339 DEFUN (no_ip_ospf_hello_interval,
5340        no_ip_ospf_hello_interval_addr_cmd,
5341        "no ip ospf hello-interval <1-65535> A.B.C.D",
5342        NO_STR
5343        "IP Information\n"
5344        "OSPF interface commands\n"
5345        "Time between HELLO packets\n"
5346        "Seconds\n"
5347        "Address of interface")
5348 {
5349   struct interface *ifp = vty->index;
5350   struct in_addr addr;
5351   int ret;
5352   struct ospf_if_params *params;
5353   
5354   ifp = vty->index;
5355   params = IF_DEF_PARAMS (ifp);
5356
5357   if (argc == 2)
5358     {
5359       ret = inet_aton(argv[1], &addr);
5360       if (!ret)
5361         {
5362           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5363                    VTY_NEWLINE);
5364           return CMD_WARNING;
5365         }
5366
5367       params = ospf_lookup_if_params (ifp, addr);
5368       if (params == NULL)
5369         return CMD_SUCCESS;
5370     }
5371
5372   UNSET_IF_PARAM (params, v_hello);
5373   params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
5374
5375   if (params != IF_DEF_PARAMS (ifp))
5376     {
5377       ospf_free_if_params (ifp, addr);
5378       ospf_if_update_params (ifp, addr);
5379     }
5380
5381   return CMD_SUCCESS;
5382 }
5383
5384 ALIAS (no_ip_ospf_hello_interval,
5385        no_ip_ospf_hello_interval_seconds_cmd,
5386        "no ip ospf hello-interval <1-65535>",
5387        NO_STR
5388        "IP Information\n"
5389        "OSPF interface commands\n"
5390        "Time between HELLO packets\n"
5391        "Seconds\n")
5392
5393 ALIAS (no_ip_ospf_hello_interval,
5394        no_ip_ospf_hello_interval_cmd,
5395        "no ip ospf hello-interval",
5396        NO_STR
5397        "IP Information\n"
5398        "OSPF interface commands\n"
5399        "Time between HELLO packets\n")
5400
5401 ALIAS (no_ip_ospf_hello_interval,
5402        no_ospf_hello_interval_cmd,
5403        "no ospf hello-interval",
5404        NO_STR
5405        "OSPF interface commands\n"
5406        "Time between HELLO packets\n")
5407
5408 DEFUN (ip_ospf_network,
5409        ip_ospf_network_cmd,
5410        "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5411        "IP Information\n"
5412        "OSPF interface commands\n"
5413        "Network type\n"
5414        "Specify OSPF broadcast multi-access network\n"
5415        "Specify OSPF NBMA network\n"
5416        "Specify OSPF point-to-multipoint network\n"
5417        "Specify OSPF point-to-point network\n")
5418 {
5419   struct interface *ifp = vty->index;
5420   int old_type = IF_DEF_PARAMS (ifp)->type;
5421
5422   if (old_type == OSPF_IFTYPE_LOOPBACK)
5423     {
5424       vty_out (vty, "This is a loopback interface. Can't set network type.%s", VTY_NEWLINE);
5425       return CMD_WARNING;
5426     }
5427
5428   if (strncmp (argv[0], "b", 1) == 0)
5429     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5430   else if (strncmp (argv[0], "n", 1) == 0)
5431     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5432   else if (strncmp (argv[0], "point-to-m", 10) == 0)
5433     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5434   else if (strncmp (argv[0], "point-to-p", 10) == 0)
5435     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5436
5437   if (IF_DEF_PARAMS (ifp)->type == old_type)
5438     return CMD_SUCCESS;
5439
5440   SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5441   ospf_if_reset_type (ifp, IF_DEF_PARAMS (ifp)->type);
5442   return CMD_SUCCESS;
5443 }
5444
5445 ALIAS (ip_ospf_network,
5446        ospf_network_cmd,
5447        "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5448        "OSPF interface commands\n"
5449        "Network type\n"
5450        "Specify OSPF broadcast multi-access network\n"
5451        "Specify OSPF NBMA network\n"
5452        "Specify OSPF point-to-multipoint network\n"
5453        "Specify OSPF point-to-point network\n")
5454
5455 DEFUN (no_ip_ospf_network,
5456        no_ip_ospf_network_cmd,
5457        "no ip ospf network",
5458        NO_STR
5459        "IP Information\n"
5460        "OSPF interface commands\n"
5461        "Network type\n")
5462 {
5463   struct interface *ifp = vty->index;
5464   int old_type = IF_DEF_PARAMS (ifp)->type;
5465
5466   IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
5467
5468   if (IF_DEF_PARAMS (ifp)->type == old_type)
5469     return CMD_SUCCESS;
5470   
5471   ospf_if_reset_type (ifp, IF_DEF_PARAMS (ifp)->type);
5472   
5473   return CMD_SUCCESS;
5474 }
5475
5476 ALIAS (no_ip_ospf_network,
5477        no_ospf_network_cmd,
5478        "no ospf network",
5479        NO_STR
5480        "OSPF interface commands\n"
5481        "Network type\n")
5482
5483 DEFUN (ip_ospf_priority,
5484        ip_ospf_priority_addr_cmd,
5485        "ip ospf priority <0-255> A.B.C.D",
5486        "IP Information\n"
5487        "OSPF interface commands\n"
5488        "Router priority\n"
5489        "Priority\n"
5490        "Address of interface")
5491 {
5492   struct interface *ifp = vty->index;
5493   long priority;
5494   struct route_node *rn;
5495   struct in_addr addr;
5496   int ret;
5497   struct ospf_if_params *params;
5498       
5499   params = IF_DEF_PARAMS (ifp);
5500
5501   priority = strtol (argv[0], NULL, 10);
5502   
5503   /* Router Priority range is <0-255>. */
5504   if (priority < 0 || priority > 255)
5505     {
5506       vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5507       return CMD_WARNING;
5508     }
5509
5510   if (argc == 2)
5511     {
5512       ret = inet_aton(argv[1], &addr);
5513       if (!ret)
5514         {
5515           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5516                    VTY_NEWLINE);
5517           return CMD_WARNING;
5518         }
5519
5520       params = ospf_get_if_params (ifp, addr);
5521       ospf_if_update_params (ifp, addr);
5522     }
5523   
5524   SET_IF_PARAM (params, priority);
5525   params->priority = priority;
5526
5527   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5528     {
5529       struct ospf_interface *oi = rn->info;
5530       
5531       if (!oi)
5532         continue;
5533       
5534
5535       if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5536         {
5537           PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5538           OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5539         }
5540     }
5541   
5542   return CMD_SUCCESS;
5543 }
5544
5545 ALIAS (ip_ospf_priority,
5546        ip_ospf_priority_cmd,
5547        "ip ospf priority <0-255>",
5548        "IP Information\n"
5549        "OSPF interface commands\n"
5550        "Router priority\n"
5551        "Priority\n")
5552
5553 ALIAS (ip_ospf_priority,
5554        ospf_priority_cmd,
5555        "ospf priority <0-255>",
5556        "OSPF interface commands\n"
5557        "Router priority\n"
5558        "Priority\n")
5559
5560 DEFUN (no_ip_ospf_priority,
5561        no_ip_ospf_priority_addr_cmd,
5562        "no ip ospf priority A.B.C.D",
5563        NO_STR
5564        "IP Information\n"
5565        "OSPF interface commands\n"
5566        "Router priority\n"
5567        "Address of interface")
5568 {
5569   struct interface *ifp = vty->index;
5570   struct route_node *rn;
5571   struct in_addr addr;
5572   int ret;
5573   struct ospf_if_params *params;
5574   
5575   ifp = vty->index;
5576   params = IF_DEF_PARAMS (ifp);
5577
5578   if (argc == 1)
5579     {
5580       ret = inet_aton(argv[0], &addr);
5581       if (!ret)
5582         {
5583           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5584                    VTY_NEWLINE);
5585           return CMD_WARNING;
5586         }
5587
5588       params = ospf_lookup_if_params (ifp, addr);
5589       if (params == NULL)
5590         return CMD_SUCCESS;
5591     }
5592
5593   UNSET_IF_PARAM (params, priority);
5594   params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5595
5596   if (params != IF_DEF_PARAMS (ifp))
5597     {
5598       ospf_free_if_params (ifp, addr);
5599       ospf_if_update_params (ifp, addr);
5600     }
5601   
5602   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5603     {
5604       struct ospf_interface *oi = rn->info;
5605       
5606       if (!oi)
5607         continue;
5608       
5609       
5610       if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5611         {
5612           PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5613           OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5614         }
5615     }
5616   
5617   return CMD_SUCCESS;
5618 }
5619
5620 ALIAS (no_ip_ospf_priority,
5621        no_ip_ospf_priority_cmd,
5622        "no ip ospf priority",
5623        NO_STR
5624        "IP Information\n"
5625        "OSPF interface commands\n"
5626        "Router priority\n")
5627
5628 ALIAS (no_ip_ospf_priority,
5629        no_ospf_priority_cmd,
5630        "no ospf priority",
5631        NO_STR
5632        "OSPF interface commands\n"
5633        "Router priority\n")
5634
5635 DEFUN (ip_ospf_retransmit_interval,
5636        ip_ospf_retransmit_interval_addr_cmd,
5637        "ip ospf retransmit-interval <3-65535> A.B.C.D",
5638        "IP Information\n"
5639        "OSPF interface commands\n"
5640        "Time between retransmitting lost link state advertisements\n"
5641        "Seconds\n"
5642        "Address of interface")
5643 {
5644   struct interface *ifp = vty->index;
5645   u_int32_t seconds;
5646   struct in_addr addr;
5647   int ret;
5648   struct ospf_if_params *params;
5649       
5650   params = IF_DEF_PARAMS (ifp);
5651   seconds = strtol (argv[0], NULL, 10);
5652
5653   /* Retransmit Interval range is <3-65535>. */
5654   if (seconds < 3 || seconds > 65535)
5655     {
5656       vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5657       return CMD_WARNING;
5658     }
5659
5660
5661   if (argc == 2)
5662     {
5663       ret = inet_aton(argv[1], &addr);
5664       if (!ret)
5665         {
5666           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5667                    VTY_NEWLINE);
5668           return CMD_WARNING;
5669         }
5670
5671       params = ospf_get_if_params (ifp, addr);
5672       ospf_if_update_params (ifp, addr);
5673     }
5674
5675   SET_IF_PARAM (params, retransmit_interval);
5676   params->retransmit_interval = seconds;
5677
5678   return CMD_SUCCESS;
5679 }
5680
5681 ALIAS (ip_ospf_retransmit_interval,
5682        ip_ospf_retransmit_interval_cmd,
5683        "ip ospf retransmit-interval <3-65535>",
5684        "IP Information\n"
5685        "OSPF interface commands\n"
5686        "Time between retransmitting lost link state advertisements\n"
5687        "Seconds\n")
5688
5689 ALIAS (ip_ospf_retransmit_interval,
5690        ospf_retransmit_interval_cmd,
5691        "ospf retransmit-interval <3-65535>",
5692        "OSPF interface commands\n"
5693        "Time between retransmitting lost link state advertisements\n"
5694        "Seconds\n")
5695
5696 DEFUN (no_ip_ospf_retransmit_interval,
5697        no_ip_ospf_retransmit_interval_addr_cmd,
5698        "no ip ospf retransmit-interval A.B.C.D",
5699        NO_STR
5700        "IP Information\n"
5701        "OSPF interface commands\n"
5702        "Time between retransmitting lost link state advertisements\n"
5703        "Address of interface")
5704 {
5705   struct interface *ifp = vty->index;
5706   struct in_addr addr;
5707   int ret;
5708   struct ospf_if_params *params;
5709   
5710   ifp = vty->index;
5711   params = IF_DEF_PARAMS (ifp);
5712
5713   if (argc == 1)
5714     {
5715       ret = inet_aton(argv[0], &addr);
5716       if (!ret)
5717         {
5718           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5719                    VTY_NEWLINE);
5720           return CMD_WARNING;
5721         }
5722
5723       params = ospf_lookup_if_params (ifp, addr);
5724       if (params == NULL)
5725         return CMD_SUCCESS;
5726     }
5727
5728   UNSET_IF_PARAM (params, retransmit_interval);
5729   params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5730
5731   if (params != IF_DEF_PARAMS (ifp))
5732     {
5733       ospf_free_if_params (ifp, addr);
5734       ospf_if_update_params (ifp, addr);
5735     }
5736
5737   return CMD_SUCCESS;
5738 }
5739
5740 ALIAS (no_ip_ospf_retransmit_interval,
5741        no_ip_ospf_retransmit_interval_cmd,
5742        "no ip ospf retransmit-interval",
5743        NO_STR
5744        "IP Information\n"
5745        "OSPF interface commands\n"
5746        "Time between retransmitting lost link state advertisements\n")
5747
5748 ALIAS (no_ip_ospf_retransmit_interval,
5749        no_ospf_retransmit_interval_cmd,
5750        "no ospf retransmit-interval",
5751        NO_STR
5752        "OSPF interface commands\n"
5753        "Time between retransmitting lost link state advertisements\n")
5754
5755 DEFUN (ip_ospf_transmit_delay,
5756        ip_ospf_transmit_delay_addr_cmd,
5757        "ip ospf transmit-delay <1-65535> A.B.C.D",
5758        "IP Information\n"
5759        "OSPF interface commands\n"
5760        "Link state transmit delay\n"
5761        "Seconds\n"
5762        "Address of interface")
5763 {
5764   struct interface *ifp = vty->index;
5765   u_int32_t seconds;
5766   struct in_addr addr;
5767   int ret;
5768   struct ospf_if_params *params;
5769       
5770   params = IF_DEF_PARAMS (ifp);
5771   seconds = strtol (argv[0], NULL, 10);
5772
5773   /* Transmit Delay range is <1-65535>. */
5774   if (seconds < 1 || seconds > 65535)
5775     {
5776       vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5777       return CMD_WARNING;
5778     }
5779
5780   if (argc == 2)
5781     {
5782       ret = inet_aton(argv[1], &addr);
5783       if (!ret)
5784         {
5785           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5786                    VTY_NEWLINE);
5787           return CMD_WARNING;
5788         }
5789
5790       params = ospf_get_if_params (ifp, addr);
5791       ospf_if_update_params (ifp, addr);
5792     }
5793
5794   SET_IF_PARAM (params, transmit_delay); 
5795   params->transmit_delay = seconds;
5796
5797   return CMD_SUCCESS;
5798 }
5799
5800 ALIAS (ip_ospf_transmit_delay,
5801        ip_ospf_transmit_delay_cmd,
5802        "ip ospf transmit-delay <1-65535>",
5803        "IP Information\n"
5804        "OSPF interface commands\n"
5805        "Link state transmit delay\n"
5806        "Seconds\n")
5807
5808 ALIAS (ip_ospf_transmit_delay,
5809        ospf_transmit_delay_cmd,
5810        "ospf transmit-delay <1-65535>",
5811        "OSPF interface commands\n"
5812        "Link state transmit delay\n"
5813        "Seconds\n")
5814
5815 DEFUN (no_ip_ospf_transmit_delay,
5816        no_ip_ospf_transmit_delay_addr_cmd,
5817        "no ip ospf transmit-delay A.B.C.D",
5818        NO_STR
5819        "IP Information\n"
5820        "OSPF interface commands\n"
5821        "Link state transmit delay\n"
5822        "Address of interface")
5823 {
5824   struct interface *ifp = vty->index;
5825   struct in_addr addr;
5826   int ret;
5827   struct ospf_if_params *params;
5828   
5829   ifp = vty->index;
5830   params = IF_DEF_PARAMS (ifp);
5831
5832   if (argc == 1)
5833     {
5834       ret = inet_aton(argv[0], &addr);
5835       if (!ret)
5836         {
5837           vty_out (vty, "Please specify interface address by A.B.C.D%s",
5838                    VTY_NEWLINE);
5839           return CMD_WARNING;
5840         }
5841
5842       params = ospf_lookup_if_params (ifp, addr);
5843       if (params == NULL)
5844         return CMD_SUCCESS;
5845     }
5846
5847   UNSET_IF_PARAM (params, transmit_delay);
5848   params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5849
5850   if (params != IF_DEF_PARAMS (ifp))
5851     {
5852       ospf_free_if_params (ifp, addr);
5853       ospf_if_update_params (ifp, addr);
5854     }
5855
5856   return CMD_SUCCESS;
5857 }
5858
5859 ALIAS (no_ip_ospf_transmit_delay,
5860        no_ip_ospf_transmit_delay_cmd,
5861        "no ip ospf transmit-delay",
5862        NO_STR
5863        "IP Information\n"
5864        "OSPF interface commands\n"
5865        "Link state transmit delay\n")
5866
5867 ALIAS (no_ip_ospf_transmit_delay,
5868        no_ospf_transmit_delay_cmd,
5869        "no ospf transmit-delay",
5870        NO_STR
5871        "OSPF interface commands\n"
5872        "Link state transmit delay\n")
5873
5874 DEFUN (ip_ospf_area,
5875        ip_ospf_area_cmd,
5876        "ip ospf area (A.B.C.D|<0-4294967295>) [A.B.C.D]",
5877        "IP Information\n"
5878        "OSPF interface commands\n"
5879        "Enable OSPF on this interface\n"
5880        "OSPF area ID in IP address format\n"
5881        "OSPF area ID as a decimal value\n"
5882        "Address of interface\n")
5883 {
5884   struct interface *ifp = vty->index;
5885   struct in_addr area_id;
5886   struct in_addr addr;
5887   int format;
5888   struct ospf_if_params *params;
5889
5890   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
5891
5892   OSPF_VTY_GET_IF_PARAMS(ifp, params, 1, addr, VTY_SET);
5893   
5894   if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
5895     {
5896       vty_out (vty, "There is already an interface area statement.%s",
5897               VTY_NEWLINE);
5898       return CMD_WARNING;
5899     }
5900   if (memcmp (ifp->name, "VLINK", 5) == 0)
5901     {
5902       vty_out (vty, "Cannot enable OSPF on a virtual link.%s", VTY_NEWLINE);
5903       return CMD_WARNING;
5904     }
5905   
5906   SET_IF_PARAM (params, if_area);
5907   params->if_area = area_id;
5908   ospf_interface_area_set (ifp);
5909
5910   return CMD_SUCCESS;
5911 }
5912
5913 DEFUN (no_ip_ospf_area,
5914        no_ip_ospf_area_cmd,
5915        "no ip ospf area [A.B.C.D]",
5916        NO_STR
5917        "IP Information\n"
5918        "OSPF interface commands\n"
5919        "Disable OSPF on this interface\n"
5920        "Address of interface\n")
5921 {
5922   struct interface *ifp = vty->index;
5923   struct ospf_if_params *params;
5924   struct in_addr addr;
5925
5926   OSPF_VTY_GET_IF_PARAMS(ifp, params, 0, addr, VTY_UNSET);
5927   
5928   if (!OSPF_IF_PARAM_CONFIGURED(params, if_area))
5929     return CMD_SUCCESS;
5930   
5931   OSPF_VTY_PARAM_UNSET(params, if_area, ifp, addr);
5932   
5933   ospf_interface_area_unset (ifp);
5934
5935   return CMD_SUCCESS;
5936 }
5937
5938 DEFUN (ospf_redistribute_source,
5939        ospf_redistribute_source_cmd,
5940        "redistribute " QUAGGA_REDIST_STR_OSPFD
5941          " {metric <0-16777214>|metric-type (1|2)|route-map WORD}",
5942        REDIST_STR
5943        QUAGGA_REDIST_HELP_STR_OSPFD
5944        "Metric for redistributed routes\n"
5945        "OSPF default metric\n"
5946        "OSPF exterior metric type for redistributed routes\n"
5947        "Set OSPF External Type 1 metrics\n"
5948        "Set OSPF External Type 2 metrics\n"
5949        "Route map reference\n"
5950        "Pointer to route-map entries\n")
5951 {
5952   struct ospf *ospf = vty->index;
5953   int source;
5954   int type = -1;
5955   int metric = -1;
5956
5957   if (argc < 4)
5958     return CMD_WARNING; /* should not happen */
5959
5960   /* Get distribute source. */
5961   source = proto_redistnum(AFI_IP, argv[0]);
5962   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
5963     return CMD_WARNING;
5964
5965   /* Get metric value. */
5966   if (argv[1] != NULL)
5967     if (!str2metric (argv[1], &metric))
5968       return CMD_WARNING;
5969
5970   /* Get metric type. */
5971   if (argv[2] != NULL)
5972     if (!str2metric_type (argv[2], &type))
5973       return CMD_WARNING;
5974
5975   if (argv[3] != NULL)
5976     ospf_routemap_set (ospf, source, argv[3]);
5977   else
5978     ospf_routemap_unset (ospf, source);
5979
5980   return ospf_redistribute_set (ospf, source, type, metric);
5981 }
5982
5983 DEFUN (no_ospf_redistribute_source,
5984        no_ospf_redistribute_source_cmd,
5985        "no redistribute " QUAGGA_REDIST_STR_OSPFD,
5986        NO_STR
5987        REDIST_STR
5988        QUAGGA_REDIST_HELP_STR_OSPFD)
5989 {
5990   struct ospf *ospf = vty->index;
5991   int source;
5992
5993   source = proto_redistnum(AFI_IP, argv[0]);
5994   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
5995     return CMD_WARNING;
5996
5997   ospf_routemap_unset (ospf, source);
5998   return ospf_redistribute_unset (ospf, source);
5999 }
6000
6001 DEFUN (ospf_distribute_list_out,
6002        ospf_distribute_list_out_cmd,
6003        "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
6004        "Filter networks in routing updates\n"
6005        "Access-list name\n"
6006        OUT_STR
6007        QUAGGA_REDIST_HELP_STR_OSPFD)
6008 {
6009   struct ospf *ospf = vty->index;
6010   int source;
6011
6012   /* Get distribute source. */
6013   source = proto_redistnum(AFI_IP, argv[1]);
6014   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
6015     return CMD_WARNING;
6016
6017   return ospf_distribute_list_out_set (ospf, source, argv[0]);
6018 }
6019
6020 DEFUN (no_ospf_distribute_list_out,
6021        no_ospf_distribute_list_out_cmd,
6022        "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
6023        NO_STR
6024        "Filter networks in routing updates\n"
6025        "Access-list name\n"
6026        OUT_STR
6027        QUAGGA_REDIST_HELP_STR_OSPFD)
6028 {
6029   struct ospf *ospf = vty->index;
6030   int source;
6031
6032   source = proto_redistnum(AFI_IP, argv[1]);
6033   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
6034     return CMD_WARNING;
6035
6036   return ospf_distribute_list_out_unset (ospf, source, argv[0]);
6037 }
6038
6039 /* Default information originate. */
6040 DEFUN (ospf_default_information_originate,
6041        ospf_default_information_originate_cmd,
6042        "default-information originate "
6043          "{always|metric <0-16777214>|metric-type (1|2)|route-map WORD}",
6044        "Control distribution of default information\n"
6045        "Distribute a default route\n"
6046        "Always advertise default route\n"
6047        "OSPF default metric\n"
6048        "OSPF metric\n"
6049        "OSPF metric type for default routes\n"
6050        "Set OSPF External Type 1 metrics\n"
6051        "Set OSPF External Type 2 metrics\n"
6052        "Route map reference\n"
6053        "Pointer to route-map entries\n")
6054 {
6055   struct ospf *ospf = vty->index;
6056   int default_originate = DEFAULT_ORIGINATE_ZEBRA;
6057   int type = -1;
6058   int metric = -1;
6059
6060   if (argc < 4)
6061     return CMD_WARNING; /* this should not happen */
6062
6063   /* Check whether "always" was specified */
6064   if (argv[0] != NULL)
6065     default_originate = DEFAULT_ORIGINATE_ALWAYS;
6066
6067   /* Get metric value. */
6068   if (argv[1] != NULL)
6069     if (!str2metric (argv[1], &metric))
6070       return CMD_WARNING;
6071
6072   /* Get metric type. */
6073   if (argv[2] != NULL)
6074     if (!str2metric_type (argv[2], &type))
6075       return CMD_WARNING;
6076
6077   if (argv[3] != NULL)
6078     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[3]);
6079   else
6080     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6081
6082   return ospf_redistribute_default_set (ospf, default_originate,
6083                                         type, metric);
6084 }
6085
6086 DEFUN (no_ospf_default_information_originate,
6087        no_ospf_default_information_originate_cmd,
6088        "no default-information originate",
6089        NO_STR
6090        "Control distribution of default information\n"
6091        "Distribute a default route\n")
6092 {
6093   struct ospf *ospf = vty->index;
6094   struct prefix_ipv4 p;
6095     
6096   p.family = AF_INET;
6097   p.prefix.s_addr = 0;
6098   p.prefixlen = 0;
6099
6100   ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
6101
6102   if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6103     ospf_external_info_delete (DEFAULT_ROUTE, p);
6104     route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6105     EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6106   }
6107
6108   ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6109   return ospf_redistribute_default_unset (ospf);
6110 }
6111
6112 DEFUN (ospf_default_metric,
6113        ospf_default_metric_cmd,
6114        "default-metric <0-16777214>",
6115        "Set metric of redistributed routes\n"
6116        "Default metric\n")
6117 {
6118   struct ospf *ospf = vty->index;
6119   int metric = -1;
6120
6121   if (!str2metric (argv[0], &metric))
6122     return CMD_WARNING;
6123
6124   ospf->default_metric = metric;
6125
6126   return CMD_SUCCESS;
6127 }
6128
6129 DEFUN (no_ospf_default_metric,
6130        no_ospf_default_metric_cmd,
6131        "no default-metric",
6132        NO_STR
6133        "Set metric of redistributed routes\n")
6134 {
6135   struct ospf *ospf = vty->index;
6136
6137   ospf->default_metric = -1;
6138
6139   return CMD_SUCCESS;
6140 }
6141
6142 ALIAS (no_ospf_default_metric,
6143        no_ospf_default_metric_val_cmd,
6144        "no default-metric <0-16777214>",
6145        NO_STR
6146        "Set metric of redistributed routes\n"
6147        "Default metric\n")
6148
6149 DEFUN (ospf_distance,
6150        ospf_distance_cmd,
6151        "distance <1-255>",
6152        "Define an administrative distance\n"
6153        "OSPF Administrative distance\n")
6154 {
6155   struct ospf *ospf = vty->index;
6156
6157   ospf->distance_all = atoi (argv[0]);
6158
6159   return CMD_SUCCESS;
6160 }
6161
6162 DEFUN (no_ospf_distance,
6163        no_ospf_distance_cmd,
6164        "no distance <1-255>",
6165        NO_STR
6166        "Define an administrative distance\n"
6167        "OSPF Administrative distance\n")
6168 {
6169   struct ospf *ospf = vty->index;
6170
6171   ospf->distance_all = 0;
6172
6173   return CMD_SUCCESS;
6174 }
6175
6176 DEFUN (no_ospf_distance_ospf,
6177        no_ospf_distance_ospf_cmd,
6178        "no distance ospf {intra-area|inter-area|external}",
6179        NO_STR
6180        "Define an administrative distance\n"
6181        "OSPF Administrative distance\n"
6182        "OSPF Distance\n"
6183        "Intra-area routes\n"
6184        "Inter-area routes\n"
6185        "External routes\n")
6186 {
6187   struct ospf *ospf = vty->index;
6188
6189   if (argc < 3)
6190     return CMD_WARNING;
6191
6192   if (argv[0] != NULL)
6193     ospf->distance_intra = 0;
6194
6195   if (argv[1] != NULL)
6196     ospf->distance_inter = 0;
6197
6198   if (argv[2] != NULL)
6199     ospf->distance_external = 0;
6200
6201   if (argv[0] || argv[1] || argv[2])
6202     return CMD_SUCCESS;
6203
6204   /* If no arguments are given, clear all distance information */
6205   ospf->distance_intra = 0;
6206   ospf->distance_inter = 0;
6207   ospf->distance_external = 0;
6208
6209   return CMD_SUCCESS;
6210 }
6211
6212 DEFUN (ospf_distance_ospf,
6213        ospf_distance_ospf_cmd,
6214        "distance ospf "
6215          "{intra-area <1-255>|inter-area <1-255>|external <1-255>}",
6216        "Define an administrative distance\n"
6217        "OSPF Administrative distance\n"
6218        "Intra-area routes\n"
6219        "Distance for intra-area routes\n"
6220        "Inter-area routes\n"
6221        "Distance for inter-area routes\n"
6222        "External routes\n"
6223        "Distance for external routes\n")
6224 {
6225   struct ospf *ospf = vty->index;
6226
6227   if (argc < 3) /* should not happen */
6228     return CMD_WARNING;
6229
6230   if (!argv[0] && !argv[1] && !argv[2])
6231     {
6232       vty_out(vty, "%% Command incomplete. (Arguments required)%s",
6233               VTY_NEWLINE);
6234       return CMD_WARNING;
6235     }
6236
6237   if (argv[0] != NULL)
6238     ospf->distance_intra = atoi(argv[0]);
6239
6240   if (argv[1] != NULL)
6241     ospf->distance_inter = atoi(argv[1]);
6242
6243   if (argv[2] != NULL)
6244     ospf->distance_external = atoi(argv[2]);
6245
6246   return CMD_SUCCESS;
6247 }
6248
6249 DEFUN (ospf_distance_source,
6250        ospf_distance_source_cmd,
6251        "distance <1-255> A.B.C.D/M",
6252        "Administrative distance\n"
6253        "Distance value\n"
6254        "IP source prefix\n")
6255 {
6256   struct ospf *ospf = vty->index;
6257
6258   ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
6259
6260   return CMD_SUCCESS;
6261 }
6262
6263 DEFUN (no_ospf_distance_source,
6264        no_ospf_distance_source_cmd,
6265        "no distance <1-255> A.B.C.D/M",
6266        NO_STR
6267        "Administrative distance\n"
6268        "Distance value\n"
6269        "IP source prefix\n")
6270 {
6271   struct ospf *ospf = vty->index;
6272
6273   ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6274
6275   return CMD_SUCCESS;
6276 }
6277
6278 DEFUN (ospf_distance_source_access_list,
6279        ospf_distance_source_access_list_cmd,
6280        "distance <1-255> A.B.C.D/M WORD",
6281        "Administrative distance\n"
6282        "Distance value\n"
6283        "IP source prefix\n"
6284        "Access list name\n")
6285 {
6286   struct ospf *ospf = vty->index;
6287
6288   ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6289
6290   return CMD_SUCCESS;
6291 }
6292
6293 DEFUN (no_ospf_distance_source_access_list,
6294        no_ospf_distance_source_access_list_cmd,
6295        "no distance <1-255> A.B.C.D/M WORD",
6296        NO_STR
6297        "Administrative distance\n"
6298        "Distance value\n"
6299        "IP source prefix\n"
6300        "Access list name\n")
6301 {
6302   struct ospf *ospf = vty->index;
6303
6304   ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6305
6306   return CMD_SUCCESS;
6307 }
6308
6309 DEFUN (ip_ospf_mtu_ignore,
6310        ip_ospf_mtu_ignore_addr_cmd,
6311        "ip ospf mtu-ignore A.B.C.D",
6312        "IP Information\n"
6313        "OSPF interface commands\n"
6314        "Disable mtu mismatch detection\n"
6315        "Address of interface")
6316 {
6317   struct interface *ifp = vty->index;
6318   struct in_addr addr;
6319   int ret;
6320            
6321   struct ospf_if_params *params;
6322   params = IF_DEF_PARAMS (ifp);
6323          
6324   if (argc == 1)
6325     {
6326       ret = inet_aton(argv[0], &addr);
6327       if (!ret)
6328         {
6329           vty_out (vty, "Please specify interface address by A.B.C.D%s",
6330                   VTY_NEWLINE);
6331           return CMD_WARNING;
6332         }
6333       params = ospf_get_if_params (ifp, addr);
6334       ospf_if_update_params (ifp, addr);
6335     }
6336   params->mtu_ignore = 1;
6337   if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6338     SET_IF_PARAM (params, mtu_ignore);
6339   else 
6340     {
6341       UNSET_IF_PARAM (params, mtu_ignore);
6342       if (params != IF_DEF_PARAMS (ifp))
6343         {
6344           ospf_free_if_params (ifp, addr);
6345           ospf_if_update_params (ifp, addr);
6346         }
6347     }
6348   return CMD_SUCCESS;
6349 }
6350
6351 ALIAS (ip_ospf_mtu_ignore,
6352       ip_ospf_mtu_ignore_cmd,
6353       "ip ospf mtu-ignore",
6354       "IP Information\n"
6355       "OSPF interface commands\n"
6356       "Disable mtu mismatch detection\n")
6357
6358     
6359 DEFUN (no_ip_ospf_mtu_ignore,
6360        no_ip_ospf_mtu_ignore_addr_cmd,
6361        "no ip ospf mtu-ignore A.B.C.D",
6362        "IP Information\n"
6363        "OSPF interface commands\n"
6364        "Disable mtu mismatch detection\n"
6365        "Address of interface")
6366 {
6367   struct interface *ifp = vty->index;
6368   struct in_addr addr;
6369   int ret;
6370            
6371   struct ospf_if_params *params;
6372   params = IF_DEF_PARAMS (ifp);
6373          
6374   if (argc == 1)
6375     {
6376       ret = inet_aton(argv[0], &addr);
6377       if (!ret)
6378         {
6379           vty_out (vty, "Please specify interface address by A.B.C.D%s",
6380                   VTY_NEWLINE);
6381           return CMD_WARNING;
6382         }
6383       params = ospf_get_if_params (ifp, addr);
6384       ospf_if_update_params (ifp, addr);
6385     }
6386   params->mtu_ignore = 0;
6387   if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6388     SET_IF_PARAM (params, mtu_ignore);
6389   else 
6390     {
6391       UNSET_IF_PARAM (params, mtu_ignore);
6392       if (params != IF_DEF_PARAMS (ifp))
6393         {
6394           ospf_free_if_params (ifp, addr);
6395           ospf_if_update_params (ifp, addr);
6396         }
6397     }
6398   return CMD_SUCCESS;
6399 }
6400
6401 ALIAS (no_ip_ospf_mtu_ignore,
6402        no_ip_ospf_mtu_ignore_cmd,
6403       "no ip ospf mtu-ignore",
6404       "IP Information\n"
6405       "OSPF interface commands\n"
6406       "Disable mtu mismatch detection\n")
6407
6408 DEFUN (ospf_max_metric_router_lsa_admin,
6409        ospf_max_metric_router_lsa_admin_cmd,
6410        "max-metric router-lsa administrative",
6411        "OSPF maximum / infinite-distance metric\n"
6412        "Advertise own Router-LSA with infinite distance (stub router)\n"
6413        "Administratively applied, for an indefinite period\n")
6414 {
6415   struct listnode *ln;
6416   struct ospf_area *area;
6417   struct ospf *ospf = vty->index;
6418     
6419   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6420     {
6421       SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6422       
6423       if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
6424           ospf_router_lsa_update_area (area);
6425     }
6426
6427   /* Allows for areas configured later to get the property */
6428   ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
6429
6430   return CMD_SUCCESS;
6431 }
6432
6433 DEFUN (no_ospf_max_metric_router_lsa_admin,
6434        no_ospf_max_metric_router_lsa_admin_cmd,
6435        "no max-metric router-lsa administrative",
6436        NO_STR
6437        "OSPF maximum / infinite-distance metric\n"
6438        "Advertise own Router-LSA with infinite distance (stub router)\n"
6439        "Administratively applied, for an indefinite period\n")
6440 {
6441   struct listnode *ln;
6442   struct ospf_area *area;
6443   struct ospf *ospf = vty->index;
6444     
6445   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6446     {
6447       UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6448       
6449       /* Don't trample on the start-up stub timer */
6450       if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
6451           && !area->t_stub_router)
6452         {
6453           UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
6454           ospf_router_lsa_update_area (area);
6455         }
6456     }
6457   ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
6458   return CMD_SUCCESS;
6459 }
6460
6461 DEFUN (ospf_max_metric_router_lsa_startup,
6462        ospf_max_metric_router_lsa_startup_cmd,
6463        "max-metric router-lsa on-startup <5-86400>",
6464        "OSPF maximum / infinite-distance metric\n"
6465        "Advertise own Router-LSA with infinite distance (stub router)\n"
6466        "Automatically advertise stub Router-LSA on startup of OSPF\n"
6467        "Time (seconds) to advertise self as stub-router\n")
6468 {
6469   unsigned int seconds;
6470   struct ospf *ospf = vty->index;
6471     
6472   if (argc != 1)
6473     {
6474       vty_out (vty, "%% Must supply stub-router period");
6475       return CMD_WARNING;
6476     }
6477   
6478   VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
6479   
6480   ospf->stub_router_startup_time = seconds;
6481   
6482   return CMD_SUCCESS;
6483 }
6484
6485 DEFUN (no_ospf_max_metric_router_lsa_startup,
6486        no_ospf_max_metric_router_lsa_startup_cmd,
6487        "no max-metric router-lsa on-startup",
6488        NO_STR
6489        "OSPF maximum / infinite-distance metric\n"
6490        "Advertise own Router-LSA with infinite distance (stub router)\n"
6491        "Automatically advertise stub Router-LSA on startup of OSPF\n")
6492 {
6493   struct listnode *ln;
6494   struct ospf_area *area;
6495   struct ospf *ospf = vty->index;
6496   
6497   ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6498   
6499   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6500     {
6501       SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
6502       OSPF_TIMER_OFF (area->t_stub_router);
6503       
6504       /* Don't trample on admin stub routed */
6505       if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6506         {
6507           UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
6508           ospf_router_lsa_update_area (area);
6509         }
6510     }
6511   return CMD_SUCCESS;
6512 }
6513
6514 DEFUN (ospf_max_metric_router_lsa_shutdown,
6515        ospf_max_metric_router_lsa_shutdown_cmd,
6516        "max-metric router-lsa on-shutdown <5-86400>",
6517        "OSPF maximum / infinite-distance metric\n"
6518        "Advertise own Router-LSA with infinite distance (stub router)\n"
6519        "Advertise stub-router prior to full shutdown of OSPF\n"
6520        "Time (seconds) to wait till full shutdown\n")
6521 {
6522   unsigned int seconds;
6523   struct ospf *ospf = vty->index;
6524     
6525   if (argc != 1)
6526     {
6527       vty_out (vty, "%% Must supply stub-router shutdown period");
6528       return CMD_WARNING;
6529     }
6530   
6531   VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
6532   
6533   ospf->stub_router_shutdown_time = seconds;
6534   
6535   return CMD_SUCCESS;
6536 }
6537
6538 DEFUN (no_ospf_max_metric_router_lsa_shutdown,
6539        no_ospf_max_metric_router_lsa_shutdown_cmd,
6540        "no max-metric router-lsa on-shutdown",
6541        NO_STR
6542        "OSPF maximum / infinite-distance metric\n"
6543        "Advertise own Router-LSA with infinite distance (stub router)\n"
6544        "Advertise stub-router prior to full shutdown of OSPF\n")
6545 {
6546   struct ospf *ospf = vty->index;
6547     
6548   ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6549   
6550   return CMD_SUCCESS;
6551 }
6552
6553 static void
6554 config_write_stub_router (struct vty *vty, struct ospf *ospf)
6555 {
6556   struct listnode *ln;
6557   struct ospf_area *area;
6558   
6559   if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6560     vty_out (vty, " max-metric router-lsa on-startup %u%s",
6561              ospf->stub_router_startup_time, VTY_NEWLINE);
6562   if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6563     vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
6564              ospf->stub_router_shutdown_time, VTY_NEWLINE);
6565   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6566     {
6567       if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6568         {
6569           vty_out (vty, " max-metric router-lsa administrative%s",
6570                    VTY_NEWLINE);
6571           break;
6572         }
6573     }
6574   return;
6575 }
6576
6577 static void
6578 show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
6579 {
6580   struct route_node *rn;
6581   struct ospf_route *or;
6582   struct listnode *pnode, *pnnode;
6583   struct ospf_path *path;
6584
6585   vty_out (vty, "============ OSPF network routing table ============%s",
6586            VTY_NEWLINE);
6587
6588   for (rn = route_top (rt); rn; rn = route_next (rn))
6589     if ((or = rn->info) != NULL)
6590       {
6591         char buf1[19];
6592         snprintf (buf1, 19, "%s/%d",
6593                   inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
6594
6595         switch (or->path_type)
6596           {
6597           case OSPF_PATH_INTER_AREA:
6598             if (or->type == OSPF_DESTINATION_NETWORK)
6599               vty_out (vty, "N IA %-18s    [%d] area: %s%s", buf1, or->cost,
6600                        inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
6601             else if (or->type == OSPF_DESTINATION_DISCARD)
6602               vty_out (vty, "D IA %-18s    Discard entry%s", buf1, VTY_NEWLINE);
6603             break;
6604           case OSPF_PATH_INTRA_AREA:
6605             vty_out (vty, "N    %-18s    [%d] area: %s%s", buf1, or->cost,
6606                      inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
6607             break;
6608           default:
6609             break;
6610           }
6611
6612         if (or->type == OSPF_DESTINATION_NETWORK)
6613           for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
6614             {
6615               if (if_lookup_by_index(path->ifindex))
6616                 {
6617                   if (path->nexthop.s_addr == 0)
6618                     vty_out (vty, "%24s   directly attached to %s%s",
6619                              "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
6620                   else
6621                     vty_out (vty, "%24s   via %s, %s%s", "",
6622                              inet_ntoa (path->nexthop),
6623                              ifindex2ifname (path->ifindex), VTY_NEWLINE);
6624                 }
6625             }
6626       }
6627   vty_out (vty, "%s", VTY_NEWLINE);
6628 }
6629
6630 static void
6631 show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
6632 {
6633   struct route_node *rn;
6634   struct ospf_route *or;
6635   struct listnode *pnode;
6636   struct listnode *node;
6637   struct ospf_path *path;
6638
6639   vty_out (vty, "============ OSPF router routing table =============%s",
6640            VTY_NEWLINE);
6641   for (rn = route_top (rtrs); rn; rn = route_next (rn))
6642     if (rn->info)
6643       {
6644         int flag = 0;
6645
6646         vty_out (vty, "R    %-15s    ", inet_ntoa (rn->p.u.prefix4));
6647
6648         for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
6649           {
6650             if (flag++)
6651           vty_out (vty, "%24s", "");
6652
6653             /* Show path. */
6654             vty_out (vty, "%s [%d] area: %s",
6655                      (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : "  "),
6656                      or->cost, inet_ntoa (or->u.std.area_id));
6657             /* Show flags. */
6658             vty_out (vty, "%s%s%s",
6659                      (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
6660                      (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
6661                      VTY_NEWLINE);
6662                   
6663                   for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
6664                     {
6665                       if (if_lookup_by_index(path->ifindex))
6666                         {
6667                           if (path->nexthop.s_addr == 0)
6668                             vty_out (vty, "%24s   directly attached to %s%s",
6669                                      "", ifindex2ifname (path->ifindex),
6670                                      VTY_NEWLINE);
6671                           else
6672                             vty_out (vty, "%24s   via %s, %s%s", "",
6673                                      inet_ntoa (path->nexthop),
6674                                      ifindex2ifname (path->ifindex),
6675                                      VTY_NEWLINE);
6676                         }
6677                     }
6678           }
6679       }
6680   vty_out (vty, "%s", VTY_NEWLINE);
6681 }
6682
6683 static void
6684 show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
6685 {
6686   struct route_node *rn;
6687   struct ospf_route *er;
6688   struct listnode *pnode, *pnnode;
6689   struct ospf_path *path;
6690
6691   vty_out (vty, "============ OSPF external routing table ===========%s",
6692            VTY_NEWLINE);
6693   for (rn = route_top (rt); rn; rn = route_next (rn))
6694     if ((er = rn->info) != NULL)
6695       {
6696         char buf1[19];
6697         snprintf (buf1, 19, "%s/%d",
6698                   inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
6699
6700         switch (er->path_type)
6701           {
6702           case OSPF_PATH_TYPE1_EXTERNAL:
6703             vty_out (vty, "N E1 %-18s    [%d] tag: %u%s", buf1,
6704                      er->cost, er->u.ext.tag, VTY_NEWLINE);
6705             break;
6706           case OSPF_PATH_TYPE2_EXTERNAL:
6707             vty_out (vty, "N E2 %-18s    [%d/%d] tag: %u%s", buf1, er->cost,
6708                      er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
6709             break;
6710           }
6711
6712         for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
6713           {
6714             if (if_lookup_by_index(path->ifindex))
6715               {
6716                 if (path->nexthop.s_addr == 0)
6717                   vty_out (vty, "%24s   directly attached to %s%s",
6718                            "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
6719                 else
6720                   vty_out (vty, "%24s   via %s, %s%s", "",
6721                            inet_ntoa (path->nexthop),
6722                            ifindex2ifname (path->ifindex),
6723                            VTY_NEWLINE);
6724               }
6725            }
6726         }
6727   vty_out (vty, "%s", VTY_NEWLINE);
6728 }
6729
6730 DEFUN (show_ip_ospf_border_routers,
6731        show_ip_ospf_border_routers_cmd,
6732        "show ip ospf border-routers",
6733        SHOW_STR
6734        IP_STR
6735        "show all the ABR's and ASBR's\n"
6736        "for this area\n")
6737 {
6738   struct ospf *ospf;
6739
6740   if ((ospf = ospf_lookup ()) == NULL)
6741     {
6742       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
6743       return CMD_SUCCESS;
6744     }
6745
6746   if (ospf->new_table == NULL)
6747     {
6748       vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
6749       return CMD_SUCCESS;
6750     }
6751
6752   /* Show Network routes.
6753   show_ip_ospf_route_network (vty, ospf->new_table);   */
6754
6755   /* Show Router routes. */
6756   show_ip_ospf_route_router (vty, ospf->new_rtrs);
6757
6758   return CMD_SUCCESS;
6759 }
6760
6761 DEFUN (show_ip_ospf_route,
6762        show_ip_ospf_route_cmd,
6763        "show ip ospf route",
6764        SHOW_STR
6765        IP_STR
6766        "OSPF information\n"
6767        "OSPF routing table\n")
6768 {
6769   struct ospf *ospf;
6770
6771   if ((ospf = ospf_lookup ()) == NULL)
6772     {
6773       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
6774       return CMD_SUCCESS;
6775     }
6776
6777   if (ospf->new_table == NULL)
6778     {
6779       vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
6780       return CMD_SUCCESS;
6781     }
6782
6783   /* Show Network routes. */
6784   show_ip_ospf_route_network (vty, ospf->new_table);
6785
6786   /* Show Router routes. */
6787   show_ip_ospf_route_router (vty, ospf->new_rtrs);
6788
6789   /* Show AS External routes. */
6790   show_ip_ospf_route_external (vty, ospf->old_external_route);
6791
6792   return CMD_SUCCESS;
6793 }
6794
6795
6796 const char *ospf_abr_type_str[] = 
6797 {
6798   "unknown",
6799   "standard",
6800   "ibm",
6801   "cisco",
6802   "shortcut"
6803 };
6804
6805 const char *ospf_shortcut_mode_str[] = 
6806 {
6807   "default",
6808   "enable",
6809   "disable"
6810 };
6811
6812
6813 static void
6814 area_id2str (char *buf, int length, struct ospf_area *area)
6815 {
6816   memset (buf, 0, length);
6817
6818   if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
6819     strncpy (buf, inet_ntoa (area->area_id), length);
6820   else
6821     sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
6822 }
6823
6824
6825 const char *ospf_int_type_str[] = 
6826 {
6827   "unknown",            /* should never be used. */
6828   "point-to-point",
6829   "broadcast",
6830   "non-broadcast",
6831   "point-to-multipoint",
6832   "virtual-link",       /* should never be used. */
6833   "loopback"
6834 };
6835
6836 /* Configuration write function for ospfd. */
6837 static int
6838 config_write_interface (struct vty *vty)
6839 {
6840   struct listnode *n1, *n2;
6841   struct interface *ifp;
6842   struct crypt_key *ck;
6843   int write = 0;
6844   struct route_node *rn = NULL;
6845   struct ospf_if_params *params;
6846
6847   for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
6848     {
6849       if (memcmp (ifp->name, "VLINK", 5) == 0)
6850         continue;
6851
6852       vty_out (vty, "!%s", VTY_NEWLINE);
6853       vty_out (vty, "interface %s%s", ifp->name,
6854                VTY_NEWLINE);
6855       if (ifp->desc)
6856         vty_out (vty, " description %s%s", ifp->desc,
6857                VTY_NEWLINE);
6858
6859       write++;
6860
6861       params = IF_DEF_PARAMS (ifp);
6862       
6863       do {
6864         /* Interface Network print. */
6865         if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
6866             params->type != OSPF_IFTYPE_LOOPBACK)
6867           {
6868             if (params->type != ospf_default_iftype(ifp))
6869               {
6870                 vty_out (vty, " ip ospf network %s",
6871                          ospf_int_type_str[params->type]);
6872                 if (params != IF_DEF_PARAMS (ifp))
6873                   vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6874                 vty_out (vty, "%s", VTY_NEWLINE);
6875               }
6876           }
6877         
6878         /* OSPF interface authentication print */
6879         if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
6880             params->auth_type != OSPF_AUTH_NOTSET)
6881           {
6882             const char *auth_str;
6883             
6884             /* Translation tables are not that much help here due to syntax
6885                of the simple option */
6886             switch (params->auth_type)
6887               {
6888                 
6889               case OSPF_AUTH_NULL:
6890                 auth_str = " null";
6891                 break;
6892                 
6893               case OSPF_AUTH_SIMPLE:
6894                 auth_str = "";
6895                 break;
6896                 
6897               case OSPF_AUTH_CRYPTOGRAPHIC:
6898                 auth_str = " message-digest";
6899                 break;
6900                 
6901               default:
6902                 auth_str = "";
6903                 break;
6904               }
6905             
6906             vty_out (vty, " ip ospf authentication%s", auth_str);
6907             if (params != IF_DEF_PARAMS (ifp))
6908               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6909             vty_out (vty, "%s", VTY_NEWLINE);
6910           }
6911
6912         /* Simple Authentication Password print. */
6913         if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
6914             params->auth_simple[0] != '\0')
6915           {
6916             vty_out (vty, " ip ospf authentication-key %s",
6917                      params->auth_simple);
6918             if (params != IF_DEF_PARAMS (ifp))
6919               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6920             vty_out (vty, "%s", VTY_NEWLINE);
6921           }
6922         
6923         /* Cryptographic Authentication Key print. */
6924         for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
6925           {
6926             vty_out (vty, " ip ospf message-digest-key %d md5 %s",
6927                      ck->key_id, ck->auth_key);
6928             if (params != IF_DEF_PARAMS (ifp))
6929               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6930             vty_out (vty, "%s", VTY_NEWLINE);
6931           }
6932         
6933         /* Interface Output Cost print. */
6934         if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
6935           {
6936             vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
6937             if (params != IF_DEF_PARAMS (ifp))
6938               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6939             vty_out (vty, "%s", VTY_NEWLINE);
6940           }
6941         
6942         /* Hello Interval print. */
6943         if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
6944             params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
6945           {
6946             vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
6947             if (params != IF_DEF_PARAMS (ifp))
6948               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6949             vty_out (vty, "%s", VTY_NEWLINE);
6950           }
6951         
6952         
6953         /* Router Dead Interval print. */
6954         if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
6955             params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
6956           {
6957             vty_out (vty, " ip ospf dead-interval ");
6958             
6959             /* fast hello ? */
6960             if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
6961               vty_out (vty, "minimal hello-multiplier %d",
6962                        params->fast_hello);
6963             else
6964               vty_out (vty, "%u", params->v_wait);
6965             
6966             if (params != IF_DEF_PARAMS (ifp))
6967               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6968             vty_out (vty, "%s", VTY_NEWLINE);
6969           }
6970         
6971       /* Router Priority print. */
6972         if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
6973             params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
6974           {
6975             vty_out (vty, " ip ospf priority %u", params->priority);
6976             if (params != IF_DEF_PARAMS (ifp))
6977               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6978             vty_out (vty, "%s", VTY_NEWLINE);
6979           }
6980         
6981         /* Retransmit Interval print. */
6982         if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
6983             params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
6984           {
6985             vty_out (vty, " ip ospf retransmit-interval %u",
6986                      params->retransmit_interval);
6987             if (params != IF_DEF_PARAMS (ifp))
6988               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6989             vty_out (vty, "%s", VTY_NEWLINE);
6990           }
6991         
6992         /* Transmit Delay print. */
6993         if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
6994             params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
6995           {
6996             vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
6997             if (params != IF_DEF_PARAMS (ifp))
6998               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6999             vty_out (vty, "%s", VTY_NEWLINE);
7000           }
7001
7002         /* Area  print. */
7003         if (OSPF_IF_PARAM_CONFIGURED (params, if_area))
7004           {
7005             vty_out (vty, " ip ospf area %s", inet_ntoa (params->if_area));
7006             if (params != IF_DEF_PARAMS (ifp))
7007               vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7008             vty_out (vty, "%s", VTY_NEWLINE);
7009           }
7010
7011     /* MTU ignore print. */
7012     if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7013        params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7014       {
7015         if (params->mtu_ignore == 0)
7016           vty_out (vty, " no ip ospf mtu-ignore");
7017         else
7018           vty_out (vty, " ip ospf mtu-ignore");
7019         if (params != IF_DEF_PARAMS (ifp))
7020            vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7021         vty_out (vty, "%s", VTY_NEWLINE);
7022       }
7023
7024
7025         while (1)
7026           {
7027             if (rn == NULL)
7028               rn = route_top (IF_OIFS_PARAMS (ifp));
7029             else
7030               rn = route_next (rn);
7031
7032             if (rn == NULL)
7033               break;
7034             params = rn->info;
7035             if (params != NULL)
7036               break;
7037           }
7038       } while (rn);
7039       
7040       ospf_opaque_config_write_if (vty, ifp);
7041     }
7042
7043   return write;
7044 }
7045
7046 static int
7047 config_write_network_area (struct vty *vty, struct ospf *ospf)
7048 {
7049   struct route_node *rn;
7050   u_char buf[INET_ADDRSTRLEN];
7051
7052   /* `network area' print. */
7053   for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
7054     if (rn->info)
7055       {
7056         struct ospf_network *n = rn->info;
7057
7058         memset (buf, 0, INET_ADDRSTRLEN);
7059
7060         /* Create Area ID string by specified Area ID format. */
7061         if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7062           strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
7063         else
7064           sprintf ((char *) buf, "%lu", 
7065                    (unsigned long int) ntohl (n->area_id.s_addr));
7066
7067         /* Network print. */
7068         vty_out (vty, " network %s/%d area %s%s",
7069                  inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7070                  buf, VTY_NEWLINE);
7071       }
7072
7073   return 0;
7074 }
7075
7076 static int
7077 config_write_ospf_area (struct vty *vty, struct ospf *ospf)
7078 {
7079   struct listnode *node;
7080   struct ospf_area *area;
7081   u_char buf[INET_ADDRSTRLEN];
7082
7083   /* Area configuration print. */
7084   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
7085     {
7086       struct route_node *rn1;
7087
7088       area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
7089
7090       if (area->auth_type != OSPF_AUTH_NULL)
7091         {
7092           if (area->auth_type == OSPF_AUTH_SIMPLE)
7093             vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7094           else
7095             vty_out (vty, " area %s authentication message-digest%s",
7096                      buf, VTY_NEWLINE);
7097         }
7098
7099       if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7100         vty_out (vty, " area %s shortcut %s%s", buf,
7101                  ospf_shortcut_mode_str[area->shortcut_configured],
7102                  VTY_NEWLINE);
7103
7104       if ((area->external_routing == OSPF_AREA_STUB)
7105           || (area->external_routing == OSPF_AREA_NSSA)
7106           )
7107         {
7108           if (area->external_routing == OSPF_AREA_STUB)
7109             vty_out (vty, " area %s stub", buf);
7110           else if (area->external_routing == OSPF_AREA_NSSA)
7111             {
7112               vty_out (vty, " area %s nssa", buf);
7113               switch (area->NSSATranslatorRole)
7114                 {
7115                   case OSPF_NSSA_ROLE_NEVER:
7116                     vty_out (vty, " translate-never");
7117                     break;
7118                   case OSPF_NSSA_ROLE_ALWAYS:
7119                     vty_out (vty, " translate-always");
7120                     break;
7121                   case OSPF_NSSA_ROLE_CANDIDATE:
7122                   default:
7123                     vty_out (vty, " translate-candidate");
7124                 }
7125             }
7126
7127           if (area->no_summary)
7128             vty_out (vty, " no-summary");
7129
7130           vty_out (vty, "%s", VTY_NEWLINE);
7131
7132           if (area->default_cost != 1)
7133             vty_out (vty, " area %s default-cost %d%s", buf, 
7134                      area->default_cost, VTY_NEWLINE);
7135         }
7136
7137       for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7138         if (rn1->info)
7139           {
7140             struct ospf_area_range *range = rn1->info;
7141
7142             vty_out (vty, " area %s range %s/%d", buf,
7143                      inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7144
7145             if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
7146               vty_out (vty, " cost %d", range->cost_config);
7147
7148             if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7149               vty_out (vty, " not-advertise");
7150
7151             if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7152               vty_out (vty, " substitute %s/%d",
7153                        inet_ntoa (range->subst_addr), range->subst_masklen);
7154
7155             vty_out (vty, "%s", VTY_NEWLINE);
7156           }
7157
7158       if (EXPORT_NAME (area))
7159         vty_out (vty, " area %s export-list %s%s", buf,
7160                  EXPORT_NAME (area), VTY_NEWLINE);
7161
7162       if (IMPORT_NAME (area))
7163         vty_out (vty, " area %s import-list %s%s", buf,
7164                  IMPORT_NAME (area), VTY_NEWLINE);
7165
7166       if (PREFIX_NAME_IN (area))
7167         vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7168                  PREFIX_NAME_IN (area), VTY_NEWLINE);
7169
7170       if (PREFIX_NAME_OUT (area))
7171         vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7172                  PREFIX_NAME_OUT (area), VTY_NEWLINE);
7173     }
7174
7175   return 0;
7176 }
7177
7178 static int
7179 config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
7180 {
7181   struct ospf_nbr_nbma *nbr_nbma;
7182   struct route_node *rn;
7183
7184   /* Static Neighbor configuration print. */
7185   for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
7186     if ((nbr_nbma = rn->info))
7187       {
7188         vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7189
7190         if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7191           vty_out (vty, " priority %d", nbr_nbma->priority);
7192
7193         if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7194           vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7195
7196         vty_out (vty, "%s", VTY_NEWLINE);
7197       }
7198
7199   return 0;
7200 }
7201
7202 static int
7203 config_write_virtual_link (struct vty *vty, struct ospf *ospf)
7204 {
7205   struct listnode *node;
7206   struct ospf_vl_data *vl_data;
7207   u_char buf[INET_ADDRSTRLEN];
7208
7209   /* Virtual-Link print */
7210   for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
7211     {
7212       struct listnode *n2;
7213       struct crypt_key *ck;
7214       struct ospf_interface *oi;
7215
7216       if (vl_data != NULL)
7217         {
7218           memset (buf, 0, INET_ADDRSTRLEN);
7219           
7220           if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7221             strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
7222           else
7223             sprintf ((char *) buf, "%lu", 
7224                      (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7225           oi = vl_data->vl_oi;
7226
7227           /* timers */
7228           if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7229               OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7230               OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7231               OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7232             vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7233                      buf,
7234                      inet_ntoa (vl_data->vl_peer), 
7235                      OSPF_IF_PARAM (oi, v_hello),
7236                      OSPF_IF_PARAM (oi, retransmit_interval),
7237                      OSPF_IF_PARAM (oi, transmit_delay),
7238                      OSPF_IF_PARAM (oi, v_wait),
7239                      VTY_NEWLINE);
7240           else
7241             vty_out (vty, " area %s virtual-link %s%s", buf,
7242                      inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7243           /* Auth key */
7244           if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7245             vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7246                      buf,
7247                      inet_ntoa (vl_data->vl_peer),
7248                      IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7249                      VTY_NEWLINE);
7250           /* md5 keys */
7251           for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7252                                      n2, ck))
7253             vty_out (vty, " area %s virtual-link %s"
7254                      " message-digest-key %d md5 %s%s",
7255                      buf,
7256                      inet_ntoa (vl_data->vl_peer),
7257                      ck->key_id, ck->auth_key, VTY_NEWLINE);
7258          
7259         }
7260     }
7261
7262   return 0;
7263 }
7264
7265
7266 static int
7267 config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
7268 {
7269   int type;
7270
7271   /* redistribute print. */
7272   for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7273     if (type != zclient->redist_default &&
7274         vrf_bitmap_check (zclient->redist[type], VRF_DEFAULT))
7275       {
7276         vty_out (vty, " redistribute %s", zebra_route_string(type));
7277         if (ospf->dmetric[type].value >= 0)
7278           vty_out (vty, " metric %d", ospf->dmetric[type].value);
7279         
7280         if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
7281           vty_out (vty, " metric-type 1");
7282
7283         if (ROUTEMAP_NAME (ospf, type))
7284           vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
7285         
7286         vty_out (vty, "%s", VTY_NEWLINE);
7287       }
7288
7289   return 0;
7290 }
7291
7292 static int
7293 config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
7294 {
7295   if (ospf->default_metric != -1)
7296     vty_out (vty, " default-metric %d%s", ospf->default_metric,
7297              VTY_NEWLINE);
7298   return 0;
7299 }
7300
7301 static int
7302 config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
7303 {
7304   int type;
7305
7306   if (ospf)
7307     {
7308       /* distribute-list print. */
7309       for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7310         if (DISTRIBUTE_NAME (ospf, type))
7311           vty_out (vty, " distribute-list %s out %s%s", 
7312                    DISTRIBUTE_NAME (ospf, type),
7313                    zebra_route_string(type), VTY_NEWLINE);
7314
7315       /* default-information print. */
7316       if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
7317         {
7318           vty_out (vty, " default-information originate");
7319           if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7320             vty_out (vty, " always");
7321
7322           if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
7323             vty_out (vty, " metric %d",
7324                      ospf->dmetric[DEFAULT_ROUTE].value);
7325           if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
7326             vty_out (vty, " metric-type 1");
7327
7328           if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7329             vty_out (vty, " route-map %s",
7330                      ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
7331           
7332           vty_out (vty, "%s", VTY_NEWLINE);
7333         }
7334
7335     }
7336
7337   return 0;
7338 }
7339
7340 static int
7341 config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
7342 {
7343   struct route_node *rn;
7344   struct ospf_distance *odistance;
7345
7346   if (ospf->distance_all)
7347     vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
7348
7349   if (ospf->distance_intra 
7350       || ospf->distance_inter 
7351       || ospf->distance_external)
7352     {
7353       vty_out (vty, " distance ospf");
7354
7355       if (ospf->distance_intra)
7356         vty_out (vty, " intra-area %d", ospf->distance_intra);
7357       if (ospf->distance_inter)
7358         vty_out (vty, " inter-area %d", ospf->distance_inter);
7359       if (ospf->distance_external)
7360         vty_out (vty, " external %d", ospf->distance_external);
7361
7362       vty_out (vty, "%s", VTY_NEWLINE);
7363     }
7364   
7365   for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
7366     if ((odistance = rn->info) != NULL)
7367       {
7368         vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7369                  inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7370                  odistance->access_list ? odistance->access_list : "",
7371                  VTY_NEWLINE);
7372       }
7373   return 0;
7374 }
7375
7376 /* OSPF configuration write function. */
7377 static int
7378 ospf_config_write (struct vty *vty)
7379 {
7380   struct ospf *ospf;
7381   struct interface *ifp;
7382   struct ospf_interface *oi;
7383   struct listnode *node;
7384   int write = 0;
7385
7386   ospf = ospf_lookup ();
7387   if (ospf != NULL)
7388     {
7389       /* `router ospf' print. */
7390       vty_out (vty, "router ospf%s", VTY_NEWLINE);
7391
7392       write++;
7393
7394       if (!ospf->networks)
7395         return write;
7396
7397       /* Router ID print. */
7398       if (ospf->router_id_static.s_addr != 0)
7399         vty_out (vty, " ospf router-id %s%s",
7400                  inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
7401
7402       /* ABR type print. */
7403       if (ospf->abr_type != OSPF_ABR_DEFAULT)
7404         vty_out (vty, " ospf abr-type %s%s", 
7405                  ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
7406
7407       /* log-adjacency-changes flag print. */
7408       if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
7409         {
7410           vty_out(vty, " log-adjacency-changes");
7411           if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
7412             vty_out(vty, " detail");
7413           vty_out(vty, "%s", VTY_NEWLINE);
7414         }
7415
7416       /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
7417       if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
7418         vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
7419
7420       /* auto-cost reference-bandwidth configuration.  */
7421       if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
7422         {
7423           vty_out (vty, "! Important: ensure reference bandwidth "
7424                         "is consistent across all routers%s", VTY_NEWLINE);
7425           vty_out (vty, " auto-cost reference-bandwidth %d%s",
7426                    ospf->ref_bandwidth / 1000, VTY_NEWLINE);
7427         }
7428
7429       /* LSA timers */
7430       if (ospf->min_ls_interval != OSPF_MIN_LS_INTERVAL)
7431   vty_out (vty, " timers throttle lsa all %d%s",
7432      ospf->min_ls_interval, VTY_NEWLINE);
7433       if (ospf->min_ls_arrival != OSPF_MIN_LS_ARRIVAL)
7434   vty_out (vty, " timers lsa arrival %d%s",
7435      ospf->min_ls_arrival, VTY_NEWLINE);
7436
7437       /* SPF timers print. */
7438       if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
7439           ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
7440           ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
7441         vty_out (vty, " timers throttle spf %d %d %d%s",
7442                  ospf->spf_delay, ospf->spf_holdtime,
7443                  ospf->spf_max_holdtime, VTY_NEWLINE);
7444       
7445       /* Max-metric router-lsa print */
7446       config_write_stub_router (vty, ospf);
7447       
7448       /* SPF refresh parameters print. */
7449       if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
7450         vty_out (vty, " refresh timer %d%s",
7451                  ospf->lsa_refresh_interval, VTY_NEWLINE);
7452
7453       /* Redistribute information print. */
7454       config_write_ospf_redistribute (vty, ospf);
7455
7456       /* passive-interface print. */
7457       if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
7458         vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
7459       
7460       for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
7461         if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
7462             && IF_DEF_PARAMS (ifp)->passive_interface != 
7463                               ospf->passive_interface_default)
7464           {
7465             vty_out (vty, " %spassive-interface %s%s",
7466                      IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
7467                      ifp->name, VTY_NEWLINE);
7468           }
7469       for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
7470         {
7471           if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
7472             continue;
7473           if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
7474                                         passive_interface))
7475             {
7476               if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
7477                 continue;
7478             }
7479           else if (oi->params->passive_interface == ospf->passive_interface_default)
7480             continue;
7481           
7482           vty_out (vty, " %spassive-interface %s %s%s",
7483                    oi->params->passive_interface ? "" : "no ",
7484                    oi->ifp->name,
7485                    inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
7486         }
7487       
7488       /* Network area print. */
7489       config_write_network_area (vty, ospf);
7490
7491       /* Area config print. */
7492       config_write_ospf_area (vty, ospf);
7493
7494       /* static neighbor print. */
7495       config_write_ospf_nbr_nbma (vty, ospf);
7496
7497       /* Virtual-Link print. */
7498       config_write_virtual_link (vty, ospf);
7499
7500       /* Default metric configuration.  */
7501       config_write_ospf_default_metric (vty, ospf);
7502
7503       /* Distribute-list and default-information print. */
7504       config_write_ospf_distribute (vty, ospf);
7505
7506       /* Distance configuration. */
7507       config_write_ospf_distance (vty, ospf);
7508
7509       ospf_opaque_config_write_router (vty, ospf);
7510     }
7511
7512   return write;
7513 }
7514
7515 void
7516 ospf_vty_show_init (void)
7517 {
7518   /* "show ip ospf" commands. */
7519   install_element (VIEW_NODE, &show_ip_ospf_cmd);
7520
7521   /* "show ip ospf database" commands. */
7522   install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
7523   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
7524   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
7525   install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
7526   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
7527   install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
7528   install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
7529
7530   /* "show ip ospf interface" commands. */
7531   install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
7532
7533   /* "show ip ospf neighbor" commands. */
7534   install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
7535   install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
7536   install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
7537   install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
7538   install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
7539   install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
7540   install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
7541
7542   /* "show ip ospf route" commands. */
7543   install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
7544   install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
7545 }
7546
7547
7548 /* ospfd's interface node. */
7549 static struct cmd_node interface_node =
7550 {
7551   INTERFACE_NODE,
7552   "%s(config-if)# ",
7553   1
7554 };
7555
7556 /* Initialization of OSPF interface. */
7557 static void
7558 ospf_vty_if_init (void)
7559 {
7560   /* Install interface node. */
7561   install_node (&interface_node, config_write_interface);
7562
7563   install_element (CONFIG_NODE, &interface_cmd);
7564   install_element (CONFIG_NODE, &no_interface_cmd);
7565   install_default (INTERFACE_NODE);
7566
7567   /* "description" commands. */
7568   install_element (INTERFACE_NODE, &interface_desc_cmd);
7569   install_element (INTERFACE_NODE, &no_interface_desc_cmd);
7570
7571   /* "ip ospf authentication" commands. */
7572   install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
7573   install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
7574   install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
7575   install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
7576   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
7577   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
7578   install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
7579   install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
7580   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
7581   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
7582
7583   /* "ip ospf message-digest-key" commands. */
7584   install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
7585   install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
7586   install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
7587   install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
7588
7589   /* "ip ospf cost" commands. */
7590   install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
7591   install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
7592   install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
7593   install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
7594   install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
7595   install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
7596
7597   /* "ip ospf mtu-ignore" commands. */
7598   install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
7599   install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
7600   install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
7601   install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
7602
7603   /* "ip ospf dead-interval" commands. */
7604   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
7605   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
7606   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
7607   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
7608   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
7609   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
7610   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_seconds_cmd);
7611   
7612   /* "ip ospf hello-interval" commands. */
7613   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
7614   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
7615   install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
7616   install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
7617   install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_seconds_cmd);
7618
7619   /* "ip ospf network" commands. */
7620   install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
7621   install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
7622
7623   /* "ip ospf priority" commands. */
7624   install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
7625   install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
7626   install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
7627   install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
7628
7629   /* "ip ospf retransmit-interval" commands. */
7630   install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
7631   install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
7632   install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
7633   install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
7634
7635   /* "ip ospf transmit-delay" commands. */
7636   install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
7637   install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
7638   install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
7639   install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
7640
7641   /* "ip ospf area" commands. */
7642   install_element (INTERFACE_NODE, &ip_ospf_area_cmd);
7643   install_element (INTERFACE_NODE, &no_ip_ospf_area_cmd);
7644
7645   /* These commands are compatibitliy for previous version. */
7646   install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
7647   install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
7648   install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
7649   install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
7650   install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
7651   install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
7652   install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
7653   install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
7654   install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
7655   install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
7656   install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
7657   install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
7658   install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
7659   install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
7660   install_element (INTERFACE_NODE, &ospf_network_cmd);
7661   install_element (INTERFACE_NODE, &no_ospf_network_cmd);
7662   install_element (INTERFACE_NODE, &ospf_priority_cmd);
7663   install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
7664   install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
7665   install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
7666   install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
7667   install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
7668 }
7669
7670 static void
7671 ospf_vty_zebra_init (void)
7672 {
7673   install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
7674   install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
7675
7676   install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
7677   install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
7678
7679   install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
7680   install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
7681
7682   install_element (OSPF_NODE, &ospf_default_metric_cmd);
7683   install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
7684   install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
7685
7686   install_element (OSPF_NODE, &ospf_distance_cmd);
7687   install_element (OSPF_NODE, &no_ospf_distance_cmd);
7688   install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
7689   install_element (OSPF_NODE, &ospf_distance_ospf_cmd);
7690 #if 0
7691   install_element (OSPF_NODE, &ospf_distance_source_cmd);
7692   install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
7693   install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
7694   install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
7695 #endif /* 0 */
7696 }
7697
7698 static struct cmd_node ospf_node =
7699 {
7700   OSPF_NODE,
7701   "%s(config-router)# ",
7702   1
7703 };
7704
7705 static void
7706 ospf_interface_clear (struct interface *ifp)
7707 {
7708   if (!if_is_operative (ifp)) return;
7709
7710   if (IS_DEBUG_OSPF (ism, ISM_EVENTS))
7711     zlog (NULL, LOG_DEBUG, "ISM[%s]: clear by reset", ifp->name);
7712
7713   ospf_if_reset(ifp);
7714 }
7715
7716 DEFUN (clear_ip_ospf_interface,
7717        clear_ip_ospf_interface_cmd,
7718        "clear ip ospf interface [IFNAME]",
7719        CLEAR_STR
7720        IP_STR
7721        "OSPF information\n"
7722        "Interface information\n"
7723        "Interface name\n")
7724 {
7725   struct interface *ifp;
7726   struct listnode *node;
7727
7728   if (argc == 0) /* Clear all the ospfv2 interfaces. */
7729     {
7730       for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
7731         ospf_interface_clear(ifp);
7732     }
7733   else /* Interface name is specified. */
7734     {
7735       if ((ifp = if_lookup_by_name (argv[0])) == NULL)
7736         vty_out (vty, "No such interface name%s", VTY_NEWLINE);
7737       else
7738         ospf_interface_clear(ifp);
7739     }
7740
7741   return CMD_SUCCESS;
7742 }
7743
7744 void
7745 ospf_vty_clear_init (void)
7746 {
7747   install_element (ENABLE_NODE, &clear_ip_ospf_interface_cmd);
7748 }
7749
7750
7751 /* Install OSPF related vty commands. */
7752 void
7753 ospf_vty_init (void)
7754 {
7755   /* Install ospf top node. */
7756   install_node (&ospf_node, ospf_config_write);
7757
7758   /* "router ospf" commands. */
7759   install_element (CONFIG_NODE, &router_ospf_cmd);
7760   install_element (CONFIG_NODE, &no_router_ospf_cmd);
7761
7762   install_default (OSPF_NODE);
7763
7764   /* "ospf router-id" commands. */
7765   install_element (OSPF_NODE, &ospf_router_id_cmd);
7766   install_element (OSPF_NODE, &no_ospf_router_id_cmd);
7767   install_element (OSPF_NODE, &router_ospf_id_cmd);
7768   install_element (OSPF_NODE, &no_router_ospf_id_cmd);
7769
7770   /* "passive-interface" commands. */
7771   install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
7772   install_element (OSPF_NODE, &ospf_passive_interface_cmd);
7773   install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
7774   install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
7775   install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
7776   install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
7777
7778   /* "ospf abr-type" commands. */
7779   install_element (OSPF_NODE, &ospf_abr_type_cmd);
7780   install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
7781
7782   /* "ospf log-adjacency-changes" commands. */
7783   install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
7784   install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
7785   install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
7786   install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
7787
7788   /* "ospf rfc1583-compatible" commands. */
7789   install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
7790   install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
7791   install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
7792   install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
7793
7794   /* "network area" commands. */
7795   install_element (OSPF_NODE, &ospf_network_area_cmd);
7796   install_element (OSPF_NODE, &no_ospf_network_area_cmd);
7797
7798   /* "area authentication" commands. */
7799   install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
7800   install_element (OSPF_NODE, &ospf_area_authentication_cmd);
7801   install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
7802
7803   /* "area range" commands.  */
7804   install_element (OSPF_NODE, &ospf_area_range_cmd);
7805   install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
7806   install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
7807   install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
7808   install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
7809   install_element (OSPF_NODE, &no_ospf_area_range_cmd);
7810   install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
7811   install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
7812   install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
7813   install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
7814   install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
7815
7816   /* "area virtual-link" commands. */
7817   install_element (OSPF_NODE, &ospf_area_vlink_cmd);
7818   install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
7819
7820   install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
7821   install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
7822
7823   install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
7824   install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
7825
7826   install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
7827   install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
7828
7829   install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
7830   install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
7831
7832   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
7833   install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
7834   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
7835
7836   install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
7837   install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
7838
7839   install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
7840   install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
7841
7842   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
7843   install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
7844   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
7845
7846   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
7847   install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
7848   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
7849
7850   /* "area stub" commands. */
7851   install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
7852   install_element (OSPF_NODE, &ospf_area_stub_cmd);
7853   install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
7854   install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
7855
7856   /* "area nssa" commands. */
7857   install_element (OSPF_NODE, &ospf_area_nssa_cmd);
7858   install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
7859   install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
7860   install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
7861   install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
7862   install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
7863
7864   install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
7865   install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
7866
7867   install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
7868   install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
7869
7870   install_element (OSPF_NODE, &ospf_area_export_list_cmd);
7871   install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
7872
7873   install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
7874   install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
7875
7876   install_element (OSPF_NODE, &ospf_area_import_list_cmd);
7877   install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
7878   
7879   /* LSA timer commands */
7880   install_element (OSPF_NODE, &ospf_timers_min_ls_interval_cmd);
7881   install_element (OSPF_NODE, &no_ospf_timers_min_ls_interval_cmd);
7882   install_element (OSPF_NODE, &ospf_timers_min_ls_arrival_cmd);
7883   install_element (OSPF_NODE, &no_ospf_timers_min_ls_arrival_cmd);
7884
7885   /* SPF timer commands */
7886   install_element (OSPF_NODE, &ospf_timers_spf_cmd);
7887   install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
7888   install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
7889   install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
7890   
7891   /* refresh timer commands */
7892   install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
7893   install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
7894   install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
7895   
7896   /* max-metric commands */
7897   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
7898   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
7899   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
7900   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
7901   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
7902   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
7903   
7904   /* reference bandwidth commands */
7905   install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
7906   install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
7907
7908   /* "neighbor" commands. */
7909   install_element (OSPF_NODE, &ospf_neighbor_cmd);
7910   install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
7911   install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
7912   install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
7913   install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
7914   install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
7915   install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
7916   install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
7917
7918   /* Init interface related vty commands. */
7919   ospf_vty_if_init ();
7920
7921   /* Init zebra related vty commands. */
7922   ospf_vty_zebra_init ();
7923 }