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
ospf_str2area_id(const char * str,struct in_addr * area_id,int * format)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
str2metric(const char * str,int * metric)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
str2metric_type(const char * str,int * metric_type)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
ospf_oi_count(struct interface * ifp)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
ospf_passive_interface_default(struct ospf * ospf,u_char newval)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
ospf_passive_interface_update_addr(struct ospf * ospf,struct interface * ifp,struct ospf_if_params * params,u_char value,struct in_addr addr)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
ospf_passive_interface_update(struct ospf * ospf,struct interface * ifp,struct ospf_if_params * params,u_char value)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
ospf_vl_config_data_init(struct ospf_vl_config_data * vl_config,struct vty * vty)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 *
ospf_find_vl_data(struct ospf * ospf,struct ospf_vl_config_data * vl_config)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
ospf_vl_set_security(struct ospf_vl_data * vl_data,struct ospf_vl_config_data * vl_config)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
ospf_vl_set_timers(struct ospf_vl_data * vl_data,struct ospf_vl_config_data * vl_config)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
ospf_vl_set(struct ospf * ospf,struct ospf_vl_config_data * vl_config)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
ospf_area_nssa_cmd_handler(struct vty * vty,int argc,const char * argv[],int nosum)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
ospf_timers_spf_set(struct vty * vty,unsigned int delay,unsigned int hold,unsigned int max)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
show_ip_ospf_area(struct vty * vty,struct ospf_area * area)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
show_ip_ospf_interface_sub(struct vty * vty,struct ospf * ospf,struct interface * ifp)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
show_ip_ospf_neighbour_header(struct vty * vty)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
show_ip_ospf_neighbor_sub(struct vty * vty,struct ospf_interface * oi)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
show_ip_ospf_nbr_nbma_detail_sub(struct vty * vty,struct ospf_interface * oi,struct ospf_nbr_nbma * nbr_nbma)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
show_ip_ospf_neighbor_detail_sub(struct vty * vty,struct ospf_interface * oi,struct ospf_neighbor * nbr)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
show_lsa_summary(struct vty * vty,struct ospf_lsa * lsa,int self)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
show_ip_ospf_database_header(struct vty * vty,struct ospf_lsa * lsa)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
show_ip_ospf_database_router_links(struct vty * vty,struct router_lsa * rl)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
show_router_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_network_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_summary_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_summary_asbr_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_as_external_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_as_nssa_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_func_dummy(struct vty * vty,struct ospf_lsa * lsa)3911 show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3912 {
3913   return 0;
3914 }
3915 
3916 static int
show_opaque_lsa_detail(struct vty * vty,struct ospf_lsa * lsa)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
show_lsa_prefix_set(struct vty * vty,struct prefix_ls * lp,struct in_addr * id,struct in_addr * adv_router)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
show_lsa_detail_proc(struct vty * vty,struct route_table * rt,struct in_addr * id,struct in_addr * adv_router)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
show_lsa_detail(struct vty * vty,struct ospf * ospf,int type,struct in_addr * id,struct in_addr * adv_router)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
show_lsa_detail_adv_router_proc(struct vty * vty,struct route_table * rt,struct in_addr * adv_router)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
show_lsa_detail_adv_router(struct vty * vty,struct ospf * ospf,int type,struct in_addr * adv_router)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
show_ip_ospf_database_summary(struct vty * vty,struct ospf * ospf,int self)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
show_ip_ospf_database_maxage(struct vty * vty,struct ospf * ospf)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
ospf_nbr_timer_update(struct ospf_interface * oi)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
ospf_vty_dead_interval_set(struct vty * vty,const char * interval_str,const char * nbr_str,const char * fast_hello_str)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
config_write_stub_router(struct vty * vty,struct ospf * ospf)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
show_ip_ospf_route_network(struct vty * vty,struct route_table * rt)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
show_ip_ospf_route_router(struct vty * vty,struct route_table * rtrs)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
show_ip_ospf_route_external(struct vty * vty,struct route_table * rt)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
area_id2str(char * buf,int length,struct ospf_area * area)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
config_write_interface(struct vty * vty)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
config_write_network_area(struct vty * vty,struct ospf * ospf)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
config_write_ospf_area(struct vty * vty,struct ospf * ospf)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
config_write_ospf_nbr_nbma(struct vty * vty,struct ospf * ospf)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
config_write_virtual_link(struct vty * vty,struct ospf * ospf)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
config_write_ospf_redistribute(struct vty * vty,struct ospf * ospf)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
config_write_ospf_default_metric(struct vty * vty,struct ospf * ospf)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
config_write_ospf_distribute(struct vty * vty,struct ospf * ospf)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
config_write_ospf_distance(struct vty * vty,struct ospf * ospf)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
ospf_config_write(struct vty * vty)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
ospf_vty_show_init(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
ospf_vty_if_init(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
ospf_vty_zebra_init(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
ospf_interface_clear(struct interface * ifp)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
ospf_vty_clear_init(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
ospf_vty_init(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 }
7924