blob: a7238270d376184fcbc03cd53bd2b98e2ef8e99f [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* OSPF VTY interface.
vincentba682532005-09-29 13:52:57 +00002 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
paul718e3742002-12-13 20:15:29 +00003 * Copyright (C) 2000 Toshiaki Takada
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23#include <zebra.h>
24
25#include "memory.h"
26#include "thread.h"
27#include "prefix.h"
28#include "table.h"
29#include "vty.h"
30#include "command.h"
31#include "plist.h"
32#include "log.h"
33#include "zclient.h"
34
35#include "ospfd/ospfd.h"
36#include "ospfd/ospf_asbr.h"
37#include "ospfd/ospf_lsa.h"
38#include "ospfd/ospf_lsdb.h"
39#include "ospfd/ospf_ism.h"
40#include "ospfd/ospf_interface.h"
41#include "ospfd/ospf_nsm.h"
42#include "ospfd/ospf_neighbor.h"
43#include "ospfd/ospf_flood.h"
44#include "ospfd/ospf_abr.h"
45#include "ospfd/ospf_spf.h"
46#include "ospfd/ospf_route.h"
47#include "ospfd/ospf_zebra.h"
48/*#include "ospfd/ospf_routemap.h" */
49#include "ospfd/ospf_vty.h"
50#include "ospfd/ospf_dump.h"
51
52
Paul Jakma30a22312008-08-15 14:05:22 +010053static const char *ospf_network_type_str[] =
paul718e3742002-12-13 20:15:29 +000054{
55 "Null",
56 "POINTOPOINT",
57 "BROADCAST",
58 "NBMA",
59 "POINTOMULTIPOINT",
60 "VIRTUALLINK",
61 "LOOPBACK"
62};
63
64
65/* Utility functions. */
paul4dadc292005-05-06 21:37:42 +000066static int
paul6c835672004-10-11 11:00:30 +000067ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
paul718e3742002-12-13 20:15:29 +000068{
69 char *endptr = NULL;
70 unsigned long ret;
71
72 /* match "A.B.C.D". */
73 if (strchr (str, '.') != NULL)
74 {
75 ret = inet_aton (str, area_id);
76 if (!ret)
77 return -1;
78 *format = OSPF_AREA_ID_FORMAT_ADDRESS;
79 }
80 /* match "<0-4294967295>". */
81 else
82 {
83 ret = strtoul (str, &endptr, 10);
84 if (*endptr != '\0' || (ret == ULONG_MAX && errno == ERANGE))
85 return -1;
86
87 area_id->s_addr = htonl (ret);
88 *format = OSPF_AREA_ID_FORMAT_DECIMAL;
89 }
90
91 return 0;
92}
93
94
paul4dadc292005-05-06 21:37:42 +000095static int
paul6c835672004-10-11 11:00:30 +000096str2distribute_source (const char *str, int *source)
paul718e3742002-12-13 20:15:29 +000097{
98 /* Sanity check. */
99 if (str == NULL)
100 return 0;
101
102 if (strncmp (str, "k", 1) == 0)
103 *source = ZEBRA_ROUTE_KERNEL;
104 else if (strncmp (str, "c", 1) == 0)
105 *source = ZEBRA_ROUTE_CONNECT;
106 else if (strncmp (str, "s", 1) == 0)
107 *source = ZEBRA_ROUTE_STATIC;
108 else if (strncmp (str, "r", 1) == 0)
109 *source = ZEBRA_ROUTE_RIP;
110 else if (strncmp (str, "b", 1) == 0)
111 *source = ZEBRA_ROUTE_BGP;
112 else
113 return 0;
114
115 return 1;
116}
117
paul4dadc292005-05-06 21:37:42 +0000118static int
paul6c835672004-10-11 11:00:30 +0000119str2metric (const char *str, int *metric)
paul718e3742002-12-13 20:15:29 +0000120{
121 /* Sanity check. */
122 if (str == NULL)
123 return 0;
124
125 *metric = strtol (str, NULL, 10);
126 if (*metric < 0 && *metric > 16777214)
127 {
128 /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
129 return 0;
130 }
131
132 return 1;
133}
134
paul4dadc292005-05-06 21:37:42 +0000135static int
paul6c835672004-10-11 11:00:30 +0000136str2metric_type (const char *str, int *metric_type)
paul718e3742002-12-13 20:15:29 +0000137{
138 /* Sanity check. */
139 if (str == NULL)
140 return 0;
141
142 if (strncmp (str, "1", 1) == 0)
143 *metric_type = EXTERNAL_METRIC_TYPE_1;
144 else if (strncmp (str, "2", 1) == 0)
145 *metric_type = EXTERNAL_METRIC_TYPE_2;
146 else
147 return 0;
148
149 return 1;
150}
151
152int
153ospf_oi_count (struct interface *ifp)
154{
155 struct route_node *rn;
156 int i = 0;
157
158 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
159 if (rn->info)
160 i++;
161
162 return i;
163}
164
165
166DEFUN (router_ospf,
167 router_ospf_cmd,
168 "router ospf",
169 "Enable a routing process\n"
170 "Start OSPF configuration\n")
171{
172 vty->node = OSPF_NODE;
173 vty->index = ospf_get ();
174
175 return CMD_SUCCESS;
176}
177
178DEFUN (no_router_ospf,
179 no_router_ospf_cmd,
180 "no router ospf",
181 NO_STR
182 "Enable a routing process\n"
183 "Start OSPF configuration\n")
184{
paul020709f2003-04-04 02:44:16 +0000185 struct ospf *ospf;
186
187 ospf = ospf_lookup ();
188 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +0000189 {
paul020709f2003-04-04 02:44:16 +0000190 vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +0000191 return CMD_WARNING;
192 }
193
paul020709f2003-04-04 02:44:16 +0000194 ospf_finish (ospf);
paul718e3742002-12-13 20:15:29 +0000195
196 return CMD_SUCCESS;
197}
198
199DEFUN (ospf_router_id,
200 ospf_router_id_cmd,
201 "ospf router-id A.B.C.D",
202 "OSPF specific commands\n"
203 "router-id for the OSPF process\n"
204 "OSPF router-id in IP address format\n")
205{
paul68980082003-03-25 05:07:42 +0000206 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000207 struct in_addr router_id;
paul68980082003-03-25 05:07:42 +0000208 int ret;
paul718e3742002-12-13 20:15:29 +0000209
210 ret = inet_aton (argv[0], &router_id);
211 if (!ret)
212 {
213 vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
214 return CMD_WARNING;
215 }
216
paul68980082003-03-25 05:07:42 +0000217 ospf->router_id_static = router_id;
paulb29800a2005-11-20 14:50:45 +0000218
219 ospf_router_id_update (ospf);
220
paul718e3742002-12-13 20:15:29 +0000221 return CMD_SUCCESS;
222}
223
224ALIAS (ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000225 router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000226 "router-id A.B.C.D",
227 "router-id for the OSPF process\n"
228 "OSPF router-id in IP address format\n")
229
230DEFUN (no_ospf_router_id,
231 no_ospf_router_id_cmd,
232 "no ospf router-id",
233 NO_STR
234 "OSPF specific commands\n"
235 "router-id for the OSPF process\n")
236{
paul68980082003-03-25 05:07:42 +0000237 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000238
paul68980082003-03-25 05:07:42 +0000239 ospf->router_id_static.s_addr = 0;
240
241 ospf_router_id_update (ospf);
paul718e3742002-12-13 20:15:29 +0000242
243 return CMD_SUCCESS;
244}
245
246ALIAS (no_ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000247 no_router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000248 "no router-id",
249 NO_STR
250 "router-id for the OSPF process\n")
251
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000252static void
Andrew J. Schorr43540882006-11-28 16:36:39 +0000253ospf_passive_interface_default (struct ospf *ospf, u_char newval)
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000254{
255 struct listnode *ln;
256 struct interface *ifp;
257 struct ospf_interface *oi;
258
Andrew J. Schorr43540882006-11-28 16:36:39 +0000259 ospf->passive_interface_default = newval;
260
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000261 for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
262 {
263 if (ifp &&
264 OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
265 UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
266 }
267 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
268 {
269 if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
270 UNSET_IF_PARAM (oi->params, passive_interface);
Andrew J. Schorr43540882006-11-28 16:36:39 +0000271 /* update multicast memberships */
272 ospf_if_set_multicast(oi);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000273 }
274}
275
276static void
277ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
278 struct in_addr addr,
279 struct ospf_if_params *params, u_char value)
280{
281 u_char dflt;
282
283 params->passive_interface = value;
284 if (params != IF_DEF_PARAMS (ifp))
285 {
286 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
287 dflt = IF_DEF_PARAMS (ifp)->passive_interface;
288 else
289 dflt = ospf->passive_interface_default;
290
291 if (value != dflt)
292 SET_IF_PARAM (params, passive_interface);
293 else
294 UNSET_IF_PARAM (params, passive_interface);
295
296 ospf_free_if_params (ifp, addr);
297 ospf_if_update_params (ifp, addr);
298 }
299 else
300 {
301 if (value != ospf->passive_interface_default)
302 SET_IF_PARAM (params, passive_interface);
303 else
304 UNSET_IF_PARAM (params, passive_interface);
305 }
306}
307
paula2c62832003-04-23 17:01:31 +0000308DEFUN (ospf_passive_interface,
309 ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000310 "passive-interface IFNAME A.B.C.D",
311 "Suppress routing updates on an interface\n"
312 "Interface's name\n")
313{
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000314 struct interface *ifp;
315 struct in_addr addr;
316 int ret;
317 struct ospf_if_params *params;
318 struct route_node *rn;
319 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000320
Andrew J. Schorr43540882006-11-28 16:36:39 +0000321 if (argc == 0)
322 {
323 ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
324 return CMD_SUCCESS;
325 }
326
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000327 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000328
329 params = IF_DEF_PARAMS (ifp);
330
Andrew J. Schorr43540882006-11-28 16:36:39 +0000331 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000332 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000333 ret = inet_aton(argv[1], &addr);
334 if (!ret)
335 {
336 vty_out (vty, "Please specify interface address by A.B.C.D%s",
337 VTY_NEWLINE);
338 return CMD_WARNING;
339 }
paul718e3742002-12-13 20:15:29 +0000340
Andrew J. Schorr43540882006-11-28 16:36:39 +0000341 params = ospf_get_if_params (ifp, addr);
342 ospf_if_update_params (ifp, addr);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000343 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000344 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
345
ajsba6454e2005-02-08 15:37:30 +0000346 /* XXX We should call ospf_if_set_multicast on exactly those
347 * interfaces for which the passive property changed. It is too much
348 * work to determine this set, so we do this for every interface.
349 * This is safe and reasonable because ospf_if_set_multicast uses a
350 * record of joined groups to avoid systems calls if the desired
351 * memberships match the current memership.
352 */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000353
ajsba6454e2005-02-08 15:37:30 +0000354 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
355 {
356 struct ospf_interface *oi = rn->info;
357
358 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
Andrew J. Schorr43540882006-11-28 16:36:39 +0000359 ospf_if_set_multicast(oi);
ajsba6454e2005-02-08 15:37:30 +0000360 }
361 /*
362 * XXX It is not clear what state transitions the interface needs to
363 * undergo when going from active to passive. Fixing this will
364 * require precise identification of interfaces having such a
365 * transition.
366 */
367
paul718e3742002-12-13 20:15:29 +0000368 return CMD_SUCCESS;
369}
370
paula2c62832003-04-23 17:01:31 +0000371ALIAS (ospf_passive_interface,
372 ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000373 "passive-interface IFNAME",
374 "Suppress routing updates on an interface\n"
375 "Interface's name\n")
376
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000377ALIAS (ospf_passive_interface,
378 ospf_passive_interface_default_cmd,
379 "passive-interface default",
380 "Suppress routing updates on an interface\n"
381 "Suppress routing updates on interfaces by default\n")
382
paula2c62832003-04-23 17:01:31 +0000383DEFUN (no_ospf_passive_interface,
384 no_ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000385 "no passive-interface IFNAME A.B.C.D",
386 NO_STR
387 "Allow routing updates on an interface\n"
388 "Interface's name\n")
389{
390 struct interface *ifp;
391 struct in_addr addr;
392 struct ospf_if_params *params;
393 int ret;
ajsba6454e2005-02-08 15:37:30 +0000394 struct route_node *rn;
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000395 struct ospf *ospf = vty->index;
Andrew J. Schorr43540882006-11-28 16:36:39 +0000396
397 if (argc == 0)
398 {
399 ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
400 return CMD_SUCCESS;
401 }
paul718e3742002-12-13 20:15:29 +0000402
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000403 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000404
405 params = IF_DEF_PARAMS (ifp);
406
Andrew J. Schorr43540882006-11-28 16:36:39 +0000407 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000408 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000409 ret = inet_aton(argv[1], &addr);
410 if (!ret)
411 {
412 vty_out (vty, "Please specify interface address by A.B.C.D%s",
413 VTY_NEWLINE);
414 return CMD_WARNING;
415 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000416
Andrew J. Schorr43540882006-11-28 16:36:39 +0000417 params = ospf_lookup_if_params (ifp, addr);
418 if (params == NULL)
419 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000420 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000421 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
ajsba6454e2005-02-08 15:37:30 +0000422
423 /* XXX We should call ospf_if_set_multicast on exactly those
424 * interfaces for which the passive property changed. It is too much
425 * work to determine this set, so we do this for every interface.
426 * This is safe and reasonable because ospf_if_set_multicast uses a
427 * record of joined groups to avoid systems calls if the desired
428 * memberships match the current memership.
429 */
430 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
431 {
432 struct ospf_interface *oi = rn->info;
433
434 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
435 ospf_if_set_multicast(oi);
436 }
437
paul718e3742002-12-13 20:15:29 +0000438 return CMD_SUCCESS;
439}
440
paula2c62832003-04-23 17:01:31 +0000441ALIAS (no_ospf_passive_interface,
442 no_ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000443 "no passive-interface IFNAME",
444 NO_STR
445 "Allow routing updates on an interface\n"
446 "Interface's name\n")
447
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000448ALIAS (no_ospf_passive_interface,
449 no_ospf_passive_interface_default_cmd,
450 "no passive-interface default",
451 NO_STR
452 "Allow routing updates on an interface\n"
453 "Allow routing updates on interfaces by default\n")
454
paula2c62832003-04-23 17:01:31 +0000455DEFUN (ospf_network_area,
456 ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000457 "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
458 "Enable routing on an IP network\n"
459 "OSPF network prefix\n"
460 "Set the OSPF area ID\n"
461 "OSPF area ID in IP address format\n"
462 "OSPF area ID as a decimal value\n")
463{
464 struct ospf *ospf= vty->index;
465 struct prefix_ipv4 p;
466 struct in_addr area_id;
467 int ret, format;
468
469 /* Get network prefix and Area ID. */
470 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
471 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
472
473 ret = ospf_network_set (ospf, &p, area_id);
474 if (ret == 0)
475 {
476 vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
477 return CMD_WARNING;
478 }
479
480 return CMD_SUCCESS;
481}
482
paula2c62832003-04-23 17:01:31 +0000483DEFUN (no_ospf_network_area,
484 no_ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000485 "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
486 NO_STR
487 "Enable routing on an IP network\n"
488 "OSPF network prefix\n"
489 "Set the OSPF area ID\n"
490 "OSPF area ID in IP address format\n"
491 "OSPF area ID as a decimal value\n")
492{
493 struct ospf *ospf = (struct ospf *) vty->index;
494 struct prefix_ipv4 p;
495 struct in_addr area_id;
496 int ret, format;
497
498 /* Get network prefix and Area ID. */
499 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
500 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
501
502 ret = ospf_network_unset (ospf, &p, area_id);
503 if (ret == 0)
504 {
505 vty_out (vty, "Can't find specified network area configuration.%s",
506 VTY_NEWLINE);
507 return CMD_WARNING;
508 }
509
510 return CMD_SUCCESS;
511}
512
513
paula2c62832003-04-23 17:01:31 +0000514DEFUN (ospf_area_range,
515 ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000516 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
517 "OSPF area parameters\n"
518 "OSPF area ID in IP address format\n"
519 "OSPF area ID as a decimal value\n"
520 "Summarize routes matching address/mask (border routers only)\n"
521 "Area range prefix\n")
522{
523 struct ospf *ospf = vty->index;
524 struct prefix_ipv4 p;
525 struct in_addr area_id;
526 int format;
527 u_int32_t cost;
528
529 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
530 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
531
532 ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
533 if (argc > 2)
534 {
paul4dadc292005-05-06 21:37:42 +0000535 VTY_GET_INTEGER ("range cost", cost, argv[2]);
paul718e3742002-12-13 20:15:29 +0000536 ospf_area_range_cost_set (ospf, area_id, &p, cost);
537 }
538
539 return CMD_SUCCESS;
540}
541
paula2c62832003-04-23 17:01:31 +0000542ALIAS (ospf_area_range,
543 ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000544 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
545 "OSPF area parameters\n"
546 "OSPF area ID in IP address format\n"
547 "OSPF area ID as a decimal value\n"
548 "OSPF area range for route advertise (default)\n"
549 "Area range prefix\n"
550 "Advertise this range (default)\n")
551
paula2c62832003-04-23 17:01:31 +0000552ALIAS (ospf_area_range,
553 ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000554 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
555 "OSPF area parameters\n"
556 "OSPF area ID in IP address format\n"
557 "OSPF area ID as a decimal value\n"
558 "Summarize routes matching address/mask (border routers only)\n"
559 "Area range prefix\n"
560 "User specified metric for this range\n"
561 "Advertised metric for this range\n")
562
paula2c62832003-04-23 17:01:31 +0000563ALIAS (ospf_area_range,
564 ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000565 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
566 "OSPF area parameters\n"
567 "OSPF area ID in IP address format\n"
568 "OSPF area ID as a decimal value\n"
569 "Summarize routes matching address/mask (border routers only)\n"
570 "Area range prefix\n"
571 "Advertise this range (default)\n"
572 "User specified metric for this range\n"
573 "Advertised metric for this range\n")
574
paula2c62832003-04-23 17:01:31 +0000575DEFUN (ospf_area_range_not_advertise,
576 ospf_area_range_not_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000577 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
578 "OSPF area parameters\n"
579 "OSPF area ID in IP address format\n"
580 "OSPF area ID as a decimal value\n"
581 "Summarize routes matching address/mask (border routers only)\n"
582 "Area range prefix\n"
583 "DoNotAdvertise this range\n")
584{
585 struct ospf *ospf = vty->index;
586 struct prefix_ipv4 p;
587 struct in_addr area_id;
588 int format;
589
590 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
591 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
592
593 ospf_area_range_set (ospf, area_id, &p, 0);
594
595 return CMD_SUCCESS;
596}
597
paula2c62832003-04-23 17:01:31 +0000598DEFUN (no_ospf_area_range,
599 no_ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000600 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
601 NO_STR
602 "OSPF area parameters\n"
603 "OSPF area ID in IP address format\n"
604 "OSPF area ID as a decimal value\n"
605 "Summarize routes matching address/mask (border routers only)\n"
606 "Area range prefix\n")
607{
608 struct ospf *ospf = vty->index;
609 struct prefix_ipv4 p;
610 struct in_addr area_id;
611 int format;
612
613 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
614 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
615
616 ospf_area_range_unset (ospf, area_id, &p);
617
618 return CMD_SUCCESS;
619}
620
paula2c62832003-04-23 17:01:31 +0000621ALIAS (no_ospf_area_range,
622 no_ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000623 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
624 NO_STR
625 "OSPF area parameters\n"
626 "OSPF area ID in IP address format\n"
627 "OSPF area ID as a decimal value\n"
628 "Summarize routes matching address/mask (border routers only)\n"
629 "Area range prefix\n"
630 "Advertise this range (default)\n"
631 "DoNotAdvertise this range\n")
632
paula2c62832003-04-23 17:01:31 +0000633ALIAS (no_ospf_area_range,
634 no_ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000635 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
636 NO_STR
637 "OSPF area parameters\n"
638 "OSPF area ID in IP address format\n"
639 "OSPF area ID as a decimal value\n"
640 "Summarize routes matching address/mask (border routers only)\n"
641 "Area range prefix\n"
642 "User specified metric for this range\n"
643 "Advertised metric for this range\n")
644
paula2c62832003-04-23 17:01:31 +0000645ALIAS (no_ospf_area_range,
646 no_ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000647 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
648 NO_STR
649 "OSPF area parameters\n"
650 "OSPF area ID in IP address format\n"
651 "OSPF area ID as a decimal value\n"
652 "Summarize routes matching address/mask (border routers only)\n"
653 "Area range prefix\n"
654 "Advertise this range (default)\n"
655 "User specified metric for this range\n"
656 "Advertised metric for this range\n")
657
paula2c62832003-04-23 17:01:31 +0000658DEFUN (ospf_area_range_substitute,
659 ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000660 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
661 "OSPF area parameters\n"
662 "OSPF area ID in IP address format\n"
663 "OSPF area ID as a decimal value\n"
664 "Summarize routes matching address/mask (border routers only)\n"
665 "Area range prefix\n"
666 "Announce area range as another prefix\n"
667 "Network prefix to be announced instead of range\n")
668{
669 struct ospf *ospf = vty->index;
670 struct prefix_ipv4 p, s;
671 struct in_addr area_id;
672 int format;
673
674 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
675 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
676 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
677
678 ospf_area_range_substitute_set (ospf, area_id, &p, &s);
679
680 return CMD_SUCCESS;
681}
682
paula2c62832003-04-23 17:01:31 +0000683DEFUN (no_ospf_area_range_substitute,
684 no_ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000685 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
686 NO_STR
687 "OSPF area parameters\n"
688 "OSPF area ID in IP address format\n"
689 "OSPF area ID as a decimal value\n"
690 "Summarize routes matching address/mask (border routers only)\n"
691 "Area range prefix\n"
692 "Announce area range as another prefix\n"
693 "Network prefix to be announced instead of range\n")
694{
695 struct ospf *ospf = vty->index;
696 struct prefix_ipv4 p, s;
697 struct in_addr area_id;
698 int format;
699
700 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
701 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
702 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
703
704 ospf_area_range_substitute_unset (ospf, area_id, &p);
705
706 return CMD_SUCCESS;
707}
708
709
710/* Command Handler Logic in VLink stuff is delicate!!
711
712 ALTER AT YOUR OWN RISK!!!!
713
714 Various dummy values are used to represent 'NoChange' state for
715 VLink configuration NOT being changed by a VLink command, and
716 special syntax is used within the command strings so that the
717 typed in command verbs can be seen in the configuration command
718 bacckend handler. This is to drastically reduce the verbeage
719 required to coe up with a reasonably compatible Cisco VLink command
720
721 - Matthew Grant <grantma@anathoth.gen.nz>
722 Wed, 21 Feb 2001 15:13:52 +1300
723 */
724
725
726/* Configuration data for virtual links
727 */
728struct ospf_vl_config_data {
729 struct vty *vty; /* vty stuff */
730 struct in_addr area_id; /* area ID from command line */
731 int format; /* command line area ID format */
732 struct in_addr vl_peer; /* command line vl_peer */
733 int auth_type; /* Authehntication type, if given */
734 char *auth_key; /* simple password if present */
735 int crypto_key_id; /* Cryptographic key ID */
736 char *md5_key; /* MD5 authentication key */
737 int hello_interval; /* Obvious what these are... */
738 int retransmit_interval;
739 int transmit_delay;
740 int dead_interval;
741};
742
paul4dadc292005-05-06 21:37:42 +0000743static void
paul718e3742002-12-13 20:15:29 +0000744ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
745 struct vty *vty)
746{
747 memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
748 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
749 vl_config->vty = vty;
750}
751
paul4dadc292005-05-06 21:37:42 +0000752static struct ospf_vl_data *
paul68980082003-03-25 05:07:42 +0000753ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000754{
755 struct ospf_area *area;
756 struct ospf_vl_data *vl_data;
757 struct vty *vty;
758 struct in_addr area_id;
759
760 vty = vl_config->vty;
761 area_id = vl_config->area_id;
762
763 if (area_id.s_addr == OSPF_AREA_BACKBONE)
764 {
765 vty_out (vty,
766 "Configuring VLs over the backbone is not allowed%s",
767 VTY_NEWLINE);
768 return NULL;
769 }
paul68980082003-03-25 05:07:42 +0000770 area = ospf_area_get (ospf, area_id, vl_config->format);
paul718e3742002-12-13 20:15:29 +0000771
772 if (area->external_routing != OSPF_AREA_DEFAULT)
773 {
774 if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
775 vty_out (vty, "Area %s is %s%s",
776 inet_ntoa (area_id),
paul718e3742002-12-13 20:15:29 +0000777 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000778 VTY_NEWLINE);
779 else
780 vty_out (vty, "Area %ld is %s%s",
781 (u_long)ntohl (area_id.s_addr),
paul718e3742002-12-13 20:15:29 +0000782 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000783 VTY_NEWLINE);
784 return NULL;
785 }
786
Paul Jakma9c27ef92006-05-04 07:32:57 +0000787 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
paul718e3742002-12-13 20:15:29 +0000788 {
789 vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
790 if (vl_data->vl_oi == NULL)
791 {
paul68980082003-03-25 05:07:42 +0000792 vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
793 ospf_vl_add (ospf, vl_data);
794 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +0000795 }
796 }
797 return vl_data;
798}
799
800
paul4dadc292005-05-06 21:37:42 +0000801static int
paul718e3742002-12-13 20:15:29 +0000802ospf_vl_set_security (struct ospf_vl_data *vl_data,
803 struct ospf_vl_config_data *vl_config)
804{
805 struct crypt_key *ck;
806 struct vty *vty;
807 struct interface *ifp = vl_data->vl_oi->ifp;
808
809 vty = vl_config->vty;
810
811 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
812 {
813 SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
814 IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
815 }
816
817 if (vl_config->auth_key)
818 {
819 memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000820 strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
paul718e3742002-12-13 20:15:29 +0000821 OSPF_AUTH_SIMPLE_SIZE);
822 }
823 else if (vl_config->md5_key)
824 {
825 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
826 != NULL)
827 {
828 vty_out (vty, "OSPF: Key %d already exists%s",
829 vl_config->crypto_key_id, VTY_NEWLINE);
830 return CMD_WARNING;
831 }
832 ck = ospf_crypt_key_new ();
833 ck->key_id = vl_config->crypto_key_id;
834 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000835 strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +0000836
837 ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
838 }
839 else if (vl_config->crypto_key_id != 0)
840 {
841 /* Delete a key */
842
843 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
844 vl_config->crypto_key_id) == NULL)
845 {
846 vty_out (vty, "OSPF: Key %d does not exist%s",
847 vl_config->crypto_key_id, VTY_NEWLINE);
848 return CMD_WARNING;
849 }
850
851 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
852
853 }
854
855 return CMD_SUCCESS;
856}
857
paul4dadc292005-05-06 21:37:42 +0000858static int
paul718e3742002-12-13 20:15:29 +0000859ospf_vl_set_timers (struct ospf_vl_data *vl_data,
860 struct ospf_vl_config_data *vl_config)
861{
862 struct interface *ifp = ifp = vl_data->vl_oi->ifp;
863 /* Virtual Link data initialised to defaults, so only set
864 if a value given */
865 if (vl_config->hello_interval)
866 {
867 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
868 IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
869 }
870
871 if (vl_config->dead_interval)
872 {
873 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
874 IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
875 }
876
877 if (vl_config->retransmit_interval)
878 {
879 SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
880 IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
881 }
882
883 if (vl_config->transmit_delay)
884 {
885 SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
886 IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
887 }
888
889 return CMD_SUCCESS;
890}
891
892
893
894/* The business end of all of the above */
paul4dadc292005-05-06 21:37:42 +0000895static int
paul68980082003-03-25 05:07:42 +0000896ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000897{
898 struct ospf_vl_data *vl_data;
899 int ret;
900
paul68980082003-03-25 05:07:42 +0000901 vl_data = ospf_find_vl_data (ospf, vl_config);
paul718e3742002-12-13 20:15:29 +0000902 if (!vl_data)
903 return CMD_WARNING;
904
905 /* Process this one first as it can have a fatal result, which can
906 only logically occur if the virtual link exists already
907 Thus a command error does not result in a change to the
908 running configuration such as unexpectedly altered timer
909 values etc.*/
910 ret = ospf_vl_set_security (vl_data, vl_config);
911 if (ret != CMD_SUCCESS)
912 return ret;
913
914 /* Set any time based parameters, these area already range checked */
915
916 ret = ospf_vl_set_timers (vl_data, vl_config);
917 if (ret != CMD_SUCCESS)
918 return ret;
919
920 return CMD_SUCCESS;
921
922}
923
924/* This stuff exists to make specifying all the alias commands A LOT simpler
925 */
926#define VLINK_HELPSTR_IPADDR \
927 "OSPF area parameters\n" \
928 "OSPF area ID in IP address format\n" \
929 "OSPF area ID as a decimal value\n" \
930 "Configure a virtual link\n" \
931 "Router ID of the remote ABR\n"
932
933#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
934 "Enable authentication on this virtual link\n" \
935 "dummy string \n"
936
937#define VLINK_HELPSTR_AUTHTYPE_ALL \
938 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
939 "Use null authentication\n" \
940 "Use message-digest authentication\n"
941
942#define VLINK_HELPSTR_TIME_PARAM_NOSECS \
943 "Time between HELLO packets\n" \
944 "Time between retransmitting lost link state advertisements\n" \
945 "Link state transmit delay\n" \
946 "Interval after which a neighbor is declared dead\n"
947
948#define VLINK_HELPSTR_TIME_PARAM \
949 VLINK_HELPSTR_TIME_PARAM_NOSECS \
950 "Seconds\n"
951
952#define VLINK_HELPSTR_AUTH_SIMPLE \
953 "Authentication password (key)\n" \
954 "The OSPF password (key)"
955
956#define VLINK_HELPSTR_AUTH_MD5 \
957 "Message digest authentication password (key)\n" \
958 "dummy string \n" \
959 "Key ID\n" \
960 "Use MD5 algorithm\n" \
961 "The OSPF password (key)"
962
paula2c62832003-04-23 17:01:31 +0000963DEFUN (ospf_area_vlink,
964 ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +0000965 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
966 VLINK_HELPSTR_IPADDR)
967{
paul68980082003-03-25 05:07:42 +0000968 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000969 struct ospf_vl_config_data vl_config;
970 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
971 char md5_key[OSPF_AUTH_MD5_SIZE+1];
972 int i;
973 int ret;
974
975 ospf_vl_config_data_init(&vl_config, vty);
976
977 /* Read off first 2 parameters and check them */
978 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
979 if (ret < 0)
980 {
981 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
982 return CMD_WARNING;
983 }
984
985 ret = inet_aton (argv[1], &vl_config.vl_peer);
986 if (! ret)
987 {
988 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
989 VTY_NEWLINE);
990 return CMD_WARNING;
991 }
992
993 if (argc <=2)
994 {
995 /* Thats all folks! - BUGS B. strikes again!!!*/
996
paul68980082003-03-25 05:07:42 +0000997 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +0000998 }
999
1000 /* Deal with other parameters */
1001 for (i=2; i < argc; i++)
1002 {
1003
1004 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1005
1006 switch (argv[i][0])
1007 {
1008
1009 case 'a':
1010 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1011 {
1012 /* authentication-key - this option can occur anywhere on
1013 command line. At start of command line
1014 must check for authentication option. */
1015 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1016 strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
1017 vl_config.auth_key = auth_key;
1018 i++;
1019 }
1020 else if (strncmp (argv[i], "authentication", 14) == 0)
1021 {
1022 /* authentication - this option can only occur at start
1023 of command line */
1024 vl_config.auth_type = OSPF_AUTH_SIMPLE;
1025 if ((i+1) < argc)
1026 {
1027 if (strncmp (argv[i+1], "n", 1) == 0)
1028 {
1029 /* "authentication null" */
1030 vl_config.auth_type = OSPF_AUTH_NULL;
1031 i++;
1032 }
1033 else if (strncmp (argv[i+1], "m", 1) == 0
1034 && strcmp (argv[i+1], "message-digest-") != 0)
1035 {
1036 /* "authentication message-digest" */
1037 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1038 i++;
1039 }
1040 }
1041 }
1042 break;
1043
1044 case 'm':
1045 /* message-digest-key */
1046 i++;
1047 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1048 if (vl_config.crypto_key_id < 0)
1049 return CMD_WARNING;
1050 i++;
1051 memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1052 strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1053 vl_config.md5_key = md5_key;
1054 break;
1055
1056 case 'h':
1057 /* Hello interval */
1058 i++;
1059 vl_config.hello_interval = strtol (argv[i], NULL, 10);
1060 if (vl_config.hello_interval < 0)
1061 return CMD_WARNING;
1062 break;
1063
1064 case 'r':
1065 /* Retransmit Interval */
1066 i++;
1067 vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1068 if (vl_config.retransmit_interval < 0)
1069 return CMD_WARNING;
1070 break;
1071
1072 case 't':
1073 /* Transmit Delay */
1074 i++;
1075 vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1076 if (vl_config.transmit_delay < 0)
1077 return CMD_WARNING;
1078 break;
1079
1080 case 'd':
1081 /* Dead Interval */
1082 i++;
1083 vl_config.dead_interval = strtol (argv[i], NULL, 10);
1084 if (vl_config.dead_interval < 0)
1085 return CMD_WARNING;
1086 break;
1087 }
1088 }
1089
1090
1091 /* Action configuration */
1092
paul68980082003-03-25 05:07:42 +00001093 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001094
1095}
1096
paula2c62832003-04-23 17:01:31 +00001097DEFUN (no_ospf_area_vlink,
1098 no_ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +00001099 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1100 NO_STR
1101 VLINK_HELPSTR_IPADDR)
1102{
paul68980082003-03-25 05:07:42 +00001103 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001104 struct ospf_area *area;
1105 struct ospf_vl_config_data vl_config;
1106 struct ospf_vl_data *vl_data = NULL;
1107 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1108 int i;
1109 int ret, format;
1110
1111 ospf_vl_config_data_init(&vl_config, vty);
1112
1113 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1114 if (ret < 0)
1115 {
1116 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1117 return CMD_WARNING;
1118 }
1119
paul68980082003-03-25 05:07:42 +00001120 area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001121 if (!area)
1122 {
1123 vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1124 return CMD_WARNING;
1125 }
1126
1127 ret = inet_aton (argv[1], &vl_config.vl_peer);
1128 if (! ret)
1129 {
1130 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1131 VTY_NEWLINE);
1132 return CMD_WARNING;
1133 }
1134
1135 if (argc <=2)
1136 {
1137 /* Basic VLink no command */
1138 /* Thats all folks! - BUGS B. strikes again!!!*/
Paul Jakma9c27ef92006-05-04 07:32:57 +00001139 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
paul68980082003-03-25 05:07:42 +00001140 ospf_vl_delete (ospf, vl_data);
paul718e3742002-12-13 20:15:29 +00001141
paul68980082003-03-25 05:07:42 +00001142 ospf_area_check_free (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001143
1144 return CMD_SUCCESS;
1145 }
1146
1147 /* If we are down here, we are reseting parameters */
1148
1149 /* Deal with other parameters */
1150 for (i=2; i < argc; i++)
1151 {
paul718e3742002-12-13 20:15:29 +00001152 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1153
1154 switch (argv[i][0])
1155 {
1156
1157 case 'a':
1158 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1159 {
1160 /* authentication-key - this option can occur anywhere on
1161 command line. At start of command line
1162 must check for authentication option. */
1163 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1164 vl_config.auth_key = auth_key;
1165 }
1166 else if (strncmp (argv[i], "authentication", 14) == 0)
1167 {
1168 /* authentication - this option can only occur at start
1169 of command line */
1170 vl_config.auth_type = OSPF_AUTH_NOTSET;
1171 }
1172 break;
1173
1174 case 'm':
1175 /* message-digest-key */
1176 /* Delete one key */
1177 i++;
1178 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1179 if (vl_config.crypto_key_id < 0)
1180 return CMD_WARNING;
1181 vl_config.md5_key = NULL;
1182 break;
1183
1184 case 'h':
1185 /* Hello interval */
1186 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1187 break;
1188
1189 case 'r':
1190 /* Retransmit Interval */
1191 vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1192 break;
1193
1194 case 't':
1195 /* Transmit Delay */
1196 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1197 break;
1198
1199 case 'd':
1200 /* Dead Interval */
1201 i++;
1202 vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1203 break;
1204 }
1205 }
1206
1207
1208 /* Action configuration */
1209
paul68980082003-03-25 05:07:42 +00001210 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001211}
1212
paula2c62832003-04-23 17:01:31 +00001213ALIAS (ospf_area_vlink,
1214 ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001215 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1216 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1217 VLINK_HELPSTR_IPADDR
1218 VLINK_HELPSTR_TIME_PARAM)
1219
paula2c62832003-04-23 17:01:31 +00001220ALIAS (no_ospf_area_vlink,
1221 no_ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001222 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1223 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1224 NO_STR
1225 VLINK_HELPSTR_IPADDR
1226 VLINK_HELPSTR_TIME_PARAM)
1227
paula2c62832003-04-23 17:01:31 +00001228ALIAS (ospf_area_vlink,
1229 ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001230 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1231 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1232 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1233 VLINK_HELPSTR_IPADDR
1234 VLINK_HELPSTR_TIME_PARAM
1235 VLINK_HELPSTR_TIME_PARAM)
1236
paula2c62832003-04-23 17:01:31 +00001237ALIAS (no_ospf_area_vlink,
1238 no_ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001239 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1240 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1241 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1242 NO_STR
1243 VLINK_HELPSTR_IPADDR
1244 VLINK_HELPSTR_TIME_PARAM
1245 VLINK_HELPSTR_TIME_PARAM)
1246
paula2c62832003-04-23 17:01:31 +00001247ALIAS (ospf_area_vlink,
1248 ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001249 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1250 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1251 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1252 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1253 VLINK_HELPSTR_IPADDR
1254 VLINK_HELPSTR_TIME_PARAM
1255 VLINK_HELPSTR_TIME_PARAM
1256 VLINK_HELPSTR_TIME_PARAM)
1257
paula2c62832003-04-23 17:01:31 +00001258ALIAS (no_ospf_area_vlink,
1259 no_ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001260 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1261 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1262 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1263 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1264 NO_STR
1265 VLINK_HELPSTR_IPADDR
1266 VLINK_HELPSTR_TIME_PARAM
1267 VLINK_HELPSTR_TIME_PARAM
1268 VLINK_HELPSTR_TIME_PARAM)
1269
paula2c62832003-04-23 17:01:31 +00001270ALIAS (ospf_area_vlink,
1271 ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001272 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1273 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1274 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1275 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1276 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1277 VLINK_HELPSTR_IPADDR
1278 VLINK_HELPSTR_TIME_PARAM
1279 VLINK_HELPSTR_TIME_PARAM
1280 VLINK_HELPSTR_TIME_PARAM
1281 VLINK_HELPSTR_TIME_PARAM)
1282
paula2c62832003-04-23 17:01:31 +00001283ALIAS (no_ospf_area_vlink,
1284 no_ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001285 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1286 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1287 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1288 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1289 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1290 NO_STR
1291 VLINK_HELPSTR_IPADDR
1292 VLINK_HELPSTR_TIME_PARAM
1293 VLINK_HELPSTR_TIME_PARAM
1294 VLINK_HELPSTR_TIME_PARAM
1295 VLINK_HELPSTR_TIME_PARAM)
1296
paula2c62832003-04-23 17:01:31 +00001297ALIAS (ospf_area_vlink,
1298 ospf_area_vlink_authtype_args_cmd,
paul718e3742002-12-13 20:15:29 +00001299 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1300 "(authentication|) (message-digest|null)",
1301 VLINK_HELPSTR_IPADDR
1302 VLINK_HELPSTR_AUTHTYPE_ALL)
1303
paula2c62832003-04-23 17:01:31 +00001304ALIAS (ospf_area_vlink,
1305 ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001306 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1307 "(authentication|)",
1308 VLINK_HELPSTR_IPADDR
1309 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1310
paula2c62832003-04-23 17:01:31 +00001311ALIAS (no_ospf_area_vlink,
1312 no_ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001313 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1314 "(authentication|)",
1315 NO_STR
1316 VLINK_HELPSTR_IPADDR
1317 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1318
paula2c62832003-04-23 17:01:31 +00001319ALIAS (ospf_area_vlink,
1320 ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001321 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1322 "(message-digest-key|) <1-255> md5 KEY",
1323 VLINK_HELPSTR_IPADDR
1324 VLINK_HELPSTR_AUTH_MD5)
1325
paula2c62832003-04-23 17:01:31 +00001326ALIAS (no_ospf_area_vlink,
1327 no_ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001328 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1329 "(message-digest-key|) <1-255>",
1330 NO_STR
1331 VLINK_HELPSTR_IPADDR
1332 VLINK_HELPSTR_AUTH_MD5)
1333
paula2c62832003-04-23 17:01:31 +00001334ALIAS (ospf_area_vlink,
1335 ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001336 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1337 "(authentication-key|) AUTH_KEY",
1338 VLINK_HELPSTR_IPADDR
1339 VLINK_HELPSTR_AUTH_SIMPLE)
1340
paula2c62832003-04-23 17:01:31 +00001341ALIAS (no_ospf_area_vlink,
1342 no_ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001343 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1344 "(authentication-key|)",
1345 NO_STR
1346 VLINK_HELPSTR_IPADDR
1347 VLINK_HELPSTR_AUTH_SIMPLE)
1348
paula2c62832003-04-23 17:01:31 +00001349ALIAS (ospf_area_vlink,
1350 ospf_area_vlink_authtype_args_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001351 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1352 "(authentication|) (message-digest|null) "
1353 "(authentication-key|) AUTH_KEY",
1354 VLINK_HELPSTR_IPADDR
1355 VLINK_HELPSTR_AUTHTYPE_ALL
1356 VLINK_HELPSTR_AUTH_SIMPLE)
1357
paula2c62832003-04-23 17:01:31 +00001358ALIAS (ospf_area_vlink,
1359 ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001360 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1361 "(authentication|) "
1362 "(authentication-key|) AUTH_KEY",
1363 VLINK_HELPSTR_IPADDR
1364 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1365 VLINK_HELPSTR_AUTH_SIMPLE)
1366
paula2c62832003-04-23 17:01:31 +00001367ALIAS (no_ospf_area_vlink,
1368 no_ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001369 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1370 "(authentication|) "
1371 "(authentication-key|)",
1372 NO_STR
1373 VLINK_HELPSTR_IPADDR
1374 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1375 VLINK_HELPSTR_AUTH_SIMPLE)
1376
paula2c62832003-04-23 17:01:31 +00001377ALIAS (ospf_area_vlink,
1378 ospf_area_vlink_authtype_args_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001379 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1380 "(authentication|) (message-digest|null) "
1381 "(message-digest-key|) <1-255> md5 KEY",
1382 VLINK_HELPSTR_IPADDR
1383 VLINK_HELPSTR_AUTHTYPE_ALL
1384 VLINK_HELPSTR_AUTH_MD5)
1385
paula2c62832003-04-23 17:01:31 +00001386ALIAS (ospf_area_vlink,
1387 ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001388 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1389 "(authentication|) "
1390 "(message-digest-key|) <1-255> md5 KEY",
1391 VLINK_HELPSTR_IPADDR
1392 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1393 VLINK_HELPSTR_AUTH_MD5)
1394
paula2c62832003-04-23 17:01:31 +00001395ALIAS (no_ospf_area_vlink,
1396 no_ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001397 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1398 "(authentication|) "
1399 "(message-digest-key|)",
1400 NO_STR
1401 VLINK_HELPSTR_IPADDR
1402 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1403 VLINK_HELPSTR_AUTH_MD5)
1404
1405
paula2c62832003-04-23 17:01:31 +00001406DEFUN (ospf_area_shortcut,
1407 ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001408 "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1409 "OSPF area parameters\n"
1410 "OSPF area ID in IP address format\n"
1411 "OSPF area ID as a decimal value\n"
1412 "Configure the area's shortcutting mode\n"
1413 "Set default shortcutting behavior\n"
1414 "Enable shortcutting through the area\n"
1415 "Disable shortcutting through the area\n")
1416{
paul68980082003-03-25 05:07:42 +00001417 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001418 struct ospf_area *area;
1419 struct in_addr area_id;
1420 int mode;
1421 int format;
1422
1423 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1424
paul68980082003-03-25 05:07:42 +00001425 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001426
1427 if (strncmp (argv[1], "de", 2) == 0)
1428 mode = OSPF_SHORTCUT_DEFAULT;
1429 else if (strncmp (argv[1], "di", 2) == 0)
1430 mode = OSPF_SHORTCUT_DISABLE;
1431 else if (strncmp (argv[1], "e", 1) == 0)
1432 mode = OSPF_SHORTCUT_ENABLE;
1433 else
1434 return CMD_WARNING;
1435
paul68980082003-03-25 05:07:42 +00001436 ospf_area_shortcut_set (ospf, area, mode);
paul718e3742002-12-13 20:15:29 +00001437
paul68980082003-03-25 05:07:42 +00001438 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
paul718e3742002-12-13 20:15:29 +00001439 vty_out (vty, "Shortcut area setting will take effect "
1440 "only when the router is configured as Shortcut ABR%s",
1441 VTY_NEWLINE);
1442
1443 return CMD_SUCCESS;
1444}
1445
paula2c62832003-04-23 17:01:31 +00001446DEFUN (no_ospf_area_shortcut,
1447 no_ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001448 "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1449 NO_STR
1450 "OSPF area parameters\n"
1451 "OSPF area ID in IP address format\n"
1452 "OSPF area ID as a decimal value\n"
1453 "Deconfigure the area's shortcutting mode\n"
1454 "Deconfigure enabled shortcutting through the area\n"
1455 "Deconfigure disabled shortcutting through the area\n")
1456{
paul68980082003-03-25 05:07:42 +00001457 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001458 struct ospf_area *area;
1459 struct in_addr area_id;
1460 int format;
1461
1462 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1463
paul68980082003-03-25 05:07:42 +00001464 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001465 if (!area)
1466 return CMD_SUCCESS;
1467
paul68980082003-03-25 05:07:42 +00001468 ospf_area_shortcut_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001469
1470 return CMD_SUCCESS;
1471}
1472
1473
paula2c62832003-04-23 17:01:31 +00001474DEFUN (ospf_area_stub,
1475 ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001476 "area (A.B.C.D|<0-4294967295>) stub",
1477 "OSPF area parameters\n"
1478 "OSPF area ID in IP address format\n"
1479 "OSPF area ID as a decimal value\n"
1480 "Configure OSPF area as stub\n")
1481{
1482 struct ospf *ospf = vty->index;
1483 struct in_addr area_id;
1484 int ret, format;
1485
1486 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1487
1488 ret = ospf_area_stub_set (ospf, area_id);
1489 if (ret == 0)
1490 {
1491 vty_out (vty, "First deconfigure all virtual link through this area%s",
1492 VTY_NEWLINE);
1493 return CMD_WARNING;
1494 }
1495
1496 ospf_area_no_summary_unset (ospf, area_id);
1497
1498 return CMD_SUCCESS;
1499}
1500
paula2c62832003-04-23 17:01:31 +00001501DEFUN (ospf_area_stub_no_summary,
1502 ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001503 "area (A.B.C.D|<0-4294967295>) stub no-summary",
1504 "OSPF stub parameters\n"
1505 "OSPF area ID in IP address format\n"
1506 "OSPF area ID as a decimal value\n"
1507 "Configure OSPF area as stub\n"
1508 "Do not inject inter-area routes into stub\n")
1509{
1510 struct ospf *ospf = vty->index;
1511 struct in_addr area_id;
1512 int ret, format;
1513
1514 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1515
1516 ret = ospf_area_stub_set (ospf, area_id);
1517 if (ret == 0)
1518 {
paulb0a053b2003-06-22 09:04:47 +00001519 vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
paul718e3742002-12-13 20:15:29 +00001520 VTY_NEWLINE);
1521 return CMD_WARNING;
1522 }
1523
1524 ospf_area_no_summary_set (ospf, area_id);
1525
1526 return CMD_SUCCESS;
1527}
1528
paula2c62832003-04-23 17:01:31 +00001529DEFUN (no_ospf_area_stub,
1530 no_ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001531 "no area (A.B.C.D|<0-4294967295>) stub",
1532 NO_STR
1533 "OSPF area parameters\n"
1534 "OSPF area ID in IP address format\n"
1535 "OSPF area ID as a decimal value\n"
1536 "Configure OSPF area as stub\n")
1537{
1538 struct ospf *ospf = vty->index;
1539 struct in_addr area_id;
1540 int format;
1541
1542 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1543
1544 ospf_area_stub_unset (ospf, area_id);
1545 ospf_area_no_summary_unset (ospf, area_id);
1546
1547 return CMD_SUCCESS;
1548}
1549
paula2c62832003-04-23 17:01:31 +00001550DEFUN (no_ospf_area_stub_no_summary,
1551 no_ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001552 "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1553 NO_STR
1554 "OSPF area parameters\n"
1555 "OSPF area ID in IP address format\n"
1556 "OSPF area ID as a decimal value\n"
1557 "Configure OSPF area as stub\n"
1558 "Do not inject inter-area routes into area\n")
1559{
1560 struct ospf *ospf = vty->index;
1561 struct in_addr area_id;
1562 int format;
1563
1564 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1565 ospf_area_no_summary_unset (ospf, area_id);
1566
1567 return CMD_SUCCESS;
1568}
1569
paul4dadc292005-05-06 21:37:42 +00001570static int
paul6c835672004-10-11 11:00:30 +00001571ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1572 int nosum)
paul718e3742002-12-13 20:15:29 +00001573{
1574 struct ospf *ospf = vty->index;
1575 struct in_addr area_id;
1576 int ret, format;
1577
1578 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1579
1580 ret = ospf_area_nssa_set (ospf, area_id);
1581 if (ret == 0)
1582 {
1583 vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1584 VTY_NEWLINE);
1585 return CMD_WARNING;
1586 }
1587
1588 if (argc > 1)
1589 {
1590 if (strncmp (argv[1], "translate-c", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001591 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001592 OSPF_NSSA_ROLE_CANDIDATE);
1593 else if (strncmp (argv[1], "translate-n", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001594 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001595 OSPF_NSSA_ROLE_NEVER);
1596 else if (strncmp (argv[1], "translate-a", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001597 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001598 OSPF_NSSA_ROLE_ALWAYS);
1599 }
paulb0a053b2003-06-22 09:04:47 +00001600 else
1601 {
1602 ospf_area_nssa_translator_role_set (ospf, area_id,
1603 OSPF_NSSA_ROLE_CANDIDATE);
1604 }
paul718e3742002-12-13 20:15:29 +00001605
paulb0a053b2003-06-22 09:04:47 +00001606 if (nosum)
paul718e3742002-12-13 20:15:29 +00001607 ospf_area_no_summary_set (ospf, area_id);
paulb0a053b2003-06-22 09:04:47 +00001608 else
1609 ospf_area_no_summary_unset (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001610
paulb0a053b2003-06-22 09:04:47 +00001611 ospf_schedule_abr_task (ospf);
1612
paul718e3742002-12-13 20:15:29 +00001613 return CMD_SUCCESS;
1614}
1615
paulb0a053b2003-06-22 09:04:47 +00001616DEFUN (ospf_area_nssa_translate_no_summary,
paula2c62832003-04-23 17:01:31 +00001617 ospf_area_nssa_translate_no_summary_cmd,
paulb0a053b2003-06-22 09:04:47 +00001618 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
paul718e3742002-12-13 20:15:29 +00001619 "OSPF area parameters\n"
1620 "OSPF area ID in IP address format\n"
1621 "OSPF area ID as a decimal value\n"
1622 "Configure OSPF area as nssa\n"
1623 "Configure NSSA-ABR for translate election (default)\n"
1624 "Configure NSSA-ABR to never translate\n"
1625 "Configure NSSA-ABR to always translate\n"
paulb0a053b2003-06-22 09:04:47 +00001626 "Do not inject inter-area routes into nssa\n")
1627{
1628 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1629}
paul718e3742002-12-13 20:15:29 +00001630
paulb0a053b2003-06-22 09:04:47 +00001631DEFUN (ospf_area_nssa_translate,
paula2c62832003-04-23 17:01:31 +00001632 ospf_area_nssa_translate_cmd,
paul718e3742002-12-13 20:15:29 +00001633 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1634 "OSPF area parameters\n"
1635 "OSPF area ID in IP address format\n"
1636 "OSPF area ID as a decimal value\n"
1637 "Configure OSPF area as nssa\n"
1638 "Configure NSSA-ABR for translate election (default)\n"
1639 "Configure NSSA-ABR to never translate\n"
1640 "Configure NSSA-ABR to always translate\n")
paulb0a053b2003-06-22 09:04:47 +00001641{
1642 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1643}
1644
1645DEFUN (ospf_area_nssa,
1646 ospf_area_nssa_cmd,
1647 "area (A.B.C.D|<0-4294967295>) nssa",
1648 "OSPF area parameters\n"
1649 "OSPF area ID in IP address format\n"
1650 "OSPF area ID as a decimal value\n"
1651 "Configure OSPF area as nssa\n")
1652{
1653 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1654}
paul718e3742002-12-13 20:15:29 +00001655
paula2c62832003-04-23 17:01:31 +00001656DEFUN (ospf_area_nssa_no_summary,
1657 ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001658 "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1659 "OSPF area parameters\n"
1660 "OSPF area ID in IP address format\n"
1661 "OSPF area ID as a decimal value\n"
1662 "Configure OSPF area as nssa\n"
1663 "Do not inject inter-area routes into nssa\n")
1664{
paulb0a053b2003-06-22 09:04:47 +00001665 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
paul718e3742002-12-13 20:15:29 +00001666}
1667
paula2c62832003-04-23 17:01:31 +00001668DEFUN (no_ospf_area_nssa,
1669 no_ospf_area_nssa_cmd,
paul718e3742002-12-13 20:15:29 +00001670 "no area (A.B.C.D|<0-4294967295>) nssa",
1671 NO_STR
1672 "OSPF area parameters\n"
1673 "OSPF area ID in IP address format\n"
1674 "OSPF area ID as a decimal value\n"
1675 "Configure OSPF area as nssa\n")
1676{
1677 struct ospf *ospf = vty->index;
1678 struct in_addr area_id;
1679 int format;
1680
1681 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1682
1683 ospf_area_nssa_unset (ospf, area_id);
1684 ospf_area_no_summary_unset (ospf, area_id);
1685
paulb0a053b2003-06-22 09:04:47 +00001686 ospf_schedule_abr_task (ospf);
1687
paul718e3742002-12-13 20:15:29 +00001688 return CMD_SUCCESS;
1689}
1690
paula2c62832003-04-23 17:01:31 +00001691DEFUN (no_ospf_area_nssa_no_summary,
1692 no_ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001693 "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1694 NO_STR
1695 "OSPF area parameters\n"
1696 "OSPF area ID in IP address format\n"
1697 "OSPF area ID as a decimal value\n"
1698 "Configure OSPF area as nssa\n"
1699 "Do not inject inter-area routes into nssa\n")
1700{
1701 struct ospf *ospf = vty->index;
1702 struct in_addr area_id;
1703 int format;
1704
1705 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1706 ospf_area_no_summary_unset (ospf, area_id);
1707
1708 return CMD_SUCCESS;
1709}
1710
paula2c62832003-04-23 17:01:31 +00001711DEFUN (ospf_area_default_cost,
1712 ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001713 "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1714 "OSPF area parameters\n"
1715 "OSPF area ID in IP address format\n"
1716 "OSPF area ID as a decimal value\n"
1717 "Set the summary-default cost of a NSSA or stub area\n"
1718 "Stub's advertised default summary cost\n")
1719{
paul68980082003-03-25 05:07:42 +00001720 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001721 struct ospf_area *area;
1722 struct in_addr area_id;
1723 u_int32_t cost;
1724 int format;
vincentba682532005-09-29 13:52:57 +00001725 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001726
1727 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1728 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1729
paul68980082003-03-25 05:07:42 +00001730 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001731
1732 if (area->external_routing == OSPF_AREA_DEFAULT)
1733 {
1734 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1735 return CMD_WARNING;
1736 }
1737
1738 area->default_cost = cost;
1739
vincentba682532005-09-29 13:52:57 +00001740 p.family = AF_INET;
1741 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1742 p.prefixlen = 0;
1743 if (IS_DEBUG_OSPF_EVENT)
1744 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1745 "announcing 0.0.0.0/0 to area %s",
1746 inet_ntoa (area->area_id));
1747 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1748
paul718e3742002-12-13 20:15:29 +00001749 return CMD_SUCCESS;
1750}
1751
paula2c62832003-04-23 17:01:31 +00001752DEFUN (no_ospf_area_default_cost,
1753 no_ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001754 "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1755 NO_STR
1756 "OSPF area parameters\n"
1757 "OSPF area ID in IP address format\n"
1758 "OSPF area ID as a decimal value\n"
1759 "Set the summary-default cost of a NSSA or stub area\n"
1760 "Stub's advertised default summary cost\n")
1761{
paul68980082003-03-25 05:07:42 +00001762 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001763 struct ospf_area *area;
1764 struct in_addr area_id;
1765 u_int32_t cost;
1766 int format;
vincentba682532005-09-29 13:52:57 +00001767 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001768
1769 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1770 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1771
paul68980082003-03-25 05:07:42 +00001772 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001773 if (area == NULL)
1774 return CMD_SUCCESS;
1775
1776 if (area->external_routing == OSPF_AREA_DEFAULT)
1777 {
1778 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1779 return CMD_WARNING;
1780 }
1781
1782 area->default_cost = 1;
1783
vincentba682532005-09-29 13:52:57 +00001784 p.family = AF_INET;
1785 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1786 p.prefixlen = 0;
1787 if (IS_DEBUG_OSPF_EVENT)
1788 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1789 "announcing 0.0.0.0/0 to area %s",
1790 inet_ntoa (area->area_id));
1791 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1792
1793
paul68980082003-03-25 05:07:42 +00001794 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001795
1796 return CMD_SUCCESS;
1797}
1798
paula2c62832003-04-23 17:01:31 +00001799DEFUN (ospf_area_export_list,
1800 ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001801 "area (A.B.C.D|<0-4294967295>) export-list NAME",
1802 "OSPF area parameters\n"
1803 "OSPF area ID in IP address format\n"
1804 "OSPF area ID as a decimal value\n"
1805 "Set the filter for networks announced to other areas\n"
1806 "Name of the access-list\n")
1807{
paul68980082003-03-25 05:07:42 +00001808 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001809 struct ospf_area *area;
1810 struct in_addr area_id;
1811 int format;
1812
hasso52930762004-04-19 18:26:53 +00001813 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1814
paul68980082003-03-25 05:07:42 +00001815 area = ospf_area_get (ospf, area_id, format);
1816 ospf_area_export_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001817
1818 return CMD_SUCCESS;
1819}
1820
paula2c62832003-04-23 17:01:31 +00001821DEFUN (no_ospf_area_export_list,
1822 no_ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001823 "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1824 NO_STR
1825 "OSPF area parameters\n"
1826 "OSPF area ID in IP address format\n"
1827 "OSPF area ID as a decimal value\n"
1828 "Unset the filter for networks announced to other areas\n"
1829 "Name of the access-list\n")
1830{
paul68980082003-03-25 05:07:42 +00001831 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001832 struct ospf_area *area;
1833 struct in_addr area_id;
1834 int format;
1835
hasso52930762004-04-19 18:26:53 +00001836 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1837
paul68980082003-03-25 05:07:42 +00001838 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001839 if (area == NULL)
1840 return CMD_SUCCESS;
1841
paul68980082003-03-25 05:07:42 +00001842 ospf_area_export_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001843
1844 return CMD_SUCCESS;
1845}
1846
1847
paula2c62832003-04-23 17:01:31 +00001848DEFUN (ospf_area_import_list,
1849 ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001850 "area (A.B.C.D|<0-4294967295>) import-list NAME",
1851 "OSPF area parameters\n"
1852 "OSPF area ID in IP address format\n"
1853 "OSPF area ID as a decimal value\n"
1854 "Set the filter for networks from other areas announced to the specified one\n"
1855 "Name of the access-list\n")
1856{
paul68980082003-03-25 05:07:42 +00001857 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001858 struct ospf_area *area;
1859 struct in_addr area_id;
1860 int format;
1861
hasso52930762004-04-19 18:26:53 +00001862 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1863
paul68980082003-03-25 05:07:42 +00001864 area = ospf_area_get (ospf, area_id, format);
1865 ospf_area_import_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001866
1867 return CMD_SUCCESS;
1868}
1869
paula2c62832003-04-23 17:01:31 +00001870DEFUN (no_ospf_area_import_list,
1871 no_ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001872 "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1873 NO_STR
1874 "OSPF area parameters\n"
1875 "OSPF area ID in IP address format\n"
1876 "OSPF area ID as a decimal value\n"
1877 "Unset the filter for networks announced to other areas\n"
1878 "Name of the access-list\n")
1879{
paul68980082003-03-25 05:07:42 +00001880 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001881 struct ospf_area *area;
1882 struct in_addr area_id;
1883 int format;
1884
hasso52930762004-04-19 18:26:53 +00001885 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1886
paul68980082003-03-25 05:07:42 +00001887 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001888 if (area == NULL)
1889 return CMD_SUCCESS;
1890
paul68980082003-03-25 05:07:42 +00001891 ospf_area_import_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001892
1893 return CMD_SUCCESS;
1894}
1895
paula2c62832003-04-23 17:01:31 +00001896DEFUN (ospf_area_filter_list,
1897 ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001898 "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1899 "OSPF area parameters\n"
1900 "OSPF area ID in IP address format\n"
1901 "OSPF area ID as a decimal value\n"
1902 "Filter networks between OSPF areas\n"
1903 "Filter prefixes between OSPF areas\n"
1904 "Name of an IP prefix-list\n"
1905 "Filter networks sent to this area\n"
1906 "Filter networks sent from this area\n")
1907{
paul68980082003-03-25 05:07:42 +00001908 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001909 struct ospf_area *area;
1910 struct in_addr area_id;
1911 struct prefix_list *plist;
1912 int format;
1913
1914 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1915
paul68980082003-03-25 05:07:42 +00001916 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001917 plist = prefix_list_lookup (AFI_IP, argv[1]);
1918 if (strncmp (argv[2], "in", 2) == 0)
1919 {
1920 PREFIX_LIST_IN (area) = plist;
1921 if (PREFIX_NAME_IN (area))
1922 free (PREFIX_NAME_IN (area));
1923
1924 PREFIX_NAME_IN (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001925 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001926 }
1927 else
1928 {
1929 PREFIX_LIST_OUT (area) = plist;
1930 if (PREFIX_NAME_OUT (area))
1931 free (PREFIX_NAME_OUT (area));
1932
1933 PREFIX_NAME_OUT (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001934 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001935 }
1936
1937 return CMD_SUCCESS;
1938}
1939
paula2c62832003-04-23 17:01:31 +00001940DEFUN (no_ospf_area_filter_list,
1941 no_ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001942 "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1943 NO_STR
1944 "OSPF area parameters\n"
1945 "OSPF area ID in IP address format\n"
1946 "OSPF area ID as a decimal value\n"
1947 "Filter networks between OSPF areas\n"
1948 "Filter prefixes between OSPF areas\n"
1949 "Name of an IP prefix-list\n"
1950 "Filter networks sent to this area\n"
1951 "Filter networks sent from this area\n")
1952{
paul68980082003-03-25 05:07:42 +00001953 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001954 struct ospf_area *area;
1955 struct in_addr area_id;
1956 struct prefix_list *plist;
1957 int format;
1958
1959 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1960
Paul Jakma1a8ec2b2006-05-11 13:34:08 +00001961 if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1962 return CMD_SUCCESS;
1963
paul718e3742002-12-13 20:15:29 +00001964 plist = prefix_list_lookup (AFI_IP, argv[1]);
1965 if (strncmp (argv[2], "in", 2) == 0)
1966 {
1967 if (PREFIX_NAME_IN (area))
1968 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1969 return CMD_SUCCESS;
1970
1971 PREFIX_LIST_IN (area) = NULL;
1972 if (PREFIX_NAME_IN (area))
1973 free (PREFIX_NAME_IN (area));
1974
1975 PREFIX_NAME_IN (area) = NULL;
1976
paul68980082003-03-25 05:07:42 +00001977 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001978 }
1979 else
1980 {
1981 if (PREFIX_NAME_OUT (area))
1982 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1983 return CMD_SUCCESS;
1984
1985 PREFIX_LIST_OUT (area) = NULL;
1986 if (PREFIX_NAME_OUT (area))
1987 free (PREFIX_NAME_OUT (area));
1988
1989 PREFIX_NAME_OUT (area) = NULL;
1990
paul68980082003-03-25 05:07:42 +00001991 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001992 }
1993
1994 return CMD_SUCCESS;
1995}
1996
1997
paula2c62832003-04-23 17:01:31 +00001998DEFUN (ospf_area_authentication_message_digest,
1999 ospf_area_authentication_message_digest_cmd,
paul718e3742002-12-13 20:15:29 +00002000 "area (A.B.C.D|<0-4294967295>) authentication message-digest",
2001 "OSPF area parameters\n"
2002 "Enable authentication\n"
2003 "Use message-digest authentication\n")
2004{
paul68980082003-03-25 05:07:42 +00002005 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002006 struct ospf_area *area;
2007 struct in_addr area_id;
2008 int format;
2009
2010 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2011
paul68980082003-03-25 05:07:42 +00002012 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002013 area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
2014
2015 return CMD_SUCCESS;
2016}
2017
paula2c62832003-04-23 17:01:31 +00002018DEFUN (ospf_area_authentication,
2019 ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002020 "area (A.B.C.D|<0-4294967295>) authentication",
2021 "OSPF area parameters\n"
2022 "OSPF area ID in IP address format\n"
2023 "OSPF area ID as a decimal value\n"
2024 "Enable authentication\n")
2025{
paul68980082003-03-25 05:07:42 +00002026 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002027 struct ospf_area *area;
2028 struct in_addr area_id;
2029 int format;
2030
2031 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2032
paul68980082003-03-25 05:07:42 +00002033 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002034 area->auth_type = OSPF_AUTH_SIMPLE;
2035
2036 return CMD_SUCCESS;
2037}
2038
paula2c62832003-04-23 17:01:31 +00002039DEFUN (no_ospf_area_authentication,
2040 no_ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002041 "no area (A.B.C.D|<0-4294967295>) authentication",
2042 NO_STR
2043 "OSPF area parameters\n"
2044 "OSPF area ID in IP address format\n"
2045 "OSPF area ID as a decimal value\n"
2046 "Enable authentication\n")
2047{
paul68980082003-03-25 05:07:42 +00002048 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002049 struct ospf_area *area;
2050 struct in_addr area_id;
2051 int format;
2052
2053 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2054
paul68980082003-03-25 05:07:42 +00002055 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002056 if (area == NULL)
2057 return CMD_SUCCESS;
2058
2059 area->auth_type = OSPF_AUTH_NULL;
2060
paul68980082003-03-25 05:07:42 +00002061 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002062
2063 return CMD_SUCCESS;
2064}
2065
2066
2067DEFUN (ospf_abr_type,
2068 ospf_abr_type_cmd,
2069 "ospf abr-type (cisco|ibm|shortcut|standard)",
2070 "OSPF specific commands\n"
2071 "Set OSPF ABR type\n"
2072 "Alternative ABR, cisco implementation\n"
2073 "Alternative ABR, IBM implementation\n"
2074 "Shortcut ABR\n"
2075 "Standard behavior (RFC2328)\n")
2076{
paul68980082003-03-25 05:07:42 +00002077 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002078 u_char abr_type = OSPF_ABR_UNKNOWN;
2079
2080 if (strncmp (argv[0], "c", 1) == 0)
2081 abr_type = OSPF_ABR_CISCO;
2082 else if (strncmp (argv[0], "i", 1) == 0)
2083 abr_type = OSPF_ABR_IBM;
2084 else if (strncmp (argv[0], "sh", 2) == 0)
2085 abr_type = OSPF_ABR_SHORTCUT;
2086 else if (strncmp (argv[0], "st", 2) == 0)
2087 abr_type = OSPF_ABR_STAND;
2088 else
2089 return CMD_WARNING;
2090
2091 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002092 if (ospf->abr_type != abr_type)
paul718e3742002-12-13 20:15:29 +00002093 {
paul68980082003-03-25 05:07:42 +00002094 ospf->abr_type = abr_type;
2095 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002096 }
2097
2098 return CMD_SUCCESS;
2099}
2100
2101DEFUN (no_ospf_abr_type,
2102 no_ospf_abr_type_cmd,
pauld57834f2005-07-12 20:04:22 +00002103 "no ospf abr-type (cisco|ibm|shortcut|standard)",
paul718e3742002-12-13 20:15:29 +00002104 NO_STR
2105 "OSPF specific commands\n"
2106 "Set OSPF ABR type\n"
2107 "Alternative ABR, cisco implementation\n"
2108 "Alternative ABR, IBM implementation\n"
2109 "Shortcut ABR\n")
2110{
paul68980082003-03-25 05:07:42 +00002111 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002112 u_char abr_type = OSPF_ABR_UNKNOWN;
2113
2114 if (strncmp (argv[0], "c", 1) == 0)
2115 abr_type = OSPF_ABR_CISCO;
2116 else if (strncmp (argv[0], "i", 1) == 0)
2117 abr_type = OSPF_ABR_IBM;
2118 else if (strncmp (argv[0], "s", 1) == 0)
2119 abr_type = OSPF_ABR_SHORTCUT;
2120 else
2121 return CMD_WARNING;
2122
2123 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002124 if (ospf->abr_type == abr_type)
paul718e3742002-12-13 20:15:29 +00002125 {
pauld57834f2005-07-12 20:04:22 +00002126 ospf->abr_type = OSPF_ABR_DEFAULT;
paul68980082003-03-25 05:07:42 +00002127 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002128 }
2129
2130 return CMD_SUCCESS;
2131}
2132
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002133DEFUN (ospf_log_adjacency_changes,
2134 ospf_log_adjacency_changes_cmd,
2135 "log-adjacency-changes",
2136 "Log changes in adjacency state\n")
2137{
2138 struct ospf *ospf = vty->index;
2139
2140 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2141 return CMD_SUCCESS;
2142}
2143
2144DEFUN (ospf_log_adjacency_changes_detail,
2145 ospf_log_adjacency_changes_detail_cmd,
2146 "log-adjacency-changes detail",
2147 "Log changes in adjacency state\n"
2148 "Log all state changes\n")
2149{
2150 struct ospf *ospf = vty->index;
2151
2152 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2153 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2154 return CMD_SUCCESS;
2155}
2156
2157DEFUN (no_ospf_log_adjacency_changes,
2158 no_ospf_log_adjacency_changes_cmd,
2159 "no log-adjacency-changes",
2160 NO_STR
2161 "Log changes in adjacency state\n")
2162{
2163 struct ospf *ospf = vty->index;
2164
2165 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2166 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2167 return CMD_SUCCESS;
2168}
2169
2170DEFUN (no_ospf_log_adjacency_changes_detail,
2171 no_ospf_log_adjacency_changes_detail_cmd,
2172 "no log-adjacency-changes detail",
2173 NO_STR
2174 "Log changes in adjacency state\n"
2175 "Log all state changes\n")
2176{
2177 struct ospf *ospf = vty->index;
2178
2179 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2180 return CMD_SUCCESS;
2181}
2182
paul718e3742002-12-13 20:15:29 +00002183DEFUN (ospf_compatible_rfc1583,
2184 ospf_compatible_rfc1583_cmd,
2185 "compatible rfc1583",
2186 "OSPF compatibility list\n"
2187 "compatible with RFC 1583\n")
2188{
2189 struct ospf *ospf = vty->index;
2190
2191 if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2192 {
2193 SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002194 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002195 }
2196 return CMD_SUCCESS;
2197}
2198
2199DEFUN (no_ospf_compatible_rfc1583,
2200 no_ospf_compatible_rfc1583_cmd,
2201 "no compatible rfc1583",
2202 NO_STR
2203 "OSPF compatibility list\n"
2204 "compatible with RFC 1583\n")
2205{
2206 struct ospf *ospf = vty->index;
2207
2208 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2209 {
2210 UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002211 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002212 }
2213 return CMD_SUCCESS;
2214}
2215
2216ALIAS (ospf_compatible_rfc1583,
2217 ospf_rfc1583_flag_cmd,
2218 "ospf rfc1583compatibility",
2219 "OSPF specific commands\n"
2220 "Enable the RFC1583Compatibility flag\n")
2221
2222ALIAS (no_ospf_compatible_rfc1583,
2223 no_ospf_rfc1583_flag_cmd,
2224 "no ospf rfc1583compatibility",
2225 NO_STR
2226 "OSPF specific commands\n"
2227 "Disable the RFC1583Compatibility flag\n")
pauld24f6e22005-10-21 09:23:12 +00002228
2229static int
2230ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2231 unsigned int hold,
2232 unsigned int max)
2233{
2234 struct ospf *ospf = vty->index;
2235
2236 ospf->spf_delay = delay;
2237 ospf->spf_holdtime = hold;
2238 ospf->spf_max_holdtime = max;
2239
2240 return CMD_SUCCESS;
2241}
paul718e3742002-12-13 20:15:29 +00002242
pauld24f6e22005-10-21 09:23:12 +00002243DEFUN (ospf_timers_throttle_spf,
2244 ospf_timers_throttle_spf_cmd,
2245 "timers throttle spf <0-600000> <0-600000> <0-600000>",
2246 "Adjust routing timers\n"
2247 "Throttling adaptive timer\n"
2248 "OSPF SPF timers\n"
2249 "Delay (msec) from first change received till SPF calculation\n"
2250 "Initial hold time (msec) between consecutive SPF calculations\n"
2251 "Maximum hold time (msec)\n")
2252{
2253 unsigned int delay, hold, max;
2254
2255 if (argc != 3)
2256 {
2257 vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2258 return CMD_WARNING;
2259 }
2260
2261 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2262 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2263 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2264
2265 return ospf_timers_spf_set (vty, delay, hold, max);
2266}
2267
2268DEFUN_DEPRECATED (ospf_timers_spf,
paula2c62832003-04-23 17:01:31 +00002269 ospf_timers_spf_cmd,
paul718e3742002-12-13 20:15:29 +00002270 "timers spf <0-4294967295> <0-4294967295>",
2271 "Adjust routing timers\n"
2272 "OSPF SPF timers\n"
pauld24f6e22005-10-21 09:23:12 +00002273 "Delay (s) between receiving a change to SPF calculation\n"
2274 "Hold time (s) between consecutive SPF calculations\n")
paul718e3742002-12-13 20:15:29 +00002275{
pauld24f6e22005-10-21 09:23:12 +00002276 unsigned int delay, hold;
2277
2278 if (argc != 2)
2279 {
2280 vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2281 return CMD_WARNING;
2282 }
2283
paul4dadc292005-05-06 21:37:42 +00002284 VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2285 VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
pauld24f6e22005-10-21 09:23:12 +00002286
2287 /* truncate down the second values if they're greater than 600000ms */
2288 if (delay > (600000 / 1000))
2289 delay = 600000;
2290 else if (delay == 0)
2291 /* 0s delay was probably specified because of lack of ms resolution */
2292 delay = OSPF_SPF_DELAY_DEFAULT;
2293 if (hold > (600000 / 1000))
2294 hold = 600000;
2295
2296 return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
paul718e3742002-12-13 20:15:29 +00002297}
2298
pauld24f6e22005-10-21 09:23:12 +00002299DEFUN (no_ospf_timers_throttle_spf,
2300 no_ospf_timers_throttle_spf_cmd,
2301 "no timers throttle spf",
paul718e3742002-12-13 20:15:29 +00002302 NO_STR
2303 "Adjust routing timers\n"
pauld24f6e22005-10-21 09:23:12 +00002304 "Throttling adaptive timer\n"
paul718e3742002-12-13 20:15:29 +00002305 "OSPF SPF timers\n")
2306{
pauld24f6e22005-10-21 09:23:12 +00002307 return ospf_timers_spf_set (vty,
2308 OSPF_SPF_DELAY_DEFAULT,
2309 OSPF_SPF_HOLDTIME_DEFAULT,
2310 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
paul718e3742002-12-13 20:15:29 +00002311}
2312
pauld24f6e22005-10-21 09:23:12 +00002313ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2314 no_ospf_timers_spf_cmd,
2315 "no timers spf",
2316 NO_STR
2317 "Adjust routing timers\n"
2318 "OSPF SPF timers\n")
paul718e3742002-12-13 20:15:29 +00002319
paula2c62832003-04-23 17:01:31 +00002320DEFUN (ospf_neighbor,
2321 ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002322 "neighbor A.B.C.D",
2323 NEIGHBOR_STR
2324 "Neighbor IP address\n")
2325{
2326 struct ospf *ospf = vty->index;
2327 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002328 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2329 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002330
2331 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2332
2333 if (argc > 1)
2334 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2335
2336 if (argc > 2)
2337 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2338
2339 ospf_nbr_nbma_set (ospf, nbr_addr);
2340 if (argc > 1)
2341 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2342 if (argc > 2)
2343 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
2344
2345 return CMD_SUCCESS;
2346}
2347
paula2c62832003-04-23 17:01:31 +00002348ALIAS (ospf_neighbor,
2349 ospf_neighbor_priority_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002350 "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2351 NEIGHBOR_STR
2352 "Neighbor IP address\n"
2353 "Neighbor Priority\n"
2354 "Priority\n"
2355 "Dead Neighbor Polling interval\n"
2356 "Seconds\n")
2357
paula2c62832003-04-23 17:01:31 +00002358ALIAS (ospf_neighbor,
2359 ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002360 "neighbor A.B.C.D priority <0-255>",
2361 NEIGHBOR_STR
2362 "Neighbor IP address\n"
2363 "Neighbor Priority\n"
2364 "Seconds\n")
2365
paula2c62832003-04-23 17:01:31 +00002366DEFUN (ospf_neighbor_poll_interval,
2367 ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002368 "neighbor A.B.C.D poll-interval <1-65535>",
2369 NEIGHBOR_STR
2370 "Neighbor IP address\n"
2371 "Dead Neighbor Polling interval\n"
2372 "Seconds\n")
2373{
2374 struct ospf *ospf = vty->index;
2375 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002376 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2377 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002378
2379 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2380
2381 if (argc > 1)
2382 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2383
2384 if (argc > 2)
2385 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2386
2387 ospf_nbr_nbma_set (ospf, nbr_addr);
2388 if (argc > 1)
2389 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2390 if (argc > 2)
2391 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2392
2393 return CMD_SUCCESS;
2394}
2395
paula2c62832003-04-23 17:01:31 +00002396ALIAS (ospf_neighbor_poll_interval,
2397 ospf_neighbor_poll_interval_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002398 "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2399 NEIGHBOR_STR
2400 "Neighbor address\n"
2401 "OSPF dead-router polling interval\n"
2402 "Seconds\n"
2403 "OSPF priority of non-broadcast neighbor\n"
2404 "Priority\n")
2405
paula2c62832003-04-23 17:01:31 +00002406DEFUN (no_ospf_neighbor,
2407 no_ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002408 "no neighbor A.B.C.D",
2409 NO_STR
2410 NEIGHBOR_STR
2411 "Neighbor IP address\n")
2412{
2413 struct ospf *ospf = vty->index;
2414 struct in_addr nbr_addr;
2415 int ret;
2416
2417 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2418
2419 ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
2420
2421 return CMD_SUCCESS;
2422}
2423
paula2c62832003-04-23 17:01:31 +00002424ALIAS (no_ospf_neighbor,
2425 no_ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002426 "no neighbor A.B.C.D priority <0-255>",
2427 NO_STR
2428 NEIGHBOR_STR
2429 "Neighbor IP address\n"
2430 "Neighbor Priority\n"
2431 "Priority\n")
2432
paula2c62832003-04-23 17:01:31 +00002433ALIAS (no_ospf_neighbor,
2434 no_ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002435 "no neighbor A.B.C.D poll-interval <1-65535>",
2436 NO_STR
2437 NEIGHBOR_STR
2438 "Neighbor IP address\n"
2439 "Dead Neighbor Polling interval\n"
2440 "Seconds\n")
2441
paula2c62832003-04-23 17:01:31 +00002442ALIAS (no_ospf_neighbor,
2443 no_ospf_neighbor_priority_pollinterval_cmd,
paul718e3742002-12-13 20:15:29 +00002444 "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2445 NO_STR
2446 NEIGHBOR_STR
2447 "Neighbor IP address\n"
2448 "Neighbor Priority\n"
2449 "Priority\n"
2450 "Dead Neighbor Polling interval\n"
2451 "Seconds\n")
2452
2453
paula2c62832003-04-23 17:01:31 +00002454DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002455 "refresh timer <10-1800>",
2456 "Adjust refresh parameters\n"
2457 "Set refresh timer\n"
2458 "Timer value in seconds\n")
2459{
2460 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002461 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002462
2463 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2464 interval = (interval / 10) * 10;
2465
2466 ospf_timers_refresh_set (ospf, interval);
2467
2468 return CMD_SUCCESS;
2469}
2470
paula2c62832003-04-23 17:01:31 +00002471DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
paul718e3742002-12-13 20:15:29 +00002472 "no refresh timer <10-1800>",
2473 "Adjust refresh parameters\n"
2474 "Unset refresh timer\n"
2475 "Timer value in seconds\n")
2476{
2477 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002478 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002479
2480 if (argc == 1)
2481 {
2482 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2483
2484 if (ospf->lsa_refresh_interval != interval ||
2485 interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2486 return CMD_SUCCESS;
2487 }
2488
2489 ospf_timers_refresh_unset (ospf);
2490
2491 return CMD_SUCCESS;
2492}
2493
paula2c62832003-04-23 17:01:31 +00002494ALIAS (no_ospf_refresh_timer,
2495 no_ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002496 "no refresh timer",
2497 "Adjust refresh parameters\n"
2498 "Unset refresh timer\n")
2499
paula2c62832003-04-23 17:01:31 +00002500DEFUN (ospf_auto_cost_reference_bandwidth,
2501 ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002502 "auto-cost reference-bandwidth <1-4294967>",
2503 "Calculate OSPF interface cost according to bandwidth\n"
2504 "Use reference bandwidth method to assign OSPF cost\n"
2505 "The reference bandwidth in terms of Mbits per second\n")
2506{
paul68980082003-03-25 05:07:42 +00002507 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002508 u_int32_t refbw;
hasso52dc7ee2004-09-23 19:18:23 +00002509 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00002510 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002511
2512 refbw = strtol (argv[0], NULL, 10);
2513 if (refbw < 1 || refbw > 4294967)
2514 {
2515 vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2516 return CMD_WARNING;
2517 }
2518
2519 /* If reference bandwidth is changed. */
paul68980082003-03-25 05:07:42 +00002520 if ((refbw * 1000) == ospf->ref_bandwidth)
paul718e3742002-12-13 20:15:29 +00002521 return CMD_SUCCESS;
2522
paul68980082003-03-25 05:07:42 +00002523 ospf->ref_bandwidth = refbw * 1000;
paul1eb8ef22005-04-07 07:30:20 +00002524 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2525 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002526
2527 return CMD_SUCCESS;
2528}
2529
paula2c62832003-04-23 17:01:31 +00002530DEFUN (no_ospf_auto_cost_reference_bandwidth,
2531 no_ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002532 "no auto-cost reference-bandwidth",
2533 NO_STR
2534 "Calculate OSPF interface cost according to bandwidth\n"
2535 "Use reference bandwidth method to assign OSPF cost\n")
2536{
paul68980082003-03-25 05:07:42 +00002537 struct ospf *ospf = vty->index;
paul1eb8ef22005-04-07 07:30:20 +00002538 struct listnode *node, *nnode;
2539 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002540
paul68980082003-03-25 05:07:42 +00002541 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
paul718e3742002-12-13 20:15:29 +00002542 return CMD_SUCCESS;
2543
paul68980082003-03-25 05:07:42 +00002544 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
paul718e3742002-12-13 20:15:29 +00002545 vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2546 vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2547
paul1eb8ef22005-04-07 07:30:20 +00002548 for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2549 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002550
2551 return CMD_SUCCESS;
2552}
2553
hassoeb1ce602004-10-08 08:17:22 +00002554const char *ospf_abr_type_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002555{
2556 "Unknown",
2557 "Standard (RFC2328)",
2558 "Alternative IBM",
2559 "Alternative Cisco",
2560 "Alternative Shortcut"
2561};
2562
hassoeb1ce602004-10-08 08:17:22 +00002563const char *ospf_shortcut_mode_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002564{
2565 "Default",
2566 "Enabled",
2567 "Disabled"
2568};
2569
2570
2571
paul4dadc292005-05-06 21:37:42 +00002572static void
paul718e3742002-12-13 20:15:29 +00002573show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2574{
2575 /* Show Area ID. */
2576 vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2577
2578 /* Show Area type/mode. */
2579 if (OSPF_IS_AREA_BACKBONE (area))
2580 vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2581 else
2582 {
2583 if (area->external_routing == OSPF_AREA_STUB)
paulb0a053b2003-06-22 09:04:47 +00002584 vty_out (vty, " (Stub%s%s)",
2585 area->no_summary ? ", no summary" : "",
2586 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002587
paulb0a053b2003-06-22 09:04:47 +00002588 else if (area->external_routing == OSPF_AREA_NSSA)
2589 vty_out (vty, " (NSSA%s%s)",
2590 area->no_summary ? ", no summary" : "",
2591 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002592
2593 vty_out (vty, "%s", VTY_NEWLINE);
2594 vty_out (vty, " Shortcutting mode: %s",
paulb0a053b2003-06-22 09:04:47 +00002595 ospf_shortcut_mode_descr_str[area->shortcut_configured]);
paul718e3742002-12-13 20:15:29 +00002596 vty_out (vty, ", S-bit consensus: %s%s",
paulb0a053b2003-06-22 09:04:47 +00002597 area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002598 }
2599
2600 /* Show number of interfaces. */
2601 vty_out (vty, " Number of interfaces in this area: Total: %d, "
2602 "Active: %d%s", listcount (area->oiflist),
2603 area->act_ints, VTY_NEWLINE);
2604
paul718e3742002-12-13 20:15:29 +00002605 if (area->external_routing == OSPF_AREA_NSSA)
2606 {
2607 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 +00002608 if (! IS_OSPF_ABR (area->ospf))
paulb0a053b2003-06-22 09:04:47 +00002609 vty_out (vty, " It is not ABR, therefore not Translator. %s",
2610 VTY_NEWLINE);
2611 else if (area->NSSATranslatorState)
2612 {
2613 vty_out (vty, " We are an ABR and ");
2614 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2615 vty_out (vty, "the NSSA Elected Translator. %s",
2616 VTY_NEWLINE);
2617 else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2618 vty_out (vty, "always an NSSA Translator. %s",
2619 VTY_NEWLINE);
2620 }
paul718e3742002-12-13 20:15:29 +00002621 else
paulb0a053b2003-06-22 09:04:47 +00002622 {
2623 vty_out (vty, " We are an ABR, but ");
2624 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2625 vty_out (vty, "not the NSSA Elected Translator. %s",
2626 VTY_NEWLINE);
2627 else
hassoc6b87812004-12-22 13:09:59 +00002628 vty_out (vty, "never an NSSA Translator. %s",
paulb0a053b2003-06-22 09:04:47 +00002629 VTY_NEWLINE);
2630 }
paul718e3742002-12-13 20:15:29 +00002631 }
paul88d6cf32005-10-29 12:50:09 +00002632 /* Stub-router state for this area */
2633 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2634 {
ajs649654a2005-11-16 20:17:52 +00002635 char timebuf[OSPF_TIME_DUMP_SIZE];
paul88d6cf32005-10-29 12:50:09 +00002636 vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2637 VTY_NEWLINE);
2638 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2639 vty_out (vty, " Administratively activated (indefinitely)%s",
2640 VTY_NEWLINE);
2641 if (area->t_stub_router)
2642 vty_out (vty, " Active from startup, %s remaining%s",
2643 ospf_timer_dump (area->t_stub_router, timebuf,
2644 sizeof(timebuf)), VTY_NEWLINE);
2645 }
2646
paul718e3742002-12-13 20:15:29 +00002647 /* Show number of fully adjacent neighbors. */
2648 vty_out (vty, " Number of fully adjacent neighbors in this area:"
paulb0a053b2003-06-22 09:04:47 +00002649 " %d%s", area->full_nbrs, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002650
2651 /* Show authentication type. */
2652 vty_out (vty, " Area has ");
2653 if (area->auth_type == OSPF_AUTH_NULL)
2654 vty_out (vty, "no authentication%s", VTY_NEWLINE);
2655 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2656 vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2657 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2658 vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2659
2660 if (!OSPF_IS_AREA_BACKBONE (area))
2661 vty_out (vty, " Number of full virtual adjacencies going through"
2662 " this area: %d%s", area->full_vls, VTY_NEWLINE);
2663
2664 /* Show SPF calculation times. */
2665 vty_out (vty, " SPF algorithm executed %d times%s",
2666 area->spf_calculation, VTY_NEWLINE);
2667
2668 /* Show number of LSA. */
2669 vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
hassofe71a972004-12-22 16:16:02 +00002670 vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2671 ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2672 ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2673 vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2674 ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2675 ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2676 vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2677 ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2678 ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2679 vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2680 ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2681 ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2682 vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2683 ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2684 ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2685#ifdef HAVE_OPAQUE_LSA
2686 vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2687 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2688 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2689 vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2690 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2691 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2692#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002693 vty_out (vty, "%s", VTY_NEWLINE);
2694}
2695
2696DEFUN (show_ip_ospf,
2697 show_ip_ospf_cmd,
2698 "show ip ospf",
2699 SHOW_STR
2700 IP_STR
2701 "OSPF information\n")
2702{
paul1eb8ef22005-04-07 07:30:20 +00002703 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002704 struct ospf_area * area;
paul020709f2003-04-04 02:44:16 +00002705 struct ospf *ospf;
pauld24f6e22005-10-21 09:23:12 +00002706 struct timeval result;
ajs649654a2005-11-16 20:17:52 +00002707 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002708
2709 /* Check OSPF is enable. */
paul020709f2003-04-04 02:44:16 +00002710 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002711 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00002712 {
2713 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2714 return CMD_SUCCESS;
2715 }
2716
2717 /* Show Router ID. */
2718 vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
paul68980082003-03-25 05:07:42 +00002719 inet_ntoa (ospf->router_id),
paul718e3742002-12-13 20:15:29 +00002720 VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00002721
2722 /* Graceful shutdown */
paulc9c93d52005-11-26 13:31:11 +00002723 if (ospf->t_deferred_shutdown)
2724 vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2725 ospf_timer_dump (ospf->t_deferred_shutdown,
paul88d6cf32005-10-29 12:50:09 +00002726 timebuf, sizeof (timebuf)), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002727 /* Show capability. */
2728 vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2729 vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2730 vty_out (vty, " RFC1583Compatibility flag is %s%s",
paul68980082003-03-25 05:07:42 +00002731 CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
paul718e3742002-12-13 20:15:29 +00002732 "enabled" : "disabled", VTY_NEWLINE);
2733#ifdef HAVE_OPAQUE_LSA
2734 vty_out (vty, " OpaqueCapability flag is %s%s%s",
paul68980082003-03-25 05:07:42 +00002735 CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
paul718e3742002-12-13 20:15:29 +00002736 "enabled" : "disabled",
paul68980082003-03-25 05:07:42 +00002737 IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
paul718e3742002-12-13 20:15:29 +00002738 " (origination blocked)" : "",
2739 VTY_NEWLINE);
2740#endif /* HAVE_OPAQUE_LSA */
paul88d6cf32005-10-29 12:50:09 +00002741
2742 /* Show stub-router configuration */
2743 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2744 || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2745 {
2746 vty_out (vty, " Stub router advertisement is configured%s",
2747 VTY_NEWLINE);
2748 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2749 vty_out (vty, " Enabled for %us after start-up%s",
2750 ospf->stub_router_startup_time, VTY_NEWLINE);
2751 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2752 vty_out (vty, " Enabled for %us prior to full shutdown%s",
2753 ospf->stub_router_shutdown_time, VTY_NEWLINE);
2754 }
2755
paul718e3742002-12-13 20:15:29 +00002756 /* Show SPF timers. */
pauld24f6e22005-10-21 09:23:12 +00002757 vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2758 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2759 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2760 " Hold time multiplier is currently %d%s",
2761 ospf->spf_delay, VTY_NEWLINE,
2762 ospf->spf_holdtime, VTY_NEWLINE,
2763 ospf->spf_max_holdtime, VTY_NEWLINE,
2764 ospf->spf_hold_multiplier, VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002765 vty_out (vty, " SPF algorithm ");
2766 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2767 {
Paul Jakma2518efd2006-08-27 06:49:29 +00002768 result = tv_sub (recent_relative_time (), ospf->ts_spf);
paulb8ad39d2005-10-23 15:23:05 +00002769 vty_out (vty, "last executed %s ago%s",
2770 ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2771 VTY_NEWLINE);
2772 }
2773 else
2774 vty_out (vty, "has not been run%s", VTY_NEWLINE);
pauld24f6e22005-10-21 09:23:12 +00002775 vty_out (vty, " SPF timer %s%s%s",
2776 (ospf->t_spf_calc ? "due in " : "is "),
2777 ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2778 VTY_NEWLINE);
2779
paul718e3742002-12-13 20:15:29 +00002780 /* Show refresh parameters. */
2781 vty_out (vty, " Refresh timer %d secs%s",
paul68980082003-03-25 05:07:42 +00002782 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002783
2784 /* Show ABR/ASBR flags. */
paul68980082003-03-25 05:07:42 +00002785 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
paul718e3742002-12-13 20:15:29 +00002786 vty_out (vty, " This router is an ABR, ABR type is: %s%s",
paul68980082003-03-25 05:07:42 +00002787 ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002788
paul68980082003-03-25 05:07:42 +00002789 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
paul718e3742002-12-13 20:15:29 +00002790 vty_out (vty, " This router is an ASBR "
2791 "(injecting external routing information)%s", VTY_NEWLINE);
2792
2793 /* Show Number of AS-external-LSAs. */
hassofe71a972004-12-22 16:16:02 +00002794 vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2795 ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2796 ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2797#ifdef HAVE_OPAQUE_LSA
2798 vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2799 ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2800 ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2801#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002802 /* Show number of areas attached. */
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002803 vty_out (vty, " Number of areas attached to this router: %d%s",
2804 listcount (ospf->areas), VTY_NEWLINE);
2805
2806 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2807 {
2808 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2809 vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2810 else
2811 vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2812 }
2813
2814 vty_out (vty, "%s",VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002815
2816 /* Show each area status. */
paul1eb8ef22005-04-07 07:30:20 +00002817 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2818 show_ip_ospf_area (vty, area);
paul718e3742002-12-13 20:15:29 +00002819
2820 return CMD_SUCCESS;
2821}
2822
2823
ajsfd651fa2005-03-29 16:08:16 +00002824static void
paul68980082003-03-25 05:07:42 +00002825show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2826 struct interface *ifp)
paul718e3742002-12-13 20:15:29 +00002827{
ajsfd651fa2005-03-29 16:08:16 +00002828 int is_up;
paul718e3742002-12-13 20:15:29 +00002829 struct ospf_neighbor *nbr;
paul718e3742002-12-13 20:15:29 +00002830 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00002831
paul718e3742002-12-13 20:15:29 +00002832 /* Is interface up? */
ajsfd651fa2005-03-29 16:08:16 +00002833 vty_out (vty, "%s is %s%s", ifp->name,
2834 ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
ajsd2fc8892005-04-02 18:38:43 +00002835 vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2836 ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2837 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002838
2839 /* Is interface OSPF enabled? */
ajsfd651fa2005-03-29 16:08:16 +00002840 if (ospf_oi_count(ifp) == 0)
paul718e3742002-12-13 20:15:29 +00002841 {
2842 vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2843 return;
2844 }
ajsfd651fa2005-03-29 16:08:16 +00002845 else if (!is_up)
2846 {
2847 vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2848 VTY_NEWLINE);
2849 return;
2850 }
2851
paul718e3742002-12-13 20:15:29 +00002852 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2853 {
2854 struct ospf_interface *oi = rn->info;
2855
2856 if (oi == NULL)
2857 continue;
2858
2859 /* Show OSPF interface information. */
2860 vty_out (vty, " Internet Address %s/%d,",
2861 inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2862
Paul Jakma9c27ef92006-05-04 07:32:57 +00002863 if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2864 {
2865 struct in_addr *dest;
2866 const char *dstr;
2867
Andrew J. Schorre4529632006-12-12 19:18:21 +00002868 if (CONNECTED_PEER(oi->connected)
2869 || oi->type == OSPF_IFTYPE_VIRTUALLINK)
Paul Jakma9c27ef92006-05-04 07:32:57 +00002870 dstr = "Peer";
2871 else
2872 dstr = "Broadcast";
2873
2874 /* For Vlinks, showing the peer address is probably more
2875 * informative than the local interface that is being used
2876 */
2877 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2878 dest = &oi->vl_data->peer_addr;
2879 else
2880 dest = &oi->connected->destination->u.prefix4;
2881
2882 vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2883 }
hasso3fb9cd62004-10-19 19:44:43 +00002884
paul718e3742002-12-13 20:15:29 +00002885 vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2886 VTY_NEWLINE);
2887
vincentba682532005-09-29 13:52:57 +00002888 vty_out (vty, " MTU mismatch detection:%s%s",
2889 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2890
paul718e3742002-12-13 20:15:29 +00002891 vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
paul68980082003-03-25 05:07:42 +00002892 inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
paul718e3742002-12-13 20:15:29 +00002893 oi->output_cost, VTY_NEWLINE);
2894
2895 vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2896 OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2897 PRIORITY (oi), VTY_NEWLINE);
2898
2899 /* Show DR information. */
2900 if (DR (oi).s_addr == 0)
2901 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2902 else
2903 {
2904 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2905 if (nbr == NULL)
2906 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2907 else
2908 {
2909 vty_out (vty, " Designated Router (ID) %s,",
2910 inet_ntoa (nbr->router_id));
2911 vty_out (vty, " Interface Address %s%s",
2912 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2913 }
2914 }
2915
2916 /* Show BDR information. */
2917 if (BDR (oi).s_addr == 0)
2918 vty_out (vty, " No backup designated router on this network%s",
2919 VTY_NEWLINE);
2920 else
2921 {
2922 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2923 if (nbr == NULL)
2924 vty_out (vty, " No backup designated router on this network%s",
2925 VTY_NEWLINE);
2926 else
2927 {
2928 vty_out (vty, " Backup Designated Router (ID) %s,",
2929 inet_ntoa (nbr->router_id));
2930 vty_out (vty, " Interface Address %s%s",
2931 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2932 }
2933 }
ajsba6454e2005-02-08 15:37:30 +00002934
2935 vty_out (vty, " Multicast group memberships:");
Paul Jakma429ac782006-06-15 18:40:49 +00002936 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2937 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2938 {
2939 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2940 vty_out (vty, " OSPFAllRouters");
2941 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2942 vty_out (vty, " OSPFDesignatedRouters");
2943 }
2944 else
ajsba6454e2005-02-08 15:37:30 +00002945 vty_out (vty, " <None>");
2946 vty_out (vty, "%s", VTY_NEWLINE);
2947
paul718e3742002-12-13 20:15:29 +00002948 vty_out (vty, " Timer intervals configured,");
paulf9ad9372005-10-21 00:45:17 +00002949 vty_out (vty, " Hello ");
2950 if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2951 vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2952 else
2953 vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2954 vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2955 OSPF_IF_PARAM (oi, v_wait),
paul718e3742002-12-13 20:15:29 +00002956 OSPF_IF_PARAM (oi, v_wait),
2957 OSPF_IF_PARAM (oi, retransmit_interval),
2958 VTY_NEWLINE);
2959
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002960 if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
paulf9ad9372005-10-21 00:45:17 +00002961 {
ajs649654a2005-11-16 20:17:52 +00002962 char timebuf[OSPF_TIME_DUMP_SIZE];
paulf9ad9372005-10-21 00:45:17 +00002963 vty_out (vty, " Hello due in %s%s",
ajs649654a2005-11-16 20:17:52 +00002964 ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
paulf9ad9372005-10-21 00:45:17 +00002965 VTY_NEWLINE);
2966 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002967 else /* passive-interface is set */
paul718e3742002-12-13 20:15:29 +00002968 vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2969
2970 vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
paul68980082003-03-25 05:07:42 +00002971 ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
paul718e3742002-12-13 20:15:29 +00002972 VTY_NEWLINE);
2973 }
2974}
2975
2976DEFUN (show_ip_ospf_interface,
2977 show_ip_ospf_interface_cmd,
2978 "show ip ospf interface [INTERFACE]",
2979 SHOW_STR
2980 IP_STR
2981 "OSPF information\n"
2982 "Interface information\n"
2983 "Interface name\n")
2984{
2985 struct interface *ifp;
paul020709f2003-04-04 02:44:16 +00002986 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00002987 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002988
paul020709f2003-04-04 02:44:16 +00002989 ospf = ospf_lookup ();
Paul Jakmacac3b5c2006-05-11 13:31:11 +00002990 if (ospf == NULL)
2991 {
2992 vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
2993 return CMD_SUCCESS;
2994 }
paul020709f2003-04-04 02:44:16 +00002995
paul718e3742002-12-13 20:15:29 +00002996 /* Show All Interfaces. */
2997 if (argc == 0)
paul1eb8ef22005-04-07 07:30:20 +00002998 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
2999 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00003000 /* Interface name is specified. */
3001 else
3002 {
3003 if ((ifp = if_lookup_by_name (argv[0])) == NULL)
3004 vty_out (vty, "No such interface name%s", VTY_NEWLINE);
3005 else
paul68980082003-03-25 05:07:42 +00003006 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00003007 }
3008
3009 return CMD_SUCCESS;
3010}
3011
paul4dadc292005-05-06 21:37:42 +00003012static void
pauld24f6e22005-10-21 09:23:12 +00003013show_ip_ospf_neighbour_header (struct vty *vty)
3014{
3015 vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3016 VTY_NEWLINE,
3017 "Neighbor ID", "Pri", "State", "Dead Time",
3018 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3019 VTY_NEWLINE);
3020}
3021
3022static void
paul718e3742002-12-13 20:15:29 +00003023show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3024{
3025 struct route_node *rn;
3026 struct ospf_neighbor *nbr;
3027 char msgbuf[16];
ajs649654a2005-11-16 20:17:52 +00003028 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003029
3030 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3031 if ((nbr = rn->info))
3032 /* Do not show myself. */
3033 if (nbr != oi->nbr_self)
3034 /* Down state is not shown. */
3035 if (nbr->state != NSM_Down)
3036 {
3037 ospf_nbr_state_message (nbr, msgbuf, 16);
3038
3039 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
pauld24f6e22005-10-21 09:23:12 +00003040 vty_out (vty, "%-15s %3d %-15s ",
3041 "-", nbr->priority,
3042 msgbuf);
3043 else
3044 vty_out (vty, "%-15s %3d %-15s ",
3045 inet_ntoa (nbr->router_id), nbr->priority,
3046 msgbuf);
3047
3048 vty_out (vty, "%9s ",
3049 ospf_timer_dump (nbr->t_inactivity, timebuf,
3050 sizeof(timebuf)));
3051
paul718e3742002-12-13 20:15:29 +00003052 vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
pauld24f6e22005-10-21 09:23:12 +00003053 vty_out (vty, "%-20s %5ld %5ld %5d%s",
paul718e3742002-12-13 20:15:29 +00003054 IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3055 ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3056 VTY_NEWLINE);
3057 }
3058}
3059
3060DEFUN (show_ip_ospf_neighbor,
3061 show_ip_ospf_neighbor_cmd,
3062 "show ip ospf neighbor",
3063 SHOW_STR
3064 IP_STR
3065 "OSPF information\n"
3066 "Neighbor list\n")
3067{
paul020709f2003-04-04 02:44:16 +00003068 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003069 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003070 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003071
paul020709f2003-04-04 02:44:16 +00003072 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003073 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003074 {
3075 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3076 return CMD_SUCCESS;
3077 }
3078
pauld24f6e22005-10-21 09:23:12 +00003079 show_ip_ospf_neighbour_header (vty);
paul718e3742002-12-13 20:15:29 +00003080
paul1eb8ef22005-04-07 07:30:20 +00003081 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3082 show_ip_ospf_neighbor_sub (vty, oi);
paul718e3742002-12-13 20:15:29 +00003083
3084 return CMD_SUCCESS;
3085}
3086
3087DEFUN (show_ip_ospf_neighbor_all,
3088 show_ip_ospf_neighbor_all_cmd,
3089 "show ip ospf neighbor all",
3090 SHOW_STR
3091 IP_STR
3092 "OSPF information\n"
3093 "Neighbor list\n"
3094 "include down status neighbor\n")
3095{
Joakim Tjernlund35f89142008-07-01 16:54:07 +02003096 struct ospf *ospf = ospf_lookup ();
hasso52dc7ee2004-09-23 19:18:23 +00003097 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003098 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003099
paul68980082003-03-25 05:07:42 +00003100 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003101 {
3102 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3103 return CMD_SUCCESS;
3104 }
pauld24f6e22005-10-21 09:23:12 +00003105
3106 show_ip_ospf_neighbour_header (vty);
3107
paul1eb8ef22005-04-07 07:30:20 +00003108 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003109 {
hasso52dc7ee2004-09-23 19:18:23 +00003110 struct listnode *nbr_node;
paul1eb8ef22005-04-07 07:30:20 +00003111 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003112
3113 show_ip_ospf_neighbor_sub (vty, oi);
3114
3115 /* print Down neighbor status */
paul1eb8ef22005-04-07 07:30:20 +00003116 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
paul718e3742002-12-13 20:15:29 +00003117 {
paul718e3742002-12-13 20:15:29 +00003118 if (nbr_nbma->nbr == NULL
3119 || nbr_nbma->nbr->state == NSM_Down)
3120 {
pauld24f6e22005-10-21 09:23:12 +00003121 vty_out (vty, "%-15s %3d %-15s %9s ",
paul718e3742002-12-13 20:15:29 +00003122 "-", nbr_nbma->priority, "Down", "-");
pauld24f6e22005-10-21 09:23:12 +00003123 vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
paul718e3742002-12-13 20:15:29 +00003124 inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3125 0, 0, 0, VTY_NEWLINE);
3126 }
3127 }
3128 }
3129
3130 return CMD_SUCCESS;
3131}
3132
3133DEFUN (show_ip_ospf_neighbor_int,
3134 show_ip_ospf_neighbor_int_cmd,
hassobb5b7552005-08-21 20:01:15 +00003135 "show ip ospf neighbor IFNAME",
paul718e3742002-12-13 20:15:29 +00003136 SHOW_STR
3137 IP_STR
3138 "OSPF information\n"
3139 "Neighbor list\n"
3140 "Interface name\n")
3141{
paul020709f2003-04-04 02:44:16 +00003142 struct ospf *ospf;
hassobb5b7552005-08-21 20:01:15 +00003143 struct interface *ifp;
3144 struct route_node *rn;
3145
3146 ifp = if_lookup_by_name (argv[0]);
3147 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003148 {
hassobb5b7552005-08-21 20:01:15 +00003149 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003150 return CMD_WARNING;
3151 }
3152
paul020709f2003-04-04 02:44:16 +00003153 ospf = ospf_lookup ();
3154 if (ospf == NULL)
3155 {
3156 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3157 return CMD_SUCCESS;
3158 }
pauld24f6e22005-10-21 09:23:12 +00003159
3160 show_ip_ospf_neighbour_header (vty);
3161
hassobb5b7552005-08-21 20:01:15 +00003162 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00003163 {
hassobb5b7552005-08-21 20:01:15 +00003164 struct ospf_interface *oi = rn->info;
3165
3166 if (oi == NULL)
3167 continue;
3168
paul718e3742002-12-13 20:15:29 +00003169 show_ip_ospf_neighbor_sub (vty, oi);
3170 }
3171
3172 return CMD_SUCCESS;
3173}
3174
paul4dadc292005-05-06 21:37:42 +00003175static void
paul718e3742002-12-13 20:15:29 +00003176show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3177 struct ospf_nbr_nbma *nbr_nbma)
3178{
ajs649654a2005-11-16 20:17:52 +00003179 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003180
3181 /* Show neighbor ID. */
3182 vty_out (vty, " Neighbor %s,", "-");
3183
3184 /* Show interface address. */
3185 vty_out (vty, " interface address %s%s",
3186 inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3187 /* Show Area ID. */
3188 vty_out (vty, " In the area %s via interface %s%s",
3189 ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3190 /* Show neighbor priority and state. */
3191 vty_out (vty, " Neighbor priority is %d, State is %s,",
3192 nbr_nbma->priority, "Down");
3193 /* Show state changes. */
3194 vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3195
3196 /* Show PollInterval */
3197 vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3198
3199 /* Show poll-interval timer. */
3200 vty_out (vty, " Poll timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003201 ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3202 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003203
3204 /* Show poll-interval timer thread. */
3205 vty_out (vty, " Thread Poll Timer %s%s",
3206 nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3207}
3208
paul4dadc292005-05-06 21:37:42 +00003209static void
paul718e3742002-12-13 20:15:29 +00003210show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3211 struct ospf_neighbor *nbr)
3212{
ajs649654a2005-11-16 20:17:52 +00003213 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003214
3215 /* Show neighbor ID. */
3216 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3217 vty_out (vty, " Neighbor %s,", "-");
3218 else
3219 vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3220
3221 /* Show interface address. */
3222 vty_out (vty, " interface address %s%s",
3223 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3224 /* Show Area ID. */
3225 vty_out (vty, " In the area %s via interface %s%s",
3226 ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3227 /* Show neighbor priority and state. */
3228 vty_out (vty, " Neighbor priority is %d, State is %s,",
3229 nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3230 /* Show state changes. */
3231 vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
Paul Jakma3fed4162006-07-25 20:44:12 +00003232 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
Paul Jakma90c33172006-07-11 17:57:25 +00003233 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003234 struct timeval res
3235 = tv_sub (recent_relative_time (), nbr->ts_last_progress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003236 vty_out (vty, " Most recent state change statistics:%s",
3237 VTY_NEWLINE);
3238 vty_out (vty, " Progressive change %s ago%s",
Paul Jakma90c33172006-07-11 17:57:25 +00003239 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
Paul Jakma3fed4162006-07-25 20:44:12 +00003240 VTY_NEWLINE);
3241 }
3242 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3243 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003244 struct timeval res
3245 = tv_sub (recent_relative_time (), nbr->ts_last_regress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003246 vty_out (vty, " Regressive change %s ago, due to %s%s",
3247 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3248 (nbr->last_regress_str ? nbr->last_regress_str : "??"),
Paul Jakma90c33172006-07-11 17:57:25 +00003249 VTY_NEWLINE);
3250 }
paul718e3742002-12-13 20:15:29 +00003251 /* Show Designated Rotuer ID. */
3252 vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3253 /* Show Backup Designated Rotuer ID. */
3254 vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3255 /* Show options. */
3256 vty_out (vty, " Options %d %s%s", nbr->options,
3257 ospf_options_dump (nbr->options), VTY_NEWLINE);
3258 /* Show Router Dead interval timer. */
3259 vty_out (vty, " Dead timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003260 ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3261 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003262 /* Show Database Summary list. */
3263 vty_out (vty, " Database Summary List %d%s",
3264 ospf_db_summary_count (nbr), VTY_NEWLINE);
3265 /* Show Link State Request list. */
3266 vty_out (vty, " Link State Request List %ld%s",
3267 ospf_ls_request_count (nbr), VTY_NEWLINE);
3268 /* Show Link State Retransmission list. */
3269 vty_out (vty, " Link State Retransmission List %ld%s",
3270 ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3271 /* Show inactivity timer thread. */
3272 vty_out (vty, " Thread Inactivity Timer %s%s",
3273 nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3274 /* Show Database Description retransmission thread. */
3275 vty_out (vty, " Thread Database Description Retransmision %s%s",
3276 nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3277 /* Show Link State Request Retransmission thread. */
3278 vty_out (vty, " Thread Link State Request Retransmission %s%s",
3279 nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3280 /* Show Link State Update Retransmission thread. */
3281 vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3282 nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3283}
3284
3285DEFUN (show_ip_ospf_neighbor_id,
3286 show_ip_ospf_neighbor_id_cmd,
3287 "show ip ospf neighbor A.B.C.D",
3288 SHOW_STR
3289 IP_STR
3290 "OSPF information\n"
3291 "Neighbor list\n"
3292 "Neighbor ID\n")
3293{
paul020709f2003-04-04 02:44:16 +00003294 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003295 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003296 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003297 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003298 struct in_addr router_id;
3299 int ret;
3300
3301 ret = inet_aton (argv[0], &router_id);
3302 if (!ret)
3303 {
3304 vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3305 return CMD_WARNING;
3306 }
3307
paul020709f2003-04-04 02:44:16 +00003308 ospf = ospf_lookup ();
3309 if (ospf == NULL)
3310 {
3311 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3312 return CMD_SUCCESS;
3313 }
3314
paul1eb8ef22005-04-07 07:30:20 +00003315 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3316 if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
Andrew J. Schorr1c066bf2006-06-30 16:53:47 +00003317 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003318
paul718e3742002-12-13 20:15:29 +00003319 return CMD_SUCCESS;
3320}
3321
3322DEFUN (show_ip_ospf_neighbor_detail,
3323 show_ip_ospf_neighbor_detail_cmd,
3324 "show ip ospf neighbor detail",
3325 SHOW_STR
3326 IP_STR
3327 "OSPF information\n"
3328 "Neighbor list\n"
3329 "detail of all neighbors\n")
3330{
paul020709f2003-04-04 02:44:16 +00003331 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003332 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003333 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003334
paul020709f2003-04-04 02:44:16 +00003335 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003336 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003337 {
3338 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3339 return CMD_SUCCESS;
3340 }
paul718e3742002-12-13 20:15:29 +00003341
paul1eb8ef22005-04-07 07:30:20 +00003342 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003343 {
paul718e3742002-12-13 20:15:29 +00003344 struct route_node *rn;
3345 struct ospf_neighbor *nbr;
3346
3347 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3348 if ((nbr = rn->info))
3349 if (nbr != oi->nbr_self)
3350 if (nbr->state != NSM_Down)
3351 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3352 }
3353
3354 return CMD_SUCCESS;
3355}
3356
3357DEFUN (show_ip_ospf_neighbor_detail_all,
3358 show_ip_ospf_neighbor_detail_all_cmd,
3359 "show ip ospf neighbor detail all",
3360 SHOW_STR
3361 IP_STR
3362 "OSPF information\n"
3363 "Neighbor list\n"
3364 "detail of all neighbors\n"
3365 "include down status neighbor\n")
3366{
paul020709f2003-04-04 02:44:16 +00003367 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003368 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003369 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003370
paul020709f2003-04-04 02:44:16 +00003371 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003372 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003373 {
3374 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3375 return CMD_SUCCESS;
3376 }
paul718e3742002-12-13 20:15:29 +00003377
paul1eb8ef22005-04-07 07:30:20 +00003378 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003379 {
paul718e3742002-12-13 20:15:29 +00003380 struct route_node *rn;
3381 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003382 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003383
3384 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3385 if ((nbr = rn->info))
3386 if (nbr != oi->nbr_self)
3387 if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3388 show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3389
3390 if (oi->type == OSPF_IFTYPE_NBMA)
3391 {
hasso52dc7ee2004-09-23 19:18:23 +00003392 struct listnode *nd;
paul718e3742002-12-13 20:15:29 +00003393
paul1eb8ef22005-04-07 07:30:20 +00003394 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3395 if (nbr_nbma->nbr == NULL
3396 || nbr_nbma->nbr->state == NSM_Down)
3397 show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
paul718e3742002-12-13 20:15:29 +00003398 }
3399 }
3400
3401 return CMD_SUCCESS;
3402}
3403
3404DEFUN (show_ip_ospf_neighbor_int_detail,
3405 show_ip_ospf_neighbor_int_detail_cmd,
hassobb5b7552005-08-21 20:01:15 +00003406 "show ip ospf neighbor IFNAME detail",
paul718e3742002-12-13 20:15:29 +00003407 SHOW_STR
3408 IP_STR
3409 "OSPF information\n"
3410 "Neighbor list\n"
hassobb5b7552005-08-21 20:01:15 +00003411 "Interface name\n"
paul718e3742002-12-13 20:15:29 +00003412 "detail of all neighbors")
3413{
paul020709f2003-04-04 02:44:16 +00003414 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00003415 struct ospf_interface *oi;
hassobb5b7552005-08-21 20:01:15 +00003416 struct interface *ifp;
3417 struct route_node *rn, *nrn;
3418 struct ospf_neighbor *nbr;
3419
3420 ifp = if_lookup_by_name (argv[0]);
3421 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003422 {
hassobb5b7552005-08-21 20:01:15 +00003423 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003424 return CMD_WARNING;
3425 }
3426
paul020709f2003-04-04 02:44:16 +00003427 ospf = ospf_lookup ();
3428 if (ospf == NULL)
3429 {
3430 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3431 return CMD_SUCCESS;
3432 }
paul68980082003-03-25 05:07:42 +00003433
paul718e3742002-12-13 20:15:29 +00003434
hassobb5b7552005-08-21 20:01:15 +00003435 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3436 if ((oi = rn->info))
3437 for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3438 if ((nbr = nrn->info))
paul718e3742002-12-13 20:15:29 +00003439 if (nbr != oi->nbr_self)
3440 if (nbr->state != NSM_Down)
3441 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003442
3443 return CMD_SUCCESS;
3444}
3445
3446
3447/* Show functions */
paul4dadc292005-05-06 21:37:42 +00003448static int
paul020709f2003-04-04 02:44:16 +00003449show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
paul718e3742002-12-13 20:15:29 +00003450{
paul718e3742002-12-13 20:15:29 +00003451 struct router_lsa *rl;
3452 struct summary_lsa *sl;
3453 struct as_external_lsa *asel;
3454 struct prefix_ipv4 p;
3455
3456 if (lsa != NULL)
3457 /* If self option is set, check LSA self flag. */
3458 if (self == 0 || IS_LSA_SELF (lsa))
3459 {
3460 /* LSA common part show. */
3461 vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3462 vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3463 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3464 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3465 /* LSA specific part show. */
3466 switch (lsa->data->type)
3467 {
3468 case OSPF_ROUTER_LSA:
3469 rl = (struct router_lsa *) lsa->data;
3470 vty_out (vty, " %-d", ntohs (rl->links));
3471 break;
3472 case OSPF_SUMMARY_LSA:
3473 sl = (struct summary_lsa *) lsa->data;
3474
3475 p.family = AF_INET;
3476 p.prefix = sl->header.id;
3477 p.prefixlen = ip_masklen (sl->mask);
3478 apply_mask_ipv4 (&p);
3479
3480 vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3481 break;
3482 case OSPF_AS_EXTERNAL_LSA:
paul551a8972003-05-18 15:22:55 +00003483 case OSPF_AS_NSSA_LSA:
paul718e3742002-12-13 20:15:29 +00003484 asel = (struct as_external_lsa *) lsa->data;
3485
3486 p.family = AF_INET;
3487 p.prefix = asel->header.id;
3488 p.prefixlen = ip_masklen (asel->mask);
3489 apply_mask_ipv4 (&p);
3490
3491 vty_out (vty, " %s %s/%d [0x%lx]",
3492 IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3493 inet_ntoa (p.prefix), p.prefixlen,
3494 (u_long)ntohl (asel->e[0].route_tag));
3495 break;
3496 case OSPF_NETWORK_LSA:
3497 case OSPF_ASBR_SUMMARY_LSA:
3498#ifdef HAVE_OPAQUE_LSA
3499 case OSPF_OPAQUE_LINK_LSA:
3500 case OSPF_OPAQUE_AREA_LSA:
3501 case OSPF_OPAQUE_AS_LSA:
3502#endif /* HAVE_OPAQUE_LSA */
3503 default:
3504 break;
3505 }
3506 vty_out (vty, VTY_NEWLINE);
3507 }
3508
3509 return 0;
3510}
3511
hassoeb1ce602004-10-08 08:17:22 +00003512const char *show_database_desc[] =
paul718e3742002-12-13 20:15:29 +00003513{
3514 "unknown",
3515 "Router Link States",
3516 "Net Link States",
3517 "Summary Link States",
3518 "ASBR-Summary Link States",
3519 "AS External Link States",
paul718e3742002-12-13 20:15:29 +00003520 "Group Membership LSA",
3521 "NSSA-external Link States",
paul718e3742002-12-13 20:15:29 +00003522#ifdef HAVE_OPAQUE_LSA
3523 "Type-8 LSA",
3524 "Link-Local Opaque-LSA",
3525 "Area-Local Opaque-LSA",
3526 "AS-external Opaque-LSA",
3527#endif /* HAVE_OPAQUE_LSA */
3528};
3529
3530#define SHOW_OSPF_COMMON_HEADER \
3531 "Link ID ADV Router Age Seq# CkSum"
3532
hassoeb1ce602004-10-08 08:17:22 +00003533const char *show_database_header[] =
paul718e3742002-12-13 20:15:29 +00003534{
3535 "",
3536 "Link ID ADV Router Age Seq# CkSum Link count",
3537 "Link ID ADV Router Age Seq# CkSum",
3538 "Link ID ADV Router Age Seq# CkSum Route",
3539 "Link ID ADV Router Age Seq# CkSum",
3540 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003541 " --- header for Group Member ----",
3542 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003543#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003544 " --- type-8 ---",
3545 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3546 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3547 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3548#endif /* HAVE_OPAQUE_LSA */
3549};
3550
hassoeb1ce602004-10-08 08:17:22 +00003551const char *show_lsa_flags[] =
paul4957f492003-06-27 01:28:45 +00003552{
3553 "Self-originated",
3554 "Checked",
3555 "Received",
3556 "Approved",
3557 "Discard",
paul4957f492003-06-27 01:28:45 +00003558 "Translated",
paul4957f492003-06-27 01:28:45 +00003559};
3560
paul4dadc292005-05-06 21:37:42 +00003561static void
paul718e3742002-12-13 20:15:29 +00003562show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3563{
3564 struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
paul4957f492003-06-27 01:28:45 +00003565
paul718e3742002-12-13 20:15:29 +00003566 vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
paul4957f492003-06-27 01:28:45 +00003567 vty_out (vty, " Options: 0x%-2x : %s%s",
3568 lsa->data->options,
3569 ospf_options_dump(lsa->data->options),
3570 VTY_NEWLINE);
3571 vty_out (vty, " LS Flags: 0x%-2x %s%s",
paul9d526032003-06-30 22:46:14 +00003572 lsa->flags,
paul4957f492003-06-27 01:28:45 +00003573 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3574 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003575
3576 if (lsa->data->type == OSPF_ROUTER_LSA)
3577 {
3578 vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3579
3580 if (rlsa->flags)
3581 vty_out (vty, " :%s%s%s%s",
3582 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3583 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3584 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3585 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3586
3587 vty_out (vty, "%s", VTY_NEWLINE);
3588 }
3589 vty_out (vty, " LS Type: %s%s",
3590 LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3591 vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3592 LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3593 vty_out (vty, " Advertising Router: %s%s",
3594 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3595 vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3596 VTY_NEWLINE);
3597 vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3598 VTY_NEWLINE);
3599 vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3600}
3601
hassoeb1ce602004-10-08 08:17:22 +00003602const char *link_type_desc[] =
paul718e3742002-12-13 20:15:29 +00003603{
3604 "(null)",
3605 "another Router (point-to-point)",
3606 "a Transit Network",
3607 "Stub Network",
3608 "a Virtual Link",
3609};
3610
hassoeb1ce602004-10-08 08:17:22 +00003611const char *link_id_desc[] =
paul718e3742002-12-13 20:15:29 +00003612{
3613 "(null)",
3614 "Neighboring Router ID",
3615 "Designated Router address",
paul68980082003-03-25 05:07:42 +00003616 "Net",
paul718e3742002-12-13 20:15:29 +00003617 "Neighboring Router ID",
3618};
3619
hassoeb1ce602004-10-08 08:17:22 +00003620const char *link_data_desc[] =
paul718e3742002-12-13 20:15:29 +00003621{
3622 "(null)",
3623 "Router Interface address",
3624 "Router Interface address",
3625 "Network Mask",
3626 "Router Interface address",
3627};
3628
3629/* Show router-LSA each Link information. */
paul4dadc292005-05-06 21:37:42 +00003630static void
paul718e3742002-12-13 20:15:29 +00003631show_ip_ospf_database_router_links (struct vty *vty,
3632 struct router_lsa *rl)
3633{
3634 int len, i, type;
3635
3636 len = ntohs (rl->header.length) - 4;
3637 for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3638 {
3639 type = rl->link[i].type;
3640
3641 vty_out (vty, " Link connected to: %s%s",
3642 link_type_desc[type], VTY_NEWLINE);
3643 vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3644 inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3645 vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3646 inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3647 vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3648 vty_out (vty, " TOS 0 Metric: %d%s",
3649 ntohs (rl->link[i].metric), VTY_NEWLINE);
3650 vty_out (vty, "%s", VTY_NEWLINE);
3651 }
3652}
3653
3654/* Show router-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003655static int
paul718e3742002-12-13 20:15:29 +00003656show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3657{
3658 if (lsa != NULL)
3659 {
3660 struct router_lsa *rl = (struct router_lsa *) lsa->data;
3661
3662 show_ip_ospf_database_header (vty, lsa);
3663
3664 vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3665 VTY_NEWLINE, VTY_NEWLINE);
3666
3667 show_ip_ospf_database_router_links (vty, rl);
paulb0a053b2003-06-22 09:04:47 +00003668 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003669 }
3670
3671 return 0;
3672}
3673
3674/* Show network-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003675static int
paul718e3742002-12-13 20:15:29 +00003676show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3677{
3678 int length, i;
3679
3680 if (lsa != NULL)
3681 {
3682 struct network_lsa *nl = (struct network_lsa *) lsa->data;
3683
3684 show_ip_ospf_database_header (vty, lsa);
3685
3686 vty_out (vty, " Network Mask: /%d%s",
3687 ip_masklen (nl->mask), VTY_NEWLINE);
3688
3689 length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3690
3691 for (i = 0; length > 0; i++, length -= 4)
3692 vty_out (vty, " Attached Router: %s%s",
3693 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3694
3695 vty_out (vty, "%s", VTY_NEWLINE);
3696 }
3697
3698 return 0;
3699}
3700
3701/* Show summary-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003702static int
paul718e3742002-12-13 20:15:29 +00003703show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3704{
3705 if (lsa != NULL)
3706 {
3707 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3708
3709 show_ip_ospf_database_header (vty, lsa);
3710
3711 vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3712 VTY_NEWLINE);
3713 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3714 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003715 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003716 }
3717
3718 return 0;
3719}
3720
3721/* Show summary-ASBR-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003722static int
paul718e3742002-12-13 20:15:29 +00003723show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3724{
3725 if (lsa != NULL)
3726 {
3727 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3728
3729 show_ip_ospf_database_header (vty, lsa);
3730
3731 vty_out (vty, " Network Mask: /%d%s",
3732 ip_masklen (sl->mask), VTY_NEWLINE);
3733 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3734 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003735 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003736 }
3737
3738 return 0;
3739}
3740
3741/* Show AS-external-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003742static int
paul718e3742002-12-13 20:15:29 +00003743show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3744{
3745 if (lsa != NULL)
3746 {
3747 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3748
3749 show_ip_ospf_database_header (vty, lsa);
3750
3751 vty_out (vty, " Network Mask: /%d%s",
3752 ip_masklen (al->mask), VTY_NEWLINE);
3753 vty_out (vty, " Metric Type: %s%s",
3754 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3755 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3756 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3757 vty_out (vty, " Metric: %d%s",
3758 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3759 vty_out (vty, " Forward Address: %s%s",
3760 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3761
3762 vty_out (vty, " External Route Tag: %lu%s%s",
3763 (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3764 }
3765
3766 return 0;
3767}
3768
ajs2a42e282004-12-08 18:43:03 +00003769/* N.B. This function currently seems to be unused. */
paul4dadc292005-05-06 21:37:42 +00003770static int
paul718e3742002-12-13 20:15:29 +00003771show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3772{
3773 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3774
3775 /* show_ip_ospf_database_header (vty, lsa); */
3776
ajs2a42e282004-12-08 18:43:03 +00003777 zlog_debug( " Network Mask: /%d%s",
paul718e3742002-12-13 20:15:29 +00003778 ip_masklen (al->mask), "\n");
ajs2a42e282004-12-08 18:43:03 +00003779 zlog_debug( " Metric Type: %s%s",
paul718e3742002-12-13 20:15:29 +00003780 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3781 "2 (Larger than any link state path)" : "1", "\n");
ajs2a42e282004-12-08 18:43:03 +00003782 zlog_debug( " TOS: 0%s", "\n");
3783 zlog_debug( " Metric: %d%s",
paul718e3742002-12-13 20:15:29 +00003784 GET_METRIC (al->e[0].metric), "\n");
ajs2a42e282004-12-08 18:43:03 +00003785 zlog_debug( " Forward Address: %s%s",
paul718e3742002-12-13 20:15:29 +00003786 inet_ntoa (al->e[0].fwd_addr), "\n");
3787
ajs2a42e282004-12-08 18:43:03 +00003788 zlog_debug( " External Route Tag: %u%s%s",
paul718e3742002-12-13 20:15:29 +00003789 ntohl (al->e[0].route_tag), "\n", "\n");
3790
3791 return 0;
3792}
3793
3794/* Show AS-NSSA-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003795static int
paul718e3742002-12-13 20:15:29 +00003796show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3797{
3798 if (lsa != NULL)
3799 {
3800 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3801
3802 show_ip_ospf_database_header (vty, lsa);
3803
3804 vty_out (vty, " Network Mask: /%d%s",
3805 ip_masklen (al->mask), VTY_NEWLINE);
3806 vty_out (vty, " Metric Type: %s%s",
3807 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3808 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3809 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3810 vty_out (vty, " Metric: %d%s",
3811 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3812 vty_out (vty, " NSSA: Forward Address: %s%s",
3813 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3814
3815 vty_out (vty, " External Route Tag: %u%s%s",
3816 ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3817 }
3818
3819 return 0;
3820}
3821
paul4dadc292005-05-06 21:37:42 +00003822static int
paul718e3742002-12-13 20:15:29 +00003823show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3824{
3825 return 0;
3826}
3827
3828#ifdef HAVE_OPAQUE_LSA
paul4dadc292005-05-06 21:37:42 +00003829static int
paul718e3742002-12-13 20:15:29 +00003830show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3831{
3832 if (lsa != NULL)
3833 {
3834 show_ip_ospf_database_header (vty, lsa);
3835 show_opaque_info_detail (vty, lsa);
3836
3837 vty_out (vty, "%s", VTY_NEWLINE);
3838 }
3839 return 0;
3840}
3841#endif /* HAVE_OPAQUE_LSA */
3842
3843int (*show_function[])(struct vty *, struct ospf_lsa *) =
3844{
3845 NULL,
3846 show_router_lsa_detail,
3847 show_network_lsa_detail,
3848 show_summary_lsa_detail,
3849 show_summary_asbr_lsa_detail,
3850 show_as_external_lsa_detail,
paul718e3742002-12-13 20:15:29 +00003851 show_func_dummy,
3852 show_as_nssa_lsa_detail, /* almost same as external */
paul718e3742002-12-13 20:15:29 +00003853#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003854 NULL, /* type-8 */
3855 show_opaque_lsa_detail,
3856 show_opaque_lsa_detail,
3857 show_opaque_lsa_detail,
3858#endif /* HAVE_OPAQUE_LSA */
3859};
3860
paul4dadc292005-05-06 21:37:42 +00003861static void
paul718e3742002-12-13 20:15:29 +00003862show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3863 struct in_addr *adv_router)
3864{
3865 memset (lp, 0, sizeof (struct prefix_ls));
3866 lp->family = 0;
3867 if (id == NULL)
3868 lp->prefixlen = 0;
3869 else if (adv_router == NULL)
3870 {
3871 lp->prefixlen = 32;
3872 lp->id = *id;
3873 }
3874 else
3875 {
3876 lp->prefixlen = 64;
3877 lp->id = *id;
3878 lp->adv_router = *adv_router;
3879 }
3880}
3881
paul4dadc292005-05-06 21:37:42 +00003882static void
paul718e3742002-12-13 20:15:29 +00003883show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3884 struct in_addr *id, struct in_addr *adv_router)
3885{
3886 struct prefix_ls lp;
3887 struct route_node *rn, *start;
3888 struct ospf_lsa *lsa;
3889
3890 show_lsa_prefix_set (vty, &lp, id, adv_router);
3891 start = route_node_get (rt, (struct prefix *) &lp);
3892 if (start)
3893 {
3894 route_lock_node (start);
3895 for (rn = start; rn; rn = route_next_until (rn, start))
3896 if ((lsa = rn->info))
3897 {
paul718e3742002-12-13 20:15:29 +00003898 if (show_function[lsa->data->type] != NULL)
3899 show_function[lsa->data->type] (vty, lsa);
3900 }
3901 route_unlock_node (start);
3902 }
3903}
3904
3905/* Show detail LSA information
3906 -- if id is NULL then show all LSAs. */
paul4dadc292005-05-06 21:37:42 +00003907static void
paul020709f2003-04-04 02:44:16 +00003908show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003909 struct in_addr *id, struct in_addr *adv_router)
3910{
hasso52dc7ee2004-09-23 19:18:23 +00003911 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003912 struct ospf_area *area;
3913
paul718e3742002-12-13 20:15:29 +00003914 switch (type)
3915 {
3916 case OSPF_AS_EXTERNAL_LSA:
3917#ifdef HAVE_OPAQUE_LSA
3918 case OSPF_OPAQUE_AS_LSA:
3919#endif /* HAVE_OPAQUE_LSA */
3920 vty_out (vty, " %s %s%s",
3921 show_database_desc[type],
3922 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003923 show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
paul718e3742002-12-13 20:15:29 +00003924 break;
3925 default:
paul1eb8ef22005-04-07 07:30:20 +00003926 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003927 {
paul718e3742002-12-13 20:15:29 +00003928 vty_out (vty, "%s %s (Area %s)%s%s",
3929 VTY_NEWLINE, show_database_desc[type],
3930 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3931 show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3932 }
3933 break;
3934 }
3935}
3936
paul4dadc292005-05-06 21:37:42 +00003937static void
paul718e3742002-12-13 20:15:29 +00003938show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3939 struct in_addr *adv_router)
3940{
3941 struct route_node *rn;
3942 struct ospf_lsa *lsa;
3943
3944 for (rn = route_top (rt); rn; rn = route_next (rn))
3945 if ((lsa = rn->info))
3946 if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3947 {
paul718e3742002-12-13 20:15:29 +00003948 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3949 continue;
paul718e3742002-12-13 20:15:29 +00003950 if (show_function[lsa->data->type] != NULL)
3951 show_function[lsa->data->type] (vty, lsa);
3952 }
3953}
3954
3955/* Show detail LSA information. */
paul4dadc292005-05-06 21:37:42 +00003956static void
paul020709f2003-04-04 02:44:16 +00003957show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003958 struct in_addr *adv_router)
3959{
hasso52dc7ee2004-09-23 19:18:23 +00003960 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003961 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00003962
3963 switch (type)
3964 {
3965 case OSPF_AS_EXTERNAL_LSA:
3966#ifdef HAVE_OPAQUE_LSA
3967 case OSPF_OPAQUE_AS_LSA:
3968#endif /* HAVE_OPAQUE_LSA */
3969 vty_out (vty, " %s %s%s",
3970 show_database_desc[type],
3971 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003972 show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
paul718e3742002-12-13 20:15:29 +00003973 adv_router);
3974 break;
3975 default:
paul1eb8ef22005-04-07 07:30:20 +00003976 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003977 {
paul718e3742002-12-13 20:15:29 +00003978 vty_out (vty, "%s %s (Area %s)%s%s",
3979 VTY_NEWLINE, show_database_desc[type],
3980 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3981 show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3982 adv_router);
3983 }
3984 break;
3985 }
3986}
3987
paul4dadc292005-05-06 21:37:42 +00003988static void
paul020709f2003-04-04 02:44:16 +00003989show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
paul718e3742002-12-13 20:15:29 +00003990{
paul020709f2003-04-04 02:44:16 +00003991 struct ospf_lsa *lsa;
3992 struct route_node *rn;
paul1eb8ef22005-04-07 07:30:20 +00003993 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +00003994 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003995 int type;
3996
paul1eb8ef22005-04-07 07:30:20 +00003997 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003998 {
paul718e3742002-12-13 20:15:29 +00003999 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4000 {
4001 switch (type)
4002 {
4003 case OSPF_AS_EXTERNAL_LSA:
4004#ifdef HAVE_OPAQUE_LSA
4005 case OSPF_OPAQUE_AS_LSA:
4006#endif /* HAVE_OPAQUE_LSA */
4007 continue;
4008 default:
4009 break;
4010 }
4011 if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
4012 (!self && ospf_lsdb_count (area->lsdb, type) > 0))
4013 {
4014 vty_out (vty, " %s (Area %s)%s%s",
4015 show_database_desc[type],
4016 ospf_area_desc_string (area),
4017 VTY_NEWLINE, VTY_NEWLINE);
4018 vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
4019
paul020709f2003-04-04 02:44:16 +00004020 LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
4021 show_lsa_summary (vty, lsa, self);
paul718e3742002-12-13 20:15:29 +00004022
4023 vty_out (vty, "%s", VTY_NEWLINE);
4024 }
4025 }
4026 }
4027
4028 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4029 {
4030 switch (type)
4031 {
4032 case OSPF_AS_EXTERNAL_LSA:
4033#ifdef HAVE_OPAQUE_LSA
4034 case OSPF_OPAQUE_AS_LSA:
4035#endif /* HAVE_OPAQUE_LSA */
paule8e19462006-01-19 20:16:55 +00004036 break;
paul718e3742002-12-13 20:15:29 +00004037 default:
4038 continue;
4039 }
paul68980082003-03-25 05:07:42 +00004040 if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4041 (!self && ospf_lsdb_count (ospf->lsdb, type)))
paul718e3742002-12-13 20:15:29 +00004042 {
4043 vty_out (vty, " %s%s%s",
4044 show_database_desc[type],
4045 VTY_NEWLINE, VTY_NEWLINE);
4046 vty_out (vty, "%s%s", show_database_header[type],
4047 VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00004048
4049 LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4050 show_lsa_summary (vty, lsa, self);
4051
paul718e3742002-12-13 20:15:29 +00004052 vty_out (vty, "%s", VTY_NEWLINE);
4053 }
4054 }
4055
4056 vty_out (vty, "%s", VTY_NEWLINE);
4057}
4058
paul4dadc292005-05-06 21:37:42 +00004059static void
paul020709f2003-04-04 02:44:16 +00004060show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00004061{
hasso52dc7ee2004-09-23 19:18:23 +00004062 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00004063 struct ospf_lsa *lsa;
4064
4065 vty_out (vty, "%s MaxAge Link States:%s%s",
4066 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4067
paul1eb8ef22005-04-07 07:30:20 +00004068 for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
4069 {
4070 vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4071 vty_out (vty, "Link State ID: %s%s",
4072 inet_ntoa (lsa->data->id), VTY_NEWLINE);
4073 vty_out (vty, "Advertising Router: %s%s",
4074 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4075 vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4076 vty_out (vty, "%s", VTY_NEWLINE);
4077 }
paul718e3742002-12-13 20:15:29 +00004078}
4079
paul718e3742002-12-13 20:15:29 +00004080#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4081#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
paul718e3742002-12-13 20:15:29 +00004082
4083#ifdef HAVE_OPAQUE_LSA
4084#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4085#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4086#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4087#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4088#else /* HAVE_OPAQUE_LSA */
4089#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4090#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4091#define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4092#define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4093#endif /* HAVE_OPAQUE_LSA */
4094
4095#define OSPF_LSA_TYPES_CMD_STR \
4096 "asbr-summary|external|network|router|summary" \
4097 OSPF_LSA_TYPE_NSSA_CMD_STR \
4098 OSPF_LSA_TYPE_OPAQUE_CMD_STR
4099
4100#define OSPF_LSA_TYPES_DESC \
4101 "ASBR summary link states\n" \
4102 "External link states\n" \
4103 "Network link states\n" \
4104 "Router link states\n" \
4105 "Network summary link states\n" \
4106 OSPF_LSA_TYPE_NSSA_DESC \
4107 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4108 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4109 OSPF_LSA_TYPE_OPAQUE_AS_DESC
4110
4111DEFUN (show_ip_ospf_database,
4112 show_ip_ospf_database_cmd,
4113 "show ip ospf database",
4114 SHOW_STR
4115 IP_STR
4116 "OSPF information\n"
4117 "Database summary\n")
4118{
paul020709f2003-04-04 02:44:16 +00004119 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004120 int type, ret;
4121 struct in_addr id, adv_router;
4122
paul020709f2003-04-04 02:44:16 +00004123 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004124 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004125 {
4126 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4127 return CMD_SUCCESS;
4128 }
paul718e3742002-12-13 20:15:29 +00004129
4130 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004131 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004132
4133 /* Show all LSA. */
4134 if (argc == 0)
4135 {
paul020709f2003-04-04 02:44:16 +00004136 show_ip_ospf_database_summary (vty, ospf, 0);
paul718e3742002-12-13 20:15:29 +00004137 return CMD_SUCCESS;
4138 }
4139
4140 /* Set database type to show. */
4141 if (strncmp (argv[0], "r", 1) == 0)
4142 type = OSPF_ROUTER_LSA;
4143 else if (strncmp (argv[0], "ne", 2) == 0)
4144 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004145 else if (strncmp (argv[0], "ns", 2) == 0)
4146 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004147 else if (strncmp (argv[0], "su", 2) == 0)
4148 type = OSPF_SUMMARY_LSA;
4149 else if (strncmp (argv[0], "a", 1) == 0)
4150 type = OSPF_ASBR_SUMMARY_LSA;
4151 else if (strncmp (argv[0], "e", 1) == 0)
4152 type = OSPF_AS_EXTERNAL_LSA;
4153 else if (strncmp (argv[0], "se", 2) == 0)
4154 {
paul020709f2003-04-04 02:44:16 +00004155 show_ip_ospf_database_summary (vty, ospf, 1);
paul718e3742002-12-13 20:15:29 +00004156 return CMD_SUCCESS;
4157 }
4158 else if (strncmp (argv[0], "m", 1) == 0)
4159 {
paul020709f2003-04-04 02:44:16 +00004160 show_ip_ospf_database_maxage (vty, ospf);
paul718e3742002-12-13 20:15:29 +00004161 return CMD_SUCCESS;
4162 }
4163#ifdef HAVE_OPAQUE_LSA
4164 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4165 type = OSPF_OPAQUE_LINK_LSA;
4166 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4167 type = OSPF_OPAQUE_AREA_LSA;
4168 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4169 type = OSPF_OPAQUE_AS_LSA;
4170#endif /* HAVE_OPAQUE_LSA */
4171 else
4172 return CMD_WARNING;
4173
4174 /* `show ip ospf database LSA'. */
4175 if (argc == 1)
paul020709f2003-04-04 02:44:16 +00004176 show_lsa_detail (vty, ospf, type, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00004177 else if (argc >= 2)
4178 {
4179 ret = inet_aton (argv[1], &id);
4180 if (!ret)
4181 return CMD_WARNING;
4182
4183 /* `show ip ospf database LSA ID'. */
4184 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00004185 show_lsa_detail (vty, ospf, type, &id, NULL);
paul718e3742002-12-13 20:15:29 +00004186 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4187 else if (argc == 3)
4188 {
4189 if (strncmp (argv[2], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004190 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004191 else
4192 {
4193 ret = inet_aton (argv[2], &adv_router);
4194 if (!ret)
4195 return CMD_WARNING;
4196 }
paul020709f2003-04-04 02:44:16 +00004197 show_lsa_detail (vty, ospf, type, &id, &adv_router);
paul718e3742002-12-13 20:15:29 +00004198 }
4199 }
4200
4201 return CMD_SUCCESS;
4202}
4203
4204ALIAS (show_ip_ospf_database,
4205 show_ip_ospf_database_type_cmd,
4206 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4207 SHOW_STR
4208 IP_STR
4209 "OSPF information\n"
4210 "Database summary\n"
4211 OSPF_LSA_TYPES_DESC
4212 "LSAs in MaxAge list\n"
4213 "Self-originated link states\n")
4214
4215ALIAS (show_ip_ospf_database,
4216 show_ip_ospf_database_type_id_cmd,
4217 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4218 SHOW_STR
4219 IP_STR
4220 "OSPF information\n"
4221 "Database summary\n"
4222 OSPF_LSA_TYPES_DESC
4223 "Link State ID (as an IP address)\n")
4224
4225ALIAS (show_ip_ospf_database,
4226 show_ip_ospf_database_type_id_adv_router_cmd,
4227 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4228 SHOW_STR
4229 IP_STR
4230 "OSPF information\n"
4231 "Database summary\n"
4232 OSPF_LSA_TYPES_DESC
4233 "Link State ID (as an IP address)\n"
4234 "Advertising Router link states\n"
4235 "Advertising Router (as an IP address)\n")
4236
4237ALIAS (show_ip_ospf_database,
4238 show_ip_ospf_database_type_id_self_cmd,
4239 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4240 SHOW_STR
4241 IP_STR
4242 "OSPF information\n"
4243 "Database summary\n"
4244 OSPF_LSA_TYPES_DESC
4245 "Link State ID (as an IP address)\n"
4246 "Self-originated link states\n"
4247 "\n")
4248
4249DEFUN (show_ip_ospf_database_type_adv_router,
4250 show_ip_ospf_database_type_adv_router_cmd,
4251 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4252 SHOW_STR
4253 IP_STR
4254 "OSPF information\n"
4255 "Database summary\n"
4256 OSPF_LSA_TYPES_DESC
4257 "Advertising Router link states\n"
4258 "Advertising Router (as an IP address)\n")
4259{
paul020709f2003-04-04 02:44:16 +00004260 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004261 int type, ret;
4262 struct in_addr adv_router;
4263
paul020709f2003-04-04 02:44:16 +00004264 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004265 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004266 {
4267 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4268 return CMD_SUCCESS;
4269 }
paul718e3742002-12-13 20:15:29 +00004270
4271 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004272 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004273
4274 if (argc != 2)
4275 return CMD_WARNING;
4276
4277 /* Set database type to show. */
4278 if (strncmp (argv[0], "r", 1) == 0)
4279 type = OSPF_ROUTER_LSA;
4280 else if (strncmp (argv[0], "ne", 2) == 0)
4281 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004282 else if (strncmp (argv[0], "ns", 2) == 0)
4283 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004284 else if (strncmp (argv[0], "s", 1) == 0)
4285 type = OSPF_SUMMARY_LSA;
4286 else if (strncmp (argv[0], "a", 1) == 0)
4287 type = OSPF_ASBR_SUMMARY_LSA;
4288 else if (strncmp (argv[0], "e", 1) == 0)
4289 type = OSPF_AS_EXTERNAL_LSA;
4290#ifdef HAVE_OPAQUE_LSA
4291 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4292 type = OSPF_OPAQUE_LINK_LSA;
4293 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4294 type = OSPF_OPAQUE_AREA_LSA;
4295 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4296 type = OSPF_OPAQUE_AS_LSA;
4297#endif /* HAVE_OPAQUE_LSA */
4298 else
4299 return CMD_WARNING;
4300
4301 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4302 if (strncmp (argv[1], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004303 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004304 else
4305 {
4306 ret = inet_aton (argv[1], &adv_router);
4307 if (!ret)
4308 return CMD_WARNING;
4309 }
4310
paul020709f2003-04-04 02:44:16 +00004311 show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
paul718e3742002-12-13 20:15:29 +00004312
4313 return CMD_SUCCESS;
4314}
4315
4316ALIAS (show_ip_ospf_database_type_adv_router,
4317 show_ip_ospf_database_type_self_cmd,
4318 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4319 SHOW_STR
4320 IP_STR
4321 "OSPF information\n"
4322 "Database summary\n"
4323 OSPF_LSA_TYPES_DESC
4324 "Self-originated link states\n")
4325
4326
4327DEFUN (ip_ospf_authentication_args,
4328 ip_ospf_authentication_args_addr_cmd,
4329 "ip ospf authentication (null|message-digest) A.B.C.D",
4330 "IP Information\n"
4331 "OSPF interface commands\n"
4332 "Enable authentication on this interface\n"
4333 "Use null authentication\n"
4334 "Use message-digest authentication\n"
4335 "Address of interface")
4336{
4337 struct interface *ifp;
4338 struct in_addr addr;
4339 int ret;
4340 struct ospf_if_params *params;
4341
4342 ifp = vty->index;
4343 params = IF_DEF_PARAMS (ifp);
4344
4345 if (argc == 2)
4346 {
4347 ret = inet_aton(argv[1], &addr);
4348 if (!ret)
4349 {
4350 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4351 VTY_NEWLINE);
4352 return CMD_WARNING;
4353 }
4354
4355 params = ospf_get_if_params (ifp, addr);
4356 ospf_if_update_params (ifp, addr);
4357 }
4358
4359 /* Handle null authentication */
4360 if ( argv[0][0] == 'n' )
4361 {
4362 SET_IF_PARAM (params, auth_type);
4363 params->auth_type = OSPF_AUTH_NULL;
4364 return CMD_SUCCESS;
4365 }
4366
4367 /* Handle message-digest authentication */
4368 if ( argv[0][0] == 'm' )
4369 {
4370 SET_IF_PARAM (params, auth_type);
4371 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4372 return CMD_SUCCESS;
4373 }
4374
4375 vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4376 return CMD_WARNING;
4377}
4378
4379ALIAS (ip_ospf_authentication_args,
4380 ip_ospf_authentication_args_cmd,
4381 "ip ospf authentication (null|message-digest)",
4382 "IP Information\n"
4383 "OSPF interface commands\n"
4384 "Enable authentication on this interface\n"
4385 "Use null authentication\n"
4386 "Use message-digest authentication\n")
4387
4388DEFUN (ip_ospf_authentication,
4389 ip_ospf_authentication_addr_cmd,
4390 "ip ospf authentication A.B.C.D",
4391 "IP Information\n"
4392 "OSPF interface commands\n"
4393 "Enable authentication on this interface\n"
4394 "Address of interface")
4395{
4396 struct interface *ifp;
4397 struct in_addr addr;
4398 int ret;
4399 struct ospf_if_params *params;
4400
4401 ifp = vty->index;
4402 params = IF_DEF_PARAMS (ifp);
4403
4404 if (argc == 1)
4405 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004406 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004407 if (!ret)
4408 {
4409 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4410 VTY_NEWLINE);
4411 return CMD_WARNING;
4412 }
4413
4414 params = ospf_get_if_params (ifp, addr);
4415 ospf_if_update_params (ifp, addr);
4416 }
4417
4418 SET_IF_PARAM (params, auth_type);
4419 params->auth_type = OSPF_AUTH_SIMPLE;
4420
4421 return CMD_SUCCESS;
4422}
4423
4424ALIAS (ip_ospf_authentication,
4425 ip_ospf_authentication_cmd,
4426 "ip ospf authentication",
4427 "IP Information\n"
4428 "OSPF interface commands\n"
4429 "Enable authentication on this interface\n")
4430
4431DEFUN (no_ip_ospf_authentication,
4432 no_ip_ospf_authentication_addr_cmd,
4433 "no ip ospf authentication A.B.C.D",
4434 NO_STR
4435 "IP Information\n"
4436 "OSPF interface commands\n"
4437 "Enable authentication on this interface\n"
4438 "Address of interface")
4439{
4440 struct interface *ifp;
4441 struct in_addr addr;
4442 int ret;
4443 struct ospf_if_params *params;
4444
4445 ifp = vty->index;
4446 params = IF_DEF_PARAMS (ifp);
4447
4448 if (argc == 1)
4449 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004450 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004451 if (!ret)
4452 {
4453 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4454 VTY_NEWLINE);
4455 return CMD_WARNING;
4456 }
4457
4458 params = ospf_lookup_if_params (ifp, addr);
4459 if (params == NULL)
4460 return CMD_SUCCESS;
4461 }
4462
4463 params->auth_type = OSPF_AUTH_NOTSET;
4464 UNSET_IF_PARAM (params, auth_type);
4465
4466 if (params != IF_DEF_PARAMS (ifp))
4467 {
4468 ospf_free_if_params (ifp, addr);
4469 ospf_if_update_params (ifp, addr);
4470 }
4471
4472 return CMD_SUCCESS;
4473}
4474
4475ALIAS (no_ip_ospf_authentication,
4476 no_ip_ospf_authentication_cmd,
4477 "no ip ospf authentication",
4478 NO_STR
4479 "IP Information\n"
4480 "OSPF interface commands\n"
4481 "Enable authentication on this interface\n")
4482
4483DEFUN (ip_ospf_authentication_key,
4484 ip_ospf_authentication_key_addr_cmd,
4485 "ip ospf authentication-key AUTH_KEY A.B.C.D",
4486 "IP Information\n"
4487 "OSPF interface commands\n"
4488 "Authentication password (key)\n"
4489 "The OSPF password (key)\n"
4490 "Address of interface")
4491{
4492 struct interface *ifp;
4493 struct in_addr addr;
4494 int ret;
4495 struct ospf_if_params *params;
4496
4497 ifp = vty->index;
4498 params = IF_DEF_PARAMS (ifp);
4499
4500 if (argc == 2)
4501 {
4502 ret = inet_aton(argv[1], &addr);
4503 if (!ret)
4504 {
4505 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4506 VTY_NEWLINE);
4507 return CMD_WARNING;
4508 }
4509
4510 params = ospf_get_if_params (ifp, addr);
4511 ospf_if_update_params (ifp, addr);
4512 }
4513
4514
4515 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
hassoc9e52be2004-09-26 16:09:34 +00004516 strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
paul718e3742002-12-13 20:15:29 +00004517 SET_IF_PARAM (params, auth_simple);
4518
4519 return CMD_SUCCESS;
4520}
4521
4522ALIAS (ip_ospf_authentication_key,
4523 ip_ospf_authentication_key_cmd,
4524 "ip ospf authentication-key AUTH_KEY",
4525 "IP Information\n"
4526 "OSPF interface commands\n"
4527 "Authentication password (key)\n"
4528 "The OSPF password (key)")
4529
4530ALIAS (ip_ospf_authentication_key,
4531 ospf_authentication_key_cmd,
4532 "ospf authentication-key AUTH_KEY",
4533 "OSPF interface commands\n"
4534 "Authentication password (key)\n"
4535 "The OSPF password (key)")
4536
4537DEFUN (no_ip_ospf_authentication_key,
4538 no_ip_ospf_authentication_key_addr_cmd,
4539 "no ip ospf authentication-key A.B.C.D",
4540 NO_STR
4541 "IP Information\n"
4542 "OSPF interface commands\n"
4543 "Authentication password (key)\n"
4544 "Address of interface")
4545{
4546 struct interface *ifp;
4547 struct in_addr addr;
4548 int ret;
4549 struct ospf_if_params *params;
4550
4551 ifp = vty->index;
4552 params = IF_DEF_PARAMS (ifp);
4553
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004554 if (argc == 1)
paul718e3742002-12-13 20:15:29 +00004555 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004556 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004557 if (!ret)
4558 {
4559 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4560 VTY_NEWLINE);
4561 return CMD_WARNING;
4562 }
4563
4564 params = ospf_lookup_if_params (ifp, addr);
4565 if (params == NULL)
4566 return CMD_SUCCESS;
4567 }
4568
4569 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4570 UNSET_IF_PARAM (params, auth_simple);
4571
4572 if (params != IF_DEF_PARAMS (ifp))
4573 {
4574 ospf_free_if_params (ifp, addr);
4575 ospf_if_update_params (ifp, addr);
4576 }
4577
4578 return CMD_SUCCESS;
4579}
4580
4581ALIAS (no_ip_ospf_authentication_key,
4582 no_ip_ospf_authentication_key_cmd,
4583 "no ip ospf authentication-key",
4584 NO_STR
4585 "IP Information\n"
4586 "OSPF interface commands\n"
4587 "Authentication password (key)\n")
4588
4589ALIAS (no_ip_ospf_authentication_key,
4590 no_ospf_authentication_key_cmd,
4591 "no ospf authentication-key",
4592 NO_STR
4593 "OSPF interface commands\n"
4594 "Authentication password (key)\n")
4595
4596DEFUN (ip_ospf_message_digest_key,
4597 ip_ospf_message_digest_key_addr_cmd,
4598 "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4599 "IP Information\n"
4600 "OSPF interface commands\n"
4601 "Message digest authentication password (key)\n"
4602 "Key ID\n"
4603 "Use MD5 algorithm\n"
4604 "The OSPF password (key)"
4605 "Address of interface")
4606{
4607 struct interface *ifp;
4608 struct crypt_key *ck;
4609 u_char key_id;
4610 struct in_addr addr;
4611 int ret;
4612 struct ospf_if_params *params;
4613
4614 ifp = vty->index;
4615 params = IF_DEF_PARAMS (ifp);
4616
4617 if (argc == 3)
4618 {
4619 ret = inet_aton(argv[2], &addr);
4620 if (!ret)
4621 {
4622 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4623 VTY_NEWLINE);
4624 return CMD_WARNING;
4625 }
4626
4627 params = ospf_get_if_params (ifp, addr);
4628 ospf_if_update_params (ifp, addr);
4629 }
4630
4631 key_id = strtol (argv[0], NULL, 10);
4632 if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4633 {
4634 vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4635 return CMD_WARNING;
4636 }
4637
4638 ck = ospf_crypt_key_new ();
4639 ck->key_id = (u_char) key_id;
4640 memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +00004641 strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +00004642
4643 ospf_crypt_key_add (params->auth_crypt, ck);
4644 SET_IF_PARAM (params, auth_crypt);
4645
4646 return CMD_SUCCESS;
4647}
4648
4649ALIAS (ip_ospf_message_digest_key,
4650 ip_ospf_message_digest_key_cmd,
4651 "ip ospf message-digest-key <1-255> md5 KEY",
4652 "IP Information\n"
4653 "OSPF interface commands\n"
4654 "Message digest authentication password (key)\n"
4655 "Key ID\n"
4656 "Use MD5 algorithm\n"
4657 "The OSPF password (key)")
4658
4659ALIAS (ip_ospf_message_digest_key,
4660 ospf_message_digest_key_cmd,
4661 "ospf message-digest-key <1-255> md5 KEY",
4662 "OSPF interface commands\n"
4663 "Message digest authentication password (key)\n"
4664 "Key ID\n"
4665 "Use MD5 algorithm\n"
4666 "The OSPF password (key)")
4667
4668DEFUN (no_ip_ospf_message_digest_key,
4669 no_ip_ospf_message_digest_key_addr_cmd,
4670 "no ip ospf message-digest-key <1-255> A.B.C.D",
4671 NO_STR
4672 "IP Information\n"
4673 "OSPF interface commands\n"
4674 "Message digest authentication password (key)\n"
4675 "Key ID\n"
4676 "Address of interface")
4677{
4678 struct interface *ifp;
4679 struct crypt_key *ck;
4680 int key_id;
4681 struct in_addr addr;
4682 int ret;
4683 struct ospf_if_params *params;
4684
4685 ifp = vty->index;
4686 params = IF_DEF_PARAMS (ifp);
4687
4688 if (argc == 2)
4689 {
4690 ret = inet_aton(argv[1], &addr);
4691 if (!ret)
4692 {
4693 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4694 VTY_NEWLINE);
4695 return CMD_WARNING;
4696 }
4697
4698 params = ospf_lookup_if_params (ifp, addr);
4699 if (params == NULL)
4700 return CMD_SUCCESS;
4701 }
4702
4703 key_id = strtol (argv[0], NULL, 10);
4704 ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4705 if (ck == NULL)
4706 {
4707 vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4708 return CMD_WARNING;
4709 }
4710
4711 ospf_crypt_key_delete (params->auth_crypt, key_id);
4712
4713 if (params != IF_DEF_PARAMS (ifp))
4714 {
4715 ospf_free_if_params (ifp, addr);
4716 ospf_if_update_params (ifp, addr);
4717 }
4718
4719 return CMD_SUCCESS;
4720}
4721
4722ALIAS (no_ip_ospf_message_digest_key,
4723 no_ip_ospf_message_digest_key_cmd,
4724 "no ip ospf message-digest-key <1-255>",
4725 NO_STR
4726 "IP Information\n"
4727 "OSPF interface commands\n"
4728 "Message digest authentication password (key)\n"
4729 "Key ID\n")
4730
4731ALIAS (no_ip_ospf_message_digest_key,
4732 no_ospf_message_digest_key_cmd,
4733 "no ospf message-digest-key <1-255>",
4734 NO_STR
4735 "OSPF interface commands\n"
4736 "Message digest authentication password (key)\n"
4737 "Key ID\n")
4738
4739DEFUN (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004740 ip_ospf_cost_u32_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004741 "ip ospf cost <1-65535> A.B.C.D",
4742 "IP Information\n"
4743 "OSPF interface commands\n"
4744 "Interface cost\n"
4745 "Cost\n"
4746 "Address of interface")
4747{
4748 struct interface *ifp = vty->index;
4749 u_int32_t cost;
4750 struct in_addr addr;
4751 int ret;
4752 struct ospf_if_params *params;
4753
4754 params = IF_DEF_PARAMS (ifp);
4755
4756 cost = strtol (argv[0], NULL, 10);
4757
4758 /* cost range is <1-65535>. */
4759 if (cost < 1 || cost > 65535)
4760 {
4761 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4762 return CMD_WARNING;
4763 }
4764
4765 if (argc == 2)
4766 {
4767 ret = inet_aton(argv[1], &addr);
4768 if (!ret)
4769 {
4770 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4771 VTY_NEWLINE);
4772 return CMD_WARNING;
4773 }
4774
4775 params = ospf_get_if_params (ifp, addr);
4776 ospf_if_update_params (ifp, addr);
4777 }
4778
4779 SET_IF_PARAM (params, output_cost_cmd);
4780 params->output_cost_cmd = cost;
4781
4782 ospf_if_recalculate_output_cost (ifp);
4783
4784 return CMD_SUCCESS;
4785}
4786
4787ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004788 ip_ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004789 "ip ospf cost <1-65535>",
4790 "IP Information\n"
4791 "OSPF interface commands\n"
4792 "Interface cost\n"
4793 "Cost")
4794
4795ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004796 ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004797 "ospf cost <1-65535>",
4798 "OSPF interface commands\n"
4799 "Interface cost\n"
4800 "Cost")
4801
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004802ALIAS (ip_ospf_cost,
4803 ospf_cost_u32_inet4_cmd,
4804 "ospf cost <1-65535> A.B.C.D",
4805 "OSPF interface commands\n"
4806 "Interface cost\n"
4807 "Cost\n"
4808 "Address of interface")
4809
paul718e3742002-12-13 20:15:29 +00004810DEFUN (no_ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004811 no_ip_ospf_cost_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004812 "no ip ospf cost A.B.C.D",
4813 NO_STR
4814 "IP Information\n"
4815 "OSPF interface commands\n"
4816 "Interface cost\n"
4817 "Address of interface")
4818{
4819 struct interface *ifp = vty->index;
4820 struct in_addr addr;
4821 int ret;
4822 struct ospf_if_params *params;
4823
4824 ifp = vty->index;
4825 params = IF_DEF_PARAMS (ifp);
4826
4827 if (argc == 1)
4828 {
4829 ret = inet_aton(argv[0], &addr);
4830 if (!ret)
4831 {
4832 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4833 VTY_NEWLINE);
4834 return CMD_WARNING;
4835 }
4836
4837 params = ospf_lookup_if_params (ifp, addr);
4838 if (params == NULL)
4839 return CMD_SUCCESS;
4840 }
4841
4842 UNSET_IF_PARAM (params, output_cost_cmd);
4843
4844 if (params != IF_DEF_PARAMS (ifp))
4845 {
4846 ospf_free_if_params (ifp, addr);
4847 ospf_if_update_params (ifp, addr);
4848 }
4849
4850 ospf_if_recalculate_output_cost (ifp);
4851
4852 return CMD_SUCCESS;
4853}
4854
4855ALIAS (no_ip_ospf_cost,
4856 no_ip_ospf_cost_cmd,
4857 "no ip ospf cost",
4858 NO_STR
4859 "IP Information\n"
4860 "OSPF interface commands\n"
4861 "Interface cost\n")
4862
4863ALIAS (no_ip_ospf_cost,
4864 no_ospf_cost_cmd,
4865 "no ospf cost",
4866 NO_STR
4867 "OSPF interface commands\n"
4868 "Interface cost\n")
4869
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004870ALIAS (no_ip_ospf_cost,
4871 no_ospf_cost_inet4_cmd,
4872 "no ospf cost A.B.C.D",
4873 NO_STR
4874 "OSPF interface commands\n"
4875 "Interface cost\n"
4876 "Address of interface")
4877
4878
paul4dadc292005-05-06 21:37:42 +00004879static void
paul718e3742002-12-13 20:15:29 +00004880ospf_nbr_timer_update (struct ospf_interface *oi)
4881{
4882 struct route_node *rn;
4883 struct ospf_neighbor *nbr;
4884
4885 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4886 if ((nbr = rn->info))
4887 {
4888 nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4889 nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4890 nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4891 nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4892 }
4893}
4894
paulf9ad9372005-10-21 00:45:17 +00004895static int
4896ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4897 const char *nbr_str,
4898 const char *fast_hello_str)
paul718e3742002-12-13 20:15:29 +00004899{
4900 struct interface *ifp = vty->index;
4901 u_int32_t seconds;
paulf9ad9372005-10-21 00:45:17 +00004902 u_char hellomult;
paul718e3742002-12-13 20:15:29 +00004903 struct in_addr addr;
4904 int ret;
4905 struct ospf_if_params *params;
4906 struct ospf_interface *oi;
4907 struct route_node *rn;
4908
4909 params = IF_DEF_PARAMS (ifp);
paulf9ad9372005-10-21 00:45:17 +00004910
4911 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004912 {
paulf9ad9372005-10-21 00:45:17 +00004913 ret = inet_aton(nbr_str, &addr);
paul718e3742002-12-13 20:15:29 +00004914 if (!ret)
4915 {
4916 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4917 VTY_NEWLINE);
4918 return CMD_WARNING;
4919 }
4920
4921 params = ospf_get_if_params (ifp, addr);
4922 ospf_if_update_params (ifp, addr);
4923 }
4924
paulf9ad9372005-10-21 00:45:17 +00004925 if (interval_str)
4926 {
4927 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
4928 1, 65535);
4929
4930 /* reset fast_hello too, just to be sure */
4931 UNSET_IF_PARAM (params, fast_hello);
4932 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
4933 }
4934 else if (fast_hello_str)
4935 {
4936 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
4937 1, 10);
4938 /* 1s dead-interval with sub-second hellos desired */
4939 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
4940 SET_IF_PARAM (params, fast_hello);
4941 params->fast_hello = hellomult;
4942 }
4943 else
4944 {
4945 vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
4946 VTY_NEWLINE);
4947 return CMD_WARNING;
4948 }
4949
paul718e3742002-12-13 20:15:29 +00004950 SET_IF_PARAM (params, v_wait);
4951 params->v_wait = seconds;
4952
4953 /* Update timer values in neighbor structure. */
paulf9ad9372005-10-21 00:45:17 +00004954 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004955 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004956 struct ospf *ospf;
4957 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00004958 {
4959 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
4960 if (oi)
4961 ospf_nbr_timer_update (oi);
4962 }
paul718e3742002-12-13 20:15:29 +00004963 }
4964 else
4965 {
4966 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
4967 if ((oi = rn->info))
4968 ospf_nbr_timer_update (oi);
4969 }
4970
4971 return CMD_SUCCESS;
4972}
4973
paulf9ad9372005-10-21 00:45:17 +00004974
4975DEFUN (ip_ospf_dead_interval,
4976 ip_ospf_dead_interval_addr_cmd,
4977 "ip ospf dead-interval <1-65535> A.B.C.D",
4978 "IP Information\n"
4979 "OSPF interface commands\n"
4980 "Interval after which a neighbor is declared dead\n"
4981 "Seconds\n"
4982 "Address of interface\n")
4983{
4984 if (argc == 2)
4985 return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
4986 else
4987 return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
4988}
4989
paul718e3742002-12-13 20:15:29 +00004990ALIAS (ip_ospf_dead_interval,
4991 ip_ospf_dead_interval_cmd,
4992 "ip ospf dead-interval <1-65535>",
4993 "IP Information\n"
4994 "OSPF interface commands\n"
4995 "Interval after which a neighbor is declared dead\n"
4996 "Seconds\n")
4997
4998ALIAS (ip_ospf_dead_interval,
4999 ospf_dead_interval_cmd,
5000 "ospf dead-interval <1-65535>",
5001 "OSPF interface commands\n"
5002 "Interval after which a neighbor is declared dead\n"
5003 "Seconds\n")
5004
paulf9ad9372005-10-21 00:45:17 +00005005DEFUN (ip_ospf_dead_interval_minimal,
5006 ip_ospf_dead_interval_minimal_addr_cmd,
5007 "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5008 "IP Information\n"
5009 "OSPF interface commands\n"
5010 "Interval after which a neighbor is declared dead\n"
5011 "Minimal 1s dead-interval with fast sub-second hellos\n"
5012 "Hello multiplier factor\n"
5013 "Number of Hellos to send each second\n"
5014 "Address of interface\n")
5015{
5016 if (argc == 2)
5017 return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5018 else
5019 return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5020}
5021
5022ALIAS (ip_ospf_dead_interval_minimal,
5023 ip_ospf_dead_interval_minimal_cmd,
5024 "ip ospf dead-interval minimal hello-multiplier <1-10>",
5025 "IP Information\n"
5026 "OSPF interface commands\n"
5027 "Interval after which a neighbor is declared dead\n"
5028 "Minimal 1s dead-interval with fast sub-second hellos\n"
5029 "Hello multiplier factor\n"
5030 "Number of Hellos to send each second\n")
5031
paul718e3742002-12-13 20:15:29 +00005032DEFUN (no_ip_ospf_dead_interval,
5033 no_ip_ospf_dead_interval_addr_cmd,
5034 "no ip ospf dead-interval A.B.C.D",
5035 NO_STR
5036 "IP Information\n"
5037 "OSPF interface commands\n"
5038 "Interval after which a neighbor is declared dead\n"
5039 "Address of interface")
5040{
5041 struct interface *ifp = vty->index;
5042 struct in_addr addr;
5043 int ret;
5044 struct ospf_if_params *params;
5045 struct ospf_interface *oi;
5046 struct route_node *rn;
paul020709f2003-04-04 02:44:16 +00005047
paul718e3742002-12-13 20:15:29 +00005048 ifp = vty->index;
5049 params = IF_DEF_PARAMS (ifp);
5050
5051 if (argc == 1)
5052 {
5053 ret = inet_aton(argv[0], &addr);
5054 if (!ret)
5055 {
5056 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5057 VTY_NEWLINE);
5058 return CMD_WARNING;
5059 }
5060
5061 params = ospf_lookup_if_params (ifp, addr);
5062 if (params == NULL)
5063 return CMD_SUCCESS;
5064 }
5065
5066 UNSET_IF_PARAM (params, v_wait);
5067 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
paulf9ad9372005-10-21 00:45:17 +00005068
5069 UNSET_IF_PARAM (params, fast_hello);
5070 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5071
paul718e3742002-12-13 20:15:29 +00005072 if (params != IF_DEF_PARAMS (ifp))
5073 {
5074 ospf_free_if_params (ifp, addr);
5075 ospf_if_update_params (ifp, addr);
5076 }
5077
5078 /* Update timer values in neighbor structure. */
5079 if (argc == 1)
5080 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005081 struct ospf *ospf;
5082
5083 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005084 {
5085 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5086 if (oi)
5087 ospf_nbr_timer_update (oi);
5088 }
paul718e3742002-12-13 20:15:29 +00005089 }
5090 else
5091 {
5092 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5093 if ((oi = rn->info))
5094 ospf_nbr_timer_update (oi);
5095 }
5096
5097 return CMD_SUCCESS;
5098}
5099
5100ALIAS (no_ip_ospf_dead_interval,
5101 no_ip_ospf_dead_interval_cmd,
5102 "no ip ospf dead-interval",
5103 NO_STR
5104 "IP Information\n"
5105 "OSPF interface commands\n"
5106 "Interval after which a neighbor is declared dead\n")
5107
5108ALIAS (no_ip_ospf_dead_interval,
5109 no_ospf_dead_interval_cmd,
5110 "no ospf dead-interval",
5111 NO_STR
5112 "OSPF interface commands\n"
5113 "Interval after which a neighbor is declared dead\n")
5114
5115DEFUN (ip_ospf_hello_interval,
5116 ip_ospf_hello_interval_addr_cmd,
5117 "ip ospf hello-interval <1-65535> A.B.C.D",
5118 "IP Information\n"
5119 "OSPF interface commands\n"
5120 "Time between HELLO packets\n"
5121 "Seconds\n"
5122 "Address of interface")
5123{
5124 struct interface *ifp = vty->index;
5125 u_int32_t seconds;
5126 struct in_addr addr;
5127 int ret;
5128 struct ospf_if_params *params;
5129
5130 params = IF_DEF_PARAMS (ifp);
5131
5132 seconds = strtol (argv[0], NULL, 10);
5133
5134 /* HelloInterval range is <1-65535>. */
5135 if (seconds < 1 || seconds > 65535)
5136 {
5137 vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5138 return CMD_WARNING;
5139 }
5140
5141 if (argc == 2)
5142 {
5143 ret = inet_aton(argv[1], &addr);
5144 if (!ret)
5145 {
5146 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5147 VTY_NEWLINE);
5148 return CMD_WARNING;
5149 }
5150
5151 params = ospf_get_if_params (ifp, addr);
5152 ospf_if_update_params (ifp, addr);
5153 }
5154
paulf9ad9372005-10-21 00:45:17 +00005155 SET_IF_PARAM (params, v_hello);
paul718e3742002-12-13 20:15:29 +00005156 params->v_hello = seconds;
5157
5158 return CMD_SUCCESS;
5159}
5160
5161ALIAS (ip_ospf_hello_interval,
5162 ip_ospf_hello_interval_cmd,
5163 "ip ospf hello-interval <1-65535>",
5164 "IP Information\n"
5165 "OSPF interface commands\n"
5166 "Time between HELLO packets\n"
5167 "Seconds\n")
5168
5169ALIAS (ip_ospf_hello_interval,
5170 ospf_hello_interval_cmd,
5171 "ospf hello-interval <1-65535>",
5172 "OSPF interface commands\n"
5173 "Time between HELLO packets\n"
5174 "Seconds\n")
5175
5176DEFUN (no_ip_ospf_hello_interval,
5177 no_ip_ospf_hello_interval_addr_cmd,
5178 "no ip ospf hello-interval A.B.C.D",
5179 NO_STR
5180 "IP Information\n"
5181 "OSPF interface commands\n"
5182 "Time between HELLO packets\n"
5183 "Address of interface")
5184{
5185 struct interface *ifp = vty->index;
5186 struct in_addr addr;
5187 int ret;
5188 struct ospf_if_params *params;
5189
5190 ifp = vty->index;
5191 params = IF_DEF_PARAMS (ifp);
5192
5193 if (argc == 1)
5194 {
5195 ret = inet_aton(argv[0], &addr);
5196 if (!ret)
5197 {
5198 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5199 VTY_NEWLINE);
5200 return CMD_WARNING;
5201 }
5202
5203 params = ospf_lookup_if_params (ifp, addr);
5204 if (params == NULL)
5205 return CMD_SUCCESS;
5206 }
5207
5208 UNSET_IF_PARAM (params, v_hello);
paulf9ad9372005-10-21 00:45:17 +00005209 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00005210
5211 if (params != IF_DEF_PARAMS (ifp))
5212 {
5213 ospf_free_if_params (ifp, addr);
5214 ospf_if_update_params (ifp, addr);
5215 }
5216
5217 return CMD_SUCCESS;
5218}
5219
5220ALIAS (no_ip_ospf_hello_interval,
5221 no_ip_ospf_hello_interval_cmd,
5222 "no ip ospf hello-interval",
5223 NO_STR
5224 "IP Information\n"
5225 "OSPF interface commands\n"
5226 "Time between HELLO packets\n")
5227
5228ALIAS (no_ip_ospf_hello_interval,
5229 no_ospf_hello_interval_cmd,
5230 "no ospf hello-interval",
5231 NO_STR
5232 "OSPF interface commands\n"
5233 "Time between HELLO packets\n")
5234
5235DEFUN (ip_ospf_network,
5236 ip_ospf_network_cmd,
5237 "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5238 "IP Information\n"
5239 "OSPF interface commands\n"
5240 "Network type\n"
5241 "Specify OSPF broadcast multi-access network\n"
5242 "Specify OSPF NBMA network\n"
5243 "Specify OSPF point-to-multipoint network\n"
5244 "Specify OSPF point-to-point network\n")
5245{
5246 struct interface *ifp = vty->index;
5247 int old_type = IF_DEF_PARAMS (ifp)->type;
5248 struct route_node *rn;
5249
5250 if (strncmp (argv[0], "b", 1) == 0)
5251 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5252 else if (strncmp (argv[0], "n", 1) == 0)
5253 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5254 else if (strncmp (argv[0], "point-to-m", 10) == 0)
5255 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5256 else if (strncmp (argv[0], "point-to-p", 10) == 0)
5257 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5258
5259 if (IF_DEF_PARAMS (ifp)->type == old_type)
5260 return CMD_SUCCESS;
5261
5262 SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5263
5264 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5265 {
5266 struct ospf_interface *oi = rn->info;
5267
5268 if (!oi)
5269 continue;
5270
5271 oi->type = IF_DEF_PARAMS (ifp)->type;
5272
5273 if (oi->state > ISM_Down)
5274 {
5275 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5276 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5277 }
5278 }
5279
5280 return CMD_SUCCESS;
5281}
5282
5283ALIAS (ip_ospf_network,
5284 ospf_network_cmd,
5285 "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5286 "OSPF interface commands\n"
5287 "Network type\n"
5288 "Specify OSPF broadcast multi-access network\n"
5289 "Specify OSPF NBMA network\n"
5290 "Specify OSPF point-to-multipoint network\n"
5291 "Specify OSPF point-to-point network\n")
5292
5293DEFUN (no_ip_ospf_network,
5294 no_ip_ospf_network_cmd,
5295 "no ip ospf network",
5296 NO_STR
5297 "IP Information\n"
5298 "OSPF interface commands\n"
5299 "Network type\n")
5300{
5301 struct interface *ifp = vty->index;
5302 int old_type = IF_DEF_PARAMS (ifp)->type;
5303 struct route_node *rn;
5304
ajsbc18d612004-12-15 15:07:19 +00005305 IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
paul718e3742002-12-13 20:15:29 +00005306
5307 if (IF_DEF_PARAMS (ifp)->type == old_type)
5308 return CMD_SUCCESS;
5309
5310 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5311 {
5312 struct ospf_interface *oi = rn->info;
5313
5314 if (!oi)
5315 continue;
5316
5317 oi->type = IF_DEF_PARAMS (ifp)->type;
5318
5319 if (oi->state > ISM_Down)
5320 {
5321 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5322 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5323 }
5324 }
5325
5326 return CMD_SUCCESS;
5327}
5328
5329ALIAS (no_ip_ospf_network,
5330 no_ospf_network_cmd,
5331 "no ospf network",
5332 NO_STR
5333 "OSPF interface commands\n"
5334 "Network type\n")
5335
5336DEFUN (ip_ospf_priority,
5337 ip_ospf_priority_addr_cmd,
5338 "ip ospf priority <0-255> A.B.C.D",
5339 "IP Information\n"
5340 "OSPF interface commands\n"
5341 "Router priority\n"
5342 "Priority\n"
5343 "Address of interface")
5344{
5345 struct interface *ifp = vty->index;
5346 u_int32_t priority;
5347 struct route_node *rn;
5348 struct in_addr addr;
5349 int ret;
5350 struct ospf_if_params *params;
5351
5352 params = IF_DEF_PARAMS (ifp);
5353
5354 priority = strtol (argv[0], NULL, 10);
5355
5356 /* Router Priority range is <0-255>. */
5357 if (priority < 0 || priority > 255)
5358 {
5359 vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5360 return CMD_WARNING;
5361 }
5362
5363 if (argc == 2)
5364 {
5365 ret = inet_aton(argv[1], &addr);
5366 if (!ret)
5367 {
5368 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5369 VTY_NEWLINE);
5370 return CMD_WARNING;
5371 }
5372
5373 params = ospf_get_if_params (ifp, addr);
5374 ospf_if_update_params (ifp, addr);
5375 }
5376
5377 SET_IF_PARAM (params, priority);
5378 params->priority = priority;
5379
5380 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5381 {
5382 struct ospf_interface *oi = rn->info;
5383
5384 if (!oi)
5385 continue;
5386
5387
5388 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5389 {
5390 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5391 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5392 }
5393 }
5394
5395 return CMD_SUCCESS;
5396}
5397
5398ALIAS (ip_ospf_priority,
5399 ip_ospf_priority_cmd,
5400 "ip ospf priority <0-255>",
5401 "IP Information\n"
5402 "OSPF interface commands\n"
5403 "Router priority\n"
5404 "Priority\n")
5405
5406ALIAS (ip_ospf_priority,
5407 ospf_priority_cmd,
5408 "ospf priority <0-255>",
5409 "OSPF interface commands\n"
5410 "Router priority\n"
5411 "Priority\n")
5412
5413DEFUN (no_ip_ospf_priority,
5414 no_ip_ospf_priority_addr_cmd,
5415 "no ip ospf priority A.B.C.D",
5416 NO_STR
5417 "IP Information\n"
5418 "OSPF interface commands\n"
5419 "Router priority\n"
5420 "Address of interface")
5421{
5422 struct interface *ifp = vty->index;
5423 struct route_node *rn;
5424 struct in_addr addr;
5425 int ret;
5426 struct ospf_if_params *params;
5427
5428 ifp = vty->index;
5429 params = IF_DEF_PARAMS (ifp);
5430
5431 if (argc == 1)
5432 {
5433 ret = inet_aton(argv[0], &addr);
5434 if (!ret)
5435 {
5436 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5437 VTY_NEWLINE);
5438 return CMD_WARNING;
5439 }
5440
5441 params = ospf_lookup_if_params (ifp, addr);
5442 if (params == NULL)
5443 return CMD_SUCCESS;
5444 }
5445
5446 UNSET_IF_PARAM (params, priority);
5447 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5448
5449 if (params != IF_DEF_PARAMS (ifp))
5450 {
5451 ospf_free_if_params (ifp, addr);
5452 ospf_if_update_params (ifp, addr);
5453 }
5454
5455 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5456 {
5457 struct ospf_interface *oi = rn->info;
5458
5459 if (!oi)
5460 continue;
5461
5462
5463 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5464 {
5465 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5466 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5467 }
5468 }
5469
5470 return CMD_SUCCESS;
5471}
5472
5473ALIAS (no_ip_ospf_priority,
5474 no_ip_ospf_priority_cmd,
5475 "no ip ospf priority",
5476 NO_STR
5477 "IP Information\n"
5478 "OSPF interface commands\n"
5479 "Router priority\n")
5480
5481ALIAS (no_ip_ospf_priority,
5482 no_ospf_priority_cmd,
5483 "no ospf priority",
5484 NO_STR
5485 "OSPF interface commands\n"
5486 "Router priority\n")
5487
5488DEFUN (ip_ospf_retransmit_interval,
5489 ip_ospf_retransmit_interval_addr_cmd,
5490 "ip ospf retransmit-interval <3-65535> A.B.C.D",
5491 "IP Information\n"
5492 "OSPF interface commands\n"
5493 "Time between retransmitting lost link state advertisements\n"
5494 "Seconds\n"
5495 "Address of interface")
5496{
5497 struct interface *ifp = vty->index;
5498 u_int32_t seconds;
5499 struct in_addr addr;
5500 int ret;
5501 struct ospf_if_params *params;
5502
5503 params = IF_DEF_PARAMS (ifp);
5504 seconds = strtol (argv[0], NULL, 10);
5505
5506 /* Retransmit Interval range is <3-65535>. */
5507 if (seconds < 3 || seconds > 65535)
5508 {
5509 vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5510 return CMD_WARNING;
5511 }
5512
5513
5514 if (argc == 2)
5515 {
5516 ret = inet_aton(argv[1], &addr);
5517 if (!ret)
5518 {
5519 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5520 VTY_NEWLINE);
5521 return CMD_WARNING;
5522 }
5523
5524 params = ospf_get_if_params (ifp, addr);
5525 ospf_if_update_params (ifp, addr);
5526 }
5527
5528 SET_IF_PARAM (params, retransmit_interval);
5529 params->retransmit_interval = seconds;
5530
5531 return CMD_SUCCESS;
5532}
5533
5534ALIAS (ip_ospf_retransmit_interval,
5535 ip_ospf_retransmit_interval_cmd,
5536 "ip ospf retransmit-interval <3-65535>",
5537 "IP Information\n"
5538 "OSPF interface commands\n"
5539 "Time between retransmitting lost link state advertisements\n"
5540 "Seconds\n")
5541
5542ALIAS (ip_ospf_retransmit_interval,
5543 ospf_retransmit_interval_cmd,
5544 "ospf retransmit-interval <3-65535>",
5545 "OSPF interface commands\n"
5546 "Time between retransmitting lost link state advertisements\n"
5547 "Seconds\n")
5548
5549DEFUN (no_ip_ospf_retransmit_interval,
5550 no_ip_ospf_retransmit_interval_addr_cmd,
5551 "no ip ospf retransmit-interval A.B.C.D",
5552 NO_STR
5553 "IP Information\n"
5554 "OSPF interface commands\n"
5555 "Time between retransmitting lost link state advertisements\n"
5556 "Address of interface")
5557{
5558 struct interface *ifp = vty->index;
5559 struct in_addr addr;
5560 int ret;
5561 struct ospf_if_params *params;
5562
5563 ifp = vty->index;
5564 params = IF_DEF_PARAMS (ifp);
5565
5566 if (argc == 1)
5567 {
5568 ret = inet_aton(argv[0], &addr);
5569 if (!ret)
5570 {
5571 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5572 VTY_NEWLINE);
5573 return CMD_WARNING;
5574 }
5575
5576 params = ospf_lookup_if_params (ifp, addr);
5577 if (params == NULL)
5578 return CMD_SUCCESS;
5579 }
5580
5581 UNSET_IF_PARAM (params, retransmit_interval);
5582 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5583
5584 if (params != IF_DEF_PARAMS (ifp))
5585 {
5586 ospf_free_if_params (ifp, addr);
5587 ospf_if_update_params (ifp, addr);
5588 }
5589
5590 return CMD_SUCCESS;
5591}
5592
5593ALIAS (no_ip_ospf_retransmit_interval,
5594 no_ip_ospf_retransmit_interval_cmd,
5595 "no ip ospf retransmit-interval",
5596 NO_STR
5597 "IP Information\n"
5598 "OSPF interface commands\n"
5599 "Time between retransmitting lost link state advertisements\n")
5600
5601ALIAS (no_ip_ospf_retransmit_interval,
5602 no_ospf_retransmit_interval_cmd,
5603 "no ospf retransmit-interval",
5604 NO_STR
5605 "OSPF interface commands\n"
5606 "Time between retransmitting lost link state advertisements\n")
5607
5608DEFUN (ip_ospf_transmit_delay,
5609 ip_ospf_transmit_delay_addr_cmd,
5610 "ip ospf transmit-delay <1-65535> A.B.C.D",
5611 "IP Information\n"
5612 "OSPF interface commands\n"
5613 "Link state transmit delay\n"
5614 "Seconds\n"
5615 "Address of interface")
5616{
5617 struct interface *ifp = vty->index;
5618 u_int32_t seconds;
5619 struct in_addr addr;
5620 int ret;
5621 struct ospf_if_params *params;
5622
5623 params = IF_DEF_PARAMS (ifp);
5624 seconds = strtol (argv[0], NULL, 10);
5625
5626 /* Transmit Delay range is <1-65535>. */
5627 if (seconds < 1 || seconds > 65535)
5628 {
5629 vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5630 return CMD_WARNING;
5631 }
5632
5633 if (argc == 2)
5634 {
5635 ret = inet_aton(argv[1], &addr);
5636 if (!ret)
5637 {
5638 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5639 VTY_NEWLINE);
5640 return CMD_WARNING;
5641 }
5642
5643 params = ospf_get_if_params (ifp, addr);
5644 ospf_if_update_params (ifp, addr);
5645 }
5646
5647 SET_IF_PARAM (params, transmit_delay);
5648 params->transmit_delay = seconds;
5649
5650 return CMD_SUCCESS;
5651}
5652
5653ALIAS (ip_ospf_transmit_delay,
5654 ip_ospf_transmit_delay_cmd,
5655 "ip ospf transmit-delay <1-65535>",
5656 "IP Information\n"
5657 "OSPF interface commands\n"
5658 "Link state transmit delay\n"
5659 "Seconds\n")
5660
5661ALIAS (ip_ospf_transmit_delay,
5662 ospf_transmit_delay_cmd,
5663 "ospf transmit-delay <1-65535>",
5664 "OSPF interface commands\n"
5665 "Link state transmit delay\n"
5666 "Seconds\n")
5667
5668DEFUN (no_ip_ospf_transmit_delay,
5669 no_ip_ospf_transmit_delay_addr_cmd,
5670 "no ip ospf transmit-delay A.B.C.D",
5671 NO_STR
5672 "IP Information\n"
5673 "OSPF interface commands\n"
5674 "Link state transmit delay\n"
5675 "Address of interface")
5676{
5677 struct interface *ifp = vty->index;
5678 struct in_addr addr;
5679 int ret;
5680 struct ospf_if_params *params;
5681
5682 ifp = vty->index;
5683 params = IF_DEF_PARAMS (ifp);
5684
5685 if (argc == 1)
5686 {
5687 ret = inet_aton(argv[0], &addr);
5688 if (!ret)
5689 {
5690 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5691 VTY_NEWLINE);
5692 return CMD_WARNING;
5693 }
5694
5695 params = ospf_lookup_if_params (ifp, addr);
5696 if (params == NULL)
5697 return CMD_SUCCESS;
5698 }
5699
5700 UNSET_IF_PARAM (params, transmit_delay);
5701 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5702
5703 if (params != IF_DEF_PARAMS (ifp))
5704 {
5705 ospf_free_if_params (ifp, addr);
5706 ospf_if_update_params (ifp, addr);
5707 }
5708
5709 return CMD_SUCCESS;
5710}
5711
5712ALIAS (no_ip_ospf_transmit_delay,
5713 no_ip_ospf_transmit_delay_cmd,
5714 "no ip ospf transmit-delay",
5715 NO_STR
5716 "IP Information\n"
5717 "OSPF interface commands\n"
5718 "Link state transmit delay\n")
5719
5720ALIAS (no_ip_ospf_transmit_delay,
5721 no_ospf_transmit_delay_cmd,
5722 "no ospf transmit-delay",
5723 NO_STR
5724 "OSPF interface commands\n"
5725 "Link state transmit delay\n")
5726
5727
5728DEFUN (ospf_redistribute_source_metric_type,
5729 ospf_redistribute_source_metric_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005730 "redistribute " QUAGGA_REDIST_STR_OSPFD
5731 " metric <0-16777214> metric-type (1|2) route-map WORD",
5732 REDIST_STR
5733 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005734 "Metric for redistributed routes\n"
5735 "OSPF default metric\n"
5736 "OSPF exterior metric type for redistributed routes\n"
5737 "Set OSPF External Type 1 metrics\n"
5738 "Set OSPF External Type 2 metrics\n"
5739 "Route map reference\n"
5740 "Pointer to route-map entries\n")
5741{
paul020709f2003-04-04 02:44:16 +00005742 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005743 int source;
5744 int type = -1;
5745 int metric = -1;
5746
5747 /* Get distribute source. */
5748 if (!str2distribute_source (argv[0], &source))
5749 return CMD_WARNING;
5750
5751 /* Get metric value. */
5752 if (argc >= 2)
5753 if (!str2metric (argv[1], &metric))
5754 return CMD_WARNING;
5755
5756 /* Get metric type. */
5757 if (argc >= 3)
5758 if (!str2metric_type (argv[2], &type))
5759 return CMD_WARNING;
5760
5761 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005762 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005763 else
paul020709f2003-04-04 02:44:16 +00005764 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005765
paul020709f2003-04-04 02:44:16 +00005766 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005767}
5768
5769ALIAS (ospf_redistribute_source_metric_type,
5770 ospf_redistribute_source_metric_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005771 "redistribute " QUAGGA_REDIST_STR_OSPFD
5772 " metric <0-16777214> metric-type (1|2)",
5773 REDIST_STR
5774 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005775 "Metric for redistributed routes\n"
5776 "OSPF default metric\n"
5777 "OSPF exterior metric type for redistributed routes\n"
5778 "Set OSPF External Type 1 metrics\n"
5779 "Set OSPF External Type 2 metrics\n")
5780
5781ALIAS (ospf_redistribute_source_metric_type,
5782 ospf_redistribute_source_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005783 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
5784 REDIST_STR
5785 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005786 "Metric for redistributed routes\n"
5787 "OSPF default metric\n")
5788
5789DEFUN (ospf_redistribute_source_type_metric,
5790 ospf_redistribute_source_type_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005791 "redistribute " QUAGGA_REDIST_STR_OSPFD
5792 " metric-type (1|2) metric <0-16777214> route-map WORD",
5793 REDIST_STR
5794 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005795 "OSPF exterior metric type for redistributed routes\n"
5796 "Set OSPF External Type 1 metrics\n"
5797 "Set OSPF External Type 2 metrics\n"
5798 "Metric for redistributed routes\n"
5799 "OSPF default metric\n"
5800 "Route map reference\n"
5801 "Pointer to route-map entries\n")
5802{
paul020709f2003-04-04 02:44:16 +00005803 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005804 int source;
5805 int type = -1;
5806 int metric = -1;
5807
5808 /* Get distribute source. */
5809 if (!str2distribute_source (argv[0], &source))
5810 return CMD_WARNING;
5811
5812 /* Get metric value. */
5813 if (argc >= 2)
5814 if (!str2metric_type (argv[1], &type))
5815 return CMD_WARNING;
5816
5817 /* Get metric type. */
5818 if (argc >= 3)
5819 if (!str2metric (argv[2], &metric))
5820 return CMD_WARNING;
5821
5822 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005823 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005824 else
paul020709f2003-04-04 02:44:16 +00005825 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005826
paul020709f2003-04-04 02:44:16 +00005827 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005828}
5829
5830ALIAS (ospf_redistribute_source_type_metric,
5831 ospf_redistribute_source_type_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005832 "redistribute " QUAGGA_REDIST_STR_OSPFD
5833 " metric-type (1|2) metric <0-16777214>",
5834 REDIST_STR
5835 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005836 "OSPF exterior metric type for redistributed routes\n"
5837 "Set OSPF External Type 1 metrics\n"
5838 "Set OSPF External Type 2 metrics\n"
5839 "Metric for redistributed routes\n"
5840 "OSPF default metric\n")
5841
5842ALIAS (ospf_redistribute_source_type_metric,
5843 ospf_redistribute_source_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005844 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
5845 REDIST_STR
5846 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005847 "OSPF exterior metric type for redistributed routes\n"
5848 "Set OSPF External Type 1 metrics\n"
5849 "Set OSPF External Type 2 metrics\n")
5850
5851ALIAS (ospf_redistribute_source_type_metric,
5852 ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005853 "redistribute " QUAGGA_REDIST_STR_OSPFD,
5854 REDIST_STR
5855 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005856
5857DEFUN (ospf_redistribute_source_metric_routemap,
5858 ospf_redistribute_source_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005859 "redistribute " QUAGGA_REDIST_STR_OSPFD
5860 " metric <0-16777214> route-map WORD",
5861 REDIST_STR
5862 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005863 "Metric for redistributed routes\n"
5864 "OSPF default metric\n"
5865 "Route map reference\n"
5866 "Pointer to route-map entries\n")
5867{
paul020709f2003-04-04 02:44:16 +00005868 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005869 int source;
5870 int metric = -1;
5871
5872 /* Get distribute source. */
5873 if (!str2distribute_source (argv[0], &source))
5874 return CMD_WARNING;
5875
5876 /* Get metric value. */
5877 if (argc >= 2)
5878 if (!str2metric (argv[1], &metric))
5879 return CMD_WARNING;
5880
5881 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005882 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005883 else
paul020709f2003-04-04 02:44:16 +00005884 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005885
paul020709f2003-04-04 02:44:16 +00005886 return ospf_redistribute_set (ospf, source, -1, metric);
paul718e3742002-12-13 20:15:29 +00005887}
5888
5889DEFUN (ospf_redistribute_source_type_routemap,
5890 ospf_redistribute_source_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005891 "redistribute " QUAGGA_REDIST_STR_OSPFD
5892 " metric-type (1|2) route-map WORD",
5893 REDIST_STR
5894 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005895 "OSPF exterior metric type for redistributed routes\n"
5896 "Set OSPF External Type 1 metrics\n"
5897 "Set OSPF External Type 2 metrics\n"
5898 "Route map reference\n"
5899 "Pointer to route-map entries\n")
5900{
paul020709f2003-04-04 02:44:16 +00005901 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005902 int source;
5903 int type = -1;
5904
5905 /* Get distribute source. */
5906 if (!str2distribute_source (argv[0], &source))
5907 return CMD_WARNING;
5908
5909 /* Get metric value. */
5910 if (argc >= 2)
5911 if (!str2metric_type (argv[1], &type))
5912 return CMD_WARNING;
5913
5914 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005915 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005916 else
paul020709f2003-04-04 02:44:16 +00005917 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005918
paul020709f2003-04-04 02:44:16 +00005919 return ospf_redistribute_set (ospf, source, type, -1);
paul718e3742002-12-13 20:15:29 +00005920}
5921
5922DEFUN (ospf_redistribute_source_routemap,
5923 ospf_redistribute_source_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005924 "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
5925 REDIST_STR
5926 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005927 "Route map reference\n"
5928 "Pointer to route-map entries\n")
5929{
paul020709f2003-04-04 02:44:16 +00005930 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005931 int source;
5932
5933 /* Get distribute source. */
5934 if (!str2distribute_source (argv[0], &source))
5935 return CMD_WARNING;
5936
5937 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00005938 ospf_routemap_set (ospf, source, argv[1]);
paul718e3742002-12-13 20:15:29 +00005939 else
paul020709f2003-04-04 02:44:16 +00005940 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005941
paul020709f2003-04-04 02:44:16 +00005942 return ospf_redistribute_set (ospf, source, -1, -1);
paul718e3742002-12-13 20:15:29 +00005943}
5944
5945DEFUN (no_ospf_redistribute_source,
5946 no_ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005947 "no redistribute " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005948 NO_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005949 REDIST_STR
5950 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005951{
paul020709f2003-04-04 02:44:16 +00005952 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005953 int source;
5954
5955 if (!str2distribute_source (argv[0], &source))
5956 return CMD_WARNING;
5957
paul020709f2003-04-04 02:44:16 +00005958 ospf_routemap_unset (ospf, source);
5959 return ospf_redistribute_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005960}
5961
5962DEFUN (ospf_distribute_list_out,
5963 ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005964 "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005965 "Filter networks in routing updates\n"
5966 "Access-list name\n"
5967 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005968 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005969{
paul68980082003-03-25 05:07:42 +00005970 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005971 int source;
5972
5973 /* Get distribute source. */
5974 if (!str2distribute_source (argv[1], &source))
5975 return CMD_WARNING;
5976
paul68980082003-03-25 05:07:42 +00005977 return ospf_distribute_list_out_set (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005978}
5979
5980DEFUN (no_ospf_distribute_list_out,
5981 no_ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005982 "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005983 NO_STR
5984 "Filter networks in routing updates\n"
5985 "Access-list name\n"
5986 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005987 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005988{
paul68980082003-03-25 05:07:42 +00005989 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005990 int source;
5991
5992 if (!str2distribute_source (argv[1], &source))
5993 return CMD_WARNING;
5994
paul68980082003-03-25 05:07:42 +00005995 return ospf_distribute_list_out_unset (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005996}
5997
5998/* Default information originate. */
5999DEFUN (ospf_default_information_originate_metric_type_routemap,
6000 ospf_default_information_originate_metric_type_routemap_cmd,
6001 "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
6002 "Control distribution of default information\n"
6003 "Distribute a default route\n"
6004 "OSPF default metric\n"
6005 "OSPF metric\n"
6006 "OSPF metric type for default routes\n"
6007 "Set OSPF External Type 1 metrics\n"
6008 "Set OSPF External Type 2 metrics\n"
6009 "Route map reference\n"
6010 "Pointer to route-map entries\n")
6011{
paul020709f2003-04-04 02:44:16 +00006012 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006013 int type = -1;
6014 int metric = -1;
6015
6016 /* Get metric value. */
6017 if (argc >= 1)
6018 if (!str2metric (argv[0], &metric))
6019 return CMD_WARNING;
6020
6021 /* Get metric type. */
6022 if (argc >= 2)
6023 if (!str2metric_type (argv[1], &type))
6024 return CMD_WARNING;
6025
6026 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006027 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006028 else
paul020709f2003-04-04 02:44:16 +00006029 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006030
paul020709f2003-04-04 02:44:16 +00006031 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6032 type, metric);
paul718e3742002-12-13 20:15:29 +00006033}
6034
6035ALIAS (ospf_default_information_originate_metric_type_routemap,
6036 ospf_default_information_originate_metric_type_cmd,
6037 "default-information originate metric <0-16777214> metric-type (1|2)",
6038 "Control distribution of default information\n"
6039 "Distribute a default route\n"
6040 "OSPF default metric\n"
6041 "OSPF metric\n"
6042 "OSPF metric type for default routes\n"
6043 "Set OSPF External Type 1 metrics\n"
6044 "Set OSPF External Type 2 metrics\n")
6045
6046ALIAS (ospf_default_information_originate_metric_type_routemap,
6047 ospf_default_information_originate_metric_cmd,
6048 "default-information originate metric <0-16777214>",
6049 "Control distribution of default information\n"
6050 "Distribute a default route\n"
6051 "OSPF default metric\n"
6052 "OSPF metric\n")
6053
6054ALIAS (ospf_default_information_originate_metric_type_routemap,
6055 ospf_default_information_originate_cmd,
6056 "default-information originate",
6057 "Control distribution of default information\n"
6058 "Distribute a default route\n")
6059
6060/* Default information originate. */
6061DEFUN (ospf_default_information_originate_metric_routemap,
6062 ospf_default_information_originate_metric_routemap_cmd,
6063 "default-information originate metric <0-16777214> route-map WORD",
6064 "Control distribution of default information\n"
6065 "Distribute a default route\n"
6066 "OSPF default metric\n"
6067 "OSPF metric\n"
6068 "Route map reference\n"
6069 "Pointer to route-map entries\n")
6070{
paul020709f2003-04-04 02:44:16 +00006071 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006072 int metric = -1;
6073
6074 /* Get metric value. */
6075 if (argc >= 1)
6076 if (!str2metric (argv[0], &metric))
6077 return CMD_WARNING;
6078
6079 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006080 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006081 else
paul020709f2003-04-04 02:44:16 +00006082 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006083
paul020709f2003-04-04 02:44:16 +00006084 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6085 -1, metric);
paul718e3742002-12-13 20:15:29 +00006086}
6087
6088/* Default information originate. */
6089DEFUN (ospf_default_information_originate_routemap,
6090 ospf_default_information_originate_routemap_cmd,
6091 "default-information originate route-map WORD",
6092 "Control distribution of default information\n"
6093 "Distribute a default route\n"
6094 "Route map reference\n"
6095 "Pointer to route-map entries\n")
6096{
paul020709f2003-04-04 02:44:16 +00006097 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006098
paul020709f2003-04-04 02:44:16 +00006099 if (argc == 1)
6100 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6101 else
6102 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6103
6104 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
paul718e3742002-12-13 20:15:29 +00006105}
6106
6107DEFUN (ospf_default_information_originate_type_metric_routemap,
6108 ospf_default_information_originate_type_metric_routemap_cmd,
6109 "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
6110 "Control distribution of default information\n"
6111 "Distribute a default route\n"
6112 "OSPF metric type for default routes\n"
6113 "Set OSPF External Type 1 metrics\n"
6114 "Set OSPF External Type 2 metrics\n"
6115 "OSPF default metric\n"
6116 "OSPF metric\n"
6117 "Route map reference\n"
6118 "Pointer to route-map entries\n")
6119{
paul020709f2003-04-04 02:44:16 +00006120 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006121 int type = -1;
6122 int metric = -1;
6123
6124 /* Get metric type. */
6125 if (argc >= 1)
6126 if (!str2metric_type (argv[0], &type))
6127 return CMD_WARNING;
6128
6129 /* Get metric value. */
6130 if (argc >= 2)
6131 if (!str2metric (argv[1], &metric))
6132 return CMD_WARNING;
6133
6134 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006135 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006136 else
paul020709f2003-04-04 02:44:16 +00006137 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006138
paul020709f2003-04-04 02:44:16 +00006139 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6140 type, metric);
paul718e3742002-12-13 20:15:29 +00006141}
6142
6143ALIAS (ospf_default_information_originate_type_metric_routemap,
6144 ospf_default_information_originate_type_metric_cmd,
6145 "default-information originate metric-type (1|2) metric <0-16777214>",
6146 "Control distribution of default information\n"
6147 "Distribute a default route\n"
6148 "OSPF metric type for default routes\n"
6149 "Set OSPF External Type 1 metrics\n"
6150 "Set OSPF External Type 2 metrics\n"
6151 "OSPF default metric\n"
6152 "OSPF metric\n")
6153
6154ALIAS (ospf_default_information_originate_type_metric_routemap,
6155 ospf_default_information_originate_type_cmd,
6156 "default-information originate metric-type (1|2)",
6157 "Control distribution of default information\n"
6158 "Distribute a default route\n"
6159 "OSPF metric type for default routes\n"
6160 "Set OSPF External Type 1 metrics\n"
6161 "Set OSPF External Type 2 metrics\n")
6162
6163DEFUN (ospf_default_information_originate_type_routemap,
6164 ospf_default_information_originate_type_routemap_cmd,
6165 "default-information originate metric-type (1|2) route-map WORD",
6166 "Control distribution of default information\n"
6167 "Distribute a default route\n"
6168 "OSPF metric type for default routes\n"
6169 "Set OSPF External Type 1 metrics\n"
6170 "Set OSPF External Type 2 metrics\n"
6171 "Route map reference\n"
6172 "Pointer to route-map entries\n")
6173{
paul020709f2003-04-04 02:44:16 +00006174 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006175 int type = -1;
6176
6177 /* Get metric type. */
6178 if (argc >= 1)
6179 if (!str2metric_type (argv[0], &type))
6180 return CMD_WARNING;
6181
6182 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006183 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006184 else
paul020709f2003-04-04 02:44:16 +00006185 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006186
paul020709f2003-04-04 02:44:16 +00006187 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6188 type, -1);
paul718e3742002-12-13 20:15:29 +00006189}
6190
6191DEFUN (ospf_default_information_originate_always_metric_type_routemap,
6192 ospf_default_information_originate_always_metric_type_routemap_cmd,
6193 "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
6194 "Control distribution of default information\n"
6195 "Distribute a default route\n"
6196 "Always advertise default route\n"
6197 "OSPF default metric\n"
6198 "OSPF metric\n"
6199 "OSPF metric type for default routes\n"
6200 "Set OSPF External Type 1 metrics\n"
6201 "Set OSPF External Type 2 metrics\n"
6202 "Route map reference\n"
6203 "Pointer to route-map entries\n")
6204{
paul020709f2003-04-04 02:44:16 +00006205 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006206 int type = -1;
6207 int metric = -1;
6208
6209 /* Get metric value. */
6210 if (argc >= 1)
6211 if (!str2metric (argv[0], &metric))
6212 return CMD_WARNING;
6213
6214 /* Get metric type. */
6215 if (argc >= 2)
6216 if (!str2metric_type (argv[1], &type))
6217 return CMD_WARNING;
6218
6219 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006220 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006221 else
paul020709f2003-04-04 02:44:16 +00006222 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006223
paul020709f2003-04-04 02:44:16 +00006224 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006225 type, metric);
6226}
6227
6228ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6229 ospf_default_information_originate_always_metric_type_cmd,
6230 "default-information originate always metric <0-16777214> metric-type (1|2)",
6231 "Control distribution of default information\n"
6232 "Distribute a default route\n"
6233 "Always advertise default route\n"
6234 "OSPF default metric\n"
6235 "OSPF metric\n"
6236 "OSPF metric type for default routes\n"
6237 "Set OSPF External Type 1 metrics\n"
6238 "Set OSPF External Type 2 metrics\n")
6239
6240ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6241 ospf_default_information_originate_always_metric_cmd,
6242 "default-information originate always metric <0-16777214>",
6243 "Control distribution of default information\n"
6244 "Distribute a default route\n"
6245 "Always advertise default route\n"
6246 "OSPF default metric\n"
6247 "OSPF metric\n"
6248 "OSPF metric type for default routes\n")
6249
6250ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6251 ospf_default_information_originate_always_cmd,
6252 "default-information originate always",
6253 "Control distribution of default information\n"
6254 "Distribute a default route\n"
6255 "Always advertise default route\n")
6256
6257DEFUN (ospf_default_information_originate_always_metric_routemap,
6258 ospf_default_information_originate_always_metric_routemap_cmd,
6259 "default-information originate always metric <0-16777214> route-map WORD",
6260 "Control distribution of default information\n"
6261 "Distribute a default route\n"
6262 "Always advertise default route\n"
6263 "OSPF default metric\n"
6264 "OSPF metric\n"
6265 "Route map reference\n"
6266 "Pointer to route-map entries\n")
6267{
paul020709f2003-04-04 02:44:16 +00006268 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006269 int metric = -1;
6270
6271 /* Get metric value. */
6272 if (argc >= 1)
6273 if (!str2metric (argv[0], &metric))
6274 return CMD_WARNING;
6275
6276 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006277 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006278 else
paul020709f2003-04-04 02:44:16 +00006279 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006280
paul020709f2003-04-04 02:44:16 +00006281 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6282 -1, metric);
paul718e3742002-12-13 20:15:29 +00006283}
6284
6285DEFUN (ospf_default_information_originate_always_routemap,
6286 ospf_default_information_originate_always_routemap_cmd,
6287 "default-information originate always route-map WORD",
6288 "Control distribution of default information\n"
6289 "Distribute a default route\n"
6290 "Always advertise default route\n"
6291 "Route map reference\n"
6292 "Pointer to route-map entries\n")
6293{
paul020709f2003-04-04 02:44:16 +00006294 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006295
paul020709f2003-04-04 02:44:16 +00006296 if (argc == 1)
6297 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6298 else
6299 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6300
6301 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
paul718e3742002-12-13 20:15:29 +00006302}
6303
6304DEFUN (ospf_default_information_originate_always_type_metric_routemap,
6305 ospf_default_information_originate_always_type_metric_routemap_cmd,
6306 "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
6307 "Control distribution of default information\n"
6308 "Distribute a default route\n"
6309 "Always advertise default route\n"
6310 "OSPF metric type for default routes\n"
6311 "Set OSPF External Type 1 metrics\n"
6312 "Set OSPF External Type 2 metrics\n"
6313 "OSPF default metric\n"
6314 "OSPF metric\n"
6315 "Route map reference\n"
6316 "Pointer to route-map entries\n")
6317{
paul020709f2003-04-04 02:44:16 +00006318 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006319 int type = -1;
6320 int metric = -1;
6321
6322 /* Get metric type. */
6323 if (argc >= 1)
6324 if (!str2metric_type (argv[0], &type))
6325 return CMD_WARNING;
6326
6327 /* Get metric value. */
6328 if (argc >= 2)
6329 if (!str2metric (argv[1], &metric))
6330 return CMD_WARNING;
6331
6332 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006333 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006334 else
paul020709f2003-04-04 02:44:16 +00006335 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006336
paul020709f2003-04-04 02:44:16 +00006337 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006338 type, metric);
6339}
6340
6341ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6342 ospf_default_information_originate_always_type_metric_cmd,
6343 "default-information originate always metric-type (1|2) metric <0-16777214>",
6344 "Control distribution of default information\n"
6345 "Distribute a default route\n"
6346 "Always advertise default route\n"
6347 "OSPF metric type for default routes\n"
6348 "Set OSPF External Type 1 metrics\n"
6349 "Set OSPF External Type 2 metrics\n"
6350 "OSPF default metric\n"
6351 "OSPF metric\n")
6352
6353ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6354 ospf_default_information_originate_always_type_cmd,
6355 "default-information originate always metric-type (1|2)",
6356 "Control distribution of default information\n"
6357 "Distribute a default route\n"
6358 "Always advertise default route\n"
6359 "OSPF metric type for default routes\n"
6360 "Set OSPF External Type 1 metrics\n"
6361 "Set OSPF External Type 2 metrics\n")
6362
6363DEFUN (ospf_default_information_originate_always_type_routemap,
6364 ospf_default_information_originate_always_type_routemap_cmd,
6365 "default-information originate always metric-type (1|2) route-map WORD",
6366 "Control distribution of default information\n"
6367 "Distribute a default route\n"
6368 "Always advertise default route\n"
6369 "OSPF metric type for default routes\n"
6370 "Set OSPF External Type 1 metrics\n"
6371 "Set OSPF External Type 2 metrics\n"
6372 "Route map reference\n"
6373 "Pointer to route-map entries\n")
6374{
paul020709f2003-04-04 02:44:16 +00006375 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006376 int type = -1;
6377
6378 /* Get metric type. */
6379 if (argc >= 1)
6380 if (!str2metric_type (argv[0], &type))
6381 return CMD_WARNING;
6382
6383 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006384 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006385 else
paul020709f2003-04-04 02:44:16 +00006386 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006387
paul020709f2003-04-04 02:44:16 +00006388 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006389 type, -1);
6390}
6391
6392DEFUN (no_ospf_default_information_originate,
6393 no_ospf_default_information_originate_cmd,
6394 "no default-information originate",
6395 NO_STR
6396 "Control distribution of default information\n"
6397 "Distribute a default route\n")
6398{
paul68980082003-03-25 05:07:42 +00006399 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006400 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00006401
6402 p.family = AF_INET;
6403 p.prefix.s_addr = 0;
6404 p.prefixlen = 0;
6405
ajs5339cfd2005-09-19 13:28:05 +00006406 ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
paul718e3742002-12-13 20:15:29 +00006407
6408 if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6409 ospf_external_info_delete (DEFAULT_ROUTE, p);
6410 route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6411 EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6412 }
6413
paul020709f2003-04-04 02:44:16 +00006414 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6415 return ospf_redistribute_default_unset (ospf);
paul718e3742002-12-13 20:15:29 +00006416}
6417
6418DEFUN (ospf_default_metric,
6419 ospf_default_metric_cmd,
6420 "default-metric <0-16777214>",
6421 "Set metric of redistributed routes\n"
6422 "Default metric\n")
6423{
paul68980082003-03-25 05:07:42 +00006424 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006425 int metric = -1;
6426
6427 if (!str2metric (argv[0], &metric))
6428 return CMD_WARNING;
6429
paul68980082003-03-25 05:07:42 +00006430 ospf->default_metric = metric;
paul718e3742002-12-13 20:15:29 +00006431
6432 return CMD_SUCCESS;
6433}
6434
6435DEFUN (no_ospf_default_metric,
6436 no_ospf_default_metric_cmd,
6437 "no default-metric",
6438 NO_STR
6439 "Set metric of redistributed routes\n")
6440{
paul68980082003-03-25 05:07:42 +00006441 struct ospf *ospf = vty->index;
6442
6443 ospf->default_metric = -1;
6444
paul718e3742002-12-13 20:15:29 +00006445 return CMD_SUCCESS;
6446}
6447
6448ALIAS (no_ospf_default_metric,
6449 no_ospf_default_metric_val_cmd,
6450 "no default-metric <0-16777214>",
6451 NO_STR
6452 "Set metric of redistributed routes\n"
6453 "Default metric\n")
6454
6455DEFUN (ospf_distance,
6456 ospf_distance_cmd,
6457 "distance <1-255>",
6458 "Define an administrative distance\n"
6459 "OSPF Administrative distance\n")
6460{
paul68980082003-03-25 05:07:42 +00006461 struct ospf *ospf = vty->index;
6462
6463 ospf->distance_all = atoi (argv[0]);
6464
paul718e3742002-12-13 20:15:29 +00006465 return CMD_SUCCESS;
6466}
6467
6468DEFUN (no_ospf_distance,
6469 no_ospf_distance_cmd,
6470 "no distance <1-255>",
6471 NO_STR
6472 "Define an administrative distance\n"
6473 "OSPF Administrative distance\n")
6474{
paul68980082003-03-25 05:07:42 +00006475 struct ospf *ospf = vty->index;
6476
6477 ospf->distance_all = 0;
6478
paul718e3742002-12-13 20:15:29 +00006479 return CMD_SUCCESS;
6480}
6481
6482DEFUN (no_ospf_distance_ospf,
6483 no_ospf_distance_ospf_cmd,
6484 "no distance ospf",
6485 NO_STR
6486 "Define an administrative distance\n"
6487 "OSPF Administrative distance\n"
6488 "OSPF Distance\n")
6489{
paul68980082003-03-25 05:07:42 +00006490 struct ospf *ospf = vty->index;
6491
6492 ospf->distance_intra = 0;
6493 ospf->distance_inter = 0;
6494 ospf->distance_external = 0;
6495
paul718e3742002-12-13 20:15:29 +00006496 return CMD_SUCCESS;
6497}
6498
6499DEFUN (ospf_distance_ospf_intra,
6500 ospf_distance_ospf_intra_cmd,
6501 "distance ospf intra-area <1-255>",
6502 "Define an administrative distance\n"
6503 "OSPF Administrative distance\n"
6504 "Intra-area routes\n"
6505 "Distance for intra-area routes\n")
6506{
paul68980082003-03-25 05:07:42 +00006507 struct ospf *ospf = vty->index;
6508
6509 ospf->distance_intra = atoi (argv[0]);
6510
paul718e3742002-12-13 20:15:29 +00006511 return CMD_SUCCESS;
6512}
6513
6514DEFUN (ospf_distance_ospf_intra_inter,
6515 ospf_distance_ospf_intra_inter_cmd,
6516 "distance ospf intra-area <1-255> inter-area <1-255>",
6517 "Define an administrative distance\n"
6518 "OSPF Administrative distance\n"
6519 "Intra-area routes\n"
6520 "Distance for intra-area routes\n"
6521 "Inter-area routes\n"
6522 "Distance for inter-area routes\n")
6523{
paul68980082003-03-25 05:07:42 +00006524 struct ospf *ospf = vty->index;
6525
6526 ospf->distance_intra = atoi (argv[0]);
6527 ospf->distance_inter = atoi (argv[1]);
6528
paul718e3742002-12-13 20:15:29 +00006529 return CMD_SUCCESS;
6530}
6531
6532DEFUN (ospf_distance_ospf_intra_external,
6533 ospf_distance_ospf_intra_external_cmd,
6534 "distance ospf intra-area <1-255> external <1-255>",
6535 "Define an administrative distance\n"
6536 "OSPF Administrative distance\n"
6537 "Intra-area routes\n"
6538 "Distance for intra-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_intra = 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_intra_inter_external,
6551 ospf_distance_ospf_intra_inter_external_cmd,
6552 "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
6553 "Define an administrative distance\n"
6554 "OSPF Administrative distance\n"
6555 "Intra-area routes\n"
6556 "Distance for intra-area routes\n"
6557 "Inter-area routes\n"
6558 "Distance for inter-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_intra = atoi (argv[0]);
6565 ospf->distance_inter = 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_intra_external_inter,
6572 ospf_distance_ospf_intra_external_inter_cmd,
6573 "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
6574 "Define an administrative distance\n"
6575 "OSPF Administrative distance\n"
6576 "Intra-area routes\n"
6577 "Distance for intra-area routes\n"
6578 "External routes\n"
6579 "Distance for external routes\n"
6580 "Inter-area routes\n"
6581 "Distance for inter-area routes\n")
6582{
paul68980082003-03-25 05:07:42 +00006583 struct ospf *ospf = vty->index;
6584
6585 ospf->distance_intra = atoi (argv[0]);
6586 ospf->distance_external = atoi (argv[1]);
6587 ospf->distance_inter = atoi (argv[2]);
6588
paul718e3742002-12-13 20:15:29 +00006589 return CMD_SUCCESS;
6590}
6591
6592DEFUN (ospf_distance_ospf_inter,
6593 ospf_distance_ospf_inter_cmd,
6594 "distance ospf inter-area <1-255>",
6595 "Define an administrative distance\n"
6596 "OSPF Administrative distance\n"
6597 "Inter-area routes\n"
6598 "Distance for inter-area routes\n")
6599{
paul68980082003-03-25 05:07:42 +00006600 struct ospf *ospf = vty->index;
6601
6602 ospf->distance_inter = atoi (argv[0]);
6603
paul718e3742002-12-13 20:15:29 +00006604 return CMD_SUCCESS;
6605}
6606
6607DEFUN (ospf_distance_ospf_inter_intra,
6608 ospf_distance_ospf_inter_intra_cmd,
6609 "distance ospf inter-area <1-255> intra-area <1-255>",
6610 "Define an administrative distance\n"
6611 "OSPF Administrative distance\n"
6612 "Inter-area routes\n"
6613 "Distance for inter-area 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_inter = 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_inter_external,
6626 ospf_distance_ospf_inter_external_cmd,
6627 "distance ospf inter-area <1-255> external <1-255>",
6628 "Define an administrative distance\n"
6629 "OSPF Administrative distance\n"
6630 "Inter-area routes\n"
6631 "Distance for inter-area routes\n"
6632 "External routes\n"
6633 "Distance for external routes\n")
6634{
paul68980082003-03-25 05:07:42 +00006635 struct ospf *ospf = vty->index;
6636
6637 ospf->distance_inter = atoi (argv[0]);
6638 ospf->distance_external = atoi (argv[1]);
6639
paul718e3742002-12-13 20:15:29 +00006640 return CMD_SUCCESS;
6641}
6642
6643DEFUN (ospf_distance_ospf_inter_intra_external,
6644 ospf_distance_ospf_inter_intra_external_cmd,
6645 "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
6646 "Define an administrative distance\n"
6647 "OSPF Administrative distance\n"
6648 "Inter-area routes\n"
6649 "Distance for inter-area routes\n"
6650 "Intra-area routes\n"
6651 "Distance for intra-area routes\n"
6652 "External routes\n"
6653 "Distance for external routes\n")
6654{
paul68980082003-03-25 05:07:42 +00006655 struct ospf *ospf = vty->index;
6656
6657 ospf->distance_inter = atoi (argv[0]);
6658 ospf->distance_intra = atoi (argv[1]);
6659 ospf->distance_external = atoi (argv[2]);
6660
paul718e3742002-12-13 20:15:29 +00006661 return CMD_SUCCESS;
6662}
6663
6664DEFUN (ospf_distance_ospf_inter_external_intra,
6665 ospf_distance_ospf_inter_external_intra_cmd,
6666 "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
6667 "Define an administrative distance\n"
6668 "OSPF Administrative distance\n"
6669 "Inter-area routes\n"
6670 "Distance for inter-area routes\n"
6671 "External routes\n"
6672 "Distance for external 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_inter = atoi (argv[0]);
6679 ospf->distance_external = 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_ospf_external,
6686 ospf_distance_ospf_external_cmd,
6687 "distance ospf external <1-255>",
6688 "Define an administrative distance\n"
6689 "OSPF Administrative distance\n"
6690 "External routes\n"
6691 "Distance for external routes\n")
6692{
paul68980082003-03-25 05:07:42 +00006693 struct ospf *ospf = vty->index;
6694
6695 ospf->distance_external = atoi (argv[0]);
6696
paul718e3742002-12-13 20:15:29 +00006697 return CMD_SUCCESS;
6698}
6699
6700DEFUN (ospf_distance_ospf_external_intra,
6701 ospf_distance_ospf_external_intra_cmd,
6702 "distance ospf external <1-255> intra-area <1-255>",
6703 "Define an administrative distance\n"
6704 "OSPF Administrative distance\n"
6705 "External routes\n"
6706 "Distance for external routes\n"
6707 "Intra-area routes\n"
6708 "Distance for intra-area routes\n")
6709{
paul68980082003-03-25 05:07:42 +00006710 struct ospf *ospf = vty->index;
6711
6712 ospf->distance_external = atoi (argv[0]);
6713 ospf->distance_intra = atoi (argv[1]);
6714
paul718e3742002-12-13 20:15:29 +00006715 return CMD_SUCCESS;
6716}
6717
6718DEFUN (ospf_distance_ospf_external_inter,
6719 ospf_distance_ospf_external_inter_cmd,
6720 "distance ospf external <1-255> inter-area <1-255>",
6721 "Define an administrative distance\n"
6722 "OSPF Administrative distance\n"
6723 "External routes\n"
6724 "Distance for external routes\n"
6725 "Inter-area routes\n"
6726 "Distance for inter-area routes\n")
6727{
paul68980082003-03-25 05:07:42 +00006728 struct ospf *ospf = vty->index;
6729
6730 ospf->distance_external = atoi (argv[0]);
6731 ospf->distance_inter = atoi (argv[1]);
6732
paul718e3742002-12-13 20:15:29 +00006733 return CMD_SUCCESS;
6734}
6735
6736DEFUN (ospf_distance_ospf_external_intra_inter,
6737 ospf_distance_ospf_external_intra_inter_cmd,
6738 "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
6739 "Define an administrative distance\n"
6740 "OSPF Administrative distance\n"
6741 "External routes\n"
6742 "Distance for external routes\n"
6743 "Intra-area routes\n"
6744 "Distance for intra-area routes\n"
6745 "Inter-area routes\n"
6746 "Distance for inter-area routes\n")
6747{
paul68980082003-03-25 05:07:42 +00006748 struct ospf *ospf = vty->index;
6749
6750 ospf->distance_external = atoi (argv[0]);
6751 ospf->distance_intra = atoi (argv[1]);
6752 ospf->distance_inter = atoi (argv[2]);
6753
paul718e3742002-12-13 20:15:29 +00006754 return CMD_SUCCESS;
6755}
6756
6757DEFUN (ospf_distance_ospf_external_inter_intra,
6758 ospf_distance_ospf_external_inter_intra_cmd,
6759 "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
6760 "Define an administrative distance\n"
6761 "OSPF Administrative distance\n"
6762 "External routes\n"
6763 "Distance for external routes\n"
6764 "Inter-area routes\n"
6765 "Distance for inter-area routes\n"
6766 "Intra-area routes\n"
6767 "Distance for intra-area routes\n")
6768{
paul68980082003-03-25 05:07:42 +00006769 struct ospf *ospf = vty->index;
6770
6771 ospf->distance_external = atoi (argv[0]);
6772 ospf->distance_inter = atoi (argv[1]);
6773 ospf->distance_intra = atoi (argv[2]);
6774
paul718e3742002-12-13 20:15:29 +00006775 return CMD_SUCCESS;
6776}
6777
6778DEFUN (ospf_distance_source,
6779 ospf_distance_source_cmd,
6780 "distance <1-255> A.B.C.D/M",
6781 "Administrative distance\n"
6782 "Distance value\n"
6783 "IP source prefix\n")
6784{
paul020709f2003-04-04 02:44:16 +00006785 struct ospf *ospf = vty->index;
6786
6787 ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
paul68980082003-03-25 05:07:42 +00006788
paul718e3742002-12-13 20:15:29 +00006789 return CMD_SUCCESS;
6790}
6791
6792DEFUN (no_ospf_distance_source,
6793 no_ospf_distance_source_cmd,
6794 "no distance <1-255> A.B.C.D/M",
6795 NO_STR
6796 "Administrative distance\n"
6797 "Distance value\n"
6798 "IP source prefix\n")
6799{
paul020709f2003-04-04 02:44:16 +00006800 struct ospf *ospf = vty->index;
6801
6802 ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6803
paul718e3742002-12-13 20:15:29 +00006804 return CMD_SUCCESS;
6805}
6806
6807DEFUN (ospf_distance_source_access_list,
6808 ospf_distance_source_access_list_cmd,
6809 "distance <1-255> A.B.C.D/M WORD",
6810 "Administrative distance\n"
6811 "Distance value\n"
6812 "IP source prefix\n"
6813 "Access list name\n")
6814{
paul020709f2003-04-04 02:44:16 +00006815 struct ospf *ospf = vty->index;
6816
6817 ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6818
paul718e3742002-12-13 20:15:29 +00006819 return CMD_SUCCESS;
6820}
6821
6822DEFUN (no_ospf_distance_source_access_list,
6823 no_ospf_distance_source_access_list_cmd,
6824 "no distance <1-255> A.B.C.D/M WORD",
6825 NO_STR
6826 "Administrative distance\n"
6827 "Distance value\n"
6828 "IP source prefix\n"
6829 "Access list name\n")
6830{
paul020709f2003-04-04 02:44:16 +00006831 struct ospf *ospf = vty->index;
6832
6833 ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6834
paul718e3742002-12-13 20:15:29 +00006835 return CMD_SUCCESS;
6836}
6837
vincentba682532005-09-29 13:52:57 +00006838DEFUN (ip_ospf_mtu_ignore,
6839 ip_ospf_mtu_ignore_addr_cmd,
6840 "ip ospf mtu-ignore A.B.C.D",
6841 "IP Information\n"
6842 "OSPF interface commands\n"
6843 "Disable mtu mismatch detection\n"
6844 "Address of interface")
6845{
6846 struct interface *ifp = vty->index;
6847 struct in_addr addr;
6848 int ret;
6849
6850 struct ospf_if_params *params;
6851 params = IF_DEF_PARAMS (ifp);
6852
6853 if (argc == 1)
6854 {
6855 ret = inet_aton(argv[0], &addr);
6856 if (!ret)
6857 {
6858 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6859 VTY_NEWLINE);
6860 return CMD_WARNING;
6861 }
6862 params = ospf_get_if_params (ifp, addr);
6863 ospf_if_update_params (ifp, addr);
6864 }
6865 params->mtu_ignore = 1;
6866 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6867 SET_IF_PARAM (params, mtu_ignore);
6868 else
6869 {
6870 UNSET_IF_PARAM (params, mtu_ignore);
6871 if (params != IF_DEF_PARAMS (ifp))
6872 {
6873 ospf_free_if_params (ifp, addr);
6874 ospf_if_update_params (ifp, addr);
6875 }
6876 }
6877 return CMD_SUCCESS;
6878}
6879
6880ALIAS (ip_ospf_mtu_ignore,
6881 ip_ospf_mtu_ignore_cmd,
6882 "ip ospf mtu-ignore",
6883 "IP Information\n"
6884 "OSPF interface commands\n"
6885 "Disable mtu mismatch detection\n")
6886
6887
6888DEFUN (no_ip_ospf_mtu_ignore,
6889 no_ip_ospf_mtu_ignore_addr_cmd,
6890 "no ip ospf mtu-ignore A.B.C.D",
6891 "IP Information\n"
6892 "OSPF interface commands\n"
6893 "Disable mtu mismatch detection\n"
6894 "Address of interface")
6895{
6896 struct interface *ifp = vty->index;
6897 struct in_addr addr;
6898 int ret;
6899
6900 struct ospf_if_params *params;
6901 params = IF_DEF_PARAMS (ifp);
6902
6903 if (argc == 1)
6904 {
6905 ret = inet_aton(argv[0], &addr);
6906 if (!ret)
6907 {
6908 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6909 VTY_NEWLINE);
6910 return CMD_WARNING;
6911 }
6912 params = ospf_get_if_params (ifp, addr);
6913 ospf_if_update_params (ifp, addr);
6914 }
6915 params->mtu_ignore = 0;
6916 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6917 SET_IF_PARAM (params, mtu_ignore);
6918 else
6919 {
6920 UNSET_IF_PARAM (params, mtu_ignore);
6921 if (params != IF_DEF_PARAMS (ifp))
6922 {
6923 ospf_free_if_params (ifp, addr);
6924 ospf_if_update_params (ifp, addr);
6925 }
6926 }
6927 return CMD_SUCCESS;
6928}
6929
6930ALIAS (no_ip_ospf_mtu_ignore,
6931 no_ip_ospf_mtu_ignore_cmd,
6932 "no ip ospf mtu-ignore",
6933 "IP Information\n"
6934 "OSPF interface commands\n"
6935 "Disable mtu mismatch detection\n")
paul88d6cf32005-10-29 12:50:09 +00006936
6937DEFUN (ospf_max_metric_router_lsa_admin,
6938 ospf_max_metric_router_lsa_admin_cmd,
6939 "max-metric router-lsa administrative",
6940 "OSPF maximum / infinite-distance metric\n"
6941 "Advertise own Router-LSA with infinite distance (stub router)\n"
6942 "Administratively applied, for an indefinite period\n")
6943{
6944 struct listnode *ln;
6945 struct ospf_area *area;
6946 struct ospf *ospf = vty->index;
vincentba682532005-09-29 13:52:57 +00006947
paul88d6cf32005-10-29 12:50:09 +00006948 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6949 {
6950 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6951
6952 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
6953 ospf_router_lsa_timer_add (area);
6954 }
6955 return CMD_SUCCESS;
6956}
6957
6958DEFUN (no_ospf_max_metric_router_lsa_admin,
6959 no_ospf_max_metric_router_lsa_admin_cmd,
6960 "no max-metric router-lsa administrative",
6961 NO_STR
6962 "OSPF maximum / infinite-distance metric\n"
6963 "Advertise own Router-LSA with infinite distance (stub router)\n"
6964 "Administratively applied, for an indefinite period\n")
6965{
6966 struct listnode *ln;
6967 struct ospf_area *area;
6968 struct ospf *ospf = vty->index;
6969
6970 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6971 {
6972 UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6973
6974 /* Don't trample on the start-up stub timer */
6975 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
6976 && !area->t_stub_router)
6977 {
6978 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
6979 ospf_router_lsa_timer_add (area);
6980 }
6981 }
6982 return CMD_SUCCESS;
6983}
6984
6985DEFUN (ospf_max_metric_router_lsa_startup,
6986 ospf_max_metric_router_lsa_startup_cmd,
6987 "max-metric router-lsa on-startup <5-86400>",
6988 "OSPF maximum / infinite-distance metric\n"
6989 "Advertise own Router-LSA with infinite distance (stub router)\n"
6990 "Automatically advertise stub Router-LSA on startup of OSPF\n"
6991 "Time (seconds) to advertise self as stub-router\n")
6992{
6993 unsigned int seconds;
6994 struct ospf *ospf = vty->index;
6995
6996 if (argc != 1)
6997 {
6998 vty_out (vty, "%% Must supply stub-router period");
6999 return CMD_WARNING;
7000 }
7001
7002 VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
7003
7004 ospf->stub_router_startup_time = seconds;
7005
7006 return CMD_SUCCESS;
7007}
7008
7009DEFUN (no_ospf_max_metric_router_lsa_startup,
7010 no_ospf_max_metric_router_lsa_startup_cmd,
7011 "no max-metric router-lsa on-startup",
7012 NO_STR
7013 "OSPF maximum / infinite-distance metric\n"
7014 "Advertise own Router-LSA with infinite distance (stub router)\n"
7015 "Automatically advertise stub Router-LSA on startup of OSPF\n")
7016{
7017 struct listnode *ln;
7018 struct ospf_area *area;
7019 struct ospf *ospf = vty->index;
7020
7021 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7022
7023 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7024 {
7025 SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
7026 OSPF_TIMER_OFF (area->t_stub_router);
7027
7028 /* Don't trample on admin stub routed */
7029 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7030 {
7031 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
7032 ospf_router_lsa_timer_add (area);
7033 }
7034 }
7035 return CMD_SUCCESS;
7036}
7037
7038DEFUN (ospf_max_metric_router_lsa_shutdown,
7039 ospf_max_metric_router_lsa_shutdown_cmd,
7040 "max-metric router-lsa on-shutdown <5-86400>",
7041 "OSPF maximum / infinite-distance metric\n"
7042 "Advertise own Router-LSA with infinite distance (stub router)\n"
7043 "Advertise stub-router prior to full shutdown of OSPF\n"
7044 "Time (seconds) to wait till full shutdown\n")
7045{
7046 unsigned int seconds;
7047 struct ospf *ospf = vty->index;
7048
7049 if (argc != 1)
7050 {
7051 vty_out (vty, "%% Must supply stub-router shutdown period");
7052 return CMD_WARNING;
7053 }
7054
7055 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
7056
7057 ospf->stub_router_shutdown_time = seconds;
7058
7059 return CMD_SUCCESS;
7060}
7061
7062DEFUN (no_ospf_max_metric_router_lsa_shutdown,
7063 no_ospf_max_metric_router_lsa_shutdown_cmd,
7064 "no max-metric router-lsa on-shutdown",
7065 NO_STR
7066 "OSPF maximum / infinite-distance metric\n"
7067 "Advertise own Router-LSA with infinite distance (stub router)\n"
7068 "Advertise stub-router prior to full shutdown of OSPF\n")
7069{
7070 struct ospf *ospf = vty->index;
7071
7072 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7073
7074 return CMD_SUCCESS;
7075}
7076
7077static void
7078config_write_stub_router (struct vty *vty, struct ospf *ospf)
7079{
7080 struct listnode *ln;
7081 struct ospf_area *area;
7082
7083 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7084 vty_out (vty, " max-metric router-lsa on-startup %u%s",
7085 ospf->stub_router_startup_time, VTY_NEWLINE);
7086 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7087 vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
7088 ospf->stub_router_shutdown_time, VTY_NEWLINE);
7089 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7090 {
7091 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7092 {
7093 vty_out (vty, " max-metric router-lsa administrative%s",
7094 VTY_NEWLINE);
7095 break;
7096 }
7097 }
7098 return;
7099}
7100
paul4dadc292005-05-06 21:37:42 +00007101static void
paul718e3742002-12-13 20:15:29 +00007102show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
7103{
7104 struct route_node *rn;
7105 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007106 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007107 struct ospf_path *path;
7108
7109 vty_out (vty, "============ OSPF network routing table ============%s",
7110 VTY_NEWLINE);
7111
7112 for (rn = route_top (rt); rn; rn = route_next (rn))
7113 if ((or = rn->info) != NULL)
7114 {
7115 char buf1[19];
7116 snprintf (buf1, 19, "%s/%d",
7117 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7118
7119 switch (or->path_type)
7120 {
7121 case OSPF_PATH_INTER_AREA:
7122 if (or->type == OSPF_DESTINATION_NETWORK)
7123 vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
7124 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7125 else if (or->type == OSPF_DESTINATION_DISCARD)
7126 vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
7127 break;
7128 case OSPF_PATH_INTRA_AREA:
7129 vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
7130 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7131 break;
7132 default:
7133 break;
7134 }
7135
7136 if (or->type == OSPF_DESTINATION_NETWORK)
paul1eb8ef22005-04-07 07:30:20 +00007137 for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
paul96735ee2003-08-10 02:51:22 +00007138 {
hasso54bedb52005-08-17 13:31:47 +00007139 if (path->oi != NULL && ospf_if_exists(path->oi))
paul96735ee2003-08-10 02:51:22 +00007140 {
7141 if (path->nexthop.s_addr == 0)
7142 vty_out (vty, "%24s directly attached to %s%s",
7143 "", path->oi->ifp->name, VTY_NEWLINE);
7144 else
7145 vty_out (vty, "%24s via %s, %s%s", "",
7146 inet_ntoa (path->nexthop), path->oi->ifp->name,
7147 VTY_NEWLINE);
7148 }
7149 }
paul718e3742002-12-13 20:15:29 +00007150 }
7151 vty_out (vty, "%s", VTY_NEWLINE);
7152}
7153
paul4dadc292005-05-06 21:37:42 +00007154static void
paul718e3742002-12-13 20:15:29 +00007155show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
7156{
7157 struct route_node *rn;
7158 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007159 struct listnode *pnode;
7160 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007161 struct ospf_path *path;
7162
7163 vty_out (vty, "============ OSPF router routing table =============%s",
7164 VTY_NEWLINE);
7165 for (rn = route_top (rtrs); rn; rn = route_next (rn))
7166 if (rn->info)
7167 {
7168 int flag = 0;
7169
7170 vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
7171
paul1eb8ef22005-04-07 07:30:20 +00007172 for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
7173 {
7174 if (flag++)
7175 vty_out (vty, "%24s", "");
paul718e3742002-12-13 20:15:29 +00007176
paul1eb8ef22005-04-07 07:30:20 +00007177 /* Show path. */
7178 vty_out (vty, "%s [%d] area: %s",
7179 (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
7180 or->cost, inet_ntoa (or->u.std.area_id));
7181 /* Show flags. */
7182 vty_out (vty, "%s%s%s",
7183 (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
7184 (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
7185 VTY_NEWLINE);
7186
7187 for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
7188 {
hasso54bedb52005-08-17 13:31:47 +00007189 if (path->oi != NULL && ospf_if_exists(path->oi))
7190 {
7191 if (path->nexthop.s_addr == 0)
7192 vty_out (vty, "%24s directly attached to %s%s",
7193 "", path->oi->ifp->name, VTY_NEWLINE);
7194 else
7195 vty_out (vty, "%24s via %s, %s%s", "",
7196 inet_ntoa (path->nexthop),
7197 path->oi->ifp->name, VTY_NEWLINE);
7198 }
paul1eb8ef22005-04-07 07:30:20 +00007199 }
7200 }
paul718e3742002-12-13 20:15:29 +00007201 }
7202 vty_out (vty, "%s", VTY_NEWLINE);
7203}
7204
paul4dadc292005-05-06 21:37:42 +00007205static void
paul718e3742002-12-13 20:15:29 +00007206show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
7207{
7208 struct route_node *rn;
7209 struct ospf_route *er;
paul1eb8ef22005-04-07 07:30:20 +00007210 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007211 struct ospf_path *path;
7212
7213 vty_out (vty, "============ OSPF external routing table ===========%s",
7214 VTY_NEWLINE);
7215 for (rn = route_top (rt); rn; rn = route_next (rn))
7216 if ((er = rn->info) != NULL)
7217 {
7218 char buf1[19];
7219 snprintf (buf1, 19, "%s/%d",
7220 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7221
7222 switch (er->path_type)
7223 {
7224 case OSPF_PATH_TYPE1_EXTERNAL:
7225 vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
7226 er->cost, er->u.ext.tag, VTY_NEWLINE);
7227 break;
7228 case OSPF_PATH_TYPE2_EXTERNAL:
7229 vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
7230 er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
7231 break;
7232 }
7233
paul1eb8ef22005-04-07 07:30:20 +00007234 for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
paul718e3742002-12-13 20:15:29 +00007235 {
hasso54bedb52005-08-17 13:31:47 +00007236 if (path->oi != NULL && ospf_if_exists(path->oi))
paul718e3742002-12-13 20:15:29 +00007237 {
7238 if (path->nexthop.s_addr == 0)
paul96735ee2003-08-10 02:51:22 +00007239 vty_out (vty, "%24s directly attached to %s%s",
7240 "", path->oi->ifp->name, VTY_NEWLINE);
7241 else
7242 vty_out (vty, "%24s via %s, %s%s", "",
7243 inet_ntoa (path->nexthop), path->oi->ifp->name,
7244 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007245 }
7246 }
7247 }
7248 vty_out (vty, "%s", VTY_NEWLINE);
7249}
7250
paul718e3742002-12-13 20:15:29 +00007251DEFUN (show_ip_ospf_border_routers,
7252 show_ip_ospf_border_routers_cmd,
7253 "show ip ospf border-routers",
7254 SHOW_STR
7255 IP_STR
7256 "show all the ABR's and ASBR's\n"
7257 "for this area\n")
7258{
paul020709f2003-04-04 02:44:16 +00007259 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007260
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007261 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007262 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007263 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007264 return CMD_SUCCESS;
7265 }
7266
paul68980082003-03-25 05:07:42 +00007267 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007268 {
7269 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7270 return CMD_SUCCESS;
7271 }
7272
7273 /* Show Network routes.
paul020709f2003-04-04 02:44:16 +00007274 show_ip_ospf_route_network (vty, ospf->new_table); */
paul718e3742002-12-13 20:15:29 +00007275
7276 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007277 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007278
7279 return CMD_SUCCESS;
7280}
paul718e3742002-12-13 20:15:29 +00007281
7282DEFUN (show_ip_ospf_route,
7283 show_ip_ospf_route_cmd,
7284 "show ip ospf route",
7285 SHOW_STR
7286 IP_STR
7287 "OSPF information\n"
7288 "OSPF routing table\n")
7289{
paul020709f2003-04-04 02:44:16 +00007290 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007291
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007292 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007293 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007294 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007295 return CMD_SUCCESS;
7296 }
7297
paul68980082003-03-25 05:07:42 +00007298 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007299 {
7300 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7301 return CMD_SUCCESS;
7302 }
7303
7304 /* Show Network routes. */
paul68980082003-03-25 05:07:42 +00007305 show_ip_ospf_route_network (vty, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00007306
7307 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007308 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007309
7310 /* Show AS External routes. */
paul68980082003-03-25 05:07:42 +00007311 show_ip_ospf_route_external (vty, ospf->old_external_route);
paul718e3742002-12-13 20:15:29 +00007312
7313 return CMD_SUCCESS;
7314}
7315
7316
hassoeb1ce602004-10-08 08:17:22 +00007317const char *ospf_abr_type_str[] =
paul718e3742002-12-13 20:15:29 +00007318{
7319 "unknown",
7320 "standard",
7321 "ibm",
7322 "cisco",
7323 "shortcut"
7324};
7325
hassoeb1ce602004-10-08 08:17:22 +00007326const char *ospf_shortcut_mode_str[] =
paul718e3742002-12-13 20:15:29 +00007327{
7328 "default",
7329 "enable",
7330 "disable"
7331};
7332
7333
paul4dadc292005-05-06 21:37:42 +00007334static void
paul718e3742002-12-13 20:15:29 +00007335area_id2str (char *buf, int length, struct ospf_area *area)
7336{
7337 memset (buf, 0, length);
7338
7339 if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7340 strncpy (buf, inet_ntoa (area->area_id), length);
7341 else
7342 sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
7343}
7344
7345
hassoeb1ce602004-10-08 08:17:22 +00007346const char *ospf_int_type_str[] =
paul718e3742002-12-13 20:15:29 +00007347{
7348 "unknown", /* should never be used. */
7349 "point-to-point",
7350 "broadcast",
7351 "non-broadcast",
7352 "point-to-multipoint",
7353 "virtual-link", /* should never be used. */
7354 "loopback"
7355};
7356
7357/* Configuration write function for ospfd. */
paul4dadc292005-05-06 21:37:42 +00007358static int
paul718e3742002-12-13 20:15:29 +00007359config_write_interface (struct vty *vty)
7360{
hasso52dc7ee2004-09-23 19:18:23 +00007361 struct listnode *n1, *n2;
paul718e3742002-12-13 20:15:29 +00007362 struct interface *ifp;
7363 struct crypt_key *ck;
7364 int write = 0;
7365 struct route_node *rn = NULL;
7366 struct ospf_if_params *params;
7367
paul1eb8ef22005-04-07 07:30:20 +00007368 for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
paul718e3742002-12-13 20:15:29 +00007369 {
paul718e3742002-12-13 20:15:29 +00007370 if (memcmp (ifp->name, "VLINK", 5) == 0)
7371 continue;
7372
7373 vty_out (vty, "!%s", VTY_NEWLINE);
7374 vty_out (vty, "interface %s%s", ifp->name,
7375 VTY_NEWLINE);
7376 if (ifp->desc)
7377 vty_out (vty, " description %s%s", ifp->desc,
7378 VTY_NEWLINE);
7379
7380 write++;
7381
7382 params = IF_DEF_PARAMS (ifp);
7383
7384 do {
7385 /* Interface Network print. */
7386 if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
paul718e3742002-12-13 20:15:29 +00007387 params->type != OSPF_IFTYPE_LOOPBACK)
7388 {
ajsbc18d612004-12-15 15:07:19 +00007389 if (params->type != ospf_default_iftype(ifp))
hasso7b901432004-08-31 13:37:42 +00007390 {
7391 vty_out (vty, " ip ospf network %s",
7392 ospf_int_type_str[params->type]);
7393 if (params != IF_DEF_PARAMS (ifp))
7394 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7395 vty_out (vty, "%s", VTY_NEWLINE);
7396 }
paul718e3742002-12-13 20:15:29 +00007397 }
7398
7399 /* OSPF interface authentication print */
7400 if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
7401 params->auth_type != OSPF_AUTH_NOTSET)
7402 {
hassoeb1ce602004-10-08 08:17:22 +00007403 const char *auth_str;
paul718e3742002-12-13 20:15:29 +00007404
7405 /* Translation tables are not that much help here due to syntax
7406 of the simple option */
7407 switch (params->auth_type)
7408 {
7409
7410 case OSPF_AUTH_NULL:
7411 auth_str = " null";
7412 break;
7413
7414 case OSPF_AUTH_SIMPLE:
7415 auth_str = "";
7416 break;
7417
7418 case OSPF_AUTH_CRYPTOGRAPHIC:
7419 auth_str = " message-digest";
7420 break;
7421
7422 default:
7423 auth_str = "";
7424 break;
7425 }
7426
7427 vty_out (vty, " ip ospf authentication%s", auth_str);
7428 if (params != IF_DEF_PARAMS (ifp))
7429 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7430 vty_out (vty, "%s", VTY_NEWLINE);
7431 }
7432
7433 /* Simple Authentication Password print. */
7434 if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
7435 params->auth_simple[0] != '\0')
7436 {
7437 vty_out (vty, " ip ospf authentication-key %s",
7438 params->auth_simple);
7439 if (params != IF_DEF_PARAMS (ifp))
7440 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7441 vty_out (vty, "%s", VTY_NEWLINE);
7442 }
7443
7444 /* Cryptographic Authentication Key print. */
paul1eb8ef22005-04-07 07:30:20 +00007445 for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
paul718e3742002-12-13 20:15:29 +00007446 {
paul718e3742002-12-13 20:15:29 +00007447 vty_out (vty, " ip ospf message-digest-key %d md5 %s",
7448 ck->key_id, ck->auth_key);
7449 if (params != IF_DEF_PARAMS (ifp))
7450 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7451 vty_out (vty, "%s", VTY_NEWLINE);
7452 }
7453
7454 /* Interface Output Cost print. */
7455 if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
7456 {
7457 vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
7458 if (params != IF_DEF_PARAMS (ifp))
7459 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7460 vty_out (vty, "%s", VTY_NEWLINE);
7461 }
7462
7463 /* Hello Interval print. */
7464 if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
7465 params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
7466 {
7467 vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
7468 if (params != IF_DEF_PARAMS (ifp))
7469 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7470 vty_out (vty, "%s", VTY_NEWLINE);
7471 }
7472
7473
7474 /* Router Dead Interval print. */
7475 if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
7476 params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
7477 {
paulf9ad9372005-10-21 00:45:17 +00007478 vty_out (vty, " ip ospf dead-interval ");
7479
7480 /* fast hello ? */
7481 if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
7482 vty_out (vty, "minimal hello-multiplier %d",
7483 params->fast_hello);
7484 else
7485 vty_out (vty, "%u", params->v_wait);
7486
paul718e3742002-12-13 20:15:29 +00007487 if (params != IF_DEF_PARAMS (ifp))
7488 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7489 vty_out (vty, "%s", VTY_NEWLINE);
7490 }
7491
7492 /* Router Priority print. */
7493 if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
7494 params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
7495 {
7496 vty_out (vty, " ip ospf priority %u", params->priority);
7497 if (params != IF_DEF_PARAMS (ifp))
7498 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7499 vty_out (vty, "%s", VTY_NEWLINE);
7500 }
7501
7502 /* Retransmit Interval print. */
7503 if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
7504 params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
7505 {
7506 vty_out (vty, " ip ospf retransmit-interval %u",
7507 params->retransmit_interval);
7508 if (params != IF_DEF_PARAMS (ifp))
7509 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7510 vty_out (vty, "%s", VTY_NEWLINE);
7511 }
7512
7513 /* Transmit Delay print. */
7514 if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
7515 params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
7516 {
7517 vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
7518 if (params != IF_DEF_PARAMS (ifp))
7519 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7520 vty_out (vty, "%s", VTY_NEWLINE);
7521 }
7522
vincentba682532005-09-29 13:52:57 +00007523 /* MTU ignore print. */
7524 if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7525 params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7526 {
7527 if (params->mtu_ignore == 0)
7528 vty_out (vty, " no ip ospf mtu-ignore");
7529 else
7530 vty_out (vty, " ip ospf mtu-ignore");
7531 if (params != IF_DEF_PARAMS (ifp))
7532 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7533 vty_out (vty, "%s", VTY_NEWLINE);
7534 }
7535
7536
paul718e3742002-12-13 20:15:29 +00007537 while (1)
7538 {
7539 if (rn == NULL)
7540 rn = route_top (IF_OIFS_PARAMS (ifp));
7541 else
7542 rn = route_next (rn);
7543
7544 if (rn == NULL)
7545 break;
7546 params = rn->info;
7547 if (params != NULL)
7548 break;
7549 }
7550 } while (rn);
7551
7552#ifdef HAVE_OPAQUE_LSA
7553 ospf_opaque_config_write_if (vty, ifp);
7554#endif /* HAVE_OPAQUE_LSA */
7555 }
7556
7557 return write;
7558}
7559
paul4dadc292005-05-06 21:37:42 +00007560static int
paul68980082003-03-25 05:07:42 +00007561config_write_network_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007562{
7563 struct route_node *rn;
7564 u_char buf[INET_ADDRSTRLEN];
7565
7566 /* `network area' print. */
paul68980082003-03-25 05:07:42 +00007567 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007568 if (rn->info)
7569 {
7570 struct ospf_network *n = rn->info;
7571
7572 memset (buf, 0, INET_ADDRSTRLEN);
7573
7574 /* Create Area ID string by specified Area ID format. */
7575 if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007576 strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007577 else
hassoc9e52be2004-09-26 16:09:34 +00007578 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007579 (unsigned long int) ntohl (n->area_id.s_addr));
7580
7581 /* Network print. */
7582 vty_out (vty, " network %s/%d area %s%s",
7583 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7584 buf, VTY_NEWLINE);
7585 }
7586
7587 return 0;
7588}
7589
paul4dadc292005-05-06 21:37:42 +00007590static int
paul68980082003-03-25 05:07:42 +00007591config_write_ospf_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007592{
hasso52dc7ee2004-09-23 19:18:23 +00007593 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007594 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00007595 u_char buf[INET_ADDRSTRLEN];
7596
7597 /* Area configuration print. */
paul1eb8ef22005-04-07 07:30:20 +00007598 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00007599 {
paul718e3742002-12-13 20:15:29 +00007600 struct route_node *rn1;
7601
hassoc9e52be2004-09-26 16:09:34 +00007602 area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
paul718e3742002-12-13 20:15:29 +00007603
7604 if (area->auth_type != OSPF_AUTH_NULL)
7605 {
7606 if (area->auth_type == OSPF_AUTH_SIMPLE)
7607 vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7608 else
7609 vty_out (vty, " area %s authentication message-digest%s",
7610 buf, VTY_NEWLINE);
7611 }
7612
7613 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7614 vty_out (vty, " area %s shortcut %s%s", buf,
7615 ospf_shortcut_mode_str[area->shortcut_configured],
7616 VTY_NEWLINE);
7617
7618 if ((area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007619 || (area->external_routing == OSPF_AREA_NSSA)
paul718e3742002-12-13 20:15:29 +00007620 )
7621 {
paulb0a053b2003-06-22 09:04:47 +00007622 if (area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007623 vty_out (vty, " area %s stub", buf);
paulb0a053b2003-06-22 09:04:47 +00007624 else if (area->external_routing == OSPF_AREA_NSSA)
7625 {
7626 vty_out (vty, " area %s nssa", buf);
7627 switch (area->NSSATranslatorRole)
7628 {
7629 case OSPF_NSSA_ROLE_NEVER:
7630 vty_out (vty, " translate-never");
7631 break;
7632 case OSPF_NSSA_ROLE_ALWAYS:
7633 vty_out (vty, " translate-always");
7634 break;
7635 case OSPF_NSSA_ROLE_CANDIDATE:
7636 default:
7637 vty_out (vty, " translate-candidate");
7638 }
7639 }
paul718e3742002-12-13 20:15:29 +00007640
7641 if (area->no_summary)
7642 vty_out (vty, " no-summary");
7643
7644 vty_out (vty, "%s", VTY_NEWLINE);
7645
7646 if (area->default_cost != 1)
7647 vty_out (vty, " area %s default-cost %d%s", buf,
7648 area->default_cost, VTY_NEWLINE);
7649 }
7650
7651 for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7652 if (rn1->info)
7653 {
7654 struct ospf_area_range *range = rn1->info;
7655
7656 vty_out (vty, " area %s range %s/%d", buf,
7657 inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7658
paul6c835672004-10-11 11:00:30 +00007659 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +00007660 vty_out (vty, " cost %d", range->cost_config);
7661
7662 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7663 vty_out (vty, " not-advertise");
7664
7665 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7666 vty_out (vty, " substitute %s/%d",
7667 inet_ntoa (range->subst_addr), range->subst_masklen);
7668
7669 vty_out (vty, "%s", VTY_NEWLINE);
7670 }
7671
7672 if (EXPORT_NAME (area))
7673 vty_out (vty, " area %s export-list %s%s", buf,
7674 EXPORT_NAME (area), VTY_NEWLINE);
7675
7676 if (IMPORT_NAME (area))
7677 vty_out (vty, " area %s import-list %s%s", buf,
7678 IMPORT_NAME (area), VTY_NEWLINE);
7679
7680 if (PREFIX_NAME_IN (area))
7681 vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7682 PREFIX_NAME_IN (area), VTY_NEWLINE);
7683
7684 if (PREFIX_NAME_OUT (area))
7685 vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7686 PREFIX_NAME_OUT (area), VTY_NEWLINE);
7687 }
7688
7689 return 0;
7690}
7691
paul4dadc292005-05-06 21:37:42 +00007692static int
paul68980082003-03-25 05:07:42 +00007693config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007694{
7695 struct ospf_nbr_nbma *nbr_nbma;
7696 struct route_node *rn;
7697
7698 /* Static Neighbor configuration print. */
paul68980082003-03-25 05:07:42 +00007699 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007700 if ((nbr_nbma = rn->info))
7701 {
7702 vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7703
7704 if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7705 vty_out (vty, " priority %d", nbr_nbma->priority);
7706
7707 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7708 vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7709
7710 vty_out (vty, "%s", VTY_NEWLINE);
7711 }
7712
7713 return 0;
7714}
7715
paul4dadc292005-05-06 21:37:42 +00007716static int
paul68980082003-03-25 05:07:42 +00007717config_write_virtual_link (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007718{
hasso52dc7ee2004-09-23 19:18:23 +00007719 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007720 struct ospf_vl_data *vl_data;
paul718e3742002-12-13 20:15:29 +00007721 u_char buf[INET_ADDRSTRLEN];
7722
7723 /* Virtual-Link print */
paul1eb8ef22005-04-07 07:30:20 +00007724 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
paul718e3742002-12-13 20:15:29 +00007725 {
hasso52dc7ee2004-09-23 19:18:23 +00007726 struct listnode *n2;
paul718e3742002-12-13 20:15:29 +00007727 struct crypt_key *ck;
paul718e3742002-12-13 20:15:29 +00007728 struct ospf_interface *oi;
7729
7730 if (vl_data != NULL)
7731 {
7732 memset (buf, 0, INET_ADDRSTRLEN);
7733
7734 if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007735 strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007736 else
hassoc9e52be2004-09-26 16:09:34 +00007737 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007738 (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7739 oi = vl_data->vl_oi;
7740
7741 /* timers */
7742 if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7743 OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7744 OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7745 OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7746 vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7747 buf,
7748 inet_ntoa (vl_data->vl_peer),
7749 OSPF_IF_PARAM (oi, v_hello),
7750 OSPF_IF_PARAM (oi, retransmit_interval),
7751 OSPF_IF_PARAM (oi, transmit_delay),
7752 OSPF_IF_PARAM (oi, v_wait),
7753 VTY_NEWLINE);
7754 else
7755 vty_out (vty, " area %s virtual-link %s%s", buf,
7756 inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7757 /* Auth key */
7758 if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7759 vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7760 buf,
7761 inet_ntoa (vl_data->vl_peer),
7762 IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7763 VTY_NEWLINE);
7764 /* md5 keys */
paul1eb8ef22005-04-07 07:30:20 +00007765 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7766 n2, ck))
7767 vty_out (vty, " area %s virtual-link %s"
7768 " message-digest-key %d md5 %s%s",
7769 buf,
7770 inet_ntoa (vl_data->vl_peer),
7771 ck->key_id, ck->auth_key, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007772
7773 }
7774 }
7775
7776 return 0;
7777}
7778
7779
paul4dadc292005-05-06 21:37:42 +00007780static int
paul68980082003-03-25 05:07:42 +00007781config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007782{
7783 int type;
7784
7785 /* redistribute print. */
7786 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7787 if (type != zclient->redist_default && zclient->redist[type])
7788 {
ajsf52d13c2005-10-01 17:38:06 +00007789 vty_out (vty, " redistribute %s", zebra_route_string(type));
paul68980082003-03-25 05:07:42 +00007790 if (ospf->dmetric[type].value >= 0)
paul020709f2003-04-04 02:44:16 +00007791 vty_out (vty, " metric %d", ospf->dmetric[type].value);
paul718e3742002-12-13 20:15:29 +00007792
paul68980082003-03-25 05:07:42 +00007793 if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007794 vty_out (vty, " metric-type 1");
7795
paul020709f2003-04-04 02:44:16 +00007796 if (ROUTEMAP_NAME (ospf, type))
7797 vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
paul718e3742002-12-13 20:15:29 +00007798
7799 vty_out (vty, "%s", VTY_NEWLINE);
7800 }
7801
7802 return 0;
7803}
7804
paul4dadc292005-05-06 21:37:42 +00007805static int
paul68980082003-03-25 05:07:42 +00007806config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007807{
paul68980082003-03-25 05:07:42 +00007808 if (ospf->default_metric != -1)
7809 vty_out (vty, " default-metric %d%s", ospf->default_metric,
paul718e3742002-12-13 20:15:29 +00007810 VTY_NEWLINE);
7811 return 0;
7812}
7813
paul4dadc292005-05-06 21:37:42 +00007814static int
paul68980082003-03-25 05:07:42 +00007815config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007816{
7817 int type;
7818
paul68980082003-03-25 05:07:42 +00007819 if (ospf)
paul718e3742002-12-13 20:15:29 +00007820 {
7821 /* distribute-list print. */
7822 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
paul68980082003-03-25 05:07:42 +00007823 if (ospf->dlist[type].name)
paul718e3742002-12-13 20:15:29 +00007824 vty_out (vty, " distribute-list %s out %s%s",
paul68980082003-03-25 05:07:42 +00007825 ospf->dlist[type].name,
ajsf52d13c2005-10-01 17:38:06 +00007826 zebra_route_string(type), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007827
7828 /* default-information print. */
paul68980082003-03-25 05:07:42 +00007829 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
paul718e3742002-12-13 20:15:29 +00007830 {
paulc42c1772006-01-10 20:36:49 +00007831 vty_out (vty, " default-information originate");
7832 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7833 vty_out (vty, " always");
paul718e3742002-12-13 20:15:29 +00007834
paul68980082003-03-25 05:07:42 +00007835 if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
paul718e3742002-12-13 20:15:29 +00007836 vty_out (vty, " metric %d",
paul68980082003-03-25 05:07:42 +00007837 ospf->dmetric[DEFAULT_ROUTE].value);
7838 if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007839 vty_out (vty, " metric-type 1");
7840
paul020709f2003-04-04 02:44:16 +00007841 if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7842 vty_out (vty, " route-map %s",
7843 ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
paul718e3742002-12-13 20:15:29 +00007844
7845 vty_out (vty, "%s", VTY_NEWLINE);
7846 }
7847
7848 }
7849
7850 return 0;
7851}
7852
paul4dadc292005-05-06 21:37:42 +00007853static int
paul68980082003-03-25 05:07:42 +00007854config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007855{
7856 struct route_node *rn;
7857 struct ospf_distance *odistance;
7858
paul68980082003-03-25 05:07:42 +00007859 if (ospf->distance_all)
7860 vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007861
paul68980082003-03-25 05:07:42 +00007862 if (ospf->distance_intra
7863 || ospf->distance_inter
7864 || ospf->distance_external)
paul718e3742002-12-13 20:15:29 +00007865 {
7866 vty_out (vty, " distance ospf");
7867
paul68980082003-03-25 05:07:42 +00007868 if (ospf->distance_intra)
7869 vty_out (vty, " intra-area %d", ospf->distance_intra);
7870 if (ospf->distance_inter)
7871 vty_out (vty, " inter-area %d", ospf->distance_inter);
7872 if (ospf->distance_external)
7873 vty_out (vty, " external %d", ospf->distance_external);
paul718e3742002-12-13 20:15:29 +00007874
7875 vty_out (vty, "%s", VTY_NEWLINE);
7876 }
7877
paul68980082003-03-25 05:07:42 +00007878 for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007879 if ((odistance = rn->info) != NULL)
7880 {
7881 vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7882 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7883 odistance->access_list ? odistance->access_list : "",
7884 VTY_NEWLINE);
7885 }
7886 return 0;
7887}
7888
7889/* OSPF configuration write function. */
paul4dadc292005-05-06 21:37:42 +00007890static int
paul718e3742002-12-13 20:15:29 +00007891ospf_config_write (struct vty *vty)
7892{
paul020709f2003-04-04 02:44:16 +00007893 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00007894 struct interface *ifp;
7895 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00007896 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007897 int write = 0;
7898
paul020709f2003-04-04 02:44:16 +00007899 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00007900 if (ospf != NULL)
paul718e3742002-12-13 20:15:29 +00007901 {
7902 /* `router ospf' print. */
7903 vty_out (vty, "router ospf%s", VTY_NEWLINE);
7904
7905 write++;
7906
paul68980082003-03-25 05:07:42 +00007907 if (!ospf->networks)
paul718e3742002-12-13 20:15:29 +00007908 return write;
7909
7910 /* Router ID print. */
paul68980082003-03-25 05:07:42 +00007911 if (ospf->router_id_static.s_addr != 0)
paul718e3742002-12-13 20:15:29 +00007912 vty_out (vty, " ospf router-id %s%s",
paul68980082003-03-25 05:07:42 +00007913 inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007914
7915 /* ABR type print. */
pauld57834f2005-07-12 20:04:22 +00007916 if (ospf->abr_type != OSPF_ABR_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007917 vty_out (vty, " ospf abr-type %s%s",
paul68980082003-03-25 05:07:42 +00007918 ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007919
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007920 /* log-adjacency-changes flag print. */
7921 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
7922 {
7923 vty_out(vty, " log-adjacency-changes");
7924 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
7925 vty_out(vty, " detail");
7926 vty_out(vty, "%s", VTY_NEWLINE);
7927 }
7928
paul718e3742002-12-13 20:15:29 +00007929 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
paul68980082003-03-25 05:07:42 +00007930 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
paul718e3742002-12-13 20:15:29 +00007931 vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
7932
7933 /* auto-cost reference-bandwidth configuration. */
paul68980082003-03-25 05:07:42 +00007934 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
paulf9ad9372005-10-21 00:45:17 +00007935 {
7936 vty_out (vty, "! Important: ensure reference bandwidth "
7937 "is consistent across all routers%s", VTY_NEWLINE);
7938 vty_out (vty, " auto-cost reference-bandwidth %d%s",
7939 ospf->ref_bandwidth / 1000, VTY_NEWLINE);
7940 }
paul718e3742002-12-13 20:15:29 +00007941
7942 /* SPF timers print. */
paul68980082003-03-25 05:07:42 +00007943 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
paulea4ffc92005-10-21 20:04:41 +00007944 ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
7945 ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
7946 vty_out (vty, " timers throttle spf %d %d %d%s",
paul88d6cf32005-10-29 12:50:09 +00007947 ospf->spf_delay, ospf->spf_holdtime,
paulea4ffc92005-10-21 20:04:41 +00007948 ospf->spf_max_holdtime, VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00007949
7950 /* Max-metric router-lsa print */
7951 config_write_stub_router (vty, ospf);
7952
paul718e3742002-12-13 20:15:29 +00007953 /* SPF refresh parameters print. */
paul68980082003-03-25 05:07:42 +00007954 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007955 vty_out (vty, " refresh timer %d%s",
paul68980082003-03-25 05:07:42 +00007956 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007957
7958 /* Redistribute information print. */
paul68980082003-03-25 05:07:42 +00007959 config_write_ospf_redistribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007960
7961 /* passive-interface print. */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007962 if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
7963 vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
7964
paul1eb8ef22005-04-07 07:30:20 +00007965 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007966 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
7967 && IF_DEF_PARAMS (ifp)->passive_interface !=
7968 ospf->passive_interface_default)
7969 {
7970 vty_out (vty, " %spassive-interface %s%s",
7971 IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
7972 ifp->name, VTY_NEWLINE);
7973 }
paul1eb8ef22005-04-07 07:30:20 +00007974 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007975 {
7976 if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
7977 continue;
7978 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
7979 passive_interface))
7980 {
7981 if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
7982 continue;
7983 }
7984 else if (oi->params->passive_interface == ospf->passive_interface_default)
7985 continue;
7986
7987 vty_out (vty, " %spassive-interface %s %s%s",
7988 oi->params->passive_interface ? "" : "no ",
paul1eb8ef22005-04-07 07:30:20 +00007989 oi->ifp->name,
7990 inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007991 }
paul718e3742002-12-13 20:15:29 +00007992
7993 /* Network area print. */
paul68980082003-03-25 05:07:42 +00007994 config_write_network_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007995
7996 /* Area config print. */
paul68980082003-03-25 05:07:42 +00007997 config_write_ospf_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007998
7999 /* static neighbor print. */
paul68980082003-03-25 05:07:42 +00008000 config_write_ospf_nbr_nbma (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008001
8002 /* Virtual-Link print. */
paul68980082003-03-25 05:07:42 +00008003 config_write_virtual_link (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008004
8005 /* Default metric configuration. */
paul68980082003-03-25 05:07:42 +00008006 config_write_ospf_default_metric (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008007
8008 /* Distribute-list and default-information print. */
paul68980082003-03-25 05:07:42 +00008009 config_write_ospf_distribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008010
8011 /* Distance configuration. */
paul68980082003-03-25 05:07:42 +00008012 config_write_ospf_distance (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008013
8014#ifdef HAVE_OPAQUE_LSA
paul68980082003-03-25 05:07:42 +00008015 ospf_opaque_config_write_router (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008016#endif /* HAVE_OPAQUE_LSA */
8017 }
8018
8019 return write;
8020}
8021
8022void
paul4dadc292005-05-06 21:37:42 +00008023ospf_vty_show_init (void)
paul718e3742002-12-13 20:15:29 +00008024{
8025 /* "show ip ospf" commands. */
8026 install_element (VIEW_NODE, &show_ip_ospf_cmd);
8027 install_element (ENABLE_NODE, &show_ip_ospf_cmd);
8028
8029 /* "show ip ospf database" commands. */
8030 install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
8031 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
8032 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8033 install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8034 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
8035 install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
8036 install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
8037 install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
8038 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
8039 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8040 install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8041 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
8042 install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
8043 install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
8044
8045 /* "show ip ospf interface" commands. */
8046 install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
8047 install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
8048
8049 /* "show ip ospf neighbor" commands. */
8050 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8051 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
8052 install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
8053 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8054 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
8055 install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
8056 install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
8057 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8058 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
8059 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
8060 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8061 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
8062 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
8063 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
8064
8065 /* "show ip ospf route" commands. */
8066 install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
8067 install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
paul718e3742002-12-13 20:15:29 +00008068 install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
8069 install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
paul718e3742002-12-13 20:15:29 +00008070}
8071
8072
8073/* ospfd's interface node. */
8074struct cmd_node interface_node =
8075{
8076 INTERFACE_NODE,
8077 "%s(config-if)# ",
8078 1
8079};
8080
8081/* Initialization of OSPF interface. */
paul4dadc292005-05-06 21:37:42 +00008082static void
8083ospf_vty_if_init (void)
paul718e3742002-12-13 20:15:29 +00008084{
8085 /* Install interface node. */
8086 install_node (&interface_node, config_write_interface);
8087
8088 install_element (CONFIG_NODE, &interface_cmd);
paul32d24632003-05-23 09:25:20 +00008089 install_element (CONFIG_NODE, &no_interface_cmd);
paul718e3742002-12-13 20:15:29 +00008090 install_default (INTERFACE_NODE);
8091
8092 /* "description" commands. */
8093 install_element (INTERFACE_NODE, &interface_desc_cmd);
8094 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
8095
8096 /* "ip ospf authentication" commands. */
8097 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
8098 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
8099 install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
8100 install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
8101 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
8102 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
8103 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
8104 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
8105 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
8106 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
8107
8108 /* "ip ospf message-digest-key" commands. */
8109 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
8110 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
8111 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
8112 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
8113
8114 /* "ip ospf cost" commands. */
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008115 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
8116 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
8117 install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008118 install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
8119
vincentba682532005-09-29 13:52:57 +00008120 /* "ip ospf mtu-ignore" commands. */
8121 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
8122 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
8123 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
8124 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
8125
paul718e3742002-12-13 20:15:29 +00008126 /* "ip ospf dead-interval" commands. */
8127 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
8128 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008129 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
8130 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
paul718e3742002-12-13 20:15:29 +00008131 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
8132 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008133
paul718e3742002-12-13 20:15:29 +00008134 /* "ip ospf hello-interval" commands. */
8135 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
8136 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
8137 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
8138 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
8139
8140 /* "ip ospf network" commands. */
8141 install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
8142 install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
8143
8144 /* "ip ospf priority" commands. */
8145 install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
8146 install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
8147 install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
8148 install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
8149
8150 /* "ip ospf retransmit-interval" commands. */
8151 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
8152 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
8153 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
8154 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
8155
8156 /* "ip ospf transmit-delay" commands. */
8157 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
8158 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
8159 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
8160 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
8161
8162 /* These commands are compatibitliy for previous version. */
8163 install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
8164 install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
8165 install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
8166 install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008167 install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
8168 install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008169 install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008170 install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008171 install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
8172 install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
8173 install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
8174 install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
8175 install_element (INTERFACE_NODE, &ospf_network_cmd);
8176 install_element (INTERFACE_NODE, &no_ospf_network_cmd);
8177 install_element (INTERFACE_NODE, &ospf_priority_cmd);
8178 install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
8179 install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
8180 install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
8181 install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
8182 install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
8183}
8184
8185/* Zebra node structure. */
8186struct cmd_node zebra_node =
8187{
8188 ZEBRA_NODE,
8189 "%s(config-router)#",
8190};
8191
paul4dadc292005-05-06 21:37:42 +00008192static void
8193ospf_vty_zebra_init (void)
paul718e3742002-12-13 20:15:29 +00008194{
8195 install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
8196 install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
8197 install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
8198 install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
8199 install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
8200 install_element (OSPF_NODE,
8201 &ospf_redistribute_source_metric_type_routemap_cmd);
8202 install_element (OSPF_NODE,
8203 &ospf_redistribute_source_type_metric_routemap_cmd);
8204 install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
8205 install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
8206 install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
8207
8208 install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
8209
8210 install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
8211 install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
8212
8213 install_element (OSPF_NODE,
8214 &ospf_default_information_originate_metric_type_cmd);
8215 install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
8216 install_element (OSPF_NODE,
8217 &ospf_default_information_originate_type_metric_cmd);
8218 install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
8219 install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
8220 install_element (OSPF_NODE,
8221 &ospf_default_information_originate_always_metric_type_cmd);
8222 install_element (OSPF_NODE,
8223 &ospf_default_information_originate_always_metric_cmd);
8224 install_element (OSPF_NODE,
8225 &ospf_default_information_originate_always_cmd);
8226 install_element (OSPF_NODE,
8227 &ospf_default_information_originate_always_type_metric_cmd);
8228 install_element (OSPF_NODE,
8229 &ospf_default_information_originate_always_type_cmd);
8230
8231 install_element (OSPF_NODE,
8232 &ospf_default_information_originate_metric_type_routemap_cmd);
8233 install_element (OSPF_NODE,
8234 &ospf_default_information_originate_metric_routemap_cmd);
8235 install_element (OSPF_NODE,
8236 &ospf_default_information_originate_routemap_cmd);
8237 install_element (OSPF_NODE,
8238 &ospf_default_information_originate_type_metric_routemap_cmd);
8239 install_element (OSPF_NODE,
8240 &ospf_default_information_originate_type_routemap_cmd);
8241 install_element (OSPF_NODE,
8242 &ospf_default_information_originate_always_metric_type_routemap_cmd);
8243 install_element (OSPF_NODE,
8244 &ospf_default_information_originate_always_metric_routemap_cmd);
8245 install_element (OSPF_NODE,
8246 &ospf_default_information_originate_always_routemap_cmd);
8247 install_element (OSPF_NODE,
8248 &ospf_default_information_originate_always_type_metric_routemap_cmd);
8249 install_element (OSPF_NODE,
8250 &ospf_default_information_originate_always_type_routemap_cmd);
8251
8252 install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
8253
8254 install_element (OSPF_NODE, &ospf_default_metric_cmd);
8255 install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
8256 install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
8257
8258 install_element (OSPF_NODE, &ospf_distance_cmd);
8259 install_element (OSPF_NODE, &no_ospf_distance_cmd);
8260 install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
8261 install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
8262 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
8263 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
8264 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
8265 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
8266 install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
8267 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
8268 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
8269 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
8270 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
8271 install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
8272 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
8273 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
8274 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
8275 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
8276#if 0
8277 install_element (OSPF_NODE, &ospf_distance_source_cmd);
8278 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
8279 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
8280 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
8281#endif /* 0 */
8282}
8283
8284struct cmd_node ospf_node =
8285{
8286 OSPF_NODE,
8287 "%s(config-router)# ",
8288 1
8289};
8290
8291
8292/* Install OSPF related vty commands. */
8293void
paul4dadc292005-05-06 21:37:42 +00008294ospf_vty_init (void)
paul718e3742002-12-13 20:15:29 +00008295{
8296 /* Install ospf top node. */
8297 install_node (&ospf_node, ospf_config_write);
8298
8299 /* "router ospf" commands. */
8300 install_element (CONFIG_NODE, &router_ospf_cmd);
8301 install_element (CONFIG_NODE, &no_router_ospf_cmd);
8302
8303 install_default (OSPF_NODE);
8304
8305 /* "ospf router-id" commands. */
8306 install_element (OSPF_NODE, &ospf_router_id_cmd);
8307 install_element (OSPF_NODE, &no_ospf_router_id_cmd);
paula2c62832003-04-23 17:01:31 +00008308 install_element (OSPF_NODE, &router_ospf_id_cmd);
8309 install_element (OSPF_NODE, &no_router_ospf_id_cmd);
paul718e3742002-12-13 20:15:29 +00008310
8311 /* "passive-interface" commands. */
paula2c62832003-04-23 17:01:31 +00008312 install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
8313 install_element (OSPF_NODE, &ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008314 install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
paula2c62832003-04-23 17:01:31 +00008315 install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
8316 install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008317 install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
paul718e3742002-12-13 20:15:29 +00008318
8319 /* "ospf abr-type" commands. */
8320 install_element (OSPF_NODE, &ospf_abr_type_cmd);
8321 install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
8322
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00008323 /* "ospf log-adjacency-changes" commands. */
8324 install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
8325 install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
8326 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
8327 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
8328
paul718e3742002-12-13 20:15:29 +00008329 /* "ospf rfc1583-compatible" commands. */
8330 install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
8331 install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
8332 install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
8333 install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
8334
8335 /* "network area" commands. */
paula2c62832003-04-23 17:01:31 +00008336 install_element (OSPF_NODE, &ospf_network_area_cmd);
8337 install_element (OSPF_NODE, &no_ospf_network_area_cmd);
paul718e3742002-12-13 20:15:29 +00008338
8339 /* "area authentication" commands. */
paula2c62832003-04-23 17:01:31 +00008340 install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
8341 install_element (OSPF_NODE, &ospf_area_authentication_cmd);
8342 install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
paul718e3742002-12-13 20:15:29 +00008343
8344 /* "area range" commands. */
paula2c62832003-04-23 17:01:31 +00008345 install_element (OSPF_NODE, &ospf_area_range_cmd);
8346 install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
8347 install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
8348 install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
8349 install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
8350 install_element (OSPF_NODE, &no_ospf_area_range_cmd);
8351 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
8352 install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
8353 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
8354 install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
8355 install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
paul718e3742002-12-13 20:15:29 +00008356
8357 /* "area virtual-link" commands. */
paula2c62832003-04-23 17:01:31 +00008358 install_element (OSPF_NODE, &ospf_area_vlink_cmd);
8359 install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
paul718e3742002-12-13 20:15:29 +00008360
paula2c62832003-04-23 17:01:31 +00008361 install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
8362 install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
paul718e3742002-12-13 20:15:29 +00008363
paula2c62832003-04-23 17:01:31 +00008364 install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
8365 install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
paul718e3742002-12-13 20:15:29 +00008366
paula2c62832003-04-23 17:01:31 +00008367 install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
8368 install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
paul718e3742002-12-13 20:15:29 +00008369
paula2c62832003-04-23 17:01:31 +00008370 install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
8371 install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
paul718e3742002-12-13 20:15:29 +00008372
paula2c62832003-04-23 17:01:31 +00008373 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
8374 install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
8375 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
paul718e3742002-12-13 20:15:29 +00008376
paula2c62832003-04-23 17:01:31 +00008377 install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
8378 install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008379
paula2c62832003-04-23 17:01:31 +00008380 install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
8381 install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008382
paula2c62832003-04-23 17:01:31 +00008383 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
8384 install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
8385 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008386
paula2c62832003-04-23 17:01:31 +00008387 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
8388 install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
8389 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008390
8391 /* "area stub" commands. */
paula2c62832003-04-23 17:01:31 +00008392 install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
8393 install_element (OSPF_NODE, &ospf_area_stub_cmd);
8394 install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
8395 install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
paul718e3742002-12-13 20:15:29 +00008396
paul718e3742002-12-13 20:15:29 +00008397 /* "area nssa" commands. */
paula2c62832003-04-23 17:01:31 +00008398 install_element (OSPF_NODE, &ospf_area_nssa_cmd);
8399 install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
8400 install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
8401 install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
8402 install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
8403 install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
paul718e3742002-12-13 20:15:29 +00008404
paula2c62832003-04-23 17:01:31 +00008405 install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
8406 install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
paul718e3742002-12-13 20:15:29 +00008407
paula2c62832003-04-23 17:01:31 +00008408 install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
8409 install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
paul718e3742002-12-13 20:15:29 +00008410
paula2c62832003-04-23 17:01:31 +00008411 install_element (OSPF_NODE, &ospf_area_export_list_cmd);
8412 install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
paul718e3742002-12-13 20:15:29 +00008413
paula2c62832003-04-23 17:01:31 +00008414 install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
8415 install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
paul718e3742002-12-13 20:15:29 +00008416
paula2c62832003-04-23 17:01:31 +00008417 install_element (OSPF_NODE, &ospf_area_import_list_cmd);
8418 install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
paul88d6cf32005-10-29 12:50:09 +00008419
8420 /* SPF timer commands */
paula2c62832003-04-23 17:01:31 +00008421 install_element (OSPF_NODE, &ospf_timers_spf_cmd);
8422 install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
pauld24f6e22005-10-21 09:23:12 +00008423 install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
8424 install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
8425
paul88d6cf32005-10-29 12:50:09 +00008426 /* refresh timer commands */
paula2c62832003-04-23 17:01:31 +00008427 install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
8428 install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
8429 install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
paul718e3742002-12-13 20:15:29 +00008430
paul88d6cf32005-10-29 12:50:09 +00008431 /* max-metric commands */
8432 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
8433 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
8434 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
8435 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
8436 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
8437 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
8438
8439 /* reference bandwidth commands */
paula2c62832003-04-23 17:01:31 +00008440 install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
8441 install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
paul718e3742002-12-13 20:15:29 +00008442
8443 /* "neighbor" commands. */
paula2c62832003-04-23 17:01:31 +00008444 install_element (OSPF_NODE, &ospf_neighbor_cmd);
8445 install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
8446 install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
8447 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
8448 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
8449 install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
8450 install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
8451 install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
paul718e3742002-12-13 20:15:29 +00008452
8453 /* Init interface related vty commands. */
8454 ospf_vty_if_init ();
8455
8456 /* Init zebra related vty commands. */
8457 ospf_vty_zebra_init ();
8458}