blob: 955a822758b585282660a70cfbf5ee3b0089f64d [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* OSPF VTY interface.
vincentba682532005-09-29 13:52:57 +00002 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
paul718e3742002-12-13 20:15:29 +00003 * 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
Paul Jakma30a22312008-08-15 14:05:22 +010053static const char *ospf_network_type_str[] =
paul718e3742002-12-13 20:15:29 +000054{
55 "Null",
56 "POINTOPOINT",
57 "BROADCAST",
58 "NBMA",
59 "POINTOMULTIPOINT",
60 "VIRTUALLINK",
61 "LOOPBACK"
62};
63
64
65/* Utility functions. */
paul4dadc292005-05-06 21:37:42 +000066static int
paul6c835672004-10-11 11:00:30 +000067ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
paul718e3742002-12-13 20:15:29 +000068{
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 ret = strtoul (str, &endptr, 10);
84 if (*endptr != '\0' || (ret == ULONG_MAX && errno == ERANGE))
85 return -1;
86
87 area_id->s_addr = htonl (ret);
88 *format = OSPF_AREA_ID_FORMAT_DECIMAL;
89 }
90
91 return 0;
92}
93
94
paul4dadc292005-05-06 21:37:42 +000095static int
paul6c835672004-10-11 11:00:30 +000096str2distribute_source (const char *str, int *source)
paul718e3742002-12-13 20:15:29 +000097{
98 /* Sanity check. */
99 if (str == NULL)
100 return 0;
101
102 if (strncmp (str, "k", 1) == 0)
103 *source = ZEBRA_ROUTE_KERNEL;
104 else if (strncmp (str, "c", 1) == 0)
105 *source = ZEBRA_ROUTE_CONNECT;
106 else if (strncmp (str, "s", 1) == 0)
107 *source = ZEBRA_ROUTE_STATIC;
108 else if (strncmp (str, "r", 1) == 0)
109 *source = ZEBRA_ROUTE_RIP;
110 else if (strncmp (str, "b", 1) == 0)
111 *source = ZEBRA_ROUTE_BGP;
112 else
113 return 0;
114
115 return 1;
116}
117
paul4dadc292005-05-06 21:37:42 +0000118static int
paul6c835672004-10-11 11:00:30 +0000119str2metric (const char *str, int *metric)
paul718e3742002-12-13 20:15:29 +0000120{
121 /* Sanity check. */
122 if (str == NULL)
123 return 0;
124
125 *metric = strtol (str, NULL, 10);
126 if (*metric < 0 && *metric > 16777214)
127 {
128 /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
129 return 0;
130 }
131
132 return 1;
133}
134
paul4dadc292005-05-06 21:37:42 +0000135static int
paul6c835672004-10-11 11:00:30 +0000136str2metric_type (const char *str, int *metric_type)
paul718e3742002-12-13 20:15:29 +0000137{
138 /* Sanity check. */
139 if (str == NULL)
140 return 0;
141
142 if (strncmp (str, "1", 1) == 0)
143 *metric_type = EXTERNAL_METRIC_TYPE_1;
144 else if (strncmp (str, "2", 1) == 0)
145 *metric_type = EXTERNAL_METRIC_TYPE_2;
146 else
147 return 0;
148
149 return 1;
150}
151
152int
153ospf_oi_count (struct interface *ifp)
154{
155 struct route_node *rn;
156 int i = 0;
157
158 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
159 if (rn->info)
160 i++;
161
162 return i;
163}
164
165
166DEFUN (router_ospf,
167 router_ospf_cmd,
168 "router ospf",
169 "Enable a routing process\n"
170 "Start OSPF configuration\n")
171{
172 vty->node = OSPF_NODE;
173 vty->index = ospf_get ();
174
175 return CMD_SUCCESS;
176}
177
178DEFUN (no_router_ospf,
179 no_router_ospf_cmd,
180 "no router ospf",
181 NO_STR
182 "Enable a routing process\n"
183 "Start OSPF configuration\n")
184{
paul020709f2003-04-04 02:44:16 +0000185 struct ospf *ospf;
186
187 ospf = ospf_lookup ();
188 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +0000189 {
paul020709f2003-04-04 02:44:16 +0000190 vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +0000191 return CMD_WARNING;
192 }
193
paul020709f2003-04-04 02:44:16 +0000194 ospf_finish (ospf);
paul718e3742002-12-13 20:15:29 +0000195
196 return CMD_SUCCESS;
197}
198
199DEFUN (ospf_router_id,
200 ospf_router_id_cmd,
201 "ospf router-id A.B.C.D",
202 "OSPF specific commands\n"
203 "router-id for the OSPF process\n"
204 "OSPF router-id in IP address format\n")
205{
paul68980082003-03-25 05:07:42 +0000206 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000207 struct in_addr router_id;
paul68980082003-03-25 05:07:42 +0000208 int ret;
paul718e3742002-12-13 20:15:29 +0000209
210 ret = inet_aton (argv[0], &router_id);
211 if (!ret)
212 {
213 vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
214 return CMD_WARNING;
215 }
216
paul68980082003-03-25 05:07:42 +0000217 ospf->router_id_static = router_id;
paulb29800a2005-11-20 14:50:45 +0000218
219 ospf_router_id_update (ospf);
220
paul718e3742002-12-13 20:15:29 +0000221 return CMD_SUCCESS;
222}
223
224ALIAS (ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000225 router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000226 "router-id A.B.C.D",
227 "router-id for the OSPF process\n"
228 "OSPF router-id in IP address format\n")
229
230DEFUN (no_ospf_router_id,
231 no_ospf_router_id_cmd,
232 "no ospf router-id",
233 NO_STR
234 "OSPF specific commands\n"
235 "router-id for the OSPF process\n")
236{
paul68980082003-03-25 05:07:42 +0000237 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000238
paul68980082003-03-25 05:07:42 +0000239 ospf->router_id_static.s_addr = 0;
240
241 ospf_router_id_update (ospf);
paul718e3742002-12-13 20:15:29 +0000242
243 return CMD_SUCCESS;
244}
245
246ALIAS (no_ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000247 no_router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000248 "no router-id",
249 NO_STR
250 "router-id for the OSPF process\n")
251
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000252static void
Andrew J. Schorr43540882006-11-28 16:36:39 +0000253ospf_passive_interface_default (struct ospf *ospf, u_char newval)
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000254{
255 struct listnode *ln;
256 struct interface *ifp;
257 struct ospf_interface *oi;
258
Andrew J. Schorr43540882006-11-28 16:36:39 +0000259 ospf->passive_interface_default = newval;
260
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000261 for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
262 {
263 if (ifp &&
264 OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
265 UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
266 }
267 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
268 {
269 if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
270 UNSET_IF_PARAM (oi->params, passive_interface);
Andrew J. Schorr43540882006-11-28 16:36:39 +0000271 /* update multicast memberships */
272 ospf_if_set_multicast(oi);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000273 }
274}
275
276static void
277ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
278 struct in_addr addr,
279 struct ospf_if_params *params, u_char value)
280{
281 u_char dflt;
282
283 params->passive_interface = value;
284 if (params != IF_DEF_PARAMS (ifp))
285 {
286 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
287 dflt = IF_DEF_PARAMS (ifp)->passive_interface;
288 else
289 dflt = ospf->passive_interface_default;
290
291 if (value != dflt)
292 SET_IF_PARAM (params, passive_interface);
293 else
294 UNSET_IF_PARAM (params, passive_interface);
295
296 ospf_free_if_params (ifp, addr);
297 ospf_if_update_params (ifp, addr);
298 }
299 else
300 {
301 if (value != ospf->passive_interface_default)
302 SET_IF_PARAM (params, passive_interface);
303 else
304 UNSET_IF_PARAM (params, passive_interface);
305 }
306}
307
paula2c62832003-04-23 17:01:31 +0000308DEFUN (ospf_passive_interface,
309 ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000310 "passive-interface IFNAME A.B.C.D",
311 "Suppress routing updates on an interface\n"
312 "Interface's name\n")
313{
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000314 struct interface *ifp;
315 struct in_addr addr;
316 int ret;
317 struct ospf_if_params *params;
318 struct route_node *rn;
319 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000320
Andrew J. Schorr43540882006-11-28 16:36:39 +0000321 if (argc == 0)
322 {
323 ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
324 return CMD_SUCCESS;
325 }
326
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000327 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000328
329 params = IF_DEF_PARAMS (ifp);
330
Andrew J. Schorr43540882006-11-28 16:36:39 +0000331 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000332 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000333 ret = inet_aton(argv[1], &addr);
334 if (!ret)
335 {
336 vty_out (vty, "Please specify interface address by A.B.C.D%s",
337 VTY_NEWLINE);
338 return CMD_WARNING;
339 }
paul718e3742002-12-13 20:15:29 +0000340
Andrew J. Schorr43540882006-11-28 16:36:39 +0000341 params = ospf_get_if_params (ifp, addr);
342 ospf_if_update_params (ifp, addr);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000343 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000344 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
345
ajsba6454e2005-02-08 15:37:30 +0000346 /* XXX We should call ospf_if_set_multicast on exactly those
347 * interfaces for which the passive property changed. It is too much
348 * work to determine this set, so we do this for every interface.
349 * This is safe and reasonable because ospf_if_set_multicast uses a
350 * record of joined groups to avoid systems calls if the desired
351 * memberships match the current memership.
352 */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000353
ajsba6454e2005-02-08 15:37:30 +0000354 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
355 {
356 struct ospf_interface *oi = rn->info;
357
358 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
Andrew J. Schorr43540882006-11-28 16:36:39 +0000359 ospf_if_set_multicast(oi);
ajsba6454e2005-02-08 15:37:30 +0000360 }
361 /*
362 * XXX It is not clear what state transitions the interface needs to
363 * undergo when going from active to passive. Fixing this will
364 * require precise identification of interfaces having such a
365 * transition.
366 */
367
paul718e3742002-12-13 20:15:29 +0000368 return CMD_SUCCESS;
369}
370
paula2c62832003-04-23 17:01:31 +0000371ALIAS (ospf_passive_interface,
372 ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000373 "passive-interface IFNAME",
374 "Suppress routing updates on an interface\n"
375 "Interface's name\n")
376
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000377ALIAS (ospf_passive_interface,
378 ospf_passive_interface_default_cmd,
379 "passive-interface default",
380 "Suppress routing updates on an interface\n"
381 "Suppress routing updates on interfaces by default\n")
382
paula2c62832003-04-23 17:01:31 +0000383DEFUN (no_ospf_passive_interface,
384 no_ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000385 "no passive-interface IFNAME A.B.C.D",
386 NO_STR
387 "Allow routing updates on an interface\n"
388 "Interface's name\n")
389{
390 struct interface *ifp;
391 struct in_addr addr;
392 struct ospf_if_params *params;
393 int ret;
ajsba6454e2005-02-08 15:37:30 +0000394 struct route_node *rn;
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000395 struct ospf *ospf = vty->index;
Andrew J. Schorr43540882006-11-28 16:36:39 +0000396
397 if (argc == 0)
398 {
399 ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
400 return CMD_SUCCESS;
401 }
paul718e3742002-12-13 20:15:29 +0000402
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000403 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000404
405 params = IF_DEF_PARAMS (ifp);
406
Andrew J. Schorr43540882006-11-28 16:36:39 +0000407 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000408 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000409 ret = inet_aton(argv[1], &addr);
410 if (!ret)
411 {
412 vty_out (vty, "Please specify interface address by A.B.C.D%s",
413 VTY_NEWLINE);
414 return CMD_WARNING;
415 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000416
Andrew J. Schorr43540882006-11-28 16:36:39 +0000417 params = ospf_lookup_if_params (ifp, addr);
418 if (params == NULL)
419 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000420 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000421 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
ajsba6454e2005-02-08 15:37:30 +0000422
423 /* XXX We should call ospf_if_set_multicast on exactly those
424 * interfaces for which the passive property changed. It is too much
425 * work to determine this set, so we do this for every interface.
426 * This is safe and reasonable because ospf_if_set_multicast uses a
427 * record of joined groups to avoid systems calls if the desired
428 * memberships match the current memership.
429 */
430 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
431 {
432 struct ospf_interface *oi = rn->info;
433
434 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
435 ospf_if_set_multicast(oi);
436 }
437
paul718e3742002-12-13 20:15:29 +0000438 return CMD_SUCCESS;
439}
440
paula2c62832003-04-23 17:01:31 +0000441ALIAS (no_ospf_passive_interface,
442 no_ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000443 "no passive-interface IFNAME",
444 NO_STR
445 "Allow routing updates on an interface\n"
446 "Interface's name\n")
447
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000448ALIAS (no_ospf_passive_interface,
449 no_ospf_passive_interface_default_cmd,
450 "no passive-interface default",
451 NO_STR
452 "Allow routing updates on an interface\n"
453 "Allow routing updates on interfaces by default\n")
454
paula2c62832003-04-23 17:01:31 +0000455DEFUN (ospf_network_area,
456 ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000457 "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
458 "Enable routing on an IP network\n"
459 "OSPF network prefix\n"
460 "Set the OSPF area ID\n"
461 "OSPF area ID in IP address format\n"
462 "OSPF area ID as a decimal value\n")
463{
464 struct ospf *ospf= vty->index;
465 struct prefix_ipv4 p;
466 struct in_addr area_id;
467 int ret, format;
468
469 /* Get network prefix and Area ID. */
470 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
471 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
472
473 ret = ospf_network_set (ospf, &p, area_id);
474 if (ret == 0)
475 {
476 vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
477 return CMD_WARNING;
478 }
479
480 return CMD_SUCCESS;
481}
482
paula2c62832003-04-23 17:01:31 +0000483DEFUN (no_ospf_network_area,
484 no_ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000485 "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
486 NO_STR
487 "Enable routing on an IP network\n"
488 "OSPF network prefix\n"
489 "Set the OSPF area ID\n"
490 "OSPF area ID in IP address format\n"
491 "OSPF area ID as a decimal value\n")
492{
493 struct ospf *ospf = (struct ospf *) vty->index;
494 struct prefix_ipv4 p;
495 struct in_addr area_id;
496 int ret, format;
497
498 /* Get network prefix and Area ID. */
499 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
500 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
501
502 ret = ospf_network_unset (ospf, &p, area_id);
503 if (ret == 0)
504 {
505 vty_out (vty, "Can't find specified network area configuration.%s",
506 VTY_NEWLINE);
507 return CMD_WARNING;
508 }
509
510 return CMD_SUCCESS;
511}
512
513
paula2c62832003-04-23 17:01:31 +0000514DEFUN (ospf_area_range,
515 ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000516 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
517 "OSPF area parameters\n"
518 "OSPF area ID in IP address format\n"
519 "OSPF area ID as a decimal value\n"
520 "Summarize routes matching address/mask (border routers only)\n"
521 "Area range prefix\n")
522{
523 struct ospf *ospf = vty->index;
524 struct prefix_ipv4 p;
525 struct in_addr area_id;
526 int format;
527 u_int32_t cost;
528
529 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
530 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
531
532 ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
533 if (argc > 2)
534 {
paul4dadc292005-05-06 21:37:42 +0000535 VTY_GET_INTEGER ("range cost", cost, argv[2]);
paul718e3742002-12-13 20:15:29 +0000536 ospf_area_range_cost_set (ospf, area_id, &p, cost);
537 }
538
539 return CMD_SUCCESS;
540}
541
paula2c62832003-04-23 17:01:31 +0000542ALIAS (ospf_area_range,
543 ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000544 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
545 "OSPF area parameters\n"
546 "OSPF area ID in IP address format\n"
547 "OSPF area ID as a decimal value\n"
548 "OSPF area range for route advertise (default)\n"
549 "Area range prefix\n"
550 "Advertise this range (default)\n")
551
paula2c62832003-04-23 17:01:31 +0000552ALIAS (ospf_area_range,
553 ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000554 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
555 "OSPF area parameters\n"
556 "OSPF area ID in IP address format\n"
557 "OSPF area ID as a decimal value\n"
558 "Summarize routes matching address/mask (border routers only)\n"
559 "Area range prefix\n"
560 "User specified metric for this range\n"
561 "Advertised metric for this range\n")
562
paula2c62832003-04-23 17:01:31 +0000563ALIAS (ospf_area_range,
564 ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000565 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
566 "OSPF area parameters\n"
567 "OSPF area ID in IP address format\n"
568 "OSPF area ID as a decimal value\n"
569 "Summarize routes matching address/mask (border routers only)\n"
570 "Area range prefix\n"
571 "Advertise this range (default)\n"
572 "User specified metric for this range\n"
573 "Advertised metric for this range\n")
574
paula2c62832003-04-23 17:01:31 +0000575DEFUN (ospf_area_range_not_advertise,
576 ospf_area_range_not_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000577 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
578 "OSPF area parameters\n"
579 "OSPF area ID in IP address format\n"
580 "OSPF area ID as a decimal value\n"
581 "Summarize routes matching address/mask (border routers only)\n"
582 "Area range prefix\n"
583 "DoNotAdvertise this range\n")
584{
585 struct ospf *ospf = vty->index;
586 struct prefix_ipv4 p;
587 struct in_addr area_id;
588 int format;
589
590 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
591 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
592
593 ospf_area_range_set (ospf, area_id, &p, 0);
594
595 return CMD_SUCCESS;
596}
597
paula2c62832003-04-23 17:01:31 +0000598DEFUN (no_ospf_area_range,
599 no_ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000600 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
601 NO_STR
602 "OSPF area parameters\n"
603 "OSPF area ID in IP address format\n"
604 "OSPF area ID as a decimal value\n"
605 "Summarize routes matching address/mask (border routers only)\n"
606 "Area range prefix\n")
607{
608 struct ospf *ospf = vty->index;
609 struct prefix_ipv4 p;
610 struct in_addr area_id;
611 int format;
612
613 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
614 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
615
616 ospf_area_range_unset (ospf, area_id, &p);
617
618 return CMD_SUCCESS;
619}
620
paula2c62832003-04-23 17:01:31 +0000621ALIAS (no_ospf_area_range,
622 no_ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000623 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
624 NO_STR
625 "OSPF area parameters\n"
626 "OSPF area ID in IP address format\n"
627 "OSPF area ID as a decimal value\n"
628 "Summarize routes matching address/mask (border routers only)\n"
629 "Area range prefix\n"
630 "Advertise this range (default)\n"
631 "DoNotAdvertise this range\n")
632
paula2c62832003-04-23 17:01:31 +0000633ALIAS (no_ospf_area_range,
634 no_ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000635 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
636 NO_STR
637 "OSPF area parameters\n"
638 "OSPF area ID in IP address format\n"
639 "OSPF area ID as a decimal value\n"
640 "Summarize routes matching address/mask (border routers only)\n"
641 "Area range prefix\n"
642 "User specified metric for this range\n"
643 "Advertised metric for this range\n")
644
paula2c62832003-04-23 17:01:31 +0000645ALIAS (no_ospf_area_range,
646 no_ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000647 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
648 NO_STR
649 "OSPF area parameters\n"
650 "OSPF area ID in IP address format\n"
651 "OSPF area ID as a decimal value\n"
652 "Summarize routes matching address/mask (border routers only)\n"
653 "Area range prefix\n"
654 "Advertise this range (default)\n"
655 "User specified metric for this range\n"
656 "Advertised metric for this range\n")
657
paula2c62832003-04-23 17:01:31 +0000658DEFUN (ospf_area_range_substitute,
659 ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000660 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
661 "OSPF area parameters\n"
662 "OSPF area ID in IP address format\n"
663 "OSPF area ID as a decimal value\n"
664 "Summarize routes matching address/mask (border routers only)\n"
665 "Area range prefix\n"
666 "Announce area range as another prefix\n"
667 "Network prefix to be announced instead of range\n")
668{
669 struct ospf *ospf = vty->index;
670 struct prefix_ipv4 p, s;
671 struct in_addr area_id;
672 int format;
673
674 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
675 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
676 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
677
678 ospf_area_range_substitute_set (ospf, area_id, &p, &s);
679
680 return CMD_SUCCESS;
681}
682
paula2c62832003-04-23 17:01:31 +0000683DEFUN (no_ospf_area_range_substitute,
684 no_ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000685 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
686 NO_STR
687 "OSPF area parameters\n"
688 "OSPF area ID in IP address format\n"
689 "OSPF area ID as a decimal value\n"
690 "Summarize routes matching address/mask (border routers only)\n"
691 "Area range prefix\n"
692 "Announce area range as another prefix\n"
693 "Network prefix to be announced instead of range\n")
694{
695 struct ospf *ospf = vty->index;
696 struct prefix_ipv4 p, s;
697 struct in_addr area_id;
698 int format;
699
700 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
701 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
702 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
703
704 ospf_area_range_substitute_unset (ospf, area_id, &p);
705
706 return CMD_SUCCESS;
707}
708
709
710/* Command Handler Logic in VLink stuff is delicate!!
711
712 ALTER AT YOUR OWN RISK!!!!
713
714 Various dummy values are used to represent 'NoChange' state for
715 VLink configuration NOT being changed by a VLink command, and
716 special syntax is used within the command strings so that the
717 typed in command verbs can be seen in the configuration command
718 bacckend handler. This is to drastically reduce the verbeage
719 required to coe up with a reasonably compatible Cisco VLink command
720
721 - Matthew Grant <grantma@anathoth.gen.nz>
722 Wed, 21 Feb 2001 15:13:52 +1300
723 */
724
725
726/* Configuration data for virtual links
727 */
728struct ospf_vl_config_data {
729 struct vty *vty; /* vty stuff */
730 struct in_addr area_id; /* area ID from command line */
731 int format; /* command line area ID format */
732 struct in_addr vl_peer; /* command line vl_peer */
733 int auth_type; /* Authehntication type, if given */
734 char *auth_key; /* simple password if present */
735 int crypto_key_id; /* Cryptographic key ID */
736 char *md5_key; /* MD5 authentication key */
737 int hello_interval; /* Obvious what these are... */
738 int retransmit_interval;
739 int transmit_delay;
740 int dead_interval;
741};
742
paul4dadc292005-05-06 21:37:42 +0000743static void
paul718e3742002-12-13 20:15:29 +0000744ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
745 struct vty *vty)
746{
747 memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
748 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
749 vl_config->vty = vty;
750}
751
paul4dadc292005-05-06 21:37:42 +0000752static struct ospf_vl_data *
paul68980082003-03-25 05:07:42 +0000753ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000754{
755 struct ospf_area *area;
756 struct ospf_vl_data *vl_data;
757 struct vty *vty;
758 struct in_addr area_id;
759
760 vty = vl_config->vty;
761 area_id = vl_config->area_id;
762
763 if (area_id.s_addr == OSPF_AREA_BACKBONE)
764 {
765 vty_out (vty,
766 "Configuring VLs over the backbone is not allowed%s",
767 VTY_NEWLINE);
768 return NULL;
769 }
paul68980082003-03-25 05:07:42 +0000770 area = ospf_area_get (ospf, area_id, vl_config->format);
paul718e3742002-12-13 20:15:29 +0000771
772 if (area->external_routing != OSPF_AREA_DEFAULT)
773 {
774 if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
775 vty_out (vty, "Area %s is %s%s",
776 inet_ntoa (area_id),
paul718e3742002-12-13 20:15:29 +0000777 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000778 VTY_NEWLINE);
779 else
780 vty_out (vty, "Area %ld is %s%s",
781 (u_long)ntohl (area_id.s_addr),
paul718e3742002-12-13 20:15:29 +0000782 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000783 VTY_NEWLINE);
784 return NULL;
785 }
786
Paul Jakma9c27ef92006-05-04 07:32:57 +0000787 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
paul718e3742002-12-13 20:15:29 +0000788 {
789 vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
790 if (vl_data->vl_oi == NULL)
791 {
paul68980082003-03-25 05:07:42 +0000792 vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
793 ospf_vl_add (ospf, vl_data);
794 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +0000795 }
796 }
797 return vl_data;
798}
799
800
paul4dadc292005-05-06 21:37:42 +0000801static int
paul718e3742002-12-13 20:15:29 +0000802ospf_vl_set_security (struct ospf_vl_data *vl_data,
803 struct ospf_vl_config_data *vl_config)
804{
805 struct crypt_key *ck;
806 struct vty *vty;
807 struct interface *ifp = vl_data->vl_oi->ifp;
808
809 vty = vl_config->vty;
810
811 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
812 {
813 SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
814 IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
815 }
816
817 if (vl_config->auth_key)
818 {
819 memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000820 strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
paul718e3742002-12-13 20:15:29 +0000821 OSPF_AUTH_SIMPLE_SIZE);
822 }
823 else if (vl_config->md5_key)
824 {
825 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
826 != NULL)
827 {
828 vty_out (vty, "OSPF: Key %d already exists%s",
829 vl_config->crypto_key_id, VTY_NEWLINE);
830 return CMD_WARNING;
831 }
832 ck = ospf_crypt_key_new ();
833 ck->key_id = vl_config->crypto_key_id;
834 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000835 strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +0000836
837 ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
838 }
839 else if (vl_config->crypto_key_id != 0)
840 {
841 /* Delete a key */
842
843 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
844 vl_config->crypto_key_id) == NULL)
845 {
846 vty_out (vty, "OSPF: Key %d does not exist%s",
847 vl_config->crypto_key_id, VTY_NEWLINE);
848 return CMD_WARNING;
849 }
850
851 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
852
853 }
854
855 return CMD_SUCCESS;
856}
857
paul4dadc292005-05-06 21:37:42 +0000858static int
paul718e3742002-12-13 20:15:29 +0000859ospf_vl_set_timers (struct ospf_vl_data *vl_data,
860 struct ospf_vl_config_data *vl_config)
861{
862 struct interface *ifp = ifp = vl_data->vl_oi->ifp;
863 /* Virtual Link data initialised to defaults, so only set
864 if a value given */
865 if (vl_config->hello_interval)
866 {
867 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
868 IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
869 }
870
871 if (vl_config->dead_interval)
872 {
873 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
874 IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
875 }
876
877 if (vl_config->retransmit_interval)
878 {
879 SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
880 IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
881 }
882
883 if (vl_config->transmit_delay)
884 {
885 SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
886 IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
887 }
888
889 return CMD_SUCCESS;
890}
891
892
893
894/* The business end of all of the above */
paul4dadc292005-05-06 21:37:42 +0000895static int
paul68980082003-03-25 05:07:42 +0000896ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000897{
898 struct ospf_vl_data *vl_data;
899 int ret;
900
paul68980082003-03-25 05:07:42 +0000901 vl_data = ospf_find_vl_data (ospf, vl_config);
paul718e3742002-12-13 20:15:29 +0000902 if (!vl_data)
903 return CMD_WARNING;
904
905 /* Process this one first as it can have a fatal result, which can
906 only logically occur if the virtual link exists already
907 Thus a command error does not result in a change to the
908 running configuration such as unexpectedly altered timer
909 values etc.*/
910 ret = ospf_vl_set_security (vl_data, vl_config);
911 if (ret != CMD_SUCCESS)
912 return ret;
913
914 /* Set any time based parameters, these area already range checked */
915
916 ret = ospf_vl_set_timers (vl_data, vl_config);
917 if (ret != CMD_SUCCESS)
918 return ret;
919
920 return CMD_SUCCESS;
921
922}
923
924/* This stuff exists to make specifying all the alias commands A LOT simpler
925 */
926#define VLINK_HELPSTR_IPADDR \
927 "OSPF area parameters\n" \
928 "OSPF area ID in IP address format\n" \
929 "OSPF area ID as a decimal value\n" \
930 "Configure a virtual link\n" \
931 "Router ID of the remote ABR\n"
932
933#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
934 "Enable authentication on this virtual link\n" \
935 "dummy string \n"
936
937#define VLINK_HELPSTR_AUTHTYPE_ALL \
938 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
939 "Use null authentication\n" \
940 "Use message-digest authentication\n"
941
942#define VLINK_HELPSTR_TIME_PARAM_NOSECS \
943 "Time between HELLO packets\n" \
944 "Time between retransmitting lost link state advertisements\n" \
945 "Link state transmit delay\n" \
946 "Interval after which a neighbor is declared dead\n"
947
948#define VLINK_HELPSTR_TIME_PARAM \
949 VLINK_HELPSTR_TIME_PARAM_NOSECS \
950 "Seconds\n"
951
952#define VLINK_HELPSTR_AUTH_SIMPLE \
953 "Authentication password (key)\n" \
954 "The OSPF password (key)"
955
956#define VLINK_HELPSTR_AUTH_MD5 \
957 "Message digest authentication password (key)\n" \
958 "dummy string \n" \
959 "Key ID\n" \
960 "Use MD5 algorithm\n" \
961 "The OSPF password (key)"
962
paula2c62832003-04-23 17:01:31 +0000963DEFUN (ospf_area_vlink,
964 ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +0000965 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
966 VLINK_HELPSTR_IPADDR)
967{
paul68980082003-03-25 05:07:42 +0000968 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000969 struct ospf_vl_config_data vl_config;
970 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
971 char md5_key[OSPF_AUTH_MD5_SIZE+1];
972 int i;
973 int ret;
974
975 ospf_vl_config_data_init(&vl_config, vty);
976
977 /* Read off first 2 parameters and check them */
978 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
979 if (ret < 0)
980 {
981 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
982 return CMD_WARNING;
983 }
984
985 ret = inet_aton (argv[1], &vl_config.vl_peer);
986 if (! ret)
987 {
988 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
989 VTY_NEWLINE);
990 return CMD_WARNING;
991 }
992
993 if (argc <=2)
994 {
995 /* Thats all folks! - BUGS B. strikes again!!!*/
996
paul68980082003-03-25 05:07:42 +0000997 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +0000998 }
999
1000 /* Deal with other parameters */
1001 for (i=2; i < argc; i++)
1002 {
1003
1004 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1005
1006 switch (argv[i][0])
1007 {
1008
1009 case 'a':
1010 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1011 {
1012 /* authentication-key - this option can occur anywhere on
1013 command line. At start of command line
1014 must check for authentication option. */
1015 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1016 strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
1017 vl_config.auth_key = auth_key;
1018 i++;
1019 }
1020 else if (strncmp (argv[i], "authentication", 14) == 0)
1021 {
1022 /* authentication - this option can only occur at start
1023 of command line */
1024 vl_config.auth_type = OSPF_AUTH_SIMPLE;
1025 if ((i+1) < argc)
1026 {
1027 if (strncmp (argv[i+1], "n", 1) == 0)
1028 {
1029 /* "authentication null" */
1030 vl_config.auth_type = OSPF_AUTH_NULL;
1031 i++;
1032 }
1033 else if (strncmp (argv[i+1], "m", 1) == 0
1034 && strcmp (argv[i+1], "message-digest-") != 0)
1035 {
1036 /* "authentication message-digest" */
1037 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1038 i++;
1039 }
1040 }
1041 }
1042 break;
1043
1044 case 'm':
1045 /* message-digest-key */
1046 i++;
1047 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1048 if (vl_config.crypto_key_id < 0)
1049 return CMD_WARNING;
1050 i++;
1051 memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1052 strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1053 vl_config.md5_key = md5_key;
1054 break;
1055
1056 case 'h':
1057 /* Hello interval */
1058 i++;
1059 vl_config.hello_interval = strtol (argv[i], NULL, 10);
1060 if (vl_config.hello_interval < 0)
1061 return CMD_WARNING;
1062 break;
1063
1064 case 'r':
1065 /* Retransmit Interval */
1066 i++;
1067 vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1068 if (vl_config.retransmit_interval < 0)
1069 return CMD_WARNING;
1070 break;
1071
1072 case 't':
1073 /* Transmit Delay */
1074 i++;
1075 vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1076 if (vl_config.transmit_delay < 0)
1077 return CMD_WARNING;
1078 break;
1079
1080 case 'd':
1081 /* Dead Interval */
1082 i++;
1083 vl_config.dead_interval = strtol (argv[i], NULL, 10);
1084 if (vl_config.dead_interval < 0)
1085 return CMD_WARNING;
1086 break;
1087 }
1088 }
1089
1090
1091 /* Action configuration */
1092
paul68980082003-03-25 05:07:42 +00001093 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001094
1095}
1096
paula2c62832003-04-23 17:01:31 +00001097DEFUN (no_ospf_area_vlink,
1098 no_ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +00001099 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1100 NO_STR
1101 VLINK_HELPSTR_IPADDR)
1102{
paul68980082003-03-25 05:07:42 +00001103 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001104 struct ospf_area *area;
1105 struct ospf_vl_config_data vl_config;
1106 struct ospf_vl_data *vl_data = NULL;
1107 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1108 int i;
1109 int ret, format;
1110
1111 ospf_vl_config_data_init(&vl_config, vty);
1112
1113 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1114 if (ret < 0)
1115 {
1116 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1117 return CMD_WARNING;
1118 }
1119
paul68980082003-03-25 05:07:42 +00001120 area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001121 if (!area)
1122 {
1123 vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1124 return CMD_WARNING;
1125 }
1126
1127 ret = inet_aton (argv[1], &vl_config.vl_peer);
1128 if (! ret)
1129 {
1130 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1131 VTY_NEWLINE);
1132 return CMD_WARNING;
1133 }
1134
1135 if (argc <=2)
1136 {
1137 /* Basic VLink no command */
1138 /* Thats all folks! - BUGS B. strikes again!!!*/
Paul Jakma9c27ef92006-05-04 07:32:57 +00001139 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
paul68980082003-03-25 05:07:42 +00001140 ospf_vl_delete (ospf, vl_data);
paul718e3742002-12-13 20:15:29 +00001141
paul68980082003-03-25 05:07:42 +00001142 ospf_area_check_free (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001143
1144 return CMD_SUCCESS;
1145 }
1146
1147 /* If we are down here, we are reseting parameters */
1148
1149 /* Deal with other parameters */
1150 for (i=2; i < argc; i++)
1151 {
paul718e3742002-12-13 20:15:29 +00001152 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1153
1154 switch (argv[i][0])
1155 {
1156
1157 case 'a':
1158 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1159 {
1160 /* authentication-key - this option can occur anywhere on
1161 command line. At start of command line
1162 must check for authentication option. */
1163 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1164 vl_config.auth_key = auth_key;
1165 }
1166 else if (strncmp (argv[i], "authentication", 14) == 0)
1167 {
1168 /* authentication - this option can only occur at start
1169 of command line */
1170 vl_config.auth_type = OSPF_AUTH_NOTSET;
1171 }
1172 break;
1173
1174 case 'm':
1175 /* message-digest-key */
1176 /* Delete one key */
1177 i++;
1178 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1179 if (vl_config.crypto_key_id < 0)
1180 return CMD_WARNING;
1181 vl_config.md5_key = NULL;
1182 break;
1183
1184 case 'h':
1185 /* Hello interval */
1186 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1187 break;
1188
1189 case 'r':
1190 /* Retransmit Interval */
1191 vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1192 break;
1193
1194 case 't':
1195 /* Transmit Delay */
1196 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1197 break;
1198
1199 case 'd':
1200 /* Dead Interval */
1201 i++;
1202 vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1203 break;
1204 }
1205 }
1206
1207
1208 /* Action configuration */
1209
paul68980082003-03-25 05:07:42 +00001210 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001211}
1212
paula2c62832003-04-23 17:01:31 +00001213ALIAS (ospf_area_vlink,
1214 ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001215 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1216 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1217 VLINK_HELPSTR_IPADDR
1218 VLINK_HELPSTR_TIME_PARAM)
1219
paula2c62832003-04-23 17:01:31 +00001220ALIAS (no_ospf_area_vlink,
1221 no_ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001222 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1223 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1224 NO_STR
1225 VLINK_HELPSTR_IPADDR
1226 VLINK_HELPSTR_TIME_PARAM)
1227
paula2c62832003-04-23 17:01:31 +00001228ALIAS (ospf_area_vlink,
1229 ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001230 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1231 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1232 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1233 VLINK_HELPSTR_IPADDR
1234 VLINK_HELPSTR_TIME_PARAM
1235 VLINK_HELPSTR_TIME_PARAM)
1236
paula2c62832003-04-23 17:01:31 +00001237ALIAS (no_ospf_area_vlink,
1238 no_ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001239 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1240 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1241 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1242 NO_STR
1243 VLINK_HELPSTR_IPADDR
1244 VLINK_HELPSTR_TIME_PARAM
1245 VLINK_HELPSTR_TIME_PARAM)
1246
paula2c62832003-04-23 17:01:31 +00001247ALIAS (ospf_area_vlink,
1248 ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001249 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1250 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1251 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1252 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1253 VLINK_HELPSTR_IPADDR
1254 VLINK_HELPSTR_TIME_PARAM
1255 VLINK_HELPSTR_TIME_PARAM
1256 VLINK_HELPSTR_TIME_PARAM)
1257
paula2c62832003-04-23 17:01:31 +00001258ALIAS (no_ospf_area_vlink,
1259 no_ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001260 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1261 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1262 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1263 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1264 NO_STR
1265 VLINK_HELPSTR_IPADDR
1266 VLINK_HELPSTR_TIME_PARAM
1267 VLINK_HELPSTR_TIME_PARAM
1268 VLINK_HELPSTR_TIME_PARAM)
1269
paula2c62832003-04-23 17:01:31 +00001270ALIAS (ospf_area_vlink,
1271 ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001272 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1273 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1274 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1275 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1276 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1277 VLINK_HELPSTR_IPADDR
1278 VLINK_HELPSTR_TIME_PARAM
1279 VLINK_HELPSTR_TIME_PARAM
1280 VLINK_HELPSTR_TIME_PARAM
1281 VLINK_HELPSTR_TIME_PARAM)
1282
paula2c62832003-04-23 17:01:31 +00001283ALIAS (no_ospf_area_vlink,
1284 no_ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001285 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1286 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1287 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1288 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1289 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1290 NO_STR
1291 VLINK_HELPSTR_IPADDR
1292 VLINK_HELPSTR_TIME_PARAM
1293 VLINK_HELPSTR_TIME_PARAM
1294 VLINK_HELPSTR_TIME_PARAM
1295 VLINK_HELPSTR_TIME_PARAM)
1296
paula2c62832003-04-23 17:01:31 +00001297ALIAS (ospf_area_vlink,
1298 ospf_area_vlink_authtype_args_cmd,
paul718e3742002-12-13 20:15:29 +00001299 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1300 "(authentication|) (message-digest|null)",
1301 VLINK_HELPSTR_IPADDR
1302 VLINK_HELPSTR_AUTHTYPE_ALL)
1303
paula2c62832003-04-23 17:01:31 +00001304ALIAS (ospf_area_vlink,
1305 ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001306 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1307 "(authentication|)",
1308 VLINK_HELPSTR_IPADDR
1309 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1310
paula2c62832003-04-23 17:01:31 +00001311ALIAS (no_ospf_area_vlink,
1312 no_ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001313 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1314 "(authentication|)",
1315 NO_STR
1316 VLINK_HELPSTR_IPADDR
1317 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1318
paula2c62832003-04-23 17:01:31 +00001319ALIAS (ospf_area_vlink,
1320 ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001321 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1322 "(message-digest-key|) <1-255> md5 KEY",
1323 VLINK_HELPSTR_IPADDR
1324 VLINK_HELPSTR_AUTH_MD5)
1325
paula2c62832003-04-23 17:01:31 +00001326ALIAS (no_ospf_area_vlink,
1327 no_ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001328 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1329 "(message-digest-key|) <1-255>",
1330 NO_STR
1331 VLINK_HELPSTR_IPADDR
1332 VLINK_HELPSTR_AUTH_MD5)
1333
paula2c62832003-04-23 17:01:31 +00001334ALIAS (ospf_area_vlink,
1335 ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001336 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1337 "(authentication-key|) AUTH_KEY",
1338 VLINK_HELPSTR_IPADDR
1339 VLINK_HELPSTR_AUTH_SIMPLE)
1340
paula2c62832003-04-23 17:01:31 +00001341ALIAS (no_ospf_area_vlink,
1342 no_ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001343 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1344 "(authentication-key|)",
1345 NO_STR
1346 VLINK_HELPSTR_IPADDR
1347 VLINK_HELPSTR_AUTH_SIMPLE)
1348
paula2c62832003-04-23 17:01:31 +00001349ALIAS (ospf_area_vlink,
1350 ospf_area_vlink_authtype_args_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001351 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1352 "(authentication|) (message-digest|null) "
1353 "(authentication-key|) AUTH_KEY",
1354 VLINK_HELPSTR_IPADDR
1355 VLINK_HELPSTR_AUTHTYPE_ALL
1356 VLINK_HELPSTR_AUTH_SIMPLE)
1357
paula2c62832003-04-23 17:01:31 +00001358ALIAS (ospf_area_vlink,
1359 ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001360 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1361 "(authentication|) "
1362 "(authentication-key|) AUTH_KEY",
1363 VLINK_HELPSTR_IPADDR
1364 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1365 VLINK_HELPSTR_AUTH_SIMPLE)
1366
paula2c62832003-04-23 17:01:31 +00001367ALIAS (no_ospf_area_vlink,
1368 no_ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001369 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1370 "(authentication|) "
1371 "(authentication-key|)",
1372 NO_STR
1373 VLINK_HELPSTR_IPADDR
1374 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1375 VLINK_HELPSTR_AUTH_SIMPLE)
1376
paula2c62832003-04-23 17:01:31 +00001377ALIAS (ospf_area_vlink,
1378 ospf_area_vlink_authtype_args_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001379 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1380 "(authentication|) (message-digest|null) "
1381 "(message-digest-key|) <1-255> md5 KEY",
1382 VLINK_HELPSTR_IPADDR
1383 VLINK_HELPSTR_AUTHTYPE_ALL
1384 VLINK_HELPSTR_AUTH_MD5)
1385
paula2c62832003-04-23 17:01:31 +00001386ALIAS (ospf_area_vlink,
1387 ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001388 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1389 "(authentication|) "
1390 "(message-digest-key|) <1-255> md5 KEY",
1391 VLINK_HELPSTR_IPADDR
1392 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1393 VLINK_HELPSTR_AUTH_MD5)
1394
paula2c62832003-04-23 17:01:31 +00001395ALIAS (no_ospf_area_vlink,
1396 no_ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001397 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1398 "(authentication|) "
1399 "(message-digest-key|)",
1400 NO_STR
1401 VLINK_HELPSTR_IPADDR
1402 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1403 VLINK_HELPSTR_AUTH_MD5)
1404
1405
paula2c62832003-04-23 17:01:31 +00001406DEFUN (ospf_area_shortcut,
1407 ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001408 "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1409 "OSPF area parameters\n"
1410 "OSPF area ID in IP address format\n"
1411 "OSPF area ID as a decimal value\n"
1412 "Configure the area's shortcutting mode\n"
1413 "Set default shortcutting behavior\n"
1414 "Enable shortcutting through the area\n"
1415 "Disable shortcutting through the area\n")
1416{
paul68980082003-03-25 05:07:42 +00001417 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001418 struct ospf_area *area;
1419 struct in_addr area_id;
1420 int mode;
1421 int format;
1422
1423 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1424
paul68980082003-03-25 05:07:42 +00001425 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001426
1427 if (strncmp (argv[1], "de", 2) == 0)
1428 mode = OSPF_SHORTCUT_DEFAULT;
1429 else if (strncmp (argv[1], "di", 2) == 0)
1430 mode = OSPF_SHORTCUT_DISABLE;
1431 else if (strncmp (argv[1], "e", 1) == 0)
1432 mode = OSPF_SHORTCUT_ENABLE;
1433 else
1434 return CMD_WARNING;
1435
paul68980082003-03-25 05:07:42 +00001436 ospf_area_shortcut_set (ospf, area, mode);
paul718e3742002-12-13 20:15:29 +00001437
paul68980082003-03-25 05:07:42 +00001438 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
paul718e3742002-12-13 20:15:29 +00001439 vty_out (vty, "Shortcut area setting will take effect "
1440 "only when the router is configured as Shortcut ABR%s",
1441 VTY_NEWLINE);
1442
1443 return CMD_SUCCESS;
1444}
1445
paula2c62832003-04-23 17:01:31 +00001446DEFUN (no_ospf_area_shortcut,
1447 no_ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001448 "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1449 NO_STR
1450 "OSPF area parameters\n"
1451 "OSPF area ID in IP address format\n"
1452 "OSPF area ID as a decimal value\n"
1453 "Deconfigure the area's shortcutting mode\n"
1454 "Deconfigure enabled shortcutting through the area\n"
1455 "Deconfigure disabled shortcutting through the area\n")
1456{
paul68980082003-03-25 05:07:42 +00001457 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001458 struct ospf_area *area;
1459 struct in_addr area_id;
1460 int format;
1461
1462 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1463
paul68980082003-03-25 05:07:42 +00001464 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001465 if (!area)
1466 return CMD_SUCCESS;
1467
paul68980082003-03-25 05:07:42 +00001468 ospf_area_shortcut_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001469
1470 return CMD_SUCCESS;
1471}
1472
1473
paula2c62832003-04-23 17:01:31 +00001474DEFUN (ospf_area_stub,
1475 ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001476 "area (A.B.C.D|<0-4294967295>) stub",
1477 "OSPF area parameters\n"
1478 "OSPF area ID in IP address format\n"
1479 "OSPF area ID as a decimal value\n"
1480 "Configure OSPF area as stub\n")
1481{
1482 struct ospf *ospf = vty->index;
1483 struct in_addr area_id;
1484 int ret, format;
1485
1486 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1487
1488 ret = ospf_area_stub_set (ospf, area_id);
1489 if (ret == 0)
1490 {
1491 vty_out (vty, "First deconfigure all virtual link through this area%s",
1492 VTY_NEWLINE);
1493 return CMD_WARNING;
1494 }
1495
1496 ospf_area_no_summary_unset (ospf, area_id);
1497
1498 return CMD_SUCCESS;
1499}
1500
paula2c62832003-04-23 17:01:31 +00001501DEFUN (ospf_area_stub_no_summary,
1502 ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001503 "area (A.B.C.D|<0-4294967295>) stub no-summary",
1504 "OSPF stub 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 "Do not inject inter-area routes into stub\n")
1509{
1510 struct ospf *ospf = vty->index;
1511 struct in_addr area_id;
1512 int ret, format;
1513
1514 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1515
1516 ret = ospf_area_stub_set (ospf, area_id);
1517 if (ret == 0)
1518 {
paulb0a053b2003-06-22 09:04:47 +00001519 vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
paul718e3742002-12-13 20:15:29 +00001520 VTY_NEWLINE);
1521 return CMD_WARNING;
1522 }
1523
1524 ospf_area_no_summary_set (ospf, area_id);
1525
1526 return CMD_SUCCESS;
1527}
1528
paula2c62832003-04-23 17:01:31 +00001529DEFUN (no_ospf_area_stub,
1530 no_ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001531 "no area (A.B.C.D|<0-4294967295>) stub",
1532 NO_STR
1533 "OSPF area parameters\n"
1534 "OSPF area ID in IP address format\n"
1535 "OSPF area ID as a decimal value\n"
1536 "Configure OSPF area as stub\n")
1537{
1538 struct ospf *ospf = vty->index;
1539 struct in_addr area_id;
1540 int format;
1541
1542 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1543
1544 ospf_area_stub_unset (ospf, area_id);
1545 ospf_area_no_summary_unset (ospf, area_id);
1546
1547 return CMD_SUCCESS;
1548}
1549
paula2c62832003-04-23 17:01:31 +00001550DEFUN (no_ospf_area_stub_no_summary,
1551 no_ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001552 "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1553 NO_STR
1554 "OSPF area parameters\n"
1555 "OSPF area ID in IP address format\n"
1556 "OSPF area ID as a decimal value\n"
1557 "Configure OSPF area as stub\n"
1558 "Do not inject inter-area routes into area\n")
1559{
1560 struct ospf *ospf = vty->index;
1561 struct in_addr area_id;
1562 int format;
1563
1564 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1565 ospf_area_no_summary_unset (ospf, area_id);
1566
1567 return CMD_SUCCESS;
1568}
1569
paul4dadc292005-05-06 21:37:42 +00001570static int
paul6c835672004-10-11 11:00:30 +00001571ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1572 int nosum)
paul718e3742002-12-13 20:15:29 +00001573{
1574 struct ospf *ospf = vty->index;
1575 struct in_addr area_id;
1576 int ret, format;
1577
1578 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1579
1580 ret = ospf_area_nssa_set (ospf, area_id);
1581 if (ret == 0)
1582 {
1583 vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1584 VTY_NEWLINE);
1585 return CMD_WARNING;
1586 }
1587
1588 if (argc > 1)
1589 {
1590 if (strncmp (argv[1], "translate-c", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001591 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001592 OSPF_NSSA_ROLE_CANDIDATE);
1593 else if (strncmp (argv[1], "translate-n", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001594 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001595 OSPF_NSSA_ROLE_NEVER);
1596 else if (strncmp (argv[1], "translate-a", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001597 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001598 OSPF_NSSA_ROLE_ALWAYS);
1599 }
paulb0a053b2003-06-22 09:04:47 +00001600 else
1601 {
1602 ospf_area_nssa_translator_role_set (ospf, area_id,
1603 OSPF_NSSA_ROLE_CANDIDATE);
1604 }
paul718e3742002-12-13 20:15:29 +00001605
paulb0a053b2003-06-22 09:04:47 +00001606 if (nosum)
paul718e3742002-12-13 20:15:29 +00001607 ospf_area_no_summary_set (ospf, area_id);
paulb0a053b2003-06-22 09:04:47 +00001608 else
1609 ospf_area_no_summary_unset (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001610
paulb0a053b2003-06-22 09:04:47 +00001611 ospf_schedule_abr_task (ospf);
1612
paul718e3742002-12-13 20:15:29 +00001613 return CMD_SUCCESS;
1614}
1615
paulb0a053b2003-06-22 09:04:47 +00001616DEFUN (ospf_area_nssa_translate_no_summary,
paula2c62832003-04-23 17:01:31 +00001617 ospf_area_nssa_translate_no_summary_cmd,
paulb0a053b2003-06-22 09:04:47 +00001618 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
paul718e3742002-12-13 20:15:29 +00001619 "OSPF area parameters\n"
1620 "OSPF area ID in IP address format\n"
1621 "OSPF area ID as a decimal value\n"
1622 "Configure OSPF area as nssa\n"
1623 "Configure NSSA-ABR for translate election (default)\n"
1624 "Configure NSSA-ABR to never translate\n"
1625 "Configure NSSA-ABR to always translate\n"
paulb0a053b2003-06-22 09:04:47 +00001626 "Do not inject inter-area routes into nssa\n")
1627{
1628 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1629}
paul718e3742002-12-13 20:15:29 +00001630
paulb0a053b2003-06-22 09:04:47 +00001631DEFUN (ospf_area_nssa_translate,
paula2c62832003-04-23 17:01:31 +00001632 ospf_area_nssa_translate_cmd,
paul718e3742002-12-13 20:15:29 +00001633 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1634 "OSPF area parameters\n"
1635 "OSPF area ID in IP address format\n"
1636 "OSPF area ID as a decimal value\n"
1637 "Configure OSPF area as nssa\n"
1638 "Configure NSSA-ABR for translate election (default)\n"
1639 "Configure NSSA-ABR to never translate\n"
1640 "Configure NSSA-ABR to always translate\n")
paulb0a053b2003-06-22 09:04:47 +00001641{
1642 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1643}
1644
1645DEFUN (ospf_area_nssa,
1646 ospf_area_nssa_cmd,
1647 "area (A.B.C.D|<0-4294967295>) nssa",
1648 "OSPF area parameters\n"
1649 "OSPF area ID in IP address format\n"
1650 "OSPF area ID as a decimal value\n"
1651 "Configure OSPF area as nssa\n")
1652{
1653 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1654}
paul718e3742002-12-13 20:15:29 +00001655
paula2c62832003-04-23 17:01:31 +00001656DEFUN (ospf_area_nssa_no_summary,
1657 ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001658 "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1659 "OSPF area parameters\n"
1660 "OSPF area ID in IP address format\n"
1661 "OSPF area ID as a decimal value\n"
1662 "Configure OSPF area as nssa\n"
1663 "Do not inject inter-area routes into nssa\n")
1664{
paulb0a053b2003-06-22 09:04:47 +00001665 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
paul718e3742002-12-13 20:15:29 +00001666}
1667
paula2c62832003-04-23 17:01:31 +00001668DEFUN (no_ospf_area_nssa,
1669 no_ospf_area_nssa_cmd,
paul718e3742002-12-13 20:15:29 +00001670 "no area (A.B.C.D|<0-4294967295>) nssa",
1671 NO_STR
1672 "OSPF area parameters\n"
1673 "OSPF area ID in IP address format\n"
1674 "OSPF area ID as a decimal value\n"
1675 "Configure OSPF area as nssa\n")
1676{
1677 struct ospf *ospf = vty->index;
1678 struct in_addr area_id;
1679 int format;
1680
1681 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1682
1683 ospf_area_nssa_unset (ospf, area_id);
1684 ospf_area_no_summary_unset (ospf, area_id);
1685
paulb0a053b2003-06-22 09:04:47 +00001686 ospf_schedule_abr_task (ospf);
1687
paul718e3742002-12-13 20:15:29 +00001688 return CMD_SUCCESS;
1689}
1690
paula2c62832003-04-23 17:01:31 +00001691DEFUN (no_ospf_area_nssa_no_summary,
1692 no_ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001693 "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1694 NO_STR
1695 "OSPF area parameters\n"
1696 "OSPF area ID in IP address format\n"
1697 "OSPF area ID as a decimal value\n"
1698 "Configure OSPF area as nssa\n"
1699 "Do not inject inter-area routes into nssa\n")
1700{
1701 struct ospf *ospf = vty->index;
1702 struct in_addr area_id;
1703 int format;
1704
1705 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1706 ospf_area_no_summary_unset (ospf, area_id);
1707
1708 return CMD_SUCCESS;
1709}
1710
paula2c62832003-04-23 17:01:31 +00001711DEFUN (ospf_area_default_cost,
1712 ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001713 "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1714 "OSPF area parameters\n"
1715 "OSPF area ID in IP address format\n"
1716 "OSPF area ID as a decimal value\n"
1717 "Set the summary-default cost of a NSSA or stub area\n"
1718 "Stub's advertised default summary cost\n")
1719{
paul68980082003-03-25 05:07:42 +00001720 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001721 struct ospf_area *area;
1722 struct in_addr area_id;
1723 u_int32_t cost;
1724 int format;
vincentba682532005-09-29 13:52:57 +00001725 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001726
1727 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1728 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1729
paul68980082003-03-25 05:07:42 +00001730 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001731
1732 if (area->external_routing == OSPF_AREA_DEFAULT)
1733 {
1734 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1735 return CMD_WARNING;
1736 }
1737
1738 area->default_cost = cost;
1739
vincentba682532005-09-29 13:52:57 +00001740 p.family = AF_INET;
1741 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1742 p.prefixlen = 0;
1743 if (IS_DEBUG_OSPF_EVENT)
1744 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1745 "announcing 0.0.0.0/0 to area %s",
1746 inet_ntoa (area->area_id));
1747 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1748
paul718e3742002-12-13 20:15:29 +00001749 return CMD_SUCCESS;
1750}
1751
paula2c62832003-04-23 17:01:31 +00001752DEFUN (no_ospf_area_default_cost,
1753 no_ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001754 "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1755 NO_STR
1756 "OSPF area parameters\n"
1757 "OSPF area ID in IP address format\n"
1758 "OSPF area ID as a decimal value\n"
1759 "Set the summary-default cost of a NSSA or stub area\n"
1760 "Stub's advertised default summary cost\n")
1761{
paul68980082003-03-25 05:07:42 +00001762 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001763 struct ospf_area *area;
1764 struct in_addr area_id;
1765 u_int32_t cost;
1766 int format;
vincentba682532005-09-29 13:52:57 +00001767 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001768
1769 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1770 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1771
paul68980082003-03-25 05:07:42 +00001772 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001773 if (area == NULL)
1774 return CMD_SUCCESS;
1775
1776 if (area->external_routing == OSPF_AREA_DEFAULT)
1777 {
1778 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1779 return CMD_WARNING;
1780 }
1781
1782 area->default_cost = 1;
1783
vincentba682532005-09-29 13:52:57 +00001784 p.family = AF_INET;
1785 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1786 p.prefixlen = 0;
1787 if (IS_DEBUG_OSPF_EVENT)
1788 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1789 "announcing 0.0.0.0/0 to area %s",
1790 inet_ntoa (area->area_id));
1791 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1792
1793
paul68980082003-03-25 05:07:42 +00001794 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001795
1796 return CMD_SUCCESS;
1797}
1798
paula2c62832003-04-23 17:01:31 +00001799DEFUN (ospf_area_export_list,
1800 ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001801 "area (A.B.C.D|<0-4294967295>) export-list NAME",
1802 "OSPF area parameters\n"
1803 "OSPF area ID in IP address format\n"
1804 "OSPF area ID as a decimal value\n"
1805 "Set the filter for networks announced to other areas\n"
1806 "Name of the access-list\n")
1807{
paul68980082003-03-25 05:07:42 +00001808 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001809 struct ospf_area *area;
1810 struct in_addr area_id;
1811 int format;
1812
hasso52930762004-04-19 18:26:53 +00001813 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1814
paul68980082003-03-25 05:07:42 +00001815 area = ospf_area_get (ospf, area_id, format);
1816 ospf_area_export_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001817
1818 return CMD_SUCCESS;
1819}
1820
paula2c62832003-04-23 17:01:31 +00001821DEFUN (no_ospf_area_export_list,
1822 no_ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001823 "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1824 NO_STR
1825 "OSPF area parameters\n"
1826 "OSPF area ID in IP address format\n"
1827 "OSPF area ID as a decimal value\n"
1828 "Unset the filter for networks announced to other areas\n"
1829 "Name of the access-list\n")
1830{
paul68980082003-03-25 05:07:42 +00001831 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001832 struct ospf_area *area;
1833 struct in_addr area_id;
1834 int format;
1835
hasso52930762004-04-19 18:26:53 +00001836 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1837
paul68980082003-03-25 05:07:42 +00001838 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001839 if (area == NULL)
1840 return CMD_SUCCESS;
1841
paul68980082003-03-25 05:07:42 +00001842 ospf_area_export_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001843
1844 return CMD_SUCCESS;
1845}
1846
1847
paula2c62832003-04-23 17:01:31 +00001848DEFUN (ospf_area_import_list,
1849 ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001850 "area (A.B.C.D|<0-4294967295>) import-list NAME",
1851 "OSPF area parameters\n"
1852 "OSPF area ID in IP address format\n"
1853 "OSPF area ID as a decimal value\n"
1854 "Set the filter for networks from other areas announced to the specified one\n"
1855 "Name of the access-list\n")
1856{
paul68980082003-03-25 05:07:42 +00001857 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001858 struct ospf_area *area;
1859 struct in_addr area_id;
1860 int format;
1861
hasso52930762004-04-19 18:26:53 +00001862 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1863
paul68980082003-03-25 05:07:42 +00001864 area = ospf_area_get (ospf, area_id, format);
1865 ospf_area_import_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001866
1867 return CMD_SUCCESS;
1868}
1869
paula2c62832003-04-23 17:01:31 +00001870DEFUN (no_ospf_area_import_list,
1871 no_ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001872 "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1873 NO_STR
1874 "OSPF area parameters\n"
1875 "OSPF area ID in IP address format\n"
1876 "OSPF area ID as a decimal value\n"
1877 "Unset the filter for networks announced to other areas\n"
1878 "Name of the access-list\n")
1879{
paul68980082003-03-25 05:07:42 +00001880 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001881 struct ospf_area *area;
1882 struct in_addr area_id;
1883 int format;
1884
hasso52930762004-04-19 18:26:53 +00001885 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1886
paul68980082003-03-25 05:07:42 +00001887 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001888 if (area == NULL)
1889 return CMD_SUCCESS;
1890
paul68980082003-03-25 05:07:42 +00001891 ospf_area_import_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001892
1893 return CMD_SUCCESS;
1894}
1895
paula2c62832003-04-23 17:01:31 +00001896DEFUN (ospf_area_filter_list,
1897 ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001898 "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1899 "OSPF area parameters\n"
1900 "OSPF area ID in IP address format\n"
1901 "OSPF area ID as a decimal value\n"
1902 "Filter networks between OSPF areas\n"
1903 "Filter prefixes between OSPF areas\n"
1904 "Name of an IP prefix-list\n"
1905 "Filter networks sent to this area\n"
1906 "Filter networks sent from this area\n")
1907{
paul68980082003-03-25 05:07:42 +00001908 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001909 struct ospf_area *area;
1910 struct in_addr area_id;
1911 struct prefix_list *plist;
1912 int format;
1913
1914 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1915
paul68980082003-03-25 05:07:42 +00001916 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001917 plist = prefix_list_lookup (AFI_IP, argv[1]);
1918 if (strncmp (argv[2], "in", 2) == 0)
1919 {
1920 PREFIX_LIST_IN (area) = plist;
1921 if (PREFIX_NAME_IN (area))
1922 free (PREFIX_NAME_IN (area));
1923
1924 PREFIX_NAME_IN (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001925 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001926 }
1927 else
1928 {
1929 PREFIX_LIST_OUT (area) = plist;
1930 if (PREFIX_NAME_OUT (area))
1931 free (PREFIX_NAME_OUT (area));
1932
1933 PREFIX_NAME_OUT (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001934 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001935 }
1936
1937 return CMD_SUCCESS;
1938}
1939
paula2c62832003-04-23 17:01:31 +00001940DEFUN (no_ospf_area_filter_list,
1941 no_ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001942 "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1943 NO_STR
1944 "OSPF area parameters\n"
1945 "OSPF area ID in IP address format\n"
1946 "OSPF area ID as a decimal value\n"
1947 "Filter networks between OSPF areas\n"
1948 "Filter prefixes between OSPF areas\n"
1949 "Name of an IP prefix-list\n"
1950 "Filter networks sent to this area\n"
1951 "Filter networks sent from this area\n")
1952{
paul68980082003-03-25 05:07:42 +00001953 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001954 struct ospf_area *area;
1955 struct in_addr area_id;
1956 struct prefix_list *plist;
1957 int format;
1958
1959 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1960
Paul Jakma1a8ec2b2006-05-11 13:34:08 +00001961 if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1962 return CMD_SUCCESS;
1963
paul718e3742002-12-13 20:15:29 +00001964 plist = prefix_list_lookup (AFI_IP, argv[1]);
1965 if (strncmp (argv[2], "in", 2) == 0)
1966 {
1967 if (PREFIX_NAME_IN (area))
1968 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1969 return CMD_SUCCESS;
1970
1971 PREFIX_LIST_IN (area) = NULL;
1972 if (PREFIX_NAME_IN (area))
1973 free (PREFIX_NAME_IN (area));
1974
1975 PREFIX_NAME_IN (area) = NULL;
1976
paul68980082003-03-25 05:07:42 +00001977 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001978 }
1979 else
1980 {
1981 if (PREFIX_NAME_OUT (area))
1982 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1983 return CMD_SUCCESS;
1984
1985 PREFIX_LIST_OUT (area) = NULL;
1986 if (PREFIX_NAME_OUT (area))
1987 free (PREFIX_NAME_OUT (area));
1988
1989 PREFIX_NAME_OUT (area) = NULL;
1990
paul68980082003-03-25 05:07:42 +00001991 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001992 }
1993
1994 return CMD_SUCCESS;
1995}
1996
1997
paula2c62832003-04-23 17:01:31 +00001998DEFUN (ospf_area_authentication_message_digest,
1999 ospf_area_authentication_message_digest_cmd,
paul718e3742002-12-13 20:15:29 +00002000 "area (A.B.C.D|<0-4294967295>) authentication message-digest",
2001 "OSPF area parameters\n"
2002 "Enable authentication\n"
2003 "Use message-digest authentication\n")
2004{
paul68980082003-03-25 05:07:42 +00002005 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002006 struct ospf_area *area;
2007 struct in_addr area_id;
2008 int format;
2009
2010 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2011
paul68980082003-03-25 05:07:42 +00002012 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002013 area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
2014
2015 return CMD_SUCCESS;
2016}
2017
paula2c62832003-04-23 17:01:31 +00002018DEFUN (ospf_area_authentication,
2019 ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002020 "area (A.B.C.D|<0-4294967295>) authentication",
2021 "OSPF area parameters\n"
2022 "OSPF area ID in IP address format\n"
2023 "OSPF area ID as a decimal value\n"
2024 "Enable authentication\n")
2025{
paul68980082003-03-25 05:07:42 +00002026 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002027 struct ospf_area *area;
2028 struct in_addr area_id;
2029 int format;
2030
2031 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2032
paul68980082003-03-25 05:07:42 +00002033 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002034 area->auth_type = OSPF_AUTH_SIMPLE;
2035
2036 return CMD_SUCCESS;
2037}
2038
paula2c62832003-04-23 17:01:31 +00002039DEFUN (no_ospf_area_authentication,
2040 no_ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002041 "no area (A.B.C.D|<0-4294967295>) authentication",
2042 NO_STR
2043 "OSPF area parameters\n"
2044 "OSPF area ID in IP address format\n"
2045 "OSPF area ID as a decimal value\n"
2046 "Enable authentication\n")
2047{
paul68980082003-03-25 05:07:42 +00002048 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002049 struct ospf_area *area;
2050 struct in_addr area_id;
2051 int format;
2052
2053 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2054
paul68980082003-03-25 05:07:42 +00002055 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002056 if (area == NULL)
2057 return CMD_SUCCESS;
2058
2059 area->auth_type = OSPF_AUTH_NULL;
2060
paul68980082003-03-25 05:07:42 +00002061 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002062
2063 return CMD_SUCCESS;
2064}
2065
2066
2067DEFUN (ospf_abr_type,
2068 ospf_abr_type_cmd,
2069 "ospf abr-type (cisco|ibm|shortcut|standard)",
2070 "OSPF specific commands\n"
2071 "Set OSPF ABR type\n"
2072 "Alternative ABR, cisco implementation\n"
2073 "Alternative ABR, IBM implementation\n"
2074 "Shortcut ABR\n"
2075 "Standard behavior (RFC2328)\n")
2076{
paul68980082003-03-25 05:07:42 +00002077 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002078 u_char abr_type = OSPF_ABR_UNKNOWN;
2079
2080 if (strncmp (argv[0], "c", 1) == 0)
2081 abr_type = OSPF_ABR_CISCO;
2082 else if (strncmp (argv[0], "i", 1) == 0)
2083 abr_type = OSPF_ABR_IBM;
2084 else if (strncmp (argv[0], "sh", 2) == 0)
2085 abr_type = OSPF_ABR_SHORTCUT;
2086 else if (strncmp (argv[0], "st", 2) == 0)
2087 abr_type = OSPF_ABR_STAND;
2088 else
2089 return CMD_WARNING;
2090
2091 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002092 if (ospf->abr_type != abr_type)
paul718e3742002-12-13 20:15:29 +00002093 {
paul68980082003-03-25 05:07:42 +00002094 ospf->abr_type = abr_type;
2095 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002096 }
2097
2098 return CMD_SUCCESS;
2099}
2100
2101DEFUN (no_ospf_abr_type,
2102 no_ospf_abr_type_cmd,
pauld57834f2005-07-12 20:04:22 +00002103 "no ospf abr-type (cisco|ibm|shortcut|standard)",
paul718e3742002-12-13 20:15:29 +00002104 NO_STR
2105 "OSPF specific commands\n"
2106 "Set OSPF ABR type\n"
2107 "Alternative ABR, cisco implementation\n"
2108 "Alternative ABR, IBM implementation\n"
2109 "Shortcut ABR\n")
2110{
paul68980082003-03-25 05:07:42 +00002111 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002112 u_char abr_type = OSPF_ABR_UNKNOWN;
2113
2114 if (strncmp (argv[0], "c", 1) == 0)
2115 abr_type = OSPF_ABR_CISCO;
2116 else if (strncmp (argv[0], "i", 1) == 0)
2117 abr_type = OSPF_ABR_IBM;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002118 else if (strncmp (argv[0], "sh", 2) == 0)
paul718e3742002-12-13 20:15:29 +00002119 abr_type = OSPF_ABR_SHORTCUT;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002120 else if (strncmp (argv[0], "st", 2) == 0)
2121 abr_type = OSPF_ABR_STAND;
paul718e3742002-12-13 20:15:29 +00002122 else
2123 return CMD_WARNING;
2124
2125 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002126 if (ospf->abr_type == abr_type)
paul718e3742002-12-13 20:15:29 +00002127 {
pauld57834f2005-07-12 20:04:22 +00002128 ospf->abr_type = OSPF_ABR_DEFAULT;
paul68980082003-03-25 05:07:42 +00002129 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002130 }
2131
2132 return CMD_SUCCESS;
2133}
2134
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002135DEFUN (ospf_log_adjacency_changes,
2136 ospf_log_adjacency_changes_cmd,
2137 "log-adjacency-changes",
2138 "Log changes in adjacency state\n")
2139{
2140 struct ospf *ospf = vty->index;
2141
2142 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2143 return CMD_SUCCESS;
2144}
2145
2146DEFUN (ospf_log_adjacency_changes_detail,
2147 ospf_log_adjacency_changes_detail_cmd,
2148 "log-adjacency-changes detail",
2149 "Log changes in adjacency state\n"
2150 "Log all state changes\n")
2151{
2152 struct ospf *ospf = vty->index;
2153
2154 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2155 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2156 return CMD_SUCCESS;
2157}
2158
2159DEFUN (no_ospf_log_adjacency_changes,
2160 no_ospf_log_adjacency_changes_cmd,
2161 "no log-adjacency-changes",
2162 NO_STR
2163 "Log changes in adjacency state\n")
2164{
2165 struct ospf *ospf = vty->index;
2166
2167 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2168 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2169 return CMD_SUCCESS;
2170}
2171
2172DEFUN (no_ospf_log_adjacency_changes_detail,
2173 no_ospf_log_adjacency_changes_detail_cmd,
2174 "no log-adjacency-changes detail",
2175 NO_STR
2176 "Log changes in adjacency state\n"
2177 "Log all state changes\n")
2178{
2179 struct ospf *ospf = vty->index;
2180
2181 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2182 return CMD_SUCCESS;
2183}
2184
paul718e3742002-12-13 20:15:29 +00002185DEFUN (ospf_compatible_rfc1583,
2186 ospf_compatible_rfc1583_cmd,
2187 "compatible rfc1583",
2188 "OSPF compatibility list\n"
2189 "compatible with RFC 1583\n")
2190{
2191 struct ospf *ospf = vty->index;
2192
2193 if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2194 {
2195 SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002196 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002197 }
2198 return CMD_SUCCESS;
2199}
2200
2201DEFUN (no_ospf_compatible_rfc1583,
2202 no_ospf_compatible_rfc1583_cmd,
2203 "no compatible rfc1583",
2204 NO_STR
2205 "OSPF compatibility list\n"
2206 "compatible with RFC 1583\n")
2207{
2208 struct ospf *ospf = vty->index;
2209
2210 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2211 {
2212 UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002213 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002214 }
2215 return CMD_SUCCESS;
2216}
2217
2218ALIAS (ospf_compatible_rfc1583,
2219 ospf_rfc1583_flag_cmd,
2220 "ospf rfc1583compatibility",
2221 "OSPF specific commands\n"
2222 "Enable the RFC1583Compatibility flag\n")
2223
2224ALIAS (no_ospf_compatible_rfc1583,
2225 no_ospf_rfc1583_flag_cmd,
2226 "no ospf rfc1583compatibility",
2227 NO_STR
2228 "OSPF specific commands\n"
2229 "Disable the RFC1583Compatibility flag\n")
pauld24f6e22005-10-21 09:23:12 +00002230
2231static int
2232ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2233 unsigned int hold,
2234 unsigned int max)
2235{
2236 struct ospf *ospf = vty->index;
2237
2238 ospf->spf_delay = delay;
2239 ospf->spf_holdtime = hold;
2240 ospf->spf_max_holdtime = max;
2241
2242 return CMD_SUCCESS;
2243}
paul718e3742002-12-13 20:15:29 +00002244
pauld24f6e22005-10-21 09:23:12 +00002245DEFUN (ospf_timers_throttle_spf,
2246 ospf_timers_throttle_spf_cmd,
2247 "timers throttle spf <0-600000> <0-600000> <0-600000>",
2248 "Adjust routing timers\n"
2249 "Throttling adaptive timer\n"
2250 "OSPF SPF timers\n"
2251 "Delay (msec) from first change received till SPF calculation\n"
2252 "Initial hold time (msec) between consecutive SPF calculations\n"
2253 "Maximum hold time (msec)\n")
2254{
2255 unsigned int delay, hold, max;
2256
2257 if (argc != 3)
2258 {
2259 vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2260 return CMD_WARNING;
2261 }
2262
2263 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2264 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2265 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2266
2267 return ospf_timers_spf_set (vty, delay, hold, max);
2268}
2269
2270DEFUN_DEPRECATED (ospf_timers_spf,
paula2c62832003-04-23 17:01:31 +00002271 ospf_timers_spf_cmd,
paul718e3742002-12-13 20:15:29 +00002272 "timers spf <0-4294967295> <0-4294967295>",
2273 "Adjust routing timers\n"
2274 "OSPF SPF timers\n"
pauld24f6e22005-10-21 09:23:12 +00002275 "Delay (s) between receiving a change to SPF calculation\n"
2276 "Hold time (s) between consecutive SPF calculations\n")
paul718e3742002-12-13 20:15:29 +00002277{
pauld24f6e22005-10-21 09:23:12 +00002278 unsigned int delay, hold;
2279
2280 if (argc != 2)
2281 {
2282 vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2283 return CMD_WARNING;
2284 }
2285
paul4dadc292005-05-06 21:37:42 +00002286 VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2287 VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
pauld24f6e22005-10-21 09:23:12 +00002288
2289 /* truncate down the second values if they're greater than 600000ms */
2290 if (delay > (600000 / 1000))
2291 delay = 600000;
2292 else if (delay == 0)
2293 /* 0s delay was probably specified because of lack of ms resolution */
2294 delay = OSPF_SPF_DELAY_DEFAULT;
2295 if (hold > (600000 / 1000))
2296 hold = 600000;
2297
2298 return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
paul718e3742002-12-13 20:15:29 +00002299}
2300
pauld24f6e22005-10-21 09:23:12 +00002301DEFUN (no_ospf_timers_throttle_spf,
2302 no_ospf_timers_throttle_spf_cmd,
2303 "no timers throttle spf",
paul718e3742002-12-13 20:15:29 +00002304 NO_STR
2305 "Adjust routing timers\n"
pauld24f6e22005-10-21 09:23:12 +00002306 "Throttling adaptive timer\n"
paul718e3742002-12-13 20:15:29 +00002307 "OSPF SPF timers\n")
2308{
pauld24f6e22005-10-21 09:23:12 +00002309 return ospf_timers_spf_set (vty,
2310 OSPF_SPF_DELAY_DEFAULT,
2311 OSPF_SPF_HOLDTIME_DEFAULT,
2312 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
paul718e3742002-12-13 20:15:29 +00002313}
2314
pauld24f6e22005-10-21 09:23:12 +00002315ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2316 no_ospf_timers_spf_cmd,
2317 "no timers spf",
2318 NO_STR
2319 "Adjust routing timers\n"
2320 "OSPF SPF timers\n")
paul718e3742002-12-13 20:15:29 +00002321
paula2c62832003-04-23 17:01:31 +00002322DEFUN (ospf_neighbor,
2323 ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002324 "neighbor A.B.C.D",
2325 NEIGHBOR_STR
2326 "Neighbor IP address\n")
2327{
2328 struct ospf *ospf = vty->index;
2329 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002330 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2331 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002332
2333 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2334
2335 if (argc > 1)
2336 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2337
2338 if (argc > 2)
2339 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2340
2341 ospf_nbr_nbma_set (ospf, nbr_addr);
2342 if (argc > 1)
2343 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2344 if (argc > 2)
2345 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
2346
2347 return CMD_SUCCESS;
2348}
2349
paula2c62832003-04-23 17:01:31 +00002350ALIAS (ospf_neighbor,
2351 ospf_neighbor_priority_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002352 "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2353 NEIGHBOR_STR
2354 "Neighbor IP address\n"
2355 "Neighbor Priority\n"
2356 "Priority\n"
2357 "Dead Neighbor Polling interval\n"
2358 "Seconds\n")
2359
paula2c62832003-04-23 17:01:31 +00002360ALIAS (ospf_neighbor,
2361 ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002362 "neighbor A.B.C.D priority <0-255>",
2363 NEIGHBOR_STR
2364 "Neighbor IP address\n"
2365 "Neighbor Priority\n"
2366 "Seconds\n")
2367
paula2c62832003-04-23 17:01:31 +00002368DEFUN (ospf_neighbor_poll_interval,
2369 ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002370 "neighbor A.B.C.D poll-interval <1-65535>",
2371 NEIGHBOR_STR
2372 "Neighbor IP address\n"
2373 "Dead Neighbor Polling interval\n"
2374 "Seconds\n")
2375{
2376 struct ospf *ospf = vty->index;
2377 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002378 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2379 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002380
2381 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2382
2383 if (argc > 1)
2384 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2385
2386 if (argc > 2)
2387 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2388
2389 ospf_nbr_nbma_set (ospf, nbr_addr);
2390 if (argc > 1)
2391 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2392 if (argc > 2)
2393 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2394
2395 return CMD_SUCCESS;
2396}
2397
paula2c62832003-04-23 17:01:31 +00002398ALIAS (ospf_neighbor_poll_interval,
2399 ospf_neighbor_poll_interval_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002400 "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2401 NEIGHBOR_STR
2402 "Neighbor address\n"
2403 "OSPF dead-router polling interval\n"
2404 "Seconds\n"
2405 "OSPF priority of non-broadcast neighbor\n"
2406 "Priority\n")
2407
paula2c62832003-04-23 17:01:31 +00002408DEFUN (no_ospf_neighbor,
2409 no_ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002410 "no neighbor A.B.C.D",
2411 NO_STR
2412 NEIGHBOR_STR
2413 "Neighbor IP address\n")
2414{
2415 struct ospf *ospf = vty->index;
2416 struct in_addr nbr_addr;
2417 int ret;
2418
2419 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2420
2421 ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
2422
2423 return CMD_SUCCESS;
2424}
2425
paula2c62832003-04-23 17:01:31 +00002426ALIAS (no_ospf_neighbor,
2427 no_ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002428 "no neighbor A.B.C.D priority <0-255>",
2429 NO_STR
2430 NEIGHBOR_STR
2431 "Neighbor IP address\n"
2432 "Neighbor Priority\n"
2433 "Priority\n")
2434
paula2c62832003-04-23 17:01:31 +00002435ALIAS (no_ospf_neighbor,
2436 no_ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002437 "no neighbor A.B.C.D poll-interval <1-65535>",
2438 NO_STR
2439 NEIGHBOR_STR
2440 "Neighbor IP address\n"
2441 "Dead Neighbor Polling interval\n"
2442 "Seconds\n")
2443
paula2c62832003-04-23 17:01:31 +00002444ALIAS (no_ospf_neighbor,
2445 no_ospf_neighbor_priority_pollinterval_cmd,
paul718e3742002-12-13 20:15:29 +00002446 "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2447 NO_STR
2448 NEIGHBOR_STR
2449 "Neighbor IP address\n"
2450 "Neighbor Priority\n"
2451 "Priority\n"
2452 "Dead Neighbor Polling interval\n"
2453 "Seconds\n")
2454
2455
paula2c62832003-04-23 17:01:31 +00002456DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002457 "refresh timer <10-1800>",
2458 "Adjust refresh parameters\n"
2459 "Set refresh timer\n"
2460 "Timer value in seconds\n")
2461{
2462 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002463 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002464
2465 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2466 interval = (interval / 10) * 10;
2467
2468 ospf_timers_refresh_set (ospf, interval);
2469
2470 return CMD_SUCCESS;
2471}
2472
paula2c62832003-04-23 17:01:31 +00002473DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
paul718e3742002-12-13 20:15:29 +00002474 "no refresh timer <10-1800>",
2475 "Adjust refresh parameters\n"
2476 "Unset refresh timer\n"
2477 "Timer value in seconds\n")
2478{
2479 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002480 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002481
2482 if (argc == 1)
2483 {
2484 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2485
2486 if (ospf->lsa_refresh_interval != interval ||
2487 interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2488 return CMD_SUCCESS;
2489 }
2490
2491 ospf_timers_refresh_unset (ospf);
2492
2493 return CMD_SUCCESS;
2494}
2495
paula2c62832003-04-23 17:01:31 +00002496ALIAS (no_ospf_refresh_timer,
2497 no_ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002498 "no refresh timer",
2499 "Adjust refresh parameters\n"
2500 "Unset refresh timer\n")
2501
paula2c62832003-04-23 17:01:31 +00002502DEFUN (ospf_auto_cost_reference_bandwidth,
2503 ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002504 "auto-cost reference-bandwidth <1-4294967>",
2505 "Calculate OSPF interface cost according to bandwidth\n"
2506 "Use reference bandwidth method to assign OSPF cost\n"
2507 "The reference bandwidth in terms of Mbits per second\n")
2508{
paul68980082003-03-25 05:07:42 +00002509 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002510 u_int32_t refbw;
hasso52dc7ee2004-09-23 19:18:23 +00002511 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00002512 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002513
2514 refbw = strtol (argv[0], NULL, 10);
2515 if (refbw < 1 || refbw > 4294967)
2516 {
2517 vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2518 return CMD_WARNING;
2519 }
2520
2521 /* If reference bandwidth is changed. */
paul68980082003-03-25 05:07:42 +00002522 if ((refbw * 1000) == ospf->ref_bandwidth)
paul718e3742002-12-13 20:15:29 +00002523 return CMD_SUCCESS;
2524
paul68980082003-03-25 05:07:42 +00002525 ospf->ref_bandwidth = refbw * 1000;
paul1eb8ef22005-04-07 07:30:20 +00002526 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2527 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002528
2529 return CMD_SUCCESS;
2530}
2531
paula2c62832003-04-23 17:01:31 +00002532DEFUN (no_ospf_auto_cost_reference_bandwidth,
2533 no_ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002534 "no auto-cost reference-bandwidth",
2535 NO_STR
2536 "Calculate OSPF interface cost according to bandwidth\n"
2537 "Use reference bandwidth method to assign OSPF cost\n")
2538{
paul68980082003-03-25 05:07:42 +00002539 struct ospf *ospf = vty->index;
paul1eb8ef22005-04-07 07:30:20 +00002540 struct listnode *node, *nnode;
2541 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002542
paul68980082003-03-25 05:07:42 +00002543 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
paul718e3742002-12-13 20:15:29 +00002544 return CMD_SUCCESS;
2545
paul68980082003-03-25 05:07:42 +00002546 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
paul718e3742002-12-13 20:15:29 +00002547 vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2548 vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2549
paul1eb8ef22005-04-07 07:30:20 +00002550 for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2551 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002552
2553 return CMD_SUCCESS;
2554}
2555
hassoeb1ce602004-10-08 08:17:22 +00002556const char *ospf_abr_type_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002557{
2558 "Unknown",
2559 "Standard (RFC2328)",
2560 "Alternative IBM",
2561 "Alternative Cisco",
2562 "Alternative Shortcut"
2563};
2564
hassoeb1ce602004-10-08 08:17:22 +00002565const char *ospf_shortcut_mode_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002566{
2567 "Default",
2568 "Enabled",
2569 "Disabled"
2570};
2571
2572
2573
paul4dadc292005-05-06 21:37:42 +00002574static void
paul718e3742002-12-13 20:15:29 +00002575show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2576{
2577 /* Show Area ID. */
2578 vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2579
2580 /* Show Area type/mode. */
2581 if (OSPF_IS_AREA_BACKBONE (area))
2582 vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2583 else
2584 {
2585 if (area->external_routing == OSPF_AREA_STUB)
paulb0a053b2003-06-22 09:04:47 +00002586 vty_out (vty, " (Stub%s%s)",
2587 area->no_summary ? ", no summary" : "",
2588 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002589
paulb0a053b2003-06-22 09:04:47 +00002590 else if (area->external_routing == OSPF_AREA_NSSA)
2591 vty_out (vty, " (NSSA%s%s)",
2592 area->no_summary ? ", no summary" : "",
2593 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002594
2595 vty_out (vty, "%s", VTY_NEWLINE);
2596 vty_out (vty, " Shortcutting mode: %s",
paulb0a053b2003-06-22 09:04:47 +00002597 ospf_shortcut_mode_descr_str[area->shortcut_configured]);
paul718e3742002-12-13 20:15:29 +00002598 vty_out (vty, ", S-bit consensus: %s%s",
paulb0a053b2003-06-22 09:04:47 +00002599 area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002600 }
2601
2602 /* Show number of interfaces. */
2603 vty_out (vty, " Number of interfaces in this area: Total: %d, "
2604 "Active: %d%s", listcount (area->oiflist),
2605 area->act_ints, VTY_NEWLINE);
2606
paul718e3742002-12-13 20:15:29 +00002607 if (area->external_routing == OSPF_AREA_NSSA)
2608 {
2609 vty_out (vty, " It is an NSSA configuration. %s Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00002610 if (! IS_OSPF_ABR (area->ospf))
paulb0a053b2003-06-22 09:04:47 +00002611 vty_out (vty, " It is not ABR, therefore not Translator. %s",
2612 VTY_NEWLINE);
2613 else if (area->NSSATranslatorState)
2614 {
2615 vty_out (vty, " We are an ABR and ");
2616 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2617 vty_out (vty, "the NSSA Elected Translator. %s",
2618 VTY_NEWLINE);
2619 else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2620 vty_out (vty, "always an NSSA Translator. %s",
2621 VTY_NEWLINE);
2622 }
paul718e3742002-12-13 20:15:29 +00002623 else
paulb0a053b2003-06-22 09:04:47 +00002624 {
2625 vty_out (vty, " We are an ABR, but ");
2626 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2627 vty_out (vty, "not the NSSA Elected Translator. %s",
2628 VTY_NEWLINE);
2629 else
hassoc6b87812004-12-22 13:09:59 +00002630 vty_out (vty, "never an NSSA Translator. %s",
paulb0a053b2003-06-22 09:04:47 +00002631 VTY_NEWLINE);
2632 }
paul718e3742002-12-13 20:15:29 +00002633 }
paul88d6cf32005-10-29 12:50:09 +00002634 /* Stub-router state for this area */
2635 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2636 {
ajs649654a2005-11-16 20:17:52 +00002637 char timebuf[OSPF_TIME_DUMP_SIZE];
paul88d6cf32005-10-29 12:50:09 +00002638 vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2639 VTY_NEWLINE);
2640 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2641 vty_out (vty, " Administratively activated (indefinitely)%s",
2642 VTY_NEWLINE);
2643 if (area->t_stub_router)
2644 vty_out (vty, " Active from startup, %s remaining%s",
2645 ospf_timer_dump (area->t_stub_router, timebuf,
2646 sizeof(timebuf)), VTY_NEWLINE);
2647 }
2648
paul718e3742002-12-13 20:15:29 +00002649 /* Show number of fully adjacent neighbors. */
2650 vty_out (vty, " Number of fully adjacent neighbors in this area:"
paulb0a053b2003-06-22 09:04:47 +00002651 " %d%s", area->full_nbrs, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002652
2653 /* Show authentication type. */
2654 vty_out (vty, " Area has ");
2655 if (area->auth_type == OSPF_AUTH_NULL)
2656 vty_out (vty, "no authentication%s", VTY_NEWLINE);
2657 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2658 vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2659 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2660 vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2661
2662 if (!OSPF_IS_AREA_BACKBONE (area))
2663 vty_out (vty, " Number of full virtual adjacencies going through"
2664 " this area: %d%s", area->full_vls, VTY_NEWLINE);
2665
2666 /* Show SPF calculation times. */
2667 vty_out (vty, " SPF algorithm executed %d times%s",
2668 area->spf_calculation, VTY_NEWLINE);
2669
2670 /* Show number of LSA. */
2671 vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
hassofe71a972004-12-22 16:16:02 +00002672 vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2673 ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2674 ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2675 vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2676 ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2677 ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2678 vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2679 ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2680 ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2681 vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2682 ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2683 ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2684 vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2685 ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2686 ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2687#ifdef HAVE_OPAQUE_LSA
2688 vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2689 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2690 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2691 vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2692 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2693 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2694#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002695 vty_out (vty, "%s", VTY_NEWLINE);
2696}
2697
2698DEFUN (show_ip_ospf,
2699 show_ip_ospf_cmd,
2700 "show ip ospf",
2701 SHOW_STR
2702 IP_STR
2703 "OSPF information\n")
2704{
paul1eb8ef22005-04-07 07:30:20 +00002705 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002706 struct ospf_area * area;
paul020709f2003-04-04 02:44:16 +00002707 struct ospf *ospf;
pauld24f6e22005-10-21 09:23:12 +00002708 struct timeval result;
ajs649654a2005-11-16 20:17:52 +00002709 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002710
2711 /* Check OSPF is enable. */
paul020709f2003-04-04 02:44:16 +00002712 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002713 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00002714 {
2715 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2716 return CMD_SUCCESS;
2717 }
2718
2719 /* Show Router ID. */
2720 vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
paul68980082003-03-25 05:07:42 +00002721 inet_ntoa (ospf->router_id),
paul718e3742002-12-13 20:15:29 +00002722 VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00002723
2724 /* Graceful shutdown */
paulc9c93d52005-11-26 13:31:11 +00002725 if (ospf->t_deferred_shutdown)
2726 vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2727 ospf_timer_dump (ospf->t_deferred_shutdown,
paul88d6cf32005-10-29 12:50:09 +00002728 timebuf, sizeof (timebuf)), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002729 /* Show capability. */
2730 vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2731 vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2732 vty_out (vty, " RFC1583Compatibility flag is %s%s",
paul68980082003-03-25 05:07:42 +00002733 CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
paul718e3742002-12-13 20:15:29 +00002734 "enabled" : "disabled", VTY_NEWLINE);
2735#ifdef HAVE_OPAQUE_LSA
2736 vty_out (vty, " OpaqueCapability flag is %s%s%s",
paul68980082003-03-25 05:07:42 +00002737 CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
paul718e3742002-12-13 20:15:29 +00002738 "enabled" : "disabled",
paul68980082003-03-25 05:07:42 +00002739 IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
paul718e3742002-12-13 20:15:29 +00002740 " (origination blocked)" : "",
2741 VTY_NEWLINE);
2742#endif /* HAVE_OPAQUE_LSA */
paul88d6cf32005-10-29 12:50:09 +00002743
2744 /* Show stub-router configuration */
2745 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2746 || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2747 {
2748 vty_out (vty, " Stub router advertisement is configured%s",
2749 VTY_NEWLINE);
2750 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2751 vty_out (vty, " Enabled for %us after start-up%s",
2752 ospf->stub_router_startup_time, VTY_NEWLINE);
2753 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2754 vty_out (vty, " Enabled for %us prior to full shutdown%s",
2755 ospf->stub_router_shutdown_time, VTY_NEWLINE);
2756 }
2757
paul718e3742002-12-13 20:15:29 +00002758 /* Show SPF timers. */
pauld24f6e22005-10-21 09:23:12 +00002759 vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2760 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2761 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2762 " Hold time multiplier is currently %d%s",
2763 ospf->spf_delay, VTY_NEWLINE,
2764 ospf->spf_holdtime, VTY_NEWLINE,
2765 ospf->spf_max_holdtime, VTY_NEWLINE,
2766 ospf->spf_hold_multiplier, VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002767 vty_out (vty, " SPF algorithm ");
2768 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2769 {
Paul Jakma2518efd2006-08-27 06:49:29 +00002770 result = tv_sub (recent_relative_time (), ospf->ts_spf);
paulb8ad39d2005-10-23 15:23:05 +00002771 vty_out (vty, "last executed %s ago%s",
2772 ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2773 VTY_NEWLINE);
2774 }
2775 else
2776 vty_out (vty, "has not been run%s", VTY_NEWLINE);
pauld24f6e22005-10-21 09:23:12 +00002777 vty_out (vty, " SPF timer %s%s%s",
2778 (ospf->t_spf_calc ? "due in " : "is "),
2779 ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2780 VTY_NEWLINE);
2781
paul718e3742002-12-13 20:15:29 +00002782 /* Show refresh parameters. */
2783 vty_out (vty, " Refresh timer %d secs%s",
paul68980082003-03-25 05:07:42 +00002784 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002785
2786 /* Show ABR/ASBR flags. */
paul68980082003-03-25 05:07:42 +00002787 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
paul718e3742002-12-13 20:15:29 +00002788 vty_out (vty, " This router is an ABR, ABR type is: %s%s",
paul68980082003-03-25 05:07:42 +00002789 ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002790
paul68980082003-03-25 05:07:42 +00002791 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
paul718e3742002-12-13 20:15:29 +00002792 vty_out (vty, " This router is an ASBR "
2793 "(injecting external routing information)%s", VTY_NEWLINE);
2794
2795 /* Show Number of AS-external-LSAs. */
hassofe71a972004-12-22 16:16:02 +00002796 vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2797 ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2798 ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2799#ifdef HAVE_OPAQUE_LSA
2800 vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2801 ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2802 ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2803#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002804 /* Show number of areas attached. */
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002805 vty_out (vty, " Number of areas attached to this router: %d%s",
2806 listcount (ospf->areas), VTY_NEWLINE);
2807
2808 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2809 {
2810 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2811 vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2812 else
2813 vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2814 }
2815
2816 vty_out (vty, "%s",VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002817
2818 /* Show each area status. */
paul1eb8ef22005-04-07 07:30:20 +00002819 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2820 show_ip_ospf_area (vty, area);
paul718e3742002-12-13 20:15:29 +00002821
2822 return CMD_SUCCESS;
2823}
2824
2825
ajsfd651fa2005-03-29 16:08:16 +00002826static void
paul68980082003-03-25 05:07:42 +00002827show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2828 struct interface *ifp)
paul718e3742002-12-13 20:15:29 +00002829{
ajsfd651fa2005-03-29 16:08:16 +00002830 int is_up;
paul718e3742002-12-13 20:15:29 +00002831 struct ospf_neighbor *nbr;
paul718e3742002-12-13 20:15:29 +00002832 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00002833
paul718e3742002-12-13 20:15:29 +00002834 /* Is interface up? */
ajsfd651fa2005-03-29 16:08:16 +00002835 vty_out (vty, "%s is %s%s", ifp->name,
2836 ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
ajsd2fc8892005-04-02 18:38:43 +00002837 vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2838 ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2839 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002840
2841 /* Is interface OSPF enabled? */
ajsfd651fa2005-03-29 16:08:16 +00002842 if (ospf_oi_count(ifp) == 0)
paul718e3742002-12-13 20:15:29 +00002843 {
2844 vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2845 return;
2846 }
ajsfd651fa2005-03-29 16:08:16 +00002847 else if (!is_up)
2848 {
2849 vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2850 VTY_NEWLINE);
2851 return;
2852 }
2853
paul718e3742002-12-13 20:15:29 +00002854 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2855 {
2856 struct ospf_interface *oi = rn->info;
2857
2858 if (oi == NULL)
2859 continue;
2860
2861 /* Show OSPF interface information. */
2862 vty_out (vty, " Internet Address %s/%d,",
2863 inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2864
Paul Jakma9c27ef92006-05-04 07:32:57 +00002865 if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2866 {
2867 struct in_addr *dest;
2868 const char *dstr;
2869
Andrew J. Schorre4529632006-12-12 19:18:21 +00002870 if (CONNECTED_PEER(oi->connected)
2871 || oi->type == OSPF_IFTYPE_VIRTUALLINK)
Paul Jakma9c27ef92006-05-04 07:32:57 +00002872 dstr = "Peer";
2873 else
2874 dstr = "Broadcast";
2875
2876 /* For Vlinks, showing the peer address is probably more
2877 * informative than the local interface that is being used
2878 */
2879 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2880 dest = &oi->vl_data->peer_addr;
2881 else
2882 dest = &oi->connected->destination->u.prefix4;
2883
2884 vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2885 }
hasso3fb9cd62004-10-19 19:44:43 +00002886
paul718e3742002-12-13 20:15:29 +00002887 vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2888 VTY_NEWLINE);
2889
vincentba682532005-09-29 13:52:57 +00002890 vty_out (vty, " MTU mismatch detection:%s%s",
2891 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2892
paul718e3742002-12-13 20:15:29 +00002893 vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
paul68980082003-03-25 05:07:42 +00002894 inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
paul718e3742002-12-13 20:15:29 +00002895 oi->output_cost, VTY_NEWLINE);
2896
2897 vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2898 OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2899 PRIORITY (oi), VTY_NEWLINE);
2900
2901 /* Show DR information. */
2902 if (DR (oi).s_addr == 0)
2903 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2904 else
2905 {
2906 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2907 if (nbr == NULL)
2908 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2909 else
2910 {
2911 vty_out (vty, " Designated Router (ID) %s,",
2912 inet_ntoa (nbr->router_id));
2913 vty_out (vty, " Interface Address %s%s",
2914 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2915 }
2916 }
2917
2918 /* Show BDR information. */
2919 if (BDR (oi).s_addr == 0)
2920 vty_out (vty, " No backup designated router on this network%s",
2921 VTY_NEWLINE);
2922 else
2923 {
2924 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2925 if (nbr == NULL)
2926 vty_out (vty, " No backup designated router on this network%s",
2927 VTY_NEWLINE);
2928 else
2929 {
2930 vty_out (vty, " Backup Designated Router (ID) %s,",
2931 inet_ntoa (nbr->router_id));
2932 vty_out (vty, " Interface Address %s%s",
2933 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2934 }
2935 }
ajsba6454e2005-02-08 15:37:30 +00002936
2937 vty_out (vty, " Multicast group memberships:");
Paul Jakma429ac782006-06-15 18:40:49 +00002938 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2939 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2940 {
2941 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2942 vty_out (vty, " OSPFAllRouters");
2943 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2944 vty_out (vty, " OSPFDesignatedRouters");
2945 }
2946 else
ajsba6454e2005-02-08 15:37:30 +00002947 vty_out (vty, " <None>");
2948 vty_out (vty, "%s", VTY_NEWLINE);
2949
paul718e3742002-12-13 20:15:29 +00002950 vty_out (vty, " Timer intervals configured,");
paulf9ad9372005-10-21 00:45:17 +00002951 vty_out (vty, " Hello ");
2952 if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2953 vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2954 else
2955 vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2956 vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2957 OSPF_IF_PARAM (oi, v_wait),
paul718e3742002-12-13 20:15:29 +00002958 OSPF_IF_PARAM (oi, v_wait),
2959 OSPF_IF_PARAM (oi, retransmit_interval),
2960 VTY_NEWLINE);
2961
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002962 if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
paulf9ad9372005-10-21 00:45:17 +00002963 {
ajs649654a2005-11-16 20:17:52 +00002964 char timebuf[OSPF_TIME_DUMP_SIZE];
paulf9ad9372005-10-21 00:45:17 +00002965 vty_out (vty, " Hello due in %s%s",
ajs649654a2005-11-16 20:17:52 +00002966 ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
paulf9ad9372005-10-21 00:45:17 +00002967 VTY_NEWLINE);
2968 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002969 else /* passive-interface is set */
paul718e3742002-12-13 20:15:29 +00002970 vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2971
2972 vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
paul68980082003-03-25 05:07:42 +00002973 ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
paul718e3742002-12-13 20:15:29 +00002974 VTY_NEWLINE);
2975 }
2976}
2977
2978DEFUN (show_ip_ospf_interface,
2979 show_ip_ospf_interface_cmd,
2980 "show ip ospf interface [INTERFACE]",
2981 SHOW_STR
2982 IP_STR
2983 "OSPF information\n"
2984 "Interface information\n"
2985 "Interface name\n")
2986{
2987 struct interface *ifp;
paul020709f2003-04-04 02:44:16 +00002988 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00002989 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002990
paul020709f2003-04-04 02:44:16 +00002991 ospf = ospf_lookup ();
Paul Jakmacac3b5c2006-05-11 13:31:11 +00002992 if (ospf == NULL)
2993 {
2994 vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
2995 return CMD_SUCCESS;
2996 }
paul020709f2003-04-04 02:44:16 +00002997
paul718e3742002-12-13 20:15:29 +00002998 /* Show All Interfaces. */
2999 if (argc == 0)
paul1eb8ef22005-04-07 07:30:20 +00003000 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
3001 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00003002 /* Interface name is specified. */
3003 else
3004 {
3005 if ((ifp = if_lookup_by_name (argv[0])) == NULL)
3006 vty_out (vty, "No such interface name%s", VTY_NEWLINE);
3007 else
paul68980082003-03-25 05:07:42 +00003008 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00003009 }
3010
3011 return CMD_SUCCESS;
3012}
3013
paul4dadc292005-05-06 21:37:42 +00003014static void
pauld24f6e22005-10-21 09:23:12 +00003015show_ip_ospf_neighbour_header (struct vty *vty)
3016{
3017 vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3018 VTY_NEWLINE,
3019 "Neighbor ID", "Pri", "State", "Dead Time",
3020 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3021 VTY_NEWLINE);
3022}
3023
3024static void
paul718e3742002-12-13 20:15:29 +00003025show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3026{
3027 struct route_node *rn;
3028 struct ospf_neighbor *nbr;
3029 char msgbuf[16];
ajs649654a2005-11-16 20:17:52 +00003030 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003031
3032 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3033 if ((nbr = rn->info))
3034 /* Do not show myself. */
3035 if (nbr != oi->nbr_self)
3036 /* Down state is not shown. */
3037 if (nbr->state != NSM_Down)
3038 {
3039 ospf_nbr_state_message (nbr, msgbuf, 16);
3040
3041 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
pauld24f6e22005-10-21 09:23:12 +00003042 vty_out (vty, "%-15s %3d %-15s ",
3043 "-", nbr->priority,
3044 msgbuf);
3045 else
3046 vty_out (vty, "%-15s %3d %-15s ",
3047 inet_ntoa (nbr->router_id), nbr->priority,
3048 msgbuf);
3049
3050 vty_out (vty, "%9s ",
3051 ospf_timer_dump (nbr->t_inactivity, timebuf,
3052 sizeof(timebuf)));
3053
paul718e3742002-12-13 20:15:29 +00003054 vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
pauld24f6e22005-10-21 09:23:12 +00003055 vty_out (vty, "%-20s %5ld %5ld %5d%s",
paul718e3742002-12-13 20:15:29 +00003056 IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3057 ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3058 VTY_NEWLINE);
3059 }
3060}
3061
3062DEFUN (show_ip_ospf_neighbor,
3063 show_ip_ospf_neighbor_cmd,
3064 "show ip ospf neighbor",
3065 SHOW_STR
3066 IP_STR
3067 "OSPF information\n"
3068 "Neighbor list\n")
3069{
paul020709f2003-04-04 02:44:16 +00003070 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003071 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003072 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003073
paul020709f2003-04-04 02:44:16 +00003074 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003075 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003076 {
3077 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3078 return CMD_SUCCESS;
3079 }
3080
pauld24f6e22005-10-21 09:23:12 +00003081 show_ip_ospf_neighbour_header (vty);
paul718e3742002-12-13 20:15:29 +00003082
paul1eb8ef22005-04-07 07:30:20 +00003083 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3084 show_ip_ospf_neighbor_sub (vty, oi);
paul718e3742002-12-13 20:15:29 +00003085
3086 return CMD_SUCCESS;
3087}
3088
3089DEFUN (show_ip_ospf_neighbor_all,
3090 show_ip_ospf_neighbor_all_cmd,
3091 "show ip ospf neighbor all",
3092 SHOW_STR
3093 IP_STR
3094 "OSPF information\n"
3095 "Neighbor list\n"
3096 "include down status neighbor\n")
3097{
Joakim Tjernlund35f89142008-07-01 16:54:07 +02003098 struct ospf *ospf = ospf_lookup ();
hasso52dc7ee2004-09-23 19:18:23 +00003099 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003100 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003101
paul68980082003-03-25 05:07:42 +00003102 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003103 {
3104 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3105 return CMD_SUCCESS;
3106 }
pauld24f6e22005-10-21 09:23:12 +00003107
3108 show_ip_ospf_neighbour_header (vty);
3109
paul1eb8ef22005-04-07 07:30:20 +00003110 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003111 {
hasso52dc7ee2004-09-23 19:18:23 +00003112 struct listnode *nbr_node;
paul1eb8ef22005-04-07 07:30:20 +00003113 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003114
3115 show_ip_ospf_neighbor_sub (vty, oi);
3116
3117 /* print Down neighbor status */
paul1eb8ef22005-04-07 07:30:20 +00003118 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
paul718e3742002-12-13 20:15:29 +00003119 {
paul718e3742002-12-13 20:15:29 +00003120 if (nbr_nbma->nbr == NULL
3121 || nbr_nbma->nbr->state == NSM_Down)
3122 {
pauld24f6e22005-10-21 09:23:12 +00003123 vty_out (vty, "%-15s %3d %-15s %9s ",
paul718e3742002-12-13 20:15:29 +00003124 "-", nbr_nbma->priority, "Down", "-");
pauld24f6e22005-10-21 09:23:12 +00003125 vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
paul718e3742002-12-13 20:15:29 +00003126 inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3127 0, 0, 0, VTY_NEWLINE);
3128 }
3129 }
3130 }
3131
3132 return CMD_SUCCESS;
3133}
3134
3135DEFUN (show_ip_ospf_neighbor_int,
3136 show_ip_ospf_neighbor_int_cmd,
hassobb5b7552005-08-21 20:01:15 +00003137 "show ip ospf neighbor IFNAME",
paul718e3742002-12-13 20:15:29 +00003138 SHOW_STR
3139 IP_STR
3140 "OSPF information\n"
3141 "Neighbor list\n"
3142 "Interface name\n")
3143{
paul020709f2003-04-04 02:44:16 +00003144 struct ospf *ospf;
hassobb5b7552005-08-21 20:01:15 +00003145 struct interface *ifp;
3146 struct route_node *rn;
3147
3148 ifp = if_lookup_by_name (argv[0]);
3149 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003150 {
hassobb5b7552005-08-21 20:01:15 +00003151 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003152 return CMD_WARNING;
3153 }
3154
paul020709f2003-04-04 02:44:16 +00003155 ospf = ospf_lookup ();
3156 if (ospf == NULL)
3157 {
3158 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3159 return CMD_SUCCESS;
3160 }
pauld24f6e22005-10-21 09:23:12 +00003161
3162 show_ip_ospf_neighbour_header (vty);
3163
hassobb5b7552005-08-21 20:01:15 +00003164 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00003165 {
hassobb5b7552005-08-21 20:01:15 +00003166 struct ospf_interface *oi = rn->info;
3167
3168 if (oi == NULL)
3169 continue;
3170
paul718e3742002-12-13 20:15:29 +00003171 show_ip_ospf_neighbor_sub (vty, oi);
3172 }
3173
3174 return CMD_SUCCESS;
3175}
3176
paul4dadc292005-05-06 21:37:42 +00003177static void
paul718e3742002-12-13 20:15:29 +00003178show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3179 struct ospf_nbr_nbma *nbr_nbma)
3180{
ajs649654a2005-11-16 20:17:52 +00003181 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003182
3183 /* Show neighbor ID. */
3184 vty_out (vty, " Neighbor %s,", "-");
3185
3186 /* Show interface address. */
3187 vty_out (vty, " interface address %s%s",
3188 inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3189 /* Show Area ID. */
3190 vty_out (vty, " In the area %s via interface %s%s",
3191 ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3192 /* Show neighbor priority and state. */
3193 vty_out (vty, " Neighbor priority is %d, State is %s,",
3194 nbr_nbma->priority, "Down");
3195 /* Show state changes. */
3196 vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3197
3198 /* Show PollInterval */
3199 vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3200
3201 /* Show poll-interval timer. */
3202 vty_out (vty, " Poll timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003203 ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3204 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003205
3206 /* Show poll-interval timer thread. */
3207 vty_out (vty, " Thread Poll Timer %s%s",
3208 nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3209}
3210
paul4dadc292005-05-06 21:37:42 +00003211static void
paul718e3742002-12-13 20:15:29 +00003212show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3213 struct ospf_neighbor *nbr)
3214{
ajs649654a2005-11-16 20:17:52 +00003215 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003216
3217 /* Show neighbor ID. */
3218 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3219 vty_out (vty, " Neighbor %s,", "-");
3220 else
3221 vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3222
3223 /* Show interface address. */
3224 vty_out (vty, " interface address %s%s",
3225 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3226 /* Show Area ID. */
3227 vty_out (vty, " In the area %s via interface %s%s",
3228 ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3229 /* Show neighbor priority and state. */
3230 vty_out (vty, " Neighbor priority is %d, State is %s,",
3231 nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3232 /* Show state changes. */
3233 vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
Paul Jakma3fed4162006-07-25 20:44:12 +00003234 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
Paul Jakma90c33172006-07-11 17:57:25 +00003235 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003236 struct timeval res
3237 = tv_sub (recent_relative_time (), nbr->ts_last_progress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003238 vty_out (vty, " Most recent state change statistics:%s",
3239 VTY_NEWLINE);
3240 vty_out (vty, " Progressive change %s ago%s",
Paul Jakma90c33172006-07-11 17:57:25 +00003241 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
Paul Jakma3fed4162006-07-25 20:44:12 +00003242 VTY_NEWLINE);
3243 }
3244 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3245 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003246 struct timeval res
3247 = tv_sub (recent_relative_time (), nbr->ts_last_regress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003248 vty_out (vty, " Regressive change %s ago, due to %s%s",
3249 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3250 (nbr->last_regress_str ? nbr->last_regress_str : "??"),
Paul Jakma90c33172006-07-11 17:57:25 +00003251 VTY_NEWLINE);
3252 }
paul718e3742002-12-13 20:15:29 +00003253 /* Show Designated Rotuer ID. */
3254 vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3255 /* Show Backup Designated Rotuer ID. */
3256 vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3257 /* Show options. */
3258 vty_out (vty, " Options %d %s%s", nbr->options,
3259 ospf_options_dump (nbr->options), VTY_NEWLINE);
3260 /* Show Router Dead interval timer. */
3261 vty_out (vty, " Dead timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003262 ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3263 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003264 /* Show Database Summary list. */
3265 vty_out (vty, " Database Summary List %d%s",
3266 ospf_db_summary_count (nbr), VTY_NEWLINE);
3267 /* Show Link State Request list. */
3268 vty_out (vty, " Link State Request List %ld%s",
3269 ospf_ls_request_count (nbr), VTY_NEWLINE);
3270 /* Show Link State Retransmission list. */
3271 vty_out (vty, " Link State Retransmission List %ld%s",
3272 ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3273 /* Show inactivity timer thread. */
3274 vty_out (vty, " Thread Inactivity Timer %s%s",
3275 nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3276 /* Show Database Description retransmission thread. */
3277 vty_out (vty, " Thread Database Description Retransmision %s%s",
3278 nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3279 /* Show Link State Request Retransmission thread. */
3280 vty_out (vty, " Thread Link State Request Retransmission %s%s",
3281 nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3282 /* Show Link State Update Retransmission thread. */
3283 vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3284 nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3285}
3286
3287DEFUN (show_ip_ospf_neighbor_id,
3288 show_ip_ospf_neighbor_id_cmd,
3289 "show ip ospf neighbor A.B.C.D",
3290 SHOW_STR
3291 IP_STR
3292 "OSPF information\n"
3293 "Neighbor list\n"
3294 "Neighbor ID\n")
3295{
paul020709f2003-04-04 02:44:16 +00003296 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003297 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003298 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003299 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003300 struct in_addr router_id;
3301 int ret;
3302
3303 ret = inet_aton (argv[0], &router_id);
3304 if (!ret)
3305 {
3306 vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3307 return CMD_WARNING;
3308 }
3309
paul020709f2003-04-04 02:44:16 +00003310 ospf = ospf_lookup ();
3311 if (ospf == NULL)
3312 {
3313 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3314 return CMD_SUCCESS;
3315 }
3316
paul1eb8ef22005-04-07 07:30:20 +00003317 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3318 if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
Andrew J. Schorr1c066bf2006-06-30 16:53:47 +00003319 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003320
paul718e3742002-12-13 20:15:29 +00003321 return CMD_SUCCESS;
3322}
3323
3324DEFUN (show_ip_ospf_neighbor_detail,
3325 show_ip_ospf_neighbor_detail_cmd,
3326 "show ip ospf neighbor detail",
3327 SHOW_STR
3328 IP_STR
3329 "OSPF information\n"
3330 "Neighbor list\n"
3331 "detail of all neighbors\n")
3332{
paul020709f2003-04-04 02:44:16 +00003333 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003334 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003335 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003336
paul020709f2003-04-04 02:44:16 +00003337 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003338 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003339 {
3340 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3341 return CMD_SUCCESS;
3342 }
paul718e3742002-12-13 20:15:29 +00003343
paul1eb8ef22005-04-07 07:30:20 +00003344 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003345 {
paul718e3742002-12-13 20:15:29 +00003346 struct route_node *rn;
3347 struct ospf_neighbor *nbr;
3348
3349 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3350 if ((nbr = rn->info))
3351 if (nbr != oi->nbr_self)
3352 if (nbr->state != NSM_Down)
3353 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3354 }
3355
3356 return CMD_SUCCESS;
3357}
3358
3359DEFUN (show_ip_ospf_neighbor_detail_all,
3360 show_ip_ospf_neighbor_detail_all_cmd,
3361 "show ip ospf neighbor detail all",
3362 SHOW_STR
3363 IP_STR
3364 "OSPF information\n"
3365 "Neighbor list\n"
3366 "detail of all neighbors\n"
3367 "include down status neighbor\n")
3368{
paul020709f2003-04-04 02:44:16 +00003369 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003370 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003371 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003372
paul020709f2003-04-04 02:44:16 +00003373 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003374 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003375 {
3376 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3377 return CMD_SUCCESS;
3378 }
paul718e3742002-12-13 20:15:29 +00003379
paul1eb8ef22005-04-07 07:30:20 +00003380 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003381 {
paul718e3742002-12-13 20:15:29 +00003382 struct route_node *rn;
3383 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003384 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003385
3386 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3387 if ((nbr = rn->info))
3388 if (nbr != oi->nbr_self)
3389 if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3390 show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3391
3392 if (oi->type == OSPF_IFTYPE_NBMA)
3393 {
hasso52dc7ee2004-09-23 19:18:23 +00003394 struct listnode *nd;
paul718e3742002-12-13 20:15:29 +00003395
paul1eb8ef22005-04-07 07:30:20 +00003396 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3397 if (nbr_nbma->nbr == NULL
3398 || nbr_nbma->nbr->state == NSM_Down)
3399 show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
paul718e3742002-12-13 20:15:29 +00003400 }
3401 }
3402
3403 return CMD_SUCCESS;
3404}
3405
3406DEFUN (show_ip_ospf_neighbor_int_detail,
3407 show_ip_ospf_neighbor_int_detail_cmd,
hassobb5b7552005-08-21 20:01:15 +00003408 "show ip ospf neighbor IFNAME detail",
paul718e3742002-12-13 20:15:29 +00003409 SHOW_STR
3410 IP_STR
3411 "OSPF information\n"
3412 "Neighbor list\n"
hassobb5b7552005-08-21 20:01:15 +00003413 "Interface name\n"
paul718e3742002-12-13 20:15:29 +00003414 "detail of all neighbors")
3415{
paul020709f2003-04-04 02:44:16 +00003416 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00003417 struct ospf_interface *oi;
hassobb5b7552005-08-21 20:01:15 +00003418 struct interface *ifp;
3419 struct route_node *rn, *nrn;
3420 struct ospf_neighbor *nbr;
3421
3422 ifp = if_lookup_by_name (argv[0]);
3423 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003424 {
hassobb5b7552005-08-21 20:01:15 +00003425 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003426 return CMD_WARNING;
3427 }
3428
paul020709f2003-04-04 02:44:16 +00003429 ospf = ospf_lookup ();
3430 if (ospf == NULL)
3431 {
3432 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3433 return CMD_SUCCESS;
3434 }
paul68980082003-03-25 05:07:42 +00003435
paul718e3742002-12-13 20:15:29 +00003436
hassobb5b7552005-08-21 20:01:15 +00003437 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3438 if ((oi = rn->info))
3439 for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3440 if ((nbr = nrn->info))
paul718e3742002-12-13 20:15:29 +00003441 if (nbr != oi->nbr_self)
3442 if (nbr->state != NSM_Down)
3443 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003444
3445 return CMD_SUCCESS;
3446}
3447
3448
3449/* Show functions */
paul4dadc292005-05-06 21:37:42 +00003450static int
paul020709f2003-04-04 02:44:16 +00003451show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
paul718e3742002-12-13 20:15:29 +00003452{
paul718e3742002-12-13 20:15:29 +00003453 struct router_lsa *rl;
3454 struct summary_lsa *sl;
3455 struct as_external_lsa *asel;
3456 struct prefix_ipv4 p;
3457
3458 if (lsa != NULL)
3459 /* If self option is set, check LSA self flag. */
3460 if (self == 0 || IS_LSA_SELF (lsa))
3461 {
3462 /* LSA common part show. */
3463 vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3464 vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3465 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3466 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3467 /* LSA specific part show. */
3468 switch (lsa->data->type)
3469 {
3470 case OSPF_ROUTER_LSA:
3471 rl = (struct router_lsa *) lsa->data;
3472 vty_out (vty, " %-d", ntohs (rl->links));
3473 break;
3474 case OSPF_SUMMARY_LSA:
3475 sl = (struct summary_lsa *) lsa->data;
3476
3477 p.family = AF_INET;
3478 p.prefix = sl->header.id;
3479 p.prefixlen = ip_masklen (sl->mask);
3480 apply_mask_ipv4 (&p);
3481
3482 vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3483 break;
3484 case OSPF_AS_EXTERNAL_LSA:
paul551a8972003-05-18 15:22:55 +00003485 case OSPF_AS_NSSA_LSA:
paul718e3742002-12-13 20:15:29 +00003486 asel = (struct as_external_lsa *) lsa->data;
3487
3488 p.family = AF_INET;
3489 p.prefix = asel->header.id;
3490 p.prefixlen = ip_masklen (asel->mask);
3491 apply_mask_ipv4 (&p);
3492
3493 vty_out (vty, " %s %s/%d [0x%lx]",
3494 IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3495 inet_ntoa (p.prefix), p.prefixlen,
3496 (u_long)ntohl (asel->e[0].route_tag));
3497 break;
3498 case OSPF_NETWORK_LSA:
3499 case OSPF_ASBR_SUMMARY_LSA:
3500#ifdef HAVE_OPAQUE_LSA
3501 case OSPF_OPAQUE_LINK_LSA:
3502 case OSPF_OPAQUE_AREA_LSA:
3503 case OSPF_OPAQUE_AS_LSA:
3504#endif /* HAVE_OPAQUE_LSA */
3505 default:
3506 break;
3507 }
3508 vty_out (vty, VTY_NEWLINE);
3509 }
3510
3511 return 0;
3512}
3513
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003514static const char *show_database_desc[] =
paul718e3742002-12-13 20:15:29 +00003515{
3516 "unknown",
3517 "Router Link States",
3518 "Net Link States",
3519 "Summary Link States",
3520 "ASBR-Summary Link States",
3521 "AS External Link States",
paul718e3742002-12-13 20:15:29 +00003522 "Group Membership LSA",
3523 "NSSA-external Link States",
paul718e3742002-12-13 20:15:29 +00003524#ifdef HAVE_OPAQUE_LSA
3525 "Type-8 LSA",
3526 "Link-Local Opaque-LSA",
3527 "Area-Local Opaque-LSA",
3528 "AS-external Opaque-LSA",
3529#endif /* HAVE_OPAQUE_LSA */
3530};
3531
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003532static const char *show_database_header[] =
paul718e3742002-12-13 20:15:29 +00003533{
3534 "",
3535 "Link ID ADV Router Age Seq# CkSum Link count",
3536 "Link ID ADV Router Age Seq# CkSum",
3537 "Link ID ADV Router Age Seq# CkSum Route",
3538 "Link ID ADV Router Age Seq# CkSum",
3539 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003540 " --- header for Group Member ----",
3541 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003542#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003543 " --- type-8 ---",
3544 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3545 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3546 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3547#endif /* HAVE_OPAQUE_LSA */
3548};
3549
paul4dadc292005-05-06 21:37:42 +00003550static void
paul718e3742002-12-13 20:15:29 +00003551show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3552{
3553 struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
paul4957f492003-06-27 01:28:45 +00003554
paul718e3742002-12-13 20:15:29 +00003555 vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
paul4957f492003-06-27 01:28:45 +00003556 vty_out (vty, " Options: 0x%-2x : %s%s",
3557 lsa->data->options,
3558 ospf_options_dump(lsa->data->options),
3559 VTY_NEWLINE);
3560 vty_out (vty, " LS Flags: 0x%-2x %s%s",
paul9d526032003-06-30 22:46:14 +00003561 lsa->flags,
paul4957f492003-06-27 01:28:45 +00003562 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3563 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003564
3565 if (lsa->data->type == OSPF_ROUTER_LSA)
3566 {
3567 vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3568
3569 if (rlsa->flags)
3570 vty_out (vty, " :%s%s%s%s",
3571 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3572 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3573 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3574 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3575
3576 vty_out (vty, "%s", VTY_NEWLINE);
3577 }
3578 vty_out (vty, " LS Type: %s%s",
3579 LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3580 vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3581 LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3582 vty_out (vty, " Advertising Router: %s%s",
3583 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3584 vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3585 VTY_NEWLINE);
3586 vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3587 VTY_NEWLINE);
3588 vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3589}
3590
hassoeb1ce602004-10-08 08:17:22 +00003591const char *link_type_desc[] =
paul718e3742002-12-13 20:15:29 +00003592{
3593 "(null)",
3594 "another Router (point-to-point)",
3595 "a Transit Network",
3596 "Stub Network",
3597 "a Virtual Link",
3598};
3599
hassoeb1ce602004-10-08 08:17:22 +00003600const char *link_id_desc[] =
paul718e3742002-12-13 20:15:29 +00003601{
3602 "(null)",
3603 "Neighboring Router ID",
3604 "Designated Router address",
paul68980082003-03-25 05:07:42 +00003605 "Net",
paul718e3742002-12-13 20:15:29 +00003606 "Neighboring Router ID",
3607};
3608
hassoeb1ce602004-10-08 08:17:22 +00003609const char *link_data_desc[] =
paul718e3742002-12-13 20:15:29 +00003610{
3611 "(null)",
3612 "Router Interface address",
3613 "Router Interface address",
3614 "Network Mask",
3615 "Router Interface address",
3616};
3617
3618/* Show router-LSA each Link information. */
paul4dadc292005-05-06 21:37:42 +00003619static void
paul718e3742002-12-13 20:15:29 +00003620show_ip_ospf_database_router_links (struct vty *vty,
3621 struct router_lsa *rl)
3622{
3623 int len, i, type;
3624
3625 len = ntohs (rl->header.length) - 4;
3626 for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3627 {
3628 type = rl->link[i].type;
3629
3630 vty_out (vty, " Link connected to: %s%s",
3631 link_type_desc[type], VTY_NEWLINE);
3632 vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3633 inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3634 vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3635 inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3636 vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3637 vty_out (vty, " TOS 0 Metric: %d%s",
3638 ntohs (rl->link[i].metric), VTY_NEWLINE);
3639 vty_out (vty, "%s", VTY_NEWLINE);
3640 }
3641}
3642
3643/* Show router-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003644static int
paul718e3742002-12-13 20:15:29 +00003645show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3646{
3647 if (lsa != NULL)
3648 {
3649 struct router_lsa *rl = (struct router_lsa *) lsa->data;
3650
3651 show_ip_ospf_database_header (vty, lsa);
3652
3653 vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3654 VTY_NEWLINE, VTY_NEWLINE);
3655
3656 show_ip_ospf_database_router_links (vty, rl);
paulb0a053b2003-06-22 09:04:47 +00003657 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003658 }
3659
3660 return 0;
3661}
3662
3663/* Show network-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003664static int
paul718e3742002-12-13 20:15:29 +00003665show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3666{
3667 int length, i;
3668
3669 if (lsa != NULL)
3670 {
3671 struct network_lsa *nl = (struct network_lsa *) lsa->data;
3672
3673 show_ip_ospf_database_header (vty, lsa);
3674
3675 vty_out (vty, " Network Mask: /%d%s",
3676 ip_masklen (nl->mask), VTY_NEWLINE);
3677
3678 length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3679
3680 for (i = 0; length > 0; i++, length -= 4)
3681 vty_out (vty, " Attached Router: %s%s",
3682 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3683
3684 vty_out (vty, "%s", VTY_NEWLINE);
3685 }
3686
3687 return 0;
3688}
3689
3690/* Show summary-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003691static int
paul718e3742002-12-13 20:15:29 +00003692show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3693{
3694 if (lsa != NULL)
3695 {
3696 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3697
3698 show_ip_ospf_database_header (vty, lsa);
3699
3700 vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3701 VTY_NEWLINE);
3702 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3703 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003704 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003705 }
3706
3707 return 0;
3708}
3709
3710/* Show summary-ASBR-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003711static int
paul718e3742002-12-13 20:15:29 +00003712show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3713{
3714 if (lsa != NULL)
3715 {
3716 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3717
3718 show_ip_ospf_database_header (vty, lsa);
3719
3720 vty_out (vty, " Network Mask: /%d%s",
3721 ip_masklen (sl->mask), VTY_NEWLINE);
3722 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3723 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003724 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003725 }
3726
3727 return 0;
3728}
3729
3730/* Show AS-external-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003731static int
paul718e3742002-12-13 20:15:29 +00003732show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3733{
3734 if (lsa != NULL)
3735 {
3736 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3737
3738 show_ip_ospf_database_header (vty, lsa);
3739
3740 vty_out (vty, " Network Mask: /%d%s",
3741 ip_masklen (al->mask), VTY_NEWLINE);
3742 vty_out (vty, " Metric Type: %s%s",
3743 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3744 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3745 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3746 vty_out (vty, " Metric: %d%s",
3747 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3748 vty_out (vty, " Forward Address: %s%s",
3749 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3750
3751 vty_out (vty, " External Route Tag: %lu%s%s",
3752 (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3753 }
3754
3755 return 0;
3756}
3757
ajs2a42e282004-12-08 18:43:03 +00003758/* N.B. This function currently seems to be unused. */
paul4dadc292005-05-06 21:37:42 +00003759static int
paul718e3742002-12-13 20:15:29 +00003760show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3761{
3762 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3763
3764 /* show_ip_ospf_database_header (vty, lsa); */
3765
ajs2a42e282004-12-08 18:43:03 +00003766 zlog_debug( " Network Mask: /%d%s",
paul718e3742002-12-13 20:15:29 +00003767 ip_masklen (al->mask), "\n");
ajs2a42e282004-12-08 18:43:03 +00003768 zlog_debug( " Metric Type: %s%s",
paul718e3742002-12-13 20:15:29 +00003769 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3770 "2 (Larger than any link state path)" : "1", "\n");
ajs2a42e282004-12-08 18:43:03 +00003771 zlog_debug( " TOS: 0%s", "\n");
3772 zlog_debug( " Metric: %d%s",
paul718e3742002-12-13 20:15:29 +00003773 GET_METRIC (al->e[0].metric), "\n");
ajs2a42e282004-12-08 18:43:03 +00003774 zlog_debug( " Forward Address: %s%s",
paul718e3742002-12-13 20:15:29 +00003775 inet_ntoa (al->e[0].fwd_addr), "\n");
3776
ajs2a42e282004-12-08 18:43:03 +00003777 zlog_debug( " External Route Tag: %u%s%s",
paul718e3742002-12-13 20:15:29 +00003778 ntohl (al->e[0].route_tag), "\n", "\n");
3779
3780 return 0;
3781}
3782
3783/* Show AS-NSSA-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003784static int
paul718e3742002-12-13 20:15:29 +00003785show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3786{
3787 if (lsa != NULL)
3788 {
3789 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3790
3791 show_ip_ospf_database_header (vty, lsa);
3792
3793 vty_out (vty, " Network Mask: /%d%s",
3794 ip_masklen (al->mask), VTY_NEWLINE);
3795 vty_out (vty, " Metric Type: %s%s",
3796 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3797 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3798 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3799 vty_out (vty, " Metric: %d%s",
3800 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3801 vty_out (vty, " NSSA: Forward Address: %s%s",
3802 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3803
3804 vty_out (vty, " External Route Tag: %u%s%s",
3805 ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3806 }
3807
3808 return 0;
3809}
3810
paul4dadc292005-05-06 21:37:42 +00003811static int
paul718e3742002-12-13 20:15:29 +00003812show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3813{
3814 return 0;
3815}
3816
3817#ifdef HAVE_OPAQUE_LSA
paul4dadc292005-05-06 21:37:42 +00003818static int
paul718e3742002-12-13 20:15:29 +00003819show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3820{
3821 if (lsa != NULL)
3822 {
3823 show_ip_ospf_database_header (vty, lsa);
3824 show_opaque_info_detail (vty, lsa);
3825
3826 vty_out (vty, "%s", VTY_NEWLINE);
3827 }
3828 return 0;
3829}
3830#endif /* HAVE_OPAQUE_LSA */
3831
3832int (*show_function[])(struct vty *, struct ospf_lsa *) =
3833{
3834 NULL,
3835 show_router_lsa_detail,
3836 show_network_lsa_detail,
3837 show_summary_lsa_detail,
3838 show_summary_asbr_lsa_detail,
3839 show_as_external_lsa_detail,
paul718e3742002-12-13 20:15:29 +00003840 show_func_dummy,
3841 show_as_nssa_lsa_detail, /* almost same as external */
paul718e3742002-12-13 20:15:29 +00003842#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003843 NULL, /* type-8 */
3844 show_opaque_lsa_detail,
3845 show_opaque_lsa_detail,
3846 show_opaque_lsa_detail,
3847#endif /* HAVE_OPAQUE_LSA */
3848};
3849
paul4dadc292005-05-06 21:37:42 +00003850static void
paul718e3742002-12-13 20:15:29 +00003851show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3852 struct in_addr *adv_router)
3853{
3854 memset (lp, 0, sizeof (struct prefix_ls));
3855 lp->family = 0;
3856 if (id == NULL)
3857 lp->prefixlen = 0;
3858 else if (adv_router == NULL)
3859 {
3860 lp->prefixlen = 32;
3861 lp->id = *id;
3862 }
3863 else
3864 {
3865 lp->prefixlen = 64;
3866 lp->id = *id;
3867 lp->adv_router = *adv_router;
3868 }
3869}
3870
paul4dadc292005-05-06 21:37:42 +00003871static void
paul718e3742002-12-13 20:15:29 +00003872show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3873 struct in_addr *id, struct in_addr *adv_router)
3874{
3875 struct prefix_ls lp;
3876 struct route_node *rn, *start;
3877 struct ospf_lsa *lsa;
3878
3879 show_lsa_prefix_set (vty, &lp, id, adv_router);
3880 start = route_node_get (rt, (struct prefix *) &lp);
3881 if (start)
3882 {
3883 route_lock_node (start);
3884 for (rn = start; rn; rn = route_next_until (rn, start))
3885 if ((lsa = rn->info))
3886 {
paul718e3742002-12-13 20:15:29 +00003887 if (show_function[lsa->data->type] != NULL)
3888 show_function[lsa->data->type] (vty, lsa);
3889 }
3890 route_unlock_node (start);
3891 }
3892}
3893
3894/* Show detail LSA information
3895 -- if id is NULL then show all LSAs. */
paul4dadc292005-05-06 21:37:42 +00003896static void
paul020709f2003-04-04 02:44:16 +00003897show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003898 struct in_addr *id, struct in_addr *adv_router)
3899{
hasso52dc7ee2004-09-23 19:18:23 +00003900 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003901 struct ospf_area *area;
3902
paul718e3742002-12-13 20:15:29 +00003903 switch (type)
3904 {
3905 case OSPF_AS_EXTERNAL_LSA:
3906#ifdef HAVE_OPAQUE_LSA
3907 case OSPF_OPAQUE_AS_LSA:
3908#endif /* HAVE_OPAQUE_LSA */
3909 vty_out (vty, " %s %s%s",
3910 show_database_desc[type],
3911 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003912 show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
paul718e3742002-12-13 20:15:29 +00003913 break;
3914 default:
paul1eb8ef22005-04-07 07:30:20 +00003915 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003916 {
paul718e3742002-12-13 20:15:29 +00003917 vty_out (vty, "%s %s (Area %s)%s%s",
3918 VTY_NEWLINE, show_database_desc[type],
3919 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3920 show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3921 }
3922 break;
3923 }
3924}
3925
paul4dadc292005-05-06 21:37:42 +00003926static void
paul718e3742002-12-13 20:15:29 +00003927show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3928 struct in_addr *adv_router)
3929{
3930 struct route_node *rn;
3931 struct ospf_lsa *lsa;
3932
3933 for (rn = route_top (rt); rn; rn = route_next (rn))
3934 if ((lsa = rn->info))
3935 if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3936 {
paul718e3742002-12-13 20:15:29 +00003937 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3938 continue;
paul718e3742002-12-13 20:15:29 +00003939 if (show_function[lsa->data->type] != NULL)
3940 show_function[lsa->data->type] (vty, lsa);
3941 }
3942}
3943
3944/* Show detail LSA information. */
paul4dadc292005-05-06 21:37:42 +00003945static void
paul020709f2003-04-04 02:44:16 +00003946show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003947 struct in_addr *adv_router)
3948{
hasso52dc7ee2004-09-23 19:18:23 +00003949 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003950 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00003951
3952 switch (type)
3953 {
3954 case OSPF_AS_EXTERNAL_LSA:
3955#ifdef HAVE_OPAQUE_LSA
3956 case OSPF_OPAQUE_AS_LSA:
3957#endif /* HAVE_OPAQUE_LSA */
3958 vty_out (vty, " %s %s%s",
3959 show_database_desc[type],
3960 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003961 show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
paul718e3742002-12-13 20:15:29 +00003962 adv_router);
3963 break;
3964 default:
paul1eb8ef22005-04-07 07:30:20 +00003965 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003966 {
paul718e3742002-12-13 20:15:29 +00003967 vty_out (vty, "%s %s (Area %s)%s%s",
3968 VTY_NEWLINE, show_database_desc[type],
3969 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3970 show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3971 adv_router);
3972 }
3973 break;
3974 }
3975}
3976
paul4dadc292005-05-06 21:37:42 +00003977static void
paul020709f2003-04-04 02:44:16 +00003978show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
paul718e3742002-12-13 20:15:29 +00003979{
paul020709f2003-04-04 02:44:16 +00003980 struct ospf_lsa *lsa;
3981 struct route_node *rn;
paul1eb8ef22005-04-07 07:30:20 +00003982 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +00003983 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003984 int type;
3985
paul1eb8ef22005-04-07 07:30:20 +00003986 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003987 {
paul718e3742002-12-13 20:15:29 +00003988 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3989 {
3990 switch (type)
3991 {
3992 case OSPF_AS_EXTERNAL_LSA:
3993#ifdef HAVE_OPAQUE_LSA
3994 case OSPF_OPAQUE_AS_LSA:
3995#endif /* HAVE_OPAQUE_LSA */
3996 continue;
3997 default:
3998 break;
3999 }
4000 if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
4001 (!self && ospf_lsdb_count (area->lsdb, type) > 0))
4002 {
4003 vty_out (vty, " %s (Area %s)%s%s",
4004 show_database_desc[type],
4005 ospf_area_desc_string (area),
4006 VTY_NEWLINE, VTY_NEWLINE);
4007 vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
4008
paul020709f2003-04-04 02:44:16 +00004009 LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
4010 show_lsa_summary (vty, lsa, self);
paul718e3742002-12-13 20:15:29 +00004011
4012 vty_out (vty, "%s", VTY_NEWLINE);
4013 }
4014 }
4015 }
4016
4017 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4018 {
4019 switch (type)
4020 {
4021 case OSPF_AS_EXTERNAL_LSA:
4022#ifdef HAVE_OPAQUE_LSA
4023 case OSPF_OPAQUE_AS_LSA:
4024#endif /* HAVE_OPAQUE_LSA */
paule8e19462006-01-19 20:16:55 +00004025 break;
paul718e3742002-12-13 20:15:29 +00004026 default:
4027 continue;
4028 }
paul68980082003-03-25 05:07:42 +00004029 if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4030 (!self && ospf_lsdb_count (ospf->lsdb, type)))
paul718e3742002-12-13 20:15:29 +00004031 {
4032 vty_out (vty, " %s%s%s",
4033 show_database_desc[type],
4034 VTY_NEWLINE, VTY_NEWLINE);
4035 vty_out (vty, "%s%s", show_database_header[type],
4036 VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00004037
4038 LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4039 show_lsa_summary (vty, lsa, self);
4040
paul718e3742002-12-13 20:15:29 +00004041 vty_out (vty, "%s", VTY_NEWLINE);
4042 }
4043 }
4044
4045 vty_out (vty, "%s", VTY_NEWLINE);
4046}
4047
paul4dadc292005-05-06 21:37:42 +00004048static void
paul020709f2003-04-04 02:44:16 +00004049show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00004050{
hasso52dc7ee2004-09-23 19:18:23 +00004051 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00004052 struct ospf_lsa *lsa;
4053
4054 vty_out (vty, "%s MaxAge Link States:%s%s",
4055 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4056
paul1eb8ef22005-04-07 07:30:20 +00004057 for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
4058 {
4059 vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4060 vty_out (vty, "Link State ID: %s%s",
4061 inet_ntoa (lsa->data->id), VTY_NEWLINE);
4062 vty_out (vty, "Advertising Router: %s%s",
4063 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4064 vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4065 vty_out (vty, "%s", VTY_NEWLINE);
4066 }
paul718e3742002-12-13 20:15:29 +00004067}
4068
paul718e3742002-12-13 20:15:29 +00004069#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4070#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
paul718e3742002-12-13 20:15:29 +00004071
4072#ifdef HAVE_OPAQUE_LSA
4073#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4074#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4075#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4076#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4077#else /* HAVE_OPAQUE_LSA */
4078#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4079#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4080#define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4081#define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4082#endif /* HAVE_OPAQUE_LSA */
4083
4084#define OSPF_LSA_TYPES_CMD_STR \
4085 "asbr-summary|external|network|router|summary" \
4086 OSPF_LSA_TYPE_NSSA_CMD_STR \
4087 OSPF_LSA_TYPE_OPAQUE_CMD_STR
4088
4089#define OSPF_LSA_TYPES_DESC \
4090 "ASBR summary link states\n" \
4091 "External link states\n" \
4092 "Network link states\n" \
4093 "Router link states\n" \
4094 "Network summary link states\n" \
4095 OSPF_LSA_TYPE_NSSA_DESC \
4096 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4097 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4098 OSPF_LSA_TYPE_OPAQUE_AS_DESC
4099
4100DEFUN (show_ip_ospf_database,
4101 show_ip_ospf_database_cmd,
4102 "show ip ospf database",
4103 SHOW_STR
4104 IP_STR
4105 "OSPF information\n"
4106 "Database summary\n")
4107{
paul020709f2003-04-04 02:44:16 +00004108 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004109 int type, ret;
4110 struct in_addr id, adv_router;
4111
paul020709f2003-04-04 02:44:16 +00004112 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004113 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004114 {
4115 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4116 return CMD_SUCCESS;
4117 }
paul718e3742002-12-13 20:15:29 +00004118
4119 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004120 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004121
4122 /* Show all LSA. */
4123 if (argc == 0)
4124 {
paul020709f2003-04-04 02:44:16 +00004125 show_ip_ospf_database_summary (vty, ospf, 0);
paul718e3742002-12-13 20:15:29 +00004126 return CMD_SUCCESS;
4127 }
4128
4129 /* Set database type to show. */
4130 if (strncmp (argv[0], "r", 1) == 0)
4131 type = OSPF_ROUTER_LSA;
4132 else if (strncmp (argv[0], "ne", 2) == 0)
4133 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004134 else if (strncmp (argv[0], "ns", 2) == 0)
4135 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004136 else if (strncmp (argv[0], "su", 2) == 0)
4137 type = OSPF_SUMMARY_LSA;
4138 else if (strncmp (argv[0], "a", 1) == 0)
4139 type = OSPF_ASBR_SUMMARY_LSA;
4140 else if (strncmp (argv[0], "e", 1) == 0)
4141 type = OSPF_AS_EXTERNAL_LSA;
4142 else if (strncmp (argv[0], "se", 2) == 0)
4143 {
paul020709f2003-04-04 02:44:16 +00004144 show_ip_ospf_database_summary (vty, ospf, 1);
paul718e3742002-12-13 20:15:29 +00004145 return CMD_SUCCESS;
4146 }
4147 else if (strncmp (argv[0], "m", 1) == 0)
4148 {
paul020709f2003-04-04 02:44:16 +00004149 show_ip_ospf_database_maxage (vty, ospf);
paul718e3742002-12-13 20:15:29 +00004150 return CMD_SUCCESS;
4151 }
4152#ifdef HAVE_OPAQUE_LSA
4153 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4154 type = OSPF_OPAQUE_LINK_LSA;
4155 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4156 type = OSPF_OPAQUE_AREA_LSA;
4157 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4158 type = OSPF_OPAQUE_AS_LSA;
4159#endif /* HAVE_OPAQUE_LSA */
4160 else
4161 return CMD_WARNING;
4162
4163 /* `show ip ospf database LSA'. */
4164 if (argc == 1)
paul020709f2003-04-04 02:44:16 +00004165 show_lsa_detail (vty, ospf, type, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00004166 else if (argc >= 2)
4167 {
4168 ret = inet_aton (argv[1], &id);
4169 if (!ret)
4170 return CMD_WARNING;
4171
4172 /* `show ip ospf database LSA ID'. */
4173 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00004174 show_lsa_detail (vty, ospf, type, &id, NULL);
paul718e3742002-12-13 20:15:29 +00004175 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4176 else if (argc == 3)
4177 {
4178 if (strncmp (argv[2], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004179 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004180 else
4181 {
4182 ret = inet_aton (argv[2], &adv_router);
4183 if (!ret)
4184 return CMD_WARNING;
4185 }
paul020709f2003-04-04 02:44:16 +00004186 show_lsa_detail (vty, ospf, type, &id, &adv_router);
paul718e3742002-12-13 20:15:29 +00004187 }
4188 }
4189
4190 return CMD_SUCCESS;
4191}
4192
4193ALIAS (show_ip_ospf_database,
4194 show_ip_ospf_database_type_cmd,
4195 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4196 SHOW_STR
4197 IP_STR
4198 "OSPF information\n"
4199 "Database summary\n"
4200 OSPF_LSA_TYPES_DESC
4201 "LSAs in MaxAge list\n"
4202 "Self-originated link states\n")
4203
4204ALIAS (show_ip_ospf_database,
4205 show_ip_ospf_database_type_id_cmd,
4206 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4207 SHOW_STR
4208 IP_STR
4209 "OSPF information\n"
4210 "Database summary\n"
4211 OSPF_LSA_TYPES_DESC
4212 "Link State ID (as an IP address)\n")
4213
4214ALIAS (show_ip_ospf_database,
4215 show_ip_ospf_database_type_id_adv_router_cmd,
4216 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4217 SHOW_STR
4218 IP_STR
4219 "OSPF information\n"
4220 "Database summary\n"
4221 OSPF_LSA_TYPES_DESC
4222 "Link State ID (as an IP address)\n"
4223 "Advertising Router link states\n"
4224 "Advertising Router (as an IP address)\n")
4225
4226ALIAS (show_ip_ospf_database,
4227 show_ip_ospf_database_type_id_self_cmd,
4228 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4229 SHOW_STR
4230 IP_STR
4231 "OSPF information\n"
4232 "Database summary\n"
4233 OSPF_LSA_TYPES_DESC
4234 "Link State ID (as an IP address)\n"
4235 "Self-originated link states\n"
4236 "\n")
4237
4238DEFUN (show_ip_ospf_database_type_adv_router,
4239 show_ip_ospf_database_type_adv_router_cmd,
4240 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4241 SHOW_STR
4242 IP_STR
4243 "OSPF information\n"
4244 "Database summary\n"
4245 OSPF_LSA_TYPES_DESC
4246 "Advertising Router link states\n"
4247 "Advertising Router (as an IP address)\n")
4248{
paul020709f2003-04-04 02:44:16 +00004249 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004250 int type, ret;
4251 struct in_addr adv_router;
4252
paul020709f2003-04-04 02:44:16 +00004253 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004254 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004255 {
4256 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4257 return CMD_SUCCESS;
4258 }
paul718e3742002-12-13 20:15:29 +00004259
4260 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004261 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004262
4263 if (argc != 2)
4264 return CMD_WARNING;
4265
4266 /* Set database type to show. */
4267 if (strncmp (argv[0], "r", 1) == 0)
4268 type = OSPF_ROUTER_LSA;
4269 else if (strncmp (argv[0], "ne", 2) == 0)
4270 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004271 else if (strncmp (argv[0], "ns", 2) == 0)
4272 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004273 else if (strncmp (argv[0], "s", 1) == 0)
4274 type = OSPF_SUMMARY_LSA;
4275 else if (strncmp (argv[0], "a", 1) == 0)
4276 type = OSPF_ASBR_SUMMARY_LSA;
4277 else if (strncmp (argv[0], "e", 1) == 0)
4278 type = OSPF_AS_EXTERNAL_LSA;
4279#ifdef HAVE_OPAQUE_LSA
4280 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4281 type = OSPF_OPAQUE_LINK_LSA;
4282 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4283 type = OSPF_OPAQUE_AREA_LSA;
4284 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4285 type = OSPF_OPAQUE_AS_LSA;
4286#endif /* HAVE_OPAQUE_LSA */
4287 else
4288 return CMD_WARNING;
4289
4290 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4291 if (strncmp (argv[1], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004292 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004293 else
4294 {
4295 ret = inet_aton (argv[1], &adv_router);
4296 if (!ret)
4297 return CMD_WARNING;
4298 }
4299
paul020709f2003-04-04 02:44:16 +00004300 show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
paul718e3742002-12-13 20:15:29 +00004301
4302 return CMD_SUCCESS;
4303}
4304
4305ALIAS (show_ip_ospf_database_type_adv_router,
4306 show_ip_ospf_database_type_self_cmd,
4307 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4308 SHOW_STR
4309 IP_STR
4310 "OSPF information\n"
4311 "Database summary\n"
4312 OSPF_LSA_TYPES_DESC
4313 "Self-originated link states\n")
4314
4315
4316DEFUN (ip_ospf_authentication_args,
4317 ip_ospf_authentication_args_addr_cmd,
4318 "ip ospf authentication (null|message-digest) A.B.C.D",
4319 "IP Information\n"
4320 "OSPF interface commands\n"
4321 "Enable authentication on this interface\n"
4322 "Use null authentication\n"
4323 "Use message-digest authentication\n"
4324 "Address of interface")
4325{
4326 struct interface *ifp;
4327 struct in_addr addr;
4328 int ret;
4329 struct ospf_if_params *params;
4330
4331 ifp = vty->index;
4332 params = IF_DEF_PARAMS (ifp);
4333
4334 if (argc == 2)
4335 {
4336 ret = inet_aton(argv[1], &addr);
4337 if (!ret)
4338 {
4339 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4340 VTY_NEWLINE);
4341 return CMD_WARNING;
4342 }
4343
4344 params = ospf_get_if_params (ifp, addr);
4345 ospf_if_update_params (ifp, addr);
4346 }
4347
4348 /* Handle null authentication */
4349 if ( argv[0][0] == 'n' )
4350 {
4351 SET_IF_PARAM (params, auth_type);
4352 params->auth_type = OSPF_AUTH_NULL;
4353 return CMD_SUCCESS;
4354 }
4355
4356 /* Handle message-digest authentication */
4357 if ( argv[0][0] == 'm' )
4358 {
4359 SET_IF_PARAM (params, auth_type);
4360 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4361 return CMD_SUCCESS;
4362 }
4363
4364 vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4365 return CMD_WARNING;
4366}
4367
4368ALIAS (ip_ospf_authentication_args,
4369 ip_ospf_authentication_args_cmd,
4370 "ip ospf authentication (null|message-digest)",
4371 "IP Information\n"
4372 "OSPF interface commands\n"
4373 "Enable authentication on this interface\n"
4374 "Use null authentication\n"
4375 "Use message-digest authentication\n")
4376
4377DEFUN (ip_ospf_authentication,
4378 ip_ospf_authentication_addr_cmd,
4379 "ip ospf authentication A.B.C.D",
4380 "IP Information\n"
4381 "OSPF interface commands\n"
4382 "Enable authentication on this interface\n"
4383 "Address of interface")
4384{
4385 struct interface *ifp;
4386 struct in_addr addr;
4387 int ret;
4388 struct ospf_if_params *params;
4389
4390 ifp = vty->index;
4391 params = IF_DEF_PARAMS (ifp);
4392
4393 if (argc == 1)
4394 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004395 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004396 if (!ret)
4397 {
4398 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4399 VTY_NEWLINE);
4400 return CMD_WARNING;
4401 }
4402
4403 params = ospf_get_if_params (ifp, addr);
4404 ospf_if_update_params (ifp, addr);
4405 }
4406
4407 SET_IF_PARAM (params, auth_type);
4408 params->auth_type = OSPF_AUTH_SIMPLE;
4409
4410 return CMD_SUCCESS;
4411}
4412
4413ALIAS (ip_ospf_authentication,
4414 ip_ospf_authentication_cmd,
4415 "ip ospf authentication",
4416 "IP Information\n"
4417 "OSPF interface commands\n"
4418 "Enable authentication on this interface\n")
4419
4420DEFUN (no_ip_ospf_authentication,
4421 no_ip_ospf_authentication_addr_cmd,
4422 "no ip ospf authentication A.B.C.D",
4423 NO_STR
4424 "IP Information\n"
4425 "OSPF interface commands\n"
4426 "Enable authentication on this interface\n"
4427 "Address of interface")
4428{
4429 struct interface *ifp;
4430 struct in_addr addr;
4431 int ret;
4432 struct ospf_if_params *params;
4433
4434 ifp = vty->index;
4435 params = IF_DEF_PARAMS (ifp);
4436
4437 if (argc == 1)
4438 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004439 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004440 if (!ret)
4441 {
4442 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4443 VTY_NEWLINE);
4444 return CMD_WARNING;
4445 }
4446
4447 params = ospf_lookup_if_params (ifp, addr);
4448 if (params == NULL)
4449 return CMD_SUCCESS;
4450 }
4451
4452 params->auth_type = OSPF_AUTH_NOTSET;
4453 UNSET_IF_PARAM (params, auth_type);
4454
4455 if (params != IF_DEF_PARAMS (ifp))
4456 {
4457 ospf_free_if_params (ifp, addr);
4458 ospf_if_update_params (ifp, addr);
4459 }
4460
4461 return CMD_SUCCESS;
4462}
4463
4464ALIAS (no_ip_ospf_authentication,
4465 no_ip_ospf_authentication_cmd,
4466 "no ip ospf authentication",
4467 NO_STR
4468 "IP Information\n"
4469 "OSPF interface commands\n"
4470 "Enable authentication on this interface\n")
4471
4472DEFUN (ip_ospf_authentication_key,
4473 ip_ospf_authentication_key_addr_cmd,
4474 "ip ospf authentication-key AUTH_KEY A.B.C.D",
4475 "IP Information\n"
4476 "OSPF interface commands\n"
4477 "Authentication password (key)\n"
4478 "The OSPF password (key)\n"
4479 "Address of interface")
4480{
4481 struct interface *ifp;
4482 struct in_addr addr;
4483 int ret;
4484 struct ospf_if_params *params;
4485
4486 ifp = vty->index;
4487 params = IF_DEF_PARAMS (ifp);
4488
4489 if (argc == 2)
4490 {
4491 ret = inet_aton(argv[1], &addr);
4492 if (!ret)
4493 {
4494 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4495 VTY_NEWLINE);
4496 return CMD_WARNING;
4497 }
4498
4499 params = ospf_get_if_params (ifp, addr);
4500 ospf_if_update_params (ifp, addr);
4501 }
4502
4503
4504 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
hassoc9e52be2004-09-26 16:09:34 +00004505 strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
paul718e3742002-12-13 20:15:29 +00004506 SET_IF_PARAM (params, auth_simple);
4507
4508 return CMD_SUCCESS;
4509}
4510
4511ALIAS (ip_ospf_authentication_key,
4512 ip_ospf_authentication_key_cmd,
4513 "ip ospf authentication-key AUTH_KEY",
4514 "IP Information\n"
4515 "OSPF interface commands\n"
4516 "Authentication password (key)\n"
4517 "The OSPF password (key)")
4518
4519ALIAS (ip_ospf_authentication_key,
4520 ospf_authentication_key_cmd,
4521 "ospf authentication-key AUTH_KEY",
4522 "OSPF interface commands\n"
4523 "Authentication password (key)\n"
4524 "The OSPF password (key)")
4525
4526DEFUN (no_ip_ospf_authentication_key,
4527 no_ip_ospf_authentication_key_addr_cmd,
4528 "no ip ospf authentication-key A.B.C.D",
4529 NO_STR
4530 "IP Information\n"
4531 "OSPF interface commands\n"
4532 "Authentication password (key)\n"
4533 "Address of interface")
4534{
4535 struct interface *ifp;
4536 struct in_addr addr;
4537 int ret;
4538 struct ospf_if_params *params;
4539
4540 ifp = vty->index;
4541 params = IF_DEF_PARAMS (ifp);
4542
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004543 if (argc == 1)
paul718e3742002-12-13 20:15:29 +00004544 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004545 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004546 if (!ret)
4547 {
4548 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4549 VTY_NEWLINE);
4550 return CMD_WARNING;
4551 }
4552
4553 params = ospf_lookup_if_params (ifp, addr);
4554 if (params == NULL)
4555 return CMD_SUCCESS;
4556 }
4557
4558 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4559 UNSET_IF_PARAM (params, auth_simple);
4560
4561 if (params != IF_DEF_PARAMS (ifp))
4562 {
4563 ospf_free_if_params (ifp, addr);
4564 ospf_if_update_params (ifp, addr);
4565 }
4566
4567 return CMD_SUCCESS;
4568}
4569
4570ALIAS (no_ip_ospf_authentication_key,
4571 no_ip_ospf_authentication_key_cmd,
4572 "no ip ospf authentication-key",
4573 NO_STR
4574 "IP Information\n"
4575 "OSPF interface commands\n"
4576 "Authentication password (key)\n")
4577
4578ALIAS (no_ip_ospf_authentication_key,
4579 no_ospf_authentication_key_cmd,
4580 "no ospf authentication-key",
4581 NO_STR
4582 "OSPF interface commands\n"
4583 "Authentication password (key)\n")
4584
4585DEFUN (ip_ospf_message_digest_key,
4586 ip_ospf_message_digest_key_addr_cmd,
4587 "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4588 "IP Information\n"
4589 "OSPF interface commands\n"
4590 "Message digest authentication password (key)\n"
4591 "Key ID\n"
4592 "Use MD5 algorithm\n"
4593 "The OSPF password (key)"
4594 "Address of interface")
4595{
4596 struct interface *ifp;
4597 struct crypt_key *ck;
4598 u_char key_id;
4599 struct in_addr addr;
4600 int ret;
4601 struct ospf_if_params *params;
4602
4603 ifp = vty->index;
4604 params = IF_DEF_PARAMS (ifp);
4605
4606 if (argc == 3)
4607 {
4608 ret = inet_aton(argv[2], &addr);
4609 if (!ret)
4610 {
4611 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4612 VTY_NEWLINE);
4613 return CMD_WARNING;
4614 }
4615
4616 params = ospf_get_if_params (ifp, addr);
4617 ospf_if_update_params (ifp, addr);
4618 }
4619
4620 key_id = strtol (argv[0], NULL, 10);
4621 if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4622 {
4623 vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4624 return CMD_WARNING;
4625 }
4626
4627 ck = ospf_crypt_key_new ();
4628 ck->key_id = (u_char) key_id;
4629 memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +00004630 strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +00004631
4632 ospf_crypt_key_add (params->auth_crypt, ck);
4633 SET_IF_PARAM (params, auth_crypt);
4634
4635 return CMD_SUCCESS;
4636}
4637
4638ALIAS (ip_ospf_message_digest_key,
4639 ip_ospf_message_digest_key_cmd,
4640 "ip ospf message-digest-key <1-255> md5 KEY",
4641 "IP Information\n"
4642 "OSPF interface commands\n"
4643 "Message digest authentication password (key)\n"
4644 "Key ID\n"
4645 "Use MD5 algorithm\n"
4646 "The OSPF password (key)")
4647
4648ALIAS (ip_ospf_message_digest_key,
4649 ospf_message_digest_key_cmd,
4650 "ospf message-digest-key <1-255> md5 KEY",
4651 "OSPF interface commands\n"
4652 "Message digest authentication password (key)\n"
4653 "Key ID\n"
4654 "Use MD5 algorithm\n"
4655 "The OSPF password (key)")
4656
4657DEFUN (no_ip_ospf_message_digest_key,
4658 no_ip_ospf_message_digest_key_addr_cmd,
4659 "no ip ospf message-digest-key <1-255> A.B.C.D",
4660 NO_STR
4661 "IP Information\n"
4662 "OSPF interface commands\n"
4663 "Message digest authentication password (key)\n"
4664 "Key ID\n"
4665 "Address of interface")
4666{
4667 struct interface *ifp;
4668 struct crypt_key *ck;
4669 int key_id;
4670 struct in_addr addr;
4671 int ret;
4672 struct ospf_if_params *params;
4673
4674 ifp = vty->index;
4675 params = IF_DEF_PARAMS (ifp);
4676
4677 if (argc == 2)
4678 {
4679 ret = inet_aton(argv[1], &addr);
4680 if (!ret)
4681 {
4682 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4683 VTY_NEWLINE);
4684 return CMD_WARNING;
4685 }
4686
4687 params = ospf_lookup_if_params (ifp, addr);
4688 if (params == NULL)
4689 return CMD_SUCCESS;
4690 }
4691
4692 key_id = strtol (argv[0], NULL, 10);
4693 ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4694 if (ck == NULL)
4695 {
4696 vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4697 return CMD_WARNING;
4698 }
4699
4700 ospf_crypt_key_delete (params->auth_crypt, key_id);
4701
4702 if (params != IF_DEF_PARAMS (ifp))
4703 {
4704 ospf_free_if_params (ifp, addr);
4705 ospf_if_update_params (ifp, addr);
4706 }
4707
4708 return CMD_SUCCESS;
4709}
4710
4711ALIAS (no_ip_ospf_message_digest_key,
4712 no_ip_ospf_message_digest_key_cmd,
4713 "no ip ospf message-digest-key <1-255>",
4714 NO_STR
4715 "IP Information\n"
4716 "OSPF interface commands\n"
4717 "Message digest authentication password (key)\n"
4718 "Key ID\n")
4719
4720ALIAS (no_ip_ospf_message_digest_key,
4721 no_ospf_message_digest_key_cmd,
4722 "no ospf message-digest-key <1-255>",
4723 NO_STR
4724 "OSPF interface commands\n"
4725 "Message digest authentication password (key)\n"
4726 "Key ID\n")
4727
4728DEFUN (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004729 ip_ospf_cost_u32_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004730 "ip ospf cost <1-65535> A.B.C.D",
4731 "IP Information\n"
4732 "OSPF interface commands\n"
4733 "Interface cost\n"
4734 "Cost\n"
4735 "Address of interface")
4736{
4737 struct interface *ifp = vty->index;
4738 u_int32_t cost;
4739 struct in_addr addr;
4740 int ret;
4741 struct ospf_if_params *params;
4742
4743 params = IF_DEF_PARAMS (ifp);
4744
4745 cost = strtol (argv[0], NULL, 10);
4746
4747 /* cost range is <1-65535>. */
4748 if (cost < 1 || cost > 65535)
4749 {
4750 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4751 return CMD_WARNING;
4752 }
4753
4754 if (argc == 2)
4755 {
4756 ret = inet_aton(argv[1], &addr);
4757 if (!ret)
4758 {
4759 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4760 VTY_NEWLINE);
4761 return CMD_WARNING;
4762 }
4763
4764 params = ospf_get_if_params (ifp, addr);
4765 ospf_if_update_params (ifp, addr);
4766 }
4767
4768 SET_IF_PARAM (params, output_cost_cmd);
4769 params->output_cost_cmd = cost;
4770
4771 ospf_if_recalculate_output_cost (ifp);
4772
4773 return CMD_SUCCESS;
4774}
4775
4776ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004777 ip_ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004778 "ip ospf cost <1-65535>",
4779 "IP Information\n"
4780 "OSPF interface commands\n"
4781 "Interface cost\n"
4782 "Cost")
4783
4784ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004785 ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004786 "ospf cost <1-65535>",
4787 "OSPF interface commands\n"
4788 "Interface cost\n"
4789 "Cost")
4790
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004791ALIAS (ip_ospf_cost,
4792 ospf_cost_u32_inet4_cmd,
4793 "ospf cost <1-65535> A.B.C.D",
4794 "OSPF interface commands\n"
4795 "Interface cost\n"
4796 "Cost\n"
4797 "Address of interface")
4798
paul718e3742002-12-13 20:15:29 +00004799DEFUN (no_ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004800 no_ip_ospf_cost_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004801 "no ip ospf cost A.B.C.D",
4802 NO_STR
4803 "IP Information\n"
4804 "OSPF interface commands\n"
4805 "Interface cost\n"
4806 "Address of interface")
4807{
4808 struct interface *ifp = vty->index;
4809 struct in_addr addr;
4810 int ret;
4811 struct ospf_if_params *params;
4812
4813 ifp = vty->index;
4814 params = IF_DEF_PARAMS (ifp);
4815
4816 if (argc == 1)
4817 {
4818 ret = inet_aton(argv[0], &addr);
4819 if (!ret)
4820 {
4821 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4822 VTY_NEWLINE);
4823 return CMD_WARNING;
4824 }
4825
4826 params = ospf_lookup_if_params (ifp, addr);
4827 if (params == NULL)
4828 return CMD_SUCCESS;
4829 }
4830
4831 UNSET_IF_PARAM (params, output_cost_cmd);
4832
4833 if (params != IF_DEF_PARAMS (ifp))
4834 {
4835 ospf_free_if_params (ifp, addr);
4836 ospf_if_update_params (ifp, addr);
4837 }
4838
4839 ospf_if_recalculate_output_cost (ifp);
4840
4841 return CMD_SUCCESS;
4842}
4843
4844ALIAS (no_ip_ospf_cost,
4845 no_ip_ospf_cost_cmd,
4846 "no ip ospf cost",
4847 NO_STR
4848 "IP Information\n"
4849 "OSPF interface commands\n"
4850 "Interface cost\n")
4851
4852ALIAS (no_ip_ospf_cost,
4853 no_ospf_cost_cmd,
4854 "no ospf cost",
4855 NO_STR
4856 "OSPF interface commands\n"
4857 "Interface cost\n")
4858
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004859ALIAS (no_ip_ospf_cost,
4860 no_ospf_cost_inet4_cmd,
4861 "no ospf cost A.B.C.D",
4862 NO_STR
4863 "OSPF interface commands\n"
4864 "Interface cost\n"
4865 "Address of interface")
4866
Denis Ovsienko827341b2009-09-28 19:34:59 +04004867DEFUN (no_ip_ospf_cost2,
4868 no_ip_ospf_cost_u32_cmd,
4869 "no ip ospf cost <1-65535>",
4870 NO_STR
4871 "IP Information\n"
4872 "OSPF interface commands\n"
4873 "Interface cost\n"
4874 "Cost")
4875{
4876 struct interface *ifp = vty->index;
4877 struct in_addr addr;
4878 u_int32_t cost;
4879 int ret;
4880 struct ospf_if_params *params;
4881
4882 ifp = vty->index;
4883 params = IF_DEF_PARAMS (ifp);
4884
4885 /* According to the semantics we are mimicking "no ip ospf cost N" is
4886 * always treated as "no ip ospf cost" regardless of the actual value
4887 * of N already configured for the interface. Thus the first argument
4888 * is always checked to be a number, but is ignored after that.
4889 */
4890 cost = strtol (argv[0], NULL, 10);
4891 if (cost < 1 || cost > 65535)
4892 {
4893 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4894 return CMD_WARNING;
4895 }
4896
4897 if (argc == 2)
4898 {
4899 ret = inet_aton(argv[1], &addr);
4900 if (!ret)
4901 {
4902 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4903 VTY_NEWLINE);
4904 return CMD_WARNING;
4905 }
4906
4907 params = ospf_lookup_if_params (ifp, addr);
4908 if (params == NULL)
4909 return CMD_SUCCESS;
4910 }
4911
4912 UNSET_IF_PARAM (params, output_cost_cmd);
4913
4914 if (params != IF_DEF_PARAMS (ifp))
4915 {
4916 ospf_free_if_params (ifp, addr);
4917 ospf_if_update_params (ifp, addr);
4918 }
4919
4920 ospf_if_recalculate_output_cost (ifp);
4921
4922 return CMD_SUCCESS;
4923}
4924
4925ALIAS (no_ip_ospf_cost2,
4926 no_ospf_cost_u32_cmd,
4927 "no ospf cost <1-65535>",
4928 NO_STR
4929 "OSPF interface commands\n"
4930 "Interface cost\n"
4931 "Cost")
4932
4933ALIAS (no_ip_ospf_cost2,
4934 no_ip_ospf_cost_u32_inet4_cmd,
4935 "no ip ospf cost <1-65535> A.B.C.D",
4936 NO_STR
4937 "IP Information\n"
4938 "OSPF interface commands\n"
4939 "Interface cost\n"
4940 "Cost\n"
4941 "Address of interface")
4942
4943ALIAS (no_ip_ospf_cost2,
4944 no_ospf_cost_u32_inet4_cmd,
4945 "no ospf cost <1-65535> A.B.C.D",
4946 NO_STR
4947 "OSPF interface commands\n"
4948 "Interface cost\n"
4949 "Cost\n"
4950 "Address of interface")
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004951
paul4dadc292005-05-06 21:37:42 +00004952static void
paul718e3742002-12-13 20:15:29 +00004953ospf_nbr_timer_update (struct ospf_interface *oi)
4954{
4955 struct route_node *rn;
4956 struct ospf_neighbor *nbr;
4957
4958 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4959 if ((nbr = rn->info))
4960 {
4961 nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4962 nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4963 nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4964 nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4965 }
4966}
4967
paulf9ad9372005-10-21 00:45:17 +00004968static int
4969ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4970 const char *nbr_str,
4971 const char *fast_hello_str)
paul718e3742002-12-13 20:15:29 +00004972{
4973 struct interface *ifp = vty->index;
4974 u_int32_t seconds;
paulf9ad9372005-10-21 00:45:17 +00004975 u_char hellomult;
paul718e3742002-12-13 20:15:29 +00004976 struct in_addr addr;
4977 int ret;
4978 struct ospf_if_params *params;
4979 struct ospf_interface *oi;
4980 struct route_node *rn;
4981
4982 params = IF_DEF_PARAMS (ifp);
paulf9ad9372005-10-21 00:45:17 +00004983
4984 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004985 {
paulf9ad9372005-10-21 00:45:17 +00004986 ret = inet_aton(nbr_str, &addr);
paul718e3742002-12-13 20:15:29 +00004987 if (!ret)
4988 {
4989 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4990 VTY_NEWLINE);
4991 return CMD_WARNING;
4992 }
4993
4994 params = ospf_get_if_params (ifp, addr);
4995 ospf_if_update_params (ifp, addr);
4996 }
4997
paulf9ad9372005-10-21 00:45:17 +00004998 if (interval_str)
4999 {
5000 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
5001 1, 65535);
5002
5003 /* reset fast_hello too, just to be sure */
5004 UNSET_IF_PARAM (params, fast_hello);
5005 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5006 }
5007 else if (fast_hello_str)
5008 {
5009 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
5010 1, 10);
5011 /* 1s dead-interval with sub-second hellos desired */
5012 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
5013 SET_IF_PARAM (params, fast_hello);
5014 params->fast_hello = hellomult;
5015 }
5016 else
5017 {
5018 vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
5019 VTY_NEWLINE);
5020 return CMD_WARNING;
5021 }
5022
paul718e3742002-12-13 20:15:29 +00005023 SET_IF_PARAM (params, v_wait);
5024 params->v_wait = seconds;
5025
5026 /* Update timer values in neighbor structure. */
paulf9ad9372005-10-21 00:45:17 +00005027 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00005028 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005029 struct ospf *ospf;
5030 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005031 {
5032 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5033 if (oi)
5034 ospf_nbr_timer_update (oi);
5035 }
paul718e3742002-12-13 20:15:29 +00005036 }
5037 else
5038 {
5039 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5040 if ((oi = rn->info))
5041 ospf_nbr_timer_update (oi);
5042 }
5043
5044 return CMD_SUCCESS;
5045}
5046
paulf9ad9372005-10-21 00:45:17 +00005047
5048DEFUN (ip_ospf_dead_interval,
5049 ip_ospf_dead_interval_addr_cmd,
5050 "ip ospf dead-interval <1-65535> A.B.C.D",
5051 "IP Information\n"
5052 "OSPF interface commands\n"
5053 "Interval after which a neighbor is declared dead\n"
5054 "Seconds\n"
5055 "Address of interface\n")
5056{
5057 if (argc == 2)
5058 return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
5059 else
5060 return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
5061}
5062
paul718e3742002-12-13 20:15:29 +00005063ALIAS (ip_ospf_dead_interval,
5064 ip_ospf_dead_interval_cmd,
5065 "ip ospf dead-interval <1-65535>",
5066 "IP Information\n"
5067 "OSPF interface commands\n"
5068 "Interval after which a neighbor is declared dead\n"
5069 "Seconds\n")
5070
5071ALIAS (ip_ospf_dead_interval,
5072 ospf_dead_interval_cmd,
5073 "ospf dead-interval <1-65535>",
5074 "OSPF interface commands\n"
5075 "Interval after which a neighbor is declared dead\n"
5076 "Seconds\n")
5077
paulf9ad9372005-10-21 00:45:17 +00005078DEFUN (ip_ospf_dead_interval_minimal,
5079 ip_ospf_dead_interval_minimal_addr_cmd,
5080 "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5081 "IP Information\n"
5082 "OSPF interface commands\n"
5083 "Interval after which a neighbor is declared dead\n"
5084 "Minimal 1s dead-interval with fast sub-second hellos\n"
5085 "Hello multiplier factor\n"
5086 "Number of Hellos to send each second\n"
5087 "Address of interface\n")
5088{
5089 if (argc == 2)
5090 return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5091 else
5092 return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5093}
5094
5095ALIAS (ip_ospf_dead_interval_minimal,
5096 ip_ospf_dead_interval_minimal_cmd,
5097 "ip ospf dead-interval minimal hello-multiplier <1-10>",
5098 "IP Information\n"
5099 "OSPF interface commands\n"
5100 "Interval after which a neighbor is declared dead\n"
5101 "Minimal 1s dead-interval with fast sub-second hellos\n"
5102 "Hello multiplier factor\n"
5103 "Number of Hellos to send each second\n")
5104
paul718e3742002-12-13 20:15:29 +00005105DEFUN (no_ip_ospf_dead_interval,
5106 no_ip_ospf_dead_interval_addr_cmd,
5107 "no ip ospf dead-interval A.B.C.D",
5108 NO_STR
5109 "IP Information\n"
5110 "OSPF interface commands\n"
5111 "Interval after which a neighbor is declared dead\n"
5112 "Address of interface")
5113{
5114 struct interface *ifp = vty->index;
5115 struct in_addr addr;
5116 int ret;
5117 struct ospf_if_params *params;
5118 struct ospf_interface *oi;
5119 struct route_node *rn;
paul020709f2003-04-04 02:44:16 +00005120
paul718e3742002-12-13 20:15:29 +00005121 ifp = vty->index;
5122 params = IF_DEF_PARAMS (ifp);
5123
5124 if (argc == 1)
5125 {
5126 ret = inet_aton(argv[0], &addr);
5127 if (!ret)
5128 {
5129 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5130 VTY_NEWLINE);
5131 return CMD_WARNING;
5132 }
5133
5134 params = ospf_lookup_if_params (ifp, addr);
5135 if (params == NULL)
5136 return CMD_SUCCESS;
5137 }
5138
5139 UNSET_IF_PARAM (params, v_wait);
5140 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
paulf9ad9372005-10-21 00:45:17 +00005141
5142 UNSET_IF_PARAM (params, fast_hello);
5143 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5144
paul718e3742002-12-13 20:15:29 +00005145 if (params != IF_DEF_PARAMS (ifp))
5146 {
5147 ospf_free_if_params (ifp, addr);
5148 ospf_if_update_params (ifp, addr);
5149 }
5150
5151 /* Update timer values in neighbor structure. */
5152 if (argc == 1)
5153 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005154 struct ospf *ospf;
5155
5156 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005157 {
5158 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5159 if (oi)
5160 ospf_nbr_timer_update (oi);
5161 }
paul718e3742002-12-13 20:15:29 +00005162 }
5163 else
5164 {
5165 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5166 if ((oi = rn->info))
5167 ospf_nbr_timer_update (oi);
5168 }
5169
5170 return CMD_SUCCESS;
5171}
5172
5173ALIAS (no_ip_ospf_dead_interval,
5174 no_ip_ospf_dead_interval_cmd,
5175 "no ip ospf dead-interval",
5176 NO_STR
5177 "IP Information\n"
5178 "OSPF interface commands\n"
5179 "Interval after which a neighbor is declared dead\n")
5180
5181ALIAS (no_ip_ospf_dead_interval,
5182 no_ospf_dead_interval_cmd,
5183 "no ospf dead-interval",
5184 NO_STR
5185 "OSPF interface commands\n"
5186 "Interval after which a neighbor is declared dead\n")
5187
5188DEFUN (ip_ospf_hello_interval,
5189 ip_ospf_hello_interval_addr_cmd,
5190 "ip ospf hello-interval <1-65535> A.B.C.D",
5191 "IP Information\n"
5192 "OSPF interface commands\n"
5193 "Time between HELLO packets\n"
5194 "Seconds\n"
5195 "Address of interface")
5196{
5197 struct interface *ifp = vty->index;
5198 u_int32_t seconds;
5199 struct in_addr addr;
5200 int ret;
5201 struct ospf_if_params *params;
5202
5203 params = IF_DEF_PARAMS (ifp);
5204
5205 seconds = strtol (argv[0], NULL, 10);
5206
5207 /* HelloInterval range is <1-65535>. */
5208 if (seconds < 1 || seconds > 65535)
5209 {
5210 vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5211 return CMD_WARNING;
5212 }
5213
5214 if (argc == 2)
5215 {
5216 ret = inet_aton(argv[1], &addr);
5217 if (!ret)
5218 {
5219 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5220 VTY_NEWLINE);
5221 return CMD_WARNING;
5222 }
5223
5224 params = ospf_get_if_params (ifp, addr);
5225 ospf_if_update_params (ifp, addr);
5226 }
5227
paulf9ad9372005-10-21 00:45:17 +00005228 SET_IF_PARAM (params, v_hello);
paul718e3742002-12-13 20:15:29 +00005229 params->v_hello = seconds;
5230
5231 return CMD_SUCCESS;
5232}
5233
5234ALIAS (ip_ospf_hello_interval,
5235 ip_ospf_hello_interval_cmd,
5236 "ip ospf hello-interval <1-65535>",
5237 "IP Information\n"
5238 "OSPF interface commands\n"
5239 "Time between HELLO packets\n"
5240 "Seconds\n")
5241
5242ALIAS (ip_ospf_hello_interval,
5243 ospf_hello_interval_cmd,
5244 "ospf hello-interval <1-65535>",
5245 "OSPF interface commands\n"
5246 "Time between HELLO packets\n"
5247 "Seconds\n")
5248
5249DEFUN (no_ip_ospf_hello_interval,
5250 no_ip_ospf_hello_interval_addr_cmd,
5251 "no ip ospf hello-interval A.B.C.D",
5252 NO_STR
5253 "IP Information\n"
5254 "OSPF interface commands\n"
5255 "Time between HELLO packets\n"
5256 "Address of interface")
5257{
5258 struct interface *ifp = vty->index;
5259 struct in_addr addr;
5260 int ret;
5261 struct ospf_if_params *params;
5262
5263 ifp = vty->index;
5264 params = IF_DEF_PARAMS (ifp);
5265
5266 if (argc == 1)
5267 {
5268 ret = inet_aton(argv[0], &addr);
5269 if (!ret)
5270 {
5271 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5272 VTY_NEWLINE);
5273 return CMD_WARNING;
5274 }
5275
5276 params = ospf_lookup_if_params (ifp, addr);
5277 if (params == NULL)
5278 return CMD_SUCCESS;
5279 }
5280
5281 UNSET_IF_PARAM (params, v_hello);
paulf9ad9372005-10-21 00:45:17 +00005282 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00005283
5284 if (params != IF_DEF_PARAMS (ifp))
5285 {
5286 ospf_free_if_params (ifp, addr);
5287 ospf_if_update_params (ifp, addr);
5288 }
5289
5290 return CMD_SUCCESS;
5291}
5292
5293ALIAS (no_ip_ospf_hello_interval,
5294 no_ip_ospf_hello_interval_cmd,
5295 "no ip ospf hello-interval",
5296 NO_STR
5297 "IP Information\n"
5298 "OSPF interface commands\n"
5299 "Time between HELLO packets\n")
5300
5301ALIAS (no_ip_ospf_hello_interval,
5302 no_ospf_hello_interval_cmd,
5303 "no ospf hello-interval",
5304 NO_STR
5305 "OSPF interface commands\n"
5306 "Time between HELLO packets\n")
5307
5308DEFUN (ip_ospf_network,
5309 ip_ospf_network_cmd,
5310 "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5311 "IP Information\n"
5312 "OSPF interface commands\n"
5313 "Network type\n"
5314 "Specify OSPF broadcast multi-access network\n"
5315 "Specify OSPF NBMA network\n"
5316 "Specify OSPF point-to-multipoint network\n"
5317 "Specify OSPF point-to-point network\n")
5318{
5319 struct interface *ifp = vty->index;
5320 int old_type = IF_DEF_PARAMS (ifp)->type;
5321 struct route_node *rn;
5322
5323 if (strncmp (argv[0], "b", 1) == 0)
5324 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5325 else if (strncmp (argv[0], "n", 1) == 0)
5326 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5327 else if (strncmp (argv[0], "point-to-m", 10) == 0)
5328 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5329 else if (strncmp (argv[0], "point-to-p", 10) == 0)
5330 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5331
5332 if (IF_DEF_PARAMS (ifp)->type == old_type)
5333 return CMD_SUCCESS;
5334
5335 SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5336
5337 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5338 {
5339 struct ospf_interface *oi = rn->info;
5340
5341 if (!oi)
5342 continue;
5343
5344 oi->type = IF_DEF_PARAMS (ifp)->type;
5345
5346 if (oi->state > ISM_Down)
5347 {
5348 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5349 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5350 }
5351 }
5352
5353 return CMD_SUCCESS;
5354}
5355
5356ALIAS (ip_ospf_network,
5357 ospf_network_cmd,
5358 "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5359 "OSPF interface commands\n"
5360 "Network type\n"
5361 "Specify OSPF broadcast multi-access network\n"
5362 "Specify OSPF NBMA network\n"
5363 "Specify OSPF point-to-multipoint network\n"
5364 "Specify OSPF point-to-point network\n")
5365
5366DEFUN (no_ip_ospf_network,
5367 no_ip_ospf_network_cmd,
5368 "no ip ospf network",
5369 NO_STR
5370 "IP Information\n"
5371 "OSPF interface commands\n"
5372 "Network type\n")
5373{
5374 struct interface *ifp = vty->index;
5375 int old_type = IF_DEF_PARAMS (ifp)->type;
5376 struct route_node *rn;
5377
ajsbc18d612004-12-15 15:07:19 +00005378 IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
paul718e3742002-12-13 20:15:29 +00005379
5380 if (IF_DEF_PARAMS (ifp)->type == old_type)
5381 return CMD_SUCCESS;
5382
5383 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5384 {
5385 struct ospf_interface *oi = rn->info;
5386
5387 if (!oi)
5388 continue;
5389
5390 oi->type = IF_DEF_PARAMS (ifp)->type;
5391
5392 if (oi->state > ISM_Down)
5393 {
5394 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5395 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5396 }
5397 }
5398
5399 return CMD_SUCCESS;
5400}
5401
5402ALIAS (no_ip_ospf_network,
5403 no_ospf_network_cmd,
5404 "no ospf network",
5405 NO_STR
5406 "OSPF interface commands\n"
5407 "Network type\n")
5408
5409DEFUN (ip_ospf_priority,
5410 ip_ospf_priority_addr_cmd,
5411 "ip ospf priority <0-255> A.B.C.D",
5412 "IP Information\n"
5413 "OSPF interface commands\n"
5414 "Router priority\n"
5415 "Priority\n"
5416 "Address of interface")
5417{
5418 struct interface *ifp = vty->index;
5419 u_int32_t priority;
5420 struct route_node *rn;
5421 struct in_addr addr;
5422 int ret;
5423 struct ospf_if_params *params;
5424
5425 params = IF_DEF_PARAMS (ifp);
5426
5427 priority = strtol (argv[0], NULL, 10);
5428
5429 /* Router Priority range is <0-255>. */
5430 if (priority < 0 || priority > 255)
5431 {
5432 vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5433 return CMD_WARNING;
5434 }
5435
5436 if (argc == 2)
5437 {
5438 ret = inet_aton(argv[1], &addr);
5439 if (!ret)
5440 {
5441 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5442 VTY_NEWLINE);
5443 return CMD_WARNING;
5444 }
5445
5446 params = ospf_get_if_params (ifp, addr);
5447 ospf_if_update_params (ifp, addr);
5448 }
5449
5450 SET_IF_PARAM (params, priority);
5451 params->priority = priority;
5452
5453 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5454 {
5455 struct ospf_interface *oi = rn->info;
5456
5457 if (!oi)
5458 continue;
5459
5460
5461 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5462 {
5463 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5464 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5465 }
5466 }
5467
5468 return CMD_SUCCESS;
5469}
5470
5471ALIAS (ip_ospf_priority,
5472 ip_ospf_priority_cmd,
5473 "ip ospf priority <0-255>",
5474 "IP Information\n"
5475 "OSPF interface commands\n"
5476 "Router priority\n"
5477 "Priority\n")
5478
5479ALIAS (ip_ospf_priority,
5480 ospf_priority_cmd,
5481 "ospf priority <0-255>",
5482 "OSPF interface commands\n"
5483 "Router priority\n"
5484 "Priority\n")
5485
5486DEFUN (no_ip_ospf_priority,
5487 no_ip_ospf_priority_addr_cmd,
5488 "no ip ospf priority A.B.C.D",
5489 NO_STR
5490 "IP Information\n"
5491 "OSPF interface commands\n"
5492 "Router priority\n"
5493 "Address of interface")
5494{
5495 struct interface *ifp = vty->index;
5496 struct route_node *rn;
5497 struct in_addr addr;
5498 int ret;
5499 struct ospf_if_params *params;
5500
5501 ifp = vty->index;
5502 params = IF_DEF_PARAMS (ifp);
5503
5504 if (argc == 1)
5505 {
5506 ret = inet_aton(argv[0], &addr);
5507 if (!ret)
5508 {
5509 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5510 VTY_NEWLINE);
5511 return CMD_WARNING;
5512 }
5513
5514 params = ospf_lookup_if_params (ifp, addr);
5515 if (params == NULL)
5516 return CMD_SUCCESS;
5517 }
5518
5519 UNSET_IF_PARAM (params, priority);
5520 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5521
5522 if (params != IF_DEF_PARAMS (ifp))
5523 {
5524 ospf_free_if_params (ifp, addr);
5525 ospf_if_update_params (ifp, addr);
5526 }
5527
5528 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5529 {
5530 struct ospf_interface *oi = rn->info;
5531
5532 if (!oi)
5533 continue;
5534
5535
5536 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5537 {
5538 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5539 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5540 }
5541 }
5542
5543 return CMD_SUCCESS;
5544}
5545
5546ALIAS (no_ip_ospf_priority,
5547 no_ip_ospf_priority_cmd,
5548 "no ip ospf priority",
5549 NO_STR
5550 "IP Information\n"
5551 "OSPF interface commands\n"
5552 "Router priority\n")
5553
5554ALIAS (no_ip_ospf_priority,
5555 no_ospf_priority_cmd,
5556 "no ospf priority",
5557 NO_STR
5558 "OSPF interface commands\n"
5559 "Router priority\n")
5560
5561DEFUN (ip_ospf_retransmit_interval,
5562 ip_ospf_retransmit_interval_addr_cmd,
5563 "ip ospf retransmit-interval <3-65535> A.B.C.D",
5564 "IP Information\n"
5565 "OSPF interface commands\n"
5566 "Time between retransmitting lost link state advertisements\n"
5567 "Seconds\n"
5568 "Address of interface")
5569{
5570 struct interface *ifp = vty->index;
5571 u_int32_t seconds;
5572 struct in_addr addr;
5573 int ret;
5574 struct ospf_if_params *params;
5575
5576 params = IF_DEF_PARAMS (ifp);
5577 seconds = strtol (argv[0], NULL, 10);
5578
5579 /* Retransmit Interval range is <3-65535>. */
5580 if (seconds < 3 || seconds > 65535)
5581 {
5582 vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5583 return CMD_WARNING;
5584 }
5585
5586
5587 if (argc == 2)
5588 {
5589 ret = inet_aton(argv[1], &addr);
5590 if (!ret)
5591 {
5592 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5593 VTY_NEWLINE);
5594 return CMD_WARNING;
5595 }
5596
5597 params = ospf_get_if_params (ifp, addr);
5598 ospf_if_update_params (ifp, addr);
5599 }
5600
5601 SET_IF_PARAM (params, retransmit_interval);
5602 params->retransmit_interval = seconds;
5603
5604 return CMD_SUCCESS;
5605}
5606
5607ALIAS (ip_ospf_retransmit_interval,
5608 ip_ospf_retransmit_interval_cmd,
5609 "ip ospf retransmit-interval <3-65535>",
5610 "IP Information\n"
5611 "OSPF interface commands\n"
5612 "Time between retransmitting lost link state advertisements\n"
5613 "Seconds\n")
5614
5615ALIAS (ip_ospf_retransmit_interval,
5616 ospf_retransmit_interval_cmd,
5617 "ospf retransmit-interval <3-65535>",
5618 "OSPF interface commands\n"
5619 "Time between retransmitting lost link state advertisements\n"
5620 "Seconds\n")
5621
5622DEFUN (no_ip_ospf_retransmit_interval,
5623 no_ip_ospf_retransmit_interval_addr_cmd,
5624 "no ip ospf retransmit-interval A.B.C.D",
5625 NO_STR
5626 "IP Information\n"
5627 "OSPF interface commands\n"
5628 "Time between retransmitting lost link state advertisements\n"
5629 "Address of interface")
5630{
5631 struct interface *ifp = vty->index;
5632 struct in_addr addr;
5633 int ret;
5634 struct ospf_if_params *params;
5635
5636 ifp = vty->index;
5637 params = IF_DEF_PARAMS (ifp);
5638
5639 if (argc == 1)
5640 {
5641 ret = inet_aton(argv[0], &addr);
5642 if (!ret)
5643 {
5644 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5645 VTY_NEWLINE);
5646 return CMD_WARNING;
5647 }
5648
5649 params = ospf_lookup_if_params (ifp, addr);
5650 if (params == NULL)
5651 return CMD_SUCCESS;
5652 }
5653
5654 UNSET_IF_PARAM (params, retransmit_interval);
5655 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5656
5657 if (params != IF_DEF_PARAMS (ifp))
5658 {
5659 ospf_free_if_params (ifp, addr);
5660 ospf_if_update_params (ifp, addr);
5661 }
5662
5663 return CMD_SUCCESS;
5664}
5665
5666ALIAS (no_ip_ospf_retransmit_interval,
5667 no_ip_ospf_retransmit_interval_cmd,
5668 "no ip ospf retransmit-interval",
5669 NO_STR
5670 "IP Information\n"
5671 "OSPF interface commands\n"
5672 "Time between retransmitting lost link state advertisements\n")
5673
5674ALIAS (no_ip_ospf_retransmit_interval,
5675 no_ospf_retransmit_interval_cmd,
5676 "no ospf retransmit-interval",
5677 NO_STR
5678 "OSPF interface commands\n"
5679 "Time between retransmitting lost link state advertisements\n")
5680
5681DEFUN (ip_ospf_transmit_delay,
5682 ip_ospf_transmit_delay_addr_cmd,
5683 "ip ospf transmit-delay <1-65535> A.B.C.D",
5684 "IP Information\n"
5685 "OSPF interface commands\n"
5686 "Link state transmit delay\n"
5687 "Seconds\n"
5688 "Address of interface")
5689{
5690 struct interface *ifp = vty->index;
5691 u_int32_t seconds;
5692 struct in_addr addr;
5693 int ret;
5694 struct ospf_if_params *params;
5695
5696 params = IF_DEF_PARAMS (ifp);
5697 seconds = strtol (argv[0], NULL, 10);
5698
5699 /* Transmit Delay range is <1-65535>. */
5700 if (seconds < 1 || seconds > 65535)
5701 {
5702 vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5703 return CMD_WARNING;
5704 }
5705
5706 if (argc == 2)
5707 {
5708 ret = inet_aton(argv[1], &addr);
5709 if (!ret)
5710 {
5711 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5712 VTY_NEWLINE);
5713 return CMD_WARNING;
5714 }
5715
5716 params = ospf_get_if_params (ifp, addr);
5717 ospf_if_update_params (ifp, addr);
5718 }
5719
5720 SET_IF_PARAM (params, transmit_delay);
5721 params->transmit_delay = seconds;
5722
5723 return CMD_SUCCESS;
5724}
5725
5726ALIAS (ip_ospf_transmit_delay,
5727 ip_ospf_transmit_delay_cmd,
5728 "ip ospf transmit-delay <1-65535>",
5729 "IP Information\n"
5730 "OSPF interface commands\n"
5731 "Link state transmit delay\n"
5732 "Seconds\n")
5733
5734ALIAS (ip_ospf_transmit_delay,
5735 ospf_transmit_delay_cmd,
5736 "ospf transmit-delay <1-65535>",
5737 "OSPF interface commands\n"
5738 "Link state transmit delay\n"
5739 "Seconds\n")
5740
5741DEFUN (no_ip_ospf_transmit_delay,
5742 no_ip_ospf_transmit_delay_addr_cmd,
5743 "no ip ospf transmit-delay A.B.C.D",
5744 NO_STR
5745 "IP Information\n"
5746 "OSPF interface commands\n"
5747 "Link state transmit delay\n"
5748 "Address of interface")
5749{
5750 struct interface *ifp = vty->index;
5751 struct in_addr addr;
5752 int ret;
5753 struct ospf_if_params *params;
5754
5755 ifp = vty->index;
5756 params = IF_DEF_PARAMS (ifp);
5757
5758 if (argc == 1)
5759 {
5760 ret = inet_aton(argv[0], &addr);
5761 if (!ret)
5762 {
5763 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5764 VTY_NEWLINE);
5765 return CMD_WARNING;
5766 }
5767
5768 params = ospf_lookup_if_params (ifp, addr);
5769 if (params == NULL)
5770 return CMD_SUCCESS;
5771 }
5772
5773 UNSET_IF_PARAM (params, transmit_delay);
5774 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5775
5776 if (params != IF_DEF_PARAMS (ifp))
5777 {
5778 ospf_free_if_params (ifp, addr);
5779 ospf_if_update_params (ifp, addr);
5780 }
5781
5782 return CMD_SUCCESS;
5783}
5784
5785ALIAS (no_ip_ospf_transmit_delay,
5786 no_ip_ospf_transmit_delay_cmd,
5787 "no ip ospf transmit-delay",
5788 NO_STR
5789 "IP Information\n"
5790 "OSPF interface commands\n"
5791 "Link state transmit delay\n")
5792
5793ALIAS (no_ip_ospf_transmit_delay,
5794 no_ospf_transmit_delay_cmd,
5795 "no ospf transmit-delay",
5796 NO_STR
5797 "OSPF interface commands\n"
5798 "Link state transmit delay\n")
5799
5800
5801DEFUN (ospf_redistribute_source_metric_type,
5802 ospf_redistribute_source_metric_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005803 "redistribute " QUAGGA_REDIST_STR_OSPFD
5804 " metric <0-16777214> metric-type (1|2) route-map WORD",
5805 REDIST_STR
5806 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005807 "Metric for redistributed routes\n"
5808 "OSPF default metric\n"
5809 "OSPF exterior metric type for redistributed routes\n"
5810 "Set OSPF External Type 1 metrics\n"
5811 "Set OSPF External Type 2 metrics\n"
5812 "Route map reference\n"
5813 "Pointer to route-map entries\n")
5814{
paul020709f2003-04-04 02:44:16 +00005815 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005816 int source;
5817 int type = -1;
5818 int metric = -1;
5819
5820 /* Get distribute source. */
5821 if (!str2distribute_source (argv[0], &source))
5822 return CMD_WARNING;
5823
5824 /* Get metric value. */
5825 if (argc >= 2)
5826 if (!str2metric (argv[1], &metric))
5827 return CMD_WARNING;
5828
5829 /* Get metric type. */
5830 if (argc >= 3)
5831 if (!str2metric_type (argv[2], &type))
5832 return CMD_WARNING;
5833
5834 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005835 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005836 else
paul020709f2003-04-04 02:44:16 +00005837 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005838
paul020709f2003-04-04 02:44:16 +00005839 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005840}
5841
5842ALIAS (ospf_redistribute_source_metric_type,
5843 ospf_redistribute_source_metric_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005844 "redistribute " QUAGGA_REDIST_STR_OSPFD
5845 " metric <0-16777214> metric-type (1|2)",
5846 REDIST_STR
5847 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005848 "Metric for redistributed routes\n"
5849 "OSPF default metric\n"
5850 "OSPF exterior metric type for redistributed routes\n"
5851 "Set OSPF External Type 1 metrics\n"
5852 "Set OSPF External Type 2 metrics\n")
5853
5854ALIAS (ospf_redistribute_source_metric_type,
5855 ospf_redistribute_source_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005856 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
5857 REDIST_STR
5858 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005859 "Metric for redistributed routes\n"
5860 "OSPF default metric\n")
5861
5862DEFUN (ospf_redistribute_source_type_metric,
5863 ospf_redistribute_source_type_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005864 "redistribute " QUAGGA_REDIST_STR_OSPFD
5865 " metric-type (1|2) metric <0-16777214> route-map WORD",
5866 REDIST_STR
5867 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005868 "OSPF exterior metric type for redistributed routes\n"
5869 "Set OSPF External Type 1 metrics\n"
5870 "Set OSPF External Type 2 metrics\n"
5871 "Metric for redistributed routes\n"
5872 "OSPF default metric\n"
5873 "Route map reference\n"
5874 "Pointer to route-map entries\n")
5875{
paul020709f2003-04-04 02:44:16 +00005876 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005877 int source;
5878 int type = -1;
5879 int metric = -1;
5880
5881 /* Get distribute source. */
5882 if (!str2distribute_source (argv[0], &source))
5883 return CMD_WARNING;
5884
5885 /* Get metric value. */
5886 if (argc >= 2)
5887 if (!str2metric_type (argv[1], &type))
5888 return CMD_WARNING;
5889
5890 /* Get metric type. */
5891 if (argc >= 3)
5892 if (!str2metric (argv[2], &metric))
5893 return CMD_WARNING;
5894
5895 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005896 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005897 else
paul020709f2003-04-04 02:44:16 +00005898 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005899
paul020709f2003-04-04 02:44:16 +00005900 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005901}
5902
5903ALIAS (ospf_redistribute_source_type_metric,
5904 ospf_redistribute_source_type_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005905 "redistribute " QUAGGA_REDIST_STR_OSPFD
5906 " metric-type (1|2) metric <0-16777214>",
5907 REDIST_STR
5908 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005909 "OSPF exterior metric type for redistributed routes\n"
5910 "Set OSPF External Type 1 metrics\n"
5911 "Set OSPF External Type 2 metrics\n"
5912 "Metric for redistributed routes\n"
5913 "OSPF default metric\n")
5914
5915ALIAS (ospf_redistribute_source_type_metric,
5916 ospf_redistribute_source_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005917 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
5918 REDIST_STR
5919 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005920 "OSPF exterior metric type for redistributed routes\n"
5921 "Set OSPF External Type 1 metrics\n"
5922 "Set OSPF External Type 2 metrics\n")
5923
5924ALIAS (ospf_redistribute_source_type_metric,
5925 ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005926 "redistribute " QUAGGA_REDIST_STR_OSPFD,
5927 REDIST_STR
5928 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005929
5930DEFUN (ospf_redistribute_source_metric_routemap,
5931 ospf_redistribute_source_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005932 "redistribute " QUAGGA_REDIST_STR_OSPFD
5933 " metric <0-16777214> route-map WORD",
5934 REDIST_STR
5935 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005936 "Metric for redistributed routes\n"
5937 "OSPF default metric\n"
5938 "Route map reference\n"
5939 "Pointer to route-map entries\n")
5940{
paul020709f2003-04-04 02:44:16 +00005941 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005942 int source;
5943 int metric = -1;
5944
5945 /* Get distribute source. */
5946 if (!str2distribute_source (argv[0], &source))
5947 return CMD_WARNING;
5948
5949 /* Get metric value. */
5950 if (argc >= 2)
5951 if (!str2metric (argv[1], &metric))
5952 return CMD_WARNING;
5953
5954 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005955 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005956 else
paul020709f2003-04-04 02:44:16 +00005957 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005958
paul020709f2003-04-04 02:44:16 +00005959 return ospf_redistribute_set (ospf, source, -1, metric);
paul718e3742002-12-13 20:15:29 +00005960}
5961
5962DEFUN (ospf_redistribute_source_type_routemap,
5963 ospf_redistribute_source_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005964 "redistribute " QUAGGA_REDIST_STR_OSPFD
5965 " metric-type (1|2) route-map WORD",
5966 REDIST_STR
5967 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005968 "OSPF exterior metric type for redistributed routes\n"
5969 "Set OSPF External Type 1 metrics\n"
5970 "Set OSPF External Type 2 metrics\n"
5971 "Route map reference\n"
5972 "Pointer to route-map entries\n")
5973{
paul020709f2003-04-04 02:44:16 +00005974 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005975 int source;
5976 int type = -1;
5977
5978 /* Get distribute source. */
5979 if (!str2distribute_source (argv[0], &source))
5980 return CMD_WARNING;
5981
5982 /* Get metric value. */
5983 if (argc >= 2)
5984 if (!str2metric_type (argv[1], &type))
5985 return CMD_WARNING;
5986
5987 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005988 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005989 else
paul020709f2003-04-04 02:44:16 +00005990 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005991
paul020709f2003-04-04 02:44:16 +00005992 return ospf_redistribute_set (ospf, source, type, -1);
paul718e3742002-12-13 20:15:29 +00005993}
5994
5995DEFUN (ospf_redistribute_source_routemap,
5996 ospf_redistribute_source_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005997 "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
5998 REDIST_STR
5999 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00006000 "Route map reference\n"
6001 "Pointer to route-map entries\n")
6002{
paul020709f2003-04-04 02:44:16 +00006003 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006004 int source;
6005
6006 /* Get distribute source. */
6007 if (!str2distribute_source (argv[0], &source))
6008 return CMD_WARNING;
6009
6010 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006011 ospf_routemap_set (ospf, source, argv[1]);
paul718e3742002-12-13 20:15:29 +00006012 else
paul020709f2003-04-04 02:44:16 +00006013 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00006014
paul020709f2003-04-04 02:44:16 +00006015 return ospf_redistribute_set (ospf, source, -1, -1);
paul718e3742002-12-13 20:15:29 +00006016}
6017
6018DEFUN (no_ospf_redistribute_source,
6019 no_ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006020 "no redistribute " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006021 NO_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006022 REDIST_STR
6023 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006024{
paul020709f2003-04-04 02:44:16 +00006025 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006026 int source;
6027
6028 if (!str2distribute_source (argv[0], &source))
6029 return CMD_WARNING;
6030
paul020709f2003-04-04 02:44:16 +00006031 ospf_routemap_unset (ospf, source);
6032 return ospf_redistribute_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00006033}
6034
6035DEFUN (ospf_distribute_list_out,
6036 ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006037 "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006038 "Filter networks in routing updates\n"
6039 "Access-list name\n"
6040 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006041 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006042{
paul68980082003-03-25 05:07:42 +00006043 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006044 int source;
6045
6046 /* Get distribute source. */
6047 if (!str2distribute_source (argv[1], &source))
6048 return CMD_WARNING;
6049
paul68980082003-03-25 05:07:42 +00006050 return ospf_distribute_list_out_set (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00006051}
6052
6053DEFUN (no_ospf_distribute_list_out,
6054 no_ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006055 "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006056 NO_STR
6057 "Filter networks in routing updates\n"
6058 "Access-list name\n"
6059 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006060 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006061{
paul68980082003-03-25 05:07:42 +00006062 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006063 int source;
6064
6065 if (!str2distribute_source (argv[1], &source))
6066 return CMD_WARNING;
6067
paul68980082003-03-25 05:07:42 +00006068 return ospf_distribute_list_out_unset (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00006069}
6070
6071/* Default information originate. */
6072DEFUN (ospf_default_information_originate_metric_type_routemap,
6073 ospf_default_information_originate_metric_type_routemap_cmd,
6074 "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
6075 "Control distribution of default information\n"
6076 "Distribute a default route\n"
6077 "OSPF default metric\n"
6078 "OSPF metric\n"
6079 "OSPF metric type for default routes\n"
6080 "Set OSPF External Type 1 metrics\n"
6081 "Set OSPF External Type 2 metrics\n"
6082 "Route map reference\n"
6083 "Pointer to route-map entries\n")
6084{
paul020709f2003-04-04 02:44:16 +00006085 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006086 int type = -1;
6087 int metric = -1;
6088
6089 /* Get metric value. */
6090 if (argc >= 1)
6091 if (!str2metric (argv[0], &metric))
6092 return CMD_WARNING;
6093
6094 /* Get metric type. */
6095 if (argc >= 2)
6096 if (!str2metric_type (argv[1], &type))
6097 return CMD_WARNING;
6098
6099 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006100 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006101 else
paul020709f2003-04-04 02:44:16 +00006102 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006103
paul020709f2003-04-04 02:44:16 +00006104 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6105 type, metric);
paul718e3742002-12-13 20:15:29 +00006106}
6107
6108ALIAS (ospf_default_information_originate_metric_type_routemap,
6109 ospf_default_information_originate_metric_type_cmd,
6110 "default-information originate metric <0-16777214> metric-type (1|2)",
6111 "Control distribution of default information\n"
6112 "Distribute a default route\n"
6113 "OSPF default metric\n"
6114 "OSPF metric\n"
6115 "OSPF metric type for default routes\n"
6116 "Set OSPF External Type 1 metrics\n"
6117 "Set OSPF External Type 2 metrics\n")
6118
6119ALIAS (ospf_default_information_originate_metric_type_routemap,
6120 ospf_default_information_originate_metric_cmd,
6121 "default-information originate metric <0-16777214>",
6122 "Control distribution of default information\n"
6123 "Distribute a default route\n"
6124 "OSPF default metric\n"
6125 "OSPF metric\n")
6126
6127ALIAS (ospf_default_information_originate_metric_type_routemap,
6128 ospf_default_information_originate_cmd,
6129 "default-information originate",
6130 "Control distribution of default information\n"
6131 "Distribute a default route\n")
6132
6133/* Default information originate. */
6134DEFUN (ospf_default_information_originate_metric_routemap,
6135 ospf_default_information_originate_metric_routemap_cmd,
6136 "default-information originate metric <0-16777214> route-map WORD",
6137 "Control distribution of default information\n"
6138 "Distribute a default route\n"
6139 "OSPF default metric\n"
6140 "OSPF metric\n"
6141 "Route map reference\n"
6142 "Pointer to route-map entries\n")
6143{
paul020709f2003-04-04 02:44:16 +00006144 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006145 int metric = -1;
6146
6147 /* Get metric value. */
6148 if (argc >= 1)
6149 if (!str2metric (argv[0], &metric))
6150 return CMD_WARNING;
6151
6152 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006153 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006154 else
paul020709f2003-04-04 02:44:16 +00006155 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006156
paul020709f2003-04-04 02:44:16 +00006157 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6158 -1, metric);
paul718e3742002-12-13 20:15:29 +00006159}
6160
6161/* Default information originate. */
6162DEFUN (ospf_default_information_originate_routemap,
6163 ospf_default_information_originate_routemap_cmd,
6164 "default-information originate route-map WORD",
6165 "Control distribution of default information\n"
6166 "Distribute a default route\n"
6167 "Route map reference\n"
6168 "Pointer to route-map entries\n")
6169{
paul020709f2003-04-04 02:44:16 +00006170 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006171
paul020709f2003-04-04 02:44:16 +00006172 if (argc == 1)
6173 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6174 else
6175 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6176
6177 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
paul718e3742002-12-13 20:15:29 +00006178}
6179
6180DEFUN (ospf_default_information_originate_type_metric_routemap,
6181 ospf_default_information_originate_type_metric_routemap_cmd,
6182 "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
6183 "Control distribution of default information\n"
6184 "Distribute a default route\n"
6185 "OSPF metric type for default routes\n"
6186 "Set OSPF External Type 1 metrics\n"
6187 "Set OSPF External Type 2 metrics\n"
6188 "OSPF default metric\n"
6189 "OSPF metric\n"
6190 "Route map reference\n"
6191 "Pointer to route-map entries\n")
6192{
paul020709f2003-04-04 02:44:16 +00006193 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006194 int type = -1;
6195 int metric = -1;
6196
6197 /* Get metric type. */
6198 if (argc >= 1)
6199 if (!str2metric_type (argv[0], &type))
6200 return CMD_WARNING;
6201
6202 /* Get metric value. */
6203 if (argc >= 2)
6204 if (!str2metric (argv[1], &metric))
6205 return CMD_WARNING;
6206
6207 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006208 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006209 else
paul020709f2003-04-04 02:44:16 +00006210 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006211
paul020709f2003-04-04 02:44:16 +00006212 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6213 type, metric);
paul718e3742002-12-13 20:15:29 +00006214}
6215
6216ALIAS (ospf_default_information_originate_type_metric_routemap,
6217 ospf_default_information_originate_type_metric_cmd,
6218 "default-information originate metric-type (1|2) metric <0-16777214>",
6219 "Control distribution of default information\n"
6220 "Distribute a default route\n"
6221 "OSPF metric type for default routes\n"
6222 "Set OSPF External Type 1 metrics\n"
6223 "Set OSPF External Type 2 metrics\n"
6224 "OSPF default metric\n"
6225 "OSPF metric\n")
6226
6227ALIAS (ospf_default_information_originate_type_metric_routemap,
6228 ospf_default_information_originate_type_cmd,
6229 "default-information originate metric-type (1|2)",
6230 "Control distribution of default information\n"
6231 "Distribute a default route\n"
6232 "OSPF metric type for default routes\n"
6233 "Set OSPF External Type 1 metrics\n"
6234 "Set OSPF External Type 2 metrics\n")
6235
6236DEFUN (ospf_default_information_originate_type_routemap,
6237 ospf_default_information_originate_type_routemap_cmd,
6238 "default-information originate metric-type (1|2) route-map WORD",
6239 "Control distribution of default information\n"
6240 "Distribute a default route\n"
6241 "OSPF metric type for default routes\n"
6242 "Set OSPF External Type 1 metrics\n"
6243 "Set OSPF External Type 2 metrics\n"
6244 "Route map reference\n"
6245 "Pointer to route-map entries\n")
6246{
paul020709f2003-04-04 02:44:16 +00006247 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006248 int type = -1;
6249
6250 /* Get metric type. */
6251 if (argc >= 1)
6252 if (!str2metric_type (argv[0], &type))
6253 return CMD_WARNING;
6254
6255 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006256 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006257 else
paul020709f2003-04-04 02:44:16 +00006258 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006259
paul020709f2003-04-04 02:44:16 +00006260 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6261 type, -1);
paul718e3742002-12-13 20:15:29 +00006262}
6263
6264DEFUN (ospf_default_information_originate_always_metric_type_routemap,
6265 ospf_default_information_originate_always_metric_type_routemap_cmd,
6266 "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
6267 "Control distribution of default information\n"
6268 "Distribute a default route\n"
6269 "Always advertise default route\n"
6270 "OSPF default metric\n"
6271 "OSPF metric\n"
6272 "OSPF metric type for default routes\n"
6273 "Set OSPF External Type 1 metrics\n"
6274 "Set OSPF External Type 2 metrics\n"
6275 "Route map reference\n"
6276 "Pointer to route-map entries\n")
6277{
paul020709f2003-04-04 02:44:16 +00006278 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006279 int type = -1;
6280 int metric = -1;
6281
6282 /* Get metric value. */
6283 if (argc >= 1)
6284 if (!str2metric (argv[0], &metric))
6285 return CMD_WARNING;
6286
6287 /* Get metric type. */
6288 if (argc >= 2)
6289 if (!str2metric_type (argv[1], &type))
6290 return CMD_WARNING;
6291
6292 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006293 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006294 else
paul020709f2003-04-04 02:44:16 +00006295 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006296
paul020709f2003-04-04 02:44:16 +00006297 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006298 type, metric);
6299}
6300
6301ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6302 ospf_default_information_originate_always_metric_type_cmd,
6303 "default-information originate always metric <0-16777214> metric-type (1|2)",
6304 "Control distribution of default information\n"
6305 "Distribute a default route\n"
6306 "Always advertise default route\n"
6307 "OSPF default metric\n"
6308 "OSPF metric\n"
6309 "OSPF metric type for default routes\n"
6310 "Set OSPF External Type 1 metrics\n"
6311 "Set OSPF External Type 2 metrics\n")
6312
6313ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6314 ospf_default_information_originate_always_metric_cmd,
6315 "default-information originate always metric <0-16777214>",
6316 "Control distribution of default information\n"
6317 "Distribute a default route\n"
6318 "Always advertise default route\n"
6319 "OSPF default metric\n"
6320 "OSPF metric\n"
6321 "OSPF metric type for default routes\n")
6322
6323ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6324 ospf_default_information_originate_always_cmd,
6325 "default-information originate always",
6326 "Control distribution of default information\n"
6327 "Distribute a default route\n"
6328 "Always advertise default route\n")
6329
6330DEFUN (ospf_default_information_originate_always_metric_routemap,
6331 ospf_default_information_originate_always_metric_routemap_cmd,
6332 "default-information originate always metric <0-16777214> route-map WORD",
6333 "Control distribution of default information\n"
6334 "Distribute a default route\n"
6335 "Always advertise default route\n"
6336 "OSPF default metric\n"
6337 "OSPF metric\n"
6338 "Route map reference\n"
6339 "Pointer to route-map entries\n")
6340{
paul020709f2003-04-04 02:44:16 +00006341 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006342 int metric = -1;
6343
6344 /* Get metric value. */
6345 if (argc >= 1)
6346 if (!str2metric (argv[0], &metric))
6347 return CMD_WARNING;
6348
6349 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006350 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006351 else
paul020709f2003-04-04 02:44:16 +00006352 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006353
paul020709f2003-04-04 02:44:16 +00006354 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6355 -1, metric);
paul718e3742002-12-13 20:15:29 +00006356}
6357
6358DEFUN (ospf_default_information_originate_always_routemap,
6359 ospf_default_information_originate_always_routemap_cmd,
6360 "default-information originate always route-map WORD",
6361 "Control distribution of default information\n"
6362 "Distribute a default route\n"
6363 "Always advertise default route\n"
6364 "Route map reference\n"
6365 "Pointer to route-map entries\n")
6366{
paul020709f2003-04-04 02:44:16 +00006367 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006368
paul020709f2003-04-04 02:44:16 +00006369 if (argc == 1)
6370 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6371 else
6372 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6373
6374 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
paul718e3742002-12-13 20:15:29 +00006375}
6376
6377DEFUN (ospf_default_information_originate_always_type_metric_routemap,
6378 ospf_default_information_originate_always_type_metric_routemap_cmd,
6379 "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
6380 "Control distribution of default information\n"
6381 "Distribute a default route\n"
6382 "Always advertise default route\n"
6383 "OSPF metric type for default routes\n"
6384 "Set OSPF External Type 1 metrics\n"
6385 "Set OSPF External Type 2 metrics\n"
6386 "OSPF default metric\n"
6387 "OSPF metric\n"
6388 "Route map reference\n"
6389 "Pointer to route-map entries\n")
6390{
paul020709f2003-04-04 02:44:16 +00006391 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006392 int type = -1;
6393 int metric = -1;
6394
6395 /* Get metric type. */
6396 if (argc >= 1)
6397 if (!str2metric_type (argv[0], &type))
6398 return CMD_WARNING;
6399
6400 /* Get metric value. */
6401 if (argc >= 2)
6402 if (!str2metric (argv[1], &metric))
6403 return CMD_WARNING;
6404
6405 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006406 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006407 else
paul020709f2003-04-04 02:44:16 +00006408 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006409
paul020709f2003-04-04 02:44:16 +00006410 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006411 type, metric);
6412}
6413
6414ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6415 ospf_default_information_originate_always_type_metric_cmd,
6416 "default-information originate always metric-type (1|2) metric <0-16777214>",
6417 "Control distribution of default information\n"
6418 "Distribute a default route\n"
6419 "Always advertise default route\n"
6420 "OSPF metric type for default routes\n"
6421 "Set OSPF External Type 1 metrics\n"
6422 "Set OSPF External Type 2 metrics\n"
6423 "OSPF default metric\n"
6424 "OSPF metric\n")
6425
6426ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6427 ospf_default_information_originate_always_type_cmd,
6428 "default-information originate always metric-type (1|2)",
6429 "Control distribution of default information\n"
6430 "Distribute a default route\n"
6431 "Always advertise default route\n"
6432 "OSPF metric type for default routes\n"
6433 "Set OSPF External Type 1 metrics\n"
6434 "Set OSPF External Type 2 metrics\n")
6435
6436DEFUN (ospf_default_information_originate_always_type_routemap,
6437 ospf_default_information_originate_always_type_routemap_cmd,
6438 "default-information originate always metric-type (1|2) route-map WORD",
6439 "Control distribution of default information\n"
6440 "Distribute a default route\n"
6441 "Always advertise default route\n"
6442 "OSPF metric type for default routes\n"
6443 "Set OSPF External Type 1 metrics\n"
6444 "Set OSPF External Type 2 metrics\n"
6445 "Route map reference\n"
6446 "Pointer to route-map entries\n")
6447{
paul020709f2003-04-04 02:44:16 +00006448 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006449 int type = -1;
6450
6451 /* Get metric type. */
6452 if (argc >= 1)
6453 if (!str2metric_type (argv[0], &type))
6454 return CMD_WARNING;
6455
6456 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006457 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006458 else
paul020709f2003-04-04 02:44:16 +00006459 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006460
paul020709f2003-04-04 02:44:16 +00006461 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006462 type, -1);
6463}
6464
6465DEFUN (no_ospf_default_information_originate,
6466 no_ospf_default_information_originate_cmd,
6467 "no default-information originate",
6468 NO_STR
6469 "Control distribution of default information\n"
6470 "Distribute a default route\n")
6471{
paul68980082003-03-25 05:07:42 +00006472 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006473 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00006474
6475 p.family = AF_INET;
6476 p.prefix.s_addr = 0;
6477 p.prefixlen = 0;
6478
ajs5339cfd2005-09-19 13:28:05 +00006479 ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
paul718e3742002-12-13 20:15:29 +00006480
6481 if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6482 ospf_external_info_delete (DEFAULT_ROUTE, p);
6483 route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6484 EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6485 }
6486
paul020709f2003-04-04 02:44:16 +00006487 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6488 return ospf_redistribute_default_unset (ospf);
paul718e3742002-12-13 20:15:29 +00006489}
6490
6491DEFUN (ospf_default_metric,
6492 ospf_default_metric_cmd,
6493 "default-metric <0-16777214>",
6494 "Set metric of redistributed routes\n"
6495 "Default metric\n")
6496{
paul68980082003-03-25 05:07:42 +00006497 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006498 int metric = -1;
6499
6500 if (!str2metric (argv[0], &metric))
6501 return CMD_WARNING;
6502
paul68980082003-03-25 05:07:42 +00006503 ospf->default_metric = metric;
paul718e3742002-12-13 20:15:29 +00006504
6505 return CMD_SUCCESS;
6506}
6507
6508DEFUN (no_ospf_default_metric,
6509 no_ospf_default_metric_cmd,
6510 "no default-metric",
6511 NO_STR
6512 "Set metric of redistributed routes\n")
6513{
paul68980082003-03-25 05:07:42 +00006514 struct ospf *ospf = vty->index;
6515
6516 ospf->default_metric = -1;
6517
paul718e3742002-12-13 20:15:29 +00006518 return CMD_SUCCESS;
6519}
6520
6521ALIAS (no_ospf_default_metric,
6522 no_ospf_default_metric_val_cmd,
6523 "no default-metric <0-16777214>",
6524 NO_STR
6525 "Set metric of redistributed routes\n"
6526 "Default metric\n")
6527
6528DEFUN (ospf_distance,
6529 ospf_distance_cmd,
6530 "distance <1-255>",
6531 "Define an administrative distance\n"
6532 "OSPF Administrative distance\n")
6533{
paul68980082003-03-25 05:07:42 +00006534 struct ospf *ospf = vty->index;
6535
6536 ospf->distance_all = atoi (argv[0]);
6537
paul718e3742002-12-13 20:15:29 +00006538 return CMD_SUCCESS;
6539}
6540
6541DEFUN (no_ospf_distance,
6542 no_ospf_distance_cmd,
6543 "no distance <1-255>",
6544 NO_STR
6545 "Define an administrative distance\n"
6546 "OSPF Administrative distance\n")
6547{
paul68980082003-03-25 05:07:42 +00006548 struct ospf *ospf = vty->index;
6549
6550 ospf->distance_all = 0;
6551
paul718e3742002-12-13 20:15:29 +00006552 return CMD_SUCCESS;
6553}
6554
6555DEFUN (no_ospf_distance_ospf,
6556 no_ospf_distance_ospf_cmd,
6557 "no distance ospf",
6558 NO_STR
6559 "Define an administrative distance\n"
6560 "OSPF Administrative distance\n"
6561 "OSPF Distance\n")
6562{
paul68980082003-03-25 05:07:42 +00006563 struct ospf *ospf = vty->index;
6564
6565 ospf->distance_intra = 0;
6566 ospf->distance_inter = 0;
6567 ospf->distance_external = 0;
6568
paul718e3742002-12-13 20:15:29 +00006569 return CMD_SUCCESS;
6570}
6571
6572DEFUN (ospf_distance_ospf_intra,
6573 ospf_distance_ospf_intra_cmd,
6574 "distance ospf intra-area <1-255>",
6575 "Define an administrative distance\n"
6576 "OSPF Administrative distance\n"
6577 "Intra-area routes\n"
6578 "Distance for intra-area routes\n")
6579{
paul68980082003-03-25 05:07:42 +00006580 struct ospf *ospf = vty->index;
6581
6582 ospf->distance_intra = atoi (argv[0]);
6583
paul718e3742002-12-13 20:15:29 +00006584 return CMD_SUCCESS;
6585}
6586
6587DEFUN (ospf_distance_ospf_intra_inter,
6588 ospf_distance_ospf_intra_inter_cmd,
6589 "distance ospf intra-area <1-255> inter-area <1-255>",
6590 "Define an administrative distance\n"
6591 "OSPF Administrative distance\n"
6592 "Intra-area routes\n"
6593 "Distance for intra-area routes\n"
6594 "Inter-area routes\n"
6595 "Distance for inter-area routes\n")
6596{
paul68980082003-03-25 05:07:42 +00006597 struct ospf *ospf = vty->index;
6598
6599 ospf->distance_intra = atoi (argv[0]);
6600 ospf->distance_inter = atoi (argv[1]);
6601
paul718e3742002-12-13 20:15:29 +00006602 return CMD_SUCCESS;
6603}
6604
6605DEFUN (ospf_distance_ospf_intra_external,
6606 ospf_distance_ospf_intra_external_cmd,
6607 "distance ospf intra-area <1-255> external <1-255>",
6608 "Define an administrative distance\n"
6609 "OSPF Administrative distance\n"
6610 "Intra-area routes\n"
6611 "Distance for intra-area routes\n"
6612 "External routes\n"
6613 "Distance for external routes\n")
6614{
paul68980082003-03-25 05:07:42 +00006615 struct ospf *ospf = vty->index;
6616
6617 ospf->distance_intra = atoi (argv[0]);
6618 ospf->distance_external = atoi (argv[1]);
6619
paul718e3742002-12-13 20:15:29 +00006620 return CMD_SUCCESS;
6621}
6622
6623DEFUN (ospf_distance_ospf_intra_inter_external,
6624 ospf_distance_ospf_intra_inter_external_cmd,
6625 "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
6626 "Define an administrative distance\n"
6627 "OSPF Administrative distance\n"
6628 "Intra-area routes\n"
6629 "Distance for intra-area routes\n"
6630 "Inter-area routes\n"
6631 "Distance for inter-area routes\n"
6632 "External routes\n"
6633 "Distance for external routes\n")
6634{
paul68980082003-03-25 05:07:42 +00006635 struct ospf *ospf = vty->index;
6636
6637 ospf->distance_intra = atoi (argv[0]);
6638 ospf->distance_inter = atoi (argv[1]);
6639 ospf->distance_external = atoi (argv[2]);
6640
paul718e3742002-12-13 20:15:29 +00006641 return CMD_SUCCESS;
6642}
6643
6644DEFUN (ospf_distance_ospf_intra_external_inter,
6645 ospf_distance_ospf_intra_external_inter_cmd,
6646 "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
6647 "Define an administrative distance\n"
6648 "OSPF Administrative distance\n"
6649 "Intra-area routes\n"
6650 "Distance for intra-area routes\n"
6651 "External routes\n"
6652 "Distance for external routes\n"
6653 "Inter-area routes\n"
6654 "Distance for inter-area routes\n")
6655{
paul68980082003-03-25 05:07:42 +00006656 struct ospf *ospf = vty->index;
6657
6658 ospf->distance_intra = atoi (argv[0]);
6659 ospf->distance_external = atoi (argv[1]);
6660 ospf->distance_inter = atoi (argv[2]);
6661
paul718e3742002-12-13 20:15:29 +00006662 return CMD_SUCCESS;
6663}
6664
6665DEFUN (ospf_distance_ospf_inter,
6666 ospf_distance_ospf_inter_cmd,
6667 "distance ospf inter-area <1-255>",
6668 "Define an administrative distance\n"
6669 "OSPF Administrative distance\n"
6670 "Inter-area routes\n"
6671 "Distance for inter-area routes\n")
6672{
paul68980082003-03-25 05:07:42 +00006673 struct ospf *ospf = vty->index;
6674
6675 ospf->distance_inter = atoi (argv[0]);
6676
paul718e3742002-12-13 20:15:29 +00006677 return CMD_SUCCESS;
6678}
6679
6680DEFUN (ospf_distance_ospf_inter_intra,
6681 ospf_distance_ospf_inter_intra_cmd,
6682 "distance ospf inter-area <1-255> intra-area <1-255>",
6683 "Define an administrative distance\n"
6684 "OSPF Administrative distance\n"
6685 "Inter-area routes\n"
6686 "Distance for inter-area routes\n"
6687 "Intra-area routes\n"
6688 "Distance for intra-area routes\n")
6689{
paul68980082003-03-25 05:07:42 +00006690 struct ospf *ospf = vty->index;
6691
6692 ospf->distance_inter = atoi (argv[0]);
6693 ospf->distance_intra = atoi (argv[1]);
6694
paul718e3742002-12-13 20:15:29 +00006695 return CMD_SUCCESS;
6696}
6697
6698DEFUN (ospf_distance_ospf_inter_external,
6699 ospf_distance_ospf_inter_external_cmd,
6700 "distance ospf inter-area <1-255> external <1-255>",
6701 "Define an administrative distance\n"
6702 "OSPF Administrative distance\n"
6703 "Inter-area routes\n"
6704 "Distance for inter-area routes\n"
6705 "External routes\n"
6706 "Distance for external routes\n")
6707{
paul68980082003-03-25 05:07:42 +00006708 struct ospf *ospf = vty->index;
6709
6710 ospf->distance_inter = atoi (argv[0]);
6711 ospf->distance_external = atoi (argv[1]);
6712
paul718e3742002-12-13 20:15:29 +00006713 return CMD_SUCCESS;
6714}
6715
6716DEFUN (ospf_distance_ospf_inter_intra_external,
6717 ospf_distance_ospf_inter_intra_external_cmd,
6718 "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
6719 "Define an administrative distance\n"
6720 "OSPF Administrative distance\n"
6721 "Inter-area routes\n"
6722 "Distance for inter-area routes\n"
6723 "Intra-area routes\n"
6724 "Distance for intra-area routes\n"
6725 "External routes\n"
6726 "Distance for external routes\n")
6727{
paul68980082003-03-25 05:07:42 +00006728 struct ospf *ospf = vty->index;
6729
6730 ospf->distance_inter = atoi (argv[0]);
6731 ospf->distance_intra = atoi (argv[1]);
6732 ospf->distance_external = atoi (argv[2]);
6733
paul718e3742002-12-13 20:15:29 +00006734 return CMD_SUCCESS;
6735}
6736
6737DEFUN (ospf_distance_ospf_inter_external_intra,
6738 ospf_distance_ospf_inter_external_intra_cmd,
6739 "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
6740 "Define an administrative distance\n"
6741 "OSPF Administrative distance\n"
6742 "Inter-area routes\n"
6743 "Distance for inter-area routes\n"
6744 "External routes\n"
6745 "Distance for external routes\n"
6746 "Intra-area routes\n"
6747 "Distance for intra-area routes\n")
6748{
paul68980082003-03-25 05:07:42 +00006749 struct ospf *ospf = vty->index;
6750
6751 ospf->distance_inter = atoi (argv[0]);
6752 ospf->distance_external = atoi (argv[1]);
6753 ospf->distance_intra = atoi (argv[2]);
6754
paul718e3742002-12-13 20:15:29 +00006755 return CMD_SUCCESS;
6756}
6757
6758DEFUN (ospf_distance_ospf_external,
6759 ospf_distance_ospf_external_cmd,
6760 "distance ospf external <1-255>",
6761 "Define an administrative distance\n"
6762 "OSPF Administrative distance\n"
6763 "External routes\n"
6764 "Distance for external routes\n")
6765{
paul68980082003-03-25 05:07:42 +00006766 struct ospf *ospf = vty->index;
6767
6768 ospf->distance_external = atoi (argv[0]);
6769
paul718e3742002-12-13 20:15:29 +00006770 return CMD_SUCCESS;
6771}
6772
6773DEFUN (ospf_distance_ospf_external_intra,
6774 ospf_distance_ospf_external_intra_cmd,
6775 "distance ospf external <1-255> intra-area <1-255>",
6776 "Define an administrative distance\n"
6777 "OSPF Administrative distance\n"
6778 "External routes\n"
6779 "Distance for external routes\n"
6780 "Intra-area routes\n"
6781 "Distance for intra-area routes\n")
6782{
paul68980082003-03-25 05:07:42 +00006783 struct ospf *ospf = vty->index;
6784
6785 ospf->distance_external = atoi (argv[0]);
6786 ospf->distance_intra = atoi (argv[1]);
6787
paul718e3742002-12-13 20:15:29 +00006788 return CMD_SUCCESS;
6789}
6790
6791DEFUN (ospf_distance_ospf_external_inter,
6792 ospf_distance_ospf_external_inter_cmd,
6793 "distance ospf external <1-255> inter-area <1-255>",
6794 "Define an administrative distance\n"
6795 "OSPF Administrative distance\n"
6796 "External routes\n"
6797 "Distance for external routes\n"
6798 "Inter-area routes\n"
6799 "Distance for inter-area routes\n")
6800{
paul68980082003-03-25 05:07:42 +00006801 struct ospf *ospf = vty->index;
6802
6803 ospf->distance_external = atoi (argv[0]);
6804 ospf->distance_inter = atoi (argv[1]);
6805
paul718e3742002-12-13 20:15:29 +00006806 return CMD_SUCCESS;
6807}
6808
6809DEFUN (ospf_distance_ospf_external_intra_inter,
6810 ospf_distance_ospf_external_intra_inter_cmd,
6811 "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
6812 "Define an administrative distance\n"
6813 "OSPF Administrative distance\n"
6814 "External routes\n"
6815 "Distance for external routes\n"
6816 "Intra-area routes\n"
6817 "Distance for intra-area routes\n"
6818 "Inter-area routes\n"
6819 "Distance for inter-area routes\n")
6820{
paul68980082003-03-25 05:07:42 +00006821 struct ospf *ospf = vty->index;
6822
6823 ospf->distance_external = atoi (argv[0]);
6824 ospf->distance_intra = atoi (argv[1]);
6825 ospf->distance_inter = atoi (argv[2]);
6826
paul718e3742002-12-13 20:15:29 +00006827 return CMD_SUCCESS;
6828}
6829
6830DEFUN (ospf_distance_ospf_external_inter_intra,
6831 ospf_distance_ospf_external_inter_intra_cmd,
6832 "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
6833 "Define an administrative distance\n"
6834 "OSPF Administrative distance\n"
6835 "External routes\n"
6836 "Distance for external routes\n"
6837 "Inter-area routes\n"
6838 "Distance for inter-area routes\n"
6839 "Intra-area routes\n"
6840 "Distance for intra-area routes\n")
6841{
paul68980082003-03-25 05:07:42 +00006842 struct ospf *ospf = vty->index;
6843
6844 ospf->distance_external = atoi (argv[0]);
6845 ospf->distance_inter = atoi (argv[1]);
6846 ospf->distance_intra = atoi (argv[2]);
6847
paul718e3742002-12-13 20:15:29 +00006848 return CMD_SUCCESS;
6849}
6850
6851DEFUN (ospf_distance_source,
6852 ospf_distance_source_cmd,
6853 "distance <1-255> A.B.C.D/M",
6854 "Administrative distance\n"
6855 "Distance value\n"
6856 "IP source prefix\n")
6857{
paul020709f2003-04-04 02:44:16 +00006858 struct ospf *ospf = vty->index;
6859
6860 ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
paul68980082003-03-25 05:07:42 +00006861
paul718e3742002-12-13 20:15:29 +00006862 return CMD_SUCCESS;
6863}
6864
6865DEFUN (no_ospf_distance_source,
6866 no_ospf_distance_source_cmd,
6867 "no distance <1-255> A.B.C.D/M",
6868 NO_STR
6869 "Administrative distance\n"
6870 "Distance value\n"
6871 "IP source prefix\n")
6872{
paul020709f2003-04-04 02:44:16 +00006873 struct ospf *ospf = vty->index;
6874
6875 ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6876
paul718e3742002-12-13 20:15:29 +00006877 return CMD_SUCCESS;
6878}
6879
6880DEFUN (ospf_distance_source_access_list,
6881 ospf_distance_source_access_list_cmd,
6882 "distance <1-255> A.B.C.D/M WORD",
6883 "Administrative distance\n"
6884 "Distance value\n"
6885 "IP source prefix\n"
6886 "Access list name\n")
6887{
paul020709f2003-04-04 02:44:16 +00006888 struct ospf *ospf = vty->index;
6889
6890 ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6891
paul718e3742002-12-13 20:15:29 +00006892 return CMD_SUCCESS;
6893}
6894
6895DEFUN (no_ospf_distance_source_access_list,
6896 no_ospf_distance_source_access_list_cmd,
6897 "no distance <1-255> A.B.C.D/M WORD",
6898 NO_STR
6899 "Administrative distance\n"
6900 "Distance value\n"
6901 "IP source prefix\n"
6902 "Access list name\n")
6903{
paul020709f2003-04-04 02:44:16 +00006904 struct ospf *ospf = vty->index;
6905
6906 ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6907
paul718e3742002-12-13 20:15:29 +00006908 return CMD_SUCCESS;
6909}
6910
vincentba682532005-09-29 13:52:57 +00006911DEFUN (ip_ospf_mtu_ignore,
6912 ip_ospf_mtu_ignore_addr_cmd,
6913 "ip ospf mtu-ignore A.B.C.D",
6914 "IP Information\n"
6915 "OSPF interface commands\n"
6916 "Disable mtu mismatch detection\n"
6917 "Address of interface")
6918{
6919 struct interface *ifp = vty->index;
6920 struct in_addr addr;
6921 int ret;
6922
6923 struct ospf_if_params *params;
6924 params = IF_DEF_PARAMS (ifp);
6925
6926 if (argc == 1)
6927 {
6928 ret = inet_aton(argv[0], &addr);
6929 if (!ret)
6930 {
6931 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6932 VTY_NEWLINE);
6933 return CMD_WARNING;
6934 }
6935 params = ospf_get_if_params (ifp, addr);
6936 ospf_if_update_params (ifp, addr);
6937 }
6938 params->mtu_ignore = 1;
6939 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6940 SET_IF_PARAM (params, mtu_ignore);
6941 else
6942 {
6943 UNSET_IF_PARAM (params, mtu_ignore);
6944 if (params != IF_DEF_PARAMS (ifp))
6945 {
6946 ospf_free_if_params (ifp, addr);
6947 ospf_if_update_params (ifp, addr);
6948 }
6949 }
6950 return CMD_SUCCESS;
6951}
6952
6953ALIAS (ip_ospf_mtu_ignore,
6954 ip_ospf_mtu_ignore_cmd,
6955 "ip ospf mtu-ignore",
6956 "IP Information\n"
6957 "OSPF interface commands\n"
6958 "Disable mtu mismatch detection\n")
6959
6960
6961DEFUN (no_ip_ospf_mtu_ignore,
6962 no_ip_ospf_mtu_ignore_addr_cmd,
6963 "no ip ospf mtu-ignore A.B.C.D",
6964 "IP Information\n"
6965 "OSPF interface commands\n"
6966 "Disable mtu mismatch detection\n"
6967 "Address of interface")
6968{
6969 struct interface *ifp = vty->index;
6970 struct in_addr addr;
6971 int ret;
6972
6973 struct ospf_if_params *params;
6974 params = IF_DEF_PARAMS (ifp);
6975
6976 if (argc == 1)
6977 {
6978 ret = inet_aton(argv[0], &addr);
6979 if (!ret)
6980 {
6981 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6982 VTY_NEWLINE);
6983 return CMD_WARNING;
6984 }
6985 params = ospf_get_if_params (ifp, addr);
6986 ospf_if_update_params (ifp, addr);
6987 }
6988 params->mtu_ignore = 0;
6989 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6990 SET_IF_PARAM (params, mtu_ignore);
6991 else
6992 {
6993 UNSET_IF_PARAM (params, mtu_ignore);
6994 if (params != IF_DEF_PARAMS (ifp))
6995 {
6996 ospf_free_if_params (ifp, addr);
6997 ospf_if_update_params (ifp, addr);
6998 }
6999 }
7000 return CMD_SUCCESS;
7001}
7002
7003ALIAS (no_ip_ospf_mtu_ignore,
7004 no_ip_ospf_mtu_ignore_cmd,
7005 "no ip ospf mtu-ignore",
7006 "IP Information\n"
7007 "OSPF interface commands\n"
7008 "Disable mtu mismatch detection\n")
paul88d6cf32005-10-29 12:50:09 +00007009
7010DEFUN (ospf_max_metric_router_lsa_admin,
7011 ospf_max_metric_router_lsa_admin_cmd,
7012 "max-metric router-lsa administrative",
7013 "OSPF maximum / infinite-distance metric\n"
7014 "Advertise own Router-LSA with infinite distance (stub router)\n"
7015 "Administratively applied, for an indefinite period\n")
7016{
7017 struct listnode *ln;
7018 struct ospf_area *area;
7019 struct ospf *ospf = vty->index;
vincentba682532005-09-29 13:52:57 +00007020
paul88d6cf32005-10-29 12:50:09 +00007021 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7022 {
7023 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7024
7025 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
7026 ospf_router_lsa_timer_add (area);
7027 }
7028 return CMD_SUCCESS;
7029}
7030
7031DEFUN (no_ospf_max_metric_router_lsa_admin,
7032 no_ospf_max_metric_router_lsa_admin_cmd,
7033 "no max-metric router-lsa administrative",
7034 NO_STR
7035 "OSPF maximum / infinite-distance metric\n"
7036 "Advertise own Router-LSA with infinite distance (stub router)\n"
7037 "Administratively applied, for an indefinite period\n")
7038{
7039 struct listnode *ln;
7040 struct ospf_area *area;
7041 struct ospf *ospf = vty->index;
7042
7043 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7044 {
7045 UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7046
7047 /* Don't trample on the start-up stub timer */
7048 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
7049 && !area->t_stub_router)
7050 {
7051 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
7052 ospf_router_lsa_timer_add (area);
7053 }
7054 }
7055 return CMD_SUCCESS;
7056}
7057
7058DEFUN (ospf_max_metric_router_lsa_startup,
7059 ospf_max_metric_router_lsa_startup_cmd,
7060 "max-metric router-lsa on-startup <5-86400>",
7061 "OSPF maximum / infinite-distance metric\n"
7062 "Advertise own Router-LSA with infinite distance (stub router)\n"
7063 "Automatically advertise stub Router-LSA on startup of OSPF\n"
7064 "Time (seconds) to advertise self as stub-router\n")
7065{
7066 unsigned int seconds;
7067 struct ospf *ospf = vty->index;
7068
7069 if (argc != 1)
7070 {
7071 vty_out (vty, "%% Must supply stub-router period");
7072 return CMD_WARNING;
7073 }
7074
7075 VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
7076
7077 ospf->stub_router_startup_time = seconds;
7078
7079 return CMD_SUCCESS;
7080}
7081
7082DEFUN (no_ospf_max_metric_router_lsa_startup,
7083 no_ospf_max_metric_router_lsa_startup_cmd,
7084 "no max-metric router-lsa on-startup",
7085 NO_STR
7086 "OSPF maximum / infinite-distance metric\n"
7087 "Advertise own Router-LSA with infinite distance (stub router)\n"
7088 "Automatically advertise stub Router-LSA on startup of OSPF\n")
7089{
7090 struct listnode *ln;
7091 struct ospf_area *area;
7092 struct ospf *ospf = vty->index;
7093
7094 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7095
7096 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7097 {
7098 SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
7099 OSPF_TIMER_OFF (area->t_stub_router);
7100
7101 /* Don't trample on admin stub routed */
7102 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7103 {
7104 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
7105 ospf_router_lsa_timer_add (area);
7106 }
7107 }
7108 return CMD_SUCCESS;
7109}
7110
7111DEFUN (ospf_max_metric_router_lsa_shutdown,
7112 ospf_max_metric_router_lsa_shutdown_cmd,
7113 "max-metric router-lsa on-shutdown <5-86400>",
7114 "OSPF maximum / infinite-distance metric\n"
7115 "Advertise own Router-LSA with infinite distance (stub router)\n"
7116 "Advertise stub-router prior to full shutdown of OSPF\n"
7117 "Time (seconds) to wait till full shutdown\n")
7118{
7119 unsigned int seconds;
7120 struct ospf *ospf = vty->index;
7121
7122 if (argc != 1)
7123 {
7124 vty_out (vty, "%% Must supply stub-router shutdown period");
7125 return CMD_WARNING;
7126 }
7127
7128 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
7129
7130 ospf->stub_router_shutdown_time = seconds;
7131
7132 return CMD_SUCCESS;
7133}
7134
7135DEFUN (no_ospf_max_metric_router_lsa_shutdown,
7136 no_ospf_max_metric_router_lsa_shutdown_cmd,
7137 "no max-metric router-lsa on-shutdown",
7138 NO_STR
7139 "OSPF maximum / infinite-distance metric\n"
7140 "Advertise own Router-LSA with infinite distance (stub router)\n"
7141 "Advertise stub-router prior to full shutdown of OSPF\n")
7142{
7143 struct ospf *ospf = vty->index;
7144
7145 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7146
7147 return CMD_SUCCESS;
7148}
7149
7150static void
7151config_write_stub_router (struct vty *vty, struct ospf *ospf)
7152{
7153 struct listnode *ln;
7154 struct ospf_area *area;
7155
7156 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7157 vty_out (vty, " max-metric router-lsa on-startup %u%s",
7158 ospf->stub_router_startup_time, VTY_NEWLINE);
7159 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7160 vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
7161 ospf->stub_router_shutdown_time, VTY_NEWLINE);
7162 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7163 {
7164 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7165 {
7166 vty_out (vty, " max-metric router-lsa administrative%s",
7167 VTY_NEWLINE);
7168 break;
7169 }
7170 }
7171 return;
7172}
7173
paul4dadc292005-05-06 21:37:42 +00007174static void
paul718e3742002-12-13 20:15:29 +00007175show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
7176{
7177 struct route_node *rn;
7178 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007179 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007180 struct ospf_path *path;
7181
7182 vty_out (vty, "============ OSPF network routing table ============%s",
7183 VTY_NEWLINE);
7184
7185 for (rn = route_top (rt); rn; rn = route_next (rn))
7186 if ((or = rn->info) != NULL)
7187 {
7188 char buf1[19];
7189 snprintf (buf1, 19, "%s/%d",
7190 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7191
7192 switch (or->path_type)
7193 {
7194 case OSPF_PATH_INTER_AREA:
7195 if (or->type == OSPF_DESTINATION_NETWORK)
7196 vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
7197 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7198 else if (or->type == OSPF_DESTINATION_DISCARD)
7199 vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
7200 break;
7201 case OSPF_PATH_INTRA_AREA:
7202 vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
7203 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7204 break;
7205 default:
7206 break;
7207 }
7208
7209 if (or->type == OSPF_DESTINATION_NETWORK)
paul1eb8ef22005-04-07 07:30:20 +00007210 for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
paul96735ee2003-08-10 02:51:22 +00007211 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007212 if (if_lookup_by_index(path->ifindex))
paul96735ee2003-08-10 02:51:22 +00007213 {
7214 if (path->nexthop.s_addr == 0)
7215 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007216 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007217 else
7218 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007219 inet_ntoa (path->nexthop),
7220 ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007221 }
7222 }
paul718e3742002-12-13 20:15:29 +00007223 }
7224 vty_out (vty, "%s", VTY_NEWLINE);
7225}
7226
paul4dadc292005-05-06 21:37:42 +00007227static void
paul718e3742002-12-13 20:15:29 +00007228show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
7229{
7230 struct route_node *rn;
7231 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007232 struct listnode *pnode;
7233 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007234 struct ospf_path *path;
7235
7236 vty_out (vty, "============ OSPF router routing table =============%s",
7237 VTY_NEWLINE);
7238 for (rn = route_top (rtrs); rn; rn = route_next (rn))
7239 if (rn->info)
7240 {
7241 int flag = 0;
7242
7243 vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
7244
paul1eb8ef22005-04-07 07:30:20 +00007245 for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
7246 {
7247 if (flag++)
7248 vty_out (vty, "%24s", "");
paul718e3742002-12-13 20:15:29 +00007249
paul1eb8ef22005-04-07 07:30:20 +00007250 /* Show path. */
7251 vty_out (vty, "%s [%d] area: %s",
7252 (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
7253 or->cost, inet_ntoa (or->u.std.area_id));
7254 /* Show flags. */
7255 vty_out (vty, "%s%s%s",
7256 (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
7257 (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
7258 VTY_NEWLINE);
7259
7260 for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
7261 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007262 if (if_lookup_by_index(path->ifindex))
hasso54bedb52005-08-17 13:31:47 +00007263 {
7264 if (path->nexthop.s_addr == 0)
7265 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007266 "", ifindex2ifname (path->ifindex),
7267 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00007268 else
7269 vty_out (vty, "%24s via %s, %s%s", "",
7270 inet_ntoa (path->nexthop),
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007271 ifindex2ifname (path->ifindex),
7272 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00007273 }
paul1eb8ef22005-04-07 07:30:20 +00007274 }
7275 }
paul718e3742002-12-13 20:15:29 +00007276 }
7277 vty_out (vty, "%s", VTY_NEWLINE);
7278}
7279
paul4dadc292005-05-06 21:37:42 +00007280static void
paul718e3742002-12-13 20:15:29 +00007281show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
7282{
7283 struct route_node *rn;
7284 struct ospf_route *er;
paul1eb8ef22005-04-07 07:30:20 +00007285 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007286 struct ospf_path *path;
7287
7288 vty_out (vty, "============ OSPF external routing table ===========%s",
7289 VTY_NEWLINE);
7290 for (rn = route_top (rt); rn; rn = route_next (rn))
7291 if ((er = rn->info) != NULL)
7292 {
7293 char buf1[19];
7294 snprintf (buf1, 19, "%s/%d",
7295 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7296
7297 switch (er->path_type)
7298 {
7299 case OSPF_PATH_TYPE1_EXTERNAL:
7300 vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
7301 er->cost, er->u.ext.tag, VTY_NEWLINE);
7302 break;
7303 case OSPF_PATH_TYPE2_EXTERNAL:
7304 vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
7305 er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
7306 break;
7307 }
7308
paul1eb8ef22005-04-07 07:30:20 +00007309 for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
paul718e3742002-12-13 20:15:29 +00007310 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007311 if (if_lookup_by_index(path->ifindex))
paul718e3742002-12-13 20:15:29 +00007312 {
7313 if (path->nexthop.s_addr == 0)
paul96735ee2003-08-10 02:51:22 +00007314 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007315 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007316 else
7317 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007318 inet_ntoa (path->nexthop),
7319 ifindex2ifname (path->ifindex),
paul96735ee2003-08-10 02:51:22 +00007320 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007321 }
7322 }
7323 }
7324 vty_out (vty, "%s", VTY_NEWLINE);
7325}
7326
paul718e3742002-12-13 20:15:29 +00007327DEFUN (show_ip_ospf_border_routers,
7328 show_ip_ospf_border_routers_cmd,
7329 "show ip ospf border-routers",
7330 SHOW_STR
7331 IP_STR
7332 "show all the ABR's and ASBR's\n"
7333 "for this area\n")
7334{
paul020709f2003-04-04 02:44:16 +00007335 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007336
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007337 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007338 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007339 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007340 return CMD_SUCCESS;
7341 }
7342
paul68980082003-03-25 05:07:42 +00007343 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007344 {
7345 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7346 return CMD_SUCCESS;
7347 }
7348
7349 /* Show Network routes.
paul020709f2003-04-04 02:44:16 +00007350 show_ip_ospf_route_network (vty, ospf->new_table); */
paul718e3742002-12-13 20:15:29 +00007351
7352 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007353 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007354
7355 return CMD_SUCCESS;
7356}
paul718e3742002-12-13 20:15:29 +00007357
7358DEFUN (show_ip_ospf_route,
7359 show_ip_ospf_route_cmd,
7360 "show ip ospf route",
7361 SHOW_STR
7362 IP_STR
7363 "OSPF information\n"
7364 "OSPF routing table\n")
7365{
paul020709f2003-04-04 02:44:16 +00007366 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007367
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007368 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007369 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007370 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007371 return CMD_SUCCESS;
7372 }
7373
paul68980082003-03-25 05:07:42 +00007374 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007375 {
7376 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7377 return CMD_SUCCESS;
7378 }
7379
7380 /* Show Network routes. */
paul68980082003-03-25 05:07:42 +00007381 show_ip_ospf_route_network (vty, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00007382
7383 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007384 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007385
7386 /* Show AS External routes. */
paul68980082003-03-25 05:07:42 +00007387 show_ip_ospf_route_external (vty, ospf->old_external_route);
paul718e3742002-12-13 20:15:29 +00007388
7389 return CMD_SUCCESS;
7390}
7391
7392
hassoeb1ce602004-10-08 08:17:22 +00007393const char *ospf_abr_type_str[] =
paul718e3742002-12-13 20:15:29 +00007394{
7395 "unknown",
7396 "standard",
7397 "ibm",
7398 "cisco",
7399 "shortcut"
7400};
7401
hassoeb1ce602004-10-08 08:17:22 +00007402const char *ospf_shortcut_mode_str[] =
paul718e3742002-12-13 20:15:29 +00007403{
7404 "default",
7405 "enable",
7406 "disable"
7407};
7408
7409
paul4dadc292005-05-06 21:37:42 +00007410static void
paul718e3742002-12-13 20:15:29 +00007411area_id2str (char *buf, int length, struct ospf_area *area)
7412{
7413 memset (buf, 0, length);
7414
7415 if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7416 strncpy (buf, inet_ntoa (area->area_id), length);
7417 else
7418 sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
7419}
7420
7421
hassoeb1ce602004-10-08 08:17:22 +00007422const char *ospf_int_type_str[] =
paul718e3742002-12-13 20:15:29 +00007423{
7424 "unknown", /* should never be used. */
7425 "point-to-point",
7426 "broadcast",
7427 "non-broadcast",
7428 "point-to-multipoint",
7429 "virtual-link", /* should never be used. */
7430 "loopback"
7431};
7432
7433/* Configuration write function for ospfd. */
paul4dadc292005-05-06 21:37:42 +00007434static int
paul718e3742002-12-13 20:15:29 +00007435config_write_interface (struct vty *vty)
7436{
hasso52dc7ee2004-09-23 19:18:23 +00007437 struct listnode *n1, *n2;
paul718e3742002-12-13 20:15:29 +00007438 struct interface *ifp;
7439 struct crypt_key *ck;
7440 int write = 0;
7441 struct route_node *rn = NULL;
7442 struct ospf_if_params *params;
7443
paul1eb8ef22005-04-07 07:30:20 +00007444 for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
paul718e3742002-12-13 20:15:29 +00007445 {
paul718e3742002-12-13 20:15:29 +00007446 if (memcmp (ifp->name, "VLINK", 5) == 0)
7447 continue;
7448
7449 vty_out (vty, "!%s", VTY_NEWLINE);
7450 vty_out (vty, "interface %s%s", ifp->name,
7451 VTY_NEWLINE);
7452 if (ifp->desc)
7453 vty_out (vty, " description %s%s", ifp->desc,
7454 VTY_NEWLINE);
7455
7456 write++;
7457
7458 params = IF_DEF_PARAMS (ifp);
7459
7460 do {
7461 /* Interface Network print. */
7462 if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
paul718e3742002-12-13 20:15:29 +00007463 params->type != OSPF_IFTYPE_LOOPBACK)
7464 {
ajsbc18d612004-12-15 15:07:19 +00007465 if (params->type != ospf_default_iftype(ifp))
hasso7b901432004-08-31 13:37:42 +00007466 {
7467 vty_out (vty, " ip ospf network %s",
7468 ospf_int_type_str[params->type]);
7469 if (params != IF_DEF_PARAMS (ifp))
7470 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7471 vty_out (vty, "%s", VTY_NEWLINE);
7472 }
paul718e3742002-12-13 20:15:29 +00007473 }
7474
7475 /* OSPF interface authentication print */
7476 if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
7477 params->auth_type != OSPF_AUTH_NOTSET)
7478 {
hassoeb1ce602004-10-08 08:17:22 +00007479 const char *auth_str;
paul718e3742002-12-13 20:15:29 +00007480
7481 /* Translation tables are not that much help here due to syntax
7482 of the simple option */
7483 switch (params->auth_type)
7484 {
7485
7486 case OSPF_AUTH_NULL:
7487 auth_str = " null";
7488 break;
7489
7490 case OSPF_AUTH_SIMPLE:
7491 auth_str = "";
7492 break;
7493
7494 case OSPF_AUTH_CRYPTOGRAPHIC:
7495 auth_str = " message-digest";
7496 break;
7497
7498 default:
7499 auth_str = "";
7500 break;
7501 }
7502
7503 vty_out (vty, " ip ospf authentication%s", auth_str);
7504 if (params != IF_DEF_PARAMS (ifp))
7505 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7506 vty_out (vty, "%s", VTY_NEWLINE);
7507 }
7508
7509 /* Simple Authentication Password print. */
7510 if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
7511 params->auth_simple[0] != '\0')
7512 {
7513 vty_out (vty, " ip ospf authentication-key %s",
7514 params->auth_simple);
7515 if (params != IF_DEF_PARAMS (ifp))
7516 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7517 vty_out (vty, "%s", VTY_NEWLINE);
7518 }
7519
7520 /* Cryptographic Authentication Key print. */
paul1eb8ef22005-04-07 07:30:20 +00007521 for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
paul718e3742002-12-13 20:15:29 +00007522 {
paul718e3742002-12-13 20:15:29 +00007523 vty_out (vty, " ip ospf message-digest-key %d md5 %s",
7524 ck->key_id, ck->auth_key);
7525 if (params != IF_DEF_PARAMS (ifp))
7526 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7527 vty_out (vty, "%s", VTY_NEWLINE);
7528 }
7529
7530 /* Interface Output Cost print. */
7531 if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
7532 {
7533 vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
7534 if (params != IF_DEF_PARAMS (ifp))
7535 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7536 vty_out (vty, "%s", VTY_NEWLINE);
7537 }
7538
7539 /* Hello Interval print. */
7540 if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
7541 params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
7542 {
7543 vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
7544 if (params != IF_DEF_PARAMS (ifp))
7545 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7546 vty_out (vty, "%s", VTY_NEWLINE);
7547 }
7548
7549
7550 /* Router Dead Interval print. */
7551 if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
7552 params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
7553 {
paulf9ad9372005-10-21 00:45:17 +00007554 vty_out (vty, " ip ospf dead-interval ");
7555
7556 /* fast hello ? */
7557 if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
7558 vty_out (vty, "minimal hello-multiplier %d",
7559 params->fast_hello);
7560 else
7561 vty_out (vty, "%u", params->v_wait);
7562
paul718e3742002-12-13 20:15:29 +00007563 if (params != IF_DEF_PARAMS (ifp))
7564 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7565 vty_out (vty, "%s", VTY_NEWLINE);
7566 }
7567
7568 /* Router Priority print. */
7569 if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
7570 params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
7571 {
7572 vty_out (vty, " ip ospf priority %u", params->priority);
7573 if (params != IF_DEF_PARAMS (ifp))
7574 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7575 vty_out (vty, "%s", VTY_NEWLINE);
7576 }
7577
7578 /* Retransmit Interval print. */
7579 if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
7580 params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
7581 {
7582 vty_out (vty, " ip ospf retransmit-interval %u",
7583 params->retransmit_interval);
7584 if (params != IF_DEF_PARAMS (ifp))
7585 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7586 vty_out (vty, "%s", VTY_NEWLINE);
7587 }
7588
7589 /* Transmit Delay print. */
7590 if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
7591 params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
7592 {
7593 vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
7594 if (params != IF_DEF_PARAMS (ifp))
7595 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7596 vty_out (vty, "%s", VTY_NEWLINE);
7597 }
7598
vincentba682532005-09-29 13:52:57 +00007599 /* MTU ignore print. */
7600 if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7601 params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7602 {
7603 if (params->mtu_ignore == 0)
7604 vty_out (vty, " no ip ospf mtu-ignore");
7605 else
7606 vty_out (vty, " ip ospf mtu-ignore");
7607 if (params != IF_DEF_PARAMS (ifp))
7608 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7609 vty_out (vty, "%s", VTY_NEWLINE);
7610 }
7611
7612
paul718e3742002-12-13 20:15:29 +00007613 while (1)
7614 {
7615 if (rn == NULL)
7616 rn = route_top (IF_OIFS_PARAMS (ifp));
7617 else
7618 rn = route_next (rn);
7619
7620 if (rn == NULL)
7621 break;
7622 params = rn->info;
7623 if (params != NULL)
7624 break;
7625 }
7626 } while (rn);
7627
7628#ifdef HAVE_OPAQUE_LSA
7629 ospf_opaque_config_write_if (vty, ifp);
7630#endif /* HAVE_OPAQUE_LSA */
7631 }
7632
7633 return write;
7634}
7635
paul4dadc292005-05-06 21:37:42 +00007636static int
paul68980082003-03-25 05:07:42 +00007637config_write_network_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007638{
7639 struct route_node *rn;
7640 u_char buf[INET_ADDRSTRLEN];
7641
7642 /* `network area' print. */
paul68980082003-03-25 05:07:42 +00007643 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007644 if (rn->info)
7645 {
7646 struct ospf_network *n = rn->info;
7647
7648 memset (buf, 0, INET_ADDRSTRLEN);
7649
7650 /* Create Area ID string by specified Area ID format. */
7651 if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007652 strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007653 else
hassoc9e52be2004-09-26 16:09:34 +00007654 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007655 (unsigned long int) ntohl (n->area_id.s_addr));
7656
7657 /* Network print. */
7658 vty_out (vty, " network %s/%d area %s%s",
7659 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7660 buf, VTY_NEWLINE);
7661 }
7662
7663 return 0;
7664}
7665
paul4dadc292005-05-06 21:37:42 +00007666static int
paul68980082003-03-25 05:07:42 +00007667config_write_ospf_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007668{
hasso52dc7ee2004-09-23 19:18:23 +00007669 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007670 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00007671 u_char buf[INET_ADDRSTRLEN];
7672
7673 /* Area configuration print. */
paul1eb8ef22005-04-07 07:30:20 +00007674 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00007675 {
paul718e3742002-12-13 20:15:29 +00007676 struct route_node *rn1;
7677
hassoc9e52be2004-09-26 16:09:34 +00007678 area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
paul718e3742002-12-13 20:15:29 +00007679
7680 if (area->auth_type != OSPF_AUTH_NULL)
7681 {
7682 if (area->auth_type == OSPF_AUTH_SIMPLE)
7683 vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7684 else
7685 vty_out (vty, " area %s authentication message-digest%s",
7686 buf, VTY_NEWLINE);
7687 }
7688
7689 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7690 vty_out (vty, " area %s shortcut %s%s", buf,
7691 ospf_shortcut_mode_str[area->shortcut_configured],
7692 VTY_NEWLINE);
7693
7694 if ((area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007695 || (area->external_routing == OSPF_AREA_NSSA)
paul718e3742002-12-13 20:15:29 +00007696 )
7697 {
paulb0a053b2003-06-22 09:04:47 +00007698 if (area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007699 vty_out (vty, " area %s stub", buf);
paulb0a053b2003-06-22 09:04:47 +00007700 else if (area->external_routing == OSPF_AREA_NSSA)
7701 {
7702 vty_out (vty, " area %s nssa", buf);
7703 switch (area->NSSATranslatorRole)
7704 {
7705 case OSPF_NSSA_ROLE_NEVER:
7706 vty_out (vty, " translate-never");
7707 break;
7708 case OSPF_NSSA_ROLE_ALWAYS:
7709 vty_out (vty, " translate-always");
7710 break;
7711 case OSPF_NSSA_ROLE_CANDIDATE:
7712 default:
7713 vty_out (vty, " translate-candidate");
7714 }
7715 }
paul718e3742002-12-13 20:15:29 +00007716
7717 if (area->no_summary)
7718 vty_out (vty, " no-summary");
7719
7720 vty_out (vty, "%s", VTY_NEWLINE);
7721
7722 if (area->default_cost != 1)
7723 vty_out (vty, " area %s default-cost %d%s", buf,
7724 area->default_cost, VTY_NEWLINE);
7725 }
7726
7727 for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7728 if (rn1->info)
7729 {
7730 struct ospf_area_range *range = rn1->info;
7731
7732 vty_out (vty, " area %s range %s/%d", buf,
7733 inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7734
paul6c835672004-10-11 11:00:30 +00007735 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +00007736 vty_out (vty, " cost %d", range->cost_config);
7737
7738 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7739 vty_out (vty, " not-advertise");
7740
7741 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7742 vty_out (vty, " substitute %s/%d",
7743 inet_ntoa (range->subst_addr), range->subst_masklen);
7744
7745 vty_out (vty, "%s", VTY_NEWLINE);
7746 }
7747
7748 if (EXPORT_NAME (area))
7749 vty_out (vty, " area %s export-list %s%s", buf,
7750 EXPORT_NAME (area), VTY_NEWLINE);
7751
7752 if (IMPORT_NAME (area))
7753 vty_out (vty, " area %s import-list %s%s", buf,
7754 IMPORT_NAME (area), VTY_NEWLINE);
7755
7756 if (PREFIX_NAME_IN (area))
7757 vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7758 PREFIX_NAME_IN (area), VTY_NEWLINE);
7759
7760 if (PREFIX_NAME_OUT (area))
7761 vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7762 PREFIX_NAME_OUT (area), VTY_NEWLINE);
7763 }
7764
7765 return 0;
7766}
7767
paul4dadc292005-05-06 21:37:42 +00007768static int
paul68980082003-03-25 05:07:42 +00007769config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007770{
7771 struct ospf_nbr_nbma *nbr_nbma;
7772 struct route_node *rn;
7773
7774 /* Static Neighbor configuration print. */
paul68980082003-03-25 05:07:42 +00007775 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007776 if ((nbr_nbma = rn->info))
7777 {
7778 vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7779
7780 if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7781 vty_out (vty, " priority %d", nbr_nbma->priority);
7782
7783 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7784 vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7785
7786 vty_out (vty, "%s", VTY_NEWLINE);
7787 }
7788
7789 return 0;
7790}
7791
paul4dadc292005-05-06 21:37:42 +00007792static int
paul68980082003-03-25 05:07:42 +00007793config_write_virtual_link (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007794{
hasso52dc7ee2004-09-23 19:18:23 +00007795 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007796 struct ospf_vl_data *vl_data;
paul718e3742002-12-13 20:15:29 +00007797 u_char buf[INET_ADDRSTRLEN];
7798
7799 /* Virtual-Link print */
paul1eb8ef22005-04-07 07:30:20 +00007800 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
paul718e3742002-12-13 20:15:29 +00007801 {
hasso52dc7ee2004-09-23 19:18:23 +00007802 struct listnode *n2;
paul718e3742002-12-13 20:15:29 +00007803 struct crypt_key *ck;
paul718e3742002-12-13 20:15:29 +00007804 struct ospf_interface *oi;
7805
7806 if (vl_data != NULL)
7807 {
7808 memset (buf, 0, INET_ADDRSTRLEN);
7809
7810 if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007811 strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007812 else
hassoc9e52be2004-09-26 16:09:34 +00007813 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007814 (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7815 oi = vl_data->vl_oi;
7816
7817 /* timers */
7818 if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7819 OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7820 OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7821 OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7822 vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7823 buf,
7824 inet_ntoa (vl_data->vl_peer),
7825 OSPF_IF_PARAM (oi, v_hello),
7826 OSPF_IF_PARAM (oi, retransmit_interval),
7827 OSPF_IF_PARAM (oi, transmit_delay),
7828 OSPF_IF_PARAM (oi, v_wait),
7829 VTY_NEWLINE);
7830 else
7831 vty_out (vty, " area %s virtual-link %s%s", buf,
7832 inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7833 /* Auth key */
7834 if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7835 vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7836 buf,
7837 inet_ntoa (vl_data->vl_peer),
7838 IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7839 VTY_NEWLINE);
7840 /* md5 keys */
paul1eb8ef22005-04-07 07:30:20 +00007841 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7842 n2, ck))
7843 vty_out (vty, " area %s virtual-link %s"
7844 " message-digest-key %d md5 %s%s",
7845 buf,
7846 inet_ntoa (vl_data->vl_peer),
7847 ck->key_id, ck->auth_key, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007848
7849 }
7850 }
7851
7852 return 0;
7853}
7854
7855
paul4dadc292005-05-06 21:37:42 +00007856static int
paul68980082003-03-25 05:07:42 +00007857config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007858{
7859 int type;
7860
7861 /* redistribute print. */
7862 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7863 if (type != zclient->redist_default && zclient->redist[type])
7864 {
ajsf52d13c2005-10-01 17:38:06 +00007865 vty_out (vty, " redistribute %s", zebra_route_string(type));
paul68980082003-03-25 05:07:42 +00007866 if (ospf->dmetric[type].value >= 0)
paul020709f2003-04-04 02:44:16 +00007867 vty_out (vty, " metric %d", ospf->dmetric[type].value);
paul718e3742002-12-13 20:15:29 +00007868
paul68980082003-03-25 05:07:42 +00007869 if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007870 vty_out (vty, " metric-type 1");
7871
paul020709f2003-04-04 02:44:16 +00007872 if (ROUTEMAP_NAME (ospf, type))
7873 vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
paul718e3742002-12-13 20:15:29 +00007874
7875 vty_out (vty, "%s", VTY_NEWLINE);
7876 }
7877
7878 return 0;
7879}
7880
paul4dadc292005-05-06 21:37:42 +00007881static int
paul68980082003-03-25 05:07:42 +00007882config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007883{
paul68980082003-03-25 05:07:42 +00007884 if (ospf->default_metric != -1)
7885 vty_out (vty, " default-metric %d%s", ospf->default_metric,
paul718e3742002-12-13 20:15:29 +00007886 VTY_NEWLINE);
7887 return 0;
7888}
7889
paul4dadc292005-05-06 21:37:42 +00007890static int
paul68980082003-03-25 05:07:42 +00007891config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007892{
7893 int type;
7894
paul68980082003-03-25 05:07:42 +00007895 if (ospf)
paul718e3742002-12-13 20:15:29 +00007896 {
7897 /* distribute-list print. */
7898 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
Denis Ovsienko4f151e52011-09-10 16:40:23 +04007899 if (DISTRIBUTE_NAME (ospf, type))
paul718e3742002-12-13 20:15:29 +00007900 vty_out (vty, " distribute-list %s out %s%s",
Denis Ovsienko4f151e52011-09-10 16:40:23 +04007901 DISTRIBUTE_NAME (ospf, type),
ajsf52d13c2005-10-01 17:38:06 +00007902 zebra_route_string(type), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007903
7904 /* default-information print. */
paul68980082003-03-25 05:07:42 +00007905 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
paul718e3742002-12-13 20:15:29 +00007906 {
paulc42c1772006-01-10 20:36:49 +00007907 vty_out (vty, " default-information originate");
7908 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7909 vty_out (vty, " always");
paul718e3742002-12-13 20:15:29 +00007910
paul68980082003-03-25 05:07:42 +00007911 if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
paul718e3742002-12-13 20:15:29 +00007912 vty_out (vty, " metric %d",
paul68980082003-03-25 05:07:42 +00007913 ospf->dmetric[DEFAULT_ROUTE].value);
7914 if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007915 vty_out (vty, " metric-type 1");
7916
paul020709f2003-04-04 02:44:16 +00007917 if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7918 vty_out (vty, " route-map %s",
7919 ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
paul718e3742002-12-13 20:15:29 +00007920
7921 vty_out (vty, "%s", VTY_NEWLINE);
7922 }
7923
7924 }
7925
7926 return 0;
7927}
7928
paul4dadc292005-05-06 21:37:42 +00007929static int
paul68980082003-03-25 05:07:42 +00007930config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007931{
7932 struct route_node *rn;
7933 struct ospf_distance *odistance;
7934
paul68980082003-03-25 05:07:42 +00007935 if (ospf->distance_all)
7936 vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007937
paul68980082003-03-25 05:07:42 +00007938 if (ospf->distance_intra
7939 || ospf->distance_inter
7940 || ospf->distance_external)
paul718e3742002-12-13 20:15:29 +00007941 {
7942 vty_out (vty, " distance ospf");
7943
paul68980082003-03-25 05:07:42 +00007944 if (ospf->distance_intra)
7945 vty_out (vty, " intra-area %d", ospf->distance_intra);
7946 if (ospf->distance_inter)
7947 vty_out (vty, " inter-area %d", ospf->distance_inter);
7948 if (ospf->distance_external)
7949 vty_out (vty, " external %d", ospf->distance_external);
paul718e3742002-12-13 20:15:29 +00007950
7951 vty_out (vty, "%s", VTY_NEWLINE);
7952 }
7953
paul68980082003-03-25 05:07:42 +00007954 for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007955 if ((odistance = rn->info) != NULL)
7956 {
7957 vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7958 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7959 odistance->access_list ? odistance->access_list : "",
7960 VTY_NEWLINE);
7961 }
7962 return 0;
7963}
7964
7965/* OSPF configuration write function. */
paul4dadc292005-05-06 21:37:42 +00007966static int
paul718e3742002-12-13 20:15:29 +00007967ospf_config_write (struct vty *vty)
7968{
paul020709f2003-04-04 02:44:16 +00007969 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00007970 struct interface *ifp;
7971 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00007972 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007973 int write = 0;
7974
paul020709f2003-04-04 02:44:16 +00007975 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00007976 if (ospf != NULL)
paul718e3742002-12-13 20:15:29 +00007977 {
7978 /* `router ospf' print. */
7979 vty_out (vty, "router ospf%s", VTY_NEWLINE);
7980
7981 write++;
7982
paul68980082003-03-25 05:07:42 +00007983 if (!ospf->networks)
paul718e3742002-12-13 20:15:29 +00007984 return write;
7985
7986 /* Router ID print. */
paul68980082003-03-25 05:07:42 +00007987 if (ospf->router_id_static.s_addr != 0)
paul718e3742002-12-13 20:15:29 +00007988 vty_out (vty, " ospf router-id %s%s",
paul68980082003-03-25 05:07:42 +00007989 inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007990
7991 /* ABR type print. */
pauld57834f2005-07-12 20:04:22 +00007992 if (ospf->abr_type != OSPF_ABR_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007993 vty_out (vty, " ospf abr-type %s%s",
paul68980082003-03-25 05:07:42 +00007994 ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007995
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007996 /* log-adjacency-changes flag print. */
7997 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
7998 {
7999 vty_out(vty, " log-adjacency-changes");
8000 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
8001 vty_out(vty, " detail");
8002 vty_out(vty, "%s", VTY_NEWLINE);
8003 }
8004
paul718e3742002-12-13 20:15:29 +00008005 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
paul68980082003-03-25 05:07:42 +00008006 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
paul718e3742002-12-13 20:15:29 +00008007 vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
8008
8009 /* auto-cost reference-bandwidth configuration. */
paul68980082003-03-25 05:07:42 +00008010 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
paulf9ad9372005-10-21 00:45:17 +00008011 {
8012 vty_out (vty, "! Important: ensure reference bandwidth "
8013 "is consistent across all routers%s", VTY_NEWLINE);
8014 vty_out (vty, " auto-cost reference-bandwidth %d%s",
8015 ospf->ref_bandwidth / 1000, VTY_NEWLINE);
8016 }
paul718e3742002-12-13 20:15:29 +00008017
8018 /* SPF timers print. */
paul68980082003-03-25 05:07:42 +00008019 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
paulea4ffc92005-10-21 20:04:41 +00008020 ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
8021 ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
8022 vty_out (vty, " timers throttle spf %d %d %d%s",
paul88d6cf32005-10-29 12:50:09 +00008023 ospf->spf_delay, ospf->spf_holdtime,
paulea4ffc92005-10-21 20:04:41 +00008024 ospf->spf_max_holdtime, VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00008025
8026 /* Max-metric router-lsa print */
8027 config_write_stub_router (vty, ospf);
8028
paul718e3742002-12-13 20:15:29 +00008029 /* SPF refresh parameters print. */
paul68980082003-03-25 05:07:42 +00008030 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
paul718e3742002-12-13 20:15:29 +00008031 vty_out (vty, " refresh timer %d%s",
paul68980082003-03-25 05:07:42 +00008032 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00008033
8034 /* Redistribute information print. */
paul68980082003-03-25 05:07:42 +00008035 config_write_ospf_redistribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008036
8037 /* passive-interface print. */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008038 if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
8039 vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
8040
paul1eb8ef22005-04-07 07:30:20 +00008041 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008042 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
8043 && IF_DEF_PARAMS (ifp)->passive_interface !=
8044 ospf->passive_interface_default)
8045 {
8046 vty_out (vty, " %spassive-interface %s%s",
8047 IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
8048 ifp->name, VTY_NEWLINE);
8049 }
paul1eb8ef22005-04-07 07:30:20 +00008050 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008051 {
8052 if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
8053 continue;
8054 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
8055 passive_interface))
8056 {
8057 if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
8058 continue;
8059 }
8060 else if (oi->params->passive_interface == ospf->passive_interface_default)
8061 continue;
8062
8063 vty_out (vty, " %spassive-interface %s %s%s",
8064 oi->params->passive_interface ? "" : "no ",
paul1eb8ef22005-04-07 07:30:20 +00008065 oi->ifp->name,
8066 inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008067 }
paul718e3742002-12-13 20:15:29 +00008068
8069 /* Network area print. */
paul68980082003-03-25 05:07:42 +00008070 config_write_network_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008071
8072 /* Area config print. */
paul68980082003-03-25 05:07:42 +00008073 config_write_ospf_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008074
8075 /* static neighbor print. */
paul68980082003-03-25 05:07:42 +00008076 config_write_ospf_nbr_nbma (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008077
8078 /* Virtual-Link print. */
paul68980082003-03-25 05:07:42 +00008079 config_write_virtual_link (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008080
8081 /* Default metric configuration. */
paul68980082003-03-25 05:07:42 +00008082 config_write_ospf_default_metric (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008083
8084 /* Distribute-list and default-information print. */
paul68980082003-03-25 05:07:42 +00008085 config_write_ospf_distribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008086
8087 /* Distance configuration. */
paul68980082003-03-25 05:07:42 +00008088 config_write_ospf_distance (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008089
8090#ifdef HAVE_OPAQUE_LSA
paul68980082003-03-25 05:07:42 +00008091 ospf_opaque_config_write_router (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008092#endif /* HAVE_OPAQUE_LSA */
8093 }
8094
8095 return write;
8096}
8097
8098void
paul4dadc292005-05-06 21:37:42 +00008099ospf_vty_show_init (void)
paul718e3742002-12-13 20:15:29 +00008100{
8101 /* "show ip ospf" commands. */
8102 install_element (VIEW_NODE, &show_ip_ospf_cmd);
8103 install_element (ENABLE_NODE, &show_ip_ospf_cmd);
8104
8105 /* "show ip ospf database" commands. */
8106 install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
8107 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
8108 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8109 install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8110 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
8111 install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
8112 install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
8113 install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
8114 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
8115 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8116 install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8117 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
8118 install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
8119 install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
8120
8121 /* "show ip ospf interface" commands. */
8122 install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
8123 install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
8124
8125 /* "show ip ospf neighbor" commands. */
8126 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8127 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
8128 install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
8129 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8130 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
8131 install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
8132 install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
8133 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8134 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
8135 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
8136 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8137 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
8138 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
8139 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
8140
8141 /* "show ip ospf route" commands. */
8142 install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
8143 install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
paul718e3742002-12-13 20:15:29 +00008144 install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
8145 install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
paul718e3742002-12-13 20:15:29 +00008146}
8147
8148
8149/* ospfd's interface node. */
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08008150static struct cmd_node interface_node =
paul718e3742002-12-13 20:15:29 +00008151{
8152 INTERFACE_NODE,
8153 "%s(config-if)# ",
8154 1
8155};
8156
8157/* Initialization of OSPF interface. */
paul4dadc292005-05-06 21:37:42 +00008158static void
8159ospf_vty_if_init (void)
paul718e3742002-12-13 20:15:29 +00008160{
8161 /* Install interface node. */
8162 install_node (&interface_node, config_write_interface);
8163
8164 install_element (CONFIG_NODE, &interface_cmd);
paul32d24632003-05-23 09:25:20 +00008165 install_element (CONFIG_NODE, &no_interface_cmd);
paul718e3742002-12-13 20:15:29 +00008166 install_default (INTERFACE_NODE);
8167
8168 /* "description" commands. */
8169 install_element (INTERFACE_NODE, &interface_desc_cmd);
8170 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
8171
8172 /* "ip ospf authentication" commands. */
8173 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
8174 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
8175 install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
8176 install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
8177 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
8178 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
8179 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
8180 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
8181 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
8182 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
8183
8184 /* "ip ospf message-digest-key" commands. */
8185 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
8186 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
8187 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
8188 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
8189
8190 /* "ip ospf cost" commands. */
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008191 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
8192 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04008193 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
8194 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008195 install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008196 install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
8197
vincentba682532005-09-29 13:52:57 +00008198 /* "ip ospf mtu-ignore" commands. */
8199 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
8200 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
8201 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
8202 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
8203
paul718e3742002-12-13 20:15:29 +00008204 /* "ip ospf dead-interval" commands. */
8205 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
8206 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008207 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
8208 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
paul718e3742002-12-13 20:15:29 +00008209 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
8210 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008211
paul718e3742002-12-13 20:15:29 +00008212 /* "ip ospf hello-interval" commands. */
8213 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
8214 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
8215 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
8216 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
8217
8218 /* "ip ospf network" commands. */
8219 install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
8220 install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
8221
8222 /* "ip ospf priority" commands. */
8223 install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
8224 install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
8225 install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
8226 install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
8227
8228 /* "ip ospf retransmit-interval" commands. */
8229 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
8230 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
8231 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
8232 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
8233
8234 /* "ip ospf transmit-delay" commands. */
8235 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
8236 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
8237 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
8238 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
8239
8240 /* These commands are compatibitliy for previous version. */
8241 install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
8242 install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
8243 install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
8244 install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008245 install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
8246 install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008247 install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04008248 install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
8249 install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008250 install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008251 install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
8252 install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
8253 install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
8254 install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
8255 install_element (INTERFACE_NODE, &ospf_network_cmd);
8256 install_element (INTERFACE_NODE, &no_ospf_network_cmd);
8257 install_element (INTERFACE_NODE, &ospf_priority_cmd);
8258 install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
8259 install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
8260 install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
8261 install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
8262 install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
8263}
8264
paul4dadc292005-05-06 21:37:42 +00008265static void
8266ospf_vty_zebra_init (void)
paul718e3742002-12-13 20:15:29 +00008267{
8268 install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
8269 install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
8270 install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
8271 install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
8272 install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
8273 install_element (OSPF_NODE,
8274 &ospf_redistribute_source_metric_type_routemap_cmd);
8275 install_element (OSPF_NODE,
8276 &ospf_redistribute_source_type_metric_routemap_cmd);
8277 install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
8278 install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
8279 install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
8280
8281 install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
8282
8283 install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
8284 install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
8285
8286 install_element (OSPF_NODE,
8287 &ospf_default_information_originate_metric_type_cmd);
8288 install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
8289 install_element (OSPF_NODE,
8290 &ospf_default_information_originate_type_metric_cmd);
8291 install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
8292 install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
8293 install_element (OSPF_NODE,
8294 &ospf_default_information_originate_always_metric_type_cmd);
8295 install_element (OSPF_NODE,
8296 &ospf_default_information_originate_always_metric_cmd);
8297 install_element (OSPF_NODE,
8298 &ospf_default_information_originate_always_cmd);
8299 install_element (OSPF_NODE,
8300 &ospf_default_information_originate_always_type_metric_cmd);
8301 install_element (OSPF_NODE,
8302 &ospf_default_information_originate_always_type_cmd);
8303
8304 install_element (OSPF_NODE,
8305 &ospf_default_information_originate_metric_type_routemap_cmd);
8306 install_element (OSPF_NODE,
8307 &ospf_default_information_originate_metric_routemap_cmd);
8308 install_element (OSPF_NODE,
8309 &ospf_default_information_originate_routemap_cmd);
8310 install_element (OSPF_NODE,
8311 &ospf_default_information_originate_type_metric_routemap_cmd);
8312 install_element (OSPF_NODE,
8313 &ospf_default_information_originate_type_routemap_cmd);
8314 install_element (OSPF_NODE,
8315 &ospf_default_information_originate_always_metric_type_routemap_cmd);
8316 install_element (OSPF_NODE,
8317 &ospf_default_information_originate_always_metric_routemap_cmd);
8318 install_element (OSPF_NODE,
8319 &ospf_default_information_originate_always_routemap_cmd);
8320 install_element (OSPF_NODE,
8321 &ospf_default_information_originate_always_type_metric_routemap_cmd);
8322 install_element (OSPF_NODE,
8323 &ospf_default_information_originate_always_type_routemap_cmd);
8324
8325 install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
8326
8327 install_element (OSPF_NODE, &ospf_default_metric_cmd);
8328 install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
8329 install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
8330
8331 install_element (OSPF_NODE, &ospf_distance_cmd);
8332 install_element (OSPF_NODE, &no_ospf_distance_cmd);
8333 install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
8334 install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
8335 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
8336 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
8337 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
8338 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
8339 install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
8340 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
8341 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
8342 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
8343 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
8344 install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
8345 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
8346 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
8347 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
8348 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
8349#if 0
8350 install_element (OSPF_NODE, &ospf_distance_source_cmd);
8351 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
8352 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
8353 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
8354#endif /* 0 */
8355}
8356
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08008357static struct cmd_node ospf_node =
paul718e3742002-12-13 20:15:29 +00008358{
8359 OSPF_NODE,
8360 "%s(config-router)# ",
8361 1
8362};
8363
8364
8365/* Install OSPF related vty commands. */
8366void
paul4dadc292005-05-06 21:37:42 +00008367ospf_vty_init (void)
paul718e3742002-12-13 20:15:29 +00008368{
8369 /* Install ospf top node. */
8370 install_node (&ospf_node, ospf_config_write);
8371
8372 /* "router ospf" commands. */
8373 install_element (CONFIG_NODE, &router_ospf_cmd);
8374 install_element (CONFIG_NODE, &no_router_ospf_cmd);
8375
8376 install_default (OSPF_NODE);
8377
8378 /* "ospf router-id" commands. */
8379 install_element (OSPF_NODE, &ospf_router_id_cmd);
8380 install_element (OSPF_NODE, &no_ospf_router_id_cmd);
paula2c62832003-04-23 17:01:31 +00008381 install_element (OSPF_NODE, &router_ospf_id_cmd);
8382 install_element (OSPF_NODE, &no_router_ospf_id_cmd);
paul718e3742002-12-13 20:15:29 +00008383
8384 /* "passive-interface" commands. */
paula2c62832003-04-23 17:01:31 +00008385 install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
8386 install_element (OSPF_NODE, &ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008387 install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
paula2c62832003-04-23 17:01:31 +00008388 install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
8389 install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008390 install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
paul718e3742002-12-13 20:15:29 +00008391
8392 /* "ospf abr-type" commands. */
8393 install_element (OSPF_NODE, &ospf_abr_type_cmd);
8394 install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
8395
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00008396 /* "ospf log-adjacency-changes" commands. */
8397 install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
8398 install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
8399 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
8400 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
8401
paul718e3742002-12-13 20:15:29 +00008402 /* "ospf rfc1583-compatible" commands. */
8403 install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
8404 install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
8405 install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
8406 install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
8407
8408 /* "network area" commands. */
paula2c62832003-04-23 17:01:31 +00008409 install_element (OSPF_NODE, &ospf_network_area_cmd);
8410 install_element (OSPF_NODE, &no_ospf_network_area_cmd);
paul718e3742002-12-13 20:15:29 +00008411
8412 /* "area authentication" commands. */
paula2c62832003-04-23 17:01:31 +00008413 install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
8414 install_element (OSPF_NODE, &ospf_area_authentication_cmd);
8415 install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
paul718e3742002-12-13 20:15:29 +00008416
8417 /* "area range" commands. */
paula2c62832003-04-23 17:01:31 +00008418 install_element (OSPF_NODE, &ospf_area_range_cmd);
8419 install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
8420 install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
8421 install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
8422 install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
8423 install_element (OSPF_NODE, &no_ospf_area_range_cmd);
8424 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
8425 install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
8426 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
8427 install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
8428 install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
paul718e3742002-12-13 20:15:29 +00008429
8430 /* "area virtual-link" commands. */
paula2c62832003-04-23 17:01:31 +00008431 install_element (OSPF_NODE, &ospf_area_vlink_cmd);
8432 install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
paul718e3742002-12-13 20:15:29 +00008433
paula2c62832003-04-23 17:01:31 +00008434 install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
8435 install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
paul718e3742002-12-13 20:15:29 +00008436
paula2c62832003-04-23 17:01:31 +00008437 install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
8438 install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
paul718e3742002-12-13 20:15:29 +00008439
paula2c62832003-04-23 17:01:31 +00008440 install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
8441 install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
paul718e3742002-12-13 20:15:29 +00008442
paula2c62832003-04-23 17:01:31 +00008443 install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
8444 install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
paul718e3742002-12-13 20:15:29 +00008445
paula2c62832003-04-23 17:01:31 +00008446 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
8447 install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
8448 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
paul718e3742002-12-13 20:15:29 +00008449
paula2c62832003-04-23 17:01:31 +00008450 install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
8451 install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008452
paula2c62832003-04-23 17:01:31 +00008453 install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
8454 install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008455
paula2c62832003-04-23 17:01:31 +00008456 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
8457 install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
8458 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008459
paula2c62832003-04-23 17:01:31 +00008460 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
8461 install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
8462 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008463
8464 /* "area stub" commands. */
paula2c62832003-04-23 17:01:31 +00008465 install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
8466 install_element (OSPF_NODE, &ospf_area_stub_cmd);
8467 install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
8468 install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
paul718e3742002-12-13 20:15:29 +00008469
paul718e3742002-12-13 20:15:29 +00008470 /* "area nssa" commands. */
paula2c62832003-04-23 17:01:31 +00008471 install_element (OSPF_NODE, &ospf_area_nssa_cmd);
8472 install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
8473 install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
8474 install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
8475 install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
8476 install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
paul718e3742002-12-13 20:15:29 +00008477
paula2c62832003-04-23 17:01:31 +00008478 install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
8479 install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
paul718e3742002-12-13 20:15:29 +00008480
paula2c62832003-04-23 17:01:31 +00008481 install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
8482 install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
paul718e3742002-12-13 20:15:29 +00008483
paula2c62832003-04-23 17:01:31 +00008484 install_element (OSPF_NODE, &ospf_area_export_list_cmd);
8485 install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
paul718e3742002-12-13 20:15:29 +00008486
paula2c62832003-04-23 17:01:31 +00008487 install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
8488 install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
paul718e3742002-12-13 20:15:29 +00008489
paula2c62832003-04-23 17:01:31 +00008490 install_element (OSPF_NODE, &ospf_area_import_list_cmd);
8491 install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
paul88d6cf32005-10-29 12:50:09 +00008492
8493 /* SPF timer commands */
paula2c62832003-04-23 17:01:31 +00008494 install_element (OSPF_NODE, &ospf_timers_spf_cmd);
8495 install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
pauld24f6e22005-10-21 09:23:12 +00008496 install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
8497 install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
8498
paul88d6cf32005-10-29 12:50:09 +00008499 /* refresh timer commands */
paula2c62832003-04-23 17:01:31 +00008500 install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
8501 install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
8502 install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
paul718e3742002-12-13 20:15:29 +00008503
paul88d6cf32005-10-29 12:50:09 +00008504 /* max-metric commands */
8505 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
8506 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
8507 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
8508 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
8509 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
8510 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
8511
8512 /* reference bandwidth commands */
paula2c62832003-04-23 17:01:31 +00008513 install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
8514 install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
paul718e3742002-12-13 20:15:29 +00008515
8516 /* "neighbor" commands. */
paula2c62832003-04-23 17:01:31 +00008517 install_element (OSPF_NODE, &ospf_neighbor_cmd);
8518 install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
8519 install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
8520 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
8521 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
8522 install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
8523 install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
8524 install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
paul718e3742002-12-13 20:15:29 +00008525
8526 /* Init interface related vty commands. */
8527 ospf_vty_if_init ();
8528
8529 /* Init zebra related vty commands. */
8530 ospf_vty_zebra_init ();
8531}