blob: 912f1d09c847547a9a7e71616c2bf203bef1e212 [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
hassoeb1ce602004-10-08 08:17:22 +000053const static 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
paula2c62832003-04-23 17:01:31 +0000252DEFUN (ospf_passive_interface,
253 ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000254 "passive-interface IFNAME A.B.C.D",
255 "Suppress routing updates on an interface\n"
256 "Interface's name\n")
257{
258 struct interface *ifp;
259 struct in_addr addr;
260 int ret;
261 struct ospf_if_params *params;
ajsba6454e2005-02-08 15:37:30 +0000262 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +0000263
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000264 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000265
266 params = IF_DEF_PARAMS (ifp);
267
268 if (argc == 2)
269 {
270 ret = inet_aton(argv[1], &addr);
271 if (!ret)
272 {
273 vty_out (vty, "Please specify interface address by A.B.C.D%s",
274 VTY_NEWLINE);
275 return CMD_WARNING;
276 }
277
278 params = ospf_get_if_params (ifp, addr);
279 ospf_if_update_params (ifp, addr);
280 }
281
282 SET_IF_PARAM (params, passive_interface);
283 params->passive_interface = OSPF_IF_PASSIVE;
ajsba6454e2005-02-08 15:37:30 +0000284
285 /* XXX We should call ospf_if_set_multicast on exactly those
286 * interfaces for which the passive property changed. It is too much
287 * work to determine this set, so we do this for every interface.
288 * This is safe and reasonable because ospf_if_set_multicast uses a
289 * record of joined groups to avoid systems calls if the desired
290 * memberships match the current memership.
291 */
292 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
293 {
294 struct ospf_interface *oi = rn->info;
295
296 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
297 ospf_if_set_multicast(oi);
298 }
299 /*
300 * XXX It is not clear what state transitions the interface needs to
301 * undergo when going from active to passive. Fixing this will
302 * require precise identification of interfaces having such a
303 * transition.
304 */
305
paul718e3742002-12-13 20:15:29 +0000306 return CMD_SUCCESS;
307}
308
paula2c62832003-04-23 17:01:31 +0000309ALIAS (ospf_passive_interface,
310 ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000311 "passive-interface IFNAME",
312 "Suppress routing updates on an interface\n"
313 "Interface's name\n")
314
paula2c62832003-04-23 17:01:31 +0000315DEFUN (no_ospf_passive_interface,
316 no_ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000317 "no passive-interface IFNAME A.B.C.D",
318 NO_STR
319 "Allow routing updates on an interface\n"
320 "Interface's name\n")
321{
322 struct interface *ifp;
323 struct in_addr addr;
324 struct ospf_if_params *params;
325 int ret;
ajsba6454e2005-02-08 15:37:30 +0000326 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +0000327
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000328 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000329
330 params = IF_DEF_PARAMS (ifp);
331
332 if (argc == 2)
333 {
334 ret = inet_aton(argv[1], &addr);
335 if (!ret)
336 {
337 vty_out (vty, "Please specify interface address by A.B.C.D%s",
338 VTY_NEWLINE);
339 return CMD_WARNING;
340 }
341
342 params = ospf_lookup_if_params (ifp, addr);
343 if (params == NULL)
344 return CMD_SUCCESS;
345 }
346
347 UNSET_IF_PARAM (params, passive_interface);
348 params->passive_interface = OSPF_IF_ACTIVE;
349
350 if (params != IF_DEF_PARAMS (ifp))
351 {
352 ospf_free_if_params (ifp, addr);
353 ospf_if_update_params (ifp, addr);
354 }
ajsba6454e2005-02-08 15:37:30 +0000355
356 /* XXX We should call ospf_if_set_multicast on exactly those
357 * interfaces for which the passive property changed. It is too much
358 * work to determine this set, so we do this for every interface.
359 * This is safe and reasonable because ospf_if_set_multicast uses a
360 * record of joined groups to avoid systems calls if the desired
361 * memberships match the current memership.
362 */
363 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
364 {
365 struct ospf_interface *oi = rn->info;
366
367 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
368 ospf_if_set_multicast(oi);
369 }
370
paul718e3742002-12-13 20:15:29 +0000371 return CMD_SUCCESS;
372}
373
paula2c62832003-04-23 17:01:31 +0000374ALIAS (no_ospf_passive_interface,
375 no_ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000376 "no passive-interface IFNAME",
377 NO_STR
378 "Allow routing updates on an interface\n"
379 "Interface's name\n")
380
paula2c62832003-04-23 17:01:31 +0000381DEFUN (ospf_network_area,
382 ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000383 "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
384 "Enable routing on an IP network\n"
385 "OSPF network prefix\n"
386 "Set the OSPF area ID\n"
387 "OSPF area ID in IP address format\n"
388 "OSPF area ID as a decimal value\n")
389{
390 struct ospf *ospf= vty->index;
391 struct prefix_ipv4 p;
392 struct in_addr area_id;
393 int ret, format;
394
395 /* Get network prefix and Area ID. */
396 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
397 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
398
399 ret = ospf_network_set (ospf, &p, area_id);
400 if (ret == 0)
401 {
402 vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
403 return CMD_WARNING;
404 }
405
406 return CMD_SUCCESS;
407}
408
paula2c62832003-04-23 17:01:31 +0000409DEFUN (no_ospf_network_area,
410 no_ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000411 "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
412 NO_STR
413 "Enable routing on an IP network\n"
414 "OSPF network prefix\n"
415 "Set the OSPF area ID\n"
416 "OSPF area ID in IP address format\n"
417 "OSPF area ID as a decimal value\n")
418{
419 struct ospf *ospf = (struct ospf *) vty->index;
420 struct prefix_ipv4 p;
421 struct in_addr area_id;
422 int ret, format;
423
424 /* Get network prefix and Area ID. */
425 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
426 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
427
428 ret = ospf_network_unset (ospf, &p, area_id);
429 if (ret == 0)
430 {
431 vty_out (vty, "Can't find specified network area configuration.%s",
432 VTY_NEWLINE);
433 return CMD_WARNING;
434 }
435
436 return CMD_SUCCESS;
437}
438
439
paula2c62832003-04-23 17:01:31 +0000440DEFUN (ospf_area_range,
441 ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000442 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
443 "OSPF area parameters\n"
444 "OSPF area ID in IP address format\n"
445 "OSPF area ID as a decimal value\n"
446 "Summarize routes matching address/mask (border routers only)\n"
447 "Area range prefix\n")
448{
449 struct ospf *ospf = vty->index;
450 struct prefix_ipv4 p;
451 struct in_addr area_id;
452 int format;
453 u_int32_t cost;
454
455 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
456 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
457
458 ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
459 if (argc > 2)
460 {
paul4dadc292005-05-06 21:37:42 +0000461 VTY_GET_INTEGER ("range cost", cost, argv[2]);
paul718e3742002-12-13 20:15:29 +0000462 ospf_area_range_cost_set (ospf, area_id, &p, cost);
463 }
464
465 return CMD_SUCCESS;
466}
467
paula2c62832003-04-23 17:01:31 +0000468ALIAS (ospf_area_range,
469 ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000470 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
471 "OSPF area parameters\n"
472 "OSPF area ID in IP address format\n"
473 "OSPF area ID as a decimal value\n"
474 "OSPF area range for route advertise (default)\n"
475 "Area range prefix\n"
476 "Advertise this range (default)\n")
477
paula2c62832003-04-23 17:01:31 +0000478ALIAS (ospf_area_range,
479 ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000480 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
481 "OSPF area parameters\n"
482 "OSPF area ID in IP address format\n"
483 "OSPF area ID as a decimal value\n"
484 "Summarize routes matching address/mask (border routers only)\n"
485 "Area range prefix\n"
486 "User specified metric for this range\n"
487 "Advertised metric for this range\n")
488
paula2c62832003-04-23 17:01:31 +0000489ALIAS (ospf_area_range,
490 ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000491 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
492 "OSPF area parameters\n"
493 "OSPF area ID in IP address format\n"
494 "OSPF area ID as a decimal value\n"
495 "Summarize routes matching address/mask (border routers only)\n"
496 "Area range prefix\n"
497 "Advertise this range (default)\n"
498 "User specified metric for this range\n"
499 "Advertised metric for this range\n")
500
paula2c62832003-04-23 17:01:31 +0000501DEFUN (ospf_area_range_not_advertise,
502 ospf_area_range_not_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000503 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
504 "OSPF area parameters\n"
505 "OSPF area ID in IP address format\n"
506 "OSPF area ID as a decimal value\n"
507 "Summarize routes matching address/mask (border routers only)\n"
508 "Area range prefix\n"
509 "DoNotAdvertise this range\n")
510{
511 struct ospf *ospf = vty->index;
512 struct prefix_ipv4 p;
513 struct in_addr area_id;
514 int format;
515
516 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
517 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
518
519 ospf_area_range_set (ospf, area_id, &p, 0);
520
521 return CMD_SUCCESS;
522}
523
paula2c62832003-04-23 17:01:31 +0000524DEFUN (no_ospf_area_range,
525 no_ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000526 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
527 NO_STR
528 "OSPF area parameters\n"
529 "OSPF area ID in IP address format\n"
530 "OSPF area ID as a decimal value\n"
531 "Summarize routes matching address/mask (border routers only)\n"
532 "Area range prefix\n")
533{
534 struct ospf *ospf = vty->index;
535 struct prefix_ipv4 p;
536 struct in_addr area_id;
537 int format;
538
539 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
540 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
541
542 ospf_area_range_unset (ospf, area_id, &p);
543
544 return CMD_SUCCESS;
545}
546
paula2c62832003-04-23 17:01:31 +0000547ALIAS (no_ospf_area_range,
548 no_ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000549 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
550 NO_STR
551 "OSPF area parameters\n"
552 "OSPF area ID in IP address format\n"
553 "OSPF area ID as a decimal value\n"
554 "Summarize routes matching address/mask (border routers only)\n"
555 "Area range prefix\n"
556 "Advertise this range (default)\n"
557 "DoNotAdvertise this range\n")
558
paula2c62832003-04-23 17:01:31 +0000559ALIAS (no_ospf_area_range,
560 no_ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000561 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
562 NO_STR
563 "OSPF area parameters\n"
564 "OSPF area ID in IP address format\n"
565 "OSPF area ID as a decimal value\n"
566 "Summarize routes matching address/mask (border routers only)\n"
567 "Area range prefix\n"
568 "User specified metric for this range\n"
569 "Advertised metric for this range\n")
570
paula2c62832003-04-23 17:01:31 +0000571ALIAS (no_ospf_area_range,
572 no_ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000573 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
574 NO_STR
575 "OSPF area parameters\n"
576 "OSPF area ID in IP address format\n"
577 "OSPF area ID as a decimal value\n"
578 "Summarize routes matching address/mask (border routers only)\n"
579 "Area range prefix\n"
580 "Advertise this range (default)\n"
581 "User specified metric for this range\n"
582 "Advertised metric for this range\n")
583
paula2c62832003-04-23 17:01:31 +0000584DEFUN (ospf_area_range_substitute,
585 ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000586 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
587 "OSPF area parameters\n"
588 "OSPF area ID in IP address format\n"
589 "OSPF area ID as a decimal value\n"
590 "Summarize routes matching address/mask (border routers only)\n"
591 "Area range prefix\n"
592 "Announce area range as another prefix\n"
593 "Network prefix to be announced instead of range\n")
594{
595 struct ospf *ospf = vty->index;
596 struct prefix_ipv4 p, s;
597 struct in_addr area_id;
598 int format;
599
600 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
601 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
602 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
603
604 ospf_area_range_substitute_set (ospf, area_id, &p, &s);
605
606 return CMD_SUCCESS;
607}
608
paula2c62832003-04-23 17:01:31 +0000609DEFUN (no_ospf_area_range_substitute,
610 no_ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000611 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
612 NO_STR
613 "OSPF area parameters\n"
614 "OSPF area ID in IP address format\n"
615 "OSPF area ID as a decimal value\n"
616 "Summarize routes matching address/mask (border routers only)\n"
617 "Area range prefix\n"
618 "Announce area range as another prefix\n"
619 "Network prefix to be announced instead of range\n")
620{
621 struct ospf *ospf = vty->index;
622 struct prefix_ipv4 p, s;
623 struct in_addr area_id;
624 int format;
625
626 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
627 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
628 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
629
630 ospf_area_range_substitute_unset (ospf, area_id, &p);
631
632 return CMD_SUCCESS;
633}
634
635
636/* Command Handler Logic in VLink stuff is delicate!!
637
638 ALTER AT YOUR OWN RISK!!!!
639
640 Various dummy values are used to represent 'NoChange' state for
641 VLink configuration NOT being changed by a VLink command, and
642 special syntax is used within the command strings so that the
643 typed in command verbs can be seen in the configuration command
644 bacckend handler. This is to drastically reduce the verbeage
645 required to coe up with a reasonably compatible Cisco VLink command
646
647 - Matthew Grant <grantma@anathoth.gen.nz>
648 Wed, 21 Feb 2001 15:13:52 +1300
649 */
650
651
652/* Configuration data for virtual links
653 */
654struct ospf_vl_config_data {
655 struct vty *vty; /* vty stuff */
656 struct in_addr area_id; /* area ID from command line */
657 int format; /* command line area ID format */
658 struct in_addr vl_peer; /* command line vl_peer */
659 int auth_type; /* Authehntication type, if given */
660 char *auth_key; /* simple password if present */
661 int crypto_key_id; /* Cryptographic key ID */
662 char *md5_key; /* MD5 authentication key */
663 int hello_interval; /* Obvious what these are... */
664 int retransmit_interval;
665 int transmit_delay;
666 int dead_interval;
667};
668
paul4dadc292005-05-06 21:37:42 +0000669static void
paul718e3742002-12-13 20:15:29 +0000670ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
671 struct vty *vty)
672{
673 memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
674 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
675 vl_config->vty = vty;
676}
677
paul4dadc292005-05-06 21:37:42 +0000678static struct ospf_vl_data *
paul68980082003-03-25 05:07:42 +0000679ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000680{
681 struct ospf_area *area;
682 struct ospf_vl_data *vl_data;
683 struct vty *vty;
684 struct in_addr area_id;
685
686 vty = vl_config->vty;
687 area_id = vl_config->area_id;
688
689 if (area_id.s_addr == OSPF_AREA_BACKBONE)
690 {
691 vty_out (vty,
692 "Configuring VLs over the backbone is not allowed%s",
693 VTY_NEWLINE);
694 return NULL;
695 }
paul68980082003-03-25 05:07:42 +0000696 area = ospf_area_get (ospf, area_id, vl_config->format);
paul718e3742002-12-13 20:15:29 +0000697
698 if (area->external_routing != OSPF_AREA_DEFAULT)
699 {
700 if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
701 vty_out (vty, "Area %s is %s%s",
702 inet_ntoa (area_id),
paul718e3742002-12-13 20:15:29 +0000703 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000704 VTY_NEWLINE);
705 else
706 vty_out (vty, "Area %ld is %s%s",
707 (u_long)ntohl (area_id.s_addr),
paul718e3742002-12-13 20:15:29 +0000708 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000709 VTY_NEWLINE);
710 return NULL;
711 }
712
Paul Jakma9c27ef92006-05-04 07:32:57 +0000713 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
paul718e3742002-12-13 20:15:29 +0000714 {
715 vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
716 if (vl_data->vl_oi == NULL)
717 {
paul68980082003-03-25 05:07:42 +0000718 vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
719 ospf_vl_add (ospf, vl_data);
720 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +0000721 }
722 }
723 return vl_data;
724}
725
726
paul4dadc292005-05-06 21:37:42 +0000727static int
paul718e3742002-12-13 20:15:29 +0000728ospf_vl_set_security (struct ospf_vl_data *vl_data,
729 struct ospf_vl_config_data *vl_config)
730{
731 struct crypt_key *ck;
732 struct vty *vty;
733 struct interface *ifp = vl_data->vl_oi->ifp;
734
735 vty = vl_config->vty;
736
737 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
738 {
739 SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
740 IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
741 }
742
743 if (vl_config->auth_key)
744 {
745 memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000746 strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
paul718e3742002-12-13 20:15:29 +0000747 OSPF_AUTH_SIMPLE_SIZE);
748 }
749 else if (vl_config->md5_key)
750 {
751 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
752 != NULL)
753 {
754 vty_out (vty, "OSPF: Key %d already exists%s",
755 vl_config->crypto_key_id, VTY_NEWLINE);
756 return CMD_WARNING;
757 }
758 ck = ospf_crypt_key_new ();
759 ck->key_id = vl_config->crypto_key_id;
760 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000761 strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +0000762
763 ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
764 }
765 else if (vl_config->crypto_key_id != 0)
766 {
767 /* Delete a key */
768
769 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
770 vl_config->crypto_key_id) == NULL)
771 {
772 vty_out (vty, "OSPF: Key %d does not exist%s",
773 vl_config->crypto_key_id, VTY_NEWLINE);
774 return CMD_WARNING;
775 }
776
777 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
778
779 }
780
781 return CMD_SUCCESS;
782}
783
paul4dadc292005-05-06 21:37:42 +0000784static int
paul718e3742002-12-13 20:15:29 +0000785ospf_vl_set_timers (struct ospf_vl_data *vl_data,
786 struct ospf_vl_config_data *vl_config)
787{
788 struct interface *ifp = ifp = vl_data->vl_oi->ifp;
789 /* Virtual Link data initialised to defaults, so only set
790 if a value given */
791 if (vl_config->hello_interval)
792 {
793 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
794 IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
795 }
796
797 if (vl_config->dead_interval)
798 {
799 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
800 IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
801 }
802
803 if (vl_config->retransmit_interval)
804 {
805 SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
806 IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
807 }
808
809 if (vl_config->transmit_delay)
810 {
811 SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
812 IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
813 }
814
815 return CMD_SUCCESS;
816}
817
818
819
820/* The business end of all of the above */
paul4dadc292005-05-06 21:37:42 +0000821static int
paul68980082003-03-25 05:07:42 +0000822ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000823{
824 struct ospf_vl_data *vl_data;
825 int ret;
826
paul68980082003-03-25 05:07:42 +0000827 vl_data = ospf_find_vl_data (ospf, vl_config);
paul718e3742002-12-13 20:15:29 +0000828 if (!vl_data)
829 return CMD_WARNING;
830
831 /* Process this one first as it can have a fatal result, which can
832 only logically occur if the virtual link exists already
833 Thus a command error does not result in a change to the
834 running configuration such as unexpectedly altered timer
835 values etc.*/
836 ret = ospf_vl_set_security (vl_data, vl_config);
837 if (ret != CMD_SUCCESS)
838 return ret;
839
840 /* Set any time based parameters, these area already range checked */
841
842 ret = ospf_vl_set_timers (vl_data, vl_config);
843 if (ret != CMD_SUCCESS)
844 return ret;
845
846 return CMD_SUCCESS;
847
848}
849
850/* This stuff exists to make specifying all the alias commands A LOT simpler
851 */
852#define VLINK_HELPSTR_IPADDR \
853 "OSPF area parameters\n" \
854 "OSPF area ID in IP address format\n" \
855 "OSPF area ID as a decimal value\n" \
856 "Configure a virtual link\n" \
857 "Router ID of the remote ABR\n"
858
859#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
860 "Enable authentication on this virtual link\n" \
861 "dummy string \n"
862
863#define VLINK_HELPSTR_AUTHTYPE_ALL \
864 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
865 "Use null authentication\n" \
866 "Use message-digest authentication\n"
867
868#define VLINK_HELPSTR_TIME_PARAM_NOSECS \
869 "Time between HELLO packets\n" \
870 "Time between retransmitting lost link state advertisements\n" \
871 "Link state transmit delay\n" \
872 "Interval after which a neighbor is declared dead\n"
873
874#define VLINK_HELPSTR_TIME_PARAM \
875 VLINK_HELPSTR_TIME_PARAM_NOSECS \
876 "Seconds\n"
877
878#define VLINK_HELPSTR_AUTH_SIMPLE \
879 "Authentication password (key)\n" \
880 "The OSPF password (key)"
881
882#define VLINK_HELPSTR_AUTH_MD5 \
883 "Message digest authentication password (key)\n" \
884 "dummy string \n" \
885 "Key ID\n" \
886 "Use MD5 algorithm\n" \
887 "The OSPF password (key)"
888
paula2c62832003-04-23 17:01:31 +0000889DEFUN (ospf_area_vlink,
890 ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +0000891 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
892 VLINK_HELPSTR_IPADDR)
893{
paul68980082003-03-25 05:07:42 +0000894 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000895 struct ospf_vl_config_data vl_config;
896 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
897 char md5_key[OSPF_AUTH_MD5_SIZE+1];
898 int i;
899 int ret;
900
901 ospf_vl_config_data_init(&vl_config, vty);
902
903 /* Read off first 2 parameters and check them */
904 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
905 if (ret < 0)
906 {
907 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
908 return CMD_WARNING;
909 }
910
911 ret = inet_aton (argv[1], &vl_config.vl_peer);
912 if (! ret)
913 {
914 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
915 VTY_NEWLINE);
916 return CMD_WARNING;
917 }
918
919 if (argc <=2)
920 {
921 /* Thats all folks! - BUGS B. strikes again!!!*/
922
paul68980082003-03-25 05:07:42 +0000923 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +0000924 }
925
926 /* Deal with other parameters */
927 for (i=2; i < argc; i++)
928 {
929
930 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
931
932 switch (argv[i][0])
933 {
934
935 case 'a':
936 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
937 {
938 /* authentication-key - this option can occur anywhere on
939 command line. At start of command line
940 must check for authentication option. */
941 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
942 strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
943 vl_config.auth_key = auth_key;
944 i++;
945 }
946 else if (strncmp (argv[i], "authentication", 14) == 0)
947 {
948 /* authentication - this option can only occur at start
949 of command line */
950 vl_config.auth_type = OSPF_AUTH_SIMPLE;
951 if ((i+1) < argc)
952 {
953 if (strncmp (argv[i+1], "n", 1) == 0)
954 {
955 /* "authentication null" */
956 vl_config.auth_type = OSPF_AUTH_NULL;
957 i++;
958 }
959 else if (strncmp (argv[i+1], "m", 1) == 0
960 && strcmp (argv[i+1], "message-digest-") != 0)
961 {
962 /* "authentication message-digest" */
963 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
964 i++;
965 }
966 }
967 }
968 break;
969
970 case 'm':
971 /* message-digest-key */
972 i++;
973 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
974 if (vl_config.crypto_key_id < 0)
975 return CMD_WARNING;
976 i++;
977 memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
978 strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
979 vl_config.md5_key = md5_key;
980 break;
981
982 case 'h':
983 /* Hello interval */
984 i++;
985 vl_config.hello_interval = strtol (argv[i], NULL, 10);
986 if (vl_config.hello_interval < 0)
987 return CMD_WARNING;
988 break;
989
990 case 'r':
991 /* Retransmit Interval */
992 i++;
993 vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
994 if (vl_config.retransmit_interval < 0)
995 return CMD_WARNING;
996 break;
997
998 case 't':
999 /* Transmit Delay */
1000 i++;
1001 vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1002 if (vl_config.transmit_delay < 0)
1003 return CMD_WARNING;
1004 break;
1005
1006 case 'd':
1007 /* Dead Interval */
1008 i++;
1009 vl_config.dead_interval = strtol (argv[i], NULL, 10);
1010 if (vl_config.dead_interval < 0)
1011 return CMD_WARNING;
1012 break;
1013 }
1014 }
1015
1016
1017 /* Action configuration */
1018
paul68980082003-03-25 05:07:42 +00001019 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001020
1021}
1022
paula2c62832003-04-23 17:01:31 +00001023DEFUN (no_ospf_area_vlink,
1024 no_ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +00001025 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1026 NO_STR
1027 VLINK_HELPSTR_IPADDR)
1028{
paul68980082003-03-25 05:07:42 +00001029 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001030 struct ospf_area *area;
1031 struct ospf_vl_config_data vl_config;
1032 struct ospf_vl_data *vl_data = NULL;
1033 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1034 int i;
1035 int ret, format;
1036
1037 ospf_vl_config_data_init(&vl_config, vty);
1038
1039 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1040 if (ret < 0)
1041 {
1042 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1043 return CMD_WARNING;
1044 }
1045
paul68980082003-03-25 05:07:42 +00001046 area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001047 if (!area)
1048 {
1049 vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1050 return CMD_WARNING;
1051 }
1052
1053 ret = inet_aton (argv[1], &vl_config.vl_peer);
1054 if (! ret)
1055 {
1056 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1057 VTY_NEWLINE);
1058 return CMD_WARNING;
1059 }
1060
1061 if (argc <=2)
1062 {
1063 /* Basic VLink no command */
1064 /* Thats all folks! - BUGS B. strikes again!!!*/
Paul Jakma9c27ef92006-05-04 07:32:57 +00001065 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
paul68980082003-03-25 05:07:42 +00001066 ospf_vl_delete (ospf, vl_data);
paul718e3742002-12-13 20:15:29 +00001067
paul68980082003-03-25 05:07:42 +00001068 ospf_area_check_free (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001069
1070 return CMD_SUCCESS;
1071 }
1072
1073 /* If we are down here, we are reseting parameters */
1074
1075 /* Deal with other parameters */
1076 for (i=2; i < argc; i++)
1077 {
paul718e3742002-12-13 20:15:29 +00001078 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1079
1080 switch (argv[i][0])
1081 {
1082
1083 case 'a':
1084 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1085 {
1086 /* authentication-key - this option can occur anywhere on
1087 command line. At start of command line
1088 must check for authentication option. */
1089 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1090 vl_config.auth_key = auth_key;
1091 }
1092 else if (strncmp (argv[i], "authentication", 14) == 0)
1093 {
1094 /* authentication - this option can only occur at start
1095 of command line */
1096 vl_config.auth_type = OSPF_AUTH_NOTSET;
1097 }
1098 break;
1099
1100 case 'm':
1101 /* message-digest-key */
1102 /* Delete one key */
1103 i++;
1104 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1105 if (vl_config.crypto_key_id < 0)
1106 return CMD_WARNING;
1107 vl_config.md5_key = NULL;
1108 break;
1109
1110 case 'h':
1111 /* Hello interval */
1112 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1113 break;
1114
1115 case 'r':
1116 /* Retransmit Interval */
1117 vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1118 break;
1119
1120 case 't':
1121 /* Transmit Delay */
1122 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1123 break;
1124
1125 case 'd':
1126 /* Dead Interval */
1127 i++;
1128 vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1129 break;
1130 }
1131 }
1132
1133
1134 /* Action configuration */
1135
paul68980082003-03-25 05:07:42 +00001136 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001137}
1138
paula2c62832003-04-23 17:01:31 +00001139ALIAS (ospf_area_vlink,
1140 ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001141 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1142 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1143 VLINK_HELPSTR_IPADDR
1144 VLINK_HELPSTR_TIME_PARAM)
1145
paula2c62832003-04-23 17:01:31 +00001146ALIAS (no_ospf_area_vlink,
1147 no_ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001148 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1149 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1150 NO_STR
1151 VLINK_HELPSTR_IPADDR
1152 VLINK_HELPSTR_TIME_PARAM)
1153
paula2c62832003-04-23 17:01:31 +00001154ALIAS (ospf_area_vlink,
1155 ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001156 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1157 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1158 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1159 VLINK_HELPSTR_IPADDR
1160 VLINK_HELPSTR_TIME_PARAM
1161 VLINK_HELPSTR_TIME_PARAM)
1162
paula2c62832003-04-23 17:01:31 +00001163ALIAS (no_ospf_area_vlink,
1164 no_ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001165 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1166 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1167 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1168 NO_STR
1169 VLINK_HELPSTR_IPADDR
1170 VLINK_HELPSTR_TIME_PARAM
1171 VLINK_HELPSTR_TIME_PARAM)
1172
paula2c62832003-04-23 17:01:31 +00001173ALIAS (ospf_area_vlink,
1174 ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001175 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1176 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1177 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1178 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1179 VLINK_HELPSTR_IPADDR
1180 VLINK_HELPSTR_TIME_PARAM
1181 VLINK_HELPSTR_TIME_PARAM
1182 VLINK_HELPSTR_TIME_PARAM)
1183
paula2c62832003-04-23 17:01:31 +00001184ALIAS (no_ospf_area_vlink,
1185 no_ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001186 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1187 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1188 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1189 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1190 NO_STR
1191 VLINK_HELPSTR_IPADDR
1192 VLINK_HELPSTR_TIME_PARAM
1193 VLINK_HELPSTR_TIME_PARAM
1194 VLINK_HELPSTR_TIME_PARAM)
1195
paula2c62832003-04-23 17:01:31 +00001196ALIAS (ospf_area_vlink,
1197 ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001198 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1199 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1200 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1201 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1202 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1203 VLINK_HELPSTR_IPADDR
1204 VLINK_HELPSTR_TIME_PARAM
1205 VLINK_HELPSTR_TIME_PARAM
1206 VLINK_HELPSTR_TIME_PARAM
1207 VLINK_HELPSTR_TIME_PARAM)
1208
paula2c62832003-04-23 17:01:31 +00001209ALIAS (no_ospf_area_vlink,
1210 no_ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001211 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1212 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1213 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1214 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1215 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1216 NO_STR
1217 VLINK_HELPSTR_IPADDR
1218 VLINK_HELPSTR_TIME_PARAM
1219 VLINK_HELPSTR_TIME_PARAM
1220 VLINK_HELPSTR_TIME_PARAM
1221 VLINK_HELPSTR_TIME_PARAM)
1222
paula2c62832003-04-23 17:01:31 +00001223ALIAS (ospf_area_vlink,
1224 ospf_area_vlink_authtype_args_cmd,
paul718e3742002-12-13 20:15:29 +00001225 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1226 "(authentication|) (message-digest|null)",
1227 VLINK_HELPSTR_IPADDR
1228 VLINK_HELPSTR_AUTHTYPE_ALL)
1229
paula2c62832003-04-23 17:01:31 +00001230ALIAS (ospf_area_vlink,
1231 ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001232 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1233 "(authentication|)",
1234 VLINK_HELPSTR_IPADDR
1235 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1236
paula2c62832003-04-23 17:01:31 +00001237ALIAS (no_ospf_area_vlink,
1238 no_ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001239 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1240 "(authentication|)",
1241 NO_STR
1242 VLINK_HELPSTR_IPADDR
1243 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1244
paula2c62832003-04-23 17:01:31 +00001245ALIAS (ospf_area_vlink,
1246 ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001247 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1248 "(message-digest-key|) <1-255> md5 KEY",
1249 VLINK_HELPSTR_IPADDR
1250 VLINK_HELPSTR_AUTH_MD5)
1251
paula2c62832003-04-23 17:01:31 +00001252ALIAS (no_ospf_area_vlink,
1253 no_ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001254 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1255 "(message-digest-key|) <1-255>",
1256 NO_STR
1257 VLINK_HELPSTR_IPADDR
1258 VLINK_HELPSTR_AUTH_MD5)
1259
paula2c62832003-04-23 17:01:31 +00001260ALIAS (ospf_area_vlink,
1261 ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001262 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1263 "(authentication-key|) AUTH_KEY",
1264 VLINK_HELPSTR_IPADDR
1265 VLINK_HELPSTR_AUTH_SIMPLE)
1266
paula2c62832003-04-23 17:01:31 +00001267ALIAS (no_ospf_area_vlink,
1268 no_ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001269 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1270 "(authentication-key|)",
1271 NO_STR
1272 VLINK_HELPSTR_IPADDR
1273 VLINK_HELPSTR_AUTH_SIMPLE)
1274
paula2c62832003-04-23 17:01:31 +00001275ALIAS (ospf_area_vlink,
1276 ospf_area_vlink_authtype_args_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001277 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1278 "(authentication|) (message-digest|null) "
1279 "(authentication-key|) AUTH_KEY",
1280 VLINK_HELPSTR_IPADDR
1281 VLINK_HELPSTR_AUTHTYPE_ALL
1282 VLINK_HELPSTR_AUTH_SIMPLE)
1283
paula2c62832003-04-23 17:01:31 +00001284ALIAS (ospf_area_vlink,
1285 ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001286 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1287 "(authentication|) "
1288 "(authentication-key|) AUTH_KEY",
1289 VLINK_HELPSTR_IPADDR
1290 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1291 VLINK_HELPSTR_AUTH_SIMPLE)
1292
paula2c62832003-04-23 17:01:31 +00001293ALIAS (no_ospf_area_vlink,
1294 no_ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001295 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1296 "(authentication|) "
1297 "(authentication-key|)",
1298 NO_STR
1299 VLINK_HELPSTR_IPADDR
1300 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1301 VLINK_HELPSTR_AUTH_SIMPLE)
1302
paula2c62832003-04-23 17:01:31 +00001303ALIAS (ospf_area_vlink,
1304 ospf_area_vlink_authtype_args_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001305 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1306 "(authentication|) (message-digest|null) "
1307 "(message-digest-key|) <1-255> md5 KEY",
1308 VLINK_HELPSTR_IPADDR
1309 VLINK_HELPSTR_AUTHTYPE_ALL
1310 VLINK_HELPSTR_AUTH_MD5)
1311
paula2c62832003-04-23 17:01:31 +00001312ALIAS (ospf_area_vlink,
1313 ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001314 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1315 "(authentication|) "
1316 "(message-digest-key|) <1-255> md5 KEY",
1317 VLINK_HELPSTR_IPADDR
1318 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1319 VLINK_HELPSTR_AUTH_MD5)
1320
paula2c62832003-04-23 17:01:31 +00001321ALIAS (no_ospf_area_vlink,
1322 no_ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001323 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1324 "(authentication|) "
1325 "(message-digest-key|)",
1326 NO_STR
1327 VLINK_HELPSTR_IPADDR
1328 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1329 VLINK_HELPSTR_AUTH_MD5)
1330
1331
paula2c62832003-04-23 17:01:31 +00001332DEFUN (ospf_area_shortcut,
1333 ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001334 "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1335 "OSPF area parameters\n"
1336 "OSPF area ID in IP address format\n"
1337 "OSPF area ID as a decimal value\n"
1338 "Configure the area's shortcutting mode\n"
1339 "Set default shortcutting behavior\n"
1340 "Enable shortcutting through the area\n"
1341 "Disable shortcutting through the area\n")
1342{
paul68980082003-03-25 05:07:42 +00001343 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001344 struct ospf_area *area;
1345 struct in_addr area_id;
1346 int mode;
1347 int format;
1348
1349 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1350
paul68980082003-03-25 05:07:42 +00001351 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001352
1353 if (strncmp (argv[1], "de", 2) == 0)
1354 mode = OSPF_SHORTCUT_DEFAULT;
1355 else if (strncmp (argv[1], "di", 2) == 0)
1356 mode = OSPF_SHORTCUT_DISABLE;
1357 else if (strncmp (argv[1], "e", 1) == 0)
1358 mode = OSPF_SHORTCUT_ENABLE;
1359 else
1360 return CMD_WARNING;
1361
paul68980082003-03-25 05:07:42 +00001362 ospf_area_shortcut_set (ospf, area, mode);
paul718e3742002-12-13 20:15:29 +00001363
paul68980082003-03-25 05:07:42 +00001364 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
paul718e3742002-12-13 20:15:29 +00001365 vty_out (vty, "Shortcut area setting will take effect "
1366 "only when the router is configured as Shortcut ABR%s",
1367 VTY_NEWLINE);
1368
1369 return CMD_SUCCESS;
1370}
1371
paula2c62832003-04-23 17:01:31 +00001372DEFUN (no_ospf_area_shortcut,
1373 no_ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001374 "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1375 NO_STR
1376 "OSPF area parameters\n"
1377 "OSPF area ID in IP address format\n"
1378 "OSPF area ID as a decimal value\n"
1379 "Deconfigure the area's shortcutting mode\n"
1380 "Deconfigure enabled shortcutting through the area\n"
1381 "Deconfigure disabled shortcutting through the area\n")
1382{
paul68980082003-03-25 05:07:42 +00001383 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001384 struct ospf_area *area;
1385 struct in_addr area_id;
1386 int format;
1387
1388 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1389
paul68980082003-03-25 05:07:42 +00001390 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001391 if (!area)
1392 return CMD_SUCCESS;
1393
paul68980082003-03-25 05:07:42 +00001394 ospf_area_shortcut_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001395
1396 return CMD_SUCCESS;
1397}
1398
1399
paula2c62832003-04-23 17:01:31 +00001400DEFUN (ospf_area_stub,
1401 ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001402 "area (A.B.C.D|<0-4294967295>) stub",
1403 "OSPF area parameters\n"
1404 "OSPF area ID in IP address format\n"
1405 "OSPF area ID as a decimal value\n"
1406 "Configure OSPF area as stub\n")
1407{
1408 struct ospf *ospf = vty->index;
1409 struct in_addr area_id;
1410 int ret, format;
1411
1412 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1413
1414 ret = ospf_area_stub_set (ospf, area_id);
1415 if (ret == 0)
1416 {
1417 vty_out (vty, "First deconfigure all virtual link through this area%s",
1418 VTY_NEWLINE);
1419 return CMD_WARNING;
1420 }
1421
1422 ospf_area_no_summary_unset (ospf, area_id);
1423
1424 return CMD_SUCCESS;
1425}
1426
paula2c62832003-04-23 17:01:31 +00001427DEFUN (ospf_area_stub_no_summary,
1428 ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001429 "area (A.B.C.D|<0-4294967295>) stub no-summary",
1430 "OSPF stub parameters\n"
1431 "OSPF area ID in IP address format\n"
1432 "OSPF area ID as a decimal value\n"
1433 "Configure OSPF area as stub\n"
1434 "Do not inject inter-area routes into stub\n")
1435{
1436 struct ospf *ospf = vty->index;
1437 struct in_addr area_id;
1438 int ret, format;
1439
1440 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1441
1442 ret = ospf_area_stub_set (ospf, area_id);
1443 if (ret == 0)
1444 {
paulb0a053b2003-06-22 09:04:47 +00001445 vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
paul718e3742002-12-13 20:15:29 +00001446 VTY_NEWLINE);
1447 return CMD_WARNING;
1448 }
1449
1450 ospf_area_no_summary_set (ospf, area_id);
1451
1452 return CMD_SUCCESS;
1453}
1454
paula2c62832003-04-23 17:01:31 +00001455DEFUN (no_ospf_area_stub,
1456 no_ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001457 "no area (A.B.C.D|<0-4294967295>) stub",
1458 NO_STR
1459 "OSPF area parameters\n"
1460 "OSPF area ID in IP address format\n"
1461 "OSPF area ID as a decimal value\n"
1462 "Configure OSPF area as stub\n")
1463{
1464 struct ospf *ospf = vty->index;
1465 struct in_addr area_id;
1466 int format;
1467
1468 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1469
1470 ospf_area_stub_unset (ospf, area_id);
1471 ospf_area_no_summary_unset (ospf, area_id);
1472
1473 return CMD_SUCCESS;
1474}
1475
paula2c62832003-04-23 17:01:31 +00001476DEFUN (no_ospf_area_stub_no_summary,
1477 no_ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001478 "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1479 NO_STR
1480 "OSPF area parameters\n"
1481 "OSPF area ID in IP address format\n"
1482 "OSPF area ID as a decimal value\n"
1483 "Configure OSPF area as stub\n"
1484 "Do not inject inter-area routes into area\n")
1485{
1486 struct ospf *ospf = vty->index;
1487 struct in_addr area_id;
1488 int format;
1489
1490 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1491 ospf_area_no_summary_unset (ospf, area_id);
1492
1493 return CMD_SUCCESS;
1494}
1495
paul4dadc292005-05-06 21:37:42 +00001496static int
paul6c835672004-10-11 11:00:30 +00001497ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1498 int nosum)
paul718e3742002-12-13 20:15:29 +00001499{
1500 struct ospf *ospf = vty->index;
1501 struct in_addr area_id;
1502 int ret, format;
1503
1504 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1505
1506 ret = ospf_area_nssa_set (ospf, area_id);
1507 if (ret == 0)
1508 {
1509 vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1510 VTY_NEWLINE);
1511 return CMD_WARNING;
1512 }
1513
1514 if (argc > 1)
1515 {
1516 if (strncmp (argv[1], "translate-c", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001517 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001518 OSPF_NSSA_ROLE_CANDIDATE);
1519 else if (strncmp (argv[1], "translate-n", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001520 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001521 OSPF_NSSA_ROLE_NEVER);
1522 else if (strncmp (argv[1], "translate-a", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001523 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001524 OSPF_NSSA_ROLE_ALWAYS);
1525 }
paulb0a053b2003-06-22 09:04:47 +00001526 else
1527 {
1528 ospf_area_nssa_translator_role_set (ospf, area_id,
1529 OSPF_NSSA_ROLE_CANDIDATE);
1530 }
paul718e3742002-12-13 20:15:29 +00001531
paulb0a053b2003-06-22 09:04:47 +00001532 if (nosum)
paul718e3742002-12-13 20:15:29 +00001533 ospf_area_no_summary_set (ospf, area_id);
paulb0a053b2003-06-22 09:04:47 +00001534 else
1535 ospf_area_no_summary_unset (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001536
paulb0a053b2003-06-22 09:04:47 +00001537 ospf_schedule_abr_task (ospf);
1538
paul718e3742002-12-13 20:15:29 +00001539 return CMD_SUCCESS;
1540}
1541
paulb0a053b2003-06-22 09:04:47 +00001542DEFUN (ospf_area_nssa_translate_no_summary,
paula2c62832003-04-23 17:01:31 +00001543 ospf_area_nssa_translate_no_summary_cmd,
paulb0a053b2003-06-22 09:04:47 +00001544 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
paul718e3742002-12-13 20:15:29 +00001545 "OSPF area parameters\n"
1546 "OSPF area ID in IP address format\n"
1547 "OSPF area ID as a decimal value\n"
1548 "Configure OSPF area as nssa\n"
1549 "Configure NSSA-ABR for translate election (default)\n"
1550 "Configure NSSA-ABR to never translate\n"
1551 "Configure NSSA-ABR to always translate\n"
paulb0a053b2003-06-22 09:04:47 +00001552 "Do not inject inter-area routes into nssa\n")
1553{
1554 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1555}
paul718e3742002-12-13 20:15:29 +00001556
paulb0a053b2003-06-22 09:04:47 +00001557DEFUN (ospf_area_nssa_translate,
paula2c62832003-04-23 17:01:31 +00001558 ospf_area_nssa_translate_cmd,
paul718e3742002-12-13 20:15:29 +00001559 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1560 "OSPF area parameters\n"
1561 "OSPF area ID in IP address format\n"
1562 "OSPF area ID as a decimal value\n"
1563 "Configure OSPF area as nssa\n"
1564 "Configure NSSA-ABR for translate election (default)\n"
1565 "Configure NSSA-ABR to never translate\n"
1566 "Configure NSSA-ABR to always translate\n")
paulb0a053b2003-06-22 09:04:47 +00001567{
1568 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1569}
1570
1571DEFUN (ospf_area_nssa,
1572 ospf_area_nssa_cmd,
1573 "area (A.B.C.D|<0-4294967295>) nssa",
1574 "OSPF area parameters\n"
1575 "OSPF area ID in IP address format\n"
1576 "OSPF area ID as a decimal value\n"
1577 "Configure OSPF area as nssa\n")
1578{
1579 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1580}
paul718e3742002-12-13 20:15:29 +00001581
paula2c62832003-04-23 17:01:31 +00001582DEFUN (ospf_area_nssa_no_summary,
1583 ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001584 "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1585 "OSPF area parameters\n"
1586 "OSPF area ID in IP address format\n"
1587 "OSPF area ID as a decimal value\n"
1588 "Configure OSPF area as nssa\n"
1589 "Do not inject inter-area routes into nssa\n")
1590{
paulb0a053b2003-06-22 09:04:47 +00001591 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
paul718e3742002-12-13 20:15:29 +00001592}
1593
paula2c62832003-04-23 17:01:31 +00001594DEFUN (no_ospf_area_nssa,
1595 no_ospf_area_nssa_cmd,
paul718e3742002-12-13 20:15:29 +00001596 "no area (A.B.C.D|<0-4294967295>) nssa",
1597 NO_STR
1598 "OSPF area parameters\n"
1599 "OSPF area ID in IP address format\n"
1600 "OSPF area ID as a decimal value\n"
1601 "Configure OSPF area as nssa\n")
1602{
1603 struct ospf *ospf = vty->index;
1604 struct in_addr area_id;
1605 int format;
1606
1607 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1608
1609 ospf_area_nssa_unset (ospf, area_id);
1610 ospf_area_no_summary_unset (ospf, area_id);
1611
paulb0a053b2003-06-22 09:04:47 +00001612 ospf_schedule_abr_task (ospf);
1613
paul718e3742002-12-13 20:15:29 +00001614 return CMD_SUCCESS;
1615}
1616
paula2c62832003-04-23 17:01:31 +00001617DEFUN (no_ospf_area_nssa_no_summary,
1618 no_ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001619 "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1620 NO_STR
1621 "OSPF area parameters\n"
1622 "OSPF area ID in IP address format\n"
1623 "OSPF area ID as a decimal value\n"
1624 "Configure OSPF area as nssa\n"
1625 "Do not inject inter-area routes into nssa\n")
1626{
1627 struct ospf *ospf = vty->index;
1628 struct in_addr area_id;
1629 int format;
1630
1631 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1632 ospf_area_no_summary_unset (ospf, area_id);
1633
1634 return CMD_SUCCESS;
1635}
1636
paula2c62832003-04-23 17:01:31 +00001637DEFUN (ospf_area_default_cost,
1638 ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001639 "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1640 "OSPF area parameters\n"
1641 "OSPF area ID in IP address format\n"
1642 "OSPF area ID as a decimal value\n"
1643 "Set the summary-default cost of a NSSA or stub area\n"
1644 "Stub's advertised default summary cost\n")
1645{
paul68980082003-03-25 05:07:42 +00001646 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001647 struct ospf_area *area;
1648 struct in_addr area_id;
1649 u_int32_t cost;
1650 int format;
vincentba682532005-09-29 13:52:57 +00001651 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001652
1653 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1654 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1655
paul68980082003-03-25 05:07:42 +00001656 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001657
1658 if (area->external_routing == OSPF_AREA_DEFAULT)
1659 {
1660 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1661 return CMD_WARNING;
1662 }
1663
1664 area->default_cost = cost;
1665
vincentba682532005-09-29 13:52:57 +00001666 p.family = AF_INET;
1667 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1668 p.prefixlen = 0;
1669 if (IS_DEBUG_OSPF_EVENT)
1670 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1671 "announcing 0.0.0.0/0 to area %s",
1672 inet_ntoa (area->area_id));
1673 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1674
paul718e3742002-12-13 20:15:29 +00001675 return CMD_SUCCESS;
1676}
1677
paula2c62832003-04-23 17:01:31 +00001678DEFUN (no_ospf_area_default_cost,
1679 no_ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001680 "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1681 NO_STR
1682 "OSPF area parameters\n"
1683 "OSPF area ID in IP address format\n"
1684 "OSPF area ID as a decimal value\n"
1685 "Set the summary-default cost of a NSSA or stub area\n"
1686 "Stub's advertised default summary cost\n")
1687{
paul68980082003-03-25 05:07:42 +00001688 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001689 struct ospf_area *area;
1690 struct in_addr area_id;
1691 u_int32_t cost;
1692 int format;
vincentba682532005-09-29 13:52:57 +00001693 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001694
1695 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1696 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1697
paul68980082003-03-25 05:07:42 +00001698 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001699 if (area == NULL)
1700 return CMD_SUCCESS;
1701
1702 if (area->external_routing == OSPF_AREA_DEFAULT)
1703 {
1704 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1705 return CMD_WARNING;
1706 }
1707
1708 area->default_cost = 1;
1709
vincentba682532005-09-29 13:52:57 +00001710 p.family = AF_INET;
1711 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1712 p.prefixlen = 0;
1713 if (IS_DEBUG_OSPF_EVENT)
1714 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1715 "announcing 0.0.0.0/0 to area %s",
1716 inet_ntoa (area->area_id));
1717 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1718
1719
paul68980082003-03-25 05:07:42 +00001720 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001721
1722 return CMD_SUCCESS;
1723}
1724
paula2c62832003-04-23 17:01:31 +00001725DEFUN (ospf_area_export_list,
1726 ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001727 "area (A.B.C.D|<0-4294967295>) export-list NAME",
1728 "OSPF area parameters\n"
1729 "OSPF area ID in IP address format\n"
1730 "OSPF area ID as a decimal value\n"
1731 "Set the filter for networks announced to other areas\n"
1732 "Name of the access-list\n")
1733{
paul68980082003-03-25 05:07:42 +00001734 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001735 struct ospf_area *area;
1736 struct in_addr area_id;
1737 int format;
1738
hasso52930762004-04-19 18:26:53 +00001739 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1740
paul68980082003-03-25 05:07:42 +00001741 area = ospf_area_get (ospf, area_id, format);
1742 ospf_area_export_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001743
1744 return CMD_SUCCESS;
1745}
1746
paula2c62832003-04-23 17:01:31 +00001747DEFUN (no_ospf_area_export_list,
1748 no_ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001749 "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1750 NO_STR
1751 "OSPF area parameters\n"
1752 "OSPF area ID in IP address format\n"
1753 "OSPF area ID as a decimal value\n"
1754 "Unset the filter for networks announced to other areas\n"
1755 "Name of the access-list\n")
1756{
paul68980082003-03-25 05:07:42 +00001757 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001758 struct ospf_area *area;
1759 struct in_addr area_id;
1760 int format;
1761
hasso52930762004-04-19 18:26:53 +00001762 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1763
paul68980082003-03-25 05:07:42 +00001764 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001765 if (area == NULL)
1766 return CMD_SUCCESS;
1767
paul68980082003-03-25 05:07:42 +00001768 ospf_area_export_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001769
1770 return CMD_SUCCESS;
1771}
1772
1773
paula2c62832003-04-23 17:01:31 +00001774DEFUN (ospf_area_import_list,
1775 ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001776 "area (A.B.C.D|<0-4294967295>) import-list NAME",
1777 "OSPF area parameters\n"
1778 "OSPF area ID in IP address format\n"
1779 "OSPF area ID as a decimal value\n"
1780 "Set the filter for networks from other areas announced to the specified one\n"
1781 "Name of the access-list\n")
1782{
paul68980082003-03-25 05:07:42 +00001783 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001784 struct ospf_area *area;
1785 struct in_addr area_id;
1786 int format;
1787
hasso52930762004-04-19 18:26:53 +00001788 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1789
paul68980082003-03-25 05:07:42 +00001790 area = ospf_area_get (ospf, area_id, format);
1791 ospf_area_import_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001792
1793 return CMD_SUCCESS;
1794}
1795
paula2c62832003-04-23 17:01:31 +00001796DEFUN (no_ospf_area_import_list,
1797 no_ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001798 "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1799 NO_STR
1800 "OSPF area parameters\n"
1801 "OSPF area ID in IP address format\n"
1802 "OSPF area ID as a decimal value\n"
1803 "Unset the filter for networks announced to other areas\n"
1804 "Name of the access-list\n")
1805{
paul68980082003-03-25 05:07:42 +00001806 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001807 struct ospf_area *area;
1808 struct in_addr area_id;
1809 int format;
1810
hasso52930762004-04-19 18:26:53 +00001811 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1812
paul68980082003-03-25 05:07:42 +00001813 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001814 if (area == NULL)
1815 return CMD_SUCCESS;
1816
paul68980082003-03-25 05:07:42 +00001817 ospf_area_import_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001818
1819 return CMD_SUCCESS;
1820}
1821
paula2c62832003-04-23 17:01:31 +00001822DEFUN (ospf_area_filter_list,
1823 ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001824 "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1825 "OSPF area parameters\n"
1826 "OSPF area ID in IP address format\n"
1827 "OSPF area ID as a decimal value\n"
1828 "Filter networks between OSPF areas\n"
1829 "Filter prefixes between OSPF areas\n"
1830 "Name of an IP prefix-list\n"
1831 "Filter networks sent to this area\n"
1832 "Filter networks sent from this area\n")
1833{
paul68980082003-03-25 05:07:42 +00001834 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001835 struct ospf_area *area;
1836 struct in_addr area_id;
1837 struct prefix_list *plist;
1838 int format;
1839
1840 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1841
paul68980082003-03-25 05:07:42 +00001842 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001843 plist = prefix_list_lookup (AFI_IP, argv[1]);
1844 if (strncmp (argv[2], "in", 2) == 0)
1845 {
1846 PREFIX_LIST_IN (area) = plist;
1847 if (PREFIX_NAME_IN (area))
1848 free (PREFIX_NAME_IN (area));
1849
1850 PREFIX_NAME_IN (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001851 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001852 }
1853 else
1854 {
1855 PREFIX_LIST_OUT (area) = plist;
1856 if (PREFIX_NAME_OUT (area))
1857 free (PREFIX_NAME_OUT (area));
1858
1859 PREFIX_NAME_OUT (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001860 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001861 }
1862
1863 return CMD_SUCCESS;
1864}
1865
paula2c62832003-04-23 17:01:31 +00001866DEFUN (no_ospf_area_filter_list,
1867 no_ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001868 "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1869 NO_STR
1870 "OSPF area parameters\n"
1871 "OSPF area ID in IP address format\n"
1872 "OSPF area ID as a decimal value\n"
1873 "Filter networks between OSPF areas\n"
1874 "Filter prefixes between OSPF areas\n"
1875 "Name of an IP prefix-list\n"
1876 "Filter networks sent to this area\n"
1877 "Filter networks sent from this area\n")
1878{
paul68980082003-03-25 05:07:42 +00001879 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001880 struct ospf_area *area;
1881 struct in_addr area_id;
1882 struct prefix_list *plist;
1883 int format;
1884
1885 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1886
Paul Jakma1a8ec2b2006-05-11 13:34:08 +00001887 if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1888 return CMD_SUCCESS;
1889
paul718e3742002-12-13 20:15:29 +00001890 plist = prefix_list_lookup (AFI_IP, argv[1]);
1891 if (strncmp (argv[2], "in", 2) == 0)
1892 {
1893 if (PREFIX_NAME_IN (area))
1894 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1895 return CMD_SUCCESS;
1896
1897 PREFIX_LIST_IN (area) = NULL;
1898 if (PREFIX_NAME_IN (area))
1899 free (PREFIX_NAME_IN (area));
1900
1901 PREFIX_NAME_IN (area) = NULL;
1902
paul68980082003-03-25 05:07:42 +00001903 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001904 }
1905 else
1906 {
1907 if (PREFIX_NAME_OUT (area))
1908 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1909 return CMD_SUCCESS;
1910
1911 PREFIX_LIST_OUT (area) = NULL;
1912 if (PREFIX_NAME_OUT (area))
1913 free (PREFIX_NAME_OUT (area));
1914
1915 PREFIX_NAME_OUT (area) = NULL;
1916
paul68980082003-03-25 05:07:42 +00001917 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001918 }
1919
1920 return CMD_SUCCESS;
1921}
1922
1923
paula2c62832003-04-23 17:01:31 +00001924DEFUN (ospf_area_authentication_message_digest,
1925 ospf_area_authentication_message_digest_cmd,
paul718e3742002-12-13 20:15:29 +00001926 "area (A.B.C.D|<0-4294967295>) authentication message-digest",
1927 "OSPF area parameters\n"
1928 "Enable authentication\n"
1929 "Use message-digest authentication\n")
1930{
paul68980082003-03-25 05:07:42 +00001931 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001932 struct ospf_area *area;
1933 struct in_addr area_id;
1934 int format;
1935
1936 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1937
paul68980082003-03-25 05:07:42 +00001938 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001939 area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1940
1941 return CMD_SUCCESS;
1942}
1943
paula2c62832003-04-23 17:01:31 +00001944DEFUN (ospf_area_authentication,
1945 ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00001946 "area (A.B.C.D|<0-4294967295>) authentication",
1947 "OSPF area parameters\n"
1948 "OSPF area ID in IP address format\n"
1949 "OSPF area ID as a decimal value\n"
1950 "Enable authentication\n")
1951{
paul68980082003-03-25 05:07:42 +00001952 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001953 struct ospf_area *area;
1954 struct in_addr area_id;
1955 int format;
1956
1957 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1958
paul68980082003-03-25 05:07:42 +00001959 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001960 area->auth_type = OSPF_AUTH_SIMPLE;
1961
1962 return CMD_SUCCESS;
1963}
1964
paula2c62832003-04-23 17:01:31 +00001965DEFUN (no_ospf_area_authentication,
1966 no_ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00001967 "no area (A.B.C.D|<0-4294967295>) authentication",
1968 NO_STR
1969 "OSPF area parameters\n"
1970 "OSPF area ID in IP address format\n"
1971 "OSPF area ID as a decimal value\n"
1972 "Enable authentication\n")
1973{
paul68980082003-03-25 05:07:42 +00001974 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001975 struct ospf_area *area;
1976 struct in_addr area_id;
1977 int format;
1978
1979 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1980
paul68980082003-03-25 05:07:42 +00001981 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001982 if (area == NULL)
1983 return CMD_SUCCESS;
1984
1985 area->auth_type = OSPF_AUTH_NULL;
1986
paul68980082003-03-25 05:07:42 +00001987 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001988
1989 return CMD_SUCCESS;
1990}
1991
1992
1993DEFUN (ospf_abr_type,
1994 ospf_abr_type_cmd,
1995 "ospf abr-type (cisco|ibm|shortcut|standard)",
1996 "OSPF specific commands\n"
1997 "Set OSPF ABR type\n"
1998 "Alternative ABR, cisco implementation\n"
1999 "Alternative ABR, IBM implementation\n"
2000 "Shortcut ABR\n"
2001 "Standard behavior (RFC2328)\n")
2002{
paul68980082003-03-25 05:07:42 +00002003 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002004 u_char abr_type = OSPF_ABR_UNKNOWN;
2005
2006 if (strncmp (argv[0], "c", 1) == 0)
2007 abr_type = OSPF_ABR_CISCO;
2008 else if (strncmp (argv[0], "i", 1) == 0)
2009 abr_type = OSPF_ABR_IBM;
2010 else if (strncmp (argv[0], "sh", 2) == 0)
2011 abr_type = OSPF_ABR_SHORTCUT;
2012 else if (strncmp (argv[0], "st", 2) == 0)
2013 abr_type = OSPF_ABR_STAND;
2014 else
2015 return CMD_WARNING;
2016
2017 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002018 if (ospf->abr_type != abr_type)
paul718e3742002-12-13 20:15:29 +00002019 {
paul68980082003-03-25 05:07:42 +00002020 ospf->abr_type = abr_type;
2021 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002022 }
2023
2024 return CMD_SUCCESS;
2025}
2026
2027DEFUN (no_ospf_abr_type,
2028 no_ospf_abr_type_cmd,
pauld57834f2005-07-12 20:04:22 +00002029 "no ospf abr-type (cisco|ibm|shortcut|standard)",
paul718e3742002-12-13 20:15:29 +00002030 NO_STR
2031 "OSPF specific commands\n"
2032 "Set OSPF ABR type\n"
2033 "Alternative ABR, cisco implementation\n"
2034 "Alternative ABR, IBM implementation\n"
2035 "Shortcut ABR\n")
2036{
paul68980082003-03-25 05:07:42 +00002037 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002038 u_char abr_type = OSPF_ABR_UNKNOWN;
2039
2040 if (strncmp (argv[0], "c", 1) == 0)
2041 abr_type = OSPF_ABR_CISCO;
2042 else if (strncmp (argv[0], "i", 1) == 0)
2043 abr_type = OSPF_ABR_IBM;
2044 else if (strncmp (argv[0], "s", 1) == 0)
2045 abr_type = OSPF_ABR_SHORTCUT;
2046 else
2047 return CMD_WARNING;
2048
2049 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002050 if (ospf->abr_type == abr_type)
paul718e3742002-12-13 20:15:29 +00002051 {
pauld57834f2005-07-12 20:04:22 +00002052 ospf->abr_type = OSPF_ABR_DEFAULT;
paul68980082003-03-25 05:07:42 +00002053 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002054 }
2055
2056 return CMD_SUCCESS;
2057}
2058
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002059DEFUN (ospf_log_adjacency_changes,
2060 ospf_log_adjacency_changes_cmd,
2061 "log-adjacency-changes",
2062 "Log changes in adjacency state\n")
2063{
2064 struct ospf *ospf = vty->index;
2065
2066 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2067 return CMD_SUCCESS;
2068}
2069
2070DEFUN (ospf_log_adjacency_changes_detail,
2071 ospf_log_adjacency_changes_detail_cmd,
2072 "log-adjacency-changes detail",
2073 "Log changes in adjacency state\n"
2074 "Log all state changes\n")
2075{
2076 struct ospf *ospf = vty->index;
2077
2078 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2079 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2080 return CMD_SUCCESS;
2081}
2082
2083DEFUN (no_ospf_log_adjacency_changes,
2084 no_ospf_log_adjacency_changes_cmd,
2085 "no log-adjacency-changes",
2086 NO_STR
2087 "Log changes in adjacency state\n")
2088{
2089 struct ospf *ospf = vty->index;
2090
2091 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2092 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2093 return CMD_SUCCESS;
2094}
2095
2096DEFUN (no_ospf_log_adjacency_changes_detail,
2097 no_ospf_log_adjacency_changes_detail_cmd,
2098 "no log-adjacency-changes detail",
2099 NO_STR
2100 "Log changes in adjacency state\n"
2101 "Log all state changes\n")
2102{
2103 struct ospf *ospf = vty->index;
2104
2105 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2106 return CMD_SUCCESS;
2107}
2108
paul718e3742002-12-13 20:15:29 +00002109DEFUN (ospf_compatible_rfc1583,
2110 ospf_compatible_rfc1583_cmd,
2111 "compatible rfc1583",
2112 "OSPF compatibility list\n"
2113 "compatible with RFC 1583\n")
2114{
2115 struct ospf *ospf = vty->index;
2116
2117 if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2118 {
2119 SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002120 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002121 }
2122 return CMD_SUCCESS;
2123}
2124
2125DEFUN (no_ospf_compatible_rfc1583,
2126 no_ospf_compatible_rfc1583_cmd,
2127 "no compatible rfc1583",
2128 NO_STR
2129 "OSPF compatibility list\n"
2130 "compatible with RFC 1583\n")
2131{
2132 struct ospf *ospf = vty->index;
2133
2134 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2135 {
2136 UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002137 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002138 }
2139 return CMD_SUCCESS;
2140}
2141
2142ALIAS (ospf_compatible_rfc1583,
2143 ospf_rfc1583_flag_cmd,
2144 "ospf rfc1583compatibility",
2145 "OSPF specific commands\n"
2146 "Enable the RFC1583Compatibility flag\n")
2147
2148ALIAS (no_ospf_compatible_rfc1583,
2149 no_ospf_rfc1583_flag_cmd,
2150 "no ospf rfc1583compatibility",
2151 NO_STR
2152 "OSPF specific commands\n"
2153 "Disable the RFC1583Compatibility flag\n")
pauld24f6e22005-10-21 09:23:12 +00002154
2155static int
2156ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2157 unsigned int hold,
2158 unsigned int max)
2159{
2160 struct ospf *ospf = vty->index;
2161
2162 ospf->spf_delay = delay;
2163 ospf->spf_holdtime = hold;
2164 ospf->spf_max_holdtime = max;
2165
2166 return CMD_SUCCESS;
2167}
paul718e3742002-12-13 20:15:29 +00002168
pauld24f6e22005-10-21 09:23:12 +00002169DEFUN (ospf_timers_throttle_spf,
2170 ospf_timers_throttle_spf_cmd,
2171 "timers throttle spf <0-600000> <0-600000> <0-600000>",
2172 "Adjust routing timers\n"
2173 "Throttling adaptive timer\n"
2174 "OSPF SPF timers\n"
2175 "Delay (msec) from first change received till SPF calculation\n"
2176 "Initial hold time (msec) between consecutive SPF calculations\n"
2177 "Maximum hold time (msec)\n")
2178{
2179 unsigned int delay, hold, max;
2180
2181 if (argc != 3)
2182 {
2183 vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2184 return CMD_WARNING;
2185 }
2186
2187 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2188 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2189 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2190
2191 return ospf_timers_spf_set (vty, delay, hold, max);
2192}
2193
2194DEFUN_DEPRECATED (ospf_timers_spf,
paula2c62832003-04-23 17:01:31 +00002195 ospf_timers_spf_cmd,
paul718e3742002-12-13 20:15:29 +00002196 "timers spf <0-4294967295> <0-4294967295>",
2197 "Adjust routing timers\n"
2198 "OSPF SPF timers\n"
pauld24f6e22005-10-21 09:23:12 +00002199 "Delay (s) between receiving a change to SPF calculation\n"
2200 "Hold time (s) between consecutive SPF calculations\n")
paul718e3742002-12-13 20:15:29 +00002201{
pauld24f6e22005-10-21 09:23:12 +00002202 unsigned int delay, hold;
2203
2204 if (argc != 2)
2205 {
2206 vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2207 return CMD_WARNING;
2208 }
2209
paul4dadc292005-05-06 21:37:42 +00002210 VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2211 VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
pauld24f6e22005-10-21 09:23:12 +00002212
2213 /* truncate down the second values if they're greater than 600000ms */
2214 if (delay > (600000 / 1000))
2215 delay = 600000;
2216 else if (delay == 0)
2217 /* 0s delay was probably specified because of lack of ms resolution */
2218 delay = OSPF_SPF_DELAY_DEFAULT;
2219 if (hold > (600000 / 1000))
2220 hold = 600000;
2221
2222 return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
paul718e3742002-12-13 20:15:29 +00002223}
2224
pauld24f6e22005-10-21 09:23:12 +00002225DEFUN (no_ospf_timers_throttle_spf,
2226 no_ospf_timers_throttle_spf_cmd,
2227 "no timers throttle spf",
paul718e3742002-12-13 20:15:29 +00002228 NO_STR
2229 "Adjust routing timers\n"
pauld24f6e22005-10-21 09:23:12 +00002230 "Throttling adaptive timer\n"
paul718e3742002-12-13 20:15:29 +00002231 "OSPF SPF timers\n")
2232{
pauld24f6e22005-10-21 09:23:12 +00002233 return ospf_timers_spf_set (vty,
2234 OSPF_SPF_DELAY_DEFAULT,
2235 OSPF_SPF_HOLDTIME_DEFAULT,
2236 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
paul718e3742002-12-13 20:15:29 +00002237}
2238
pauld24f6e22005-10-21 09:23:12 +00002239ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2240 no_ospf_timers_spf_cmd,
2241 "no timers spf",
2242 NO_STR
2243 "Adjust routing timers\n"
2244 "OSPF SPF timers\n")
paul718e3742002-12-13 20:15:29 +00002245
paula2c62832003-04-23 17:01:31 +00002246DEFUN (ospf_neighbor,
2247 ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002248 "neighbor A.B.C.D",
2249 NEIGHBOR_STR
2250 "Neighbor IP address\n")
2251{
2252 struct ospf *ospf = vty->index;
2253 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002254 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2255 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002256
2257 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2258
2259 if (argc > 1)
2260 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2261
2262 if (argc > 2)
2263 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2264
2265 ospf_nbr_nbma_set (ospf, nbr_addr);
2266 if (argc > 1)
2267 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2268 if (argc > 2)
2269 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
2270
2271 return CMD_SUCCESS;
2272}
2273
paula2c62832003-04-23 17:01:31 +00002274ALIAS (ospf_neighbor,
2275 ospf_neighbor_priority_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002276 "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2277 NEIGHBOR_STR
2278 "Neighbor IP address\n"
2279 "Neighbor Priority\n"
2280 "Priority\n"
2281 "Dead Neighbor Polling interval\n"
2282 "Seconds\n")
2283
paula2c62832003-04-23 17:01:31 +00002284ALIAS (ospf_neighbor,
2285 ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002286 "neighbor A.B.C.D priority <0-255>",
2287 NEIGHBOR_STR
2288 "Neighbor IP address\n"
2289 "Neighbor Priority\n"
2290 "Seconds\n")
2291
paula2c62832003-04-23 17:01:31 +00002292DEFUN (ospf_neighbor_poll_interval,
2293 ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002294 "neighbor A.B.C.D poll-interval <1-65535>",
2295 NEIGHBOR_STR
2296 "Neighbor IP address\n"
2297 "Dead Neighbor Polling interval\n"
2298 "Seconds\n")
2299{
2300 struct ospf *ospf = vty->index;
2301 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002302 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2303 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002304
2305 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2306
2307 if (argc > 1)
2308 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2309
2310 if (argc > 2)
2311 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2312
2313 ospf_nbr_nbma_set (ospf, nbr_addr);
2314 if (argc > 1)
2315 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2316 if (argc > 2)
2317 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2318
2319 return CMD_SUCCESS;
2320}
2321
paula2c62832003-04-23 17:01:31 +00002322ALIAS (ospf_neighbor_poll_interval,
2323 ospf_neighbor_poll_interval_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002324 "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2325 NEIGHBOR_STR
2326 "Neighbor address\n"
2327 "OSPF dead-router polling interval\n"
2328 "Seconds\n"
2329 "OSPF priority of non-broadcast neighbor\n"
2330 "Priority\n")
2331
paula2c62832003-04-23 17:01:31 +00002332DEFUN (no_ospf_neighbor,
2333 no_ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002334 "no neighbor A.B.C.D",
2335 NO_STR
2336 NEIGHBOR_STR
2337 "Neighbor IP address\n")
2338{
2339 struct ospf *ospf = vty->index;
2340 struct in_addr nbr_addr;
2341 int ret;
2342
2343 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2344
2345 ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
2346
2347 return CMD_SUCCESS;
2348}
2349
paula2c62832003-04-23 17:01:31 +00002350ALIAS (no_ospf_neighbor,
2351 no_ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002352 "no neighbor A.B.C.D priority <0-255>",
2353 NO_STR
2354 NEIGHBOR_STR
2355 "Neighbor IP address\n"
2356 "Neighbor Priority\n"
2357 "Priority\n")
2358
paula2c62832003-04-23 17:01:31 +00002359ALIAS (no_ospf_neighbor,
2360 no_ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002361 "no neighbor A.B.C.D poll-interval <1-65535>",
2362 NO_STR
2363 NEIGHBOR_STR
2364 "Neighbor IP address\n"
2365 "Dead Neighbor Polling interval\n"
2366 "Seconds\n")
2367
paula2c62832003-04-23 17:01:31 +00002368ALIAS (no_ospf_neighbor,
2369 no_ospf_neighbor_priority_pollinterval_cmd,
paul718e3742002-12-13 20:15:29 +00002370 "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2371 NO_STR
2372 NEIGHBOR_STR
2373 "Neighbor IP address\n"
2374 "Neighbor Priority\n"
2375 "Priority\n"
2376 "Dead Neighbor Polling interval\n"
2377 "Seconds\n")
2378
2379
paula2c62832003-04-23 17:01:31 +00002380DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002381 "refresh timer <10-1800>",
2382 "Adjust refresh parameters\n"
2383 "Set refresh timer\n"
2384 "Timer value in seconds\n")
2385{
2386 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002387 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002388
2389 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2390 interval = (interval / 10) * 10;
2391
2392 ospf_timers_refresh_set (ospf, interval);
2393
2394 return CMD_SUCCESS;
2395}
2396
paula2c62832003-04-23 17:01:31 +00002397DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
paul718e3742002-12-13 20:15:29 +00002398 "no refresh timer <10-1800>",
2399 "Adjust refresh parameters\n"
2400 "Unset refresh timer\n"
2401 "Timer value in seconds\n")
2402{
2403 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002404 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002405
2406 if (argc == 1)
2407 {
2408 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2409
2410 if (ospf->lsa_refresh_interval != interval ||
2411 interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2412 return CMD_SUCCESS;
2413 }
2414
2415 ospf_timers_refresh_unset (ospf);
2416
2417 return CMD_SUCCESS;
2418}
2419
paula2c62832003-04-23 17:01:31 +00002420ALIAS (no_ospf_refresh_timer,
2421 no_ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002422 "no refresh timer",
2423 "Adjust refresh parameters\n"
2424 "Unset refresh timer\n")
2425
paula2c62832003-04-23 17:01:31 +00002426DEFUN (ospf_auto_cost_reference_bandwidth,
2427 ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002428 "auto-cost reference-bandwidth <1-4294967>",
2429 "Calculate OSPF interface cost according to bandwidth\n"
2430 "Use reference bandwidth method to assign OSPF cost\n"
2431 "The reference bandwidth in terms of Mbits per second\n")
2432{
paul68980082003-03-25 05:07:42 +00002433 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002434 u_int32_t refbw;
hasso52dc7ee2004-09-23 19:18:23 +00002435 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00002436 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002437
2438 refbw = strtol (argv[0], NULL, 10);
2439 if (refbw < 1 || refbw > 4294967)
2440 {
2441 vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2442 return CMD_WARNING;
2443 }
2444
2445 /* If reference bandwidth is changed. */
paul68980082003-03-25 05:07:42 +00002446 if ((refbw * 1000) == ospf->ref_bandwidth)
paul718e3742002-12-13 20:15:29 +00002447 return CMD_SUCCESS;
2448
paul68980082003-03-25 05:07:42 +00002449 ospf->ref_bandwidth = refbw * 1000;
paul1eb8ef22005-04-07 07:30:20 +00002450 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2451 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002452
2453 return CMD_SUCCESS;
2454}
2455
paula2c62832003-04-23 17:01:31 +00002456DEFUN (no_ospf_auto_cost_reference_bandwidth,
2457 no_ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002458 "no auto-cost reference-bandwidth",
2459 NO_STR
2460 "Calculate OSPF interface cost according to bandwidth\n"
2461 "Use reference bandwidth method to assign OSPF cost\n")
2462{
paul68980082003-03-25 05:07:42 +00002463 struct ospf *ospf = vty->index;
paul1eb8ef22005-04-07 07:30:20 +00002464 struct listnode *node, *nnode;
2465 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002466
paul68980082003-03-25 05:07:42 +00002467 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
paul718e3742002-12-13 20:15:29 +00002468 return CMD_SUCCESS;
2469
paul68980082003-03-25 05:07:42 +00002470 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
paul718e3742002-12-13 20:15:29 +00002471 vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2472 vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2473
paul1eb8ef22005-04-07 07:30:20 +00002474 for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2475 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002476
2477 return CMD_SUCCESS;
2478}
2479
hassoeb1ce602004-10-08 08:17:22 +00002480const char *ospf_abr_type_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002481{
2482 "Unknown",
2483 "Standard (RFC2328)",
2484 "Alternative IBM",
2485 "Alternative Cisco",
2486 "Alternative Shortcut"
2487};
2488
hassoeb1ce602004-10-08 08:17:22 +00002489const char *ospf_shortcut_mode_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002490{
2491 "Default",
2492 "Enabled",
2493 "Disabled"
2494};
2495
2496
2497
paul4dadc292005-05-06 21:37:42 +00002498static void
paul718e3742002-12-13 20:15:29 +00002499show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2500{
2501 /* Show Area ID. */
2502 vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2503
2504 /* Show Area type/mode. */
2505 if (OSPF_IS_AREA_BACKBONE (area))
2506 vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2507 else
2508 {
2509 if (area->external_routing == OSPF_AREA_STUB)
paulb0a053b2003-06-22 09:04:47 +00002510 vty_out (vty, " (Stub%s%s)",
2511 area->no_summary ? ", no summary" : "",
2512 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002513
paulb0a053b2003-06-22 09:04:47 +00002514 else if (area->external_routing == OSPF_AREA_NSSA)
2515 vty_out (vty, " (NSSA%s%s)",
2516 area->no_summary ? ", no summary" : "",
2517 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002518
2519 vty_out (vty, "%s", VTY_NEWLINE);
2520 vty_out (vty, " Shortcutting mode: %s",
paulb0a053b2003-06-22 09:04:47 +00002521 ospf_shortcut_mode_descr_str[area->shortcut_configured]);
paul718e3742002-12-13 20:15:29 +00002522 vty_out (vty, ", S-bit consensus: %s%s",
paulb0a053b2003-06-22 09:04:47 +00002523 area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002524 }
2525
2526 /* Show number of interfaces. */
2527 vty_out (vty, " Number of interfaces in this area: Total: %d, "
2528 "Active: %d%s", listcount (area->oiflist),
2529 area->act_ints, VTY_NEWLINE);
2530
paul718e3742002-12-13 20:15:29 +00002531 if (area->external_routing == OSPF_AREA_NSSA)
2532 {
2533 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 +00002534 if (! IS_OSPF_ABR (area->ospf))
paulb0a053b2003-06-22 09:04:47 +00002535 vty_out (vty, " It is not ABR, therefore not Translator. %s",
2536 VTY_NEWLINE);
2537 else if (area->NSSATranslatorState)
2538 {
2539 vty_out (vty, " We are an ABR and ");
2540 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2541 vty_out (vty, "the NSSA Elected Translator. %s",
2542 VTY_NEWLINE);
2543 else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2544 vty_out (vty, "always an NSSA Translator. %s",
2545 VTY_NEWLINE);
2546 }
paul718e3742002-12-13 20:15:29 +00002547 else
paulb0a053b2003-06-22 09:04:47 +00002548 {
2549 vty_out (vty, " We are an ABR, but ");
2550 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2551 vty_out (vty, "not the NSSA Elected Translator. %s",
2552 VTY_NEWLINE);
2553 else
hassoc6b87812004-12-22 13:09:59 +00002554 vty_out (vty, "never an NSSA Translator. %s",
paulb0a053b2003-06-22 09:04:47 +00002555 VTY_NEWLINE);
2556 }
paul718e3742002-12-13 20:15:29 +00002557 }
paul88d6cf32005-10-29 12:50:09 +00002558 /* Stub-router state for this area */
2559 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2560 {
ajs649654a2005-11-16 20:17:52 +00002561 char timebuf[OSPF_TIME_DUMP_SIZE];
paul88d6cf32005-10-29 12:50:09 +00002562 vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2563 VTY_NEWLINE);
2564 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2565 vty_out (vty, " Administratively activated (indefinitely)%s",
2566 VTY_NEWLINE);
2567 if (area->t_stub_router)
2568 vty_out (vty, " Active from startup, %s remaining%s",
2569 ospf_timer_dump (area->t_stub_router, timebuf,
2570 sizeof(timebuf)), VTY_NEWLINE);
2571 }
2572
paul718e3742002-12-13 20:15:29 +00002573 /* Show number of fully adjacent neighbors. */
2574 vty_out (vty, " Number of fully adjacent neighbors in this area:"
paulb0a053b2003-06-22 09:04:47 +00002575 " %d%s", area->full_nbrs, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002576
2577 /* Show authentication type. */
2578 vty_out (vty, " Area has ");
2579 if (area->auth_type == OSPF_AUTH_NULL)
2580 vty_out (vty, "no authentication%s", VTY_NEWLINE);
2581 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2582 vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2583 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2584 vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2585
2586 if (!OSPF_IS_AREA_BACKBONE (area))
2587 vty_out (vty, " Number of full virtual adjacencies going through"
2588 " this area: %d%s", area->full_vls, VTY_NEWLINE);
2589
2590 /* Show SPF calculation times. */
2591 vty_out (vty, " SPF algorithm executed %d times%s",
2592 area->spf_calculation, VTY_NEWLINE);
2593
2594 /* Show number of LSA. */
2595 vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
hassofe71a972004-12-22 16:16:02 +00002596 vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2597 ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2598 ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2599 vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2600 ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2601 ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2602 vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2603 ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2604 ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2605 vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2606 ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2607 ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2608 vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2609 ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2610 ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2611#ifdef HAVE_OPAQUE_LSA
2612 vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2613 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2614 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2615 vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2616 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2617 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2618#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002619 vty_out (vty, "%s", VTY_NEWLINE);
2620}
2621
2622DEFUN (show_ip_ospf,
2623 show_ip_ospf_cmd,
2624 "show ip ospf",
2625 SHOW_STR
2626 IP_STR
2627 "OSPF information\n")
2628{
paul1eb8ef22005-04-07 07:30:20 +00002629 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002630 struct ospf_area * area;
paul020709f2003-04-04 02:44:16 +00002631 struct ospf *ospf;
pauld24f6e22005-10-21 09:23:12 +00002632 struct timeval result;
ajs649654a2005-11-16 20:17:52 +00002633 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002634
2635 /* Check OSPF is enable. */
paul020709f2003-04-04 02:44:16 +00002636 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002637 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00002638 {
2639 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2640 return CMD_SUCCESS;
2641 }
2642
2643 /* Show Router ID. */
2644 vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
paul68980082003-03-25 05:07:42 +00002645 inet_ntoa (ospf->router_id),
paul718e3742002-12-13 20:15:29 +00002646 VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00002647
2648 /* Graceful shutdown */
paulc9c93d52005-11-26 13:31:11 +00002649 if (ospf->t_deferred_shutdown)
2650 vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2651 ospf_timer_dump (ospf->t_deferred_shutdown,
paul88d6cf32005-10-29 12:50:09 +00002652 timebuf, sizeof (timebuf)), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002653 /* Show capability. */
2654 vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2655 vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2656 vty_out (vty, " RFC1583Compatibility flag is %s%s",
paul68980082003-03-25 05:07:42 +00002657 CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
paul718e3742002-12-13 20:15:29 +00002658 "enabled" : "disabled", VTY_NEWLINE);
2659#ifdef HAVE_OPAQUE_LSA
2660 vty_out (vty, " OpaqueCapability flag is %s%s%s",
paul68980082003-03-25 05:07:42 +00002661 CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
paul718e3742002-12-13 20:15:29 +00002662 "enabled" : "disabled",
paul68980082003-03-25 05:07:42 +00002663 IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
paul718e3742002-12-13 20:15:29 +00002664 " (origination blocked)" : "",
2665 VTY_NEWLINE);
2666#endif /* HAVE_OPAQUE_LSA */
paul88d6cf32005-10-29 12:50:09 +00002667
2668 /* Show stub-router configuration */
2669 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2670 || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2671 {
2672 vty_out (vty, " Stub router advertisement is configured%s",
2673 VTY_NEWLINE);
2674 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2675 vty_out (vty, " Enabled for %us after start-up%s",
2676 ospf->stub_router_startup_time, VTY_NEWLINE);
2677 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2678 vty_out (vty, " Enabled for %us prior to full shutdown%s",
2679 ospf->stub_router_shutdown_time, VTY_NEWLINE);
2680 }
2681
paul718e3742002-12-13 20:15:29 +00002682 /* Show SPF timers. */
pauld24f6e22005-10-21 09:23:12 +00002683 vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2684 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2685 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2686 " Hold time multiplier is currently %d%s",
2687 ospf->spf_delay, VTY_NEWLINE,
2688 ospf->spf_holdtime, VTY_NEWLINE,
2689 ospf->spf_max_holdtime, VTY_NEWLINE,
2690 ospf->spf_hold_multiplier, VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002691 vty_out (vty, " SPF algorithm ");
2692 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2693 {
paulc8c15212005-11-04 12:31:39 +00002694 result = tv_sub (recent_time, ospf->ts_spf);
paulb8ad39d2005-10-23 15:23:05 +00002695 vty_out (vty, "last executed %s ago%s",
2696 ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2697 VTY_NEWLINE);
2698 }
2699 else
2700 vty_out (vty, "has not been run%s", VTY_NEWLINE);
pauld24f6e22005-10-21 09:23:12 +00002701 vty_out (vty, " SPF timer %s%s%s",
2702 (ospf->t_spf_calc ? "due in " : "is "),
2703 ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2704 VTY_NEWLINE);
2705
paul718e3742002-12-13 20:15:29 +00002706 /* Show refresh parameters. */
2707 vty_out (vty, " Refresh timer %d secs%s",
paul68980082003-03-25 05:07:42 +00002708 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002709
2710 /* Show ABR/ASBR flags. */
paul68980082003-03-25 05:07:42 +00002711 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
paul718e3742002-12-13 20:15:29 +00002712 vty_out (vty, " This router is an ABR, ABR type is: %s%s",
paul68980082003-03-25 05:07:42 +00002713 ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002714
paul68980082003-03-25 05:07:42 +00002715 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
paul718e3742002-12-13 20:15:29 +00002716 vty_out (vty, " This router is an ASBR "
2717 "(injecting external routing information)%s", VTY_NEWLINE);
2718
2719 /* Show Number of AS-external-LSAs. */
hassofe71a972004-12-22 16:16:02 +00002720 vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2721 ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2722 ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2723#ifdef HAVE_OPAQUE_LSA
2724 vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2725 ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2726 ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2727#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002728 /* Show number of areas attached. */
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002729 vty_out (vty, " Number of areas attached to this router: %d%s",
2730 listcount (ospf->areas), VTY_NEWLINE);
2731
2732 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2733 {
2734 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2735 vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2736 else
2737 vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2738 }
2739
2740 vty_out (vty, "%s",VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002741
2742 /* Show each area status. */
paul1eb8ef22005-04-07 07:30:20 +00002743 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2744 show_ip_ospf_area (vty, area);
paul718e3742002-12-13 20:15:29 +00002745
2746 return CMD_SUCCESS;
2747}
2748
2749
ajsfd651fa2005-03-29 16:08:16 +00002750static void
paul68980082003-03-25 05:07:42 +00002751show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2752 struct interface *ifp)
paul718e3742002-12-13 20:15:29 +00002753{
ajsfd651fa2005-03-29 16:08:16 +00002754 int is_up;
paul718e3742002-12-13 20:15:29 +00002755 struct ospf_neighbor *nbr;
paul718e3742002-12-13 20:15:29 +00002756 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00002757
paul718e3742002-12-13 20:15:29 +00002758 /* Is interface up? */
ajsfd651fa2005-03-29 16:08:16 +00002759 vty_out (vty, "%s is %s%s", ifp->name,
2760 ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
ajsd2fc8892005-04-02 18:38:43 +00002761 vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2762 ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2763 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002764
2765 /* Is interface OSPF enabled? */
ajsfd651fa2005-03-29 16:08:16 +00002766 if (ospf_oi_count(ifp) == 0)
paul718e3742002-12-13 20:15:29 +00002767 {
2768 vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2769 return;
2770 }
ajsfd651fa2005-03-29 16:08:16 +00002771 else if (!is_up)
2772 {
2773 vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2774 VTY_NEWLINE);
2775 return;
2776 }
2777
paul718e3742002-12-13 20:15:29 +00002778 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2779 {
2780 struct ospf_interface *oi = rn->info;
2781
2782 if (oi == NULL)
2783 continue;
2784
2785 /* Show OSPF interface information. */
2786 vty_out (vty, " Internet Address %s/%d,",
2787 inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2788
Paul Jakma9c27ef92006-05-04 07:32:57 +00002789 if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2790 {
2791 struct in_addr *dest;
2792 const char *dstr;
2793
2794 if ((ifp->flags & IFF_POINTOPOINT)
2795 || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2796 dstr = "Peer";
2797 else
2798 dstr = "Broadcast";
2799
2800 /* For Vlinks, showing the peer address is probably more
2801 * informative than the local interface that is being used
2802 */
2803 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2804 dest = &oi->vl_data->peer_addr;
2805 else
2806 dest = &oi->connected->destination->u.prefix4;
2807
2808 vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2809 }
hasso3fb9cd62004-10-19 19:44:43 +00002810
paul718e3742002-12-13 20:15:29 +00002811 vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2812 VTY_NEWLINE);
2813
vincentba682532005-09-29 13:52:57 +00002814 vty_out (vty, " MTU mismatch detection:%s%s",
2815 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2816
paul718e3742002-12-13 20:15:29 +00002817 vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
paul68980082003-03-25 05:07:42 +00002818 inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
paul718e3742002-12-13 20:15:29 +00002819 oi->output_cost, VTY_NEWLINE);
2820
2821 vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2822 OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2823 PRIORITY (oi), VTY_NEWLINE);
2824
2825 /* Show DR information. */
2826 if (DR (oi).s_addr == 0)
2827 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2828 else
2829 {
2830 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2831 if (nbr == NULL)
2832 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2833 else
2834 {
2835 vty_out (vty, " Designated Router (ID) %s,",
2836 inet_ntoa (nbr->router_id));
2837 vty_out (vty, " Interface Address %s%s",
2838 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2839 }
2840 }
2841
2842 /* Show BDR information. */
2843 if (BDR (oi).s_addr == 0)
2844 vty_out (vty, " No backup designated router on this network%s",
2845 VTY_NEWLINE);
2846 else
2847 {
2848 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2849 if (nbr == NULL)
2850 vty_out (vty, " No backup designated router on this network%s",
2851 VTY_NEWLINE);
2852 else
2853 {
2854 vty_out (vty, " Backup Designated Router (ID) %s,",
2855 inet_ntoa (nbr->router_id));
2856 vty_out (vty, " Interface Address %s%s",
2857 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2858 }
2859 }
ajsba6454e2005-02-08 15:37:30 +00002860
2861 vty_out (vty, " Multicast group memberships:");
Paul Jakma429ac782006-06-15 18:40:49 +00002862 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2863 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2864 {
2865 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2866 vty_out (vty, " OSPFAllRouters");
2867 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2868 vty_out (vty, " OSPFDesignatedRouters");
2869 }
2870 else
ajsba6454e2005-02-08 15:37:30 +00002871 vty_out (vty, " <None>");
2872 vty_out (vty, "%s", VTY_NEWLINE);
2873
paul718e3742002-12-13 20:15:29 +00002874 vty_out (vty, " Timer intervals configured,");
paulf9ad9372005-10-21 00:45:17 +00002875 vty_out (vty, " Hello ");
2876 if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2877 vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2878 else
2879 vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2880 vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2881 OSPF_IF_PARAM (oi, v_wait),
paul718e3742002-12-13 20:15:29 +00002882 OSPF_IF_PARAM (oi, v_wait),
2883 OSPF_IF_PARAM (oi, retransmit_interval),
2884 VTY_NEWLINE);
2885
2886 if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_ACTIVE)
paulf9ad9372005-10-21 00:45:17 +00002887 {
ajs649654a2005-11-16 20:17:52 +00002888 char timebuf[OSPF_TIME_DUMP_SIZE];
paulf9ad9372005-10-21 00:45:17 +00002889 vty_out (vty, " Hello due in %s%s",
ajs649654a2005-11-16 20:17:52 +00002890 ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
paulf9ad9372005-10-21 00:45:17 +00002891 VTY_NEWLINE);
2892 }
paul718e3742002-12-13 20:15:29 +00002893 else /* OSPF_IF_PASSIVE is set */
2894 vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2895
2896 vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
paul68980082003-03-25 05:07:42 +00002897 ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
paul718e3742002-12-13 20:15:29 +00002898 VTY_NEWLINE);
2899 }
2900}
2901
2902DEFUN (show_ip_ospf_interface,
2903 show_ip_ospf_interface_cmd,
2904 "show ip ospf interface [INTERFACE]",
2905 SHOW_STR
2906 IP_STR
2907 "OSPF information\n"
2908 "Interface information\n"
2909 "Interface name\n")
2910{
2911 struct interface *ifp;
paul020709f2003-04-04 02:44:16 +00002912 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00002913 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002914
paul020709f2003-04-04 02:44:16 +00002915 ospf = ospf_lookup ();
Paul Jakmacac3b5c2006-05-11 13:31:11 +00002916 if (ospf == NULL)
2917 {
2918 vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
2919 return CMD_SUCCESS;
2920 }
paul020709f2003-04-04 02:44:16 +00002921
paul718e3742002-12-13 20:15:29 +00002922 /* Show All Interfaces. */
2923 if (argc == 0)
paul1eb8ef22005-04-07 07:30:20 +00002924 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
2925 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00002926 /* Interface name is specified. */
2927 else
2928 {
2929 if ((ifp = if_lookup_by_name (argv[0])) == NULL)
2930 vty_out (vty, "No such interface name%s", VTY_NEWLINE);
2931 else
paul68980082003-03-25 05:07:42 +00002932 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00002933 }
2934
2935 return CMD_SUCCESS;
2936}
2937
paul4dadc292005-05-06 21:37:42 +00002938static void
pauld24f6e22005-10-21 09:23:12 +00002939show_ip_ospf_neighbour_header (struct vty *vty)
2940{
2941 vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
2942 VTY_NEWLINE,
2943 "Neighbor ID", "Pri", "State", "Dead Time",
2944 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
2945 VTY_NEWLINE);
2946}
2947
2948static void
paul718e3742002-12-13 20:15:29 +00002949show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
2950{
2951 struct route_node *rn;
2952 struct ospf_neighbor *nbr;
2953 char msgbuf[16];
ajs649654a2005-11-16 20:17:52 +00002954 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002955
2956 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
2957 if ((nbr = rn->info))
2958 /* Do not show myself. */
2959 if (nbr != oi->nbr_self)
2960 /* Down state is not shown. */
2961 if (nbr->state != NSM_Down)
2962 {
2963 ospf_nbr_state_message (nbr, msgbuf, 16);
2964
2965 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
pauld24f6e22005-10-21 09:23:12 +00002966 vty_out (vty, "%-15s %3d %-15s ",
2967 "-", nbr->priority,
2968 msgbuf);
2969 else
2970 vty_out (vty, "%-15s %3d %-15s ",
2971 inet_ntoa (nbr->router_id), nbr->priority,
2972 msgbuf);
2973
2974 vty_out (vty, "%9s ",
2975 ospf_timer_dump (nbr->t_inactivity, timebuf,
2976 sizeof(timebuf)));
2977
paul718e3742002-12-13 20:15:29 +00002978 vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
pauld24f6e22005-10-21 09:23:12 +00002979 vty_out (vty, "%-20s %5ld %5ld %5d%s",
paul718e3742002-12-13 20:15:29 +00002980 IF_NAME (oi), ospf_ls_retransmit_count (nbr),
2981 ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
2982 VTY_NEWLINE);
2983 }
2984}
2985
2986DEFUN (show_ip_ospf_neighbor,
2987 show_ip_ospf_neighbor_cmd,
2988 "show ip ospf neighbor",
2989 SHOW_STR
2990 IP_STR
2991 "OSPF information\n"
2992 "Neighbor list\n")
2993{
paul020709f2003-04-04 02:44:16 +00002994 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00002995 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00002996 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002997
paul020709f2003-04-04 02:44:16 +00002998 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002999 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003000 {
3001 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3002 return CMD_SUCCESS;
3003 }
3004
pauld24f6e22005-10-21 09:23:12 +00003005 show_ip_ospf_neighbour_header (vty);
paul718e3742002-12-13 20:15:29 +00003006
paul1eb8ef22005-04-07 07:30:20 +00003007 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3008 show_ip_ospf_neighbor_sub (vty, oi);
paul718e3742002-12-13 20:15:29 +00003009
3010 return CMD_SUCCESS;
3011}
3012
3013DEFUN (show_ip_ospf_neighbor_all,
3014 show_ip_ospf_neighbor_all_cmd,
3015 "show ip ospf neighbor all",
3016 SHOW_STR
3017 IP_STR
3018 "OSPF information\n"
3019 "Neighbor list\n"
3020 "include down status neighbor\n")
3021{
paul68980082003-03-25 05:07:42 +00003022 struct ospf *ospf = vty->index;
hasso52dc7ee2004-09-23 19:18:23 +00003023 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003024 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003025
paul68980082003-03-25 05:07:42 +00003026 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003027 {
3028 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3029 return CMD_SUCCESS;
3030 }
pauld24f6e22005-10-21 09:23:12 +00003031
3032 show_ip_ospf_neighbour_header (vty);
3033
paul1eb8ef22005-04-07 07:30:20 +00003034 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003035 {
hasso52dc7ee2004-09-23 19:18:23 +00003036 struct listnode *nbr_node;
paul1eb8ef22005-04-07 07:30:20 +00003037 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003038
3039 show_ip_ospf_neighbor_sub (vty, oi);
3040
3041 /* print Down neighbor status */
paul1eb8ef22005-04-07 07:30:20 +00003042 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
paul718e3742002-12-13 20:15:29 +00003043 {
paul718e3742002-12-13 20:15:29 +00003044 if (nbr_nbma->nbr == NULL
3045 || nbr_nbma->nbr->state == NSM_Down)
3046 {
pauld24f6e22005-10-21 09:23:12 +00003047 vty_out (vty, "%-15s %3d %-15s %9s ",
paul718e3742002-12-13 20:15:29 +00003048 "-", nbr_nbma->priority, "Down", "-");
pauld24f6e22005-10-21 09:23:12 +00003049 vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
paul718e3742002-12-13 20:15:29 +00003050 inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3051 0, 0, 0, VTY_NEWLINE);
3052 }
3053 }
3054 }
3055
3056 return CMD_SUCCESS;
3057}
3058
3059DEFUN (show_ip_ospf_neighbor_int,
3060 show_ip_ospf_neighbor_int_cmd,
hassobb5b7552005-08-21 20:01:15 +00003061 "show ip ospf neighbor IFNAME",
paul718e3742002-12-13 20:15:29 +00003062 SHOW_STR
3063 IP_STR
3064 "OSPF information\n"
3065 "Neighbor list\n"
3066 "Interface name\n")
3067{
paul020709f2003-04-04 02:44:16 +00003068 struct ospf *ospf;
hassobb5b7552005-08-21 20:01:15 +00003069 struct interface *ifp;
3070 struct route_node *rn;
3071
3072 ifp = if_lookup_by_name (argv[0]);
3073 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003074 {
hassobb5b7552005-08-21 20:01:15 +00003075 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003076 return CMD_WARNING;
3077 }
3078
paul020709f2003-04-04 02:44:16 +00003079 ospf = ospf_lookup ();
3080 if (ospf == NULL)
3081 {
3082 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3083 return CMD_SUCCESS;
3084 }
pauld24f6e22005-10-21 09:23:12 +00003085
3086 show_ip_ospf_neighbour_header (vty);
3087
hassobb5b7552005-08-21 20:01:15 +00003088 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00003089 {
hassobb5b7552005-08-21 20:01:15 +00003090 struct ospf_interface *oi = rn->info;
3091
3092 if (oi == NULL)
3093 continue;
3094
paul718e3742002-12-13 20:15:29 +00003095 show_ip_ospf_neighbor_sub (vty, oi);
3096 }
3097
3098 return CMD_SUCCESS;
3099}
3100
paul4dadc292005-05-06 21:37:42 +00003101static void
paul718e3742002-12-13 20:15:29 +00003102show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3103 struct ospf_nbr_nbma *nbr_nbma)
3104{
ajs649654a2005-11-16 20:17:52 +00003105 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003106
3107 /* Show neighbor ID. */
3108 vty_out (vty, " Neighbor %s,", "-");
3109
3110 /* Show interface address. */
3111 vty_out (vty, " interface address %s%s",
3112 inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3113 /* Show Area ID. */
3114 vty_out (vty, " In the area %s via interface %s%s",
3115 ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3116 /* Show neighbor priority and state. */
3117 vty_out (vty, " Neighbor priority is %d, State is %s,",
3118 nbr_nbma->priority, "Down");
3119 /* Show state changes. */
3120 vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3121
3122 /* Show PollInterval */
3123 vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3124
3125 /* Show poll-interval timer. */
3126 vty_out (vty, " Poll timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003127 ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3128 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003129
3130 /* Show poll-interval timer thread. */
3131 vty_out (vty, " Thread Poll Timer %s%s",
3132 nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3133}
3134
paul4dadc292005-05-06 21:37:42 +00003135static void
paul718e3742002-12-13 20:15:29 +00003136show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3137 struct ospf_neighbor *nbr)
3138{
ajs649654a2005-11-16 20:17:52 +00003139 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003140
3141 /* Show neighbor ID. */
3142 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3143 vty_out (vty, " Neighbor %s,", "-");
3144 else
3145 vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3146
3147 /* Show interface address. */
3148 vty_out (vty, " interface address %s%s",
3149 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3150 /* Show Area ID. */
3151 vty_out (vty, " In the area %s via interface %s%s",
3152 ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3153 /* Show neighbor priority and state. */
3154 vty_out (vty, " Neighbor priority is %d, State is %s,",
3155 nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3156 /* Show state changes. */
3157 vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
Paul Jakma3fed4162006-07-25 20:44:12 +00003158 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
Paul Jakma90c33172006-07-11 17:57:25 +00003159 {
Paul Jakma3fed4162006-07-25 20:44:12 +00003160 struct timeval res = tv_sub (recent_time, nbr->ts_last_progress);
3161 vty_out (vty, " Most recent state change statistics:%s",
3162 VTY_NEWLINE);
3163 vty_out (vty, " Progressive change %s ago%s",
Paul Jakma90c33172006-07-11 17:57:25 +00003164 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
Paul Jakma3fed4162006-07-25 20:44:12 +00003165 VTY_NEWLINE);
3166 }
3167 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3168 {
3169 struct timeval res = tv_sub (recent_time, nbr->ts_last_regress);
3170 vty_out (vty, " Regressive change %s ago, due to %s%s",
3171 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3172 (nbr->last_regress_str ? nbr->last_regress_str : "??"),
Paul Jakma90c33172006-07-11 17:57:25 +00003173 VTY_NEWLINE);
3174 }
paul718e3742002-12-13 20:15:29 +00003175 /* Show Designated Rotuer ID. */
3176 vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3177 /* Show Backup Designated Rotuer ID. */
3178 vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3179 /* Show options. */
3180 vty_out (vty, " Options %d %s%s", nbr->options,
3181 ospf_options_dump (nbr->options), VTY_NEWLINE);
3182 /* Show Router Dead interval timer. */
3183 vty_out (vty, " Dead timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003184 ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3185 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003186 /* Show Database Summary list. */
3187 vty_out (vty, " Database Summary List %d%s",
3188 ospf_db_summary_count (nbr), VTY_NEWLINE);
3189 /* Show Link State Request list. */
3190 vty_out (vty, " Link State Request List %ld%s",
3191 ospf_ls_request_count (nbr), VTY_NEWLINE);
3192 /* Show Link State Retransmission list. */
3193 vty_out (vty, " Link State Retransmission List %ld%s",
3194 ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3195 /* Show inactivity timer thread. */
3196 vty_out (vty, " Thread Inactivity Timer %s%s",
3197 nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3198 /* Show Database Description retransmission thread. */
3199 vty_out (vty, " Thread Database Description Retransmision %s%s",
3200 nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3201 /* Show Link State Request Retransmission thread. */
3202 vty_out (vty, " Thread Link State Request Retransmission %s%s",
3203 nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3204 /* Show Link State Update Retransmission thread. */
3205 vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3206 nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3207}
3208
3209DEFUN (show_ip_ospf_neighbor_id,
3210 show_ip_ospf_neighbor_id_cmd,
3211 "show ip ospf neighbor A.B.C.D",
3212 SHOW_STR
3213 IP_STR
3214 "OSPF information\n"
3215 "Neighbor list\n"
3216 "Neighbor ID\n")
3217{
paul020709f2003-04-04 02:44:16 +00003218 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003219 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003220 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003221 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003222 struct in_addr router_id;
3223 int ret;
3224
3225 ret = inet_aton (argv[0], &router_id);
3226 if (!ret)
3227 {
3228 vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3229 return CMD_WARNING;
3230 }
3231
paul020709f2003-04-04 02:44:16 +00003232 ospf = ospf_lookup ();
3233 if (ospf == NULL)
3234 {
3235 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3236 return CMD_SUCCESS;
3237 }
3238
paul1eb8ef22005-04-07 07:30:20 +00003239 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3240 if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
Andrew J. Schorr1c066bf2006-06-30 16:53:47 +00003241 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003242
paul718e3742002-12-13 20:15:29 +00003243 return CMD_SUCCESS;
3244}
3245
3246DEFUN (show_ip_ospf_neighbor_detail,
3247 show_ip_ospf_neighbor_detail_cmd,
3248 "show ip ospf neighbor detail",
3249 SHOW_STR
3250 IP_STR
3251 "OSPF information\n"
3252 "Neighbor list\n"
3253 "detail of all neighbors\n")
3254{
paul020709f2003-04-04 02:44:16 +00003255 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003256 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003257 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003258
paul020709f2003-04-04 02:44:16 +00003259 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003260 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003261 {
3262 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3263 return CMD_SUCCESS;
3264 }
paul718e3742002-12-13 20:15:29 +00003265
paul1eb8ef22005-04-07 07:30:20 +00003266 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003267 {
paul718e3742002-12-13 20:15:29 +00003268 struct route_node *rn;
3269 struct ospf_neighbor *nbr;
3270
3271 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3272 if ((nbr = rn->info))
3273 if (nbr != oi->nbr_self)
3274 if (nbr->state != NSM_Down)
3275 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3276 }
3277
3278 return CMD_SUCCESS;
3279}
3280
3281DEFUN (show_ip_ospf_neighbor_detail_all,
3282 show_ip_ospf_neighbor_detail_all_cmd,
3283 "show ip ospf neighbor detail all",
3284 SHOW_STR
3285 IP_STR
3286 "OSPF information\n"
3287 "Neighbor list\n"
3288 "detail of all neighbors\n"
3289 "include down status neighbor\n")
3290{
paul020709f2003-04-04 02:44:16 +00003291 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003292 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003293 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003294
paul020709f2003-04-04 02:44:16 +00003295 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003296 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003297 {
3298 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3299 return CMD_SUCCESS;
3300 }
paul718e3742002-12-13 20:15:29 +00003301
paul1eb8ef22005-04-07 07:30:20 +00003302 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003303 {
paul718e3742002-12-13 20:15:29 +00003304 struct route_node *rn;
3305 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003306 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003307
3308 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3309 if ((nbr = rn->info))
3310 if (nbr != oi->nbr_self)
3311 if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3312 show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3313
3314 if (oi->type == OSPF_IFTYPE_NBMA)
3315 {
hasso52dc7ee2004-09-23 19:18:23 +00003316 struct listnode *nd;
paul718e3742002-12-13 20:15:29 +00003317
paul1eb8ef22005-04-07 07:30:20 +00003318 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3319 if (nbr_nbma->nbr == NULL
3320 || nbr_nbma->nbr->state == NSM_Down)
3321 show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
paul718e3742002-12-13 20:15:29 +00003322 }
3323 }
3324
3325 return CMD_SUCCESS;
3326}
3327
3328DEFUN (show_ip_ospf_neighbor_int_detail,
3329 show_ip_ospf_neighbor_int_detail_cmd,
hassobb5b7552005-08-21 20:01:15 +00003330 "show ip ospf neighbor IFNAME detail",
paul718e3742002-12-13 20:15:29 +00003331 SHOW_STR
3332 IP_STR
3333 "OSPF information\n"
3334 "Neighbor list\n"
hassobb5b7552005-08-21 20:01:15 +00003335 "Interface name\n"
paul718e3742002-12-13 20:15:29 +00003336 "detail of all neighbors")
3337{
paul020709f2003-04-04 02:44:16 +00003338 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00003339 struct ospf_interface *oi;
hassobb5b7552005-08-21 20:01:15 +00003340 struct interface *ifp;
3341 struct route_node *rn, *nrn;
3342 struct ospf_neighbor *nbr;
3343
3344 ifp = if_lookup_by_name (argv[0]);
3345 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003346 {
hassobb5b7552005-08-21 20:01:15 +00003347 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003348 return CMD_WARNING;
3349 }
3350
paul020709f2003-04-04 02:44:16 +00003351 ospf = ospf_lookup ();
3352 if (ospf == NULL)
3353 {
3354 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3355 return CMD_SUCCESS;
3356 }
paul68980082003-03-25 05:07:42 +00003357
paul718e3742002-12-13 20:15:29 +00003358
hassobb5b7552005-08-21 20:01:15 +00003359 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3360 if ((oi = rn->info))
3361 for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3362 if ((nbr = nrn->info))
paul718e3742002-12-13 20:15:29 +00003363 if (nbr != oi->nbr_self)
3364 if (nbr->state != NSM_Down)
3365 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003366
3367 return CMD_SUCCESS;
3368}
3369
3370
3371/* Show functions */
paul4dadc292005-05-06 21:37:42 +00003372static int
paul020709f2003-04-04 02:44:16 +00003373show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
paul718e3742002-12-13 20:15:29 +00003374{
paul718e3742002-12-13 20:15:29 +00003375 struct router_lsa *rl;
3376 struct summary_lsa *sl;
3377 struct as_external_lsa *asel;
3378 struct prefix_ipv4 p;
3379
3380 if (lsa != NULL)
3381 /* If self option is set, check LSA self flag. */
3382 if (self == 0 || IS_LSA_SELF (lsa))
3383 {
3384 /* LSA common part show. */
3385 vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3386 vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3387 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3388 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3389 /* LSA specific part show. */
3390 switch (lsa->data->type)
3391 {
3392 case OSPF_ROUTER_LSA:
3393 rl = (struct router_lsa *) lsa->data;
3394 vty_out (vty, " %-d", ntohs (rl->links));
3395 break;
3396 case OSPF_SUMMARY_LSA:
3397 sl = (struct summary_lsa *) lsa->data;
3398
3399 p.family = AF_INET;
3400 p.prefix = sl->header.id;
3401 p.prefixlen = ip_masklen (sl->mask);
3402 apply_mask_ipv4 (&p);
3403
3404 vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3405 break;
3406 case OSPF_AS_EXTERNAL_LSA:
paul551a8972003-05-18 15:22:55 +00003407 case OSPF_AS_NSSA_LSA:
paul718e3742002-12-13 20:15:29 +00003408 asel = (struct as_external_lsa *) lsa->data;
3409
3410 p.family = AF_INET;
3411 p.prefix = asel->header.id;
3412 p.prefixlen = ip_masklen (asel->mask);
3413 apply_mask_ipv4 (&p);
3414
3415 vty_out (vty, " %s %s/%d [0x%lx]",
3416 IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3417 inet_ntoa (p.prefix), p.prefixlen,
3418 (u_long)ntohl (asel->e[0].route_tag));
3419 break;
3420 case OSPF_NETWORK_LSA:
3421 case OSPF_ASBR_SUMMARY_LSA:
3422#ifdef HAVE_OPAQUE_LSA
3423 case OSPF_OPAQUE_LINK_LSA:
3424 case OSPF_OPAQUE_AREA_LSA:
3425 case OSPF_OPAQUE_AS_LSA:
3426#endif /* HAVE_OPAQUE_LSA */
3427 default:
3428 break;
3429 }
3430 vty_out (vty, VTY_NEWLINE);
3431 }
3432
3433 return 0;
3434}
3435
hassoeb1ce602004-10-08 08:17:22 +00003436const char *show_database_desc[] =
paul718e3742002-12-13 20:15:29 +00003437{
3438 "unknown",
3439 "Router Link States",
3440 "Net Link States",
3441 "Summary Link States",
3442 "ASBR-Summary Link States",
3443 "AS External Link States",
paul718e3742002-12-13 20:15:29 +00003444 "Group Membership LSA",
3445 "NSSA-external Link States",
paul718e3742002-12-13 20:15:29 +00003446#ifdef HAVE_OPAQUE_LSA
3447 "Type-8 LSA",
3448 "Link-Local Opaque-LSA",
3449 "Area-Local Opaque-LSA",
3450 "AS-external Opaque-LSA",
3451#endif /* HAVE_OPAQUE_LSA */
3452};
3453
3454#define SHOW_OSPF_COMMON_HEADER \
3455 "Link ID ADV Router Age Seq# CkSum"
3456
hassoeb1ce602004-10-08 08:17:22 +00003457const char *show_database_header[] =
paul718e3742002-12-13 20:15:29 +00003458{
3459 "",
3460 "Link ID ADV Router Age Seq# CkSum Link count",
3461 "Link ID ADV Router Age Seq# CkSum",
3462 "Link ID ADV Router Age Seq# CkSum Route",
3463 "Link ID ADV Router Age Seq# CkSum",
3464 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003465 " --- header for Group Member ----",
3466 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003467#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003468 " --- type-8 ---",
3469 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3470 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3471 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3472#endif /* HAVE_OPAQUE_LSA */
3473};
3474
hassoeb1ce602004-10-08 08:17:22 +00003475const char *show_lsa_flags[] =
paul4957f492003-06-27 01:28:45 +00003476{
3477 "Self-originated",
3478 "Checked",
3479 "Received",
3480 "Approved",
3481 "Discard",
paul4957f492003-06-27 01:28:45 +00003482 "Translated",
paul4957f492003-06-27 01:28:45 +00003483};
3484
paul4dadc292005-05-06 21:37:42 +00003485static void
paul718e3742002-12-13 20:15:29 +00003486show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3487{
3488 struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
paul4957f492003-06-27 01:28:45 +00003489
paul718e3742002-12-13 20:15:29 +00003490 vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
paul4957f492003-06-27 01:28:45 +00003491 vty_out (vty, " Options: 0x%-2x : %s%s",
3492 lsa->data->options,
3493 ospf_options_dump(lsa->data->options),
3494 VTY_NEWLINE);
3495 vty_out (vty, " LS Flags: 0x%-2x %s%s",
paul9d526032003-06-30 22:46:14 +00003496 lsa->flags,
paul4957f492003-06-27 01:28:45 +00003497 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3498 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003499
3500 if (lsa->data->type == OSPF_ROUTER_LSA)
3501 {
3502 vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3503
3504 if (rlsa->flags)
3505 vty_out (vty, " :%s%s%s%s",
3506 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3507 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3508 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3509 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3510
3511 vty_out (vty, "%s", VTY_NEWLINE);
3512 }
3513 vty_out (vty, " LS Type: %s%s",
3514 LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3515 vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3516 LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3517 vty_out (vty, " Advertising Router: %s%s",
3518 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3519 vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3520 VTY_NEWLINE);
3521 vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3522 VTY_NEWLINE);
3523 vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3524}
3525
hassoeb1ce602004-10-08 08:17:22 +00003526const char *link_type_desc[] =
paul718e3742002-12-13 20:15:29 +00003527{
3528 "(null)",
3529 "another Router (point-to-point)",
3530 "a Transit Network",
3531 "Stub Network",
3532 "a Virtual Link",
3533};
3534
hassoeb1ce602004-10-08 08:17:22 +00003535const char *link_id_desc[] =
paul718e3742002-12-13 20:15:29 +00003536{
3537 "(null)",
3538 "Neighboring Router ID",
3539 "Designated Router address",
paul68980082003-03-25 05:07:42 +00003540 "Net",
paul718e3742002-12-13 20:15:29 +00003541 "Neighboring Router ID",
3542};
3543
hassoeb1ce602004-10-08 08:17:22 +00003544const char *link_data_desc[] =
paul718e3742002-12-13 20:15:29 +00003545{
3546 "(null)",
3547 "Router Interface address",
3548 "Router Interface address",
3549 "Network Mask",
3550 "Router Interface address",
3551};
3552
3553/* Show router-LSA each Link information. */
paul4dadc292005-05-06 21:37:42 +00003554static void
paul718e3742002-12-13 20:15:29 +00003555show_ip_ospf_database_router_links (struct vty *vty,
3556 struct router_lsa *rl)
3557{
3558 int len, i, type;
3559
3560 len = ntohs (rl->header.length) - 4;
3561 for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3562 {
3563 type = rl->link[i].type;
3564
3565 vty_out (vty, " Link connected to: %s%s",
3566 link_type_desc[type], VTY_NEWLINE);
3567 vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3568 inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3569 vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3570 inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3571 vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3572 vty_out (vty, " TOS 0 Metric: %d%s",
3573 ntohs (rl->link[i].metric), VTY_NEWLINE);
3574 vty_out (vty, "%s", VTY_NEWLINE);
3575 }
3576}
3577
3578/* Show router-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003579static int
paul718e3742002-12-13 20:15:29 +00003580show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3581{
3582 if (lsa != NULL)
3583 {
3584 struct router_lsa *rl = (struct router_lsa *) lsa->data;
3585
3586 show_ip_ospf_database_header (vty, lsa);
3587
3588 vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3589 VTY_NEWLINE, VTY_NEWLINE);
3590
3591 show_ip_ospf_database_router_links (vty, rl);
paulb0a053b2003-06-22 09:04:47 +00003592 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003593 }
3594
3595 return 0;
3596}
3597
3598/* Show network-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003599static int
paul718e3742002-12-13 20:15:29 +00003600show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3601{
3602 int length, i;
3603
3604 if (lsa != NULL)
3605 {
3606 struct network_lsa *nl = (struct network_lsa *) lsa->data;
3607
3608 show_ip_ospf_database_header (vty, lsa);
3609
3610 vty_out (vty, " Network Mask: /%d%s",
3611 ip_masklen (nl->mask), VTY_NEWLINE);
3612
3613 length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3614
3615 for (i = 0; length > 0; i++, length -= 4)
3616 vty_out (vty, " Attached Router: %s%s",
3617 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3618
3619 vty_out (vty, "%s", VTY_NEWLINE);
3620 }
3621
3622 return 0;
3623}
3624
3625/* Show summary-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003626static int
paul718e3742002-12-13 20:15:29 +00003627show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3628{
3629 if (lsa != NULL)
3630 {
3631 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3632
3633 show_ip_ospf_database_header (vty, lsa);
3634
3635 vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3636 VTY_NEWLINE);
3637 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3638 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003639 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003640 }
3641
3642 return 0;
3643}
3644
3645/* Show summary-ASBR-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003646static int
paul718e3742002-12-13 20:15:29 +00003647show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3648{
3649 if (lsa != NULL)
3650 {
3651 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3652
3653 show_ip_ospf_database_header (vty, lsa);
3654
3655 vty_out (vty, " Network Mask: /%d%s",
3656 ip_masklen (sl->mask), VTY_NEWLINE);
3657 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3658 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003659 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003660 }
3661
3662 return 0;
3663}
3664
3665/* Show AS-external-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003666static int
paul718e3742002-12-13 20:15:29 +00003667show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3668{
3669 if (lsa != NULL)
3670 {
3671 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3672
3673 show_ip_ospf_database_header (vty, lsa);
3674
3675 vty_out (vty, " Network Mask: /%d%s",
3676 ip_masklen (al->mask), VTY_NEWLINE);
3677 vty_out (vty, " Metric Type: %s%s",
3678 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3679 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3680 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3681 vty_out (vty, " Metric: %d%s",
3682 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3683 vty_out (vty, " Forward Address: %s%s",
3684 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3685
3686 vty_out (vty, " External Route Tag: %lu%s%s",
3687 (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3688 }
3689
3690 return 0;
3691}
3692
ajs2a42e282004-12-08 18:43:03 +00003693/* N.B. This function currently seems to be unused. */
paul4dadc292005-05-06 21:37:42 +00003694static int
paul718e3742002-12-13 20:15:29 +00003695show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3696{
3697 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3698
3699 /* show_ip_ospf_database_header (vty, lsa); */
3700
ajs2a42e282004-12-08 18:43:03 +00003701 zlog_debug( " Network Mask: /%d%s",
paul718e3742002-12-13 20:15:29 +00003702 ip_masklen (al->mask), "\n");
ajs2a42e282004-12-08 18:43:03 +00003703 zlog_debug( " Metric Type: %s%s",
paul718e3742002-12-13 20:15:29 +00003704 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3705 "2 (Larger than any link state path)" : "1", "\n");
ajs2a42e282004-12-08 18:43:03 +00003706 zlog_debug( " TOS: 0%s", "\n");
3707 zlog_debug( " Metric: %d%s",
paul718e3742002-12-13 20:15:29 +00003708 GET_METRIC (al->e[0].metric), "\n");
ajs2a42e282004-12-08 18:43:03 +00003709 zlog_debug( " Forward Address: %s%s",
paul718e3742002-12-13 20:15:29 +00003710 inet_ntoa (al->e[0].fwd_addr), "\n");
3711
ajs2a42e282004-12-08 18:43:03 +00003712 zlog_debug( " External Route Tag: %u%s%s",
paul718e3742002-12-13 20:15:29 +00003713 ntohl (al->e[0].route_tag), "\n", "\n");
3714
3715 return 0;
3716}
3717
3718/* Show AS-NSSA-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003719static int
paul718e3742002-12-13 20:15:29 +00003720show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3721{
3722 if (lsa != NULL)
3723 {
3724 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3725
3726 show_ip_ospf_database_header (vty, lsa);
3727
3728 vty_out (vty, " Network Mask: /%d%s",
3729 ip_masklen (al->mask), VTY_NEWLINE);
3730 vty_out (vty, " Metric Type: %s%s",
3731 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3732 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3733 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3734 vty_out (vty, " Metric: %d%s",
3735 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3736 vty_out (vty, " NSSA: Forward Address: %s%s",
3737 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3738
3739 vty_out (vty, " External Route Tag: %u%s%s",
3740 ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3741 }
3742
3743 return 0;
3744}
3745
paul4dadc292005-05-06 21:37:42 +00003746static int
paul718e3742002-12-13 20:15:29 +00003747show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3748{
3749 return 0;
3750}
3751
3752#ifdef HAVE_OPAQUE_LSA
paul4dadc292005-05-06 21:37:42 +00003753static int
paul718e3742002-12-13 20:15:29 +00003754show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3755{
3756 if (lsa != NULL)
3757 {
3758 show_ip_ospf_database_header (vty, lsa);
3759 show_opaque_info_detail (vty, lsa);
3760
3761 vty_out (vty, "%s", VTY_NEWLINE);
3762 }
3763 return 0;
3764}
3765#endif /* HAVE_OPAQUE_LSA */
3766
3767int (*show_function[])(struct vty *, struct ospf_lsa *) =
3768{
3769 NULL,
3770 show_router_lsa_detail,
3771 show_network_lsa_detail,
3772 show_summary_lsa_detail,
3773 show_summary_asbr_lsa_detail,
3774 show_as_external_lsa_detail,
paul718e3742002-12-13 20:15:29 +00003775 show_func_dummy,
3776 show_as_nssa_lsa_detail, /* almost same as external */
paul718e3742002-12-13 20:15:29 +00003777#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003778 NULL, /* type-8 */
3779 show_opaque_lsa_detail,
3780 show_opaque_lsa_detail,
3781 show_opaque_lsa_detail,
3782#endif /* HAVE_OPAQUE_LSA */
3783};
3784
paul4dadc292005-05-06 21:37:42 +00003785static void
paul718e3742002-12-13 20:15:29 +00003786show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3787 struct in_addr *adv_router)
3788{
3789 memset (lp, 0, sizeof (struct prefix_ls));
3790 lp->family = 0;
3791 if (id == NULL)
3792 lp->prefixlen = 0;
3793 else if (adv_router == NULL)
3794 {
3795 lp->prefixlen = 32;
3796 lp->id = *id;
3797 }
3798 else
3799 {
3800 lp->prefixlen = 64;
3801 lp->id = *id;
3802 lp->adv_router = *adv_router;
3803 }
3804}
3805
paul4dadc292005-05-06 21:37:42 +00003806static void
paul718e3742002-12-13 20:15:29 +00003807show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3808 struct in_addr *id, struct in_addr *adv_router)
3809{
3810 struct prefix_ls lp;
3811 struct route_node *rn, *start;
3812 struct ospf_lsa *lsa;
3813
3814 show_lsa_prefix_set (vty, &lp, id, adv_router);
3815 start = route_node_get (rt, (struct prefix *) &lp);
3816 if (start)
3817 {
3818 route_lock_node (start);
3819 for (rn = start; rn; rn = route_next_until (rn, start))
3820 if ((lsa = rn->info))
3821 {
paul718e3742002-12-13 20:15:29 +00003822 if (show_function[lsa->data->type] != NULL)
3823 show_function[lsa->data->type] (vty, lsa);
3824 }
3825 route_unlock_node (start);
3826 }
3827}
3828
3829/* Show detail LSA information
3830 -- if id is NULL then show all LSAs. */
paul4dadc292005-05-06 21:37:42 +00003831static void
paul020709f2003-04-04 02:44:16 +00003832show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003833 struct in_addr *id, struct in_addr *adv_router)
3834{
hasso52dc7ee2004-09-23 19:18:23 +00003835 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003836 struct ospf_area *area;
3837
paul718e3742002-12-13 20:15:29 +00003838 switch (type)
3839 {
3840 case OSPF_AS_EXTERNAL_LSA:
3841#ifdef HAVE_OPAQUE_LSA
3842 case OSPF_OPAQUE_AS_LSA:
3843#endif /* HAVE_OPAQUE_LSA */
3844 vty_out (vty, " %s %s%s",
3845 show_database_desc[type],
3846 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003847 show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
paul718e3742002-12-13 20:15:29 +00003848 break;
3849 default:
paul1eb8ef22005-04-07 07:30:20 +00003850 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003851 {
paul718e3742002-12-13 20:15:29 +00003852 vty_out (vty, "%s %s (Area %s)%s%s",
3853 VTY_NEWLINE, show_database_desc[type],
3854 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3855 show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3856 }
3857 break;
3858 }
3859}
3860
paul4dadc292005-05-06 21:37:42 +00003861static void
paul718e3742002-12-13 20:15:29 +00003862show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3863 struct in_addr *adv_router)
3864{
3865 struct route_node *rn;
3866 struct ospf_lsa *lsa;
3867
3868 for (rn = route_top (rt); rn; rn = route_next (rn))
3869 if ((lsa = rn->info))
3870 if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3871 {
paul718e3742002-12-13 20:15:29 +00003872 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3873 continue;
paul718e3742002-12-13 20:15:29 +00003874 if (show_function[lsa->data->type] != NULL)
3875 show_function[lsa->data->type] (vty, lsa);
3876 }
3877}
3878
3879/* Show detail LSA information. */
paul4dadc292005-05-06 21:37:42 +00003880static void
paul020709f2003-04-04 02:44:16 +00003881show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003882 struct in_addr *adv_router)
3883{
hasso52dc7ee2004-09-23 19:18:23 +00003884 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003885 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00003886
3887 switch (type)
3888 {
3889 case OSPF_AS_EXTERNAL_LSA:
3890#ifdef HAVE_OPAQUE_LSA
3891 case OSPF_OPAQUE_AS_LSA:
3892#endif /* HAVE_OPAQUE_LSA */
3893 vty_out (vty, " %s %s%s",
3894 show_database_desc[type],
3895 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003896 show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
paul718e3742002-12-13 20:15:29 +00003897 adv_router);
3898 break;
3899 default:
paul1eb8ef22005-04-07 07:30:20 +00003900 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003901 {
paul718e3742002-12-13 20:15:29 +00003902 vty_out (vty, "%s %s (Area %s)%s%s",
3903 VTY_NEWLINE, show_database_desc[type],
3904 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3905 show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3906 adv_router);
3907 }
3908 break;
3909 }
3910}
3911
paul4dadc292005-05-06 21:37:42 +00003912static void
paul020709f2003-04-04 02:44:16 +00003913show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
paul718e3742002-12-13 20:15:29 +00003914{
paul020709f2003-04-04 02:44:16 +00003915 struct ospf_lsa *lsa;
3916 struct route_node *rn;
paul1eb8ef22005-04-07 07:30:20 +00003917 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +00003918 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003919 int type;
3920
paul1eb8ef22005-04-07 07:30:20 +00003921 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003922 {
paul718e3742002-12-13 20:15:29 +00003923 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3924 {
3925 switch (type)
3926 {
3927 case OSPF_AS_EXTERNAL_LSA:
3928#ifdef HAVE_OPAQUE_LSA
3929 case OSPF_OPAQUE_AS_LSA:
3930#endif /* HAVE_OPAQUE_LSA */
3931 continue;
3932 default:
3933 break;
3934 }
3935 if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
3936 (!self && ospf_lsdb_count (area->lsdb, type) > 0))
3937 {
3938 vty_out (vty, " %s (Area %s)%s%s",
3939 show_database_desc[type],
3940 ospf_area_desc_string (area),
3941 VTY_NEWLINE, VTY_NEWLINE);
3942 vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
3943
paul020709f2003-04-04 02:44:16 +00003944 LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
3945 show_lsa_summary (vty, lsa, self);
paul718e3742002-12-13 20:15:29 +00003946
3947 vty_out (vty, "%s", VTY_NEWLINE);
3948 }
3949 }
3950 }
3951
3952 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3953 {
3954 switch (type)
3955 {
3956 case OSPF_AS_EXTERNAL_LSA:
3957#ifdef HAVE_OPAQUE_LSA
3958 case OSPF_OPAQUE_AS_LSA:
3959#endif /* HAVE_OPAQUE_LSA */
paule8e19462006-01-19 20:16:55 +00003960 break;
paul718e3742002-12-13 20:15:29 +00003961 default:
3962 continue;
3963 }
paul68980082003-03-25 05:07:42 +00003964 if (ospf_lsdb_count_self (ospf->lsdb, type) ||
3965 (!self && ospf_lsdb_count (ospf->lsdb, type)))
paul718e3742002-12-13 20:15:29 +00003966 {
3967 vty_out (vty, " %s%s%s",
3968 show_database_desc[type],
3969 VTY_NEWLINE, VTY_NEWLINE);
3970 vty_out (vty, "%s%s", show_database_header[type],
3971 VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00003972
3973 LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
3974 show_lsa_summary (vty, lsa, self);
3975
paul718e3742002-12-13 20:15:29 +00003976 vty_out (vty, "%s", VTY_NEWLINE);
3977 }
3978 }
3979
3980 vty_out (vty, "%s", VTY_NEWLINE);
3981}
3982
paul4dadc292005-05-06 21:37:42 +00003983static void
paul020709f2003-04-04 02:44:16 +00003984show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00003985{
hasso52dc7ee2004-09-23 19:18:23 +00003986 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003987 struct ospf_lsa *lsa;
3988
3989 vty_out (vty, "%s MaxAge Link States:%s%s",
3990 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
3991
paul1eb8ef22005-04-07 07:30:20 +00003992 for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
3993 {
3994 vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
3995 vty_out (vty, "Link State ID: %s%s",
3996 inet_ntoa (lsa->data->id), VTY_NEWLINE);
3997 vty_out (vty, "Advertising Router: %s%s",
3998 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3999 vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4000 vty_out (vty, "%s", VTY_NEWLINE);
4001 }
paul718e3742002-12-13 20:15:29 +00004002}
4003
paul718e3742002-12-13 20:15:29 +00004004#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4005#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
paul718e3742002-12-13 20:15:29 +00004006
4007#ifdef HAVE_OPAQUE_LSA
4008#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4009#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4010#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4011#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4012#else /* HAVE_OPAQUE_LSA */
4013#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4014#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4015#define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4016#define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4017#endif /* HAVE_OPAQUE_LSA */
4018
4019#define OSPF_LSA_TYPES_CMD_STR \
4020 "asbr-summary|external|network|router|summary" \
4021 OSPF_LSA_TYPE_NSSA_CMD_STR \
4022 OSPF_LSA_TYPE_OPAQUE_CMD_STR
4023
4024#define OSPF_LSA_TYPES_DESC \
4025 "ASBR summary link states\n" \
4026 "External link states\n" \
4027 "Network link states\n" \
4028 "Router link states\n" \
4029 "Network summary link states\n" \
4030 OSPF_LSA_TYPE_NSSA_DESC \
4031 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4032 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4033 OSPF_LSA_TYPE_OPAQUE_AS_DESC
4034
4035DEFUN (show_ip_ospf_database,
4036 show_ip_ospf_database_cmd,
4037 "show ip ospf database",
4038 SHOW_STR
4039 IP_STR
4040 "OSPF information\n"
4041 "Database summary\n")
4042{
paul020709f2003-04-04 02:44:16 +00004043 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004044 int type, ret;
4045 struct in_addr id, adv_router;
4046
paul020709f2003-04-04 02:44:16 +00004047 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004048 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004049 {
4050 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4051 return CMD_SUCCESS;
4052 }
paul718e3742002-12-13 20:15:29 +00004053
4054 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004055 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004056
4057 /* Show all LSA. */
4058 if (argc == 0)
4059 {
paul020709f2003-04-04 02:44:16 +00004060 show_ip_ospf_database_summary (vty, ospf, 0);
paul718e3742002-12-13 20:15:29 +00004061 return CMD_SUCCESS;
4062 }
4063
4064 /* Set database type to show. */
4065 if (strncmp (argv[0], "r", 1) == 0)
4066 type = OSPF_ROUTER_LSA;
4067 else if (strncmp (argv[0], "ne", 2) == 0)
4068 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004069 else if (strncmp (argv[0], "ns", 2) == 0)
4070 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004071 else if (strncmp (argv[0], "su", 2) == 0)
4072 type = OSPF_SUMMARY_LSA;
4073 else if (strncmp (argv[0], "a", 1) == 0)
4074 type = OSPF_ASBR_SUMMARY_LSA;
4075 else if (strncmp (argv[0], "e", 1) == 0)
4076 type = OSPF_AS_EXTERNAL_LSA;
4077 else if (strncmp (argv[0], "se", 2) == 0)
4078 {
paul020709f2003-04-04 02:44:16 +00004079 show_ip_ospf_database_summary (vty, ospf, 1);
paul718e3742002-12-13 20:15:29 +00004080 return CMD_SUCCESS;
4081 }
4082 else if (strncmp (argv[0], "m", 1) == 0)
4083 {
paul020709f2003-04-04 02:44:16 +00004084 show_ip_ospf_database_maxage (vty, ospf);
paul718e3742002-12-13 20:15:29 +00004085 return CMD_SUCCESS;
4086 }
4087#ifdef HAVE_OPAQUE_LSA
4088 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4089 type = OSPF_OPAQUE_LINK_LSA;
4090 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4091 type = OSPF_OPAQUE_AREA_LSA;
4092 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4093 type = OSPF_OPAQUE_AS_LSA;
4094#endif /* HAVE_OPAQUE_LSA */
4095 else
4096 return CMD_WARNING;
4097
4098 /* `show ip ospf database LSA'. */
4099 if (argc == 1)
paul020709f2003-04-04 02:44:16 +00004100 show_lsa_detail (vty, ospf, type, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00004101 else if (argc >= 2)
4102 {
4103 ret = inet_aton (argv[1], &id);
4104 if (!ret)
4105 return CMD_WARNING;
4106
4107 /* `show ip ospf database LSA ID'. */
4108 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00004109 show_lsa_detail (vty, ospf, type, &id, NULL);
paul718e3742002-12-13 20:15:29 +00004110 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4111 else if (argc == 3)
4112 {
4113 if (strncmp (argv[2], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004114 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004115 else
4116 {
4117 ret = inet_aton (argv[2], &adv_router);
4118 if (!ret)
4119 return CMD_WARNING;
4120 }
paul020709f2003-04-04 02:44:16 +00004121 show_lsa_detail (vty, ospf, type, &id, &adv_router);
paul718e3742002-12-13 20:15:29 +00004122 }
4123 }
4124
4125 return CMD_SUCCESS;
4126}
4127
4128ALIAS (show_ip_ospf_database,
4129 show_ip_ospf_database_type_cmd,
4130 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4131 SHOW_STR
4132 IP_STR
4133 "OSPF information\n"
4134 "Database summary\n"
4135 OSPF_LSA_TYPES_DESC
4136 "LSAs in MaxAge list\n"
4137 "Self-originated link states\n")
4138
4139ALIAS (show_ip_ospf_database,
4140 show_ip_ospf_database_type_id_cmd,
4141 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4142 SHOW_STR
4143 IP_STR
4144 "OSPF information\n"
4145 "Database summary\n"
4146 OSPF_LSA_TYPES_DESC
4147 "Link State ID (as an IP address)\n")
4148
4149ALIAS (show_ip_ospf_database,
4150 show_ip_ospf_database_type_id_adv_router_cmd,
4151 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4152 SHOW_STR
4153 IP_STR
4154 "OSPF information\n"
4155 "Database summary\n"
4156 OSPF_LSA_TYPES_DESC
4157 "Link State ID (as an IP address)\n"
4158 "Advertising Router link states\n"
4159 "Advertising Router (as an IP address)\n")
4160
4161ALIAS (show_ip_ospf_database,
4162 show_ip_ospf_database_type_id_self_cmd,
4163 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4164 SHOW_STR
4165 IP_STR
4166 "OSPF information\n"
4167 "Database summary\n"
4168 OSPF_LSA_TYPES_DESC
4169 "Link State ID (as an IP address)\n"
4170 "Self-originated link states\n"
4171 "\n")
4172
4173DEFUN (show_ip_ospf_database_type_adv_router,
4174 show_ip_ospf_database_type_adv_router_cmd,
4175 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4176 SHOW_STR
4177 IP_STR
4178 "OSPF information\n"
4179 "Database summary\n"
4180 OSPF_LSA_TYPES_DESC
4181 "Advertising Router link states\n"
4182 "Advertising Router (as an IP address)\n")
4183{
paul020709f2003-04-04 02:44:16 +00004184 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004185 int type, ret;
4186 struct in_addr adv_router;
4187
paul020709f2003-04-04 02:44:16 +00004188 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004189 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004190 {
4191 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4192 return CMD_SUCCESS;
4193 }
paul718e3742002-12-13 20:15:29 +00004194
4195 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004196 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004197
4198 if (argc != 2)
4199 return CMD_WARNING;
4200
4201 /* Set database type to show. */
4202 if (strncmp (argv[0], "r", 1) == 0)
4203 type = OSPF_ROUTER_LSA;
4204 else if (strncmp (argv[0], "ne", 2) == 0)
4205 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004206 else if (strncmp (argv[0], "ns", 2) == 0)
4207 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004208 else if (strncmp (argv[0], "s", 1) == 0)
4209 type = OSPF_SUMMARY_LSA;
4210 else if (strncmp (argv[0], "a", 1) == 0)
4211 type = OSPF_ASBR_SUMMARY_LSA;
4212 else if (strncmp (argv[0], "e", 1) == 0)
4213 type = OSPF_AS_EXTERNAL_LSA;
4214#ifdef HAVE_OPAQUE_LSA
4215 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4216 type = OSPF_OPAQUE_LINK_LSA;
4217 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4218 type = OSPF_OPAQUE_AREA_LSA;
4219 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4220 type = OSPF_OPAQUE_AS_LSA;
4221#endif /* HAVE_OPAQUE_LSA */
4222 else
4223 return CMD_WARNING;
4224
4225 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4226 if (strncmp (argv[1], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004227 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004228 else
4229 {
4230 ret = inet_aton (argv[1], &adv_router);
4231 if (!ret)
4232 return CMD_WARNING;
4233 }
4234
paul020709f2003-04-04 02:44:16 +00004235 show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
paul718e3742002-12-13 20:15:29 +00004236
4237 return CMD_SUCCESS;
4238}
4239
4240ALIAS (show_ip_ospf_database_type_adv_router,
4241 show_ip_ospf_database_type_self_cmd,
4242 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4243 SHOW_STR
4244 IP_STR
4245 "OSPF information\n"
4246 "Database summary\n"
4247 OSPF_LSA_TYPES_DESC
4248 "Self-originated link states\n")
4249
4250
4251DEFUN (ip_ospf_authentication_args,
4252 ip_ospf_authentication_args_addr_cmd,
4253 "ip ospf authentication (null|message-digest) A.B.C.D",
4254 "IP Information\n"
4255 "OSPF interface commands\n"
4256 "Enable authentication on this interface\n"
4257 "Use null authentication\n"
4258 "Use message-digest authentication\n"
4259 "Address of interface")
4260{
4261 struct interface *ifp;
4262 struct in_addr addr;
4263 int ret;
4264 struct ospf_if_params *params;
4265
4266 ifp = vty->index;
4267 params = IF_DEF_PARAMS (ifp);
4268
4269 if (argc == 2)
4270 {
4271 ret = inet_aton(argv[1], &addr);
4272 if (!ret)
4273 {
4274 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4275 VTY_NEWLINE);
4276 return CMD_WARNING;
4277 }
4278
4279 params = ospf_get_if_params (ifp, addr);
4280 ospf_if_update_params (ifp, addr);
4281 }
4282
4283 /* Handle null authentication */
4284 if ( argv[0][0] == 'n' )
4285 {
4286 SET_IF_PARAM (params, auth_type);
4287 params->auth_type = OSPF_AUTH_NULL;
4288 return CMD_SUCCESS;
4289 }
4290
4291 /* Handle message-digest authentication */
4292 if ( argv[0][0] == 'm' )
4293 {
4294 SET_IF_PARAM (params, auth_type);
4295 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4296 return CMD_SUCCESS;
4297 }
4298
4299 vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4300 return CMD_WARNING;
4301}
4302
4303ALIAS (ip_ospf_authentication_args,
4304 ip_ospf_authentication_args_cmd,
4305 "ip ospf authentication (null|message-digest)",
4306 "IP Information\n"
4307 "OSPF interface commands\n"
4308 "Enable authentication on this interface\n"
4309 "Use null authentication\n"
4310 "Use message-digest authentication\n")
4311
4312DEFUN (ip_ospf_authentication,
4313 ip_ospf_authentication_addr_cmd,
4314 "ip ospf authentication A.B.C.D",
4315 "IP Information\n"
4316 "OSPF interface commands\n"
4317 "Enable authentication on this interface\n"
4318 "Address of interface")
4319{
4320 struct interface *ifp;
4321 struct in_addr addr;
4322 int ret;
4323 struct ospf_if_params *params;
4324
4325 ifp = vty->index;
4326 params = IF_DEF_PARAMS (ifp);
4327
4328 if (argc == 1)
4329 {
4330 ret = inet_aton(argv[1], &addr);
4331 if (!ret)
4332 {
4333 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4334 VTY_NEWLINE);
4335 return CMD_WARNING;
4336 }
4337
4338 params = ospf_get_if_params (ifp, addr);
4339 ospf_if_update_params (ifp, addr);
4340 }
4341
4342 SET_IF_PARAM (params, auth_type);
4343 params->auth_type = OSPF_AUTH_SIMPLE;
4344
4345 return CMD_SUCCESS;
4346}
4347
4348ALIAS (ip_ospf_authentication,
4349 ip_ospf_authentication_cmd,
4350 "ip ospf authentication",
4351 "IP Information\n"
4352 "OSPF interface commands\n"
4353 "Enable authentication on this interface\n")
4354
4355DEFUN (no_ip_ospf_authentication,
4356 no_ip_ospf_authentication_addr_cmd,
4357 "no ip ospf authentication A.B.C.D",
4358 NO_STR
4359 "IP Information\n"
4360 "OSPF interface commands\n"
4361 "Enable authentication on this interface\n"
4362 "Address of interface")
4363{
4364 struct interface *ifp;
4365 struct in_addr addr;
4366 int ret;
4367 struct ospf_if_params *params;
4368
4369 ifp = vty->index;
4370 params = IF_DEF_PARAMS (ifp);
4371
4372 if (argc == 1)
4373 {
4374 ret = inet_aton(argv[1], &addr);
4375 if (!ret)
4376 {
4377 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4378 VTY_NEWLINE);
4379 return CMD_WARNING;
4380 }
4381
4382 params = ospf_lookup_if_params (ifp, addr);
4383 if (params == NULL)
4384 return CMD_SUCCESS;
4385 }
4386
4387 params->auth_type = OSPF_AUTH_NOTSET;
4388 UNSET_IF_PARAM (params, auth_type);
4389
4390 if (params != IF_DEF_PARAMS (ifp))
4391 {
4392 ospf_free_if_params (ifp, addr);
4393 ospf_if_update_params (ifp, addr);
4394 }
4395
4396 return CMD_SUCCESS;
4397}
4398
4399ALIAS (no_ip_ospf_authentication,
4400 no_ip_ospf_authentication_cmd,
4401 "no ip ospf authentication",
4402 NO_STR
4403 "IP Information\n"
4404 "OSPF interface commands\n"
4405 "Enable authentication on this interface\n")
4406
4407DEFUN (ip_ospf_authentication_key,
4408 ip_ospf_authentication_key_addr_cmd,
4409 "ip ospf authentication-key AUTH_KEY A.B.C.D",
4410 "IP Information\n"
4411 "OSPF interface commands\n"
4412 "Authentication password (key)\n"
4413 "The OSPF password (key)\n"
4414 "Address of interface")
4415{
4416 struct interface *ifp;
4417 struct in_addr addr;
4418 int ret;
4419 struct ospf_if_params *params;
4420
4421 ifp = vty->index;
4422 params = IF_DEF_PARAMS (ifp);
4423
4424 if (argc == 2)
4425 {
4426 ret = inet_aton(argv[1], &addr);
4427 if (!ret)
4428 {
4429 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4430 VTY_NEWLINE);
4431 return CMD_WARNING;
4432 }
4433
4434 params = ospf_get_if_params (ifp, addr);
4435 ospf_if_update_params (ifp, addr);
4436 }
4437
4438
4439 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
hassoc9e52be2004-09-26 16:09:34 +00004440 strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
paul718e3742002-12-13 20:15:29 +00004441 SET_IF_PARAM (params, auth_simple);
4442
4443 return CMD_SUCCESS;
4444}
4445
4446ALIAS (ip_ospf_authentication_key,
4447 ip_ospf_authentication_key_cmd,
4448 "ip ospf authentication-key AUTH_KEY",
4449 "IP Information\n"
4450 "OSPF interface commands\n"
4451 "Authentication password (key)\n"
4452 "The OSPF password (key)")
4453
4454ALIAS (ip_ospf_authentication_key,
4455 ospf_authentication_key_cmd,
4456 "ospf authentication-key AUTH_KEY",
4457 "OSPF interface commands\n"
4458 "Authentication password (key)\n"
4459 "The OSPF password (key)")
4460
4461DEFUN (no_ip_ospf_authentication_key,
4462 no_ip_ospf_authentication_key_addr_cmd,
4463 "no ip ospf authentication-key A.B.C.D",
4464 NO_STR
4465 "IP Information\n"
4466 "OSPF interface commands\n"
4467 "Authentication password (key)\n"
4468 "Address of interface")
4469{
4470 struct interface *ifp;
4471 struct in_addr addr;
4472 int ret;
4473 struct ospf_if_params *params;
4474
4475 ifp = vty->index;
4476 params = IF_DEF_PARAMS (ifp);
4477
4478 if (argc == 2)
4479 {
4480 ret = inet_aton(argv[1], &addr);
4481 if (!ret)
4482 {
4483 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4484 VTY_NEWLINE);
4485 return CMD_WARNING;
4486 }
4487
4488 params = ospf_lookup_if_params (ifp, addr);
4489 if (params == NULL)
4490 return CMD_SUCCESS;
4491 }
4492
4493 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4494 UNSET_IF_PARAM (params, auth_simple);
4495
4496 if (params != IF_DEF_PARAMS (ifp))
4497 {
4498 ospf_free_if_params (ifp, addr);
4499 ospf_if_update_params (ifp, addr);
4500 }
4501
4502 return CMD_SUCCESS;
4503}
4504
4505ALIAS (no_ip_ospf_authentication_key,
4506 no_ip_ospf_authentication_key_cmd,
4507 "no ip ospf authentication-key",
4508 NO_STR
4509 "IP Information\n"
4510 "OSPF interface commands\n"
4511 "Authentication password (key)\n")
4512
4513ALIAS (no_ip_ospf_authentication_key,
4514 no_ospf_authentication_key_cmd,
4515 "no ospf authentication-key",
4516 NO_STR
4517 "OSPF interface commands\n"
4518 "Authentication password (key)\n")
4519
4520DEFUN (ip_ospf_message_digest_key,
4521 ip_ospf_message_digest_key_addr_cmd,
4522 "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4523 "IP Information\n"
4524 "OSPF interface commands\n"
4525 "Message digest authentication password (key)\n"
4526 "Key ID\n"
4527 "Use MD5 algorithm\n"
4528 "The OSPF password (key)"
4529 "Address of interface")
4530{
4531 struct interface *ifp;
4532 struct crypt_key *ck;
4533 u_char key_id;
4534 struct in_addr addr;
4535 int ret;
4536 struct ospf_if_params *params;
4537
4538 ifp = vty->index;
4539 params = IF_DEF_PARAMS (ifp);
4540
4541 if (argc == 3)
4542 {
4543 ret = inet_aton(argv[2], &addr);
4544 if (!ret)
4545 {
4546 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4547 VTY_NEWLINE);
4548 return CMD_WARNING;
4549 }
4550
4551 params = ospf_get_if_params (ifp, addr);
4552 ospf_if_update_params (ifp, addr);
4553 }
4554
4555 key_id = strtol (argv[0], NULL, 10);
4556 if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4557 {
4558 vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4559 return CMD_WARNING;
4560 }
4561
4562 ck = ospf_crypt_key_new ();
4563 ck->key_id = (u_char) key_id;
4564 memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +00004565 strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +00004566
4567 ospf_crypt_key_add (params->auth_crypt, ck);
4568 SET_IF_PARAM (params, auth_crypt);
4569
4570 return CMD_SUCCESS;
4571}
4572
4573ALIAS (ip_ospf_message_digest_key,
4574 ip_ospf_message_digest_key_cmd,
4575 "ip ospf message-digest-key <1-255> md5 KEY",
4576 "IP Information\n"
4577 "OSPF interface commands\n"
4578 "Message digest authentication password (key)\n"
4579 "Key ID\n"
4580 "Use MD5 algorithm\n"
4581 "The OSPF password (key)")
4582
4583ALIAS (ip_ospf_message_digest_key,
4584 ospf_message_digest_key_cmd,
4585 "ospf message-digest-key <1-255> md5 KEY",
4586 "OSPF interface commands\n"
4587 "Message digest authentication password (key)\n"
4588 "Key ID\n"
4589 "Use MD5 algorithm\n"
4590 "The OSPF password (key)")
4591
4592DEFUN (no_ip_ospf_message_digest_key,
4593 no_ip_ospf_message_digest_key_addr_cmd,
4594 "no ip ospf message-digest-key <1-255> A.B.C.D",
4595 NO_STR
4596 "IP Information\n"
4597 "OSPF interface commands\n"
4598 "Message digest authentication password (key)\n"
4599 "Key ID\n"
4600 "Address of interface")
4601{
4602 struct interface *ifp;
4603 struct crypt_key *ck;
4604 int key_id;
4605 struct in_addr addr;
4606 int ret;
4607 struct ospf_if_params *params;
4608
4609 ifp = vty->index;
4610 params = IF_DEF_PARAMS (ifp);
4611
4612 if (argc == 2)
4613 {
4614 ret = inet_aton(argv[1], &addr);
4615 if (!ret)
4616 {
4617 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4618 VTY_NEWLINE);
4619 return CMD_WARNING;
4620 }
4621
4622 params = ospf_lookup_if_params (ifp, addr);
4623 if (params == NULL)
4624 return CMD_SUCCESS;
4625 }
4626
4627 key_id = strtol (argv[0], NULL, 10);
4628 ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4629 if (ck == NULL)
4630 {
4631 vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4632 return CMD_WARNING;
4633 }
4634
4635 ospf_crypt_key_delete (params->auth_crypt, key_id);
4636
4637 if (params != IF_DEF_PARAMS (ifp))
4638 {
4639 ospf_free_if_params (ifp, addr);
4640 ospf_if_update_params (ifp, addr);
4641 }
4642
4643 return CMD_SUCCESS;
4644}
4645
4646ALIAS (no_ip_ospf_message_digest_key,
4647 no_ip_ospf_message_digest_key_cmd,
4648 "no ip ospf message-digest-key <1-255>",
4649 NO_STR
4650 "IP Information\n"
4651 "OSPF interface commands\n"
4652 "Message digest authentication password (key)\n"
4653 "Key ID\n")
4654
4655ALIAS (no_ip_ospf_message_digest_key,
4656 no_ospf_message_digest_key_cmd,
4657 "no ospf message-digest-key <1-255>",
4658 NO_STR
4659 "OSPF interface commands\n"
4660 "Message digest authentication password (key)\n"
4661 "Key ID\n")
4662
4663DEFUN (ip_ospf_cost,
4664 ip_ospf_cost_addr_cmd,
4665 "ip ospf cost <1-65535> A.B.C.D",
4666 "IP Information\n"
4667 "OSPF interface commands\n"
4668 "Interface cost\n"
4669 "Cost\n"
4670 "Address of interface")
4671{
4672 struct interface *ifp = vty->index;
4673 u_int32_t cost;
4674 struct in_addr addr;
4675 int ret;
4676 struct ospf_if_params *params;
4677
4678 params = IF_DEF_PARAMS (ifp);
4679
4680 cost = strtol (argv[0], NULL, 10);
4681
4682 /* cost range is <1-65535>. */
4683 if (cost < 1 || cost > 65535)
4684 {
4685 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4686 return CMD_WARNING;
4687 }
4688
4689 if (argc == 2)
4690 {
4691 ret = inet_aton(argv[1], &addr);
4692 if (!ret)
4693 {
4694 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4695 VTY_NEWLINE);
4696 return CMD_WARNING;
4697 }
4698
4699 params = ospf_get_if_params (ifp, addr);
4700 ospf_if_update_params (ifp, addr);
4701 }
4702
4703 SET_IF_PARAM (params, output_cost_cmd);
4704 params->output_cost_cmd = cost;
4705
4706 ospf_if_recalculate_output_cost (ifp);
4707
4708 return CMD_SUCCESS;
4709}
4710
4711ALIAS (ip_ospf_cost,
4712 ip_ospf_cost_cmd,
4713 "ip ospf cost <1-65535>",
4714 "IP Information\n"
4715 "OSPF interface commands\n"
4716 "Interface cost\n"
4717 "Cost")
4718
4719ALIAS (ip_ospf_cost,
4720 ospf_cost_cmd,
4721 "ospf cost <1-65535>",
4722 "OSPF interface commands\n"
4723 "Interface cost\n"
4724 "Cost")
4725
4726DEFUN (no_ip_ospf_cost,
4727 no_ip_ospf_cost_addr_cmd,
4728 "no ip ospf cost A.B.C.D",
4729 NO_STR
4730 "IP Information\n"
4731 "OSPF interface commands\n"
4732 "Interface cost\n"
4733 "Address of interface")
4734{
4735 struct interface *ifp = vty->index;
4736 struct in_addr addr;
4737 int ret;
4738 struct ospf_if_params *params;
4739
4740 ifp = vty->index;
4741 params = IF_DEF_PARAMS (ifp);
4742
4743 if (argc == 1)
4744 {
4745 ret = inet_aton(argv[0], &addr);
4746 if (!ret)
4747 {
4748 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4749 VTY_NEWLINE);
4750 return CMD_WARNING;
4751 }
4752
4753 params = ospf_lookup_if_params (ifp, addr);
4754 if (params == NULL)
4755 return CMD_SUCCESS;
4756 }
4757
4758 UNSET_IF_PARAM (params, output_cost_cmd);
4759
4760 if (params != IF_DEF_PARAMS (ifp))
4761 {
4762 ospf_free_if_params (ifp, addr);
4763 ospf_if_update_params (ifp, addr);
4764 }
4765
4766 ospf_if_recalculate_output_cost (ifp);
4767
4768 return CMD_SUCCESS;
4769}
4770
4771ALIAS (no_ip_ospf_cost,
4772 no_ip_ospf_cost_cmd,
4773 "no ip ospf cost",
4774 NO_STR
4775 "IP Information\n"
4776 "OSPF interface commands\n"
4777 "Interface cost\n")
4778
4779ALIAS (no_ip_ospf_cost,
4780 no_ospf_cost_cmd,
4781 "no ospf cost",
4782 NO_STR
4783 "OSPF interface commands\n"
4784 "Interface cost\n")
4785
paul4dadc292005-05-06 21:37:42 +00004786static void
paul718e3742002-12-13 20:15:29 +00004787ospf_nbr_timer_update (struct ospf_interface *oi)
4788{
4789 struct route_node *rn;
4790 struct ospf_neighbor *nbr;
4791
4792 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4793 if ((nbr = rn->info))
4794 {
4795 nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4796 nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4797 nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4798 nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4799 }
4800}
4801
paulf9ad9372005-10-21 00:45:17 +00004802static int
4803ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4804 const char *nbr_str,
4805 const char *fast_hello_str)
paul718e3742002-12-13 20:15:29 +00004806{
4807 struct interface *ifp = vty->index;
4808 u_int32_t seconds;
paulf9ad9372005-10-21 00:45:17 +00004809 u_char hellomult;
paul718e3742002-12-13 20:15:29 +00004810 struct in_addr addr;
4811 int ret;
4812 struct ospf_if_params *params;
4813 struct ospf_interface *oi;
4814 struct route_node *rn;
4815
4816 params = IF_DEF_PARAMS (ifp);
paulf9ad9372005-10-21 00:45:17 +00004817
4818 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004819 {
paulf9ad9372005-10-21 00:45:17 +00004820 ret = inet_aton(nbr_str, &addr);
paul718e3742002-12-13 20:15:29 +00004821 if (!ret)
4822 {
4823 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4824 VTY_NEWLINE);
4825 return CMD_WARNING;
4826 }
4827
4828 params = ospf_get_if_params (ifp, addr);
4829 ospf_if_update_params (ifp, addr);
4830 }
4831
paulf9ad9372005-10-21 00:45:17 +00004832 if (interval_str)
4833 {
4834 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
4835 1, 65535);
4836
4837 /* reset fast_hello too, just to be sure */
4838 UNSET_IF_PARAM (params, fast_hello);
4839 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
4840 }
4841 else if (fast_hello_str)
4842 {
4843 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
4844 1, 10);
4845 /* 1s dead-interval with sub-second hellos desired */
4846 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
4847 SET_IF_PARAM (params, fast_hello);
4848 params->fast_hello = hellomult;
4849 }
4850 else
4851 {
4852 vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
4853 VTY_NEWLINE);
4854 return CMD_WARNING;
4855 }
4856
paul718e3742002-12-13 20:15:29 +00004857 SET_IF_PARAM (params, v_wait);
4858 params->v_wait = seconds;
4859
4860 /* Update timer values in neighbor structure. */
paulf9ad9372005-10-21 00:45:17 +00004861 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004862 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004863 struct ospf *ospf;
4864 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00004865 {
4866 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
4867 if (oi)
4868 ospf_nbr_timer_update (oi);
4869 }
paul718e3742002-12-13 20:15:29 +00004870 }
4871 else
4872 {
4873 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
4874 if ((oi = rn->info))
4875 ospf_nbr_timer_update (oi);
4876 }
4877
4878 return CMD_SUCCESS;
4879}
4880
paulf9ad9372005-10-21 00:45:17 +00004881
4882DEFUN (ip_ospf_dead_interval,
4883 ip_ospf_dead_interval_addr_cmd,
4884 "ip ospf dead-interval <1-65535> A.B.C.D",
4885 "IP Information\n"
4886 "OSPF interface commands\n"
4887 "Interval after which a neighbor is declared dead\n"
4888 "Seconds\n"
4889 "Address of interface\n")
4890{
4891 if (argc == 2)
4892 return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
4893 else
4894 return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
4895}
4896
paul718e3742002-12-13 20:15:29 +00004897ALIAS (ip_ospf_dead_interval,
4898 ip_ospf_dead_interval_cmd,
4899 "ip ospf dead-interval <1-65535>",
4900 "IP Information\n"
4901 "OSPF interface commands\n"
4902 "Interval after which a neighbor is declared dead\n"
4903 "Seconds\n")
4904
4905ALIAS (ip_ospf_dead_interval,
4906 ospf_dead_interval_cmd,
4907 "ospf dead-interval <1-65535>",
4908 "OSPF interface commands\n"
4909 "Interval after which a neighbor is declared dead\n"
4910 "Seconds\n")
4911
paulf9ad9372005-10-21 00:45:17 +00004912DEFUN (ip_ospf_dead_interval_minimal,
4913 ip_ospf_dead_interval_minimal_addr_cmd,
4914 "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
4915 "IP Information\n"
4916 "OSPF interface commands\n"
4917 "Interval after which a neighbor is declared dead\n"
4918 "Minimal 1s dead-interval with fast sub-second hellos\n"
4919 "Hello multiplier factor\n"
4920 "Number of Hellos to send each second\n"
4921 "Address of interface\n")
4922{
4923 if (argc == 2)
4924 return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
4925 else
4926 return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
4927}
4928
4929ALIAS (ip_ospf_dead_interval_minimal,
4930 ip_ospf_dead_interval_minimal_cmd,
4931 "ip ospf dead-interval minimal hello-multiplier <1-10>",
4932 "IP Information\n"
4933 "OSPF interface commands\n"
4934 "Interval after which a neighbor is declared dead\n"
4935 "Minimal 1s dead-interval with fast sub-second hellos\n"
4936 "Hello multiplier factor\n"
4937 "Number of Hellos to send each second\n")
4938
paul718e3742002-12-13 20:15:29 +00004939DEFUN (no_ip_ospf_dead_interval,
4940 no_ip_ospf_dead_interval_addr_cmd,
4941 "no ip ospf dead-interval A.B.C.D",
4942 NO_STR
4943 "IP Information\n"
4944 "OSPF interface commands\n"
4945 "Interval after which a neighbor is declared dead\n"
4946 "Address of interface")
4947{
4948 struct interface *ifp = vty->index;
4949 struct in_addr addr;
4950 int ret;
4951 struct ospf_if_params *params;
4952 struct ospf_interface *oi;
4953 struct route_node *rn;
paul020709f2003-04-04 02:44:16 +00004954
paul718e3742002-12-13 20:15:29 +00004955 ifp = vty->index;
4956 params = IF_DEF_PARAMS (ifp);
4957
4958 if (argc == 1)
4959 {
4960 ret = inet_aton(argv[0], &addr);
4961 if (!ret)
4962 {
4963 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4964 VTY_NEWLINE);
4965 return CMD_WARNING;
4966 }
4967
4968 params = ospf_lookup_if_params (ifp, addr);
4969 if (params == NULL)
4970 return CMD_SUCCESS;
4971 }
4972
4973 UNSET_IF_PARAM (params, v_wait);
4974 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
paulf9ad9372005-10-21 00:45:17 +00004975
4976 UNSET_IF_PARAM (params, fast_hello);
4977 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
4978
paul718e3742002-12-13 20:15:29 +00004979 if (params != IF_DEF_PARAMS (ifp))
4980 {
4981 ospf_free_if_params (ifp, addr);
4982 ospf_if_update_params (ifp, addr);
4983 }
4984
4985 /* Update timer values in neighbor structure. */
4986 if (argc == 1)
4987 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004988 struct ospf *ospf;
4989
4990 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00004991 {
4992 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
4993 if (oi)
4994 ospf_nbr_timer_update (oi);
4995 }
paul718e3742002-12-13 20:15:29 +00004996 }
4997 else
4998 {
4999 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5000 if ((oi = rn->info))
5001 ospf_nbr_timer_update (oi);
5002 }
5003
5004 return CMD_SUCCESS;
5005}
5006
5007ALIAS (no_ip_ospf_dead_interval,
5008 no_ip_ospf_dead_interval_cmd,
5009 "no ip ospf dead-interval",
5010 NO_STR
5011 "IP Information\n"
5012 "OSPF interface commands\n"
5013 "Interval after which a neighbor is declared dead\n")
5014
5015ALIAS (no_ip_ospf_dead_interval,
5016 no_ospf_dead_interval_cmd,
5017 "no ospf dead-interval",
5018 NO_STR
5019 "OSPF interface commands\n"
5020 "Interval after which a neighbor is declared dead\n")
5021
5022DEFUN (ip_ospf_hello_interval,
5023 ip_ospf_hello_interval_addr_cmd,
5024 "ip ospf hello-interval <1-65535> A.B.C.D",
5025 "IP Information\n"
5026 "OSPF interface commands\n"
5027 "Time between HELLO packets\n"
5028 "Seconds\n"
5029 "Address of interface")
5030{
5031 struct interface *ifp = vty->index;
5032 u_int32_t seconds;
5033 struct in_addr addr;
5034 int ret;
5035 struct ospf_if_params *params;
5036
5037 params = IF_DEF_PARAMS (ifp);
5038
5039 seconds = strtol (argv[0], NULL, 10);
5040
5041 /* HelloInterval range is <1-65535>. */
5042 if (seconds < 1 || seconds > 65535)
5043 {
5044 vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5045 return CMD_WARNING;
5046 }
5047
5048 if (argc == 2)
5049 {
5050 ret = inet_aton(argv[1], &addr);
5051 if (!ret)
5052 {
5053 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5054 VTY_NEWLINE);
5055 return CMD_WARNING;
5056 }
5057
5058 params = ospf_get_if_params (ifp, addr);
5059 ospf_if_update_params (ifp, addr);
5060 }
5061
paulf9ad9372005-10-21 00:45:17 +00005062 SET_IF_PARAM (params, v_hello);
paul718e3742002-12-13 20:15:29 +00005063 params->v_hello = seconds;
5064
5065 return CMD_SUCCESS;
5066}
5067
5068ALIAS (ip_ospf_hello_interval,
5069 ip_ospf_hello_interval_cmd,
5070 "ip ospf hello-interval <1-65535>",
5071 "IP Information\n"
5072 "OSPF interface commands\n"
5073 "Time between HELLO packets\n"
5074 "Seconds\n")
5075
5076ALIAS (ip_ospf_hello_interval,
5077 ospf_hello_interval_cmd,
5078 "ospf hello-interval <1-65535>",
5079 "OSPF interface commands\n"
5080 "Time between HELLO packets\n"
5081 "Seconds\n")
5082
5083DEFUN (no_ip_ospf_hello_interval,
5084 no_ip_ospf_hello_interval_addr_cmd,
5085 "no ip ospf hello-interval A.B.C.D",
5086 NO_STR
5087 "IP Information\n"
5088 "OSPF interface commands\n"
5089 "Time between HELLO packets\n"
5090 "Address of interface")
5091{
5092 struct interface *ifp = vty->index;
5093 struct in_addr addr;
5094 int ret;
5095 struct ospf_if_params *params;
5096
5097 ifp = vty->index;
5098 params = IF_DEF_PARAMS (ifp);
5099
5100 if (argc == 1)
5101 {
5102 ret = inet_aton(argv[0], &addr);
5103 if (!ret)
5104 {
5105 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5106 VTY_NEWLINE);
5107 return CMD_WARNING;
5108 }
5109
5110 params = ospf_lookup_if_params (ifp, addr);
5111 if (params == NULL)
5112 return CMD_SUCCESS;
5113 }
5114
5115 UNSET_IF_PARAM (params, v_hello);
paulf9ad9372005-10-21 00:45:17 +00005116 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00005117
5118 if (params != IF_DEF_PARAMS (ifp))
5119 {
5120 ospf_free_if_params (ifp, addr);
5121 ospf_if_update_params (ifp, addr);
5122 }
5123
5124 return CMD_SUCCESS;
5125}
5126
5127ALIAS (no_ip_ospf_hello_interval,
5128 no_ip_ospf_hello_interval_cmd,
5129 "no ip ospf hello-interval",
5130 NO_STR
5131 "IP Information\n"
5132 "OSPF interface commands\n"
5133 "Time between HELLO packets\n")
5134
5135ALIAS (no_ip_ospf_hello_interval,
5136 no_ospf_hello_interval_cmd,
5137 "no ospf hello-interval",
5138 NO_STR
5139 "OSPF interface commands\n"
5140 "Time between HELLO packets\n")
5141
5142DEFUN (ip_ospf_network,
5143 ip_ospf_network_cmd,
5144 "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5145 "IP Information\n"
5146 "OSPF interface commands\n"
5147 "Network type\n"
5148 "Specify OSPF broadcast multi-access network\n"
5149 "Specify OSPF NBMA network\n"
5150 "Specify OSPF point-to-multipoint network\n"
5151 "Specify OSPF point-to-point network\n")
5152{
5153 struct interface *ifp = vty->index;
5154 int old_type = IF_DEF_PARAMS (ifp)->type;
5155 struct route_node *rn;
5156
5157 if (strncmp (argv[0], "b", 1) == 0)
5158 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5159 else if (strncmp (argv[0], "n", 1) == 0)
5160 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5161 else if (strncmp (argv[0], "point-to-m", 10) == 0)
5162 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5163 else if (strncmp (argv[0], "point-to-p", 10) == 0)
5164 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5165
5166 if (IF_DEF_PARAMS (ifp)->type == old_type)
5167 return CMD_SUCCESS;
5168
5169 SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5170
5171 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5172 {
5173 struct ospf_interface *oi = rn->info;
5174
5175 if (!oi)
5176 continue;
5177
5178 oi->type = IF_DEF_PARAMS (ifp)->type;
5179
5180 if (oi->state > ISM_Down)
5181 {
5182 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5183 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5184 }
5185 }
5186
5187 return CMD_SUCCESS;
5188}
5189
5190ALIAS (ip_ospf_network,
5191 ospf_network_cmd,
5192 "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5193 "OSPF interface commands\n"
5194 "Network type\n"
5195 "Specify OSPF broadcast multi-access network\n"
5196 "Specify OSPF NBMA network\n"
5197 "Specify OSPF point-to-multipoint network\n"
5198 "Specify OSPF point-to-point network\n")
5199
5200DEFUN (no_ip_ospf_network,
5201 no_ip_ospf_network_cmd,
5202 "no ip ospf network",
5203 NO_STR
5204 "IP Information\n"
5205 "OSPF interface commands\n"
5206 "Network type\n")
5207{
5208 struct interface *ifp = vty->index;
5209 int old_type = IF_DEF_PARAMS (ifp)->type;
5210 struct route_node *rn;
5211
ajsbc18d612004-12-15 15:07:19 +00005212 IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
paul718e3742002-12-13 20:15:29 +00005213
5214 if (IF_DEF_PARAMS (ifp)->type == old_type)
5215 return CMD_SUCCESS;
5216
5217 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5218 {
5219 struct ospf_interface *oi = rn->info;
5220
5221 if (!oi)
5222 continue;
5223
5224 oi->type = IF_DEF_PARAMS (ifp)->type;
5225
5226 if (oi->state > ISM_Down)
5227 {
5228 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5229 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5230 }
5231 }
5232
5233 return CMD_SUCCESS;
5234}
5235
5236ALIAS (no_ip_ospf_network,
5237 no_ospf_network_cmd,
5238 "no ospf network",
5239 NO_STR
5240 "OSPF interface commands\n"
5241 "Network type\n")
5242
5243DEFUN (ip_ospf_priority,
5244 ip_ospf_priority_addr_cmd,
5245 "ip ospf priority <0-255> A.B.C.D",
5246 "IP Information\n"
5247 "OSPF interface commands\n"
5248 "Router priority\n"
5249 "Priority\n"
5250 "Address of interface")
5251{
5252 struct interface *ifp = vty->index;
5253 u_int32_t priority;
5254 struct route_node *rn;
5255 struct in_addr addr;
5256 int ret;
5257 struct ospf_if_params *params;
5258
5259 params = IF_DEF_PARAMS (ifp);
5260
5261 priority = strtol (argv[0], NULL, 10);
5262
5263 /* Router Priority range is <0-255>. */
5264 if (priority < 0 || priority > 255)
5265 {
5266 vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5267 return CMD_WARNING;
5268 }
5269
5270 if (argc == 2)
5271 {
5272 ret = inet_aton(argv[1], &addr);
5273 if (!ret)
5274 {
5275 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5276 VTY_NEWLINE);
5277 return CMD_WARNING;
5278 }
5279
5280 params = ospf_get_if_params (ifp, addr);
5281 ospf_if_update_params (ifp, addr);
5282 }
5283
5284 SET_IF_PARAM (params, priority);
5285 params->priority = priority;
5286
5287 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5288 {
5289 struct ospf_interface *oi = rn->info;
5290
5291 if (!oi)
5292 continue;
5293
5294
5295 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5296 {
5297 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5298 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5299 }
5300 }
5301
5302 return CMD_SUCCESS;
5303}
5304
5305ALIAS (ip_ospf_priority,
5306 ip_ospf_priority_cmd,
5307 "ip ospf priority <0-255>",
5308 "IP Information\n"
5309 "OSPF interface commands\n"
5310 "Router priority\n"
5311 "Priority\n")
5312
5313ALIAS (ip_ospf_priority,
5314 ospf_priority_cmd,
5315 "ospf priority <0-255>",
5316 "OSPF interface commands\n"
5317 "Router priority\n"
5318 "Priority\n")
5319
5320DEFUN (no_ip_ospf_priority,
5321 no_ip_ospf_priority_addr_cmd,
5322 "no ip ospf priority A.B.C.D",
5323 NO_STR
5324 "IP Information\n"
5325 "OSPF interface commands\n"
5326 "Router priority\n"
5327 "Address of interface")
5328{
5329 struct interface *ifp = vty->index;
5330 struct route_node *rn;
5331 struct in_addr addr;
5332 int ret;
5333 struct ospf_if_params *params;
5334
5335 ifp = vty->index;
5336 params = IF_DEF_PARAMS (ifp);
5337
5338 if (argc == 1)
5339 {
5340 ret = inet_aton(argv[0], &addr);
5341 if (!ret)
5342 {
5343 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5344 VTY_NEWLINE);
5345 return CMD_WARNING;
5346 }
5347
5348 params = ospf_lookup_if_params (ifp, addr);
5349 if (params == NULL)
5350 return CMD_SUCCESS;
5351 }
5352
5353 UNSET_IF_PARAM (params, priority);
5354 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5355
5356 if (params != IF_DEF_PARAMS (ifp))
5357 {
5358 ospf_free_if_params (ifp, addr);
5359 ospf_if_update_params (ifp, addr);
5360 }
5361
5362 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5363 {
5364 struct ospf_interface *oi = rn->info;
5365
5366 if (!oi)
5367 continue;
5368
5369
5370 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5371 {
5372 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5373 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5374 }
5375 }
5376
5377 return CMD_SUCCESS;
5378}
5379
5380ALIAS (no_ip_ospf_priority,
5381 no_ip_ospf_priority_cmd,
5382 "no ip ospf priority",
5383 NO_STR
5384 "IP Information\n"
5385 "OSPF interface commands\n"
5386 "Router priority\n")
5387
5388ALIAS (no_ip_ospf_priority,
5389 no_ospf_priority_cmd,
5390 "no ospf priority",
5391 NO_STR
5392 "OSPF interface commands\n"
5393 "Router priority\n")
5394
5395DEFUN (ip_ospf_retransmit_interval,
5396 ip_ospf_retransmit_interval_addr_cmd,
5397 "ip ospf retransmit-interval <3-65535> A.B.C.D",
5398 "IP Information\n"
5399 "OSPF interface commands\n"
5400 "Time between retransmitting lost link state advertisements\n"
5401 "Seconds\n"
5402 "Address of interface")
5403{
5404 struct interface *ifp = vty->index;
5405 u_int32_t seconds;
5406 struct in_addr addr;
5407 int ret;
5408 struct ospf_if_params *params;
5409
5410 params = IF_DEF_PARAMS (ifp);
5411 seconds = strtol (argv[0], NULL, 10);
5412
5413 /* Retransmit Interval range is <3-65535>. */
5414 if (seconds < 3 || seconds > 65535)
5415 {
5416 vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5417 return CMD_WARNING;
5418 }
5419
5420
5421 if (argc == 2)
5422 {
5423 ret = inet_aton(argv[1], &addr);
5424 if (!ret)
5425 {
5426 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5427 VTY_NEWLINE);
5428 return CMD_WARNING;
5429 }
5430
5431 params = ospf_get_if_params (ifp, addr);
5432 ospf_if_update_params (ifp, addr);
5433 }
5434
5435 SET_IF_PARAM (params, retransmit_interval);
5436 params->retransmit_interval = seconds;
5437
5438 return CMD_SUCCESS;
5439}
5440
5441ALIAS (ip_ospf_retransmit_interval,
5442 ip_ospf_retransmit_interval_cmd,
5443 "ip ospf retransmit-interval <3-65535>",
5444 "IP Information\n"
5445 "OSPF interface commands\n"
5446 "Time between retransmitting lost link state advertisements\n"
5447 "Seconds\n")
5448
5449ALIAS (ip_ospf_retransmit_interval,
5450 ospf_retransmit_interval_cmd,
5451 "ospf retransmit-interval <3-65535>",
5452 "OSPF interface commands\n"
5453 "Time between retransmitting lost link state advertisements\n"
5454 "Seconds\n")
5455
5456DEFUN (no_ip_ospf_retransmit_interval,
5457 no_ip_ospf_retransmit_interval_addr_cmd,
5458 "no ip ospf retransmit-interval A.B.C.D",
5459 NO_STR
5460 "IP Information\n"
5461 "OSPF interface commands\n"
5462 "Time between retransmitting lost link state advertisements\n"
5463 "Address of interface")
5464{
5465 struct interface *ifp = vty->index;
5466 struct in_addr addr;
5467 int ret;
5468 struct ospf_if_params *params;
5469
5470 ifp = vty->index;
5471 params = IF_DEF_PARAMS (ifp);
5472
5473 if (argc == 1)
5474 {
5475 ret = inet_aton(argv[0], &addr);
5476 if (!ret)
5477 {
5478 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5479 VTY_NEWLINE);
5480 return CMD_WARNING;
5481 }
5482
5483 params = ospf_lookup_if_params (ifp, addr);
5484 if (params == NULL)
5485 return CMD_SUCCESS;
5486 }
5487
5488 UNSET_IF_PARAM (params, retransmit_interval);
5489 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5490
5491 if (params != IF_DEF_PARAMS (ifp))
5492 {
5493 ospf_free_if_params (ifp, addr);
5494 ospf_if_update_params (ifp, addr);
5495 }
5496
5497 return CMD_SUCCESS;
5498}
5499
5500ALIAS (no_ip_ospf_retransmit_interval,
5501 no_ip_ospf_retransmit_interval_cmd,
5502 "no ip ospf retransmit-interval",
5503 NO_STR
5504 "IP Information\n"
5505 "OSPF interface commands\n"
5506 "Time between retransmitting lost link state advertisements\n")
5507
5508ALIAS (no_ip_ospf_retransmit_interval,
5509 no_ospf_retransmit_interval_cmd,
5510 "no ospf retransmit-interval",
5511 NO_STR
5512 "OSPF interface commands\n"
5513 "Time between retransmitting lost link state advertisements\n")
5514
5515DEFUN (ip_ospf_transmit_delay,
5516 ip_ospf_transmit_delay_addr_cmd,
5517 "ip ospf transmit-delay <1-65535> A.B.C.D",
5518 "IP Information\n"
5519 "OSPF interface commands\n"
5520 "Link state transmit delay\n"
5521 "Seconds\n"
5522 "Address of interface")
5523{
5524 struct interface *ifp = vty->index;
5525 u_int32_t seconds;
5526 struct in_addr addr;
5527 int ret;
5528 struct ospf_if_params *params;
5529
5530 params = IF_DEF_PARAMS (ifp);
5531 seconds = strtol (argv[0], NULL, 10);
5532
5533 /* Transmit Delay range is <1-65535>. */
5534 if (seconds < 1 || seconds > 65535)
5535 {
5536 vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5537 return CMD_WARNING;
5538 }
5539
5540 if (argc == 2)
5541 {
5542 ret = inet_aton(argv[1], &addr);
5543 if (!ret)
5544 {
5545 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5546 VTY_NEWLINE);
5547 return CMD_WARNING;
5548 }
5549
5550 params = ospf_get_if_params (ifp, addr);
5551 ospf_if_update_params (ifp, addr);
5552 }
5553
5554 SET_IF_PARAM (params, transmit_delay);
5555 params->transmit_delay = seconds;
5556
5557 return CMD_SUCCESS;
5558}
5559
5560ALIAS (ip_ospf_transmit_delay,
5561 ip_ospf_transmit_delay_cmd,
5562 "ip ospf transmit-delay <1-65535>",
5563 "IP Information\n"
5564 "OSPF interface commands\n"
5565 "Link state transmit delay\n"
5566 "Seconds\n")
5567
5568ALIAS (ip_ospf_transmit_delay,
5569 ospf_transmit_delay_cmd,
5570 "ospf transmit-delay <1-65535>",
5571 "OSPF interface commands\n"
5572 "Link state transmit delay\n"
5573 "Seconds\n")
5574
5575DEFUN (no_ip_ospf_transmit_delay,
5576 no_ip_ospf_transmit_delay_addr_cmd,
5577 "no ip ospf transmit-delay A.B.C.D",
5578 NO_STR
5579 "IP Information\n"
5580 "OSPF interface commands\n"
5581 "Link state transmit delay\n"
5582 "Address of interface")
5583{
5584 struct interface *ifp = vty->index;
5585 struct in_addr addr;
5586 int ret;
5587 struct ospf_if_params *params;
5588
5589 ifp = vty->index;
5590 params = IF_DEF_PARAMS (ifp);
5591
5592 if (argc == 1)
5593 {
5594 ret = inet_aton(argv[0], &addr);
5595 if (!ret)
5596 {
5597 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5598 VTY_NEWLINE);
5599 return CMD_WARNING;
5600 }
5601
5602 params = ospf_lookup_if_params (ifp, addr);
5603 if (params == NULL)
5604 return CMD_SUCCESS;
5605 }
5606
5607 UNSET_IF_PARAM (params, transmit_delay);
5608 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5609
5610 if (params != IF_DEF_PARAMS (ifp))
5611 {
5612 ospf_free_if_params (ifp, addr);
5613 ospf_if_update_params (ifp, addr);
5614 }
5615
5616 return CMD_SUCCESS;
5617}
5618
5619ALIAS (no_ip_ospf_transmit_delay,
5620 no_ip_ospf_transmit_delay_cmd,
5621 "no ip ospf transmit-delay",
5622 NO_STR
5623 "IP Information\n"
5624 "OSPF interface commands\n"
5625 "Link state transmit delay\n")
5626
5627ALIAS (no_ip_ospf_transmit_delay,
5628 no_ospf_transmit_delay_cmd,
5629 "no ospf transmit-delay",
5630 NO_STR
5631 "OSPF interface commands\n"
5632 "Link state transmit delay\n")
5633
5634
5635DEFUN (ospf_redistribute_source_metric_type,
5636 ospf_redistribute_source_metric_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005637 "redistribute " QUAGGA_REDIST_STR_OSPFD
5638 " metric <0-16777214> metric-type (1|2) route-map WORD",
5639 REDIST_STR
5640 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005641 "Metric for redistributed routes\n"
5642 "OSPF default metric\n"
5643 "OSPF exterior metric type for redistributed routes\n"
5644 "Set OSPF External Type 1 metrics\n"
5645 "Set OSPF External Type 2 metrics\n"
5646 "Route map reference\n"
5647 "Pointer to route-map entries\n")
5648{
paul020709f2003-04-04 02:44:16 +00005649 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005650 int source;
5651 int type = -1;
5652 int metric = -1;
5653
5654 /* Get distribute source. */
5655 if (!str2distribute_source (argv[0], &source))
5656 return CMD_WARNING;
5657
5658 /* Get metric value. */
5659 if (argc >= 2)
5660 if (!str2metric (argv[1], &metric))
5661 return CMD_WARNING;
5662
5663 /* Get metric type. */
5664 if (argc >= 3)
5665 if (!str2metric_type (argv[2], &type))
5666 return CMD_WARNING;
5667
5668 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005669 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005670 else
paul020709f2003-04-04 02:44:16 +00005671 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005672
paul020709f2003-04-04 02:44:16 +00005673 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005674}
5675
5676ALIAS (ospf_redistribute_source_metric_type,
5677 ospf_redistribute_source_metric_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005678 "redistribute " QUAGGA_REDIST_STR_OSPFD
5679 " metric <0-16777214> metric-type (1|2)",
5680 REDIST_STR
5681 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005682 "Metric for redistributed routes\n"
5683 "OSPF default metric\n"
5684 "OSPF exterior metric type for redistributed routes\n"
5685 "Set OSPF External Type 1 metrics\n"
5686 "Set OSPF External Type 2 metrics\n")
5687
5688ALIAS (ospf_redistribute_source_metric_type,
5689 ospf_redistribute_source_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005690 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
5691 REDIST_STR
5692 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005693 "Metric for redistributed routes\n"
5694 "OSPF default metric\n")
5695
5696DEFUN (ospf_redistribute_source_type_metric,
5697 ospf_redistribute_source_type_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005698 "redistribute " QUAGGA_REDIST_STR_OSPFD
5699 " metric-type (1|2) metric <0-16777214> route-map WORD",
5700 REDIST_STR
5701 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005702 "OSPF exterior metric type for redistributed routes\n"
5703 "Set OSPF External Type 1 metrics\n"
5704 "Set OSPF External Type 2 metrics\n"
5705 "Metric for redistributed routes\n"
5706 "OSPF default metric\n"
5707 "Route map reference\n"
5708 "Pointer to route-map entries\n")
5709{
paul020709f2003-04-04 02:44:16 +00005710 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005711 int source;
5712 int type = -1;
5713 int metric = -1;
5714
5715 /* Get distribute source. */
5716 if (!str2distribute_source (argv[0], &source))
5717 return CMD_WARNING;
5718
5719 /* Get metric value. */
5720 if (argc >= 2)
5721 if (!str2metric_type (argv[1], &type))
5722 return CMD_WARNING;
5723
5724 /* Get metric type. */
5725 if (argc >= 3)
5726 if (!str2metric (argv[2], &metric))
5727 return CMD_WARNING;
5728
5729 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005730 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005731 else
paul020709f2003-04-04 02:44:16 +00005732 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005733
paul020709f2003-04-04 02:44:16 +00005734 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005735}
5736
5737ALIAS (ospf_redistribute_source_type_metric,
5738 ospf_redistribute_source_type_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005739 "redistribute " QUAGGA_REDIST_STR_OSPFD
5740 " metric-type (1|2) metric <0-16777214>",
5741 REDIST_STR
5742 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005743 "OSPF exterior metric type for redistributed routes\n"
5744 "Set OSPF External Type 1 metrics\n"
5745 "Set OSPF External Type 2 metrics\n"
5746 "Metric for redistributed routes\n"
5747 "OSPF default metric\n")
5748
5749ALIAS (ospf_redistribute_source_type_metric,
5750 ospf_redistribute_source_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005751 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
5752 REDIST_STR
5753 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005754 "OSPF exterior metric type for redistributed routes\n"
5755 "Set OSPF External Type 1 metrics\n"
5756 "Set OSPF External Type 2 metrics\n")
5757
5758ALIAS (ospf_redistribute_source_type_metric,
5759 ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005760 "redistribute " QUAGGA_REDIST_STR_OSPFD,
5761 REDIST_STR
5762 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005763
5764DEFUN (ospf_redistribute_source_metric_routemap,
5765 ospf_redistribute_source_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005766 "redistribute " QUAGGA_REDIST_STR_OSPFD
5767 " metric <0-16777214> route-map WORD",
5768 REDIST_STR
5769 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005770 "Metric for redistributed routes\n"
5771 "OSPF default metric\n"
5772 "Route map reference\n"
5773 "Pointer to route-map entries\n")
5774{
paul020709f2003-04-04 02:44:16 +00005775 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005776 int source;
5777 int metric = -1;
5778
5779 /* Get distribute source. */
5780 if (!str2distribute_source (argv[0], &source))
5781 return CMD_WARNING;
5782
5783 /* Get metric value. */
5784 if (argc >= 2)
5785 if (!str2metric (argv[1], &metric))
5786 return CMD_WARNING;
5787
5788 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005789 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005790 else
paul020709f2003-04-04 02:44:16 +00005791 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005792
paul020709f2003-04-04 02:44:16 +00005793 return ospf_redistribute_set (ospf, source, -1, metric);
paul718e3742002-12-13 20:15:29 +00005794}
5795
5796DEFUN (ospf_redistribute_source_type_routemap,
5797 ospf_redistribute_source_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005798 "redistribute " QUAGGA_REDIST_STR_OSPFD
5799 " metric-type (1|2) route-map WORD",
5800 REDIST_STR
5801 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005802 "OSPF exterior metric type for redistributed routes\n"
5803 "Set OSPF External Type 1 metrics\n"
5804 "Set OSPF External Type 2 metrics\n"
5805 "Route map reference\n"
5806 "Pointer to route-map entries\n")
5807{
paul020709f2003-04-04 02:44:16 +00005808 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005809 int source;
5810 int type = -1;
5811
5812 /* Get distribute source. */
5813 if (!str2distribute_source (argv[0], &source))
5814 return CMD_WARNING;
5815
5816 /* Get metric value. */
5817 if (argc >= 2)
5818 if (!str2metric_type (argv[1], &type))
5819 return CMD_WARNING;
5820
5821 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005822 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005823 else
paul020709f2003-04-04 02:44:16 +00005824 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005825
paul020709f2003-04-04 02:44:16 +00005826 return ospf_redistribute_set (ospf, source, type, -1);
paul718e3742002-12-13 20:15:29 +00005827}
5828
5829DEFUN (ospf_redistribute_source_routemap,
5830 ospf_redistribute_source_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005831 "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
5832 REDIST_STR
5833 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005834 "Route map reference\n"
5835 "Pointer to route-map entries\n")
5836{
paul020709f2003-04-04 02:44:16 +00005837 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005838 int source;
5839
5840 /* Get distribute source. */
5841 if (!str2distribute_source (argv[0], &source))
5842 return CMD_WARNING;
5843
5844 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00005845 ospf_routemap_set (ospf, source, argv[1]);
paul718e3742002-12-13 20:15:29 +00005846 else
paul020709f2003-04-04 02:44:16 +00005847 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005848
paul020709f2003-04-04 02:44:16 +00005849 return ospf_redistribute_set (ospf, source, -1, -1);
paul718e3742002-12-13 20:15:29 +00005850}
5851
5852DEFUN (no_ospf_redistribute_source,
5853 no_ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005854 "no redistribute " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005855 NO_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005856 REDIST_STR
5857 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005858{
paul020709f2003-04-04 02:44:16 +00005859 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005860 int source;
5861
5862 if (!str2distribute_source (argv[0], &source))
5863 return CMD_WARNING;
5864
paul020709f2003-04-04 02:44:16 +00005865 ospf_routemap_unset (ospf, source);
5866 return ospf_redistribute_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005867}
5868
5869DEFUN (ospf_distribute_list_out,
5870 ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005871 "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005872 "Filter networks in routing updates\n"
5873 "Access-list name\n"
5874 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005875 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005876{
paul68980082003-03-25 05:07:42 +00005877 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005878 int source;
5879
5880 /* Get distribute source. */
5881 if (!str2distribute_source (argv[1], &source))
5882 return CMD_WARNING;
5883
paul68980082003-03-25 05:07:42 +00005884 return ospf_distribute_list_out_set (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005885}
5886
5887DEFUN (no_ospf_distribute_list_out,
5888 no_ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005889 "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005890 NO_STR
5891 "Filter networks in routing updates\n"
5892 "Access-list name\n"
5893 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005894 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005895{
paul68980082003-03-25 05:07:42 +00005896 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005897 int source;
5898
5899 if (!str2distribute_source (argv[1], &source))
5900 return CMD_WARNING;
5901
paul68980082003-03-25 05:07:42 +00005902 return ospf_distribute_list_out_unset (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005903}
5904
5905/* Default information originate. */
5906DEFUN (ospf_default_information_originate_metric_type_routemap,
5907 ospf_default_information_originate_metric_type_routemap_cmd,
5908 "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
5909 "Control distribution of default information\n"
5910 "Distribute a default route\n"
5911 "OSPF default metric\n"
5912 "OSPF metric\n"
5913 "OSPF metric type for default routes\n"
5914 "Set OSPF External Type 1 metrics\n"
5915 "Set OSPF External Type 2 metrics\n"
5916 "Route map reference\n"
5917 "Pointer to route-map entries\n")
5918{
paul020709f2003-04-04 02:44:16 +00005919 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005920 int type = -1;
5921 int metric = -1;
5922
5923 /* Get metric value. */
5924 if (argc >= 1)
5925 if (!str2metric (argv[0], &metric))
5926 return CMD_WARNING;
5927
5928 /* Get metric type. */
5929 if (argc >= 2)
5930 if (!str2metric_type (argv[1], &type))
5931 return CMD_WARNING;
5932
5933 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005934 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00005935 else
paul020709f2003-04-04 02:44:16 +00005936 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00005937
paul020709f2003-04-04 02:44:16 +00005938 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
5939 type, metric);
paul718e3742002-12-13 20:15:29 +00005940}
5941
5942ALIAS (ospf_default_information_originate_metric_type_routemap,
5943 ospf_default_information_originate_metric_type_cmd,
5944 "default-information originate metric <0-16777214> metric-type (1|2)",
5945 "Control distribution of default information\n"
5946 "Distribute a default route\n"
5947 "OSPF default metric\n"
5948 "OSPF metric\n"
5949 "OSPF metric type for default routes\n"
5950 "Set OSPF External Type 1 metrics\n"
5951 "Set OSPF External Type 2 metrics\n")
5952
5953ALIAS (ospf_default_information_originate_metric_type_routemap,
5954 ospf_default_information_originate_metric_cmd,
5955 "default-information originate metric <0-16777214>",
5956 "Control distribution of default information\n"
5957 "Distribute a default route\n"
5958 "OSPF default metric\n"
5959 "OSPF metric\n")
5960
5961ALIAS (ospf_default_information_originate_metric_type_routemap,
5962 ospf_default_information_originate_cmd,
5963 "default-information originate",
5964 "Control distribution of default information\n"
5965 "Distribute a default route\n")
5966
5967/* Default information originate. */
5968DEFUN (ospf_default_information_originate_metric_routemap,
5969 ospf_default_information_originate_metric_routemap_cmd,
5970 "default-information originate metric <0-16777214> route-map WORD",
5971 "Control distribution of default information\n"
5972 "Distribute a default route\n"
5973 "OSPF default metric\n"
5974 "OSPF metric\n"
5975 "Route map reference\n"
5976 "Pointer to route-map entries\n")
5977{
paul020709f2003-04-04 02:44:16 +00005978 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005979 int metric = -1;
5980
5981 /* Get metric value. */
5982 if (argc >= 1)
5983 if (!str2metric (argv[0], &metric))
5984 return CMD_WARNING;
5985
5986 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00005987 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00005988 else
paul020709f2003-04-04 02:44:16 +00005989 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00005990
paul020709f2003-04-04 02:44:16 +00005991 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
5992 -1, metric);
paul718e3742002-12-13 20:15:29 +00005993}
5994
5995/* Default information originate. */
5996DEFUN (ospf_default_information_originate_routemap,
5997 ospf_default_information_originate_routemap_cmd,
5998 "default-information originate route-map WORD",
5999 "Control distribution of default information\n"
6000 "Distribute a default route\n"
6001 "Route map reference\n"
6002 "Pointer to route-map entries\n")
6003{
paul020709f2003-04-04 02:44:16 +00006004 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006005
paul020709f2003-04-04 02:44:16 +00006006 if (argc == 1)
6007 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6008 else
6009 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6010
6011 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
paul718e3742002-12-13 20:15:29 +00006012}
6013
6014DEFUN (ospf_default_information_originate_type_metric_routemap,
6015 ospf_default_information_originate_type_metric_routemap_cmd,
6016 "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
6017 "Control distribution of default information\n"
6018 "Distribute a default route\n"
6019 "OSPF metric type for default routes\n"
6020 "Set OSPF External Type 1 metrics\n"
6021 "Set OSPF External Type 2 metrics\n"
6022 "OSPF default metric\n"
6023 "OSPF metric\n"
6024 "Route map reference\n"
6025 "Pointer to route-map entries\n")
6026{
paul020709f2003-04-04 02:44:16 +00006027 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006028 int type = -1;
6029 int metric = -1;
6030
6031 /* Get metric type. */
6032 if (argc >= 1)
6033 if (!str2metric_type (argv[0], &type))
6034 return CMD_WARNING;
6035
6036 /* Get metric value. */
6037 if (argc >= 2)
6038 if (!str2metric (argv[1], &metric))
6039 return CMD_WARNING;
6040
6041 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006042 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006043 else
paul020709f2003-04-04 02:44:16 +00006044 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006045
paul020709f2003-04-04 02:44:16 +00006046 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6047 type, metric);
paul718e3742002-12-13 20:15:29 +00006048}
6049
6050ALIAS (ospf_default_information_originate_type_metric_routemap,
6051 ospf_default_information_originate_type_metric_cmd,
6052 "default-information originate metric-type (1|2) metric <0-16777214>",
6053 "Control distribution of default information\n"
6054 "Distribute a default route\n"
6055 "OSPF metric type for default routes\n"
6056 "Set OSPF External Type 1 metrics\n"
6057 "Set OSPF External Type 2 metrics\n"
6058 "OSPF default metric\n"
6059 "OSPF metric\n")
6060
6061ALIAS (ospf_default_information_originate_type_metric_routemap,
6062 ospf_default_information_originate_type_cmd,
6063 "default-information originate metric-type (1|2)",
6064 "Control distribution of default information\n"
6065 "Distribute a default route\n"
6066 "OSPF metric type for default routes\n"
6067 "Set OSPF External Type 1 metrics\n"
6068 "Set OSPF External Type 2 metrics\n")
6069
6070DEFUN (ospf_default_information_originate_type_routemap,
6071 ospf_default_information_originate_type_routemap_cmd,
6072 "default-information originate metric-type (1|2) route-map WORD",
6073 "Control distribution of default information\n"
6074 "Distribute a default route\n"
6075 "OSPF metric type for default routes\n"
6076 "Set OSPF External Type 1 metrics\n"
6077 "Set OSPF External Type 2 metrics\n"
6078 "Route map reference\n"
6079 "Pointer to route-map entries\n")
6080{
paul020709f2003-04-04 02:44:16 +00006081 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006082 int type = -1;
6083
6084 /* Get metric type. */
6085 if (argc >= 1)
6086 if (!str2metric_type (argv[0], &type))
6087 return CMD_WARNING;
6088
6089 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006090 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006091 else
paul020709f2003-04-04 02:44:16 +00006092 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006093
paul020709f2003-04-04 02:44:16 +00006094 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6095 type, -1);
paul718e3742002-12-13 20:15:29 +00006096}
6097
6098DEFUN (ospf_default_information_originate_always_metric_type_routemap,
6099 ospf_default_information_originate_always_metric_type_routemap_cmd,
6100 "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
6101 "Control distribution of default information\n"
6102 "Distribute a default route\n"
6103 "Always advertise default route\n"
6104 "OSPF default metric\n"
6105 "OSPF metric\n"
6106 "OSPF metric type for default routes\n"
6107 "Set OSPF External Type 1 metrics\n"
6108 "Set OSPF External Type 2 metrics\n"
6109 "Route map reference\n"
6110 "Pointer to route-map entries\n")
6111{
paul020709f2003-04-04 02:44:16 +00006112 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006113 int type = -1;
6114 int metric = -1;
6115
6116 /* Get metric value. */
6117 if (argc >= 1)
6118 if (!str2metric (argv[0], &metric))
6119 return CMD_WARNING;
6120
6121 /* Get metric type. */
6122 if (argc >= 2)
6123 if (!str2metric_type (argv[1], &type))
6124 return CMD_WARNING;
6125
6126 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006127 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006128 else
paul020709f2003-04-04 02:44:16 +00006129 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006130
paul020709f2003-04-04 02:44:16 +00006131 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006132 type, metric);
6133}
6134
6135ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6136 ospf_default_information_originate_always_metric_type_cmd,
6137 "default-information originate always metric <0-16777214> metric-type (1|2)",
6138 "Control distribution of default information\n"
6139 "Distribute a default route\n"
6140 "Always advertise default route\n"
6141 "OSPF default metric\n"
6142 "OSPF metric\n"
6143 "OSPF metric type for default routes\n"
6144 "Set OSPF External Type 1 metrics\n"
6145 "Set OSPF External Type 2 metrics\n")
6146
6147ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6148 ospf_default_information_originate_always_metric_cmd,
6149 "default-information originate always metric <0-16777214>",
6150 "Control distribution of default information\n"
6151 "Distribute a default route\n"
6152 "Always advertise default route\n"
6153 "OSPF default metric\n"
6154 "OSPF metric\n"
6155 "OSPF metric type for default routes\n")
6156
6157ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6158 ospf_default_information_originate_always_cmd,
6159 "default-information originate always",
6160 "Control distribution of default information\n"
6161 "Distribute a default route\n"
6162 "Always advertise default route\n")
6163
6164DEFUN (ospf_default_information_originate_always_metric_routemap,
6165 ospf_default_information_originate_always_metric_routemap_cmd,
6166 "default-information originate always metric <0-16777214> route-map WORD",
6167 "Control distribution of default information\n"
6168 "Distribute a default route\n"
6169 "Always advertise default route\n"
6170 "OSPF default metric\n"
6171 "OSPF metric\n"
6172 "Route map reference\n"
6173 "Pointer to route-map entries\n")
6174{
paul020709f2003-04-04 02:44:16 +00006175 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006176 int metric = -1;
6177
6178 /* Get metric value. */
6179 if (argc >= 1)
6180 if (!str2metric (argv[0], &metric))
6181 return CMD_WARNING;
6182
6183 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006184 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006185 else
paul020709f2003-04-04 02:44:16 +00006186 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006187
paul020709f2003-04-04 02:44:16 +00006188 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6189 -1, metric);
paul718e3742002-12-13 20:15:29 +00006190}
6191
6192DEFUN (ospf_default_information_originate_always_routemap,
6193 ospf_default_information_originate_always_routemap_cmd,
6194 "default-information originate always route-map WORD",
6195 "Control distribution of default information\n"
6196 "Distribute a default route\n"
6197 "Always advertise default route\n"
6198 "Route map reference\n"
6199 "Pointer to route-map entries\n")
6200{
paul020709f2003-04-04 02:44:16 +00006201 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006202
paul020709f2003-04-04 02:44:16 +00006203 if (argc == 1)
6204 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6205 else
6206 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6207
6208 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
paul718e3742002-12-13 20:15:29 +00006209}
6210
6211DEFUN (ospf_default_information_originate_always_type_metric_routemap,
6212 ospf_default_information_originate_always_type_metric_routemap_cmd,
6213 "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
6214 "Control distribution of default information\n"
6215 "Distribute a default route\n"
6216 "Always advertise default route\n"
6217 "OSPF metric type for default routes\n"
6218 "Set OSPF External Type 1 metrics\n"
6219 "Set OSPF External Type 2 metrics\n"
6220 "OSPF default metric\n"
6221 "OSPF metric\n"
6222 "Route map reference\n"
6223 "Pointer to route-map entries\n")
6224{
paul020709f2003-04-04 02:44:16 +00006225 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006226 int type = -1;
6227 int metric = -1;
6228
6229 /* Get metric type. */
6230 if (argc >= 1)
6231 if (!str2metric_type (argv[0], &type))
6232 return CMD_WARNING;
6233
6234 /* Get metric value. */
6235 if (argc >= 2)
6236 if (!str2metric (argv[1], &metric))
6237 return CMD_WARNING;
6238
6239 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006240 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006241 else
paul020709f2003-04-04 02:44:16 +00006242 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006243
paul020709f2003-04-04 02:44:16 +00006244 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006245 type, metric);
6246}
6247
6248ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6249 ospf_default_information_originate_always_type_metric_cmd,
6250 "default-information originate always metric-type (1|2) metric <0-16777214>",
6251 "Control distribution of default information\n"
6252 "Distribute a default route\n"
6253 "Always advertise default route\n"
6254 "OSPF metric type for default routes\n"
6255 "Set OSPF External Type 1 metrics\n"
6256 "Set OSPF External Type 2 metrics\n"
6257 "OSPF default metric\n"
6258 "OSPF metric\n")
6259
6260ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6261 ospf_default_information_originate_always_type_cmd,
6262 "default-information originate always metric-type (1|2)",
6263 "Control distribution of default information\n"
6264 "Distribute a default route\n"
6265 "Always advertise default route\n"
6266 "OSPF metric type for default routes\n"
6267 "Set OSPF External Type 1 metrics\n"
6268 "Set OSPF External Type 2 metrics\n")
6269
6270DEFUN (ospf_default_information_originate_always_type_routemap,
6271 ospf_default_information_originate_always_type_routemap_cmd,
6272 "default-information originate always metric-type (1|2) route-map WORD",
6273 "Control distribution of default information\n"
6274 "Distribute a default route\n"
6275 "Always advertise default route\n"
6276 "OSPF metric type for default routes\n"
6277 "Set OSPF External Type 1 metrics\n"
6278 "Set OSPF External Type 2 metrics\n"
6279 "Route map reference\n"
6280 "Pointer to route-map entries\n")
6281{
paul020709f2003-04-04 02:44:16 +00006282 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006283 int type = -1;
6284
6285 /* Get metric type. */
6286 if (argc >= 1)
6287 if (!str2metric_type (argv[0], &type))
6288 return CMD_WARNING;
6289
6290 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006291 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006292 else
paul020709f2003-04-04 02:44:16 +00006293 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006294
paul020709f2003-04-04 02:44:16 +00006295 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006296 type, -1);
6297}
6298
6299DEFUN (no_ospf_default_information_originate,
6300 no_ospf_default_information_originate_cmd,
6301 "no default-information originate",
6302 NO_STR
6303 "Control distribution of default information\n"
6304 "Distribute a default route\n")
6305{
paul68980082003-03-25 05:07:42 +00006306 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006307 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00006308
6309 p.family = AF_INET;
6310 p.prefix.s_addr = 0;
6311 p.prefixlen = 0;
6312
ajs5339cfd2005-09-19 13:28:05 +00006313 ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
paul718e3742002-12-13 20:15:29 +00006314
6315 if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6316 ospf_external_info_delete (DEFAULT_ROUTE, p);
6317 route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6318 EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6319 }
6320
paul020709f2003-04-04 02:44:16 +00006321 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6322 return ospf_redistribute_default_unset (ospf);
paul718e3742002-12-13 20:15:29 +00006323}
6324
6325DEFUN (ospf_default_metric,
6326 ospf_default_metric_cmd,
6327 "default-metric <0-16777214>",
6328 "Set metric of redistributed routes\n"
6329 "Default metric\n")
6330{
paul68980082003-03-25 05:07:42 +00006331 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006332 int metric = -1;
6333
6334 if (!str2metric (argv[0], &metric))
6335 return CMD_WARNING;
6336
paul68980082003-03-25 05:07:42 +00006337 ospf->default_metric = metric;
paul718e3742002-12-13 20:15:29 +00006338
6339 return CMD_SUCCESS;
6340}
6341
6342DEFUN (no_ospf_default_metric,
6343 no_ospf_default_metric_cmd,
6344 "no default-metric",
6345 NO_STR
6346 "Set metric of redistributed routes\n")
6347{
paul68980082003-03-25 05:07:42 +00006348 struct ospf *ospf = vty->index;
6349
6350 ospf->default_metric = -1;
6351
paul718e3742002-12-13 20:15:29 +00006352 return CMD_SUCCESS;
6353}
6354
6355ALIAS (no_ospf_default_metric,
6356 no_ospf_default_metric_val_cmd,
6357 "no default-metric <0-16777214>",
6358 NO_STR
6359 "Set metric of redistributed routes\n"
6360 "Default metric\n")
6361
6362DEFUN (ospf_distance,
6363 ospf_distance_cmd,
6364 "distance <1-255>",
6365 "Define an administrative distance\n"
6366 "OSPF Administrative distance\n")
6367{
paul68980082003-03-25 05:07:42 +00006368 struct ospf *ospf = vty->index;
6369
6370 ospf->distance_all = atoi (argv[0]);
6371
paul718e3742002-12-13 20:15:29 +00006372 return CMD_SUCCESS;
6373}
6374
6375DEFUN (no_ospf_distance,
6376 no_ospf_distance_cmd,
6377 "no distance <1-255>",
6378 NO_STR
6379 "Define an administrative distance\n"
6380 "OSPF Administrative distance\n")
6381{
paul68980082003-03-25 05:07:42 +00006382 struct ospf *ospf = vty->index;
6383
6384 ospf->distance_all = 0;
6385
paul718e3742002-12-13 20:15:29 +00006386 return CMD_SUCCESS;
6387}
6388
6389DEFUN (no_ospf_distance_ospf,
6390 no_ospf_distance_ospf_cmd,
6391 "no distance ospf",
6392 NO_STR
6393 "Define an administrative distance\n"
6394 "OSPF Administrative distance\n"
6395 "OSPF Distance\n")
6396{
paul68980082003-03-25 05:07:42 +00006397 struct ospf *ospf = vty->index;
6398
6399 ospf->distance_intra = 0;
6400 ospf->distance_inter = 0;
6401 ospf->distance_external = 0;
6402
paul718e3742002-12-13 20:15:29 +00006403 return CMD_SUCCESS;
6404}
6405
6406DEFUN (ospf_distance_ospf_intra,
6407 ospf_distance_ospf_intra_cmd,
6408 "distance ospf intra-area <1-255>",
6409 "Define an administrative distance\n"
6410 "OSPF Administrative distance\n"
6411 "Intra-area routes\n"
6412 "Distance for intra-area routes\n")
6413{
paul68980082003-03-25 05:07:42 +00006414 struct ospf *ospf = vty->index;
6415
6416 ospf->distance_intra = atoi (argv[0]);
6417
paul718e3742002-12-13 20:15:29 +00006418 return CMD_SUCCESS;
6419}
6420
6421DEFUN (ospf_distance_ospf_intra_inter,
6422 ospf_distance_ospf_intra_inter_cmd,
6423 "distance ospf intra-area <1-255> inter-area <1-255>",
6424 "Define an administrative distance\n"
6425 "OSPF Administrative distance\n"
6426 "Intra-area routes\n"
6427 "Distance for intra-area routes\n"
6428 "Inter-area routes\n"
6429 "Distance for inter-area routes\n")
6430{
paul68980082003-03-25 05:07:42 +00006431 struct ospf *ospf = vty->index;
6432
6433 ospf->distance_intra = atoi (argv[0]);
6434 ospf->distance_inter = atoi (argv[1]);
6435
paul718e3742002-12-13 20:15:29 +00006436 return CMD_SUCCESS;
6437}
6438
6439DEFUN (ospf_distance_ospf_intra_external,
6440 ospf_distance_ospf_intra_external_cmd,
6441 "distance ospf intra-area <1-255> external <1-255>",
6442 "Define an administrative distance\n"
6443 "OSPF Administrative distance\n"
6444 "Intra-area routes\n"
6445 "Distance for intra-area routes\n"
6446 "External routes\n"
6447 "Distance for external routes\n")
6448{
paul68980082003-03-25 05:07:42 +00006449 struct ospf *ospf = vty->index;
6450
6451 ospf->distance_intra = atoi (argv[0]);
6452 ospf->distance_external = atoi (argv[1]);
6453
paul718e3742002-12-13 20:15:29 +00006454 return CMD_SUCCESS;
6455}
6456
6457DEFUN (ospf_distance_ospf_intra_inter_external,
6458 ospf_distance_ospf_intra_inter_external_cmd,
6459 "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
6460 "Define an administrative distance\n"
6461 "OSPF Administrative distance\n"
6462 "Intra-area routes\n"
6463 "Distance for intra-area routes\n"
6464 "Inter-area routes\n"
6465 "Distance for inter-area routes\n"
6466 "External routes\n"
6467 "Distance for external routes\n")
6468{
paul68980082003-03-25 05:07:42 +00006469 struct ospf *ospf = vty->index;
6470
6471 ospf->distance_intra = atoi (argv[0]);
6472 ospf->distance_inter = atoi (argv[1]);
6473 ospf->distance_external = atoi (argv[2]);
6474
paul718e3742002-12-13 20:15:29 +00006475 return CMD_SUCCESS;
6476}
6477
6478DEFUN (ospf_distance_ospf_intra_external_inter,
6479 ospf_distance_ospf_intra_external_inter_cmd,
6480 "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
6481 "Define an administrative distance\n"
6482 "OSPF Administrative distance\n"
6483 "Intra-area routes\n"
6484 "Distance for intra-area routes\n"
6485 "External routes\n"
6486 "Distance for external routes\n"
6487 "Inter-area routes\n"
6488 "Distance for inter-area routes\n")
6489{
paul68980082003-03-25 05:07:42 +00006490 struct ospf *ospf = vty->index;
6491
6492 ospf->distance_intra = atoi (argv[0]);
6493 ospf->distance_external = atoi (argv[1]);
6494 ospf->distance_inter = atoi (argv[2]);
6495
paul718e3742002-12-13 20:15:29 +00006496 return CMD_SUCCESS;
6497}
6498
6499DEFUN (ospf_distance_ospf_inter,
6500 ospf_distance_ospf_inter_cmd,
6501 "distance ospf inter-area <1-255>",
6502 "Define an administrative distance\n"
6503 "OSPF Administrative distance\n"
6504 "Inter-area routes\n"
6505 "Distance for inter-area routes\n")
6506{
paul68980082003-03-25 05:07:42 +00006507 struct ospf *ospf = vty->index;
6508
6509 ospf->distance_inter = atoi (argv[0]);
6510
paul718e3742002-12-13 20:15:29 +00006511 return CMD_SUCCESS;
6512}
6513
6514DEFUN (ospf_distance_ospf_inter_intra,
6515 ospf_distance_ospf_inter_intra_cmd,
6516 "distance ospf inter-area <1-255> intra-area <1-255>",
6517 "Define an administrative distance\n"
6518 "OSPF Administrative distance\n"
6519 "Inter-area routes\n"
6520 "Distance for inter-area routes\n"
6521 "Intra-area routes\n"
6522 "Distance for intra-area routes\n")
6523{
paul68980082003-03-25 05:07:42 +00006524 struct ospf *ospf = vty->index;
6525
6526 ospf->distance_inter = atoi (argv[0]);
6527 ospf->distance_intra = atoi (argv[1]);
6528
paul718e3742002-12-13 20:15:29 +00006529 return CMD_SUCCESS;
6530}
6531
6532DEFUN (ospf_distance_ospf_inter_external,
6533 ospf_distance_ospf_inter_external_cmd,
6534 "distance ospf inter-area <1-255> external <1-255>",
6535 "Define an administrative distance\n"
6536 "OSPF Administrative distance\n"
6537 "Inter-area routes\n"
6538 "Distance for inter-area routes\n"
6539 "External routes\n"
6540 "Distance for external routes\n")
6541{
paul68980082003-03-25 05:07:42 +00006542 struct ospf *ospf = vty->index;
6543
6544 ospf->distance_inter = atoi (argv[0]);
6545 ospf->distance_external = atoi (argv[1]);
6546
paul718e3742002-12-13 20:15:29 +00006547 return CMD_SUCCESS;
6548}
6549
6550DEFUN (ospf_distance_ospf_inter_intra_external,
6551 ospf_distance_ospf_inter_intra_external_cmd,
6552 "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
6553 "Define an administrative distance\n"
6554 "OSPF Administrative distance\n"
6555 "Inter-area routes\n"
6556 "Distance for inter-area routes\n"
6557 "Intra-area routes\n"
6558 "Distance for intra-area routes\n"
6559 "External routes\n"
6560 "Distance for external routes\n")
6561{
paul68980082003-03-25 05:07:42 +00006562 struct ospf *ospf = vty->index;
6563
6564 ospf->distance_inter = atoi (argv[0]);
6565 ospf->distance_intra = atoi (argv[1]);
6566 ospf->distance_external = atoi (argv[2]);
6567
paul718e3742002-12-13 20:15:29 +00006568 return CMD_SUCCESS;
6569}
6570
6571DEFUN (ospf_distance_ospf_inter_external_intra,
6572 ospf_distance_ospf_inter_external_intra_cmd,
6573 "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
6574 "Define an administrative distance\n"
6575 "OSPF Administrative distance\n"
6576 "Inter-area routes\n"
6577 "Distance for inter-area routes\n"
6578 "External routes\n"
6579 "Distance for external routes\n"
6580 "Intra-area routes\n"
6581 "Distance for intra-area routes\n")
6582{
paul68980082003-03-25 05:07:42 +00006583 struct ospf *ospf = vty->index;
6584
6585 ospf->distance_inter = atoi (argv[0]);
6586 ospf->distance_external = atoi (argv[1]);
6587 ospf->distance_intra = atoi (argv[2]);
6588
paul718e3742002-12-13 20:15:29 +00006589 return CMD_SUCCESS;
6590}
6591
6592DEFUN (ospf_distance_ospf_external,
6593 ospf_distance_ospf_external_cmd,
6594 "distance ospf external <1-255>",
6595 "Define an administrative distance\n"
6596 "OSPF Administrative distance\n"
6597 "External routes\n"
6598 "Distance for external routes\n")
6599{
paul68980082003-03-25 05:07:42 +00006600 struct ospf *ospf = vty->index;
6601
6602 ospf->distance_external = atoi (argv[0]);
6603
paul718e3742002-12-13 20:15:29 +00006604 return CMD_SUCCESS;
6605}
6606
6607DEFUN (ospf_distance_ospf_external_intra,
6608 ospf_distance_ospf_external_intra_cmd,
6609 "distance ospf external <1-255> intra-area <1-255>",
6610 "Define an administrative distance\n"
6611 "OSPF Administrative distance\n"
6612 "External routes\n"
6613 "Distance for external routes\n"
6614 "Intra-area routes\n"
6615 "Distance for intra-area routes\n")
6616{
paul68980082003-03-25 05:07:42 +00006617 struct ospf *ospf = vty->index;
6618
6619 ospf->distance_external = atoi (argv[0]);
6620 ospf->distance_intra = atoi (argv[1]);
6621
paul718e3742002-12-13 20:15:29 +00006622 return CMD_SUCCESS;
6623}
6624
6625DEFUN (ospf_distance_ospf_external_inter,
6626 ospf_distance_ospf_external_inter_cmd,
6627 "distance ospf external <1-255> inter-area <1-255>",
6628 "Define an administrative distance\n"
6629 "OSPF Administrative distance\n"
6630 "External routes\n"
6631 "Distance for external routes\n"
6632 "Inter-area routes\n"
6633 "Distance for inter-area routes\n")
6634{
paul68980082003-03-25 05:07:42 +00006635 struct ospf *ospf = vty->index;
6636
6637 ospf->distance_external = atoi (argv[0]);
6638 ospf->distance_inter = atoi (argv[1]);
6639
paul718e3742002-12-13 20:15:29 +00006640 return CMD_SUCCESS;
6641}
6642
6643DEFUN (ospf_distance_ospf_external_intra_inter,
6644 ospf_distance_ospf_external_intra_inter_cmd,
6645 "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
6646 "Define an administrative distance\n"
6647 "OSPF Administrative distance\n"
6648 "External routes\n"
6649 "Distance for external routes\n"
6650 "Intra-area routes\n"
6651 "Distance for intra-area routes\n"
6652 "Inter-area routes\n"
6653 "Distance for inter-area routes\n")
6654{
paul68980082003-03-25 05:07:42 +00006655 struct ospf *ospf = vty->index;
6656
6657 ospf->distance_external = atoi (argv[0]);
6658 ospf->distance_intra = atoi (argv[1]);
6659 ospf->distance_inter = atoi (argv[2]);
6660
paul718e3742002-12-13 20:15:29 +00006661 return CMD_SUCCESS;
6662}
6663
6664DEFUN (ospf_distance_ospf_external_inter_intra,
6665 ospf_distance_ospf_external_inter_intra_cmd,
6666 "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
6667 "Define an administrative distance\n"
6668 "OSPF Administrative distance\n"
6669 "External routes\n"
6670 "Distance for external routes\n"
6671 "Inter-area routes\n"
6672 "Distance for inter-area routes\n"
6673 "Intra-area routes\n"
6674 "Distance for intra-area routes\n")
6675{
paul68980082003-03-25 05:07:42 +00006676 struct ospf *ospf = vty->index;
6677
6678 ospf->distance_external = atoi (argv[0]);
6679 ospf->distance_inter = atoi (argv[1]);
6680 ospf->distance_intra = atoi (argv[2]);
6681
paul718e3742002-12-13 20:15:29 +00006682 return CMD_SUCCESS;
6683}
6684
6685DEFUN (ospf_distance_source,
6686 ospf_distance_source_cmd,
6687 "distance <1-255> A.B.C.D/M",
6688 "Administrative distance\n"
6689 "Distance value\n"
6690 "IP source prefix\n")
6691{
paul020709f2003-04-04 02:44:16 +00006692 struct ospf *ospf = vty->index;
6693
6694 ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
paul68980082003-03-25 05:07:42 +00006695
paul718e3742002-12-13 20:15:29 +00006696 return CMD_SUCCESS;
6697}
6698
6699DEFUN (no_ospf_distance_source,
6700 no_ospf_distance_source_cmd,
6701 "no distance <1-255> A.B.C.D/M",
6702 NO_STR
6703 "Administrative distance\n"
6704 "Distance value\n"
6705 "IP source prefix\n")
6706{
paul020709f2003-04-04 02:44:16 +00006707 struct ospf *ospf = vty->index;
6708
6709 ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6710
paul718e3742002-12-13 20:15:29 +00006711 return CMD_SUCCESS;
6712}
6713
6714DEFUN (ospf_distance_source_access_list,
6715 ospf_distance_source_access_list_cmd,
6716 "distance <1-255> A.B.C.D/M WORD",
6717 "Administrative distance\n"
6718 "Distance value\n"
6719 "IP source prefix\n"
6720 "Access list name\n")
6721{
paul020709f2003-04-04 02:44:16 +00006722 struct ospf *ospf = vty->index;
6723
6724 ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6725
paul718e3742002-12-13 20:15:29 +00006726 return CMD_SUCCESS;
6727}
6728
6729DEFUN (no_ospf_distance_source_access_list,
6730 no_ospf_distance_source_access_list_cmd,
6731 "no distance <1-255> A.B.C.D/M WORD",
6732 NO_STR
6733 "Administrative distance\n"
6734 "Distance value\n"
6735 "IP source prefix\n"
6736 "Access list name\n")
6737{
paul020709f2003-04-04 02:44:16 +00006738 struct ospf *ospf = vty->index;
6739
6740 ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6741
paul718e3742002-12-13 20:15:29 +00006742 return CMD_SUCCESS;
6743}
6744
vincentba682532005-09-29 13:52:57 +00006745DEFUN (ip_ospf_mtu_ignore,
6746 ip_ospf_mtu_ignore_addr_cmd,
6747 "ip ospf mtu-ignore A.B.C.D",
6748 "IP Information\n"
6749 "OSPF interface commands\n"
6750 "Disable mtu mismatch detection\n"
6751 "Address of interface")
6752{
6753 struct interface *ifp = vty->index;
6754 struct in_addr addr;
6755 int ret;
6756
6757 struct ospf_if_params *params;
6758 params = IF_DEF_PARAMS (ifp);
6759
6760 if (argc == 1)
6761 {
6762 ret = inet_aton(argv[0], &addr);
6763 if (!ret)
6764 {
6765 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6766 VTY_NEWLINE);
6767 return CMD_WARNING;
6768 }
6769 params = ospf_get_if_params (ifp, addr);
6770 ospf_if_update_params (ifp, addr);
6771 }
6772 params->mtu_ignore = 1;
6773 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6774 SET_IF_PARAM (params, mtu_ignore);
6775 else
6776 {
6777 UNSET_IF_PARAM (params, mtu_ignore);
6778 if (params != IF_DEF_PARAMS (ifp))
6779 {
6780 ospf_free_if_params (ifp, addr);
6781 ospf_if_update_params (ifp, addr);
6782 }
6783 }
6784 return CMD_SUCCESS;
6785}
6786
6787ALIAS (ip_ospf_mtu_ignore,
6788 ip_ospf_mtu_ignore_cmd,
6789 "ip ospf mtu-ignore",
6790 "IP Information\n"
6791 "OSPF interface commands\n"
6792 "Disable mtu mismatch detection\n")
6793
6794
6795DEFUN (no_ip_ospf_mtu_ignore,
6796 no_ip_ospf_mtu_ignore_addr_cmd,
6797 "no ip ospf mtu-ignore A.B.C.D",
6798 "IP Information\n"
6799 "OSPF interface commands\n"
6800 "Disable mtu mismatch detection\n"
6801 "Address of interface")
6802{
6803 struct interface *ifp = vty->index;
6804 struct in_addr addr;
6805 int ret;
6806
6807 struct ospf_if_params *params;
6808 params = IF_DEF_PARAMS (ifp);
6809
6810 if (argc == 1)
6811 {
6812 ret = inet_aton(argv[0], &addr);
6813 if (!ret)
6814 {
6815 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6816 VTY_NEWLINE);
6817 return CMD_WARNING;
6818 }
6819 params = ospf_get_if_params (ifp, addr);
6820 ospf_if_update_params (ifp, addr);
6821 }
6822 params->mtu_ignore = 0;
6823 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6824 SET_IF_PARAM (params, mtu_ignore);
6825 else
6826 {
6827 UNSET_IF_PARAM (params, mtu_ignore);
6828 if (params != IF_DEF_PARAMS (ifp))
6829 {
6830 ospf_free_if_params (ifp, addr);
6831 ospf_if_update_params (ifp, addr);
6832 }
6833 }
6834 return CMD_SUCCESS;
6835}
6836
6837ALIAS (no_ip_ospf_mtu_ignore,
6838 no_ip_ospf_mtu_ignore_cmd,
6839 "no ip ospf mtu-ignore",
6840 "IP Information\n"
6841 "OSPF interface commands\n"
6842 "Disable mtu mismatch detection\n")
paul88d6cf32005-10-29 12:50:09 +00006843
6844DEFUN (ospf_max_metric_router_lsa_admin,
6845 ospf_max_metric_router_lsa_admin_cmd,
6846 "max-metric router-lsa administrative",
6847 "OSPF maximum / infinite-distance metric\n"
6848 "Advertise own Router-LSA with infinite distance (stub router)\n"
6849 "Administratively applied, for an indefinite period\n")
6850{
6851 struct listnode *ln;
6852 struct ospf_area *area;
6853 struct ospf *ospf = vty->index;
vincentba682532005-09-29 13:52:57 +00006854
paul88d6cf32005-10-29 12:50:09 +00006855 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6856 {
6857 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6858
6859 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
6860 ospf_router_lsa_timer_add (area);
6861 }
6862 return CMD_SUCCESS;
6863}
6864
6865DEFUN (no_ospf_max_metric_router_lsa_admin,
6866 no_ospf_max_metric_router_lsa_admin_cmd,
6867 "no max-metric router-lsa administrative",
6868 NO_STR
6869 "OSPF maximum / infinite-distance metric\n"
6870 "Advertise own Router-LSA with infinite distance (stub router)\n"
6871 "Administratively applied, for an indefinite period\n")
6872{
6873 struct listnode *ln;
6874 struct ospf_area *area;
6875 struct ospf *ospf = vty->index;
6876
6877 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6878 {
6879 UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6880
6881 /* Don't trample on the start-up stub timer */
6882 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
6883 && !area->t_stub_router)
6884 {
6885 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
6886 ospf_router_lsa_timer_add (area);
6887 }
6888 }
6889 return CMD_SUCCESS;
6890}
6891
6892DEFUN (ospf_max_metric_router_lsa_startup,
6893 ospf_max_metric_router_lsa_startup_cmd,
6894 "max-metric router-lsa on-startup <5-86400>",
6895 "OSPF maximum / infinite-distance metric\n"
6896 "Advertise own Router-LSA with infinite distance (stub router)\n"
6897 "Automatically advertise stub Router-LSA on startup of OSPF\n"
6898 "Time (seconds) to advertise self as stub-router\n")
6899{
6900 unsigned int seconds;
6901 struct ospf *ospf = vty->index;
6902
6903 if (argc != 1)
6904 {
6905 vty_out (vty, "%% Must supply stub-router period");
6906 return CMD_WARNING;
6907 }
6908
6909 VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
6910
6911 ospf->stub_router_startup_time = seconds;
6912
6913 return CMD_SUCCESS;
6914}
6915
6916DEFUN (no_ospf_max_metric_router_lsa_startup,
6917 no_ospf_max_metric_router_lsa_startup_cmd,
6918 "no max-metric router-lsa on-startup",
6919 NO_STR
6920 "OSPF maximum / infinite-distance metric\n"
6921 "Advertise own Router-LSA with infinite distance (stub router)\n"
6922 "Automatically advertise stub Router-LSA on startup of OSPF\n")
6923{
6924 struct listnode *ln;
6925 struct ospf_area *area;
6926 struct ospf *ospf = vty->index;
6927
6928 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6929
6930 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6931 {
6932 SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
6933 OSPF_TIMER_OFF (area->t_stub_router);
6934
6935 /* Don't trample on admin stub routed */
6936 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6937 {
6938 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
6939 ospf_router_lsa_timer_add (area);
6940 }
6941 }
6942 return CMD_SUCCESS;
6943}
6944
6945DEFUN (ospf_max_metric_router_lsa_shutdown,
6946 ospf_max_metric_router_lsa_shutdown_cmd,
6947 "max-metric router-lsa on-shutdown <5-86400>",
6948 "OSPF maximum / infinite-distance metric\n"
6949 "Advertise own Router-LSA with infinite distance (stub router)\n"
6950 "Advertise stub-router prior to full shutdown of OSPF\n"
6951 "Time (seconds) to wait till full shutdown\n")
6952{
6953 unsigned int seconds;
6954 struct ospf *ospf = vty->index;
6955
6956 if (argc != 1)
6957 {
6958 vty_out (vty, "%% Must supply stub-router shutdown period");
6959 return CMD_WARNING;
6960 }
6961
6962 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
6963
6964 ospf->stub_router_shutdown_time = seconds;
6965
6966 return CMD_SUCCESS;
6967}
6968
6969DEFUN (no_ospf_max_metric_router_lsa_shutdown,
6970 no_ospf_max_metric_router_lsa_shutdown_cmd,
6971 "no max-metric router-lsa on-shutdown",
6972 NO_STR
6973 "OSPF maximum / infinite-distance metric\n"
6974 "Advertise own Router-LSA with infinite distance (stub router)\n"
6975 "Advertise stub-router prior to full shutdown of OSPF\n")
6976{
6977 struct ospf *ospf = vty->index;
6978
6979 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6980
6981 return CMD_SUCCESS;
6982}
6983
6984static void
6985config_write_stub_router (struct vty *vty, struct ospf *ospf)
6986{
6987 struct listnode *ln;
6988 struct ospf_area *area;
6989
6990 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6991 vty_out (vty, " max-metric router-lsa on-startup %u%s",
6992 ospf->stub_router_startup_time, VTY_NEWLINE);
6993 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6994 vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
6995 ospf->stub_router_shutdown_time, VTY_NEWLINE);
6996 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6997 {
6998 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6999 {
7000 vty_out (vty, " max-metric router-lsa administrative%s",
7001 VTY_NEWLINE);
7002 break;
7003 }
7004 }
7005 return;
7006}
7007
paul4dadc292005-05-06 21:37:42 +00007008static void
paul718e3742002-12-13 20:15:29 +00007009show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
7010{
7011 struct route_node *rn;
7012 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007013 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007014 struct ospf_path *path;
7015
7016 vty_out (vty, "============ OSPF network routing table ============%s",
7017 VTY_NEWLINE);
7018
7019 for (rn = route_top (rt); rn; rn = route_next (rn))
7020 if ((or = rn->info) != NULL)
7021 {
7022 char buf1[19];
7023 snprintf (buf1, 19, "%s/%d",
7024 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7025
7026 switch (or->path_type)
7027 {
7028 case OSPF_PATH_INTER_AREA:
7029 if (or->type == OSPF_DESTINATION_NETWORK)
7030 vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
7031 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7032 else if (or->type == OSPF_DESTINATION_DISCARD)
7033 vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
7034 break;
7035 case OSPF_PATH_INTRA_AREA:
7036 vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
7037 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7038 break;
7039 default:
7040 break;
7041 }
7042
7043 if (or->type == OSPF_DESTINATION_NETWORK)
paul1eb8ef22005-04-07 07:30:20 +00007044 for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
paul96735ee2003-08-10 02:51:22 +00007045 {
hasso54bedb52005-08-17 13:31:47 +00007046 if (path->oi != NULL && ospf_if_exists(path->oi))
paul96735ee2003-08-10 02:51:22 +00007047 {
7048 if (path->nexthop.s_addr == 0)
7049 vty_out (vty, "%24s directly attached to %s%s",
7050 "", path->oi->ifp->name, VTY_NEWLINE);
7051 else
7052 vty_out (vty, "%24s via %s, %s%s", "",
7053 inet_ntoa (path->nexthop), path->oi->ifp->name,
7054 VTY_NEWLINE);
7055 }
7056 }
paul718e3742002-12-13 20:15:29 +00007057 }
7058 vty_out (vty, "%s", VTY_NEWLINE);
7059}
7060
paul4dadc292005-05-06 21:37:42 +00007061static void
paul718e3742002-12-13 20:15:29 +00007062show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
7063{
7064 struct route_node *rn;
7065 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007066 struct listnode *pnode;
7067 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007068 struct ospf_path *path;
7069
7070 vty_out (vty, "============ OSPF router routing table =============%s",
7071 VTY_NEWLINE);
7072 for (rn = route_top (rtrs); rn; rn = route_next (rn))
7073 if (rn->info)
7074 {
7075 int flag = 0;
7076
7077 vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
7078
paul1eb8ef22005-04-07 07:30:20 +00007079 for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
7080 {
7081 if (flag++)
7082 vty_out (vty, "%24s", "");
paul718e3742002-12-13 20:15:29 +00007083
paul1eb8ef22005-04-07 07:30:20 +00007084 /* Show path. */
7085 vty_out (vty, "%s [%d] area: %s",
7086 (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
7087 or->cost, inet_ntoa (or->u.std.area_id));
7088 /* Show flags. */
7089 vty_out (vty, "%s%s%s",
7090 (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
7091 (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
7092 VTY_NEWLINE);
7093
7094 for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
7095 {
hasso54bedb52005-08-17 13:31:47 +00007096 if (path->oi != NULL && ospf_if_exists(path->oi))
7097 {
7098 if (path->nexthop.s_addr == 0)
7099 vty_out (vty, "%24s directly attached to %s%s",
7100 "", path->oi->ifp->name, VTY_NEWLINE);
7101 else
7102 vty_out (vty, "%24s via %s, %s%s", "",
7103 inet_ntoa (path->nexthop),
7104 path->oi->ifp->name, VTY_NEWLINE);
7105 }
paul1eb8ef22005-04-07 07:30:20 +00007106 }
7107 }
paul718e3742002-12-13 20:15:29 +00007108 }
7109 vty_out (vty, "%s", VTY_NEWLINE);
7110}
7111
paul4dadc292005-05-06 21:37:42 +00007112static void
paul718e3742002-12-13 20:15:29 +00007113show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
7114{
7115 struct route_node *rn;
7116 struct ospf_route *er;
paul1eb8ef22005-04-07 07:30:20 +00007117 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007118 struct ospf_path *path;
7119
7120 vty_out (vty, "============ OSPF external routing table ===========%s",
7121 VTY_NEWLINE);
7122 for (rn = route_top (rt); rn; rn = route_next (rn))
7123 if ((er = rn->info) != NULL)
7124 {
7125 char buf1[19];
7126 snprintf (buf1, 19, "%s/%d",
7127 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7128
7129 switch (er->path_type)
7130 {
7131 case OSPF_PATH_TYPE1_EXTERNAL:
7132 vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
7133 er->cost, er->u.ext.tag, VTY_NEWLINE);
7134 break;
7135 case OSPF_PATH_TYPE2_EXTERNAL:
7136 vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
7137 er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
7138 break;
7139 }
7140
paul1eb8ef22005-04-07 07:30:20 +00007141 for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
paul718e3742002-12-13 20:15:29 +00007142 {
hasso54bedb52005-08-17 13:31:47 +00007143 if (path->oi != NULL && ospf_if_exists(path->oi))
paul718e3742002-12-13 20:15:29 +00007144 {
7145 if (path->nexthop.s_addr == 0)
paul96735ee2003-08-10 02:51:22 +00007146 vty_out (vty, "%24s directly attached to %s%s",
7147 "", path->oi->ifp->name, VTY_NEWLINE);
7148 else
7149 vty_out (vty, "%24s via %s, %s%s", "",
7150 inet_ntoa (path->nexthop), path->oi->ifp->name,
7151 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007152 }
7153 }
7154 }
7155 vty_out (vty, "%s", VTY_NEWLINE);
7156}
7157
paul718e3742002-12-13 20:15:29 +00007158DEFUN (show_ip_ospf_border_routers,
7159 show_ip_ospf_border_routers_cmd,
7160 "show ip ospf border-routers",
7161 SHOW_STR
7162 IP_STR
7163 "show all the ABR's and ASBR's\n"
7164 "for this area\n")
7165{
paul020709f2003-04-04 02:44:16 +00007166 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007167
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007168 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007169 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007170 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007171 return CMD_SUCCESS;
7172 }
7173
paul68980082003-03-25 05:07:42 +00007174 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007175 {
7176 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7177 return CMD_SUCCESS;
7178 }
7179
7180 /* Show Network routes.
paul020709f2003-04-04 02:44:16 +00007181 show_ip_ospf_route_network (vty, ospf->new_table); */
paul718e3742002-12-13 20:15:29 +00007182
7183 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007184 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007185
7186 return CMD_SUCCESS;
7187}
paul718e3742002-12-13 20:15:29 +00007188
7189DEFUN (show_ip_ospf_route,
7190 show_ip_ospf_route_cmd,
7191 "show ip ospf route",
7192 SHOW_STR
7193 IP_STR
7194 "OSPF information\n"
7195 "OSPF routing table\n")
7196{
paul020709f2003-04-04 02:44:16 +00007197 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007198
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007199 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007200 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007201 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007202 return CMD_SUCCESS;
7203 }
7204
paul68980082003-03-25 05:07:42 +00007205 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007206 {
7207 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7208 return CMD_SUCCESS;
7209 }
7210
7211 /* Show Network routes. */
paul68980082003-03-25 05:07:42 +00007212 show_ip_ospf_route_network (vty, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00007213
7214 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007215 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007216
7217 /* Show AS External routes. */
paul68980082003-03-25 05:07:42 +00007218 show_ip_ospf_route_external (vty, ospf->old_external_route);
paul718e3742002-12-13 20:15:29 +00007219
7220 return CMD_SUCCESS;
7221}
7222
7223
hassoeb1ce602004-10-08 08:17:22 +00007224const char *ospf_abr_type_str[] =
paul718e3742002-12-13 20:15:29 +00007225{
7226 "unknown",
7227 "standard",
7228 "ibm",
7229 "cisco",
7230 "shortcut"
7231};
7232
hassoeb1ce602004-10-08 08:17:22 +00007233const char *ospf_shortcut_mode_str[] =
paul718e3742002-12-13 20:15:29 +00007234{
7235 "default",
7236 "enable",
7237 "disable"
7238};
7239
7240
paul4dadc292005-05-06 21:37:42 +00007241static void
paul718e3742002-12-13 20:15:29 +00007242area_id2str (char *buf, int length, struct ospf_area *area)
7243{
7244 memset (buf, 0, length);
7245
7246 if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7247 strncpy (buf, inet_ntoa (area->area_id), length);
7248 else
7249 sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
7250}
7251
7252
hassoeb1ce602004-10-08 08:17:22 +00007253const char *ospf_int_type_str[] =
paul718e3742002-12-13 20:15:29 +00007254{
7255 "unknown", /* should never be used. */
7256 "point-to-point",
7257 "broadcast",
7258 "non-broadcast",
7259 "point-to-multipoint",
7260 "virtual-link", /* should never be used. */
7261 "loopback"
7262};
7263
7264/* Configuration write function for ospfd. */
paul4dadc292005-05-06 21:37:42 +00007265static int
paul718e3742002-12-13 20:15:29 +00007266config_write_interface (struct vty *vty)
7267{
hasso52dc7ee2004-09-23 19:18:23 +00007268 struct listnode *n1, *n2;
paul718e3742002-12-13 20:15:29 +00007269 struct interface *ifp;
7270 struct crypt_key *ck;
7271 int write = 0;
7272 struct route_node *rn = NULL;
7273 struct ospf_if_params *params;
7274
paul1eb8ef22005-04-07 07:30:20 +00007275 for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
paul718e3742002-12-13 20:15:29 +00007276 {
paul718e3742002-12-13 20:15:29 +00007277 if (memcmp (ifp->name, "VLINK", 5) == 0)
7278 continue;
7279
7280 vty_out (vty, "!%s", VTY_NEWLINE);
7281 vty_out (vty, "interface %s%s", ifp->name,
7282 VTY_NEWLINE);
7283 if (ifp->desc)
7284 vty_out (vty, " description %s%s", ifp->desc,
7285 VTY_NEWLINE);
7286
7287 write++;
7288
7289 params = IF_DEF_PARAMS (ifp);
7290
7291 do {
7292 /* Interface Network print. */
7293 if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
paul718e3742002-12-13 20:15:29 +00007294 params->type != OSPF_IFTYPE_LOOPBACK)
7295 {
ajsbc18d612004-12-15 15:07:19 +00007296 if (params->type != ospf_default_iftype(ifp))
hasso7b901432004-08-31 13:37:42 +00007297 {
7298 vty_out (vty, " ip ospf network %s",
7299 ospf_int_type_str[params->type]);
7300 if (params != IF_DEF_PARAMS (ifp))
7301 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7302 vty_out (vty, "%s", VTY_NEWLINE);
7303 }
paul718e3742002-12-13 20:15:29 +00007304 }
7305
7306 /* OSPF interface authentication print */
7307 if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
7308 params->auth_type != OSPF_AUTH_NOTSET)
7309 {
hassoeb1ce602004-10-08 08:17:22 +00007310 const char *auth_str;
paul718e3742002-12-13 20:15:29 +00007311
7312 /* Translation tables are not that much help here due to syntax
7313 of the simple option */
7314 switch (params->auth_type)
7315 {
7316
7317 case OSPF_AUTH_NULL:
7318 auth_str = " null";
7319 break;
7320
7321 case OSPF_AUTH_SIMPLE:
7322 auth_str = "";
7323 break;
7324
7325 case OSPF_AUTH_CRYPTOGRAPHIC:
7326 auth_str = " message-digest";
7327 break;
7328
7329 default:
7330 auth_str = "";
7331 break;
7332 }
7333
7334 vty_out (vty, " ip ospf authentication%s", auth_str);
7335 if (params != IF_DEF_PARAMS (ifp))
7336 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7337 vty_out (vty, "%s", VTY_NEWLINE);
7338 }
7339
7340 /* Simple Authentication Password print. */
7341 if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
7342 params->auth_simple[0] != '\0')
7343 {
7344 vty_out (vty, " ip ospf authentication-key %s",
7345 params->auth_simple);
7346 if (params != IF_DEF_PARAMS (ifp))
7347 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7348 vty_out (vty, "%s", VTY_NEWLINE);
7349 }
7350
7351 /* Cryptographic Authentication Key print. */
paul1eb8ef22005-04-07 07:30:20 +00007352 for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
paul718e3742002-12-13 20:15:29 +00007353 {
paul718e3742002-12-13 20:15:29 +00007354 vty_out (vty, " ip ospf message-digest-key %d md5 %s",
7355 ck->key_id, ck->auth_key);
7356 if (params != IF_DEF_PARAMS (ifp))
7357 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7358 vty_out (vty, "%s", VTY_NEWLINE);
7359 }
7360
7361 /* Interface Output Cost print. */
7362 if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
7363 {
7364 vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
7365 if (params != IF_DEF_PARAMS (ifp))
7366 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7367 vty_out (vty, "%s", VTY_NEWLINE);
7368 }
7369
7370 /* Hello Interval print. */
7371 if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
7372 params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
7373 {
7374 vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
7375 if (params != IF_DEF_PARAMS (ifp))
7376 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7377 vty_out (vty, "%s", VTY_NEWLINE);
7378 }
7379
7380
7381 /* Router Dead Interval print. */
7382 if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
7383 params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
7384 {
paulf9ad9372005-10-21 00:45:17 +00007385 vty_out (vty, " ip ospf dead-interval ");
7386
7387 /* fast hello ? */
7388 if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
7389 vty_out (vty, "minimal hello-multiplier %d",
7390 params->fast_hello);
7391 else
7392 vty_out (vty, "%u", params->v_wait);
7393
paul718e3742002-12-13 20:15:29 +00007394 if (params != IF_DEF_PARAMS (ifp))
7395 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7396 vty_out (vty, "%s", VTY_NEWLINE);
7397 }
7398
7399 /* Router Priority print. */
7400 if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
7401 params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
7402 {
7403 vty_out (vty, " ip ospf priority %u", params->priority);
7404 if (params != IF_DEF_PARAMS (ifp))
7405 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7406 vty_out (vty, "%s", VTY_NEWLINE);
7407 }
7408
7409 /* Retransmit Interval print. */
7410 if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
7411 params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
7412 {
7413 vty_out (vty, " ip ospf retransmit-interval %u",
7414 params->retransmit_interval);
7415 if (params != IF_DEF_PARAMS (ifp))
7416 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7417 vty_out (vty, "%s", VTY_NEWLINE);
7418 }
7419
7420 /* Transmit Delay print. */
7421 if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
7422 params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
7423 {
7424 vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
7425 if (params != IF_DEF_PARAMS (ifp))
7426 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7427 vty_out (vty, "%s", VTY_NEWLINE);
7428 }
7429
vincentba682532005-09-29 13:52:57 +00007430 /* MTU ignore print. */
7431 if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7432 params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7433 {
7434 if (params->mtu_ignore == 0)
7435 vty_out (vty, " no ip ospf mtu-ignore");
7436 else
7437 vty_out (vty, " ip ospf mtu-ignore");
7438 if (params != IF_DEF_PARAMS (ifp))
7439 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7440 vty_out (vty, "%s", VTY_NEWLINE);
7441 }
7442
7443
paul718e3742002-12-13 20:15:29 +00007444 while (1)
7445 {
7446 if (rn == NULL)
7447 rn = route_top (IF_OIFS_PARAMS (ifp));
7448 else
7449 rn = route_next (rn);
7450
7451 if (rn == NULL)
7452 break;
7453 params = rn->info;
7454 if (params != NULL)
7455 break;
7456 }
7457 } while (rn);
7458
7459#ifdef HAVE_OPAQUE_LSA
7460 ospf_opaque_config_write_if (vty, ifp);
7461#endif /* HAVE_OPAQUE_LSA */
7462 }
7463
7464 return write;
7465}
7466
paul4dadc292005-05-06 21:37:42 +00007467static int
paul68980082003-03-25 05:07:42 +00007468config_write_network_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007469{
7470 struct route_node *rn;
7471 u_char buf[INET_ADDRSTRLEN];
7472
7473 /* `network area' print. */
paul68980082003-03-25 05:07:42 +00007474 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007475 if (rn->info)
7476 {
7477 struct ospf_network *n = rn->info;
7478
7479 memset (buf, 0, INET_ADDRSTRLEN);
7480
7481 /* Create Area ID string by specified Area ID format. */
7482 if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007483 strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007484 else
hassoc9e52be2004-09-26 16:09:34 +00007485 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007486 (unsigned long int) ntohl (n->area_id.s_addr));
7487
7488 /* Network print. */
7489 vty_out (vty, " network %s/%d area %s%s",
7490 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7491 buf, VTY_NEWLINE);
7492 }
7493
7494 return 0;
7495}
7496
paul4dadc292005-05-06 21:37:42 +00007497static int
paul68980082003-03-25 05:07:42 +00007498config_write_ospf_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007499{
hasso52dc7ee2004-09-23 19:18:23 +00007500 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007501 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00007502 u_char buf[INET_ADDRSTRLEN];
7503
7504 /* Area configuration print. */
paul1eb8ef22005-04-07 07:30:20 +00007505 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00007506 {
paul718e3742002-12-13 20:15:29 +00007507 struct route_node *rn1;
7508
hassoc9e52be2004-09-26 16:09:34 +00007509 area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
paul718e3742002-12-13 20:15:29 +00007510
7511 if (area->auth_type != OSPF_AUTH_NULL)
7512 {
7513 if (area->auth_type == OSPF_AUTH_SIMPLE)
7514 vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7515 else
7516 vty_out (vty, " area %s authentication message-digest%s",
7517 buf, VTY_NEWLINE);
7518 }
7519
7520 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7521 vty_out (vty, " area %s shortcut %s%s", buf,
7522 ospf_shortcut_mode_str[area->shortcut_configured],
7523 VTY_NEWLINE);
7524
7525 if ((area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007526 || (area->external_routing == OSPF_AREA_NSSA)
paul718e3742002-12-13 20:15:29 +00007527 )
7528 {
paulb0a053b2003-06-22 09:04:47 +00007529 if (area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007530 vty_out (vty, " area %s stub", buf);
paulb0a053b2003-06-22 09:04:47 +00007531 else if (area->external_routing == OSPF_AREA_NSSA)
7532 {
7533 vty_out (vty, " area %s nssa", buf);
7534 switch (area->NSSATranslatorRole)
7535 {
7536 case OSPF_NSSA_ROLE_NEVER:
7537 vty_out (vty, " translate-never");
7538 break;
7539 case OSPF_NSSA_ROLE_ALWAYS:
7540 vty_out (vty, " translate-always");
7541 break;
7542 case OSPF_NSSA_ROLE_CANDIDATE:
7543 default:
7544 vty_out (vty, " translate-candidate");
7545 }
7546 }
paul718e3742002-12-13 20:15:29 +00007547
7548 if (area->no_summary)
7549 vty_out (vty, " no-summary");
7550
7551 vty_out (vty, "%s", VTY_NEWLINE);
7552
7553 if (area->default_cost != 1)
7554 vty_out (vty, " area %s default-cost %d%s", buf,
7555 area->default_cost, VTY_NEWLINE);
7556 }
7557
7558 for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7559 if (rn1->info)
7560 {
7561 struct ospf_area_range *range = rn1->info;
7562
7563 vty_out (vty, " area %s range %s/%d", buf,
7564 inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7565
paul6c835672004-10-11 11:00:30 +00007566 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +00007567 vty_out (vty, " cost %d", range->cost_config);
7568
7569 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7570 vty_out (vty, " not-advertise");
7571
7572 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7573 vty_out (vty, " substitute %s/%d",
7574 inet_ntoa (range->subst_addr), range->subst_masklen);
7575
7576 vty_out (vty, "%s", VTY_NEWLINE);
7577 }
7578
7579 if (EXPORT_NAME (area))
7580 vty_out (vty, " area %s export-list %s%s", buf,
7581 EXPORT_NAME (area), VTY_NEWLINE);
7582
7583 if (IMPORT_NAME (area))
7584 vty_out (vty, " area %s import-list %s%s", buf,
7585 IMPORT_NAME (area), VTY_NEWLINE);
7586
7587 if (PREFIX_NAME_IN (area))
7588 vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7589 PREFIX_NAME_IN (area), VTY_NEWLINE);
7590
7591 if (PREFIX_NAME_OUT (area))
7592 vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7593 PREFIX_NAME_OUT (area), VTY_NEWLINE);
7594 }
7595
7596 return 0;
7597}
7598
paul4dadc292005-05-06 21:37:42 +00007599static int
paul68980082003-03-25 05:07:42 +00007600config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007601{
7602 struct ospf_nbr_nbma *nbr_nbma;
7603 struct route_node *rn;
7604
7605 /* Static Neighbor configuration print. */
paul68980082003-03-25 05:07:42 +00007606 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007607 if ((nbr_nbma = rn->info))
7608 {
7609 vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7610
7611 if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7612 vty_out (vty, " priority %d", nbr_nbma->priority);
7613
7614 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7615 vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7616
7617 vty_out (vty, "%s", VTY_NEWLINE);
7618 }
7619
7620 return 0;
7621}
7622
paul4dadc292005-05-06 21:37:42 +00007623static int
paul68980082003-03-25 05:07:42 +00007624config_write_virtual_link (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007625{
hasso52dc7ee2004-09-23 19:18:23 +00007626 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007627 struct ospf_vl_data *vl_data;
paul718e3742002-12-13 20:15:29 +00007628 u_char buf[INET_ADDRSTRLEN];
7629
7630 /* Virtual-Link print */
paul1eb8ef22005-04-07 07:30:20 +00007631 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
paul718e3742002-12-13 20:15:29 +00007632 {
hasso52dc7ee2004-09-23 19:18:23 +00007633 struct listnode *n2;
paul718e3742002-12-13 20:15:29 +00007634 struct crypt_key *ck;
paul718e3742002-12-13 20:15:29 +00007635 struct ospf_interface *oi;
7636
7637 if (vl_data != NULL)
7638 {
7639 memset (buf, 0, INET_ADDRSTRLEN);
7640
7641 if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007642 strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007643 else
hassoc9e52be2004-09-26 16:09:34 +00007644 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007645 (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7646 oi = vl_data->vl_oi;
7647
7648 /* timers */
7649 if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7650 OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7651 OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7652 OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7653 vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7654 buf,
7655 inet_ntoa (vl_data->vl_peer),
7656 OSPF_IF_PARAM (oi, v_hello),
7657 OSPF_IF_PARAM (oi, retransmit_interval),
7658 OSPF_IF_PARAM (oi, transmit_delay),
7659 OSPF_IF_PARAM (oi, v_wait),
7660 VTY_NEWLINE);
7661 else
7662 vty_out (vty, " area %s virtual-link %s%s", buf,
7663 inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7664 /* Auth key */
7665 if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7666 vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7667 buf,
7668 inet_ntoa (vl_data->vl_peer),
7669 IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7670 VTY_NEWLINE);
7671 /* md5 keys */
paul1eb8ef22005-04-07 07:30:20 +00007672 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7673 n2, ck))
7674 vty_out (vty, " area %s virtual-link %s"
7675 " message-digest-key %d md5 %s%s",
7676 buf,
7677 inet_ntoa (vl_data->vl_peer),
7678 ck->key_id, ck->auth_key, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007679
7680 }
7681 }
7682
7683 return 0;
7684}
7685
7686
paul4dadc292005-05-06 21:37:42 +00007687static int
paul68980082003-03-25 05:07:42 +00007688config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007689{
7690 int type;
7691
7692 /* redistribute print. */
7693 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7694 if (type != zclient->redist_default && zclient->redist[type])
7695 {
ajsf52d13c2005-10-01 17:38:06 +00007696 vty_out (vty, " redistribute %s", zebra_route_string(type));
paul68980082003-03-25 05:07:42 +00007697 if (ospf->dmetric[type].value >= 0)
paul020709f2003-04-04 02:44:16 +00007698 vty_out (vty, " metric %d", ospf->dmetric[type].value);
paul718e3742002-12-13 20:15:29 +00007699
paul68980082003-03-25 05:07:42 +00007700 if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007701 vty_out (vty, " metric-type 1");
7702
paul020709f2003-04-04 02:44:16 +00007703 if (ROUTEMAP_NAME (ospf, type))
7704 vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
paul718e3742002-12-13 20:15:29 +00007705
7706 vty_out (vty, "%s", VTY_NEWLINE);
7707 }
7708
7709 return 0;
7710}
7711
paul4dadc292005-05-06 21:37:42 +00007712static int
paul68980082003-03-25 05:07:42 +00007713config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007714{
paul68980082003-03-25 05:07:42 +00007715 if (ospf->default_metric != -1)
7716 vty_out (vty, " default-metric %d%s", ospf->default_metric,
paul718e3742002-12-13 20:15:29 +00007717 VTY_NEWLINE);
7718 return 0;
7719}
7720
paul4dadc292005-05-06 21:37:42 +00007721static int
paul68980082003-03-25 05:07:42 +00007722config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007723{
7724 int type;
7725
paul68980082003-03-25 05:07:42 +00007726 if (ospf)
paul718e3742002-12-13 20:15:29 +00007727 {
7728 /* distribute-list print. */
7729 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
paul68980082003-03-25 05:07:42 +00007730 if (ospf->dlist[type].name)
paul718e3742002-12-13 20:15:29 +00007731 vty_out (vty, " distribute-list %s out %s%s",
paul68980082003-03-25 05:07:42 +00007732 ospf->dlist[type].name,
ajsf52d13c2005-10-01 17:38:06 +00007733 zebra_route_string(type), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007734
7735 /* default-information print. */
paul68980082003-03-25 05:07:42 +00007736 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
paul718e3742002-12-13 20:15:29 +00007737 {
paulc42c1772006-01-10 20:36:49 +00007738 vty_out (vty, " default-information originate");
7739 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7740 vty_out (vty, " always");
paul718e3742002-12-13 20:15:29 +00007741
paul68980082003-03-25 05:07:42 +00007742 if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
paul718e3742002-12-13 20:15:29 +00007743 vty_out (vty, " metric %d",
paul68980082003-03-25 05:07:42 +00007744 ospf->dmetric[DEFAULT_ROUTE].value);
7745 if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007746 vty_out (vty, " metric-type 1");
7747
paul020709f2003-04-04 02:44:16 +00007748 if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7749 vty_out (vty, " route-map %s",
7750 ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
paul718e3742002-12-13 20:15:29 +00007751
7752 vty_out (vty, "%s", VTY_NEWLINE);
7753 }
7754
7755 }
7756
7757 return 0;
7758}
7759
paul4dadc292005-05-06 21:37:42 +00007760static int
paul68980082003-03-25 05:07:42 +00007761config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007762{
7763 struct route_node *rn;
7764 struct ospf_distance *odistance;
7765
paul68980082003-03-25 05:07:42 +00007766 if (ospf->distance_all)
7767 vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007768
paul68980082003-03-25 05:07:42 +00007769 if (ospf->distance_intra
7770 || ospf->distance_inter
7771 || ospf->distance_external)
paul718e3742002-12-13 20:15:29 +00007772 {
7773 vty_out (vty, " distance ospf");
7774
paul68980082003-03-25 05:07:42 +00007775 if (ospf->distance_intra)
7776 vty_out (vty, " intra-area %d", ospf->distance_intra);
7777 if (ospf->distance_inter)
7778 vty_out (vty, " inter-area %d", ospf->distance_inter);
7779 if (ospf->distance_external)
7780 vty_out (vty, " external %d", ospf->distance_external);
paul718e3742002-12-13 20:15:29 +00007781
7782 vty_out (vty, "%s", VTY_NEWLINE);
7783 }
7784
paul68980082003-03-25 05:07:42 +00007785 for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007786 if ((odistance = rn->info) != NULL)
7787 {
7788 vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7789 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7790 odistance->access_list ? odistance->access_list : "",
7791 VTY_NEWLINE);
7792 }
7793 return 0;
7794}
7795
7796/* OSPF configuration write function. */
paul4dadc292005-05-06 21:37:42 +00007797static int
paul718e3742002-12-13 20:15:29 +00007798ospf_config_write (struct vty *vty)
7799{
paul020709f2003-04-04 02:44:16 +00007800 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00007801 struct interface *ifp;
7802 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00007803 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007804 int write = 0;
7805
paul020709f2003-04-04 02:44:16 +00007806 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00007807 if (ospf != NULL)
paul718e3742002-12-13 20:15:29 +00007808 {
7809 /* `router ospf' print. */
7810 vty_out (vty, "router ospf%s", VTY_NEWLINE);
7811
7812 write++;
7813
paul68980082003-03-25 05:07:42 +00007814 if (!ospf->networks)
paul718e3742002-12-13 20:15:29 +00007815 return write;
7816
7817 /* Router ID print. */
paul68980082003-03-25 05:07:42 +00007818 if (ospf->router_id_static.s_addr != 0)
paul718e3742002-12-13 20:15:29 +00007819 vty_out (vty, " ospf router-id %s%s",
paul68980082003-03-25 05:07:42 +00007820 inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007821
7822 /* ABR type print. */
pauld57834f2005-07-12 20:04:22 +00007823 if (ospf->abr_type != OSPF_ABR_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007824 vty_out (vty, " ospf abr-type %s%s",
paul68980082003-03-25 05:07:42 +00007825 ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007826
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007827 /* log-adjacency-changes flag print. */
7828 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
7829 {
7830 vty_out(vty, " log-adjacency-changes");
7831 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
7832 vty_out(vty, " detail");
7833 vty_out(vty, "%s", VTY_NEWLINE);
7834 }
7835
paul718e3742002-12-13 20:15:29 +00007836 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
paul68980082003-03-25 05:07:42 +00007837 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
paul718e3742002-12-13 20:15:29 +00007838 vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
7839
7840 /* auto-cost reference-bandwidth configuration. */
paul68980082003-03-25 05:07:42 +00007841 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
paulf9ad9372005-10-21 00:45:17 +00007842 {
7843 vty_out (vty, "! Important: ensure reference bandwidth "
7844 "is consistent across all routers%s", VTY_NEWLINE);
7845 vty_out (vty, " auto-cost reference-bandwidth %d%s",
7846 ospf->ref_bandwidth / 1000, VTY_NEWLINE);
7847 }
paul718e3742002-12-13 20:15:29 +00007848
7849 /* SPF timers print. */
paul68980082003-03-25 05:07:42 +00007850 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
paulea4ffc92005-10-21 20:04:41 +00007851 ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
7852 ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
7853 vty_out (vty, " timers throttle spf %d %d %d%s",
paul88d6cf32005-10-29 12:50:09 +00007854 ospf->spf_delay, ospf->spf_holdtime,
paulea4ffc92005-10-21 20:04:41 +00007855 ospf->spf_max_holdtime, VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00007856
7857 /* Max-metric router-lsa print */
7858 config_write_stub_router (vty, ospf);
7859
paul718e3742002-12-13 20:15:29 +00007860 /* SPF refresh parameters print. */
paul68980082003-03-25 05:07:42 +00007861 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007862 vty_out (vty, " refresh timer %d%s",
paul68980082003-03-25 05:07:42 +00007863 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007864
7865 /* Redistribute information print. */
paul68980082003-03-25 05:07:42 +00007866 config_write_ospf_redistribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007867
7868 /* passive-interface print. */
paul1eb8ef22005-04-07 07:30:20 +00007869 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
7870 if (IF_DEF_PARAMS (ifp)->passive_interface == OSPF_IF_PASSIVE)
7871 vty_out (vty, " passive-interface %s%s",
7872 ifp->name, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007873
paul1eb8ef22005-04-07 07:30:20 +00007874 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
7875 if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface) &&
7876 oi->params->passive_interface == OSPF_IF_PASSIVE)
7877 vty_out (vty, " passive-interface %s %s%s",
7878 oi->ifp->name,
7879 inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007880
7881 /* Network area print. */
paul68980082003-03-25 05:07:42 +00007882 config_write_network_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007883
7884 /* Area config print. */
paul68980082003-03-25 05:07:42 +00007885 config_write_ospf_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007886
7887 /* static neighbor print. */
paul68980082003-03-25 05:07:42 +00007888 config_write_ospf_nbr_nbma (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007889
7890 /* Virtual-Link print. */
paul68980082003-03-25 05:07:42 +00007891 config_write_virtual_link (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007892
7893 /* Default metric configuration. */
paul68980082003-03-25 05:07:42 +00007894 config_write_ospf_default_metric (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007895
7896 /* Distribute-list and default-information print. */
paul68980082003-03-25 05:07:42 +00007897 config_write_ospf_distribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007898
7899 /* Distance configuration. */
paul68980082003-03-25 05:07:42 +00007900 config_write_ospf_distance (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007901
7902#ifdef HAVE_OPAQUE_LSA
paul68980082003-03-25 05:07:42 +00007903 ospf_opaque_config_write_router (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007904#endif /* HAVE_OPAQUE_LSA */
7905 }
7906
7907 return write;
7908}
7909
7910void
paul4dadc292005-05-06 21:37:42 +00007911ospf_vty_show_init (void)
paul718e3742002-12-13 20:15:29 +00007912{
7913 /* "show ip ospf" commands. */
7914 install_element (VIEW_NODE, &show_ip_ospf_cmd);
7915 install_element (ENABLE_NODE, &show_ip_ospf_cmd);
7916
7917 /* "show ip ospf database" commands. */
7918 install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
7919 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
7920 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
7921 install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
7922 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
7923 install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
7924 install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
7925 install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
7926 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
7927 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
7928 install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
7929 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
7930 install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
7931 install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
7932
7933 /* "show ip ospf interface" commands. */
7934 install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
7935 install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
7936
7937 /* "show ip ospf neighbor" commands. */
7938 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
7939 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
7940 install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
7941 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
7942 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
7943 install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
7944 install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
7945 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
7946 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
7947 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
7948 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
7949 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
7950 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
7951 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
7952
7953 /* "show ip ospf route" commands. */
7954 install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
7955 install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
paul718e3742002-12-13 20:15:29 +00007956 install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
7957 install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
paul718e3742002-12-13 20:15:29 +00007958}
7959
7960
7961/* ospfd's interface node. */
7962struct cmd_node interface_node =
7963{
7964 INTERFACE_NODE,
7965 "%s(config-if)# ",
7966 1
7967};
7968
7969/* Initialization of OSPF interface. */
paul4dadc292005-05-06 21:37:42 +00007970static void
7971ospf_vty_if_init (void)
paul718e3742002-12-13 20:15:29 +00007972{
7973 /* Install interface node. */
7974 install_node (&interface_node, config_write_interface);
7975
7976 install_element (CONFIG_NODE, &interface_cmd);
paul32d24632003-05-23 09:25:20 +00007977 install_element (CONFIG_NODE, &no_interface_cmd);
paul718e3742002-12-13 20:15:29 +00007978 install_default (INTERFACE_NODE);
7979
7980 /* "description" commands. */
7981 install_element (INTERFACE_NODE, &interface_desc_cmd);
7982 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
7983
7984 /* "ip ospf authentication" commands. */
7985 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
7986 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
7987 install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
7988 install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
7989 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
7990 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
7991 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
7992 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
7993 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
7994 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
7995
7996 /* "ip ospf message-digest-key" commands. */
7997 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
7998 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
7999 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
8000 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
8001
8002 /* "ip ospf cost" commands. */
8003 install_element (INTERFACE_NODE, &ip_ospf_cost_addr_cmd);
8004 install_element (INTERFACE_NODE, &ip_ospf_cost_cmd);
8005 install_element (INTERFACE_NODE, &no_ip_ospf_cost_addr_cmd);
8006 install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
8007
vincentba682532005-09-29 13:52:57 +00008008 /* "ip ospf mtu-ignore" commands. */
8009 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
8010 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
8011 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
8012 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
8013
paul718e3742002-12-13 20:15:29 +00008014 /* "ip ospf dead-interval" commands. */
8015 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
8016 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008017 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
8018 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
paul718e3742002-12-13 20:15:29 +00008019 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
8020 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008021
paul718e3742002-12-13 20:15:29 +00008022 /* "ip ospf hello-interval" commands. */
8023 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
8024 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
8025 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
8026 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
8027
8028 /* "ip ospf network" commands. */
8029 install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
8030 install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
8031
8032 /* "ip ospf priority" commands. */
8033 install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
8034 install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
8035 install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
8036 install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
8037
8038 /* "ip ospf retransmit-interval" commands. */
8039 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
8040 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
8041 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
8042 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
8043
8044 /* "ip ospf transmit-delay" commands. */
8045 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
8046 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
8047 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
8048 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
8049
8050 /* These commands are compatibitliy for previous version. */
8051 install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
8052 install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
8053 install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
8054 install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
8055 install_element (INTERFACE_NODE, &ospf_cost_cmd);
8056 install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
8057 install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
8058 install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
8059 install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
8060 install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
8061 install_element (INTERFACE_NODE, &ospf_network_cmd);
8062 install_element (INTERFACE_NODE, &no_ospf_network_cmd);
8063 install_element (INTERFACE_NODE, &ospf_priority_cmd);
8064 install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
8065 install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
8066 install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
8067 install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
8068 install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
8069}
8070
8071/* Zebra node structure. */
8072struct cmd_node zebra_node =
8073{
8074 ZEBRA_NODE,
8075 "%s(config-router)#",
8076};
8077
paul4dadc292005-05-06 21:37:42 +00008078static void
8079ospf_vty_zebra_init (void)
paul718e3742002-12-13 20:15:29 +00008080{
8081 install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
8082 install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
8083 install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
8084 install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
8085 install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
8086 install_element (OSPF_NODE,
8087 &ospf_redistribute_source_metric_type_routemap_cmd);
8088 install_element (OSPF_NODE,
8089 &ospf_redistribute_source_type_metric_routemap_cmd);
8090 install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
8091 install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
8092 install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
8093
8094 install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
8095
8096 install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
8097 install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
8098
8099 install_element (OSPF_NODE,
8100 &ospf_default_information_originate_metric_type_cmd);
8101 install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
8102 install_element (OSPF_NODE,
8103 &ospf_default_information_originate_type_metric_cmd);
8104 install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
8105 install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
8106 install_element (OSPF_NODE,
8107 &ospf_default_information_originate_always_metric_type_cmd);
8108 install_element (OSPF_NODE,
8109 &ospf_default_information_originate_always_metric_cmd);
8110 install_element (OSPF_NODE,
8111 &ospf_default_information_originate_always_cmd);
8112 install_element (OSPF_NODE,
8113 &ospf_default_information_originate_always_type_metric_cmd);
8114 install_element (OSPF_NODE,
8115 &ospf_default_information_originate_always_type_cmd);
8116
8117 install_element (OSPF_NODE,
8118 &ospf_default_information_originate_metric_type_routemap_cmd);
8119 install_element (OSPF_NODE,
8120 &ospf_default_information_originate_metric_routemap_cmd);
8121 install_element (OSPF_NODE,
8122 &ospf_default_information_originate_routemap_cmd);
8123 install_element (OSPF_NODE,
8124 &ospf_default_information_originate_type_metric_routemap_cmd);
8125 install_element (OSPF_NODE,
8126 &ospf_default_information_originate_type_routemap_cmd);
8127 install_element (OSPF_NODE,
8128 &ospf_default_information_originate_always_metric_type_routemap_cmd);
8129 install_element (OSPF_NODE,
8130 &ospf_default_information_originate_always_metric_routemap_cmd);
8131 install_element (OSPF_NODE,
8132 &ospf_default_information_originate_always_routemap_cmd);
8133 install_element (OSPF_NODE,
8134 &ospf_default_information_originate_always_type_metric_routemap_cmd);
8135 install_element (OSPF_NODE,
8136 &ospf_default_information_originate_always_type_routemap_cmd);
8137
8138 install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
8139
8140 install_element (OSPF_NODE, &ospf_default_metric_cmd);
8141 install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
8142 install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
8143
8144 install_element (OSPF_NODE, &ospf_distance_cmd);
8145 install_element (OSPF_NODE, &no_ospf_distance_cmd);
8146 install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
8147 install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
8148 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
8149 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
8150 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
8151 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
8152 install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
8153 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
8154 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
8155 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
8156 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
8157 install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
8158 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
8159 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
8160 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
8161 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
8162#if 0
8163 install_element (OSPF_NODE, &ospf_distance_source_cmd);
8164 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
8165 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
8166 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
8167#endif /* 0 */
8168}
8169
8170struct cmd_node ospf_node =
8171{
8172 OSPF_NODE,
8173 "%s(config-router)# ",
8174 1
8175};
8176
8177
8178/* Install OSPF related vty commands. */
8179void
paul4dadc292005-05-06 21:37:42 +00008180ospf_vty_init (void)
paul718e3742002-12-13 20:15:29 +00008181{
8182 /* Install ospf top node. */
8183 install_node (&ospf_node, ospf_config_write);
8184
8185 /* "router ospf" commands. */
8186 install_element (CONFIG_NODE, &router_ospf_cmd);
8187 install_element (CONFIG_NODE, &no_router_ospf_cmd);
8188
8189 install_default (OSPF_NODE);
8190
8191 /* "ospf router-id" commands. */
8192 install_element (OSPF_NODE, &ospf_router_id_cmd);
8193 install_element (OSPF_NODE, &no_ospf_router_id_cmd);
paula2c62832003-04-23 17:01:31 +00008194 install_element (OSPF_NODE, &router_ospf_id_cmd);
8195 install_element (OSPF_NODE, &no_router_ospf_id_cmd);
paul718e3742002-12-13 20:15:29 +00008196
8197 /* "passive-interface" commands. */
paula2c62832003-04-23 17:01:31 +00008198 install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
8199 install_element (OSPF_NODE, &ospf_passive_interface_cmd);
8200 install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
8201 install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
paul718e3742002-12-13 20:15:29 +00008202
8203 /* "ospf abr-type" commands. */
8204 install_element (OSPF_NODE, &ospf_abr_type_cmd);
8205 install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
8206
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00008207 /* "ospf log-adjacency-changes" commands. */
8208 install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
8209 install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
8210 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
8211 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
8212
paul718e3742002-12-13 20:15:29 +00008213 /* "ospf rfc1583-compatible" commands. */
8214 install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
8215 install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
8216 install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
8217 install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
8218
8219 /* "network area" commands. */
paula2c62832003-04-23 17:01:31 +00008220 install_element (OSPF_NODE, &ospf_network_area_cmd);
8221 install_element (OSPF_NODE, &no_ospf_network_area_cmd);
paul718e3742002-12-13 20:15:29 +00008222
8223 /* "area authentication" commands. */
paula2c62832003-04-23 17:01:31 +00008224 install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
8225 install_element (OSPF_NODE, &ospf_area_authentication_cmd);
8226 install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
paul718e3742002-12-13 20:15:29 +00008227
8228 /* "area range" commands. */
paula2c62832003-04-23 17:01:31 +00008229 install_element (OSPF_NODE, &ospf_area_range_cmd);
8230 install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
8231 install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
8232 install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
8233 install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
8234 install_element (OSPF_NODE, &no_ospf_area_range_cmd);
8235 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
8236 install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
8237 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
8238 install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
8239 install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
paul718e3742002-12-13 20:15:29 +00008240
8241 /* "area virtual-link" commands. */
paula2c62832003-04-23 17:01:31 +00008242 install_element (OSPF_NODE, &ospf_area_vlink_cmd);
8243 install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
paul718e3742002-12-13 20:15:29 +00008244
paula2c62832003-04-23 17:01:31 +00008245 install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
8246 install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
paul718e3742002-12-13 20:15:29 +00008247
paula2c62832003-04-23 17:01:31 +00008248 install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
8249 install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
paul718e3742002-12-13 20:15:29 +00008250
paula2c62832003-04-23 17:01:31 +00008251 install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
8252 install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
paul718e3742002-12-13 20:15:29 +00008253
paula2c62832003-04-23 17:01:31 +00008254 install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
8255 install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
paul718e3742002-12-13 20:15:29 +00008256
paula2c62832003-04-23 17:01:31 +00008257 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
8258 install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
8259 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
paul718e3742002-12-13 20:15:29 +00008260
paula2c62832003-04-23 17:01:31 +00008261 install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
8262 install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008263
paula2c62832003-04-23 17:01:31 +00008264 install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
8265 install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008266
paula2c62832003-04-23 17:01:31 +00008267 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
8268 install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
8269 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008270
paula2c62832003-04-23 17:01:31 +00008271 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
8272 install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
8273 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008274
8275 /* "area stub" commands. */
paula2c62832003-04-23 17:01:31 +00008276 install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
8277 install_element (OSPF_NODE, &ospf_area_stub_cmd);
8278 install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
8279 install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
paul718e3742002-12-13 20:15:29 +00008280
paul718e3742002-12-13 20:15:29 +00008281 /* "area nssa" commands. */
paula2c62832003-04-23 17:01:31 +00008282 install_element (OSPF_NODE, &ospf_area_nssa_cmd);
8283 install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
8284 install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
8285 install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
8286 install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
8287 install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
paul718e3742002-12-13 20:15:29 +00008288
paula2c62832003-04-23 17:01:31 +00008289 install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
8290 install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
paul718e3742002-12-13 20:15:29 +00008291
paula2c62832003-04-23 17:01:31 +00008292 install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
8293 install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
paul718e3742002-12-13 20:15:29 +00008294
paula2c62832003-04-23 17:01:31 +00008295 install_element (OSPF_NODE, &ospf_area_export_list_cmd);
8296 install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
paul718e3742002-12-13 20:15:29 +00008297
paula2c62832003-04-23 17:01:31 +00008298 install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
8299 install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
paul718e3742002-12-13 20:15:29 +00008300
paula2c62832003-04-23 17:01:31 +00008301 install_element (OSPF_NODE, &ospf_area_import_list_cmd);
8302 install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
paul88d6cf32005-10-29 12:50:09 +00008303
8304 /* SPF timer commands */
paula2c62832003-04-23 17:01:31 +00008305 install_element (OSPF_NODE, &ospf_timers_spf_cmd);
8306 install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
pauld24f6e22005-10-21 09:23:12 +00008307 install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
8308 install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
8309
paul88d6cf32005-10-29 12:50:09 +00008310 /* refresh timer commands */
paula2c62832003-04-23 17:01:31 +00008311 install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
8312 install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
8313 install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
paul718e3742002-12-13 20:15:29 +00008314
paul88d6cf32005-10-29 12:50:09 +00008315 /* max-metric commands */
8316 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
8317 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
8318 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
8319 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
8320 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
8321 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
8322
8323 /* reference bandwidth commands */
paula2c62832003-04-23 17:01:31 +00008324 install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
8325 install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
paul718e3742002-12-13 20:15:29 +00008326
8327 /* "neighbor" commands. */
paula2c62832003-04-23 17:01:31 +00008328 install_element (OSPF_NODE, &ospf_neighbor_cmd);
8329 install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
8330 install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
8331 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
8332 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
8333 install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
8334 install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
8335 install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
paul718e3742002-12-13 20:15:29 +00008336
8337 /* Init interface related vty commands. */
8338 ospf_vty_if_init ();
8339
8340 /* Init zebra related vty commands. */
8341 ospf_vty_zebra_init ();
8342}