blob: 5e5a0b0d58fbb45a9dca7c72fa7e06d55ca276b3 [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 {
Ulrich Weber664711c2011-12-21 02:24:11 +040083 if (*str == '-')
84 return -1;
85 errno = 0;
paul718e3742002-12-13 20:15:29 +000086 ret = strtoul (str, &endptr, 10);
Ulrich Weber664711c2011-12-21 02:24:11 +040087 if (*endptr != '\0' || errno || ret > UINT32_MAX)
paul718e3742002-12-13 20:15:29 +000088 return -1;
89
90 area_id->s_addr = htonl (ret);
91 *format = OSPF_AREA_ID_FORMAT_DECIMAL;
92 }
93
94 return 0;
95}
96
97
paul4dadc292005-05-06 21:37:42 +000098static int
paul6c835672004-10-11 11:00:30 +000099str2metric (const char *str, int *metric)
paul718e3742002-12-13 20:15:29 +0000100{
101 /* Sanity check. */
102 if (str == NULL)
103 return 0;
104
105 *metric = strtol (str, NULL, 10);
106 if (*metric < 0 && *metric > 16777214)
107 {
108 /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
109 return 0;
110 }
111
112 return 1;
113}
114
paul4dadc292005-05-06 21:37:42 +0000115static int
paul6c835672004-10-11 11:00:30 +0000116str2metric_type (const char *str, int *metric_type)
paul718e3742002-12-13 20:15:29 +0000117{
118 /* Sanity check. */
119 if (str == NULL)
120 return 0;
121
122 if (strncmp (str, "1", 1) == 0)
123 *metric_type = EXTERNAL_METRIC_TYPE_1;
124 else if (strncmp (str, "2", 1) == 0)
125 *metric_type = EXTERNAL_METRIC_TYPE_2;
126 else
127 return 0;
128
129 return 1;
130}
131
132int
133ospf_oi_count (struct interface *ifp)
134{
135 struct route_node *rn;
136 int i = 0;
137
138 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
139 if (rn->info)
140 i++;
141
142 return i;
143}
144
145
146DEFUN (router_ospf,
147 router_ospf_cmd,
148 "router ospf",
149 "Enable a routing process\n"
150 "Start OSPF configuration\n")
151{
152 vty->node = OSPF_NODE;
153 vty->index = ospf_get ();
154
155 return CMD_SUCCESS;
156}
157
158DEFUN (no_router_ospf,
159 no_router_ospf_cmd,
160 "no router ospf",
161 NO_STR
162 "Enable a routing process\n"
163 "Start OSPF configuration\n")
164{
paul020709f2003-04-04 02:44:16 +0000165 struct ospf *ospf;
166
167 ospf = ospf_lookup ();
168 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +0000169 {
paul020709f2003-04-04 02:44:16 +0000170 vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +0000171 return CMD_WARNING;
172 }
173
paul020709f2003-04-04 02:44:16 +0000174 ospf_finish (ospf);
paul718e3742002-12-13 20:15:29 +0000175
176 return CMD_SUCCESS;
177}
178
179DEFUN (ospf_router_id,
180 ospf_router_id_cmd,
181 "ospf router-id A.B.C.D",
182 "OSPF specific commands\n"
183 "router-id for the OSPF process\n"
184 "OSPF router-id in IP address format\n")
185{
paul68980082003-03-25 05:07:42 +0000186 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000187 struct in_addr router_id;
paul68980082003-03-25 05:07:42 +0000188 int ret;
paul718e3742002-12-13 20:15:29 +0000189
190 ret = inet_aton (argv[0], &router_id);
191 if (!ret)
192 {
193 vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
194 return CMD_WARNING;
195 }
196
paul68980082003-03-25 05:07:42 +0000197 ospf->router_id_static = router_id;
paulb29800a2005-11-20 14:50:45 +0000198
199 ospf_router_id_update (ospf);
200
paul718e3742002-12-13 20:15:29 +0000201 return CMD_SUCCESS;
202}
203
204ALIAS (ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000205 router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000206 "router-id A.B.C.D",
207 "router-id for the OSPF process\n"
208 "OSPF router-id in IP address format\n")
209
210DEFUN (no_ospf_router_id,
211 no_ospf_router_id_cmd,
212 "no ospf router-id",
213 NO_STR
214 "OSPF specific commands\n"
215 "router-id for the OSPF process\n")
216{
paul68980082003-03-25 05:07:42 +0000217 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000218
paul68980082003-03-25 05:07:42 +0000219 ospf->router_id_static.s_addr = 0;
220
221 ospf_router_id_update (ospf);
paul718e3742002-12-13 20:15:29 +0000222
223 return CMD_SUCCESS;
224}
225
226ALIAS (no_ospf_router_id,
paula2c62832003-04-23 17:01:31 +0000227 no_router_ospf_id_cmd,
paul718e3742002-12-13 20:15:29 +0000228 "no router-id",
229 NO_STR
230 "router-id for the OSPF process\n")
231
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000232static void
Andrew J. Schorr43540882006-11-28 16:36:39 +0000233ospf_passive_interface_default (struct ospf *ospf, u_char newval)
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000234{
235 struct listnode *ln;
236 struct interface *ifp;
237 struct ospf_interface *oi;
238
Andrew J. Schorr43540882006-11-28 16:36:39 +0000239 ospf->passive_interface_default = newval;
240
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000241 for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
242 {
243 if (ifp &&
244 OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
245 UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
246 }
247 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
248 {
249 if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
250 UNSET_IF_PARAM (oi->params, passive_interface);
Andrew J. Schorr43540882006-11-28 16:36:39 +0000251 /* update multicast memberships */
252 ospf_if_set_multicast(oi);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000253 }
254}
255
256static void
257ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
258 struct in_addr addr,
259 struct ospf_if_params *params, u_char value)
260{
261 u_char dflt;
262
263 params->passive_interface = value;
264 if (params != IF_DEF_PARAMS (ifp))
265 {
266 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
267 dflt = IF_DEF_PARAMS (ifp)->passive_interface;
268 else
269 dflt = ospf->passive_interface_default;
270
271 if (value != dflt)
272 SET_IF_PARAM (params, passive_interface);
273 else
274 UNSET_IF_PARAM (params, passive_interface);
275
276 ospf_free_if_params (ifp, addr);
277 ospf_if_update_params (ifp, addr);
278 }
279 else
280 {
281 if (value != ospf->passive_interface_default)
282 SET_IF_PARAM (params, passive_interface);
283 else
284 UNSET_IF_PARAM (params, passive_interface);
285 }
286}
287
paula2c62832003-04-23 17:01:31 +0000288DEFUN (ospf_passive_interface,
289 ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000290 "passive-interface IFNAME A.B.C.D",
291 "Suppress routing updates on an interface\n"
292 "Interface's name\n")
293{
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000294 struct interface *ifp;
295 struct in_addr addr;
296 int ret;
297 struct ospf_if_params *params;
298 struct route_node *rn;
299 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000300
Andrew J. Schorr43540882006-11-28 16:36:39 +0000301 if (argc == 0)
302 {
303 ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
304 return CMD_SUCCESS;
305 }
306
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000307 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000308
309 params = IF_DEF_PARAMS (ifp);
310
Andrew J. Schorr43540882006-11-28 16:36:39 +0000311 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000312 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000313 ret = inet_aton(argv[1], &addr);
314 if (!ret)
315 {
316 vty_out (vty, "Please specify interface address by A.B.C.D%s",
317 VTY_NEWLINE);
318 return CMD_WARNING;
319 }
paul718e3742002-12-13 20:15:29 +0000320
Andrew J. Schorr43540882006-11-28 16:36:39 +0000321 params = ospf_get_if_params (ifp, addr);
322 ospf_if_update_params (ifp, addr);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000323 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000324 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
325
ajsba6454e2005-02-08 15:37:30 +0000326 /* XXX We should call ospf_if_set_multicast on exactly those
327 * interfaces for which the passive property changed. It is too much
328 * work to determine this set, so we do this for every interface.
329 * This is safe and reasonable because ospf_if_set_multicast uses a
330 * record of joined groups to avoid systems calls if the desired
331 * memberships match the current memership.
332 */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000333
ajsba6454e2005-02-08 15:37:30 +0000334 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
335 {
336 struct ospf_interface *oi = rn->info;
337
338 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
Andrew J. Schorr43540882006-11-28 16:36:39 +0000339 ospf_if_set_multicast(oi);
ajsba6454e2005-02-08 15:37:30 +0000340 }
341 /*
342 * XXX It is not clear what state transitions the interface needs to
343 * undergo when going from active to passive. Fixing this will
344 * require precise identification of interfaces having such a
345 * transition.
346 */
347
paul718e3742002-12-13 20:15:29 +0000348 return CMD_SUCCESS;
349}
350
paula2c62832003-04-23 17:01:31 +0000351ALIAS (ospf_passive_interface,
352 ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000353 "passive-interface IFNAME",
354 "Suppress routing updates on an interface\n"
355 "Interface's name\n")
356
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000357ALIAS (ospf_passive_interface,
358 ospf_passive_interface_default_cmd,
359 "passive-interface default",
360 "Suppress routing updates on an interface\n"
361 "Suppress routing updates on interfaces by default\n")
362
paula2c62832003-04-23 17:01:31 +0000363DEFUN (no_ospf_passive_interface,
364 no_ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000365 "no passive-interface IFNAME A.B.C.D",
366 NO_STR
367 "Allow routing updates on an interface\n"
368 "Interface's name\n")
369{
370 struct interface *ifp;
371 struct in_addr addr;
372 struct ospf_if_params *params;
373 int ret;
ajsba6454e2005-02-08 15:37:30 +0000374 struct route_node *rn;
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000375 struct ospf *ospf = vty->index;
Andrew J. Schorr43540882006-11-28 16:36:39 +0000376
377 if (argc == 0)
378 {
379 ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
380 return CMD_SUCCESS;
381 }
paul718e3742002-12-13 20:15:29 +0000382
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000383 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000384
385 params = IF_DEF_PARAMS (ifp);
386
Andrew J. Schorr43540882006-11-28 16:36:39 +0000387 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000388 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000389 ret = inet_aton(argv[1], &addr);
390 if (!ret)
391 {
392 vty_out (vty, "Please specify interface address by A.B.C.D%s",
393 VTY_NEWLINE);
394 return CMD_WARNING;
395 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000396
Andrew J. Schorr43540882006-11-28 16:36:39 +0000397 params = ospf_lookup_if_params (ifp, addr);
398 if (params == NULL)
399 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000400 }
Andrew J. Schorr43540882006-11-28 16:36:39 +0000401 ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
ajsba6454e2005-02-08 15:37:30 +0000402
403 /* XXX We should call ospf_if_set_multicast on exactly those
404 * interfaces for which the passive property changed. It is too much
405 * work to determine this set, so we do this for every interface.
406 * This is safe and reasonable because ospf_if_set_multicast uses a
407 * record of joined groups to avoid systems calls if the desired
408 * memberships match the current memership.
409 */
410 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
411 {
412 struct ospf_interface *oi = rn->info;
413
414 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
415 ospf_if_set_multicast(oi);
416 }
417
paul718e3742002-12-13 20:15:29 +0000418 return CMD_SUCCESS;
419}
420
paula2c62832003-04-23 17:01:31 +0000421ALIAS (no_ospf_passive_interface,
422 no_ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000423 "no passive-interface IFNAME",
424 NO_STR
425 "Allow routing updates on an interface\n"
426 "Interface's name\n")
427
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000428ALIAS (no_ospf_passive_interface,
429 no_ospf_passive_interface_default_cmd,
430 "no passive-interface default",
431 NO_STR
432 "Allow routing updates on an interface\n"
433 "Allow routing updates on interfaces by default\n")
434
paula2c62832003-04-23 17:01:31 +0000435DEFUN (ospf_network_area,
436 ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000437 "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
438 "Enable routing on an IP network\n"
439 "OSPF network prefix\n"
440 "Set the OSPF area ID\n"
441 "OSPF area ID in IP address format\n"
442 "OSPF area ID as a decimal value\n")
443{
444 struct ospf *ospf= vty->index;
445 struct prefix_ipv4 p;
446 struct in_addr area_id;
447 int ret, format;
448
449 /* Get network prefix and Area ID. */
450 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
451 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
452
453 ret = ospf_network_set (ospf, &p, area_id);
454 if (ret == 0)
455 {
456 vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
457 return CMD_WARNING;
458 }
459
460 return CMD_SUCCESS;
461}
462
paula2c62832003-04-23 17:01:31 +0000463DEFUN (no_ospf_network_area,
464 no_ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000465 "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
466 NO_STR
467 "Enable routing on an IP network\n"
468 "OSPF network prefix\n"
469 "Set the OSPF area ID\n"
470 "OSPF area ID in IP address format\n"
471 "OSPF area ID as a decimal value\n")
472{
473 struct ospf *ospf = (struct ospf *) vty->index;
474 struct prefix_ipv4 p;
475 struct in_addr area_id;
476 int ret, format;
477
478 /* Get network prefix and Area ID. */
479 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
480 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
481
482 ret = ospf_network_unset (ospf, &p, area_id);
483 if (ret == 0)
484 {
485 vty_out (vty, "Can't find specified network area configuration.%s",
486 VTY_NEWLINE);
487 return CMD_WARNING;
488 }
489
490 return CMD_SUCCESS;
491}
492
493
paula2c62832003-04-23 17:01:31 +0000494DEFUN (ospf_area_range,
495 ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000496 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
497 "OSPF area parameters\n"
498 "OSPF area ID in IP address format\n"
499 "OSPF area ID as a decimal value\n"
500 "Summarize routes matching address/mask (border routers only)\n"
501 "Area range prefix\n")
502{
503 struct ospf *ospf = vty->index;
504 struct prefix_ipv4 p;
505 struct in_addr area_id;
506 int format;
507 u_int32_t cost;
508
509 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
510 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
511
512 ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
513 if (argc > 2)
514 {
paul4dadc292005-05-06 21:37:42 +0000515 VTY_GET_INTEGER ("range cost", cost, argv[2]);
paul718e3742002-12-13 20:15:29 +0000516 ospf_area_range_cost_set (ospf, area_id, &p, cost);
517 }
518
519 return CMD_SUCCESS;
520}
521
paula2c62832003-04-23 17:01:31 +0000522ALIAS (ospf_area_range,
523 ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000524 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
525 "OSPF area parameters\n"
526 "OSPF area ID in IP address format\n"
527 "OSPF area ID as a decimal value\n"
528 "OSPF area range for route advertise (default)\n"
529 "Area range prefix\n"
530 "Advertise this range (default)\n")
531
paula2c62832003-04-23 17:01:31 +0000532ALIAS (ospf_area_range,
533 ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000534 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
535 "OSPF area parameters\n"
536 "OSPF area ID in IP address format\n"
537 "OSPF area ID as a decimal value\n"
538 "Summarize routes matching address/mask (border routers only)\n"
539 "Area range prefix\n"
540 "User specified metric for this range\n"
541 "Advertised metric for this range\n")
542
paula2c62832003-04-23 17:01:31 +0000543ALIAS (ospf_area_range,
544 ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000545 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
546 "OSPF area parameters\n"
547 "OSPF area ID in IP address format\n"
548 "OSPF area ID as a decimal value\n"
549 "Summarize routes matching address/mask (border routers only)\n"
550 "Area range prefix\n"
551 "Advertise this range (default)\n"
552 "User specified metric for this range\n"
553 "Advertised metric for this range\n")
554
paula2c62832003-04-23 17:01:31 +0000555DEFUN (ospf_area_range_not_advertise,
556 ospf_area_range_not_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000557 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
558 "OSPF area parameters\n"
559 "OSPF area ID in IP address format\n"
560 "OSPF area ID as a decimal value\n"
561 "Summarize routes matching address/mask (border routers only)\n"
562 "Area range prefix\n"
563 "DoNotAdvertise this range\n")
564{
565 struct ospf *ospf = vty->index;
566 struct prefix_ipv4 p;
567 struct in_addr area_id;
568 int format;
569
570 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
571 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
572
573 ospf_area_range_set (ospf, area_id, &p, 0);
574
575 return CMD_SUCCESS;
576}
577
paula2c62832003-04-23 17:01:31 +0000578DEFUN (no_ospf_area_range,
579 no_ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000580 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
581 NO_STR
582 "OSPF area parameters\n"
583 "OSPF area ID in IP address format\n"
584 "OSPF area ID as a decimal value\n"
585 "Summarize routes matching address/mask (border routers only)\n"
586 "Area range prefix\n")
587{
588 struct ospf *ospf = vty->index;
589 struct prefix_ipv4 p;
590 struct in_addr area_id;
591 int format;
592
593 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
594 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
595
596 ospf_area_range_unset (ospf, area_id, &p);
597
598 return CMD_SUCCESS;
599}
600
paula2c62832003-04-23 17:01:31 +0000601ALIAS (no_ospf_area_range,
602 no_ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000603 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
604 NO_STR
605 "OSPF area parameters\n"
606 "OSPF area ID in IP address format\n"
607 "OSPF area ID as a decimal value\n"
608 "Summarize routes matching address/mask (border routers only)\n"
609 "Area range prefix\n"
610 "Advertise this range (default)\n"
611 "DoNotAdvertise this range\n")
612
paula2c62832003-04-23 17:01:31 +0000613ALIAS (no_ospf_area_range,
614 no_ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000615 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
616 NO_STR
617 "OSPF area parameters\n"
618 "OSPF area ID in IP address format\n"
619 "OSPF area ID as a decimal value\n"
620 "Summarize routes matching address/mask (border routers only)\n"
621 "Area range prefix\n"
622 "User specified metric for this range\n"
623 "Advertised metric for this range\n")
624
paula2c62832003-04-23 17:01:31 +0000625ALIAS (no_ospf_area_range,
626 no_ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000627 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
628 NO_STR
629 "OSPF area parameters\n"
630 "OSPF area ID in IP address format\n"
631 "OSPF area ID as a decimal value\n"
632 "Summarize routes matching address/mask (border routers only)\n"
633 "Area range prefix\n"
634 "Advertise this range (default)\n"
635 "User specified metric for this range\n"
636 "Advertised metric for this range\n")
637
paula2c62832003-04-23 17:01:31 +0000638DEFUN (ospf_area_range_substitute,
639 ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000640 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
641 "OSPF area parameters\n"
642 "OSPF area ID in IP address format\n"
643 "OSPF area ID as a decimal value\n"
644 "Summarize routes matching address/mask (border routers only)\n"
645 "Area range prefix\n"
646 "Announce area range as another prefix\n"
647 "Network prefix to be announced instead of range\n")
648{
649 struct ospf *ospf = vty->index;
650 struct prefix_ipv4 p, s;
651 struct in_addr area_id;
652 int format;
653
654 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
655 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
656 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
657
658 ospf_area_range_substitute_set (ospf, area_id, &p, &s);
659
660 return CMD_SUCCESS;
661}
662
paula2c62832003-04-23 17:01:31 +0000663DEFUN (no_ospf_area_range_substitute,
664 no_ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000665 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
666 NO_STR
667 "OSPF area parameters\n"
668 "OSPF area ID in IP address format\n"
669 "OSPF area ID as a decimal value\n"
670 "Summarize routes matching address/mask (border routers only)\n"
671 "Area range prefix\n"
672 "Announce area range as another prefix\n"
673 "Network prefix to be announced instead of range\n")
674{
675 struct ospf *ospf = vty->index;
676 struct prefix_ipv4 p, s;
677 struct in_addr area_id;
678 int format;
679
680 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
681 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
682 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
683
684 ospf_area_range_substitute_unset (ospf, area_id, &p);
685
686 return CMD_SUCCESS;
687}
688
689
690/* Command Handler Logic in VLink stuff is delicate!!
691
692 ALTER AT YOUR OWN RISK!!!!
693
694 Various dummy values are used to represent 'NoChange' state for
695 VLink configuration NOT being changed by a VLink command, and
696 special syntax is used within the command strings so that the
697 typed in command verbs can be seen in the configuration command
698 bacckend handler. This is to drastically reduce the verbeage
699 required to coe up with a reasonably compatible Cisco VLink command
700
701 - Matthew Grant <grantma@anathoth.gen.nz>
702 Wed, 21 Feb 2001 15:13:52 +1300
703 */
704
705
706/* Configuration data for virtual links
707 */
708struct ospf_vl_config_data {
709 struct vty *vty; /* vty stuff */
710 struct in_addr area_id; /* area ID from command line */
711 int format; /* command line area ID format */
712 struct in_addr vl_peer; /* command line vl_peer */
713 int auth_type; /* Authehntication type, if given */
714 char *auth_key; /* simple password if present */
715 int crypto_key_id; /* Cryptographic key ID */
716 char *md5_key; /* MD5 authentication key */
717 int hello_interval; /* Obvious what these are... */
718 int retransmit_interval;
719 int transmit_delay;
720 int dead_interval;
721};
722
paul4dadc292005-05-06 21:37:42 +0000723static void
paul718e3742002-12-13 20:15:29 +0000724ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
725 struct vty *vty)
726{
727 memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
728 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
729 vl_config->vty = vty;
730}
731
paul4dadc292005-05-06 21:37:42 +0000732static struct ospf_vl_data *
paul68980082003-03-25 05:07:42 +0000733ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000734{
735 struct ospf_area *area;
736 struct ospf_vl_data *vl_data;
737 struct vty *vty;
738 struct in_addr area_id;
739
740 vty = vl_config->vty;
741 area_id = vl_config->area_id;
742
743 if (area_id.s_addr == OSPF_AREA_BACKBONE)
744 {
745 vty_out (vty,
746 "Configuring VLs over the backbone is not allowed%s",
747 VTY_NEWLINE);
748 return NULL;
749 }
paul68980082003-03-25 05:07:42 +0000750 area = ospf_area_get (ospf, area_id, vl_config->format);
paul718e3742002-12-13 20:15:29 +0000751
752 if (area->external_routing != OSPF_AREA_DEFAULT)
753 {
754 if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
755 vty_out (vty, "Area %s is %s%s",
756 inet_ntoa (area_id),
paul718e3742002-12-13 20:15:29 +0000757 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000758 VTY_NEWLINE);
759 else
760 vty_out (vty, "Area %ld is %s%s",
761 (u_long)ntohl (area_id.s_addr),
paul718e3742002-12-13 20:15:29 +0000762 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000763 VTY_NEWLINE);
764 return NULL;
765 }
766
Paul Jakma9c27ef92006-05-04 07:32:57 +0000767 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
paul718e3742002-12-13 20:15:29 +0000768 {
769 vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
770 if (vl_data->vl_oi == NULL)
771 {
paul68980082003-03-25 05:07:42 +0000772 vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
773 ospf_vl_add (ospf, vl_data);
774 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +0000775 }
776 }
777 return vl_data;
778}
779
780
paul4dadc292005-05-06 21:37:42 +0000781static int
paul718e3742002-12-13 20:15:29 +0000782ospf_vl_set_security (struct ospf_vl_data *vl_data,
783 struct ospf_vl_config_data *vl_config)
784{
785 struct crypt_key *ck;
786 struct vty *vty;
787 struct interface *ifp = vl_data->vl_oi->ifp;
788
789 vty = vl_config->vty;
790
791 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
792 {
793 SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
794 IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
795 }
796
797 if (vl_config->auth_key)
798 {
799 memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000800 strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
paul718e3742002-12-13 20:15:29 +0000801 OSPF_AUTH_SIMPLE_SIZE);
802 }
803 else if (vl_config->md5_key)
804 {
805 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
806 != NULL)
807 {
808 vty_out (vty, "OSPF: Key %d already exists%s",
809 vl_config->crypto_key_id, VTY_NEWLINE);
810 return CMD_WARNING;
811 }
812 ck = ospf_crypt_key_new ();
813 ck->key_id = vl_config->crypto_key_id;
814 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000815 strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +0000816
817 ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
818 }
819 else if (vl_config->crypto_key_id != 0)
820 {
821 /* Delete a key */
822
823 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
824 vl_config->crypto_key_id) == NULL)
825 {
826 vty_out (vty, "OSPF: Key %d does not exist%s",
827 vl_config->crypto_key_id, VTY_NEWLINE);
828 return CMD_WARNING;
829 }
830
831 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
832
833 }
834
835 return CMD_SUCCESS;
836}
837
paul4dadc292005-05-06 21:37:42 +0000838static int
paul718e3742002-12-13 20:15:29 +0000839ospf_vl_set_timers (struct ospf_vl_data *vl_data,
840 struct ospf_vl_config_data *vl_config)
841{
842 struct interface *ifp = ifp = vl_data->vl_oi->ifp;
843 /* Virtual Link data initialised to defaults, so only set
844 if a value given */
845 if (vl_config->hello_interval)
846 {
847 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
848 IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
849 }
850
851 if (vl_config->dead_interval)
852 {
853 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
854 IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
855 }
856
857 if (vl_config->retransmit_interval)
858 {
859 SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
860 IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
861 }
862
863 if (vl_config->transmit_delay)
864 {
865 SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
866 IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
867 }
868
869 return CMD_SUCCESS;
870}
871
872
873
874/* The business end of all of the above */
paul4dadc292005-05-06 21:37:42 +0000875static int
paul68980082003-03-25 05:07:42 +0000876ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000877{
878 struct ospf_vl_data *vl_data;
879 int ret;
880
paul68980082003-03-25 05:07:42 +0000881 vl_data = ospf_find_vl_data (ospf, vl_config);
paul718e3742002-12-13 20:15:29 +0000882 if (!vl_data)
883 return CMD_WARNING;
884
885 /* Process this one first as it can have a fatal result, which can
886 only logically occur if the virtual link exists already
887 Thus a command error does not result in a change to the
888 running configuration such as unexpectedly altered timer
889 values etc.*/
890 ret = ospf_vl_set_security (vl_data, vl_config);
891 if (ret != CMD_SUCCESS)
892 return ret;
893
894 /* Set any time based parameters, these area already range checked */
895
896 ret = ospf_vl_set_timers (vl_data, vl_config);
897 if (ret != CMD_SUCCESS)
898 return ret;
899
900 return CMD_SUCCESS;
901
902}
903
904/* This stuff exists to make specifying all the alias commands A LOT simpler
905 */
906#define VLINK_HELPSTR_IPADDR \
907 "OSPF area parameters\n" \
908 "OSPF area ID in IP address format\n" \
909 "OSPF area ID as a decimal value\n" \
910 "Configure a virtual link\n" \
911 "Router ID of the remote ABR\n"
912
913#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
914 "Enable authentication on this virtual link\n" \
915 "dummy string \n"
916
917#define VLINK_HELPSTR_AUTHTYPE_ALL \
918 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
919 "Use null authentication\n" \
920 "Use message-digest authentication\n"
921
922#define VLINK_HELPSTR_TIME_PARAM_NOSECS \
923 "Time between HELLO packets\n" \
924 "Time between retransmitting lost link state advertisements\n" \
925 "Link state transmit delay\n" \
926 "Interval after which a neighbor is declared dead\n"
927
928#define VLINK_HELPSTR_TIME_PARAM \
929 VLINK_HELPSTR_TIME_PARAM_NOSECS \
930 "Seconds\n"
931
932#define VLINK_HELPSTR_AUTH_SIMPLE \
933 "Authentication password (key)\n" \
934 "The OSPF password (key)"
935
936#define VLINK_HELPSTR_AUTH_MD5 \
937 "Message digest authentication password (key)\n" \
938 "dummy string \n" \
939 "Key ID\n" \
940 "Use MD5 algorithm\n" \
941 "The OSPF password (key)"
942
paula2c62832003-04-23 17:01:31 +0000943DEFUN (ospf_area_vlink,
944 ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +0000945 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
946 VLINK_HELPSTR_IPADDR)
947{
paul68980082003-03-25 05:07:42 +0000948 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000949 struct ospf_vl_config_data vl_config;
950 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
951 char md5_key[OSPF_AUTH_MD5_SIZE+1];
952 int i;
953 int ret;
954
955 ospf_vl_config_data_init(&vl_config, vty);
956
957 /* Read off first 2 parameters and check them */
958 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
959 if (ret < 0)
960 {
961 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
962 return CMD_WARNING;
963 }
964
965 ret = inet_aton (argv[1], &vl_config.vl_peer);
966 if (! ret)
967 {
968 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
969 VTY_NEWLINE);
970 return CMD_WARNING;
971 }
972
973 if (argc <=2)
974 {
975 /* Thats all folks! - BUGS B. strikes again!!!*/
976
paul68980082003-03-25 05:07:42 +0000977 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +0000978 }
979
980 /* Deal with other parameters */
981 for (i=2; i < argc; i++)
982 {
983
984 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
985
986 switch (argv[i][0])
987 {
988
989 case 'a':
990 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
991 {
992 /* authentication-key - this option can occur anywhere on
993 command line. At start of command line
994 must check for authentication option. */
995 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
996 strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
997 vl_config.auth_key = auth_key;
998 i++;
999 }
1000 else if (strncmp (argv[i], "authentication", 14) == 0)
1001 {
1002 /* authentication - this option can only occur at start
1003 of command line */
1004 vl_config.auth_type = OSPF_AUTH_SIMPLE;
1005 if ((i+1) < argc)
1006 {
1007 if (strncmp (argv[i+1], "n", 1) == 0)
1008 {
1009 /* "authentication null" */
1010 vl_config.auth_type = OSPF_AUTH_NULL;
1011 i++;
1012 }
1013 else if (strncmp (argv[i+1], "m", 1) == 0
1014 && strcmp (argv[i+1], "message-digest-") != 0)
1015 {
1016 /* "authentication message-digest" */
1017 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1018 i++;
1019 }
1020 }
1021 }
1022 break;
1023
1024 case 'm':
1025 /* message-digest-key */
1026 i++;
1027 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1028 if (vl_config.crypto_key_id < 0)
1029 return CMD_WARNING;
1030 i++;
1031 memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1032 strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1033 vl_config.md5_key = md5_key;
1034 break;
1035
1036 case 'h':
1037 /* Hello interval */
1038 i++;
1039 vl_config.hello_interval = strtol (argv[i], NULL, 10);
1040 if (vl_config.hello_interval < 0)
1041 return CMD_WARNING;
1042 break;
1043
1044 case 'r':
1045 /* Retransmit Interval */
1046 i++;
1047 vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1048 if (vl_config.retransmit_interval < 0)
1049 return CMD_WARNING;
1050 break;
1051
1052 case 't':
1053 /* Transmit Delay */
1054 i++;
1055 vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1056 if (vl_config.transmit_delay < 0)
1057 return CMD_WARNING;
1058 break;
1059
1060 case 'd':
1061 /* Dead Interval */
1062 i++;
1063 vl_config.dead_interval = strtol (argv[i], NULL, 10);
1064 if (vl_config.dead_interval < 0)
1065 return CMD_WARNING;
1066 break;
1067 }
1068 }
1069
1070
1071 /* Action configuration */
1072
paul68980082003-03-25 05:07:42 +00001073 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001074
1075}
1076
paula2c62832003-04-23 17:01:31 +00001077DEFUN (no_ospf_area_vlink,
1078 no_ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +00001079 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1080 NO_STR
1081 VLINK_HELPSTR_IPADDR)
1082{
paul68980082003-03-25 05:07:42 +00001083 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001084 struct ospf_area *area;
1085 struct ospf_vl_config_data vl_config;
1086 struct ospf_vl_data *vl_data = NULL;
1087 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1088 int i;
1089 int ret, format;
1090
1091 ospf_vl_config_data_init(&vl_config, vty);
1092
1093 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1094 if (ret < 0)
1095 {
1096 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1097 return CMD_WARNING;
1098 }
1099
paul68980082003-03-25 05:07:42 +00001100 area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001101 if (!area)
1102 {
1103 vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1104 return CMD_WARNING;
1105 }
1106
1107 ret = inet_aton (argv[1], &vl_config.vl_peer);
1108 if (! ret)
1109 {
1110 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1111 VTY_NEWLINE);
1112 return CMD_WARNING;
1113 }
1114
1115 if (argc <=2)
1116 {
1117 /* Basic VLink no command */
1118 /* Thats all folks! - BUGS B. strikes again!!!*/
Paul Jakma9c27ef92006-05-04 07:32:57 +00001119 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
paul68980082003-03-25 05:07:42 +00001120 ospf_vl_delete (ospf, vl_data);
paul718e3742002-12-13 20:15:29 +00001121
paul68980082003-03-25 05:07:42 +00001122 ospf_area_check_free (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001123
1124 return CMD_SUCCESS;
1125 }
1126
1127 /* If we are down here, we are reseting parameters */
1128
1129 /* Deal with other parameters */
1130 for (i=2; i < argc; i++)
1131 {
paul718e3742002-12-13 20:15:29 +00001132 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1133
1134 switch (argv[i][0])
1135 {
1136
1137 case 'a':
1138 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1139 {
1140 /* authentication-key - this option can occur anywhere on
1141 command line. At start of command line
1142 must check for authentication option. */
1143 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1144 vl_config.auth_key = auth_key;
1145 }
1146 else if (strncmp (argv[i], "authentication", 14) == 0)
1147 {
1148 /* authentication - this option can only occur at start
1149 of command line */
1150 vl_config.auth_type = OSPF_AUTH_NOTSET;
1151 }
1152 break;
1153
1154 case 'm':
1155 /* message-digest-key */
1156 /* Delete one key */
1157 i++;
1158 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1159 if (vl_config.crypto_key_id < 0)
1160 return CMD_WARNING;
1161 vl_config.md5_key = NULL;
1162 break;
1163
1164 case 'h':
1165 /* Hello interval */
1166 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1167 break;
1168
1169 case 'r':
1170 /* Retransmit Interval */
1171 vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1172 break;
1173
1174 case 't':
1175 /* Transmit Delay */
1176 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1177 break;
1178
1179 case 'd':
1180 /* Dead Interval */
1181 i++;
1182 vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1183 break;
1184 }
1185 }
1186
1187
1188 /* Action configuration */
1189
paul68980082003-03-25 05:07:42 +00001190 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001191}
1192
paula2c62832003-04-23 17:01:31 +00001193ALIAS (ospf_area_vlink,
1194 ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001195 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1196 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1197 VLINK_HELPSTR_IPADDR
1198 VLINK_HELPSTR_TIME_PARAM)
1199
paula2c62832003-04-23 17:01:31 +00001200ALIAS (no_ospf_area_vlink,
1201 no_ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001202 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1203 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1204 NO_STR
1205 VLINK_HELPSTR_IPADDR
1206 VLINK_HELPSTR_TIME_PARAM)
1207
paula2c62832003-04-23 17:01:31 +00001208ALIAS (ospf_area_vlink,
1209 ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001210 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1211 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1212 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1213 VLINK_HELPSTR_IPADDR
1214 VLINK_HELPSTR_TIME_PARAM
1215 VLINK_HELPSTR_TIME_PARAM)
1216
paula2c62832003-04-23 17:01:31 +00001217ALIAS (no_ospf_area_vlink,
1218 no_ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001219 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1220 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1221 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1222 NO_STR
1223 VLINK_HELPSTR_IPADDR
1224 VLINK_HELPSTR_TIME_PARAM
1225 VLINK_HELPSTR_TIME_PARAM)
1226
paula2c62832003-04-23 17:01:31 +00001227ALIAS (ospf_area_vlink,
1228 ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001229 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1230 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
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 VLINK_HELPSTR_TIME_PARAM)
1237
paula2c62832003-04-23 17:01:31 +00001238ALIAS (no_ospf_area_vlink,
1239 no_ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001240 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1241 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1242 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1243 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1244 NO_STR
1245 VLINK_HELPSTR_IPADDR
1246 VLINK_HELPSTR_TIME_PARAM
1247 VLINK_HELPSTR_TIME_PARAM
1248 VLINK_HELPSTR_TIME_PARAM)
1249
paula2c62832003-04-23 17:01:31 +00001250ALIAS (ospf_area_vlink,
1251 ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001252 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1253 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1254 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1255 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1256 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1257 VLINK_HELPSTR_IPADDR
1258 VLINK_HELPSTR_TIME_PARAM
1259 VLINK_HELPSTR_TIME_PARAM
1260 VLINK_HELPSTR_TIME_PARAM
1261 VLINK_HELPSTR_TIME_PARAM)
1262
paula2c62832003-04-23 17:01:31 +00001263ALIAS (no_ospf_area_vlink,
1264 no_ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001265 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1266 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1267 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1268 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1269 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1270 NO_STR
1271 VLINK_HELPSTR_IPADDR
1272 VLINK_HELPSTR_TIME_PARAM
1273 VLINK_HELPSTR_TIME_PARAM
1274 VLINK_HELPSTR_TIME_PARAM
1275 VLINK_HELPSTR_TIME_PARAM)
1276
paula2c62832003-04-23 17:01:31 +00001277ALIAS (ospf_area_vlink,
1278 ospf_area_vlink_authtype_args_cmd,
paul718e3742002-12-13 20:15:29 +00001279 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1280 "(authentication|) (message-digest|null)",
1281 VLINK_HELPSTR_IPADDR
1282 VLINK_HELPSTR_AUTHTYPE_ALL)
1283
paula2c62832003-04-23 17:01:31 +00001284ALIAS (ospf_area_vlink,
1285 ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001286 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1287 "(authentication|)",
1288 VLINK_HELPSTR_IPADDR
1289 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1290
paula2c62832003-04-23 17:01:31 +00001291ALIAS (no_ospf_area_vlink,
1292 no_ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001293 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1294 "(authentication|)",
1295 NO_STR
1296 VLINK_HELPSTR_IPADDR
1297 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1298
paula2c62832003-04-23 17:01:31 +00001299ALIAS (ospf_area_vlink,
1300 ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001301 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1302 "(message-digest-key|) <1-255> md5 KEY",
1303 VLINK_HELPSTR_IPADDR
1304 VLINK_HELPSTR_AUTH_MD5)
1305
paula2c62832003-04-23 17:01:31 +00001306ALIAS (no_ospf_area_vlink,
1307 no_ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001308 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1309 "(message-digest-key|) <1-255>",
1310 NO_STR
1311 VLINK_HELPSTR_IPADDR
1312 VLINK_HELPSTR_AUTH_MD5)
1313
paula2c62832003-04-23 17:01:31 +00001314ALIAS (ospf_area_vlink,
1315 ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001316 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1317 "(authentication-key|) AUTH_KEY",
1318 VLINK_HELPSTR_IPADDR
1319 VLINK_HELPSTR_AUTH_SIMPLE)
1320
paula2c62832003-04-23 17:01:31 +00001321ALIAS (no_ospf_area_vlink,
1322 no_ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001323 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1324 "(authentication-key|)",
1325 NO_STR
1326 VLINK_HELPSTR_IPADDR
1327 VLINK_HELPSTR_AUTH_SIMPLE)
1328
paula2c62832003-04-23 17:01:31 +00001329ALIAS (ospf_area_vlink,
1330 ospf_area_vlink_authtype_args_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001331 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1332 "(authentication|) (message-digest|null) "
1333 "(authentication-key|) AUTH_KEY",
1334 VLINK_HELPSTR_IPADDR
1335 VLINK_HELPSTR_AUTHTYPE_ALL
1336 VLINK_HELPSTR_AUTH_SIMPLE)
1337
paula2c62832003-04-23 17:01:31 +00001338ALIAS (ospf_area_vlink,
1339 ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001340 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1341 "(authentication|) "
1342 "(authentication-key|) AUTH_KEY",
1343 VLINK_HELPSTR_IPADDR
1344 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1345 VLINK_HELPSTR_AUTH_SIMPLE)
1346
paula2c62832003-04-23 17:01:31 +00001347ALIAS (no_ospf_area_vlink,
1348 no_ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001349 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1350 "(authentication|) "
1351 "(authentication-key|)",
1352 NO_STR
1353 VLINK_HELPSTR_IPADDR
1354 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1355 VLINK_HELPSTR_AUTH_SIMPLE)
1356
paula2c62832003-04-23 17:01:31 +00001357ALIAS (ospf_area_vlink,
1358 ospf_area_vlink_authtype_args_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001359 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1360 "(authentication|) (message-digest|null) "
1361 "(message-digest-key|) <1-255> md5 KEY",
1362 VLINK_HELPSTR_IPADDR
1363 VLINK_HELPSTR_AUTHTYPE_ALL
1364 VLINK_HELPSTR_AUTH_MD5)
1365
paula2c62832003-04-23 17:01:31 +00001366ALIAS (ospf_area_vlink,
1367 ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001368 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1369 "(authentication|) "
1370 "(message-digest-key|) <1-255> md5 KEY",
1371 VLINK_HELPSTR_IPADDR
1372 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1373 VLINK_HELPSTR_AUTH_MD5)
1374
paula2c62832003-04-23 17:01:31 +00001375ALIAS (no_ospf_area_vlink,
1376 no_ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001377 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1378 "(authentication|) "
1379 "(message-digest-key|)",
1380 NO_STR
1381 VLINK_HELPSTR_IPADDR
1382 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1383 VLINK_HELPSTR_AUTH_MD5)
1384
1385
paula2c62832003-04-23 17:01:31 +00001386DEFUN (ospf_area_shortcut,
1387 ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001388 "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1389 "OSPF area parameters\n"
1390 "OSPF area ID in IP address format\n"
1391 "OSPF area ID as a decimal value\n"
1392 "Configure the area's shortcutting mode\n"
1393 "Set default shortcutting behavior\n"
1394 "Enable shortcutting through the area\n"
1395 "Disable shortcutting through the area\n")
1396{
paul68980082003-03-25 05:07:42 +00001397 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001398 struct ospf_area *area;
1399 struct in_addr area_id;
1400 int mode;
1401 int format;
1402
1403 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1404
paul68980082003-03-25 05:07:42 +00001405 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001406
1407 if (strncmp (argv[1], "de", 2) == 0)
1408 mode = OSPF_SHORTCUT_DEFAULT;
1409 else if (strncmp (argv[1], "di", 2) == 0)
1410 mode = OSPF_SHORTCUT_DISABLE;
1411 else if (strncmp (argv[1], "e", 1) == 0)
1412 mode = OSPF_SHORTCUT_ENABLE;
1413 else
1414 return CMD_WARNING;
1415
paul68980082003-03-25 05:07:42 +00001416 ospf_area_shortcut_set (ospf, area, mode);
paul718e3742002-12-13 20:15:29 +00001417
paul68980082003-03-25 05:07:42 +00001418 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
paul718e3742002-12-13 20:15:29 +00001419 vty_out (vty, "Shortcut area setting will take effect "
1420 "only when the router is configured as Shortcut ABR%s",
1421 VTY_NEWLINE);
1422
1423 return CMD_SUCCESS;
1424}
1425
paula2c62832003-04-23 17:01:31 +00001426DEFUN (no_ospf_area_shortcut,
1427 no_ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001428 "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1429 NO_STR
1430 "OSPF area parameters\n"
1431 "OSPF area ID in IP address format\n"
1432 "OSPF area ID as a decimal value\n"
1433 "Deconfigure the area's shortcutting mode\n"
1434 "Deconfigure enabled shortcutting through the area\n"
1435 "Deconfigure disabled shortcutting through the area\n")
1436{
paul68980082003-03-25 05:07:42 +00001437 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001438 struct ospf_area *area;
1439 struct in_addr area_id;
1440 int format;
1441
1442 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1443
paul68980082003-03-25 05:07:42 +00001444 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001445 if (!area)
1446 return CMD_SUCCESS;
1447
paul68980082003-03-25 05:07:42 +00001448 ospf_area_shortcut_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001449
1450 return CMD_SUCCESS;
1451}
1452
1453
paula2c62832003-04-23 17:01:31 +00001454DEFUN (ospf_area_stub,
1455 ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001456 "area (A.B.C.D|<0-4294967295>) stub",
1457 "OSPF area parameters\n"
1458 "OSPF area ID in IP address format\n"
1459 "OSPF area ID as a decimal value\n"
1460 "Configure OSPF area as stub\n")
1461{
1462 struct ospf *ospf = vty->index;
1463 struct in_addr area_id;
1464 int ret, format;
1465
1466 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1467
1468 ret = ospf_area_stub_set (ospf, area_id);
1469 if (ret == 0)
1470 {
1471 vty_out (vty, "First deconfigure all virtual link through this area%s",
1472 VTY_NEWLINE);
1473 return CMD_WARNING;
1474 }
1475
1476 ospf_area_no_summary_unset (ospf, area_id);
1477
1478 return CMD_SUCCESS;
1479}
1480
paula2c62832003-04-23 17:01:31 +00001481DEFUN (ospf_area_stub_no_summary,
1482 ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001483 "area (A.B.C.D|<0-4294967295>) stub no-summary",
1484 "OSPF stub parameters\n"
1485 "OSPF area ID in IP address format\n"
1486 "OSPF area ID as a decimal value\n"
1487 "Configure OSPF area as stub\n"
1488 "Do not inject inter-area routes into stub\n")
1489{
1490 struct ospf *ospf = vty->index;
1491 struct in_addr area_id;
1492 int ret, format;
1493
1494 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1495
1496 ret = ospf_area_stub_set (ospf, area_id);
1497 if (ret == 0)
1498 {
paulb0a053b2003-06-22 09:04:47 +00001499 vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
paul718e3742002-12-13 20:15:29 +00001500 VTY_NEWLINE);
1501 return CMD_WARNING;
1502 }
1503
1504 ospf_area_no_summary_set (ospf, area_id);
1505
1506 return CMD_SUCCESS;
1507}
1508
paula2c62832003-04-23 17:01:31 +00001509DEFUN (no_ospf_area_stub,
1510 no_ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001511 "no area (A.B.C.D|<0-4294967295>) stub",
1512 NO_STR
1513 "OSPF area parameters\n"
1514 "OSPF area ID in IP address format\n"
1515 "OSPF area ID as a decimal value\n"
1516 "Configure OSPF area as stub\n")
1517{
1518 struct ospf *ospf = vty->index;
1519 struct in_addr area_id;
1520 int format;
1521
1522 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1523
1524 ospf_area_stub_unset (ospf, area_id);
1525 ospf_area_no_summary_unset (ospf, area_id);
1526
1527 return CMD_SUCCESS;
1528}
1529
paula2c62832003-04-23 17:01:31 +00001530DEFUN (no_ospf_area_stub_no_summary,
1531 no_ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001532 "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1533 NO_STR
1534 "OSPF area parameters\n"
1535 "OSPF area ID in IP address format\n"
1536 "OSPF area ID as a decimal value\n"
1537 "Configure OSPF area as stub\n"
1538 "Do not inject inter-area routes into area\n")
1539{
1540 struct ospf *ospf = vty->index;
1541 struct in_addr area_id;
1542 int format;
1543
1544 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1545 ospf_area_no_summary_unset (ospf, area_id);
1546
1547 return CMD_SUCCESS;
1548}
1549
paul4dadc292005-05-06 21:37:42 +00001550static int
paul6c835672004-10-11 11:00:30 +00001551ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1552 int nosum)
paul718e3742002-12-13 20:15:29 +00001553{
1554 struct ospf *ospf = vty->index;
1555 struct in_addr area_id;
1556 int ret, format;
1557
1558 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1559
1560 ret = ospf_area_nssa_set (ospf, area_id);
1561 if (ret == 0)
1562 {
1563 vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1564 VTY_NEWLINE);
1565 return CMD_WARNING;
1566 }
1567
1568 if (argc > 1)
1569 {
1570 if (strncmp (argv[1], "translate-c", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001571 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001572 OSPF_NSSA_ROLE_CANDIDATE);
1573 else if (strncmp (argv[1], "translate-n", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001574 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001575 OSPF_NSSA_ROLE_NEVER);
1576 else if (strncmp (argv[1], "translate-a", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001577 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001578 OSPF_NSSA_ROLE_ALWAYS);
1579 }
paulb0a053b2003-06-22 09:04:47 +00001580 else
1581 {
1582 ospf_area_nssa_translator_role_set (ospf, area_id,
1583 OSPF_NSSA_ROLE_CANDIDATE);
1584 }
paul718e3742002-12-13 20:15:29 +00001585
paulb0a053b2003-06-22 09:04:47 +00001586 if (nosum)
paul718e3742002-12-13 20:15:29 +00001587 ospf_area_no_summary_set (ospf, area_id);
paulb0a053b2003-06-22 09:04:47 +00001588 else
1589 ospf_area_no_summary_unset (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001590
paulb0a053b2003-06-22 09:04:47 +00001591 ospf_schedule_abr_task (ospf);
1592
paul718e3742002-12-13 20:15:29 +00001593 return CMD_SUCCESS;
1594}
1595
paulb0a053b2003-06-22 09:04:47 +00001596DEFUN (ospf_area_nssa_translate_no_summary,
paula2c62832003-04-23 17:01:31 +00001597 ospf_area_nssa_translate_no_summary_cmd,
paulb0a053b2003-06-22 09:04:47 +00001598 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
paul718e3742002-12-13 20:15:29 +00001599 "OSPF area parameters\n"
1600 "OSPF area ID in IP address format\n"
1601 "OSPF area ID as a decimal value\n"
1602 "Configure OSPF area as nssa\n"
1603 "Configure NSSA-ABR for translate election (default)\n"
1604 "Configure NSSA-ABR to never translate\n"
1605 "Configure NSSA-ABR to always translate\n"
paulb0a053b2003-06-22 09:04:47 +00001606 "Do not inject inter-area routes into nssa\n")
1607{
1608 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1609}
paul718e3742002-12-13 20:15:29 +00001610
paulb0a053b2003-06-22 09:04:47 +00001611DEFUN (ospf_area_nssa_translate,
paula2c62832003-04-23 17:01:31 +00001612 ospf_area_nssa_translate_cmd,
paul718e3742002-12-13 20:15:29 +00001613 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1614 "OSPF area parameters\n"
1615 "OSPF area ID in IP address format\n"
1616 "OSPF area ID as a decimal value\n"
1617 "Configure OSPF area as nssa\n"
1618 "Configure NSSA-ABR for translate election (default)\n"
1619 "Configure NSSA-ABR to never translate\n"
1620 "Configure NSSA-ABR to always translate\n")
paulb0a053b2003-06-22 09:04:47 +00001621{
1622 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1623}
1624
1625DEFUN (ospf_area_nssa,
1626 ospf_area_nssa_cmd,
1627 "area (A.B.C.D|<0-4294967295>) nssa",
1628 "OSPF area parameters\n"
1629 "OSPF area ID in IP address format\n"
1630 "OSPF area ID as a decimal value\n"
1631 "Configure OSPF area as nssa\n")
1632{
1633 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1634}
paul718e3742002-12-13 20:15:29 +00001635
paula2c62832003-04-23 17:01:31 +00001636DEFUN (ospf_area_nssa_no_summary,
1637 ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001638 "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1639 "OSPF area parameters\n"
1640 "OSPF area ID in IP address format\n"
1641 "OSPF area ID as a decimal value\n"
1642 "Configure OSPF area as nssa\n"
1643 "Do not inject inter-area routes into nssa\n")
1644{
paulb0a053b2003-06-22 09:04:47 +00001645 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
paul718e3742002-12-13 20:15:29 +00001646}
1647
paula2c62832003-04-23 17:01:31 +00001648DEFUN (no_ospf_area_nssa,
1649 no_ospf_area_nssa_cmd,
paul718e3742002-12-13 20:15:29 +00001650 "no area (A.B.C.D|<0-4294967295>) nssa",
1651 NO_STR
1652 "OSPF area parameters\n"
1653 "OSPF area ID in IP address format\n"
1654 "OSPF area ID as a decimal value\n"
1655 "Configure OSPF area as nssa\n")
1656{
1657 struct ospf *ospf = vty->index;
1658 struct in_addr area_id;
1659 int format;
1660
1661 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1662
1663 ospf_area_nssa_unset (ospf, area_id);
1664 ospf_area_no_summary_unset (ospf, area_id);
1665
paulb0a053b2003-06-22 09:04:47 +00001666 ospf_schedule_abr_task (ospf);
1667
paul718e3742002-12-13 20:15:29 +00001668 return CMD_SUCCESS;
1669}
1670
paula2c62832003-04-23 17:01:31 +00001671DEFUN (no_ospf_area_nssa_no_summary,
1672 no_ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001673 "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1674 NO_STR
1675 "OSPF area parameters\n"
1676 "OSPF area ID in IP address format\n"
1677 "OSPF area ID as a decimal value\n"
1678 "Configure OSPF area as nssa\n"
1679 "Do not inject inter-area routes into nssa\n")
1680{
1681 struct ospf *ospf = vty->index;
1682 struct in_addr area_id;
1683 int format;
1684
1685 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1686 ospf_area_no_summary_unset (ospf, area_id);
1687
1688 return CMD_SUCCESS;
1689}
1690
paula2c62832003-04-23 17:01:31 +00001691DEFUN (ospf_area_default_cost,
1692 ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001693 "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1694 "OSPF area parameters\n"
1695 "OSPF area ID in IP address format\n"
1696 "OSPF area ID as a decimal value\n"
1697 "Set the summary-default cost of a NSSA or stub area\n"
1698 "Stub's advertised default summary cost\n")
1699{
paul68980082003-03-25 05:07:42 +00001700 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001701 struct ospf_area *area;
1702 struct in_addr area_id;
1703 u_int32_t cost;
1704 int format;
vincentba682532005-09-29 13:52:57 +00001705 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001706
1707 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1708 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1709
paul68980082003-03-25 05:07:42 +00001710 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001711
1712 if (area->external_routing == OSPF_AREA_DEFAULT)
1713 {
1714 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1715 return CMD_WARNING;
1716 }
1717
1718 area->default_cost = cost;
1719
vincentba682532005-09-29 13:52:57 +00001720 p.family = AF_INET;
1721 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1722 p.prefixlen = 0;
1723 if (IS_DEBUG_OSPF_EVENT)
1724 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1725 "announcing 0.0.0.0/0 to area %s",
1726 inet_ntoa (area->area_id));
1727 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1728
paul718e3742002-12-13 20:15:29 +00001729 return CMD_SUCCESS;
1730}
1731
paula2c62832003-04-23 17:01:31 +00001732DEFUN (no_ospf_area_default_cost,
1733 no_ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001734 "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1735 NO_STR
1736 "OSPF area parameters\n"
1737 "OSPF area ID in IP address format\n"
1738 "OSPF area ID as a decimal value\n"
1739 "Set the summary-default cost of a NSSA or stub area\n"
1740 "Stub's advertised default summary cost\n")
1741{
paul68980082003-03-25 05:07:42 +00001742 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001743 struct ospf_area *area;
1744 struct in_addr area_id;
paul718e3742002-12-13 20:15:29 +00001745 int format;
vincentba682532005-09-29 13:52:57 +00001746 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001747
1748 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
Andrew Certain0798cee2012-12-04 13:43:42 -08001749 VTY_CHECK_INTEGER_RANGE ("stub default cost", argv[1], 0, OSPF_LS_INFINITY);
paul718e3742002-12-13 20:15:29 +00001750
paul68980082003-03-25 05:07:42 +00001751 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001752 if (area == NULL)
1753 return CMD_SUCCESS;
1754
1755 if (area->external_routing == OSPF_AREA_DEFAULT)
1756 {
1757 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1758 return CMD_WARNING;
1759 }
1760
1761 area->default_cost = 1;
1762
vincentba682532005-09-29 13:52:57 +00001763 p.family = AF_INET;
1764 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1765 p.prefixlen = 0;
1766 if (IS_DEBUG_OSPF_EVENT)
1767 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1768 "announcing 0.0.0.0/0 to area %s",
1769 inet_ntoa (area->area_id));
1770 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1771
1772
paul68980082003-03-25 05:07:42 +00001773 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001774
1775 return CMD_SUCCESS;
1776}
1777
paula2c62832003-04-23 17:01:31 +00001778DEFUN (ospf_area_export_list,
1779 ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001780 "area (A.B.C.D|<0-4294967295>) export-list NAME",
1781 "OSPF area parameters\n"
1782 "OSPF area ID in IP address format\n"
1783 "OSPF area ID as a decimal value\n"
1784 "Set the filter for networks announced to other areas\n"
1785 "Name of the access-list\n")
1786{
paul68980082003-03-25 05:07:42 +00001787 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001788 struct ospf_area *area;
1789 struct in_addr area_id;
1790 int format;
1791
hasso52930762004-04-19 18:26:53 +00001792 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1793
paul68980082003-03-25 05:07:42 +00001794 area = ospf_area_get (ospf, area_id, format);
1795 ospf_area_export_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001796
1797 return CMD_SUCCESS;
1798}
1799
paula2c62832003-04-23 17:01:31 +00001800DEFUN (no_ospf_area_export_list,
1801 no_ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001802 "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1803 NO_STR
1804 "OSPF area parameters\n"
1805 "OSPF area ID in IP address format\n"
1806 "OSPF area ID as a decimal value\n"
1807 "Unset the filter for networks announced to other areas\n"
1808 "Name of the access-list\n")
1809{
paul68980082003-03-25 05:07:42 +00001810 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001811 struct ospf_area *area;
1812 struct in_addr area_id;
1813 int format;
1814
hasso52930762004-04-19 18:26:53 +00001815 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1816
paul68980082003-03-25 05:07:42 +00001817 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001818 if (area == NULL)
1819 return CMD_SUCCESS;
1820
paul68980082003-03-25 05:07:42 +00001821 ospf_area_export_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001822
1823 return CMD_SUCCESS;
1824}
1825
1826
paula2c62832003-04-23 17:01:31 +00001827DEFUN (ospf_area_import_list,
1828 ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001829 "area (A.B.C.D|<0-4294967295>) import-list NAME",
1830 "OSPF area parameters\n"
1831 "OSPF area ID in IP address format\n"
1832 "OSPF area ID as a decimal value\n"
1833 "Set the filter for networks from other areas announced to the specified one\n"
1834 "Name of the access-list\n")
1835{
paul68980082003-03-25 05:07:42 +00001836 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001837 struct ospf_area *area;
1838 struct in_addr area_id;
1839 int format;
1840
hasso52930762004-04-19 18:26:53 +00001841 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1842
paul68980082003-03-25 05:07:42 +00001843 area = ospf_area_get (ospf, area_id, format);
1844 ospf_area_import_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001845
1846 return CMD_SUCCESS;
1847}
1848
paula2c62832003-04-23 17:01:31 +00001849DEFUN (no_ospf_area_import_list,
1850 no_ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001851 "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1852 NO_STR
1853 "OSPF area parameters\n"
1854 "OSPF area ID in IP address format\n"
1855 "OSPF area ID as a decimal value\n"
1856 "Unset the filter for networks announced to other areas\n"
1857 "Name of the access-list\n")
1858{
paul68980082003-03-25 05:07:42 +00001859 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001860 struct ospf_area *area;
1861 struct in_addr area_id;
1862 int format;
1863
hasso52930762004-04-19 18:26:53 +00001864 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1865
paul68980082003-03-25 05:07:42 +00001866 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001867 if (area == NULL)
1868 return CMD_SUCCESS;
1869
paul68980082003-03-25 05:07:42 +00001870 ospf_area_import_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001871
1872 return CMD_SUCCESS;
1873}
1874
paula2c62832003-04-23 17:01:31 +00001875DEFUN (ospf_area_filter_list,
1876 ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001877 "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1878 "OSPF area parameters\n"
1879 "OSPF area ID in IP address format\n"
1880 "OSPF area ID as a decimal value\n"
1881 "Filter networks between OSPF areas\n"
1882 "Filter prefixes between OSPF areas\n"
1883 "Name of an IP prefix-list\n"
1884 "Filter networks sent to this area\n"
1885 "Filter networks sent from this area\n")
1886{
paul68980082003-03-25 05:07:42 +00001887 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001888 struct ospf_area *area;
1889 struct in_addr area_id;
1890 struct prefix_list *plist;
1891 int format;
1892
1893 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1894
paul68980082003-03-25 05:07:42 +00001895 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001896 plist = prefix_list_lookup (AFI_IP, argv[1]);
1897 if (strncmp (argv[2], "in", 2) == 0)
1898 {
1899 PREFIX_LIST_IN (area) = plist;
1900 if (PREFIX_NAME_IN (area))
1901 free (PREFIX_NAME_IN (area));
1902
1903 PREFIX_NAME_IN (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001904 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001905 }
1906 else
1907 {
1908 PREFIX_LIST_OUT (area) = plist;
1909 if (PREFIX_NAME_OUT (area))
1910 free (PREFIX_NAME_OUT (area));
1911
1912 PREFIX_NAME_OUT (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001913 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001914 }
1915
1916 return CMD_SUCCESS;
1917}
1918
paula2c62832003-04-23 17:01:31 +00001919DEFUN (no_ospf_area_filter_list,
1920 no_ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001921 "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1922 NO_STR
1923 "OSPF area parameters\n"
1924 "OSPF area ID in IP address format\n"
1925 "OSPF area ID as a decimal value\n"
1926 "Filter networks between OSPF areas\n"
1927 "Filter prefixes between OSPF areas\n"
1928 "Name of an IP prefix-list\n"
1929 "Filter networks sent to this area\n"
1930 "Filter networks sent from this area\n")
1931{
paul68980082003-03-25 05:07:42 +00001932 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001933 struct ospf_area *area;
1934 struct in_addr area_id;
paul718e3742002-12-13 20:15:29 +00001935 int format;
1936
1937 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1938
Paul Jakma1a8ec2b2006-05-11 13:34:08 +00001939 if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1940 return CMD_SUCCESS;
1941
paul718e3742002-12-13 20:15:29 +00001942 if (strncmp (argv[2], "in", 2) == 0)
1943 {
1944 if (PREFIX_NAME_IN (area))
1945 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1946 return CMD_SUCCESS;
1947
1948 PREFIX_LIST_IN (area) = NULL;
1949 if (PREFIX_NAME_IN (area))
1950 free (PREFIX_NAME_IN (area));
1951
1952 PREFIX_NAME_IN (area) = NULL;
1953
paul68980082003-03-25 05:07:42 +00001954 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001955 }
1956 else
1957 {
1958 if (PREFIX_NAME_OUT (area))
1959 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1960 return CMD_SUCCESS;
1961
1962 PREFIX_LIST_OUT (area) = NULL;
1963 if (PREFIX_NAME_OUT (area))
1964 free (PREFIX_NAME_OUT (area));
1965
1966 PREFIX_NAME_OUT (area) = NULL;
1967
paul68980082003-03-25 05:07:42 +00001968 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001969 }
1970
1971 return CMD_SUCCESS;
1972}
1973
1974
paula2c62832003-04-23 17:01:31 +00001975DEFUN (ospf_area_authentication_message_digest,
1976 ospf_area_authentication_message_digest_cmd,
paul718e3742002-12-13 20:15:29 +00001977 "area (A.B.C.D|<0-4294967295>) authentication message-digest",
1978 "OSPF area parameters\n"
Christian Franke2b005152013-09-30 12:27:49 +00001979 "OSPF area ID in IP address format\n"
1980 "OSPF area ID as a decimal value\n"
paul718e3742002-12-13 20:15:29 +00001981 "Enable authentication\n"
1982 "Use message-digest authentication\n")
1983{
paul68980082003-03-25 05:07:42 +00001984 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001985 struct ospf_area *area;
1986 struct in_addr area_id;
1987 int format;
1988
1989 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1990
paul68980082003-03-25 05:07:42 +00001991 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001992 area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1993
1994 return CMD_SUCCESS;
1995}
1996
paula2c62832003-04-23 17:01:31 +00001997DEFUN (ospf_area_authentication,
1998 ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00001999 "area (A.B.C.D|<0-4294967295>) authentication",
2000 "OSPF area parameters\n"
2001 "OSPF area ID in IP address format\n"
2002 "OSPF area ID as a decimal value\n"
2003 "Enable 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_SIMPLE;
2014
2015 return CMD_SUCCESS;
2016}
2017
paula2c62832003-04-23 17:01:31 +00002018DEFUN (no_ospf_area_authentication,
2019 no_ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002020 "no area (A.B.C.D|<0-4294967295>) authentication",
2021 NO_STR
2022 "OSPF area parameters\n"
2023 "OSPF area ID in IP address format\n"
2024 "OSPF area ID as a decimal value\n"
2025 "Enable authentication\n")
2026{
paul68980082003-03-25 05:07:42 +00002027 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002028 struct ospf_area *area;
2029 struct in_addr area_id;
2030 int format;
2031
2032 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2033
paul68980082003-03-25 05:07:42 +00002034 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002035 if (area == NULL)
2036 return CMD_SUCCESS;
2037
2038 area->auth_type = OSPF_AUTH_NULL;
2039
paul68980082003-03-25 05:07:42 +00002040 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002041
2042 return CMD_SUCCESS;
2043}
2044
2045
2046DEFUN (ospf_abr_type,
2047 ospf_abr_type_cmd,
2048 "ospf abr-type (cisco|ibm|shortcut|standard)",
2049 "OSPF specific commands\n"
2050 "Set OSPF ABR type\n"
2051 "Alternative ABR, cisco implementation\n"
2052 "Alternative ABR, IBM implementation\n"
2053 "Shortcut ABR\n"
2054 "Standard behavior (RFC2328)\n")
2055{
paul68980082003-03-25 05:07:42 +00002056 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002057 u_char abr_type = OSPF_ABR_UNKNOWN;
2058
2059 if (strncmp (argv[0], "c", 1) == 0)
2060 abr_type = OSPF_ABR_CISCO;
2061 else if (strncmp (argv[0], "i", 1) == 0)
2062 abr_type = OSPF_ABR_IBM;
2063 else if (strncmp (argv[0], "sh", 2) == 0)
2064 abr_type = OSPF_ABR_SHORTCUT;
2065 else if (strncmp (argv[0], "st", 2) == 0)
2066 abr_type = OSPF_ABR_STAND;
2067 else
2068 return CMD_WARNING;
2069
2070 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002071 if (ospf->abr_type != abr_type)
paul718e3742002-12-13 20:15:29 +00002072 {
paul68980082003-03-25 05:07:42 +00002073 ospf->abr_type = abr_type;
2074 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002075 }
2076
2077 return CMD_SUCCESS;
2078}
2079
2080DEFUN (no_ospf_abr_type,
2081 no_ospf_abr_type_cmd,
pauld57834f2005-07-12 20:04:22 +00002082 "no ospf abr-type (cisco|ibm|shortcut|standard)",
paul718e3742002-12-13 20:15:29 +00002083 NO_STR
2084 "OSPF specific commands\n"
2085 "Set OSPF ABR type\n"
2086 "Alternative ABR, cisco implementation\n"
2087 "Alternative ABR, IBM implementation\n"
2088 "Shortcut ABR\n")
2089{
paul68980082003-03-25 05:07:42 +00002090 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002091 u_char abr_type = OSPF_ABR_UNKNOWN;
2092
2093 if (strncmp (argv[0], "c", 1) == 0)
2094 abr_type = OSPF_ABR_CISCO;
2095 else if (strncmp (argv[0], "i", 1) == 0)
2096 abr_type = OSPF_ABR_IBM;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002097 else if (strncmp (argv[0], "sh", 2) == 0)
paul718e3742002-12-13 20:15:29 +00002098 abr_type = OSPF_ABR_SHORTCUT;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002099 else if (strncmp (argv[0], "st", 2) == 0)
2100 abr_type = OSPF_ABR_STAND;
paul718e3742002-12-13 20:15:29 +00002101 else
2102 return CMD_WARNING;
2103
2104 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002105 if (ospf->abr_type == abr_type)
paul718e3742002-12-13 20:15:29 +00002106 {
pauld57834f2005-07-12 20:04:22 +00002107 ospf->abr_type = OSPF_ABR_DEFAULT;
paul68980082003-03-25 05:07:42 +00002108 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002109 }
2110
2111 return CMD_SUCCESS;
2112}
2113
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002114DEFUN (ospf_log_adjacency_changes,
2115 ospf_log_adjacency_changes_cmd,
2116 "log-adjacency-changes",
2117 "Log changes in adjacency state\n")
2118{
2119 struct ospf *ospf = vty->index;
2120
2121 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2122 return CMD_SUCCESS;
2123}
2124
2125DEFUN (ospf_log_adjacency_changes_detail,
2126 ospf_log_adjacency_changes_detail_cmd,
2127 "log-adjacency-changes detail",
2128 "Log changes in adjacency state\n"
2129 "Log all state changes\n")
2130{
2131 struct ospf *ospf = vty->index;
2132
2133 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2134 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2135 return CMD_SUCCESS;
2136}
2137
2138DEFUN (no_ospf_log_adjacency_changes,
2139 no_ospf_log_adjacency_changes_cmd,
2140 "no log-adjacency-changes",
2141 NO_STR
2142 "Log changes in adjacency state\n")
2143{
2144 struct ospf *ospf = vty->index;
2145
2146 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2147 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2148 return CMD_SUCCESS;
2149}
2150
2151DEFUN (no_ospf_log_adjacency_changes_detail,
2152 no_ospf_log_adjacency_changes_detail_cmd,
2153 "no log-adjacency-changes detail",
2154 NO_STR
2155 "Log changes in adjacency state\n"
2156 "Log all state changes\n")
2157{
2158 struct ospf *ospf = vty->index;
2159
2160 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2161 return CMD_SUCCESS;
2162}
2163
paul718e3742002-12-13 20:15:29 +00002164DEFUN (ospf_compatible_rfc1583,
2165 ospf_compatible_rfc1583_cmd,
2166 "compatible rfc1583",
2167 "OSPF compatibility list\n"
2168 "compatible with RFC 1583\n")
2169{
2170 struct ospf *ospf = vty->index;
2171
2172 if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2173 {
2174 SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002175 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002176 }
2177 return CMD_SUCCESS;
2178}
2179
2180DEFUN (no_ospf_compatible_rfc1583,
2181 no_ospf_compatible_rfc1583_cmd,
2182 "no compatible rfc1583",
2183 NO_STR
2184 "OSPF compatibility list\n"
2185 "compatible with RFC 1583\n")
2186{
2187 struct ospf *ospf = vty->index;
2188
2189 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2190 {
2191 UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
paul68980082003-03-25 05:07:42 +00002192 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +00002193 }
2194 return CMD_SUCCESS;
2195}
2196
2197ALIAS (ospf_compatible_rfc1583,
2198 ospf_rfc1583_flag_cmd,
2199 "ospf rfc1583compatibility",
2200 "OSPF specific commands\n"
2201 "Enable the RFC1583Compatibility flag\n")
2202
2203ALIAS (no_ospf_compatible_rfc1583,
2204 no_ospf_rfc1583_flag_cmd,
2205 "no ospf rfc1583compatibility",
2206 NO_STR
2207 "OSPF specific commands\n"
2208 "Disable the RFC1583Compatibility flag\n")
pauld24f6e22005-10-21 09:23:12 +00002209
2210static int
2211ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2212 unsigned int hold,
2213 unsigned int max)
2214{
2215 struct ospf *ospf = vty->index;
2216
2217 ospf->spf_delay = delay;
2218 ospf->spf_holdtime = hold;
2219 ospf->spf_max_holdtime = max;
2220
2221 return CMD_SUCCESS;
2222}
paul718e3742002-12-13 20:15:29 +00002223
pauld24f6e22005-10-21 09:23:12 +00002224DEFUN (ospf_timers_throttle_spf,
2225 ospf_timers_throttle_spf_cmd,
2226 "timers throttle spf <0-600000> <0-600000> <0-600000>",
2227 "Adjust routing timers\n"
2228 "Throttling adaptive timer\n"
2229 "OSPF SPF timers\n"
2230 "Delay (msec) from first change received till SPF calculation\n"
2231 "Initial hold time (msec) between consecutive SPF calculations\n"
2232 "Maximum hold time (msec)\n")
2233{
2234 unsigned int delay, hold, max;
2235
2236 if (argc != 3)
2237 {
2238 vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2239 return CMD_WARNING;
2240 }
2241
2242 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2243 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2244 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2245
2246 return ospf_timers_spf_set (vty, delay, hold, max);
2247}
2248
2249DEFUN_DEPRECATED (ospf_timers_spf,
paula2c62832003-04-23 17:01:31 +00002250 ospf_timers_spf_cmd,
paul718e3742002-12-13 20:15:29 +00002251 "timers spf <0-4294967295> <0-4294967295>",
2252 "Adjust routing timers\n"
2253 "OSPF SPF timers\n"
pauld24f6e22005-10-21 09:23:12 +00002254 "Delay (s) between receiving a change to SPF calculation\n"
2255 "Hold time (s) between consecutive SPF calculations\n")
paul718e3742002-12-13 20:15:29 +00002256{
pauld24f6e22005-10-21 09:23:12 +00002257 unsigned int delay, hold;
2258
2259 if (argc != 2)
2260 {
2261 vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2262 return CMD_WARNING;
2263 }
2264
paul4dadc292005-05-06 21:37:42 +00002265 VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2266 VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
pauld24f6e22005-10-21 09:23:12 +00002267
2268 /* truncate down the second values if they're greater than 600000ms */
2269 if (delay > (600000 / 1000))
2270 delay = 600000;
2271 else if (delay == 0)
2272 /* 0s delay was probably specified because of lack of ms resolution */
2273 delay = OSPF_SPF_DELAY_DEFAULT;
2274 if (hold > (600000 / 1000))
2275 hold = 600000;
2276
2277 return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
paul718e3742002-12-13 20:15:29 +00002278}
2279
pauld24f6e22005-10-21 09:23:12 +00002280DEFUN (no_ospf_timers_throttle_spf,
2281 no_ospf_timers_throttle_spf_cmd,
2282 "no timers throttle spf",
paul718e3742002-12-13 20:15:29 +00002283 NO_STR
2284 "Adjust routing timers\n"
pauld24f6e22005-10-21 09:23:12 +00002285 "Throttling adaptive timer\n"
paul718e3742002-12-13 20:15:29 +00002286 "OSPF SPF timers\n")
2287{
pauld24f6e22005-10-21 09:23:12 +00002288 return ospf_timers_spf_set (vty,
2289 OSPF_SPF_DELAY_DEFAULT,
2290 OSPF_SPF_HOLDTIME_DEFAULT,
2291 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
paul718e3742002-12-13 20:15:29 +00002292}
2293
pauld24f6e22005-10-21 09:23:12 +00002294ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2295 no_ospf_timers_spf_cmd,
2296 "no timers spf",
2297 NO_STR
2298 "Adjust routing timers\n"
2299 "OSPF SPF timers\n")
paul718e3742002-12-13 20:15:29 +00002300
paula2c62832003-04-23 17:01:31 +00002301DEFUN (ospf_neighbor,
2302 ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002303 "neighbor A.B.C.D",
2304 NEIGHBOR_STR
2305 "Neighbor IP address\n")
2306{
2307 struct ospf *ospf = vty->index;
2308 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002309 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2310 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002311
2312 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2313
2314 if (argc > 1)
2315 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2316
2317 if (argc > 2)
2318 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2319
2320 ospf_nbr_nbma_set (ospf, nbr_addr);
2321 if (argc > 1)
2322 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2323 if (argc > 2)
Andrew Certain1a61ad12012-12-04 12:50:23 -08002324 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
paul718e3742002-12-13 20:15:29 +00002325
2326 return CMD_SUCCESS;
2327}
2328
paula2c62832003-04-23 17:01:31 +00002329ALIAS (ospf_neighbor,
2330 ospf_neighbor_priority_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002331 "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2332 NEIGHBOR_STR
2333 "Neighbor IP address\n"
2334 "Neighbor Priority\n"
2335 "Priority\n"
2336 "Dead Neighbor Polling interval\n"
2337 "Seconds\n")
2338
paula2c62832003-04-23 17:01:31 +00002339ALIAS (ospf_neighbor,
2340 ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002341 "neighbor A.B.C.D priority <0-255>",
2342 NEIGHBOR_STR
2343 "Neighbor IP address\n"
2344 "Neighbor Priority\n"
2345 "Seconds\n")
2346
paula2c62832003-04-23 17:01:31 +00002347DEFUN (ospf_neighbor_poll_interval,
2348 ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002349 "neighbor A.B.C.D poll-interval <1-65535>",
2350 NEIGHBOR_STR
2351 "Neighbor IP address\n"
2352 "Dead Neighbor Polling interval\n"
2353 "Seconds\n")
2354{
2355 struct ospf *ospf = vty->index;
2356 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002357 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2358 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002359
2360 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2361
2362 if (argc > 1)
2363 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2364
2365 if (argc > 2)
2366 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2367
2368 ospf_nbr_nbma_set (ospf, nbr_addr);
2369 if (argc > 1)
2370 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2371 if (argc > 2)
2372 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2373
2374 return CMD_SUCCESS;
2375}
2376
paula2c62832003-04-23 17:01:31 +00002377ALIAS (ospf_neighbor_poll_interval,
2378 ospf_neighbor_poll_interval_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002379 "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2380 NEIGHBOR_STR
2381 "Neighbor address\n"
2382 "OSPF dead-router polling interval\n"
2383 "Seconds\n"
2384 "OSPF priority of non-broadcast neighbor\n"
2385 "Priority\n")
2386
paula2c62832003-04-23 17:01:31 +00002387DEFUN (no_ospf_neighbor,
2388 no_ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002389 "no neighbor A.B.C.D",
2390 NO_STR
2391 NEIGHBOR_STR
2392 "Neighbor IP address\n")
2393{
2394 struct ospf *ospf = vty->index;
2395 struct in_addr nbr_addr;
paul718e3742002-12-13 20:15:29 +00002396
2397 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2398
Andrew Certain0798cee2012-12-04 13:43:42 -08002399 (void)ospf_nbr_nbma_unset (ospf, nbr_addr);
paul718e3742002-12-13 20:15:29 +00002400
2401 return CMD_SUCCESS;
2402}
2403
paula2c62832003-04-23 17:01:31 +00002404ALIAS (no_ospf_neighbor,
2405 no_ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002406 "no neighbor A.B.C.D priority <0-255>",
2407 NO_STR
2408 NEIGHBOR_STR
2409 "Neighbor IP address\n"
2410 "Neighbor Priority\n"
2411 "Priority\n")
2412
paula2c62832003-04-23 17:01:31 +00002413ALIAS (no_ospf_neighbor,
2414 no_ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002415 "no neighbor A.B.C.D poll-interval <1-65535>",
2416 NO_STR
2417 NEIGHBOR_STR
2418 "Neighbor IP address\n"
2419 "Dead Neighbor Polling interval\n"
2420 "Seconds\n")
2421
paula2c62832003-04-23 17:01:31 +00002422ALIAS (no_ospf_neighbor,
2423 no_ospf_neighbor_priority_pollinterval_cmd,
paul718e3742002-12-13 20:15:29 +00002424 "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2425 NO_STR
2426 NEIGHBOR_STR
2427 "Neighbor IP address\n"
2428 "Neighbor Priority\n"
2429 "Priority\n"
2430 "Dead Neighbor Polling interval\n"
2431 "Seconds\n")
2432
2433
paula2c62832003-04-23 17:01:31 +00002434DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002435 "refresh timer <10-1800>",
2436 "Adjust refresh parameters\n"
2437 "Set refresh timer\n"
2438 "Timer value in seconds\n")
2439{
2440 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002441 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002442
2443 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2444 interval = (interval / 10) * 10;
2445
2446 ospf_timers_refresh_set (ospf, interval);
2447
2448 return CMD_SUCCESS;
2449}
2450
paula2c62832003-04-23 17:01:31 +00002451DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
paul718e3742002-12-13 20:15:29 +00002452 "no refresh timer <10-1800>",
2453 "Adjust refresh parameters\n"
2454 "Unset refresh timer\n"
2455 "Timer value in seconds\n")
2456{
2457 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002458 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002459
2460 if (argc == 1)
2461 {
2462 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2463
2464 if (ospf->lsa_refresh_interval != interval ||
2465 interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2466 return CMD_SUCCESS;
2467 }
2468
2469 ospf_timers_refresh_unset (ospf);
2470
2471 return CMD_SUCCESS;
2472}
2473
paula2c62832003-04-23 17:01:31 +00002474ALIAS (no_ospf_refresh_timer,
2475 no_ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002476 "no refresh timer",
2477 "Adjust refresh parameters\n"
2478 "Unset refresh timer\n")
2479
paula2c62832003-04-23 17:01:31 +00002480DEFUN (ospf_auto_cost_reference_bandwidth,
2481 ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002482 "auto-cost reference-bandwidth <1-4294967>",
2483 "Calculate OSPF interface cost according to bandwidth\n"
2484 "Use reference bandwidth method to assign OSPF cost\n"
2485 "The reference bandwidth in terms of Mbits per second\n")
2486{
paul68980082003-03-25 05:07:42 +00002487 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002488 u_int32_t refbw;
hasso52dc7ee2004-09-23 19:18:23 +00002489 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00002490 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002491
2492 refbw = strtol (argv[0], NULL, 10);
2493 if (refbw < 1 || refbw > 4294967)
2494 {
2495 vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2496 return CMD_WARNING;
2497 }
2498
2499 /* If reference bandwidth is changed. */
paul68980082003-03-25 05:07:42 +00002500 if ((refbw * 1000) == ospf->ref_bandwidth)
paul718e3742002-12-13 20:15:29 +00002501 return CMD_SUCCESS;
2502
paul68980082003-03-25 05:07:42 +00002503 ospf->ref_bandwidth = refbw * 1000;
paul1eb8ef22005-04-07 07:30:20 +00002504 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2505 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002506
2507 return CMD_SUCCESS;
2508}
2509
paula2c62832003-04-23 17:01:31 +00002510DEFUN (no_ospf_auto_cost_reference_bandwidth,
2511 no_ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002512 "no auto-cost reference-bandwidth",
2513 NO_STR
2514 "Calculate OSPF interface cost according to bandwidth\n"
2515 "Use reference bandwidth method to assign OSPF cost\n")
2516{
paul68980082003-03-25 05:07:42 +00002517 struct ospf *ospf = vty->index;
paul1eb8ef22005-04-07 07:30:20 +00002518 struct listnode *node, *nnode;
2519 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002520
paul68980082003-03-25 05:07:42 +00002521 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
paul718e3742002-12-13 20:15:29 +00002522 return CMD_SUCCESS;
2523
paul68980082003-03-25 05:07:42 +00002524 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
paul718e3742002-12-13 20:15:29 +00002525 vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2526 vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2527
paul1eb8ef22005-04-07 07:30:20 +00002528 for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2529 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002530
2531 return CMD_SUCCESS;
2532}
2533
hassoeb1ce602004-10-08 08:17:22 +00002534const char *ospf_abr_type_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002535{
2536 "Unknown",
2537 "Standard (RFC2328)",
2538 "Alternative IBM",
2539 "Alternative Cisco",
2540 "Alternative Shortcut"
2541};
2542
hassoeb1ce602004-10-08 08:17:22 +00002543const char *ospf_shortcut_mode_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002544{
2545 "Default",
2546 "Enabled",
2547 "Disabled"
2548};
2549
2550
2551
paul4dadc292005-05-06 21:37:42 +00002552static void
paul718e3742002-12-13 20:15:29 +00002553show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2554{
2555 /* Show Area ID. */
2556 vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2557
2558 /* Show Area type/mode. */
2559 if (OSPF_IS_AREA_BACKBONE (area))
2560 vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2561 else
2562 {
2563 if (area->external_routing == OSPF_AREA_STUB)
paulb0a053b2003-06-22 09:04:47 +00002564 vty_out (vty, " (Stub%s%s)",
2565 area->no_summary ? ", no summary" : "",
2566 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002567
paulb0a053b2003-06-22 09:04:47 +00002568 else if (area->external_routing == OSPF_AREA_NSSA)
2569 vty_out (vty, " (NSSA%s%s)",
2570 area->no_summary ? ", no summary" : "",
2571 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002572
2573 vty_out (vty, "%s", VTY_NEWLINE);
2574 vty_out (vty, " Shortcutting mode: %s",
paulb0a053b2003-06-22 09:04:47 +00002575 ospf_shortcut_mode_descr_str[area->shortcut_configured]);
paul718e3742002-12-13 20:15:29 +00002576 vty_out (vty, ", S-bit consensus: %s%s",
paulb0a053b2003-06-22 09:04:47 +00002577 area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002578 }
2579
2580 /* Show number of interfaces. */
2581 vty_out (vty, " Number of interfaces in this area: Total: %d, "
2582 "Active: %d%s", listcount (area->oiflist),
2583 area->act_ints, VTY_NEWLINE);
2584
paul718e3742002-12-13 20:15:29 +00002585 if (area->external_routing == OSPF_AREA_NSSA)
2586 {
2587 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 +00002588 if (! IS_OSPF_ABR (area->ospf))
paulb0a053b2003-06-22 09:04:47 +00002589 vty_out (vty, " It is not ABR, therefore not Translator. %s",
2590 VTY_NEWLINE);
2591 else if (area->NSSATranslatorState)
2592 {
2593 vty_out (vty, " We are an ABR and ");
2594 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2595 vty_out (vty, "the NSSA Elected Translator. %s",
2596 VTY_NEWLINE);
2597 else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2598 vty_out (vty, "always an NSSA Translator. %s",
2599 VTY_NEWLINE);
2600 }
paul718e3742002-12-13 20:15:29 +00002601 else
paulb0a053b2003-06-22 09:04:47 +00002602 {
2603 vty_out (vty, " We are an ABR, but ");
2604 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2605 vty_out (vty, "not the NSSA Elected Translator. %s",
2606 VTY_NEWLINE);
2607 else
hassoc6b87812004-12-22 13:09:59 +00002608 vty_out (vty, "never an NSSA Translator. %s",
paulb0a053b2003-06-22 09:04:47 +00002609 VTY_NEWLINE);
2610 }
paul718e3742002-12-13 20:15:29 +00002611 }
paul88d6cf32005-10-29 12:50:09 +00002612 /* Stub-router state for this area */
2613 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2614 {
ajs649654a2005-11-16 20:17:52 +00002615 char timebuf[OSPF_TIME_DUMP_SIZE];
paul88d6cf32005-10-29 12:50:09 +00002616 vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2617 VTY_NEWLINE);
2618 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2619 vty_out (vty, " Administratively activated (indefinitely)%s",
2620 VTY_NEWLINE);
2621 if (area->t_stub_router)
2622 vty_out (vty, " Active from startup, %s remaining%s",
2623 ospf_timer_dump (area->t_stub_router, timebuf,
2624 sizeof(timebuf)), VTY_NEWLINE);
2625 }
2626
paul718e3742002-12-13 20:15:29 +00002627 /* Show number of fully adjacent neighbors. */
2628 vty_out (vty, " Number of fully adjacent neighbors in this area:"
paulb0a053b2003-06-22 09:04:47 +00002629 " %d%s", area->full_nbrs, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002630
2631 /* Show authentication type. */
2632 vty_out (vty, " Area has ");
2633 if (area->auth_type == OSPF_AUTH_NULL)
2634 vty_out (vty, "no authentication%s", VTY_NEWLINE);
2635 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2636 vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2637 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2638 vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2639
2640 if (!OSPF_IS_AREA_BACKBONE (area))
2641 vty_out (vty, " Number of full virtual adjacencies going through"
2642 " this area: %d%s", area->full_vls, VTY_NEWLINE);
2643
2644 /* Show SPF calculation times. */
2645 vty_out (vty, " SPF algorithm executed %d times%s",
2646 area->spf_calculation, VTY_NEWLINE);
2647
2648 /* Show number of LSA. */
2649 vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
hassofe71a972004-12-22 16:16:02 +00002650 vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2651 ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2652 ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2653 vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2654 ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2655 ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2656 vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2657 ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2658 ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2659 vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2660 ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2661 ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2662 vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2663 ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2664 ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2665#ifdef HAVE_OPAQUE_LSA
2666 vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2667 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2668 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2669 vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2670 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2671 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2672#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002673 vty_out (vty, "%s", VTY_NEWLINE);
2674}
2675
2676DEFUN (show_ip_ospf,
2677 show_ip_ospf_cmd,
2678 "show ip ospf",
2679 SHOW_STR
2680 IP_STR
2681 "OSPF information\n")
2682{
paul1eb8ef22005-04-07 07:30:20 +00002683 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002684 struct ospf_area * area;
paul020709f2003-04-04 02:44:16 +00002685 struct ospf *ospf;
pauld24f6e22005-10-21 09:23:12 +00002686 struct timeval result;
ajs649654a2005-11-16 20:17:52 +00002687 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002688
2689 /* Check OSPF is enable. */
paul020709f2003-04-04 02:44:16 +00002690 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002691 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00002692 {
2693 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2694 return CMD_SUCCESS;
2695 }
2696
2697 /* Show Router ID. */
2698 vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
paul68980082003-03-25 05:07:42 +00002699 inet_ntoa (ospf->router_id),
paul718e3742002-12-13 20:15:29 +00002700 VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00002701
2702 /* Graceful shutdown */
paulc9c93d52005-11-26 13:31:11 +00002703 if (ospf->t_deferred_shutdown)
2704 vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2705 ospf_timer_dump (ospf->t_deferred_shutdown,
paul88d6cf32005-10-29 12:50:09 +00002706 timebuf, sizeof (timebuf)), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002707 /* Show capability. */
2708 vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2709 vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2710 vty_out (vty, " RFC1583Compatibility flag is %s%s",
paul68980082003-03-25 05:07:42 +00002711 CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
paul718e3742002-12-13 20:15:29 +00002712 "enabled" : "disabled", VTY_NEWLINE);
2713#ifdef HAVE_OPAQUE_LSA
2714 vty_out (vty, " OpaqueCapability flag is %s%s%s",
paul68980082003-03-25 05:07:42 +00002715 CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
paul718e3742002-12-13 20:15:29 +00002716 "enabled" : "disabled",
paul68980082003-03-25 05:07:42 +00002717 IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
paul718e3742002-12-13 20:15:29 +00002718 " (origination blocked)" : "",
2719 VTY_NEWLINE);
2720#endif /* HAVE_OPAQUE_LSA */
paul88d6cf32005-10-29 12:50:09 +00002721
2722 /* Show stub-router configuration */
2723 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2724 || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2725 {
2726 vty_out (vty, " Stub router advertisement is configured%s",
2727 VTY_NEWLINE);
2728 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2729 vty_out (vty, " Enabled for %us after start-up%s",
2730 ospf->stub_router_startup_time, VTY_NEWLINE);
2731 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2732 vty_out (vty, " Enabled for %us prior to full shutdown%s",
2733 ospf->stub_router_shutdown_time, VTY_NEWLINE);
2734 }
2735
paul718e3742002-12-13 20:15:29 +00002736 /* Show SPF timers. */
pauld24f6e22005-10-21 09:23:12 +00002737 vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2738 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2739 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2740 " Hold time multiplier is currently %d%s",
2741 ospf->spf_delay, VTY_NEWLINE,
2742 ospf->spf_holdtime, VTY_NEWLINE,
2743 ospf->spf_max_holdtime, VTY_NEWLINE,
2744 ospf->spf_hold_multiplier, VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002745 vty_out (vty, " SPF algorithm ");
2746 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2747 {
Paul Jakma2518efd2006-08-27 06:49:29 +00002748 result = tv_sub (recent_relative_time (), ospf->ts_spf);
paulb8ad39d2005-10-23 15:23:05 +00002749 vty_out (vty, "last executed %s ago%s",
2750 ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2751 VTY_NEWLINE);
2752 }
2753 else
2754 vty_out (vty, "has not been run%s", VTY_NEWLINE);
pauld24f6e22005-10-21 09:23:12 +00002755 vty_out (vty, " SPF timer %s%s%s",
2756 (ospf->t_spf_calc ? "due in " : "is "),
2757 ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2758 VTY_NEWLINE);
2759
paul718e3742002-12-13 20:15:29 +00002760 /* Show refresh parameters. */
2761 vty_out (vty, " Refresh timer %d secs%s",
paul68980082003-03-25 05:07:42 +00002762 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002763
2764 /* Show ABR/ASBR flags. */
paul68980082003-03-25 05:07:42 +00002765 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
paul718e3742002-12-13 20:15:29 +00002766 vty_out (vty, " This router is an ABR, ABR type is: %s%s",
paul68980082003-03-25 05:07:42 +00002767 ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002768
paul68980082003-03-25 05:07:42 +00002769 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
paul718e3742002-12-13 20:15:29 +00002770 vty_out (vty, " This router is an ASBR "
2771 "(injecting external routing information)%s", VTY_NEWLINE);
2772
2773 /* Show Number of AS-external-LSAs. */
hassofe71a972004-12-22 16:16:02 +00002774 vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2775 ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2776 ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2777#ifdef HAVE_OPAQUE_LSA
2778 vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2779 ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2780 ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2781#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002782 /* Show number of areas attached. */
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002783 vty_out (vty, " Number of areas attached to this router: %d%s",
2784 listcount (ospf->areas), VTY_NEWLINE);
2785
2786 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2787 {
2788 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2789 vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2790 else
2791 vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2792 }
2793
2794 vty_out (vty, "%s",VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002795
2796 /* Show each area status. */
paul1eb8ef22005-04-07 07:30:20 +00002797 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2798 show_ip_ospf_area (vty, area);
paul718e3742002-12-13 20:15:29 +00002799
2800 return CMD_SUCCESS;
2801}
2802
2803
ajsfd651fa2005-03-29 16:08:16 +00002804static void
paul68980082003-03-25 05:07:42 +00002805show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2806 struct interface *ifp)
paul718e3742002-12-13 20:15:29 +00002807{
ajsfd651fa2005-03-29 16:08:16 +00002808 int is_up;
paul718e3742002-12-13 20:15:29 +00002809 struct ospf_neighbor *nbr;
paul718e3742002-12-13 20:15:29 +00002810 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00002811
paul718e3742002-12-13 20:15:29 +00002812 /* Is interface up? */
ajsfd651fa2005-03-29 16:08:16 +00002813 vty_out (vty, "%s is %s%s", ifp->name,
2814 ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
ajsd2fc8892005-04-02 18:38:43 +00002815 vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2816 ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2817 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002818
2819 /* Is interface OSPF enabled? */
ajsfd651fa2005-03-29 16:08:16 +00002820 if (ospf_oi_count(ifp) == 0)
paul718e3742002-12-13 20:15:29 +00002821 {
2822 vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2823 return;
2824 }
ajsfd651fa2005-03-29 16:08:16 +00002825 else if (!is_up)
2826 {
2827 vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2828 VTY_NEWLINE);
2829 return;
2830 }
2831
paul718e3742002-12-13 20:15:29 +00002832 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2833 {
2834 struct ospf_interface *oi = rn->info;
2835
2836 if (oi == NULL)
2837 continue;
2838
2839 /* Show OSPF interface information. */
2840 vty_out (vty, " Internet Address %s/%d,",
2841 inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2842
Paul Jakma9c27ef92006-05-04 07:32:57 +00002843 if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2844 {
2845 struct in_addr *dest;
2846 const char *dstr;
2847
Andrew J. Schorre4529632006-12-12 19:18:21 +00002848 if (CONNECTED_PEER(oi->connected)
2849 || oi->type == OSPF_IFTYPE_VIRTUALLINK)
Paul Jakma9c27ef92006-05-04 07:32:57 +00002850 dstr = "Peer";
2851 else
2852 dstr = "Broadcast";
2853
2854 /* For Vlinks, showing the peer address is probably more
2855 * informative than the local interface that is being used
2856 */
2857 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2858 dest = &oi->vl_data->peer_addr;
2859 else
2860 dest = &oi->connected->destination->u.prefix4;
2861
2862 vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2863 }
hasso3fb9cd62004-10-19 19:44:43 +00002864
paul718e3742002-12-13 20:15:29 +00002865 vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2866 VTY_NEWLINE);
2867
vincentba682532005-09-29 13:52:57 +00002868 vty_out (vty, " MTU mismatch detection:%s%s",
2869 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2870
paul718e3742002-12-13 20:15:29 +00002871 vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
paul68980082003-03-25 05:07:42 +00002872 inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
paul718e3742002-12-13 20:15:29 +00002873 oi->output_cost, VTY_NEWLINE);
2874
2875 vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2876 OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2877 PRIORITY (oi), VTY_NEWLINE);
2878
2879 /* Show DR information. */
2880 if (DR (oi).s_addr == 0)
2881 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2882 else
2883 {
2884 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2885 if (nbr == NULL)
2886 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2887 else
2888 {
2889 vty_out (vty, " Designated Router (ID) %s,",
2890 inet_ntoa (nbr->router_id));
2891 vty_out (vty, " Interface Address %s%s",
2892 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2893 }
2894 }
2895
2896 /* Show BDR information. */
2897 if (BDR (oi).s_addr == 0)
2898 vty_out (vty, " No backup designated router on this network%s",
2899 VTY_NEWLINE);
2900 else
2901 {
2902 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2903 if (nbr == NULL)
2904 vty_out (vty, " No backup designated router on this network%s",
2905 VTY_NEWLINE);
2906 else
2907 {
2908 vty_out (vty, " Backup Designated Router (ID) %s,",
2909 inet_ntoa (nbr->router_id));
2910 vty_out (vty, " Interface Address %s%s",
2911 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2912 }
2913 }
Paul Jakma7eb5b472009-10-13 16:13:13 +01002914
2915 /* Next network-LSA sequence number we'll use, if we're elected DR */
2916 if (oi->params && ntohl (oi->params->network_lsa_seqnum)
2917 != OSPF_INITIAL_SEQUENCE_NUMBER)
2918 vty_out (vty, " Saved Network-LSA sequence number 0x%x%s",
2919 ntohl (oi->params->network_lsa_seqnum), VTY_NEWLINE);
2920
ajsba6454e2005-02-08 15:37:30 +00002921 vty_out (vty, " Multicast group memberships:");
Paul Jakma429ac782006-06-15 18:40:49 +00002922 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2923 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2924 {
2925 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2926 vty_out (vty, " OSPFAllRouters");
2927 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2928 vty_out (vty, " OSPFDesignatedRouters");
2929 }
2930 else
ajsba6454e2005-02-08 15:37:30 +00002931 vty_out (vty, " <None>");
2932 vty_out (vty, "%s", VTY_NEWLINE);
2933
paul718e3742002-12-13 20:15:29 +00002934 vty_out (vty, " Timer intervals configured,");
paulf9ad9372005-10-21 00:45:17 +00002935 vty_out (vty, " Hello ");
2936 if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2937 vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2938 else
2939 vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2940 vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2941 OSPF_IF_PARAM (oi, v_wait),
paul718e3742002-12-13 20:15:29 +00002942 OSPF_IF_PARAM (oi, v_wait),
2943 OSPF_IF_PARAM (oi, retransmit_interval),
2944 VTY_NEWLINE);
2945
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002946 if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
paulf9ad9372005-10-21 00:45:17 +00002947 {
ajs649654a2005-11-16 20:17:52 +00002948 char timebuf[OSPF_TIME_DUMP_SIZE];
paulf9ad9372005-10-21 00:45:17 +00002949 vty_out (vty, " Hello due in %s%s",
ajs649654a2005-11-16 20:17:52 +00002950 ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
paulf9ad9372005-10-21 00:45:17 +00002951 VTY_NEWLINE);
2952 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002953 else /* passive-interface is set */
paul718e3742002-12-13 20:15:29 +00002954 vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2955
2956 vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
paul68980082003-03-25 05:07:42 +00002957 ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
paul718e3742002-12-13 20:15:29 +00002958 VTY_NEWLINE);
2959 }
2960}
2961
2962DEFUN (show_ip_ospf_interface,
2963 show_ip_ospf_interface_cmd,
2964 "show ip ospf interface [INTERFACE]",
2965 SHOW_STR
2966 IP_STR
2967 "OSPF information\n"
2968 "Interface information\n"
2969 "Interface name\n")
2970{
2971 struct interface *ifp;
paul020709f2003-04-04 02:44:16 +00002972 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00002973 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002974
paul020709f2003-04-04 02:44:16 +00002975 ospf = ospf_lookup ();
Paul Jakmacac3b5c2006-05-11 13:31:11 +00002976 if (ospf == NULL)
2977 {
2978 vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
2979 return CMD_SUCCESS;
2980 }
paul020709f2003-04-04 02:44:16 +00002981
paul718e3742002-12-13 20:15:29 +00002982 /* Show All Interfaces. */
2983 if (argc == 0)
paul1eb8ef22005-04-07 07:30:20 +00002984 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
2985 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00002986 /* Interface name is specified. */
2987 else
2988 {
2989 if ((ifp = if_lookup_by_name (argv[0])) == NULL)
2990 vty_out (vty, "No such interface name%s", VTY_NEWLINE);
2991 else
paul68980082003-03-25 05:07:42 +00002992 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00002993 }
2994
2995 return CMD_SUCCESS;
2996}
2997
paul4dadc292005-05-06 21:37:42 +00002998static void
pauld24f6e22005-10-21 09:23:12 +00002999show_ip_ospf_neighbour_header (struct vty *vty)
3000{
3001 vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3002 VTY_NEWLINE,
3003 "Neighbor ID", "Pri", "State", "Dead Time",
3004 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3005 VTY_NEWLINE);
3006}
3007
3008static void
paul718e3742002-12-13 20:15:29 +00003009show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3010{
3011 struct route_node *rn;
3012 struct ospf_neighbor *nbr;
3013 char msgbuf[16];
ajs649654a2005-11-16 20:17:52 +00003014 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003015
3016 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3017 if ((nbr = rn->info))
3018 /* Do not show myself. */
3019 if (nbr != oi->nbr_self)
3020 /* Down state is not shown. */
3021 if (nbr->state != NSM_Down)
3022 {
3023 ospf_nbr_state_message (nbr, msgbuf, 16);
3024
3025 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
pauld24f6e22005-10-21 09:23:12 +00003026 vty_out (vty, "%-15s %3d %-15s ",
3027 "-", nbr->priority,
3028 msgbuf);
3029 else
3030 vty_out (vty, "%-15s %3d %-15s ",
3031 inet_ntoa (nbr->router_id), nbr->priority,
3032 msgbuf);
3033
3034 vty_out (vty, "%9s ",
3035 ospf_timer_dump (nbr->t_inactivity, timebuf,
3036 sizeof(timebuf)));
3037
paul718e3742002-12-13 20:15:29 +00003038 vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
pauld24f6e22005-10-21 09:23:12 +00003039 vty_out (vty, "%-20s %5ld %5ld %5d%s",
paul718e3742002-12-13 20:15:29 +00003040 IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3041 ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3042 VTY_NEWLINE);
3043 }
3044}
3045
3046DEFUN (show_ip_ospf_neighbor,
3047 show_ip_ospf_neighbor_cmd,
3048 "show ip ospf neighbor",
3049 SHOW_STR
3050 IP_STR
3051 "OSPF information\n"
3052 "Neighbor list\n")
3053{
paul020709f2003-04-04 02:44:16 +00003054 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003055 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003056 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003057
paul020709f2003-04-04 02:44:16 +00003058 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003059 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003060 {
3061 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3062 return CMD_SUCCESS;
3063 }
3064
pauld24f6e22005-10-21 09:23:12 +00003065 show_ip_ospf_neighbour_header (vty);
paul718e3742002-12-13 20:15:29 +00003066
paul1eb8ef22005-04-07 07:30:20 +00003067 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3068 show_ip_ospf_neighbor_sub (vty, oi);
paul718e3742002-12-13 20:15:29 +00003069
3070 return CMD_SUCCESS;
3071}
3072
3073DEFUN (show_ip_ospf_neighbor_all,
3074 show_ip_ospf_neighbor_all_cmd,
3075 "show ip ospf neighbor all",
3076 SHOW_STR
3077 IP_STR
3078 "OSPF information\n"
3079 "Neighbor list\n"
3080 "include down status neighbor\n")
3081{
Joakim Tjernlund35f89142008-07-01 16:54:07 +02003082 struct ospf *ospf = ospf_lookup ();
hasso52dc7ee2004-09-23 19:18:23 +00003083 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003084 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003085
paul68980082003-03-25 05:07:42 +00003086 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003087 {
3088 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3089 return CMD_SUCCESS;
3090 }
pauld24f6e22005-10-21 09:23:12 +00003091
3092 show_ip_ospf_neighbour_header (vty);
3093
paul1eb8ef22005-04-07 07:30:20 +00003094 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003095 {
hasso52dc7ee2004-09-23 19:18:23 +00003096 struct listnode *nbr_node;
paul1eb8ef22005-04-07 07:30:20 +00003097 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003098
3099 show_ip_ospf_neighbor_sub (vty, oi);
3100
3101 /* print Down neighbor status */
paul1eb8ef22005-04-07 07:30:20 +00003102 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
paul718e3742002-12-13 20:15:29 +00003103 {
paul718e3742002-12-13 20:15:29 +00003104 if (nbr_nbma->nbr == NULL
3105 || nbr_nbma->nbr->state == NSM_Down)
3106 {
pauld24f6e22005-10-21 09:23:12 +00003107 vty_out (vty, "%-15s %3d %-15s %9s ",
paul718e3742002-12-13 20:15:29 +00003108 "-", nbr_nbma->priority, "Down", "-");
pauld24f6e22005-10-21 09:23:12 +00003109 vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
paul718e3742002-12-13 20:15:29 +00003110 inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3111 0, 0, 0, VTY_NEWLINE);
3112 }
3113 }
3114 }
3115
3116 return CMD_SUCCESS;
3117}
3118
3119DEFUN (show_ip_ospf_neighbor_int,
3120 show_ip_ospf_neighbor_int_cmd,
hassobb5b7552005-08-21 20:01:15 +00003121 "show ip ospf neighbor IFNAME",
paul718e3742002-12-13 20:15:29 +00003122 SHOW_STR
3123 IP_STR
3124 "OSPF information\n"
3125 "Neighbor list\n"
3126 "Interface name\n")
3127{
paul020709f2003-04-04 02:44:16 +00003128 struct ospf *ospf;
hassobb5b7552005-08-21 20:01:15 +00003129 struct interface *ifp;
3130 struct route_node *rn;
3131
3132 ifp = if_lookup_by_name (argv[0]);
3133 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003134 {
hassobb5b7552005-08-21 20:01:15 +00003135 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003136 return CMD_WARNING;
3137 }
3138
paul020709f2003-04-04 02:44:16 +00003139 ospf = ospf_lookup ();
3140 if (ospf == NULL)
3141 {
3142 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3143 return CMD_SUCCESS;
3144 }
pauld24f6e22005-10-21 09:23:12 +00003145
3146 show_ip_ospf_neighbour_header (vty);
3147
hassobb5b7552005-08-21 20:01:15 +00003148 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00003149 {
hassobb5b7552005-08-21 20:01:15 +00003150 struct ospf_interface *oi = rn->info;
3151
3152 if (oi == NULL)
3153 continue;
3154
paul718e3742002-12-13 20:15:29 +00003155 show_ip_ospf_neighbor_sub (vty, oi);
3156 }
3157
3158 return CMD_SUCCESS;
3159}
3160
paul4dadc292005-05-06 21:37:42 +00003161static void
paul718e3742002-12-13 20:15:29 +00003162show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3163 struct ospf_nbr_nbma *nbr_nbma)
3164{
ajs649654a2005-11-16 20:17:52 +00003165 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003166
3167 /* Show neighbor ID. */
3168 vty_out (vty, " Neighbor %s,", "-");
3169
3170 /* Show interface address. */
3171 vty_out (vty, " interface address %s%s",
3172 inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3173 /* Show Area ID. */
3174 vty_out (vty, " In the area %s via interface %s%s",
3175 ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3176 /* Show neighbor priority and state. */
3177 vty_out (vty, " Neighbor priority is %d, State is %s,",
3178 nbr_nbma->priority, "Down");
3179 /* Show state changes. */
3180 vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3181
3182 /* Show PollInterval */
3183 vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3184
3185 /* Show poll-interval timer. */
3186 vty_out (vty, " Poll timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003187 ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3188 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003189
3190 /* Show poll-interval timer thread. */
3191 vty_out (vty, " Thread Poll Timer %s%s",
3192 nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3193}
3194
paul4dadc292005-05-06 21:37:42 +00003195static void
paul718e3742002-12-13 20:15:29 +00003196show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3197 struct ospf_neighbor *nbr)
3198{
ajs649654a2005-11-16 20:17:52 +00003199 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003200
3201 /* Show neighbor ID. */
3202 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3203 vty_out (vty, " Neighbor %s,", "-");
3204 else
3205 vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3206
3207 /* Show interface address. */
3208 vty_out (vty, " interface address %s%s",
3209 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3210 /* Show Area ID. */
3211 vty_out (vty, " In the area %s via interface %s%s",
3212 ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3213 /* Show neighbor priority and state. */
3214 vty_out (vty, " Neighbor priority is %d, State is %s,",
3215 nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3216 /* Show state changes. */
3217 vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
Paul Jakma3fed4162006-07-25 20:44:12 +00003218 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
Paul Jakma90c33172006-07-11 17:57:25 +00003219 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003220 struct timeval res
3221 = tv_sub (recent_relative_time (), nbr->ts_last_progress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003222 vty_out (vty, " Most recent state change statistics:%s",
3223 VTY_NEWLINE);
3224 vty_out (vty, " Progressive change %s ago%s",
Paul Jakma90c33172006-07-11 17:57:25 +00003225 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
Paul Jakma3fed4162006-07-25 20:44:12 +00003226 VTY_NEWLINE);
3227 }
3228 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3229 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003230 struct timeval res
3231 = tv_sub (recent_relative_time (), nbr->ts_last_regress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003232 vty_out (vty, " Regressive change %s ago, due to %s%s",
3233 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3234 (nbr->last_regress_str ? nbr->last_regress_str : "??"),
Paul Jakma90c33172006-07-11 17:57:25 +00003235 VTY_NEWLINE);
3236 }
paul718e3742002-12-13 20:15:29 +00003237 /* Show Designated Rotuer ID. */
3238 vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3239 /* Show Backup Designated Rotuer ID. */
3240 vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3241 /* Show options. */
3242 vty_out (vty, " Options %d %s%s", nbr->options,
3243 ospf_options_dump (nbr->options), VTY_NEWLINE);
3244 /* Show Router Dead interval timer. */
3245 vty_out (vty, " Dead timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003246 ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3247 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003248 /* Show Database Summary list. */
3249 vty_out (vty, " Database Summary List %d%s",
3250 ospf_db_summary_count (nbr), VTY_NEWLINE);
3251 /* Show Link State Request list. */
3252 vty_out (vty, " Link State Request List %ld%s",
3253 ospf_ls_request_count (nbr), VTY_NEWLINE);
3254 /* Show Link State Retransmission list. */
3255 vty_out (vty, " Link State Retransmission List %ld%s",
3256 ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3257 /* Show inactivity timer thread. */
3258 vty_out (vty, " Thread Inactivity Timer %s%s",
3259 nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3260 /* Show Database Description retransmission thread. */
3261 vty_out (vty, " Thread Database Description Retransmision %s%s",
3262 nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3263 /* Show Link State Request Retransmission thread. */
3264 vty_out (vty, " Thread Link State Request Retransmission %s%s",
3265 nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3266 /* Show Link State Update Retransmission thread. */
3267 vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3268 nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3269}
3270
3271DEFUN (show_ip_ospf_neighbor_id,
3272 show_ip_ospf_neighbor_id_cmd,
3273 "show ip ospf neighbor A.B.C.D",
3274 SHOW_STR
3275 IP_STR
3276 "OSPF information\n"
3277 "Neighbor list\n"
3278 "Neighbor ID\n")
3279{
paul020709f2003-04-04 02:44:16 +00003280 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003281 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003282 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003283 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003284 struct in_addr router_id;
3285 int ret;
3286
3287 ret = inet_aton (argv[0], &router_id);
3288 if (!ret)
3289 {
3290 vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3291 return CMD_WARNING;
3292 }
3293
paul020709f2003-04-04 02:44:16 +00003294 ospf = ospf_lookup ();
3295 if (ospf == NULL)
3296 {
3297 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3298 return CMD_SUCCESS;
3299 }
3300
paul1eb8ef22005-04-07 07:30:20 +00003301 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3302 if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
Andrew J. Schorr1c066bf2006-06-30 16:53:47 +00003303 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003304
paul718e3742002-12-13 20:15:29 +00003305 return CMD_SUCCESS;
3306}
3307
3308DEFUN (show_ip_ospf_neighbor_detail,
3309 show_ip_ospf_neighbor_detail_cmd,
3310 "show ip ospf neighbor detail",
3311 SHOW_STR
3312 IP_STR
3313 "OSPF information\n"
3314 "Neighbor list\n"
3315 "detail of all neighbors\n")
3316{
paul020709f2003-04-04 02:44:16 +00003317 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003318 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003319 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003320
paul020709f2003-04-04 02:44:16 +00003321 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003322 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003323 {
3324 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3325 return CMD_SUCCESS;
3326 }
paul718e3742002-12-13 20:15:29 +00003327
paul1eb8ef22005-04-07 07:30:20 +00003328 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003329 {
paul718e3742002-12-13 20:15:29 +00003330 struct route_node *rn;
3331 struct ospf_neighbor *nbr;
3332
3333 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3334 if ((nbr = rn->info))
3335 if (nbr != oi->nbr_self)
3336 if (nbr->state != NSM_Down)
3337 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3338 }
3339
3340 return CMD_SUCCESS;
3341}
3342
3343DEFUN (show_ip_ospf_neighbor_detail_all,
3344 show_ip_ospf_neighbor_detail_all_cmd,
3345 "show ip ospf neighbor detail all",
3346 SHOW_STR
3347 IP_STR
3348 "OSPF information\n"
3349 "Neighbor list\n"
3350 "detail of all neighbors\n"
3351 "include down status neighbor\n")
3352{
paul020709f2003-04-04 02:44:16 +00003353 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003354 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003355 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003356
paul020709f2003-04-04 02:44:16 +00003357 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003358 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003359 {
3360 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3361 return CMD_SUCCESS;
3362 }
paul718e3742002-12-13 20:15:29 +00003363
paul1eb8ef22005-04-07 07:30:20 +00003364 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003365 {
paul718e3742002-12-13 20:15:29 +00003366 struct route_node *rn;
3367 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003368 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003369
3370 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3371 if ((nbr = rn->info))
3372 if (nbr != oi->nbr_self)
3373 if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3374 show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3375
3376 if (oi->type == OSPF_IFTYPE_NBMA)
3377 {
hasso52dc7ee2004-09-23 19:18:23 +00003378 struct listnode *nd;
paul718e3742002-12-13 20:15:29 +00003379
paul1eb8ef22005-04-07 07:30:20 +00003380 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3381 if (nbr_nbma->nbr == NULL
3382 || nbr_nbma->nbr->state == NSM_Down)
3383 show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
paul718e3742002-12-13 20:15:29 +00003384 }
3385 }
3386
3387 return CMD_SUCCESS;
3388}
3389
3390DEFUN (show_ip_ospf_neighbor_int_detail,
3391 show_ip_ospf_neighbor_int_detail_cmd,
hassobb5b7552005-08-21 20:01:15 +00003392 "show ip ospf neighbor IFNAME detail",
paul718e3742002-12-13 20:15:29 +00003393 SHOW_STR
3394 IP_STR
3395 "OSPF information\n"
3396 "Neighbor list\n"
hassobb5b7552005-08-21 20:01:15 +00003397 "Interface name\n"
paul718e3742002-12-13 20:15:29 +00003398 "detail of all neighbors")
3399{
paul020709f2003-04-04 02:44:16 +00003400 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00003401 struct ospf_interface *oi;
hassobb5b7552005-08-21 20:01:15 +00003402 struct interface *ifp;
3403 struct route_node *rn, *nrn;
3404 struct ospf_neighbor *nbr;
3405
3406 ifp = if_lookup_by_name (argv[0]);
3407 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003408 {
hassobb5b7552005-08-21 20:01:15 +00003409 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003410 return CMD_WARNING;
3411 }
3412
paul020709f2003-04-04 02:44:16 +00003413 ospf = ospf_lookup ();
3414 if (ospf == NULL)
3415 {
3416 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3417 return CMD_SUCCESS;
3418 }
paul68980082003-03-25 05:07:42 +00003419
paul718e3742002-12-13 20:15:29 +00003420
hassobb5b7552005-08-21 20:01:15 +00003421 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3422 if ((oi = rn->info))
3423 for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3424 if ((nbr = nrn->info))
paul718e3742002-12-13 20:15:29 +00003425 if (nbr != oi->nbr_self)
3426 if (nbr->state != NSM_Down)
3427 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003428
3429 return CMD_SUCCESS;
3430}
3431
3432
3433/* Show functions */
paul4dadc292005-05-06 21:37:42 +00003434static int
paul020709f2003-04-04 02:44:16 +00003435show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
paul718e3742002-12-13 20:15:29 +00003436{
paul718e3742002-12-13 20:15:29 +00003437 struct router_lsa *rl;
3438 struct summary_lsa *sl;
3439 struct as_external_lsa *asel;
3440 struct prefix_ipv4 p;
3441
3442 if (lsa != NULL)
3443 /* If self option is set, check LSA self flag. */
3444 if (self == 0 || IS_LSA_SELF (lsa))
3445 {
3446 /* LSA common part show. */
3447 vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3448 vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3449 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3450 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3451 /* LSA specific part show. */
3452 switch (lsa->data->type)
3453 {
3454 case OSPF_ROUTER_LSA:
3455 rl = (struct router_lsa *) lsa->data;
3456 vty_out (vty, " %-d", ntohs (rl->links));
3457 break;
3458 case OSPF_SUMMARY_LSA:
3459 sl = (struct summary_lsa *) lsa->data;
3460
3461 p.family = AF_INET;
3462 p.prefix = sl->header.id;
3463 p.prefixlen = ip_masklen (sl->mask);
3464 apply_mask_ipv4 (&p);
3465
3466 vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3467 break;
3468 case OSPF_AS_EXTERNAL_LSA:
paul551a8972003-05-18 15:22:55 +00003469 case OSPF_AS_NSSA_LSA:
paul718e3742002-12-13 20:15:29 +00003470 asel = (struct as_external_lsa *) lsa->data;
3471
3472 p.family = AF_INET;
3473 p.prefix = asel->header.id;
3474 p.prefixlen = ip_masklen (asel->mask);
3475 apply_mask_ipv4 (&p);
3476
3477 vty_out (vty, " %s %s/%d [0x%lx]",
3478 IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3479 inet_ntoa (p.prefix), p.prefixlen,
3480 (u_long)ntohl (asel->e[0].route_tag));
3481 break;
3482 case OSPF_NETWORK_LSA:
3483 case OSPF_ASBR_SUMMARY_LSA:
3484#ifdef HAVE_OPAQUE_LSA
3485 case OSPF_OPAQUE_LINK_LSA:
3486 case OSPF_OPAQUE_AREA_LSA:
3487 case OSPF_OPAQUE_AS_LSA:
3488#endif /* HAVE_OPAQUE_LSA */
3489 default:
3490 break;
3491 }
3492 vty_out (vty, VTY_NEWLINE);
3493 }
3494
3495 return 0;
3496}
3497
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003498static const char *show_database_desc[] =
paul718e3742002-12-13 20:15:29 +00003499{
3500 "unknown",
3501 "Router Link States",
3502 "Net Link States",
3503 "Summary Link States",
3504 "ASBR-Summary Link States",
3505 "AS External Link States",
paul718e3742002-12-13 20:15:29 +00003506 "Group Membership LSA",
3507 "NSSA-external Link States",
paul718e3742002-12-13 20:15:29 +00003508#ifdef HAVE_OPAQUE_LSA
3509 "Type-8 LSA",
3510 "Link-Local Opaque-LSA",
3511 "Area-Local Opaque-LSA",
3512 "AS-external Opaque-LSA",
3513#endif /* HAVE_OPAQUE_LSA */
3514};
3515
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003516static const char *show_database_header[] =
paul718e3742002-12-13 20:15:29 +00003517{
3518 "",
3519 "Link ID ADV Router Age Seq# CkSum Link count",
3520 "Link ID ADV Router Age Seq# CkSum",
3521 "Link ID ADV Router Age Seq# CkSum Route",
3522 "Link ID ADV Router Age Seq# CkSum",
3523 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003524 " --- header for Group Member ----",
3525 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003526#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003527 " --- type-8 ---",
3528 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3529 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3530 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3531#endif /* HAVE_OPAQUE_LSA */
3532};
3533
paul4dadc292005-05-06 21:37:42 +00003534static void
paul718e3742002-12-13 20:15:29 +00003535show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3536{
3537 struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
paul4957f492003-06-27 01:28:45 +00003538
paul718e3742002-12-13 20:15:29 +00003539 vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
paul4957f492003-06-27 01:28:45 +00003540 vty_out (vty, " Options: 0x%-2x : %s%s",
3541 lsa->data->options,
3542 ospf_options_dump(lsa->data->options),
3543 VTY_NEWLINE);
3544 vty_out (vty, " LS Flags: 0x%-2x %s%s",
paul9d526032003-06-30 22:46:14 +00003545 lsa->flags,
paul4957f492003-06-27 01:28:45 +00003546 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3547 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003548
3549 if (lsa->data->type == OSPF_ROUTER_LSA)
3550 {
3551 vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3552
3553 if (rlsa->flags)
3554 vty_out (vty, " :%s%s%s%s",
3555 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3556 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3557 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3558 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3559
3560 vty_out (vty, "%s", VTY_NEWLINE);
3561 }
3562 vty_out (vty, " LS Type: %s%s",
3563 LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3564 vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3565 LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3566 vty_out (vty, " Advertising Router: %s%s",
3567 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3568 vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3569 VTY_NEWLINE);
3570 vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3571 VTY_NEWLINE);
3572 vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3573}
3574
hassoeb1ce602004-10-08 08:17:22 +00003575const char *link_type_desc[] =
paul718e3742002-12-13 20:15:29 +00003576{
3577 "(null)",
3578 "another Router (point-to-point)",
3579 "a Transit Network",
3580 "Stub Network",
3581 "a Virtual Link",
3582};
3583
hassoeb1ce602004-10-08 08:17:22 +00003584const char *link_id_desc[] =
paul718e3742002-12-13 20:15:29 +00003585{
3586 "(null)",
3587 "Neighboring Router ID",
3588 "Designated Router address",
paul68980082003-03-25 05:07:42 +00003589 "Net",
paul718e3742002-12-13 20:15:29 +00003590 "Neighboring Router ID",
3591};
3592
hassoeb1ce602004-10-08 08:17:22 +00003593const char *link_data_desc[] =
paul718e3742002-12-13 20:15:29 +00003594{
3595 "(null)",
3596 "Router Interface address",
3597 "Router Interface address",
3598 "Network Mask",
3599 "Router Interface address",
3600};
3601
3602/* Show router-LSA each Link information. */
paul4dadc292005-05-06 21:37:42 +00003603static void
paul718e3742002-12-13 20:15:29 +00003604show_ip_ospf_database_router_links (struct vty *vty,
3605 struct router_lsa *rl)
3606{
3607 int len, i, type;
3608
3609 len = ntohs (rl->header.length) - 4;
3610 for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3611 {
3612 type = rl->link[i].type;
3613
3614 vty_out (vty, " Link connected to: %s%s",
3615 link_type_desc[type], VTY_NEWLINE);
3616 vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3617 inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3618 vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3619 inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3620 vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3621 vty_out (vty, " TOS 0 Metric: %d%s",
3622 ntohs (rl->link[i].metric), VTY_NEWLINE);
3623 vty_out (vty, "%s", VTY_NEWLINE);
3624 }
3625}
3626
3627/* Show router-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003628static int
paul718e3742002-12-13 20:15:29 +00003629show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3630{
3631 if (lsa != NULL)
3632 {
3633 struct router_lsa *rl = (struct router_lsa *) lsa->data;
3634
3635 show_ip_ospf_database_header (vty, lsa);
3636
3637 vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3638 VTY_NEWLINE, VTY_NEWLINE);
3639
3640 show_ip_ospf_database_router_links (vty, rl);
paulb0a053b2003-06-22 09:04:47 +00003641 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003642 }
3643
3644 return 0;
3645}
3646
3647/* Show network-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003648static int
paul718e3742002-12-13 20:15:29 +00003649show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3650{
3651 int length, i;
3652
3653 if (lsa != NULL)
3654 {
3655 struct network_lsa *nl = (struct network_lsa *) lsa->data;
3656
3657 show_ip_ospf_database_header (vty, lsa);
3658
3659 vty_out (vty, " Network Mask: /%d%s",
3660 ip_masklen (nl->mask), VTY_NEWLINE);
3661
3662 length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3663
3664 for (i = 0; length > 0; i++, length -= 4)
3665 vty_out (vty, " Attached Router: %s%s",
3666 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3667
3668 vty_out (vty, "%s", VTY_NEWLINE);
3669 }
3670
3671 return 0;
3672}
3673
3674/* Show summary-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003675static int
paul718e3742002-12-13 20:15:29 +00003676show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3677{
3678 if (lsa != NULL)
3679 {
3680 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3681
3682 show_ip_ospf_database_header (vty, lsa);
3683
3684 vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3685 VTY_NEWLINE);
3686 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3687 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003688 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003689 }
3690
3691 return 0;
3692}
3693
3694/* Show summary-ASBR-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003695static int
paul718e3742002-12-13 20:15:29 +00003696show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3697{
3698 if (lsa != NULL)
3699 {
3700 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3701
3702 show_ip_ospf_database_header (vty, lsa);
3703
3704 vty_out (vty, " Network Mask: /%d%s",
3705 ip_masklen (sl->mask), VTY_NEWLINE);
3706 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3707 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003708 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003709 }
3710
3711 return 0;
3712}
3713
3714/* Show AS-external-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003715static int
paul718e3742002-12-13 20:15:29 +00003716show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3717{
3718 if (lsa != NULL)
3719 {
3720 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3721
3722 show_ip_ospf_database_header (vty, lsa);
3723
3724 vty_out (vty, " Network Mask: /%d%s",
3725 ip_masklen (al->mask), VTY_NEWLINE);
3726 vty_out (vty, " Metric Type: %s%s",
3727 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3728 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3729 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3730 vty_out (vty, " Metric: %d%s",
3731 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3732 vty_out (vty, " Forward Address: %s%s",
3733 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3734
3735 vty_out (vty, " External Route Tag: %lu%s%s",
3736 (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3737 }
3738
3739 return 0;
3740}
3741
Stephen Hemminger075e12f2011-12-06 23:54:17 +04003742#if 0
paul4dadc292005-05-06 21:37:42 +00003743static int
paul718e3742002-12-13 20:15:29 +00003744show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3745{
3746 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3747
3748 /* show_ip_ospf_database_header (vty, lsa); */
3749
ajs2a42e282004-12-08 18:43:03 +00003750 zlog_debug( " Network Mask: /%d%s",
paul718e3742002-12-13 20:15:29 +00003751 ip_masklen (al->mask), "\n");
ajs2a42e282004-12-08 18:43:03 +00003752 zlog_debug( " Metric Type: %s%s",
paul718e3742002-12-13 20:15:29 +00003753 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3754 "2 (Larger than any link state path)" : "1", "\n");
ajs2a42e282004-12-08 18:43:03 +00003755 zlog_debug( " TOS: 0%s", "\n");
3756 zlog_debug( " Metric: %d%s",
paul718e3742002-12-13 20:15:29 +00003757 GET_METRIC (al->e[0].metric), "\n");
ajs2a42e282004-12-08 18:43:03 +00003758 zlog_debug( " Forward Address: %s%s",
paul718e3742002-12-13 20:15:29 +00003759 inet_ntoa (al->e[0].fwd_addr), "\n");
3760
ajs2a42e282004-12-08 18:43:03 +00003761 zlog_debug( " External Route Tag: %u%s%s",
paul718e3742002-12-13 20:15:29 +00003762 ntohl (al->e[0].route_tag), "\n", "\n");
3763
3764 return 0;
3765}
Stephen Hemminger075e12f2011-12-06 23:54:17 +04003766#endif
paul718e3742002-12-13 20:15:29 +00003767
3768/* Show AS-NSSA-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003769static int
paul718e3742002-12-13 20:15:29 +00003770show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3771{
3772 if (lsa != NULL)
3773 {
3774 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3775
3776 show_ip_ospf_database_header (vty, lsa);
3777
3778 vty_out (vty, " Network Mask: /%d%s",
3779 ip_masklen (al->mask), VTY_NEWLINE);
3780 vty_out (vty, " Metric Type: %s%s",
3781 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3782 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3783 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3784 vty_out (vty, " Metric: %d%s",
3785 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3786 vty_out (vty, " NSSA: Forward Address: %s%s",
3787 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3788
3789 vty_out (vty, " External Route Tag: %u%s%s",
3790 ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3791 }
3792
3793 return 0;
3794}
3795
paul4dadc292005-05-06 21:37:42 +00003796static int
paul718e3742002-12-13 20:15:29 +00003797show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3798{
3799 return 0;
3800}
3801
3802#ifdef HAVE_OPAQUE_LSA
paul4dadc292005-05-06 21:37:42 +00003803static int
paul718e3742002-12-13 20:15:29 +00003804show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3805{
3806 if (lsa != NULL)
3807 {
3808 show_ip_ospf_database_header (vty, lsa);
3809 show_opaque_info_detail (vty, lsa);
3810
3811 vty_out (vty, "%s", VTY_NEWLINE);
3812 }
3813 return 0;
3814}
3815#endif /* HAVE_OPAQUE_LSA */
3816
3817int (*show_function[])(struct vty *, struct ospf_lsa *) =
3818{
3819 NULL,
3820 show_router_lsa_detail,
3821 show_network_lsa_detail,
3822 show_summary_lsa_detail,
3823 show_summary_asbr_lsa_detail,
3824 show_as_external_lsa_detail,
paul718e3742002-12-13 20:15:29 +00003825 show_func_dummy,
3826 show_as_nssa_lsa_detail, /* almost same as external */
paul718e3742002-12-13 20:15:29 +00003827#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003828 NULL, /* type-8 */
3829 show_opaque_lsa_detail,
3830 show_opaque_lsa_detail,
3831 show_opaque_lsa_detail,
3832#endif /* HAVE_OPAQUE_LSA */
3833};
3834
paul4dadc292005-05-06 21:37:42 +00003835static void
paul718e3742002-12-13 20:15:29 +00003836show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3837 struct in_addr *adv_router)
3838{
3839 memset (lp, 0, sizeof (struct prefix_ls));
3840 lp->family = 0;
3841 if (id == NULL)
3842 lp->prefixlen = 0;
3843 else if (adv_router == NULL)
3844 {
3845 lp->prefixlen = 32;
3846 lp->id = *id;
3847 }
3848 else
3849 {
3850 lp->prefixlen = 64;
3851 lp->id = *id;
3852 lp->adv_router = *adv_router;
3853 }
3854}
3855
paul4dadc292005-05-06 21:37:42 +00003856static void
paul718e3742002-12-13 20:15:29 +00003857show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3858 struct in_addr *id, struct in_addr *adv_router)
3859{
3860 struct prefix_ls lp;
3861 struct route_node *rn, *start;
3862 struct ospf_lsa *lsa;
3863
3864 show_lsa_prefix_set (vty, &lp, id, adv_router);
3865 start = route_node_get (rt, (struct prefix *) &lp);
3866 if (start)
3867 {
3868 route_lock_node (start);
3869 for (rn = start; rn; rn = route_next_until (rn, start))
3870 if ((lsa = rn->info))
3871 {
paul718e3742002-12-13 20:15:29 +00003872 if (show_function[lsa->data->type] != NULL)
3873 show_function[lsa->data->type] (vty, lsa);
3874 }
3875 route_unlock_node (start);
3876 }
3877}
3878
3879/* Show detail LSA information
3880 -- if id is NULL then show all LSAs. */
paul4dadc292005-05-06 21:37:42 +00003881static void
paul020709f2003-04-04 02:44:16 +00003882show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003883 struct in_addr *id, struct in_addr *adv_router)
3884{
hasso52dc7ee2004-09-23 19:18:23 +00003885 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003886 struct ospf_area *area;
3887
paul718e3742002-12-13 20:15:29 +00003888 switch (type)
3889 {
3890 case OSPF_AS_EXTERNAL_LSA:
3891#ifdef HAVE_OPAQUE_LSA
3892 case OSPF_OPAQUE_AS_LSA:
3893#endif /* HAVE_OPAQUE_LSA */
3894 vty_out (vty, " %s %s%s",
3895 show_database_desc[type],
3896 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003897 show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
paul718e3742002-12-13 20:15:29 +00003898 break;
3899 default:
paul1eb8ef22005-04-07 07:30:20 +00003900 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003901 {
paul718e3742002-12-13 20:15:29 +00003902 vty_out (vty, "%s %s (Area %s)%s%s",
3903 VTY_NEWLINE, show_database_desc[type],
3904 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3905 show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3906 }
3907 break;
3908 }
3909}
3910
paul4dadc292005-05-06 21:37:42 +00003911static void
paul718e3742002-12-13 20:15:29 +00003912show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3913 struct in_addr *adv_router)
3914{
3915 struct route_node *rn;
3916 struct ospf_lsa *lsa;
3917
3918 for (rn = route_top (rt); rn; rn = route_next (rn))
3919 if ((lsa = rn->info))
3920 if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3921 {
paul718e3742002-12-13 20:15:29 +00003922 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3923 continue;
paul718e3742002-12-13 20:15:29 +00003924 if (show_function[lsa->data->type] != NULL)
3925 show_function[lsa->data->type] (vty, lsa);
3926 }
3927}
3928
3929/* Show detail LSA information. */
paul4dadc292005-05-06 21:37:42 +00003930static void
paul020709f2003-04-04 02:44:16 +00003931show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003932 struct in_addr *adv_router)
3933{
hasso52dc7ee2004-09-23 19:18:23 +00003934 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003935 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00003936
3937 switch (type)
3938 {
3939 case OSPF_AS_EXTERNAL_LSA:
3940#ifdef HAVE_OPAQUE_LSA
3941 case OSPF_OPAQUE_AS_LSA:
3942#endif /* HAVE_OPAQUE_LSA */
3943 vty_out (vty, " %s %s%s",
3944 show_database_desc[type],
3945 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003946 show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
paul718e3742002-12-13 20:15:29 +00003947 adv_router);
3948 break;
3949 default:
paul1eb8ef22005-04-07 07:30:20 +00003950 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003951 {
paul718e3742002-12-13 20:15:29 +00003952 vty_out (vty, "%s %s (Area %s)%s%s",
3953 VTY_NEWLINE, show_database_desc[type],
3954 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3955 show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3956 adv_router);
3957 }
3958 break;
3959 }
3960}
3961
paul4dadc292005-05-06 21:37:42 +00003962static void
paul020709f2003-04-04 02:44:16 +00003963show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
paul718e3742002-12-13 20:15:29 +00003964{
paul020709f2003-04-04 02:44:16 +00003965 struct ospf_lsa *lsa;
3966 struct route_node *rn;
paul1eb8ef22005-04-07 07:30:20 +00003967 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +00003968 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003969 int type;
3970
paul1eb8ef22005-04-07 07:30:20 +00003971 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003972 {
paul718e3742002-12-13 20:15:29 +00003973 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3974 {
3975 switch (type)
3976 {
3977 case OSPF_AS_EXTERNAL_LSA:
3978#ifdef HAVE_OPAQUE_LSA
3979 case OSPF_OPAQUE_AS_LSA:
3980#endif /* HAVE_OPAQUE_LSA */
3981 continue;
3982 default:
3983 break;
3984 }
3985 if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
3986 (!self && ospf_lsdb_count (area->lsdb, type) > 0))
3987 {
3988 vty_out (vty, " %s (Area %s)%s%s",
3989 show_database_desc[type],
3990 ospf_area_desc_string (area),
3991 VTY_NEWLINE, VTY_NEWLINE);
3992 vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
3993
paul020709f2003-04-04 02:44:16 +00003994 LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
3995 show_lsa_summary (vty, lsa, self);
paul718e3742002-12-13 20:15:29 +00003996
3997 vty_out (vty, "%s", VTY_NEWLINE);
3998 }
3999 }
4000 }
4001
4002 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4003 {
4004 switch (type)
4005 {
4006 case OSPF_AS_EXTERNAL_LSA:
4007#ifdef HAVE_OPAQUE_LSA
4008 case OSPF_OPAQUE_AS_LSA:
4009#endif /* HAVE_OPAQUE_LSA */
paule8e19462006-01-19 20:16:55 +00004010 break;
paul718e3742002-12-13 20:15:29 +00004011 default:
4012 continue;
4013 }
paul68980082003-03-25 05:07:42 +00004014 if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4015 (!self && ospf_lsdb_count (ospf->lsdb, type)))
paul718e3742002-12-13 20:15:29 +00004016 {
4017 vty_out (vty, " %s%s%s",
4018 show_database_desc[type],
4019 VTY_NEWLINE, VTY_NEWLINE);
4020 vty_out (vty, "%s%s", show_database_header[type],
4021 VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00004022
4023 LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4024 show_lsa_summary (vty, lsa, self);
4025
paul718e3742002-12-13 20:15:29 +00004026 vty_out (vty, "%s", VTY_NEWLINE);
4027 }
4028 }
4029
4030 vty_out (vty, "%s", VTY_NEWLINE);
4031}
4032
paul4dadc292005-05-06 21:37:42 +00004033static void
paul020709f2003-04-04 02:44:16 +00004034show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00004035{
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004036 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00004037 struct ospf_lsa *lsa;
4038
4039 vty_out (vty, "%s MaxAge Link States:%s%s",
4040 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4041
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004042 for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
paul1eb8ef22005-04-07 07:30:20 +00004043 {
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004044 struct ospf_lsa *lsa;
4045
4046 if ((lsa = rn->info) != NULL)
4047 {
4048 vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4049 vty_out (vty, "Link State ID: %s%s",
4050 inet_ntoa (lsa->data->id), VTY_NEWLINE);
4051 vty_out (vty, "Advertising Router: %s%s",
4052 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4053 vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4054 vty_out (vty, "%s", VTY_NEWLINE);
4055 }
paul1eb8ef22005-04-07 07:30:20 +00004056 }
paul718e3742002-12-13 20:15:29 +00004057}
4058
paul718e3742002-12-13 20:15:29 +00004059#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4060#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
paul718e3742002-12-13 20:15:29 +00004061
4062#ifdef HAVE_OPAQUE_LSA
4063#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4064#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4065#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4066#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4067#else /* HAVE_OPAQUE_LSA */
4068#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4069#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4070#define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4071#define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4072#endif /* HAVE_OPAQUE_LSA */
4073
4074#define OSPF_LSA_TYPES_CMD_STR \
4075 "asbr-summary|external|network|router|summary" \
4076 OSPF_LSA_TYPE_NSSA_CMD_STR \
4077 OSPF_LSA_TYPE_OPAQUE_CMD_STR
4078
4079#define OSPF_LSA_TYPES_DESC \
4080 "ASBR summary link states\n" \
4081 "External link states\n" \
4082 "Network link states\n" \
4083 "Router link states\n" \
4084 "Network summary link states\n" \
4085 OSPF_LSA_TYPE_NSSA_DESC \
4086 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4087 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4088 OSPF_LSA_TYPE_OPAQUE_AS_DESC
4089
4090DEFUN (show_ip_ospf_database,
4091 show_ip_ospf_database_cmd,
4092 "show ip ospf database",
4093 SHOW_STR
4094 IP_STR
4095 "OSPF information\n"
4096 "Database summary\n")
4097{
paul020709f2003-04-04 02:44:16 +00004098 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004099 int type, ret;
4100 struct in_addr id, adv_router;
4101
paul020709f2003-04-04 02:44:16 +00004102 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004103 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004104 {
4105 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4106 return CMD_SUCCESS;
4107 }
paul718e3742002-12-13 20:15:29 +00004108
4109 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004110 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004111
4112 /* Show all LSA. */
4113 if (argc == 0)
4114 {
paul020709f2003-04-04 02:44:16 +00004115 show_ip_ospf_database_summary (vty, ospf, 0);
paul718e3742002-12-13 20:15:29 +00004116 return CMD_SUCCESS;
4117 }
4118
4119 /* Set database type to show. */
4120 if (strncmp (argv[0], "r", 1) == 0)
4121 type = OSPF_ROUTER_LSA;
4122 else if (strncmp (argv[0], "ne", 2) == 0)
4123 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004124 else if (strncmp (argv[0], "ns", 2) == 0)
4125 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004126 else if (strncmp (argv[0], "su", 2) == 0)
4127 type = OSPF_SUMMARY_LSA;
4128 else if (strncmp (argv[0], "a", 1) == 0)
4129 type = OSPF_ASBR_SUMMARY_LSA;
4130 else if (strncmp (argv[0], "e", 1) == 0)
4131 type = OSPF_AS_EXTERNAL_LSA;
4132 else if (strncmp (argv[0], "se", 2) == 0)
4133 {
paul020709f2003-04-04 02:44:16 +00004134 show_ip_ospf_database_summary (vty, ospf, 1);
paul718e3742002-12-13 20:15:29 +00004135 return CMD_SUCCESS;
4136 }
4137 else if (strncmp (argv[0], "m", 1) == 0)
4138 {
paul020709f2003-04-04 02:44:16 +00004139 show_ip_ospf_database_maxage (vty, ospf);
paul718e3742002-12-13 20:15:29 +00004140 return CMD_SUCCESS;
4141 }
4142#ifdef HAVE_OPAQUE_LSA
4143 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4144 type = OSPF_OPAQUE_LINK_LSA;
4145 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4146 type = OSPF_OPAQUE_AREA_LSA;
4147 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4148 type = OSPF_OPAQUE_AS_LSA;
4149#endif /* HAVE_OPAQUE_LSA */
4150 else
4151 return CMD_WARNING;
4152
4153 /* `show ip ospf database LSA'. */
4154 if (argc == 1)
paul020709f2003-04-04 02:44:16 +00004155 show_lsa_detail (vty, ospf, type, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00004156 else if (argc >= 2)
4157 {
4158 ret = inet_aton (argv[1], &id);
4159 if (!ret)
4160 return CMD_WARNING;
4161
4162 /* `show ip ospf database LSA ID'. */
4163 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00004164 show_lsa_detail (vty, ospf, type, &id, NULL);
paul718e3742002-12-13 20:15:29 +00004165 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4166 else if (argc == 3)
4167 {
4168 if (strncmp (argv[2], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004169 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004170 else
4171 {
4172 ret = inet_aton (argv[2], &adv_router);
4173 if (!ret)
4174 return CMD_WARNING;
4175 }
paul020709f2003-04-04 02:44:16 +00004176 show_lsa_detail (vty, ospf, type, &id, &adv_router);
paul718e3742002-12-13 20:15:29 +00004177 }
4178 }
4179
4180 return CMD_SUCCESS;
4181}
4182
4183ALIAS (show_ip_ospf_database,
4184 show_ip_ospf_database_type_cmd,
4185 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4186 SHOW_STR
4187 IP_STR
4188 "OSPF information\n"
4189 "Database summary\n"
4190 OSPF_LSA_TYPES_DESC
4191 "LSAs in MaxAge list\n"
4192 "Self-originated link states\n")
4193
4194ALIAS (show_ip_ospf_database,
4195 show_ip_ospf_database_type_id_cmd,
4196 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4197 SHOW_STR
4198 IP_STR
4199 "OSPF information\n"
4200 "Database summary\n"
4201 OSPF_LSA_TYPES_DESC
4202 "Link State ID (as an IP address)\n")
4203
4204ALIAS (show_ip_ospf_database,
4205 show_ip_ospf_database_type_id_adv_router_cmd,
4206 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4207 SHOW_STR
4208 IP_STR
4209 "OSPF information\n"
4210 "Database summary\n"
4211 OSPF_LSA_TYPES_DESC
4212 "Link State ID (as an IP address)\n"
4213 "Advertising Router link states\n"
4214 "Advertising Router (as an IP address)\n")
4215
4216ALIAS (show_ip_ospf_database,
4217 show_ip_ospf_database_type_id_self_cmd,
4218 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4219 SHOW_STR
4220 IP_STR
4221 "OSPF information\n"
4222 "Database summary\n"
4223 OSPF_LSA_TYPES_DESC
4224 "Link State ID (as an IP address)\n"
4225 "Self-originated link states\n"
4226 "\n")
4227
4228DEFUN (show_ip_ospf_database_type_adv_router,
4229 show_ip_ospf_database_type_adv_router_cmd,
4230 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4231 SHOW_STR
4232 IP_STR
4233 "OSPF information\n"
4234 "Database summary\n"
4235 OSPF_LSA_TYPES_DESC
4236 "Advertising Router link states\n"
4237 "Advertising Router (as an IP address)\n")
4238{
paul020709f2003-04-04 02:44:16 +00004239 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004240 int type, ret;
4241 struct in_addr adv_router;
4242
paul020709f2003-04-04 02:44:16 +00004243 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004244 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004245 {
4246 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4247 return CMD_SUCCESS;
4248 }
paul718e3742002-12-13 20:15:29 +00004249
4250 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004251 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004252
4253 if (argc != 2)
4254 return CMD_WARNING;
4255
4256 /* Set database type to show. */
4257 if (strncmp (argv[0], "r", 1) == 0)
4258 type = OSPF_ROUTER_LSA;
4259 else if (strncmp (argv[0], "ne", 2) == 0)
4260 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004261 else if (strncmp (argv[0], "ns", 2) == 0)
4262 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004263 else if (strncmp (argv[0], "s", 1) == 0)
4264 type = OSPF_SUMMARY_LSA;
4265 else if (strncmp (argv[0], "a", 1) == 0)
4266 type = OSPF_ASBR_SUMMARY_LSA;
4267 else if (strncmp (argv[0], "e", 1) == 0)
4268 type = OSPF_AS_EXTERNAL_LSA;
4269#ifdef HAVE_OPAQUE_LSA
4270 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4271 type = OSPF_OPAQUE_LINK_LSA;
4272 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4273 type = OSPF_OPAQUE_AREA_LSA;
4274 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4275 type = OSPF_OPAQUE_AS_LSA;
4276#endif /* HAVE_OPAQUE_LSA */
4277 else
4278 return CMD_WARNING;
4279
4280 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4281 if (strncmp (argv[1], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004282 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004283 else
4284 {
4285 ret = inet_aton (argv[1], &adv_router);
4286 if (!ret)
4287 return CMD_WARNING;
4288 }
4289
paul020709f2003-04-04 02:44:16 +00004290 show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
paul718e3742002-12-13 20:15:29 +00004291
4292 return CMD_SUCCESS;
4293}
4294
4295ALIAS (show_ip_ospf_database_type_adv_router,
4296 show_ip_ospf_database_type_self_cmd,
4297 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4298 SHOW_STR
4299 IP_STR
4300 "OSPF information\n"
4301 "Database summary\n"
4302 OSPF_LSA_TYPES_DESC
4303 "Self-originated link states\n")
4304
4305
4306DEFUN (ip_ospf_authentication_args,
4307 ip_ospf_authentication_args_addr_cmd,
4308 "ip ospf authentication (null|message-digest) A.B.C.D",
4309 "IP Information\n"
4310 "OSPF interface commands\n"
4311 "Enable authentication on this interface\n"
4312 "Use null authentication\n"
4313 "Use message-digest authentication\n"
4314 "Address of interface")
4315{
4316 struct interface *ifp;
4317 struct in_addr addr;
4318 int ret;
4319 struct ospf_if_params *params;
4320
4321 ifp = vty->index;
4322 params = IF_DEF_PARAMS (ifp);
4323
4324 if (argc == 2)
4325 {
4326 ret = inet_aton(argv[1], &addr);
4327 if (!ret)
4328 {
4329 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4330 VTY_NEWLINE);
4331 return CMD_WARNING;
4332 }
4333
4334 params = ospf_get_if_params (ifp, addr);
4335 ospf_if_update_params (ifp, addr);
4336 }
4337
4338 /* Handle null authentication */
4339 if ( argv[0][0] == 'n' )
4340 {
4341 SET_IF_PARAM (params, auth_type);
4342 params->auth_type = OSPF_AUTH_NULL;
4343 return CMD_SUCCESS;
4344 }
4345
4346 /* Handle message-digest authentication */
4347 if ( argv[0][0] == 'm' )
4348 {
4349 SET_IF_PARAM (params, auth_type);
4350 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4351 return CMD_SUCCESS;
4352 }
4353
4354 vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4355 return CMD_WARNING;
4356}
4357
4358ALIAS (ip_ospf_authentication_args,
4359 ip_ospf_authentication_args_cmd,
4360 "ip ospf authentication (null|message-digest)",
4361 "IP Information\n"
4362 "OSPF interface commands\n"
4363 "Enable authentication on this interface\n"
4364 "Use null authentication\n"
4365 "Use message-digest authentication\n")
4366
4367DEFUN (ip_ospf_authentication,
4368 ip_ospf_authentication_addr_cmd,
4369 "ip ospf authentication A.B.C.D",
4370 "IP Information\n"
4371 "OSPF interface commands\n"
4372 "Enable authentication on this interface\n"
4373 "Address of interface")
4374{
4375 struct interface *ifp;
4376 struct in_addr addr;
4377 int ret;
4378 struct ospf_if_params *params;
4379
4380 ifp = vty->index;
4381 params = IF_DEF_PARAMS (ifp);
4382
4383 if (argc == 1)
4384 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004385 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004386 if (!ret)
4387 {
4388 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4389 VTY_NEWLINE);
4390 return CMD_WARNING;
4391 }
4392
4393 params = ospf_get_if_params (ifp, addr);
4394 ospf_if_update_params (ifp, addr);
4395 }
4396
4397 SET_IF_PARAM (params, auth_type);
4398 params->auth_type = OSPF_AUTH_SIMPLE;
4399
4400 return CMD_SUCCESS;
4401}
4402
4403ALIAS (ip_ospf_authentication,
4404 ip_ospf_authentication_cmd,
4405 "ip ospf authentication",
4406 "IP Information\n"
4407 "OSPF interface commands\n"
4408 "Enable authentication on this interface\n")
4409
4410DEFUN (no_ip_ospf_authentication,
4411 no_ip_ospf_authentication_addr_cmd,
4412 "no ip ospf authentication A.B.C.D",
4413 NO_STR
4414 "IP Information\n"
4415 "OSPF interface commands\n"
4416 "Enable authentication on this interface\n"
4417 "Address of interface")
4418{
4419 struct interface *ifp;
4420 struct in_addr addr;
4421 int ret;
4422 struct ospf_if_params *params;
4423
4424 ifp = vty->index;
4425 params = IF_DEF_PARAMS (ifp);
4426
4427 if (argc == 1)
4428 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004429 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004430 if (!ret)
4431 {
4432 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4433 VTY_NEWLINE);
4434 return CMD_WARNING;
4435 }
4436
4437 params = ospf_lookup_if_params (ifp, addr);
4438 if (params == NULL)
4439 return CMD_SUCCESS;
4440 }
4441
4442 params->auth_type = OSPF_AUTH_NOTSET;
4443 UNSET_IF_PARAM (params, auth_type);
4444
4445 if (params != IF_DEF_PARAMS (ifp))
4446 {
4447 ospf_free_if_params (ifp, addr);
4448 ospf_if_update_params (ifp, addr);
4449 }
4450
4451 return CMD_SUCCESS;
4452}
4453
4454ALIAS (no_ip_ospf_authentication,
4455 no_ip_ospf_authentication_cmd,
4456 "no ip ospf authentication",
4457 NO_STR
4458 "IP Information\n"
4459 "OSPF interface commands\n"
4460 "Enable authentication on this interface\n")
4461
4462DEFUN (ip_ospf_authentication_key,
4463 ip_ospf_authentication_key_addr_cmd,
4464 "ip ospf authentication-key AUTH_KEY A.B.C.D",
4465 "IP Information\n"
4466 "OSPF interface commands\n"
4467 "Authentication password (key)\n"
4468 "The OSPF password (key)\n"
4469 "Address of interface")
4470{
4471 struct interface *ifp;
4472 struct in_addr addr;
4473 int ret;
4474 struct ospf_if_params *params;
4475
4476 ifp = vty->index;
4477 params = IF_DEF_PARAMS (ifp);
4478
4479 if (argc == 2)
4480 {
4481 ret = inet_aton(argv[1], &addr);
4482 if (!ret)
4483 {
4484 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4485 VTY_NEWLINE);
4486 return CMD_WARNING;
4487 }
4488
4489 params = ospf_get_if_params (ifp, addr);
4490 ospf_if_update_params (ifp, addr);
4491 }
4492
4493
4494 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
hassoc9e52be2004-09-26 16:09:34 +00004495 strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
paul718e3742002-12-13 20:15:29 +00004496 SET_IF_PARAM (params, auth_simple);
4497
4498 return CMD_SUCCESS;
4499}
4500
4501ALIAS (ip_ospf_authentication_key,
4502 ip_ospf_authentication_key_cmd,
4503 "ip ospf authentication-key AUTH_KEY",
4504 "IP Information\n"
4505 "OSPF interface commands\n"
4506 "Authentication password (key)\n"
4507 "The OSPF password (key)")
4508
4509ALIAS (ip_ospf_authentication_key,
4510 ospf_authentication_key_cmd,
4511 "ospf authentication-key AUTH_KEY",
4512 "OSPF interface commands\n"
4513 "Authentication password (key)\n"
4514 "The OSPF password (key)")
4515
4516DEFUN (no_ip_ospf_authentication_key,
4517 no_ip_ospf_authentication_key_addr_cmd,
4518 "no ip ospf authentication-key A.B.C.D",
4519 NO_STR
4520 "IP Information\n"
4521 "OSPF interface commands\n"
4522 "Authentication password (key)\n"
4523 "Address of interface")
4524{
4525 struct interface *ifp;
4526 struct in_addr addr;
4527 int ret;
4528 struct ospf_if_params *params;
4529
4530 ifp = vty->index;
4531 params = IF_DEF_PARAMS (ifp);
4532
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004533 if (argc == 1)
paul718e3742002-12-13 20:15:29 +00004534 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004535 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004536 if (!ret)
4537 {
4538 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4539 VTY_NEWLINE);
4540 return CMD_WARNING;
4541 }
4542
4543 params = ospf_lookup_if_params (ifp, addr);
4544 if (params == NULL)
4545 return CMD_SUCCESS;
4546 }
4547
4548 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4549 UNSET_IF_PARAM (params, auth_simple);
4550
4551 if (params != IF_DEF_PARAMS (ifp))
4552 {
4553 ospf_free_if_params (ifp, addr);
4554 ospf_if_update_params (ifp, addr);
4555 }
4556
4557 return CMD_SUCCESS;
4558}
4559
4560ALIAS (no_ip_ospf_authentication_key,
4561 no_ip_ospf_authentication_key_cmd,
4562 "no ip ospf authentication-key",
4563 NO_STR
4564 "IP Information\n"
4565 "OSPF interface commands\n"
4566 "Authentication password (key)\n")
4567
4568ALIAS (no_ip_ospf_authentication_key,
4569 no_ospf_authentication_key_cmd,
4570 "no ospf authentication-key",
4571 NO_STR
4572 "OSPF interface commands\n"
4573 "Authentication password (key)\n")
4574
4575DEFUN (ip_ospf_message_digest_key,
4576 ip_ospf_message_digest_key_addr_cmd,
4577 "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4578 "IP Information\n"
4579 "OSPF interface commands\n"
4580 "Message digest authentication password (key)\n"
4581 "Key ID\n"
4582 "Use MD5 algorithm\n"
4583 "The OSPF password (key)"
4584 "Address of interface")
4585{
4586 struct interface *ifp;
4587 struct crypt_key *ck;
4588 u_char key_id;
4589 struct in_addr addr;
4590 int ret;
4591 struct ospf_if_params *params;
4592
4593 ifp = vty->index;
4594 params = IF_DEF_PARAMS (ifp);
4595
4596 if (argc == 3)
4597 {
4598 ret = inet_aton(argv[2], &addr);
4599 if (!ret)
4600 {
4601 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4602 VTY_NEWLINE);
4603 return CMD_WARNING;
4604 }
4605
4606 params = ospf_get_if_params (ifp, addr);
4607 ospf_if_update_params (ifp, addr);
4608 }
4609
4610 key_id = strtol (argv[0], NULL, 10);
4611 if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4612 {
4613 vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4614 return CMD_WARNING;
4615 }
4616
4617 ck = ospf_crypt_key_new ();
4618 ck->key_id = (u_char) key_id;
4619 memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +00004620 strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +00004621
4622 ospf_crypt_key_add (params->auth_crypt, ck);
4623 SET_IF_PARAM (params, auth_crypt);
4624
4625 return CMD_SUCCESS;
4626}
4627
4628ALIAS (ip_ospf_message_digest_key,
4629 ip_ospf_message_digest_key_cmd,
4630 "ip ospf message-digest-key <1-255> md5 KEY",
4631 "IP Information\n"
4632 "OSPF interface commands\n"
4633 "Message digest authentication password (key)\n"
4634 "Key ID\n"
4635 "Use MD5 algorithm\n"
4636 "The OSPF password (key)")
4637
4638ALIAS (ip_ospf_message_digest_key,
4639 ospf_message_digest_key_cmd,
4640 "ospf message-digest-key <1-255> md5 KEY",
4641 "OSPF interface commands\n"
4642 "Message digest authentication password (key)\n"
4643 "Key ID\n"
4644 "Use MD5 algorithm\n"
4645 "The OSPF password (key)")
4646
4647DEFUN (no_ip_ospf_message_digest_key,
4648 no_ip_ospf_message_digest_key_addr_cmd,
4649 "no ip ospf message-digest-key <1-255> A.B.C.D",
4650 NO_STR
4651 "IP Information\n"
4652 "OSPF interface commands\n"
4653 "Message digest authentication password (key)\n"
4654 "Key ID\n"
4655 "Address of interface")
4656{
4657 struct interface *ifp;
4658 struct crypt_key *ck;
4659 int key_id;
4660 struct in_addr addr;
4661 int ret;
4662 struct ospf_if_params *params;
4663
4664 ifp = vty->index;
4665 params = IF_DEF_PARAMS (ifp);
4666
4667 if (argc == 2)
4668 {
4669 ret = inet_aton(argv[1], &addr);
4670 if (!ret)
4671 {
4672 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4673 VTY_NEWLINE);
4674 return CMD_WARNING;
4675 }
4676
4677 params = ospf_lookup_if_params (ifp, addr);
4678 if (params == NULL)
4679 return CMD_SUCCESS;
4680 }
4681
4682 key_id = strtol (argv[0], NULL, 10);
4683 ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4684 if (ck == NULL)
4685 {
4686 vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4687 return CMD_WARNING;
4688 }
4689
4690 ospf_crypt_key_delete (params->auth_crypt, key_id);
4691
4692 if (params != IF_DEF_PARAMS (ifp))
4693 {
4694 ospf_free_if_params (ifp, addr);
4695 ospf_if_update_params (ifp, addr);
4696 }
4697
4698 return CMD_SUCCESS;
4699}
4700
4701ALIAS (no_ip_ospf_message_digest_key,
4702 no_ip_ospf_message_digest_key_cmd,
4703 "no ip ospf message-digest-key <1-255>",
4704 NO_STR
4705 "IP Information\n"
4706 "OSPF interface commands\n"
4707 "Message digest authentication password (key)\n"
4708 "Key ID\n")
4709
4710ALIAS (no_ip_ospf_message_digest_key,
4711 no_ospf_message_digest_key_cmd,
4712 "no ospf message-digest-key <1-255>",
4713 NO_STR
4714 "OSPF interface commands\n"
4715 "Message digest authentication password (key)\n"
4716 "Key ID\n")
4717
4718DEFUN (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004719 ip_ospf_cost_u32_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004720 "ip ospf cost <1-65535> A.B.C.D",
4721 "IP Information\n"
4722 "OSPF interface commands\n"
4723 "Interface cost\n"
4724 "Cost\n"
4725 "Address of interface")
4726{
4727 struct interface *ifp = vty->index;
4728 u_int32_t cost;
4729 struct in_addr addr;
4730 int ret;
4731 struct ospf_if_params *params;
4732
4733 params = IF_DEF_PARAMS (ifp);
4734
4735 cost = strtol (argv[0], NULL, 10);
4736
4737 /* cost range is <1-65535>. */
4738 if (cost < 1 || cost > 65535)
4739 {
4740 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4741 return CMD_WARNING;
4742 }
4743
4744 if (argc == 2)
4745 {
4746 ret = inet_aton(argv[1], &addr);
4747 if (!ret)
4748 {
4749 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4750 VTY_NEWLINE);
4751 return CMD_WARNING;
4752 }
4753
4754 params = ospf_get_if_params (ifp, addr);
4755 ospf_if_update_params (ifp, addr);
4756 }
4757
4758 SET_IF_PARAM (params, output_cost_cmd);
4759 params->output_cost_cmd = cost;
4760
4761 ospf_if_recalculate_output_cost (ifp);
4762
4763 return CMD_SUCCESS;
4764}
4765
4766ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004767 ip_ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004768 "ip ospf cost <1-65535>",
4769 "IP Information\n"
4770 "OSPF interface commands\n"
4771 "Interface cost\n"
4772 "Cost")
4773
4774ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004775 ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004776 "ospf cost <1-65535>",
4777 "OSPF interface commands\n"
4778 "Interface cost\n"
4779 "Cost")
4780
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004781ALIAS (ip_ospf_cost,
4782 ospf_cost_u32_inet4_cmd,
4783 "ospf cost <1-65535> A.B.C.D",
4784 "OSPF interface commands\n"
4785 "Interface cost\n"
4786 "Cost\n"
4787 "Address of interface")
4788
paul718e3742002-12-13 20:15:29 +00004789DEFUN (no_ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004790 no_ip_ospf_cost_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004791 "no ip ospf cost A.B.C.D",
4792 NO_STR
4793 "IP Information\n"
4794 "OSPF interface commands\n"
4795 "Interface cost\n"
4796 "Address of interface")
4797{
4798 struct interface *ifp = vty->index;
4799 struct in_addr addr;
4800 int ret;
4801 struct ospf_if_params *params;
4802
4803 ifp = vty->index;
4804 params = IF_DEF_PARAMS (ifp);
4805
4806 if (argc == 1)
4807 {
4808 ret = inet_aton(argv[0], &addr);
4809 if (!ret)
4810 {
4811 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4812 VTY_NEWLINE);
4813 return CMD_WARNING;
4814 }
4815
4816 params = ospf_lookup_if_params (ifp, addr);
4817 if (params == NULL)
4818 return CMD_SUCCESS;
4819 }
4820
4821 UNSET_IF_PARAM (params, output_cost_cmd);
4822
4823 if (params != IF_DEF_PARAMS (ifp))
4824 {
4825 ospf_free_if_params (ifp, addr);
4826 ospf_if_update_params (ifp, addr);
4827 }
4828
4829 ospf_if_recalculate_output_cost (ifp);
4830
4831 return CMD_SUCCESS;
4832}
4833
4834ALIAS (no_ip_ospf_cost,
4835 no_ip_ospf_cost_cmd,
4836 "no ip ospf cost",
4837 NO_STR
4838 "IP Information\n"
4839 "OSPF interface commands\n"
4840 "Interface cost\n")
4841
4842ALIAS (no_ip_ospf_cost,
4843 no_ospf_cost_cmd,
4844 "no ospf cost",
4845 NO_STR
4846 "OSPF interface commands\n"
4847 "Interface cost\n")
4848
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004849ALIAS (no_ip_ospf_cost,
4850 no_ospf_cost_inet4_cmd,
4851 "no ospf cost A.B.C.D",
4852 NO_STR
4853 "OSPF interface commands\n"
4854 "Interface cost\n"
4855 "Address of interface")
4856
Denis Ovsienko827341b2009-09-28 19:34:59 +04004857DEFUN (no_ip_ospf_cost2,
4858 no_ip_ospf_cost_u32_cmd,
4859 "no ip ospf cost <1-65535>",
4860 NO_STR
4861 "IP Information\n"
4862 "OSPF interface commands\n"
4863 "Interface cost\n"
4864 "Cost")
4865{
4866 struct interface *ifp = vty->index;
4867 struct in_addr addr;
4868 u_int32_t cost;
4869 int ret;
4870 struct ospf_if_params *params;
4871
4872 ifp = vty->index;
4873 params = IF_DEF_PARAMS (ifp);
4874
4875 /* According to the semantics we are mimicking "no ip ospf cost N" is
4876 * always treated as "no ip ospf cost" regardless of the actual value
4877 * of N already configured for the interface. Thus the first argument
4878 * is always checked to be a number, but is ignored after that.
4879 */
4880 cost = strtol (argv[0], NULL, 10);
4881 if (cost < 1 || cost > 65535)
4882 {
4883 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4884 return CMD_WARNING;
4885 }
4886
4887 if (argc == 2)
4888 {
4889 ret = inet_aton(argv[1], &addr);
4890 if (!ret)
4891 {
4892 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4893 VTY_NEWLINE);
4894 return CMD_WARNING;
4895 }
4896
4897 params = ospf_lookup_if_params (ifp, addr);
4898 if (params == NULL)
4899 return CMD_SUCCESS;
4900 }
4901
4902 UNSET_IF_PARAM (params, output_cost_cmd);
4903
4904 if (params != IF_DEF_PARAMS (ifp))
4905 {
4906 ospf_free_if_params (ifp, addr);
4907 ospf_if_update_params (ifp, addr);
4908 }
4909
4910 ospf_if_recalculate_output_cost (ifp);
4911
4912 return CMD_SUCCESS;
4913}
4914
4915ALIAS (no_ip_ospf_cost2,
4916 no_ospf_cost_u32_cmd,
4917 "no ospf cost <1-65535>",
4918 NO_STR
4919 "OSPF interface commands\n"
4920 "Interface cost\n"
4921 "Cost")
4922
4923ALIAS (no_ip_ospf_cost2,
4924 no_ip_ospf_cost_u32_inet4_cmd,
4925 "no ip ospf cost <1-65535> A.B.C.D",
4926 NO_STR
4927 "IP Information\n"
4928 "OSPF interface commands\n"
4929 "Interface cost\n"
4930 "Cost\n"
4931 "Address of interface")
4932
4933ALIAS (no_ip_ospf_cost2,
4934 no_ospf_cost_u32_inet4_cmd,
4935 "no ospf cost <1-65535> A.B.C.D",
4936 NO_STR
4937 "OSPF interface commands\n"
4938 "Interface cost\n"
4939 "Cost\n"
4940 "Address of interface")
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004941
paul4dadc292005-05-06 21:37:42 +00004942static void
paul718e3742002-12-13 20:15:29 +00004943ospf_nbr_timer_update (struct ospf_interface *oi)
4944{
4945 struct route_node *rn;
4946 struct ospf_neighbor *nbr;
4947
4948 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4949 if ((nbr = rn->info))
4950 {
4951 nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4952 nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4953 nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4954 nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4955 }
4956}
4957
paulf9ad9372005-10-21 00:45:17 +00004958static int
4959ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4960 const char *nbr_str,
4961 const char *fast_hello_str)
paul718e3742002-12-13 20:15:29 +00004962{
4963 struct interface *ifp = vty->index;
4964 u_int32_t seconds;
paulf9ad9372005-10-21 00:45:17 +00004965 u_char hellomult;
paul718e3742002-12-13 20:15:29 +00004966 struct in_addr addr;
4967 int ret;
4968 struct ospf_if_params *params;
4969 struct ospf_interface *oi;
4970 struct route_node *rn;
4971
4972 params = IF_DEF_PARAMS (ifp);
paulf9ad9372005-10-21 00:45:17 +00004973
4974 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004975 {
paulf9ad9372005-10-21 00:45:17 +00004976 ret = inet_aton(nbr_str, &addr);
paul718e3742002-12-13 20:15:29 +00004977 if (!ret)
4978 {
4979 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4980 VTY_NEWLINE);
4981 return CMD_WARNING;
4982 }
4983
4984 params = ospf_get_if_params (ifp, addr);
4985 ospf_if_update_params (ifp, addr);
4986 }
4987
paulf9ad9372005-10-21 00:45:17 +00004988 if (interval_str)
4989 {
4990 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
4991 1, 65535);
4992
4993 /* reset fast_hello too, just to be sure */
4994 UNSET_IF_PARAM (params, fast_hello);
4995 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
4996 }
4997 else if (fast_hello_str)
4998 {
4999 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
5000 1, 10);
5001 /* 1s dead-interval with sub-second hellos desired */
5002 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
5003 SET_IF_PARAM (params, fast_hello);
5004 params->fast_hello = hellomult;
5005 }
5006 else
5007 {
5008 vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
5009 VTY_NEWLINE);
5010 return CMD_WARNING;
5011 }
5012
paul718e3742002-12-13 20:15:29 +00005013 SET_IF_PARAM (params, v_wait);
5014 params->v_wait = seconds;
5015
5016 /* Update timer values in neighbor structure. */
paulf9ad9372005-10-21 00:45:17 +00005017 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00005018 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005019 struct ospf *ospf;
5020 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005021 {
5022 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5023 if (oi)
5024 ospf_nbr_timer_update (oi);
5025 }
paul718e3742002-12-13 20:15:29 +00005026 }
5027 else
5028 {
5029 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5030 if ((oi = rn->info))
5031 ospf_nbr_timer_update (oi);
5032 }
5033
5034 return CMD_SUCCESS;
5035}
5036
paulf9ad9372005-10-21 00:45:17 +00005037
5038DEFUN (ip_ospf_dead_interval,
5039 ip_ospf_dead_interval_addr_cmd,
5040 "ip ospf dead-interval <1-65535> A.B.C.D",
5041 "IP Information\n"
5042 "OSPF interface commands\n"
5043 "Interval after which a neighbor is declared dead\n"
5044 "Seconds\n"
5045 "Address of interface\n")
5046{
5047 if (argc == 2)
5048 return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
5049 else
5050 return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
5051}
5052
paul718e3742002-12-13 20:15:29 +00005053ALIAS (ip_ospf_dead_interval,
5054 ip_ospf_dead_interval_cmd,
5055 "ip ospf dead-interval <1-65535>",
5056 "IP Information\n"
5057 "OSPF interface commands\n"
5058 "Interval after which a neighbor is declared dead\n"
5059 "Seconds\n")
5060
5061ALIAS (ip_ospf_dead_interval,
5062 ospf_dead_interval_cmd,
5063 "ospf dead-interval <1-65535>",
5064 "OSPF interface commands\n"
5065 "Interval after which a neighbor is declared dead\n"
5066 "Seconds\n")
5067
paulf9ad9372005-10-21 00:45:17 +00005068DEFUN (ip_ospf_dead_interval_minimal,
5069 ip_ospf_dead_interval_minimal_addr_cmd,
5070 "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5071 "IP Information\n"
5072 "OSPF interface commands\n"
5073 "Interval after which a neighbor is declared dead\n"
5074 "Minimal 1s dead-interval with fast sub-second hellos\n"
5075 "Hello multiplier factor\n"
5076 "Number of Hellos to send each second\n"
5077 "Address of interface\n")
5078{
5079 if (argc == 2)
5080 return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5081 else
5082 return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5083}
5084
5085ALIAS (ip_ospf_dead_interval_minimal,
5086 ip_ospf_dead_interval_minimal_cmd,
5087 "ip ospf dead-interval minimal hello-multiplier <1-10>",
5088 "IP Information\n"
5089 "OSPF interface commands\n"
5090 "Interval after which a neighbor is declared dead\n"
5091 "Minimal 1s dead-interval with fast sub-second hellos\n"
5092 "Hello multiplier factor\n"
5093 "Number of Hellos to send each second\n")
5094
paul718e3742002-12-13 20:15:29 +00005095DEFUN (no_ip_ospf_dead_interval,
5096 no_ip_ospf_dead_interval_addr_cmd,
5097 "no ip ospf dead-interval A.B.C.D",
5098 NO_STR
5099 "IP Information\n"
5100 "OSPF interface commands\n"
5101 "Interval after which a neighbor is declared dead\n"
5102 "Address of interface")
5103{
5104 struct interface *ifp = vty->index;
5105 struct in_addr addr;
5106 int ret;
5107 struct ospf_if_params *params;
5108 struct ospf_interface *oi;
5109 struct route_node *rn;
paul020709f2003-04-04 02:44:16 +00005110
paul718e3742002-12-13 20:15:29 +00005111 ifp = vty->index;
5112 params = IF_DEF_PARAMS (ifp);
5113
5114 if (argc == 1)
5115 {
5116 ret = inet_aton(argv[0], &addr);
5117 if (!ret)
5118 {
5119 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5120 VTY_NEWLINE);
5121 return CMD_WARNING;
5122 }
5123
5124 params = ospf_lookup_if_params (ifp, addr);
5125 if (params == NULL)
5126 return CMD_SUCCESS;
5127 }
5128
5129 UNSET_IF_PARAM (params, v_wait);
5130 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
paulf9ad9372005-10-21 00:45:17 +00005131
5132 UNSET_IF_PARAM (params, fast_hello);
5133 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5134
paul718e3742002-12-13 20:15:29 +00005135 if (params != IF_DEF_PARAMS (ifp))
5136 {
5137 ospf_free_if_params (ifp, addr);
5138 ospf_if_update_params (ifp, addr);
5139 }
5140
5141 /* Update timer values in neighbor structure. */
5142 if (argc == 1)
5143 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005144 struct ospf *ospf;
5145
5146 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005147 {
5148 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5149 if (oi)
5150 ospf_nbr_timer_update (oi);
5151 }
paul718e3742002-12-13 20:15:29 +00005152 }
5153 else
5154 {
5155 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5156 if ((oi = rn->info))
5157 ospf_nbr_timer_update (oi);
5158 }
5159
5160 return CMD_SUCCESS;
5161}
5162
5163ALIAS (no_ip_ospf_dead_interval,
5164 no_ip_ospf_dead_interval_cmd,
5165 "no ip ospf dead-interval",
5166 NO_STR
5167 "IP Information\n"
5168 "OSPF interface commands\n"
5169 "Interval after which a neighbor is declared dead\n")
5170
5171ALIAS (no_ip_ospf_dead_interval,
5172 no_ospf_dead_interval_cmd,
5173 "no ospf dead-interval",
5174 NO_STR
5175 "OSPF interface commands\n"
5176 "Interval after which a neighbor is declared dead\n")
5177
5178DEFUN (ip_ospf_hello_interval,
5179 ip_ospf_hello_interval_addr_cmd,
5180 "ip ospf hello-interval <1-65535> A.B.C.D",
5181 "IP Information\n"
5182 "OSPF interface commands\n"
5183 "Time between HELLO packets\n"
5184 "Seconds\n"
5185 "Address of interface")
5186{
5187 struct interface *ifp = vty->index;
5188 u_int32_t seconds;
5189 struct in_addr addr;
5190 int ret;
5191 struct ospf_if_params *params;
5192
5193 params = IF_DEF_PARAMS (ifp);
5194
5195 seconds = strtol (argv[0], NULL, 10);
5196
5197 /* HelloInterval range is <1-65535>. */
5198 if (seconds < 1 || seconds > 65535)
5199 {
5200 vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5201 return CMD_WARNING;
5202 }
5203
5204 if (argc == 2)
5205 {
5206 ret = inet_aton(argv[1], &addr);
5207 if (!ret)
5208 {
5209 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5210 VTY_NEWLINE);
5211 return CMD_WARNING;
5212 }
5213
5214 params = ospf_get_if_params (ifp, addr);
5215 ospf_if_update_params (ifp, addr);
5216 }
5217
paulf9ad9372005-10-21 00:45:17 +00005218 SET_IF_PARAM (params, v_hello);
paul718e3742002-12-13 20:15:29 +00005219 params->v_hello = seconds;
5220
5221 return CMD_SUCCESS;
5222}
5223
5224ALIAS (ip_ospf_hello_interval,
5225 ip_ospf_hello_interval_cmd,
5226 "ip ospf hello-interval <1-65535>",
5227 "IP Information\n"
5228 "OSPF interface commands\n"
5229 "Time between HELLO packets\n"
5230 "Seconds\n")
5231
5232ALIAS (ip_ospf_hello_interval,
5233 ospf_hello_interval_cmd,
5234 "ospf hello-interval <1-65535>",
5235 "OSPF interface commands\n"
5236 "Time between HELLO packets\n"
5237 "Seconds\n")
5238
5239DEFUN (no_ip_ospf_hello_interval,
5240 no_ip_ospf_hello_interval_addr_cmd,
5241 "no ip ospf hello-interval A.B.C.D",
5242 NO_STR
5243 "IP Information\n"
5244 "OSPF interface commands\n"
5245 "Time between HELLO packets\n"
5246 "Address of interface")
5247{
5248 struct interface *ifp = vty->index;
5249 struct in_addr addr;
5250 int ret;
5251 struct ospf_if_params *params;
5252
5253 ifp = vty->index;
5254 params = IF_DEF_PARAMS (ifp);
5255
5256 if (argc == 1)
5257 {
5258 ret = inet_aton(argv[0], &addr);
5259 if (!ret)
5260 {
5261 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5262 VTY_NEWLINE);
5263 return CMD_WARNING;
5264 }
5265
5266 params = ospf_lookup_if_params (ifp, addr);
5267 if (params == NULL)
5268 return CMD_SUCCESS;
5269 }
5270
5271 UNSET_IF_PARAM (params, v_hello);
paulf9ad9372005-10-21 00:45:17 +00005272 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00005273
5274 if (params != IF_DEF_PARAMS (ifp))
5275 {
5276 ospf_free_if_params (ifp, addr);
5277 ospf_if_update_params (ifp, addr);
5278 }
5279
5280 return CMD_SUCCESS;
5281}
5282
5283ALIAS (no_ip_ospf_hello_interval,
5284 no_ip_ospf_hello_interval_cmd,
5285 "no ip ospf hello-interval",
5286 NO_STR
5287 "IP Information\n"
5288 "OSPF interface commands\n"
5289 "Time between HELLO packets\n")
5290
5291ALIAS (no_ip_ospf_hello_interval,
5292 no_ospf_hello_interval_cmd,
5293 "no ospf hello-interval",
5294 NO_STR
5295 "OSPF interface commands\n"
5296 "Time between HELLO packets\n")
5297
5298DEFUN (ip_ospf_network,
5299 ip_ospf_network_cmd,
5300 "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5301 "IP Information\n"
5302 "OSPF interface commands\n"
5303 "Network type\n"
5304 "Specify OSPF broadcast multi-access network\n"
5305 "Specify OSPF NBMA network\n"
5306 "Specify OSPF point-to-multipoint network\n"
5307 "Specify OSPF point-to-point network\n")
5308{
5309 struct interface *ifp = vty->index;
5310 int old_type = IF_DEF_PARAMS (ifp)->type;
5311 struct route_node *rn;
5312
5313 if (strncmp (argv[0], "b", 1) == 0)
5314 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5315 else if (strncmp (argv[0], "n", 1) == 0)
5316 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5317 else if (strncmp (argv[0], "point-to-m", 10) == 0)
5318 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5319 else if (strncmp (argv[0], "point-to-p", 10) == 0)
5320 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5321
5322 if (IF_DEF_PARAMS (ifp)->type == old_type)
5323 return CMD_SUCCESS;
5324
5325 SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5326
5327 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5328 {
5329 struct ospf_interface *oi = rn->info;
5330
5331 if (!oi)
5332 continue;
5333
5334 oi->type = IF_DEF_PARAMS (ifp)->type;
5335
5336 if (oi->state > ISM_Down)
5337 {
5338 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5339 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5340 }
5341 }
5342
5343 return CMD_SUCCESS;
5344}
5345
5346ALIAS (ip_ospf_network,
5347 ospf_network_cmd,
5348 "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5349 "OSPF interface commands\n"
5350 "Network type\n"
5351 "Specify OSPF broadcast multi-access network\n"
5352 "Specify OSPF NBMA network\n"
5353 "Specify OSPF point-to-multipoint network\n"
5354 "Specify OSPF point-to-point network\n")
5355
5356DEFUN (no_ip_ospf_network,
5357 no_ip_ospf_network_cmd,
5358 "no ip ospf network",
5359 NO_STR
5360 "IP Information\n"
5361 "OSPF interface commands\n"
5362 "Network type\n")
5363{
5364 struct interface *ifp = vty->index;
5365 int old_type = IF_DEF_PARAMS (ifp)->type;
5366 struct route_node *rn;
5367
ajsbc18d612004-12-15 15:07:19 +00005368 IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
paul718e3742002-12-13 20:15:29 +00005369
5370 if (IF_DEF_PARAMS (ifp)->type == old_type)
5371 return CMD_SUCCESS;
5372
5373 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5374 {
5375 struct ospf_interface *oi = rn->info;
5376
5377 if (!oi)
5378 continue;
5379
5380 oi->type = IF_DEF_PARAMS (ifp)->type;
5381
5382 if (oi->state > ISM_Down)
5383 {
5384 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5385 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5386 }
5387 }
5388
5389 return CMD_SUCCESS;
5390}
5391
5392ALIAS (no_ip_ospf_network,
5393 no_ospf_network_cmd,
5394 "no ospf network",
5395 NO_STR
5396 "OSPF interface commands\n"
5397 "Network type\n")
5398
5399DEFUN (ip_ospf_priority,
5400 ip_ospf_priority_addr_cmd,
5401 "ip ospf priority <0-255> A.B.C.D",
5402 "IP Information\n"
5403 "OSPF interface commands\n"
5404 "Router priority\n"
5405 "Priority\n"
5406 "Address of interface")
5407{
5408 struct interface *ifp = vty->index;
Andrew Certain0798cee2012-12-04 13:43:42 -08005409 long priority;
paul718e3742002-12-13 20:15:29 +00005410 struct route_node *rn;
5411 struct in_addr addr;
5412 int ret;
5413 struct ospf_if_params *params;
5414
5415 params = IF_DEF_PARAMS (ifp);
5416
5417 priority = strtol (argv[0], NULL, 10);
5418
5419 /* Router Priority range is <0-255>. */
5420 if (priority < 0 || priority > 255)
5421 {
5422 vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5423 return CMD_WARNING;
5424 }
5425
5426 if (argc == 2)
5427 {
5428 ret = inet_aton(argv[1], &addr);
5429 if (!ret)
5430 {
5431 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5432 VTY_NEWLINE);
5433 return CMD_WARNING;
5434 }
5435
5436 params = ospf_get_if_params (ifp, addr);
5437 ospf_if_update_params (ifp, addr);
5438 }
5439
5440 SET_IF_PARAM (params, priority);
5441 params->priority = priority;
5442
5443 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5444 {
5445 struct ospf_interface *oi = rn->info;
5446
5447 if (!oi)
5448 continue;
5449
5450
5451 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5452 {
5453 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5454 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5455 }
5456 }
5457
5458 return CMD_SUCCESS;
5459}
5460
5461ALIAS (ip_ospf_priority,
5462 ip_ospf_priority_cmd,
5463 "ip ospf priority <0-255>",
5464 "IP Information\n"
5465 "OSPF interface commands\n"
5466 "Router priority\n"
5467 "Priority\n")
5468
5469ALIAS (ip_ospf_priority,
5470 ospf_priority_cmd,
5471 "ospf priority <0-255>",
5472 "OSPF interface commands\n"
5473 "Router priority\n"
5474 "Priority\n")
5475
5476DEFUN (no_ip_ospf_priority,
5477 no_ip_ospf_priority_addr_cmd,
5478 "no ip ospf priority A.B.C.D",
5479 NO_STR
5480 "IP Information\n"
5481 "OSPF interface commands\n"
5482 "Router priority\n"
5483 "Address of interface")
5484{
5485 struct interface *ifp = vty->index;
5486 struct route_node *rn;
5487 struct in_addr addr;
5488 int ret;
5489 struct ospf_if_params *params;
5490
5491 ifp = vty->index;
5492 params = IF_DEF_PARAMS (ifp);
5493
5494 if (argc == 1)
5495 {
5496 ret = inet_aton(argv[0], &addr);
5497 if (!ret)
5498 {
5499 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5500 VTY_NEWLINE);
5501 return CMD_WARNING;
5502 }
5503
5504 params = ospf_lookup_if_params (ifp, addr);
5505 if (params == NULL)
5506 return CMD_SUCCESS;
5507 }
5508
5509 UNSET_IF_PARAM (params, priority);
5510 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5511
5512 if (params != IF_DEF_PARAMS (ifp))
5513 {
5514 ospf_free_if_params (ifp, addr);
5515 ospf_if_update_params (ifp, addr);
5516 }
5517
5518 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5519 {
5520 struct ospf_interface *oi = rn->info;
5521
5522 if (!oi)
5523 continue;
5524
5525
5526 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5527 {
5528 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5529 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5530 }
5531 }
5532
5533 return CMD_SUCCESS;
5534}
5535
5536ALIAS (no_ip_ospf_priority,
5537 no_ip_ospf_priority_cmd,
5538 "no ip ospf priority",
5539 NO_STR
5540 "IP Information\n"
5541 "OSPF interface commands\n"
5542 "Router priority\n")
5543
5544ALIAS (no_ip_ospf_priority,
5545 no_ospf_priority_cmd,
5546 "no ospf priority",
5547 NO_STR
5548 "OSPF interface commands\n"
5549 "Router priority\n")
5550
5551DEFUN (ip_ospf_retransmit_interval,
5552 ip_ospf_retransmit_interval_addr_cmd,
5553 "ip ospf retransmit-interval <3-65535> A.B.C.D",
5554 "IP Information\n"
5555 "OSPF interface commands\n"
5556 "Time between retransmitting lost link state advertisements\n"
5557 "Seconds\n"
5558 "Address of interface")
5559{
5560 struct interface *ifp = vty->index;
5561 u_int32_t seconds;
5562 struct in_addr addr;
5563 int ret;
5564 struct ospf_if_params *params;
5565
5566 params = IF_DEF_PARAMS (ifp);
5567 seconds = strtol (argv[0], NULL, 10);
5568
5569 /* Retransmit Interval range is <3-65535>. */
5570 if (seconds < 3 || seconds > 65535)
5571 {
5572 vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5573 return CMD_WARNING;
5574 }
5575
5576
5577 if (argc == 2)
5578 {
5579 ret = inet_aton(argv[1], &addr);
5580 if (!ret)
5581 {
5582 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5583 VTY_NEWLINE);
5584 return CMD_WARNING;
5585 }
5586
5587 params = ospf_get_if_params (ifp, addr);
5588 ospf_if_update_params (ifp, addr);
5589 }
5590
5591 SET_IF_PARAM (params, retransmit_interval);
5592 params->retransmit_interval = seconds;
5593
5594 return CMD_SUCCESS;
5595}
5596
5597ALIAS (ip_ospf_retransmit_interval,
5598 ip_ospf_retransmit_interval_cmd,
5599 "ip ospf retransmit-interval <3-65535>",
5600 "IP Information\n"
5601 "OSPF interface commands\n"
5602 "Time between retransmitting lost link state advertisements\n"
5603 "Seconds\n")
5604
5605ALIAS (ip_ospf_retransmit_interval,
5606 ospf_retransmit_interval_cmd,
5607 "ospf retransmit-interval <3-65535>",
5608 "OSPF interface commands\n"
5609 "Time between retransmitting lost link state advertisements\n"
5610 "Seconds\n")
5611
5612DEFUN (no_ip_ospf_retransmit_interval,
5613 no_ip_ospf_retransmit_interval_addr_cmd,
5614 "no ip ospf retransmit-interval A.B.C.D",
5615 NO_STR
5616 "IP Information\n"
5617 "OSPF interface commands\n"
5618 "Time between retransmitting lost link state advertisements\n"
5619 "Address of interface")
5620{
5621 struct interface *ifp = vty->index;
5622 struct in_addr addr;
5623 int ret;
5624 struct ospf_if_params *params;
5625
5626 ifp = vty->index;
5627 params = IF_DEF_PARAMS (ifp);
5628
5629 if (argc == 1)
5630 {
5631 ret = inet_aton(argv[0], &addr);
5632 if (!ret)
5633 {
5634 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5635 VTY_NEWLINE);
5636 return CMD_WARNING;
5637 }
5638
5639 params = ospf_lookup_if_params (ifp, addr);
5640 if (params == NULL)
5641 return CMD_SUCCESS;
5642 }
5643
5644 UNSET_IF_PARAM (params, retransmit_interval);
5645 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5646
5647 if (params != IF_DEF_PARAMS (ifp))
5648 {
5649 ospf_free_if_params (ifp, addr);
5650 ospf_if_update_params (ifp, addr);
5651 }
5652
5653 return CMD_SUCCESS;
5654}
5655
5656ALIAS (no_ip_ospf_retransmit_interval,
5657 no_ip_ospf_retransmit_interval_cmd,
5658 "no ip ospf retransmit-interval",
5659 NO_STR
5660 "IP Information\n"
5661 "OSPF interface commands\n"
5662 "Time between retransmitting lost link state advertisements\n")
5663
5664ALIAS (no_ip_ospf_retransmit_interval,
5665 no_ospf_retransmit_interval_cmd,
5666 "no ospf retransmit-interval",
5667 NO_STR
5668 "OSPF interface commands\n"
5669 "Time between retransmitting lost link state advertisements\n")
5670
5671DEFUN (ip_ospf_transmit_delay,
5672 ip_ospf_transmit_delay_addr_cmd,
5673 "ip ospf transmit-delay <1-65535> A.B.C.D",
5674 "IP Information\n"
5675 "OSPF interface commands\n"
5676 "Link state transmit delay\n"
5677 "Seconds\n"
5678 "Address of interface")
5679{
5680 struct interface *ifp = vty->index;
5681 u_int32_t seconds;
5682 struct in_addr addr;
5683 int ret;
5684 struct ospf_if_params *params;
5685
5686 params = IF_DEF_PARAMS (ifp);
5687 seconds = strtol (argv[0], NULL, 10);
5688
5689 /* Transmit Delay range is <1-65535>. */
5690 if (seconds < 1 || seconds > 65535)
5691 {
5692 vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5693 return CMD_WARNING;
5694 }
5695
5696 if (argc == 2)
5697 {
5698 ret = inet_aton(argv[1], &addr);
5699 if (!ret)
5700 {
5701 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5702 VTY_NEWLINE);
5703 return CMD_WARNING;
5704 }
5705
5706 params = ospf_get_if_params (ifp, addr);
5707 ospf_if_update_params (ifp, addr);
5708 }
5709
5710 SET_IF_PARAM (params, transmit_delay);
5711 params->transmit_delay = seconds;
5712
5713 return CMD_SUCCESS;
5714}
5715
5716ALIAS (ip_ospf_transmit_delay,
5717 ip_ospf_transmit_delay_cmd,
5718 "ip ospf transmit-delay <1-65535>",
5719 "IP Information\n"
5720 "OSPF interface commands\n"
5721 "Link state transmit delay\n"
5722 "Seconds\n")
5723
5724ALIAS (ip_ospf_transmit_delay,
5725 ospf_transmit_delay_cmd,
5726 "ospf transmit-delay <1-65535>",
5727 "OSPF interface commands\n"
5728 "Link state transmit delay\n"
5729 "Seconds\n")
5730
5731DEFUN (no_ip_ospf_transmit_delay,
5732 no_ip_ospf_transmit_delay_addr_cmd,
5733 "no ip ospf transmit-delay A.B.C.D",
5734 NO_STR
5735 "IP Information\n"
5736 "OSPF interface commands\n"
5737 "Link state transmit delay\n"
5738 "Address of interface")
5739{
5740 struct interface *ifp = vty->index;
5741 struct in_addr addr;
5742 int ret;
5743 struct ospf_if_params *params;
5744
5745 ifp = vty->index;
5746 params = IF_DEF_PARAMS (ifp);
5747
5748 if (argc == 1)
5749 {
5750 ret = inet_aton(argv[0], &addr);
5751 if (!ret)
5752 {
5753 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5754 VTY_NEWLINE);
5755 return CMD_WARNING;
5756 }
5757
5758 params = ospf_lookup_if_params (ifp, addr);
5759 if (params == NULL)
5760 return CMD_SUCCESS;
5761 }
5762
5763 UNSET_IF_PARAM (params, transmit_delay);
5764 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5765
5766 if (params != IF_DEF_PARAMS (ifp))
5767 {
5768 ospf_free_if_params (ifp, addr);
5769 ospf_if_update_params (ifp, addr);
5770 }
5771
5772 return CMD_SUCCESS;
5773}
5774
5775ALIAS (no_ip_ospf_transmit_delay,
5776 no_ip_ospf_transmit_delay_cmd,
5777 "no ip ospf transmit-delay",
5778 NO_STR
5779 "IP Information\n"
5780 "OSPF interface commands\n"
5781 "Link state transmit delay\n")
5782
5783ALIAS (no_ip_ospf_transmit_delay,
5784 no_ospf_transmit_delay_cmd,
5785 "no ospf transmit-delay",
5786 NO_STR
5787 "OSPF interface commands\n"
5788 "Link state transmit delay\n")
5789
5790
5791DEFUN (ospf_redistribute_source_metric_type,
5792 ospf_redistribute_source_metric_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005793 "redistribute " QUAGGA_REDIST_STR_OSPFD
5794 " metric <0-16777214> metric-type (1|2) route-map WORD",
5795 REDIST_STR
5796 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005797 "Metric for redistributed routes\n"
5798 "OSPF default metric\n"
5799 "OSPF exterior metric type for redistributed routes\n"
5800 "Set OSPF External Type 1 metrics\n"
5801 "Set OSPF External Type 2 metrics\n"
5802 "Route map reference\n"
5803 "Pointer to route-map entries\n")
5804{
paul020709f2003-04-04 02:44:16 +00005805 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005806 int source;
5807 int type = -1;
5808 int metric = -1;
5809
5810 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02005811 source = proto_redistnum(AFI_IP, argv[0]);
5812 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005813 return CMD_WARNING;
5814
5815 /* Get metric value. */
5816 if (argc >= 2)
5817 if (!str2metric (argv[1], &metric))
5818 return CMD_WARNING;
5819
5820 /* Get metric type. */
5821 if (argc >= 3)
5822 if (!str2metric_type (argv[2], &type))
5823 return CMD_WARNING;
5824
5825 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005826 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005827 else
paul020709f2003-04-04 02:44:16 +00005828 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005829
paul020709f2003-04-04 02:44:16 +00005830 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005831}
5832
5833ALIAS (ospf_redistribute_source_metric_type,
5834 ospf_redistribute_source_metric_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005835 "redistribute " QUAGGA_REDIST_STR_OSPFD
5836 " metric <0-16777214> metric-type (1|2)",
5837 REDIST_STR
5838 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005839 "Metric for redistributed routes\n"
5840 "OSPF default metric\n"
5841 "OSPF exterior metric type for redistributed routes\n"
5842 "Set OSPF External Type 1 metrics\n"
5843 "Set OSPF External Type 2 metrics\n")
5844
5845ALIAS (ospf_redistribute_source_metric_type,
5846 ospf_redistribute_source_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005847 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
5848 REDIST_STR
5849 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005850 "Metric for redistributed routes\n"
5851 "OSPF default metric\n")
5852
5853DEFUN (ospf_redistribute_source_type_metric,
5854 ospf_redistribute_source_type_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005855 "redistribute " QUAGGA_REDIST_STR_OSPFD
5856 " metric-type (1|2) metric <0-16777214> route-map WORD",
5857 REDIST_STR
5858 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005859 "OSPF exterior metric type for redistributed routes\n"
5860 "Set OSPF External Type 1 metrics\n"
5861 "Set OSPF External Type 2 metrics\n"
5862 "Metric for redistributed routes\n"
5863 "OSPF default metric\n"
5864 "Route map reference\n"
5865 "Pointer to route-map entries\n")
5866{
paul020709f2003-04-04 02:44:16 +00005867 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005868 int source;
5869 int type = -1;
5870 int metric = -1;
5871
5872 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02005873 source = proto_redistnum(AFI_IP, argv[0]);
5874 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005875 return CMD_WARNING;
5876
5877 /* Get metric value. */
5878 if (argc >= 2)
5879 if (!str2metric_type (argv[1], &type))
5880 return CMD_WARNING;
5881
5882 /* Get metric type. */
5883 if (argc >= 3)
5884 if (!str2metric (argv[2], &metric))
5885 return CMD_WARNING;
5886
5887 if (argc == 4)
paul020709f2003-04-04 02:44:16 +00005888 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005889 else
paul020709f2003-04-04 02:44:16 +00005890 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005891
paul020709f2003-04-04 02:44:16 +00005892 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005893}
5894
5895ALIAS (ospf_redistribute_source_type_metric,
5896 ospf_redistribute_source_type_metric_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005897 "redistribute " QUAGGA_REDIST_STR_OSPFD
5898 " metric-type (1|2) metric <0-16777214>",
5899 REDIST_STR
5900 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005901 "OSPF exterior metric type for redistributed routes\n"
5902 "Set OSPF External Type 1 metrics\n"
5903 "Set OSPF External Type 2 metrics\n"
5904 "Metric for redistributed routes\n"
5905 "OSPF default metric\n")
5906
5907ALIAS (ospf_redistribute_source_type_metric,
5908 ospf_redistribute_source_type_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005909 "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
5910 REDIST_STR
5911 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005912 "OSPF exterior metric type for redistributed routes\n"
5913 "Set OSPF External Type 1 metrics\n"
5914 "Set OSPF External Type 2 metrics\n")
5915
5916ALIAS (ospf_redistribute_source_type_metric,
5917 ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005918 "redistribute " QUAGGA_REDIST_STR_OSPFD,
5919 REDIST_STR
5920 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005921
5922DEFUN (ospf_redistribute_source_metric_routemap,
5923 ospf_redistribute_source_metric_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005924 "redistribute " QUAGGA_REDIST_STR_OSPFD
5925 " metric <0-16777214> route-map WORD",
5926 REDIST_STR
5927 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005928 "Metric for redistributed routes\n"
5929 "OSPF default metric\n"
5930 "Route map reference\n"
5931 "Pointer to route-map entries\n")
5932{
paul020709f2003-04-04 02:44:16 +00005933 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005934 int source;
5935 int metric = -1;
5936
5937 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02005938 source = proto_redistnum(AFI_IP, argv[0]);
5939 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005940 return CMD_WARNING;
5941
5942 /* Get metric value. */
5943 if (argc >= 2)
5944 if (!str2metric (argv[1], &metric))
5945 return CMD_WARNING;
5946
5947 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005948 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005949 else
paul020709f2003-04-04 02:44:16 +00005950 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005951
paul020709f2003-04-04 02:44:16 +00005952 return ospf_redistribute_set (ospf, source, -1, metric);
paul718e3742002-12-13 20:15:29 +00005953}
5954
5955DEFUN (ospf_redistribute_source_type_routemap,
5956 ospf_redistribute_source_type_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005957 "redistribute " QUAGGA_REDIST_STR_OSPFD
5958 " metric-type (1|2) route-map WORD",
5959 REDIST_STR
5960 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005961 "OSPF exterior metric type for redistributed routes\n"
5962 "Set OSPF External Type 1 metrics\n"
5963 "Set OSPF External Type 2 metrics\n"
5964 "Route map reference\n"
5965 "Pointer to route-map entries\n")
5966{
paul020709f2003-04-04 02:44:16 +00005967 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005968 int source;
5969 int type = -1;
5970
5971 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02005972 source = proto_redistnum(AFI_IP, argv[0]);
5973 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005974 return CMD_WARNING;
5975
5976 /* Get metric value. */
5977 if (argc >= 2)
5978 if (!str2metric_type (argv[1], &type))
5979 return CMD_WARNING;
5980
5981 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00005982 ospf_routemap_set (ospf, source, argv[2]);
paul718e3742002-12-13 20:15:29 +00005983 else
paul020709f2003-04-04 02:44:16 +00005984 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005985
paul020709f2003-04-04 02:44:16 +00005986 return ospf_redistribute_set (ospf, source, type, -1);
paul718e3742002-12-13 20:15:29 +00005987}
5988
5989DEFUN (ospf_redistribute_source_routemap,
5990 ospf_redistribute_source_routemap_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005991 "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
5992 REDIST_STR
5993 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005994 "Route map reference\n"
5995 "Pointer to route-map entries\n")
5996{
paul020709f2003-04-04 02:44:16 +00005997 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005998 int source;
5999
6000 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02006001 source = proto_redistnum(AFI_IP, argv[0]);
6002 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00006003 return CMD_WARNING;
6004
6005 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006006 ospf_routemap_set (ospf, source, argv[1]);
paul718e3742002-12-13 20:15:29 +00006007 else
paul020709f2003-04-04 02:44:16 +00006008 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00006009
paul020709f2003-04-04 02:44:16 +00006010 return ospf_redistribute_set (ospf, source, -1, -1);
paul718e3742002-12-13 20:15:29 +00006011}
6012
6013DEFUN (no_ospf_redistribute_source,
6014 no_ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006015 "no redistribute " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006016 NO_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006017 REDIST_STR
6018 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006019{
paul020709f2003-04-04 02:44:16 +00006020 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006021 int source;
6022
David Lampartere0ca5fd2009-09-16 01:52:42 +02006023 source = proto_redistnum(AFI_IP, argv[0]);
6024 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00006025 return CMD_WARNING;
6026
paul020709f2003-04-04 02:44:16 +00006027 ospf_routemap_unset (ospf, source);
6028 return ospf_redistribute_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00006029}
6030
6031DEFUN (ospf_distribute_list_out,
6032 ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006033 "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006034 "Filter networks in routing updates\n"
6035 "Access-list name\n"
6036 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006037 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006038{
paul68980082003-03-25 05:07:42 +00006039 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006040 int source;
6041
6042 /* Get distribute source. */
Christian Frankebda3c322012-12-04 11:31:16 -08006043 source = proto_redistnum(AFI_IP, argv[1]);
David Lampartere0ca5fd2009-09-16 01:52:42 +02006044 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00006045 return CMD_WARNING;
6046
paul68980082003-03-25 05:07:42 +00006047 return ospf_distribute_list_out_set (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00006048}
6049
6050DEFUN (no_ospf_distribute_list_out,
6051 no_ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00006052 "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00006053 NO_STR
6054 "Filter networks in routing updates\n"
6055 "Access-list name\n"
6056 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00006057 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00006058{
paul68980082003-03-25 05:07:42 +00006059 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006060 int source;
6061
Christian Frankebda3c322012-12-04 11:31:16 -08006062 source = proto_redistnum(AFI_IP, argv[1]);
David Lampartere0ca5fd2009-09-16 01:52:42 +02006063 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00006064 return CMD_WARNING;
6065
paul68980082003-03-25 05:07:42 +00006066 return ospf_distribute_list_out_unset (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00006067}
6068
6069/* Default information originate. */
6070DEFUN (ospf_default_information_originate_metric_type_routemap,
6071 ospf_default_information_originate_metric_type_routemap_cmd,
6072 "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
6073 "Control distribution of default information\n"
6074 "Distribute a default route\n"
6075 "OSPF default metric\n"
6076 "OSPF metric\n"
6077 "OSPF metric type for default routes\n"
6078 "Set OSPF External Type 1 metrics\n"
6079 "Set OSPF External Type 2 metrics\n"
6080 "Route map reference\n"
6081 "Pointer to route-map entries\n")
6082{
paul020709f2003-04-04 02:44:16 +00006083 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006084 int type = -1;
6085 int metric = -1;
6086
6087 /* Get metric value. */
6088 if (argc >= 1)
6089 if (!str2metric (argv[0], &metric))
6090 return CMD_WARNING;
6091
6092 /* Get metric type. */
6093 if (argc >= 2)
6094 if (!str2metric_type (argv[1], &type))
6095 return CMD_WARNING;
6096
6097 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006098 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006099 else
paul020709f2003-04-04 02:44:16 +00006100 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006101
paul020709f2003-04-04 02:44:16 +00006102 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6103 type, metric);
paul718e3742002-12-13 20:15:29 +00006104}
6105
6106ALIAS (ospf_default_information_originate_metric_type_routemap,
6107 ospf_default_information_originate_metric_type_cmd,
6108 "default-information originate metric <0-16777214> metric-type (1|2)",
6109 "Control distribution of default information\n"
6110 "Distribute a default route\n"
6111 "OSPF default metric\n"
6112 "OSPF metric\n"
6113 "OSPF metric type for default routes\n"
6114 "Set OSPF External Type 1 metrics\n"
6115 "Set OSPF External Type 2 metrics\n")
6116
6117ALIAS (ospf_default_information_originate_metric_type_routemap,
6118 ospf_default_information_originate_metric_cmd,
6119 "default-information originate metric <0-16777214>",
6120 "Control distribution of default information\n"
6121 "Distribute a default route\n"
6122 "OSPF default metric\n"
6123 "OSPF metric\n")
6124
6125ALIAS (ospf_default_information_originate_metric_type_routemap,
6126 ospf_default_information_originate_cmd,
6127 "default-information originate",
6128 "Control distribution of default information\n"
6129 "Distribute a default route\n")
6130
6131/* Default information originate. */
6132DEFUN (ospf_default_information_originate_metric_routemap,
6133 ospf_default_information_originate_metric_routemap_cmd,
6134 "default-information originate metric <0-16777214> route-map WORD",
6135 "Control distribution of default information\n"
6136 "Distribute a default route\n"
6137 "OSPF default metric\n"
6138 "OSPF metric\n"
6139 "Route map reference\n"
6140 "Pointer to route-map entries\n")
6141{
paul020709f2003-04-04 02:44:16 +00006142 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006143 int metric = -1;
6144
6145 /* Get metric value. */
6146 if (argc >= 1)
6147 if (!str2metric (argv[0], &metric))
6148 return CMD_WARNING;
6149
6150 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006151 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006152 else
paul020709f2003-04-04 02:44:16 +00006153 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006154
paul020709f2003-04-04 02:44:16 +00006155 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6156 -1, metric);
paul718e3742002-12-13 20:15:29 +00006157}
6158
6159/* Default information originate. */
6160DEFUN (ospf_default_information_originate_routemap,
6161 ospf_default_information_originate_routemap_cmd,
6162 "default-information originate route-map WORD",
6163 "Control distribution of default information\n"
6164 "Distribute a default route\n"
6165 "Route map reference\n"
6166 "Pointer to route-map entries\n")
6167{
paul020709f2003-04-04 02:44:16 +00006168 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006169
paul020709f2003-04-04 02:44:16 +00006170 if (argc == 1)
6171 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6172 else
6173 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6174
6175 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
paul718e3742002-12-13 20:15:29 +00006176}
6177
6178DEFUN (ospf_default_information_originate_type_metric_routemap,
6179 ospf_default_information_originate_type_metric_routemap_cmd,
6180 "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
6181 "Control distribution of default information\n"
6182 "Distribute a default route\n"
6183 "OSPF metric type for default routes\n"
6184 "Set OSPF External Type 1 metrics\n"
6185 "Set OSPF External Type 2 metrics\n"
6186 "OSPF default metric\n"
6187 "OSPF metric\n"
6188 "Route map reference\n"
6189 "Pointer to route-map entries\n")
6190{
paul020709f2003-04-04 02:44:16 +00006191 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006192 int type = -1;
6193 int metric = -1;
6194
6195 /* Get metric type. */
6196 if (argc >= 1)
6197 if (!str2metric_type (argv[0], &type))
6198 return CMD_WARNING;
6199
6200 /* Get metric value. */
6201 if (argc >= 2)
6202 if (!str2metric (argv[1], &metric))
6203 return CMD_WARNING;
6204
6205 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006206 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006207 else
paul020709f2003-04-04 02:44:16 +00006208 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006209
paul020709f2003-04-04 02:44:16 +00006210 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6211 type, metric);
paul718e3742002-12-13 20:15:29 +00006212}
6213
6214ALIAS (ospf_default_information_originate_type_metric_routemap,
6215 ospf_default_information_originate_type_metric_cmd,
6216 "default-information originate metric-type (1|2) metric <0-16777214>",
6217 "Control distribution of default information\n"
6218 "Distribute a default route\n"
6219 "OSPF metric type for default routes\n"
6220 "Set OSPF External Type 1 metrics\n"
6221 "Set OSPF External Type 2 metrics\n"
6222 "OSPF default metric\n"
6223 "OSPF metric\n")
6224
6225ALIAS (ospf_default_information_originate_type_metric_routemap,
6226 ospf_default_information_originate_type_cmd,
6227 "default-information originate metric-type (1|2)",
6228 "Control distribution of default information\n"
6229 "Distribute a default route\n"
6230 "OSPF metric type for default routes\n"
6231 "Set OSPF External Type 1 metrics\n"
6232 "Set OSPF External Type 2 metrics\n")
6233
6234DEFUN (ospf_default_information_originate_type_routemap,
6235 ospf_default_information_originate_type_routemap_cmd,
6236 "default-information originate metric-type (1|2) route-map WORD",
6237 "Control distribution of default information\n"
6238 "Distribute a default route\n"
6239 "OSPF metric type for default routes\n"
6240 "Set OSPF External Type 1 metrics\n"
6241 "Set OSPF External Type 2 metrics\n"
6242 "Route map reference\n"
6243 "Pointer to route-map entries\n")
6244{
paul020709f2003-04-04 02:44:16 +00006245 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006246 int type = -1;
6247
6248 /* Get metric type. */
6249 if (argc >= 1)
6250 if (!str2metric_type (argv[0], &type))
6251 return CMD_WARNING;
6252
6253 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006254 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006255 else
paul020709f2003-04-04 02:44:16 +00006256 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006257
paul020709f2003-04-04 02:44:16 +00006258 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6259 type, -1);
paul718e3742002-12-13 20:15:29 +00006260}
6261
6262DEFUN (ospf_default_information_originate_always_metric_type_routemap,
6263 ospf_default_information_originate_always_metric_type_routemap_cmd,
6264 "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
6265 "Control distribution of default information\n"
6266 "Distribute a default route\n"
6267 "Always advertise default route\n"
6268 "OSPF default metric\n"
6269 "OSPF metric\n"
6270 "OSPF metric type for default routes\n"
6271 "Set OSPF External Type 1 metrics\n"
6272 "Set OSPF External Type 2 metrics\n"
6273 "Route map reference\n"
6274 "Pointer to route-map entries\n")
6275{
paul020709f2003-04-04 02:44:16 +00006276 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006277 int type = -1;
6278 int metric = -1;
6279
6280 /* Get metric value. */
6281 if (argc >= 1)
6282 if (!str2metric (argv[0], &metric))
6283 return CMD_WARNING;
6284
6285 /* Get metric type. */
6286 if (argc >= 2)
6287 if (!str2metric_type (argv[1], &type))
6288 return CMD_WARNING;
6289
6290 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006291 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006292 else
paul020709f2003-04-04 02:44:16 +00006293 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006294
paul020709f2003-04-04 02:44:16 +00006295 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006296 type, metric);
6297}
6298
6299ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6300 ospf_default_information_originate_always_metric_type_cmd,
6301 "default-information originate always metric <0-16777214> metric-type (1|2)",
6302 "Control distribution of default information\n"
6303 "Distribute a default route\n"
6304 "Always advertise default route\n"
6305 "OSPF default metric\n"
6306 "OSPF metric\n"
6307 "OSPF metric type for default routes\n"
6308 "Set OSPF External Type 1 metrics\n"
6309 "Set OSPF External Type 2 metrics\n")
6310
6311ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6312 ospf_default_information_originate_always_metric_cmd,
6313 "default-information originate always metric <0-16777214>",
6314 "Control distribution of default information\n"
6315 "Distribute a default route\n"
6316 "Always advertise default route\n"
6317 "OSPF default metric\n"
6318 "OSPF metric\n"
6319 "OSPF metric type for default routes\n")
6320
6321ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6322 ospf_default_information_originate_always_cmd,
6323 "default-information originate always",
6324 "Control distribution of default information\n"
6325 "Distribute a default route\n"
6326 "Always advertise default route\n")
6327
6328DEFUN (ospf_default_information_originate_always_metric_routemap,
6329 ospf_default_information_originate_always_metric_routemap_cmd,
6330 "default-information originate always metric <0-16777214> route-map WORD",
6331 "Control distribution of default information\n"
6332 "Distribute a default route\n"
6333 "Always advertise default route\n"
6334 "OSPF default metric\n"
6335 "OSPF metric\n"
6336 "Route map reference\n"
6337 "Pointer to route-map entries\n")
6338{
paul020709f2003-04-04 02:44:16 +00006339 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006340 int metric = -1;
6341
6342 /* Get metric value. */
6343 if (argc >= 1)
6344 if (!str2metric (argv[0], &metric))
6345 return CMD_WARNING;
6346
6347 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006348 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006349 else
paul020709f2003-04-04 02:44:16 +00006350 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006351
paul020709f2003-04-04 02:44:16 +00006352 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6353 -1, metric);
paul718e3742002-12-13 20:15:29 +00006354}
6355
6356DEFUN (ospf_default_information_originate_always_routemap,
6357 ospf_default_information_originate_always_routemap_cmd,
6358 "default-information originate always route-map WORD",
6359 "Control distribution of default information\n"
6360 "Distribute a default route\n"
6361 "Always advertise default route\n"
6362 "Route map reference\n"
6363 "Pointer to route-map entries\n")
6364{
paul020709f2003-04-04 02:44:16 +00006365 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006366
paul020709f2003-04-04 02:44:16 +00006367 if (argc == 1)
6368 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6369 else
6370 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6371
6372 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
paul718e3742002-12-13 20:15:29 +00006373}
6374
6375DEFUN (ospf_default_information_originate_always_type_metric_routemap,
6376 ospf_default_information_originate_always_type_metric_routemap_cmd,
6377 "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
6378 "Control distribution of default information\n"
6379 "Distribute a default route\n"
6380 "Always advertise default route\n"
6381 "OSPF metric type for default routes\n"
6382 "Set OSPF External Type 1 metrics\n"
6383 "Set OSPF External Type 2 metrics\n"
6384 "OSPF default metric\n"
6385 "OSPF metric\n"
6386 "Route map reference\n"
6387 "Pointer to route-map entries\n")
6388{
paul020709f2003-04-04 02:44:16 +00006389 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006390 int type = -1;
6391 int metric = -1;
6392
6393 /* Get metric type. */
6394 if (argc >= 1)
6395 if (!str2metric_type (argv[0], &type))
6396 return CMD_WARNING;
6397
6398 /* Get metric value. */
6399 if (argc >= 2)
6400 if (!str2metric (argv[1], &metric))
6401 return CMD_WARNING;
6402
6403 if (argc == 3)
paul020709f2003-04-04 02:44:16 +00006404 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
paul718e3742002-12-13 20:15:29 +00006405 else
paul020709f2003-04-04 02:44:16 +00006406 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006407
paul020709f2003-04-04 02:44:16 +00006408 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006409 type, metric);
6410}
6411
6412ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6413 ospf_default_information_originate_always_type_metric_cmd,
6414 "default-information originate always metric-type (1|2) metric <0-16777214>",
6415 "Control distribution of default information\n"
6416 "Distribute a default route\n"
6417 "Always advertise default route\n"
6418 "OSPF metric type for default routes\n"
6419 "Set OSPF External Type 1 metrics\n"
6420 "Set OSPF External Type 2 metrics\n"
6421 "OSPF default metric\n"
6422 "OSPF metric\n")
6423
6424ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6425 ospf_default_information_originate_always_type_cmd,
6426 "default-information originate always metric-type (1|2)",
6427 "Control distribution of default information\n"
6428 "Distribute a default route\n"
6429 "Always advertise default route\n"
6430 "OSPF metric type for default routes\n"
6431 "Set OSPF External Type 1 metrics\n"
6432 "Set OSPF External Type 2 metrics\n")
6433
6434DEFUN (ospf_default_information_originate_always_type_routemap,
6435 ospf_default_information_originate_always_type_routemap_cmd,
6436 "default-information originate always metric-type (1|2) route-map WORD",
6437 "Control distribution of default information\n"
6438 "Distribute a default route\n"
6439 "Always advertise default route\n"
6440 "OSPF metric type for default routes\n"
6441 "Set OSPF External Type 1 metrics\n"
6442 "Set OSPF External Type 2 metrics\n"
6443 "Route map reference\n"
6444 "Pointer to route-map entries\n")
6445{
paul020709f2003-04-04 02:44:16 +00006446 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006447 int type = -1;
6448
6449 /* Get metric type. */
6450 if (argc >= 1)
6451 if (!str2metric_type (argv[0], &type))
6452 return CMD_WARNING;
6453
6454 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00006455 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
paul718e3742002-12-13 20:15:29 +00006456 else
paul020709f2003-04-04 02:44:16 +00006457 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00006458
paul020709f2003-04-04 02:44:16 +00006459 return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
paul718e3742002-12-13 20:15:29 +00006460 type, -1);
6461}
6462
6463DEFUN (no_ospf_default_information_originate,
6464 no_ospf_default_information_originate_cmd,
6465 "no default-information originate",
6466 NO_STR
6467 "Control distribution of default information\n"
6468 "Distribute a default route\n")
6469{
paul68980082003-03-25 05:07:42 +00006470 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006471 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00006472
6473 p.family = AF_INET;
6474 p.prefix.s_addr = 0;
6475 p.prefixlen = 0;
6476
ajs5339cfd2005-09-19 13:28:05 +00006477 ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
paul718e3742002-12-13 20:15:29 +00006478
6479 if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6480 ospf_external_info_delete (DEFAULT_ROUTE, p);
6481 route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6482 EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6483 }
6484
paul020709f2003-04-04 02:44:16 +00006485 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6486 return ospf_redistribute_default_unset (ospf);
paul718e3742002-12-13 20:15:29 +00006487}
6488
6489DEFUN (ospf_default_metric,
6490 ospf_default_metric_cmd,
6491 "default-metric <0-16777214>",
6492 "Set metric of redistributed routes\n"
6493 "Default metric\n")
6494{
paul68980082003-03-25 05:07:42 +00006495 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00006496 int metric = -1;
6497
6498 if (!str2metric (argv[0], &metric))
6499 return CMD_WARNING;
6500
paul68980082003-03-25 05:07:42 +00006501 ospf->default_metric = metric;
paul718e3742002-12-13 20:15:29 +00006502
6503 return CMD_SUCCESS;
6504}
6505
6506DEFUN (no_ospf_default_metric,
6507 no_ospf_default_metric_cmd,
6508 "no default-metric",
6509 NO_STR
6510 "Set metric of redistributed routes\n")
6511{
paul68980082003-03-25 05:07:42 +00006512 struct ospf *ospf = vty->index;
6513
6514 ospf->default_metric = -1;
6515
paul718e3742002-12-13 20:15:29 +00006516 return CMD_SUCCESS;
6517}
6518
6519ALIAS (no_ospf_default_metric,
6520 no_ospf_default_metric_val_cmd,
6521 "no default-metric <0-16777214>",
6522 NO_STR
6523 "Set metric of redistributed routes\n"
6524 "Default metric\n")
6525
6526DEFUN (ospf_distance,
6527 ospf_distance_cmd,
6528 "distance <1-255>",
6529 "Define an administrative distance\n"
6530 "OSPF Administrative distance\n")
6531{
paul68980082003-03-25 05:07:42 +00006532 struct ospf *ospf = vty->index;
6533
6534 ospf->distance_all = atoi (argv[0]);
6535
paul718e3742002-12-13 20:15:29 +00006536 return CMD_SUCCESS;
6537}
6538
6539DEFUN (no_ospf_distance,
6540 no_ospf_distance_cmd,
6541 "no distance <1-255>",
6542 NO_STR
6543 "Define an administrative distance\n"
6544 "OSPF Administrative distance\n")
6545{
paul68980082003-03-25 05:07:42 +00006546 struct ospf *ospf = vty->index;
6547
6548 ospf->distance_all = 0;
6549
paul718e3742002-12-13 20:15:29 +00006550 return CMD_SUCCESS;
6551}
6552
6553DEFUN (no_ospf_distance_ospf,
6554 no_ospf_distance_ospf_cmd,
6555 "no distance ospf",
6556 NO_STR
6557 "Define an administrative distance\n"
6558 "OSPF Administrative distance\n"
6559 "OSPF Distance\n")
6560{
paul68980082003-03-25 05:07:42 +00006561 struct ospf *ospf = vty->index;
6562
6563 ospf->distance_intra = 0;
6564 ospf->distance_inter = 0;
6565 ospf->distance_external = 0;
6566
paul718e3742002-12-13 20:15:29 +00006567 return CMD_SUCCESS;
6568}
6569
6570DEFUN (ospf_distance_ospf_intra,
6571 ospf_distance_ospf_intra_cmd,
6572 "distance ospf intra-area <1-255>",
6573 "Define an administrative distance\n"
6574 "OSPF Administrative distance\n"
6575 "Intra-area routes\n"
6576 "Distance for intra-area routes\n")
6577{
paul68980082003-03-25 05:07:42 +00006578 struct ospf *ospf = vty->index;
6579
6580 ospf->distance_intra = atoi (argv[0]);
6581
paul718e3742002-12-13 20:15:29 +00006582 return CMD_SUCCESS;
6583}
6584
6585DEFUN (ospf_distance_ospf_intra_inter,
6586 ospf_distance_ospf_intra_inter_cmd,
6587 "distance ospf intra-area <1-255> inter-area <1-255>",
6588 "Define an administrative distance\n"
6589 "OSPF Administrative distance\n"
6590 "Intra-area routes\n"
6591 "Distance for intra-area routes\n"
6592 "Inter-area routes\n"
6593 "Distance for inter-area routes\n")
6594{
paul68980082003-03-25 05:07:42 +00006595 struct ospf *ospf = vty->index;
6596
6597 ospf->distance_intra = atoi (argv[0]);
6598 ospf->distance_inter = atoi (argv[1]);
6599
paul718e3742002-12-13 20:15:29 +00006600 return CMD_SUCCESS;
6601}
6602
6603DEFUN (ospf_distance_ospf_intra_external,
6604 ospf_distance_ospf_intra_external_cmd,
6605 "distance ospf intra-area <1-255> external <1-255>",
6606 "Define an administrative distance\n"
6607 "OSPF Administrative distance\n"
6608 "Intra-area routes\n"
6609 "Distance for intra-area routes\n"
6610 "External routes\n"
6611 "Distance for external routes\n")
6612{
paul68980082003-03-25 05:07:42 +00006613 struct ospf *ospf = vty->index;
6614
6615 ospf->distance_intra = atoi (argv[0]);
6616 ospf->distance_external = atoi (argv[1]);
6617
paul718e3742002-12-13 20:15:29 +00006618 return CMD_SUCCESS;
6619}
6620
6621DEFUN (ospf_distance_ospf_intra_inter_external,
6622 ospf_distance_ospf_intra_inter_external_cmd,
6623 "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
6624 "Define an administrative distance\n"
6625 "OSPF Administrative distance\n"
6626 "Intra-area routes\n"
6627 "Distance for intra-area routes\n"
6628 "Inter-area routes\n"
6629 "Distance for inter-area routes\n"
6630 "External routes\n"
6631 "Distance for external routes\n")
6632{
paul68980082003-03-25 05:07:42 +00006633 struct ospf *ospf = vty->index;
6634
6635 ospf->distance_intra = atoi (argv[0]);
6636 ospf->distance_inter = atoi (argv[1]);
6637 ospf->distance_external = atoi (argv[2]);
6638
paul718e3742002-12-13 20:15:29 +00006639 return CMD_SUCCESS;
6640}
6641
6642DEFUN (ospf_distance_ospf_intra_external_inter,
6643 ospf_distance_ospf_intra_external_inter_cmd,
6644 "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
6645 "Define an administrative distance\n"
6646 "OSPF Administrative distance\n"
6647 "Intra-area routes\n"
6648 "Distance for intra-area routes\n"
6649 "External routes\n"
6650 "Distance for external routes\n"
6651 "Inter-area routes\n"
6652 "Distance for inter-area routes\n")
6653{
paul68980082003-03-25 05:07:42 +00006654 struct ospf *ospf = vty->index;
6655
6656 ospf->distance_intra = atoi (argv[0]);
6657 ospf->distance_external = atoi (argv[1]);
6658 ospf->distance_inter = atoi (argv[2]);
6659
paul718e3742002-12-13 20:15:29 +00006660 return CMD_SUCCESS;
6661}
6662
6663DEFUN (ospf_distance_ospf_inter,
6664 ospf_distance_ospf_inter_cmd,
6665 "distance ospf inter-area <1-255>",
6666 "Define an administrative distance\n"
6667 "OSPF Administrative distance\n"
6668 "Inter-area routes\n"
6669 "Distance for inter-area routes\n")
6670{
paul68980082003-03-25 05:07:42 +00006671 struct ospf *ospf = vty->index;
6672
6673 ospf->distance_inter = atoi (argv[0]);
6674
paul718e3742002-12-13 20:15:29 +00006675 return CMD_SUCCESS;
6676}
6677
6678DEFUN (ospf_distance_ospf_inter_intra,
6679 ospf_distance_ospf_inter_intra_cmd,
6680 "distance ospf inter-area <1-255> intra-area <1-255>",
6681 "Define an administrative distance\n"
6682 "OSPF Administrative distance\n"
6683 "Inter-area routes\n"
6684 "Distance for inter-area routes\n"
6685 "Intra-area routes\n"
6686 "Distance for intra-area routes\n")
6687{
paul68980082003-03-25 05:07:42 +00006688 struct ospf *ospf = vty->index;
6689
6690 ospf->distance_inter = atoi (argv[0]);
6691 ospf->distance_intra = atoi (argv[1]);
6692
paul718e3742002-12-13 20:15:29 +00006693 return CMD_SUCCESS;
6694}
6695
6696DEFUN (ospf_distance_ospf_inter_external,
6697 ospf_distance_ospf_inter_external_cmd,
6698 "distance ospf inter-area <1-255> external <1-255>",
6699 "Define an administrative distance\n"
6700 "OSPF Administrative distance\n"
6701 "Inter-area routes\n"
6702 "Distance for inter-area routes\n"
6703 "External routes\n"
6704 "Distance for external routes\n")
6705{
paul68980082003-03-25 05:07:42 +00006706 struct ospf *ospf = vty->index;
6707
6708 ospf->distance_inter = atoi (argv[0]);
6709 ospf->distance_external = atoi (argv[1]);
6710
paul718e3742002-12-13 20:15:29 +00006711 return CMD_SUCCESS;
6712}
6713
6714DEFUN (ospf_distance_ospf_inter_intra_external,
6715 ospf_distance_ospf_inter_intra_external_cmd,
6716 "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
6717 "Define an administrative distance\n"
6718 "OSPF Administrative distance\n"
6719 "Inter-area routes\n"
6720 "Distance for inter-area routes\n"
6721 "Intra-area routes\n"
6722 "Distance for intra-area routes\n"
6723 "External routes\n"
6724 "Distance for external routes\n")
6725{
paul68980082003-03-25 05:07:42 +00006726 struct ospf *ospf = vty->index;
6727
6728 ospf->distance_inter = atoi (argv[0]);
6729 ospf->distance_intra = atoi (argv[1]);
6730 ospf->distance_external = atoi (argv[2]);
6731
paul718e3742002-12-13 20:15:29 +00006732 return CMD_SUCCESS;
6733}
6734
6735DEFUN (ospf_distance_ospf_inter_external_intra,
6736 ospf_distance_ospf_inter_external_intra_cmd,
6737 "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
6738 "Define an administrative distance\n"
6739 "OSPF Administrative distance\n"
6740 "Inter-area routes\n"
6741 "Distance for inter-area routes\n"
6742 "External routes\n"
6743 "Distance for external routes\n"
6744 "Intra-area routes\n"
6745 "Distance for intra-area routes\n")
6746{
paul68980082003-03-25 05:07:42 +00006747 struct ospf *ospf = vty->index;
6748
6749 ospf->distance_inter = atoi (argv[0]);
6750 ospf->distance_external = atoi (argv[1]);
6751 ospf->distance_intra = atoi (argv[2]);
6752
paul718e3742002-12-13 20:15:29 +00006753 return CMD_SUCCESS;
6754}
6755
6756DEFUN (ospf_distance_ospf_external,
6757 ospf_distance_ospf_external_cmd,
6758 "distance ospf external <1-255>",
6759 "Define an administrative distance\n"
6760 "OSPF Administrative distance\n"
6761 "External routes\n"
6762 "Distance for external routes\n")
6763{
paul68980082003-03-25 05:07:42 +00006764 struct ospf *ospf = vty->index;
6765
6766 ospf->distance_external = atoi (argv[0]);
6767
paul718e3742002-12-13 20:15:29 +00006768 return CMD_SUCCESS;
6769}
6770
6771DEFUN (ospf_distance_ospf_external_intra,
6772 ospf_distance_ospf_external_intra_cmd,
6773 "distance ospf external <1-255> intra-area <1-255>",
6774 "Define an administrative distance\n"
6775 "OSPF Administrative distance\n"
6776 "External routes\n"
6777 "Distance for external routes\n"
6778 "Intra-area routes\n"
6779 "Distance for intra-area routes\n")
6780{
paul68980082003-03-25 05:07:42 +00006781 struct ospf *ospf = vty->index;
6782
6783 ospf->distance_external = atoi (argv[0]);
6784 ospf->distance_intra = atoi (argv[1]);
6785
paul718e3742002-12-13 20:15:29 +00006786 return CMD_SUCCESS;
6787}
6788
6789DEFUN (ospf_distance_ospf_external_inter,
6790 ospf_distance_ospf_external_inter_cmd,
6791 "distance ospf external <1-255> inter-area <1-255>",
6792 "Define an administrative distance\n"
6793 "OSPF Administrative distance\n"
6794 "External routes\n"
6795 "Distance for external routes\n"
6796 "Inter-area routes\n"
6797 "Distance for inter-area routes\n")
6798{
paul68980082003-03-25 05:07:42 +00006799 struct ospf *ospf = vty->index;
6800
6801 ospf->distance_external = atoi (argv[0]);
6802 ospf->distance_inter = atoi (argv[1]);
6803
paul718e3742002-12-13 20:15:29 +00006804 return CMD_SUCCESS;
6805}
6806
6807DEFUN (ospf_distance_ospf_external_intra_inter,
6808 ospf_distance_ospf_external_intra_inter_cmd,
6809 "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
6810 "Define an administrative distance\n"
6811 "OSPF Administrative distance\n"
6812 "External routes\n"
6813 "Distance for external routes\n"
6814 "Intra-area routes\n"
6815 "Distance for intra-area routes\n"
6816 "Inter-area routes\n"
6817 "Distance for inter-area routes\n")
6818{
paul68980082003-03-25 05:07:42 +00006819 struct ospf *ospf = vty->index;
6820
6821 ospf->distance_external = atoi (argv[0]);
6822 ospf->distance_intra = atoi (argv[1]);
6823 ospf->distance_inter = atoi (argv[2]);
6824
paul718e3742002-12-13 20:15:29 +00006825 return CMD_SUCCESS;
6826}
6827
6828DEFUN (ospf_distance_ospf_external_inter_intra,
6829 ospf_distance_ospf_external_inter_intra_cmd,
6830 "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
6831 "Define an administrative distance\n"
6832 "OSPF Administrative distance\n"
6833 "External routes\n"
6834 "Distance for external routes\n"
6835 "Inter-area routes\n"
6836 "Distance for inter-area routes\n"
6837 "Intra-area routes\n"
6838 "Distance for intra-area routes\n")
6839{
paul68980082003-03-25 05:07:42 +00006840 struct ospf *ospf = vty->index;
6841
6842 ospf->distance_external = atoi (argv[0]);
6843 ospf->distance_inter = atoi (argv[1]);
6844 ospf->distance_intra = atoi (argv[2]);
6845
paul718e3742002-12-13 20:15:29 +00006846 return CMD_SUCCESS;
6847}
6848
6849DEFUN (ospf_distance_source,
6850 ospf_distance_source_cmd,
6851 "distance <1-255> A.B.C.D/M",
6852 "Administrative distance\n"
6853 "Distance value\n"
6854 "IP source prefix\n")
6855{
paul020709f2003-04-04 02:44:16 +00006856 struct ospf *ospf = vty->index;
6857
6858 ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
paul68980082003-03-25 05:07:42 +00006859
paul718e3742002-12-13 20:15:29 +00006860 return CMD_SUCCESS;
6861}
6862
6863DEFUN (no_ospf_distance_source,
6864 no_ospf_distance_source_cmd,
6865 "no distance <1-255> A.B.C.D/M",
6866 NO_STR
6867 "Administrative distance\n"
6868 "Distance value\n"
6869 "IP source prefix\n")
6870{
paul020709f2003-04-04 02:44:16 +00006871 struct ospf *ospf = vty->index;
6872
6873 ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6874
paul718e3742002-12-13 20:15:29 +00006875 return CMD_SUCCESS;
6876}
6877
6878DEFUN (ospf_distance_source_access_list,
6879 ospf_distance_source_access_list_cmd,
6880 "distance <1-255> A.B.C.D/M WORD",
6881 "Administrative distance\n"
6882 "Distance value\n"
6883 "IP source prefix\n"
6884 "Access list name\n")
6885{
paul020709f2003-04-04 02:44:16 +00006886 struct ospf *ospf = vty->index;
6887
6888 ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6889
paul718e3742002-12-13 20:15:29 +00006890 return CMD_SUCCESS;
6891}
6892
6893DEFUN (no_ospf_distance_source_access_list,
6894 no_ospf_distance_source_access_list_cmd,
6895 "no distance <1-255> A.B.C.D/M WORD",
6896 NO_STR
6897 "Administrative distance\n"
6898 "Distance value\n"
6899 "IP source prefix\n"
6900 "Access list name\n")
6901{
paul020709f2003-04-04 02:44:16 +00006902 struct ospf *ospf = vty->index;
6903
6904 ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6905
paul718e3742002-12-13 20:15:29 +00006906 return CMD_SUCCESS;
6907}
6908
vincentba682532005-09-29 13:52:57 +00006909DEFUN (ip_ospf_mtu_ignore,
6910 ip_ospf_mtu_ignore_addr_cmd,
6911 "ip ospf mtu-ignore A.B.C.D",
6912 "IP Information\n"
6913 "OSPF interface commands\n"
6914 "Disable mtu mismatch detection\n"
6915 "Address of interface")
6916{
6917 struct interface *ifp = vty->index;
6918 struct in_addr addr;
6919 int ret;
6920
6921 struct ospf_if_params *params;
6922 params = IF_DEF_PARAMS (ifp);
6923
6924 if (argc == 1)
6925 {
6926 ret = inet_aton(argv[0], &addr);
6927 if (!ret)
6928 {
6929 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6930 VTY_NEWLINE);
6931 return CMD_WARNING;
6932 }
6933 params = ospf_get_if_params (ifp, addr);
6934 ospf_if_update_params (ifp, addr);
6935 }
6936 params->mtu_ignore = 1;
6937 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6938 SET_IF_PARAM (params, mtu_ignore);
6939 else
6940 {
6941 UNSET_IF_PARAM (params, mtu_ignore);
6942 if (params != IF_DEF_PARAMS (ifp))
6943 {
6944 ospf_free_if_params (ifp, addr);
6945 ospf_if_update_params (ifp, addr);
6946 }
6947 }
6948 return CMD_SUCCESS;
6949}
6950
6951ALIAS (ip_ospf_mtu_ignore,
6952 ip_ospf_mtu_ignore_cmd,
6953 "ip ospf mtu-ignore",
6954 "IP Information\n"
6955 "OSPF interface commands\n"
6956 "Disable mtu mismatch detection\n")
6957
6958
6959DEFUN (no_ip_ospf_mtu_ignore,
6960 no_ip_ospf_mtu_ignore_addr_cmd,
6961 "no ip ospf mtu-ignore A.B.C.D",
6962 "IP Information\n"
6963 "OSPF interface commands\n"
6964 "Disable mtu mismatch detection\n"
6965 "Address of interface")
6966{
6967 struct interface *ifp = vty->index;
6968 struct in_addr addr;
6969 int ret;
6970
6971 struct ospf_if_params *params;
6972 params = IF_DEF_PARAMS (ifp);
6973
6974 if (argc == 1)
6975 {
6976 ret = inet_aton(argv[0], &addr);
6977 if (!ret)
6978 {
6979 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6980 VTY_NEWLINE);
6981 return CMD_WARNING;
6982 }
6983 params = ospf_get_if_params (ifp, addr);
6984 ospf_if_update_params (ifp, addr);
6985 }
6986 params->mtu_ignore = 0;
6987 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6988 SET_IF_PARAM (params, mtu_ignore);
6989 else
6990 {
6991 UNSET_IF_PARAM (params, mtu_ignore);
6992 if (params != IF_DEF_PARAMS (ifp))
6993 {
6994 ospf_free_if_params (ifp, addr);
6995 ospf_if_update_params (ifp, addr);
6996 }
6997 }
6998 return CMD_SUCCESS;
6999}
7000
7001ALIAS (no_ip_ospf_mtu_ignore,
7002 no_ip_ospf_mtu_ignore_cmd,
7003 "no ip ospf mtu-ignore",
7004 "IP Information\n"
7005 "OSPF interface commands\n"
7006 "Disable mtu mismatch detection\n")
paul88d6cf32005-10-29 12:50:09 +00007007
7008DEFUN (ospf_max_metric_router_lsa_admin,
7009 ospf_max_metric_router_lsa_admin_cmd,
7010 "max-metric router-lsa administrative",
7011 "OSPF maximum / infinite-distance metric\n"
7012 "Advertise own Router-LSA with infinite distance (stub router)\n"
7013 "Administratively applied, for an indefinite period\n")
7014{
7015 struct listnode *ln;
7016 struct ospf_area *area;
7017 struct ospf *ospf = vty->index;
vincentba682532005-09-29 13:52:57 +00007018
paul88d6cf32005-10-29 12:50:09 +00007019 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7020 {
7021 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7022
7023 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
Paul Jakmac363d382010-01-24 22:42:13 +00007024 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00007025 }
Ayan Banerjee4ba4fc82012-12-03 11:17:24 -08007026
7027 /* Allows for areas configured later to get the property */
7028 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
7029
paul88d6cf32005-10-29 12:50:09 +00007030 return CMD_SUCCESS;
7031}
7032
7033DEFUN (no_ospf_max_metric_router_lsa_admin,
7034 no_ospf_max_metric_router_lsa_admin_cmd,
7035 "no max-metric router-lsa administrative",
7036 NO_STR
7037 "OSPF maximum / infinite-distance metric\n"
7038 "Advertise own Router-LSA with infinite distance (stub router)\n"
7039 "Administratively applied, for an indefinite period\n")
7040{
7041 struct listnode *ln;
7042 struct ospf_area *area;
7043 struct ospf *ospf = vty->index;
7044
7045 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7046 {
7047 UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7048
7049 /* Don't trample on the start-up stub timer */
7050 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
7051 && !area->t_stub_router)
7052 {
7053 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
Paul Jakmac363d382010-01-24 22:42:13 +00007054 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00007055 }
7056 }
Ayan Banerjee4ba4fc82012-12-03 11:17:24 -08007057 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
paul88d6cf32005-10-29 12:50:09 +00007058 return CMD_SUCCESS;
7059}
7060
7061DEFUN (ospf_max_metric_router_lsa_startup,
7062 ospf_max_metric_router_lsa_startup_cmd,
7063 "max-metric router-lsa on-startup <5-86400>",
7064 "OSPF maximum / infinite-distance metric\n"
7065 "Advertise own Router-LSA with infinite distance (stub router)\n"
7066 "Automatically advertise stub Router-LSA on startup of OSPF\n"
7067 "Time (seconds) to advertise self as stub-router\n")
7068{
7069 unsigned int seconds;
7070 struct ospf *ospf = vty->index;
7071
7072 if (argc != 1)
7073 {
7074 vty_out (vty, "%% Must supply stub-router period");
7075 return CMD_WARNING;
7076 }
7077
7078 VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
7079
7080 ospf->stub_router_startup_time = seconds;
7081
7082 return CMD_SUCCESS;
7083}
7084
7085DEFUN (no_ospf_max_metric_router_lsa_startup,
7086 no_ospf_max_metric_router_lsa_startup_cmd,
7087 "no max-metric router-lsa on-startup",
7088 NO_STR
7089 "OSPF maximum / infinite-distance metric\n"
7090 "Advertise own Router-LSA with infinite distance (stub router)\n"
7091 "Automatically advertise stub Router-LSA on startup of OSPF\n")
7092{
7093 struct listnode *ln;
7094 struct ospf_area *area;
7095 struct ospf *ospf = vty->index;
7096
7097 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7098
7099 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7100 {
7101 SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
7102 OSPF_TIMER_OFF (area->t_stub_router);
7103
7104 /* Don't trample on admin stub routed */
7105 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7106 {
7107 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
Paul Jakmac363d382010-01-24 22:42:13 +00007108 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00007109 }
7110 }
7111 return CMD_SUCCESS;
7112}
7113
7114DEFUN (ospf_max_metric_router_lsa_shutdown,
7115 ospf_max_metric_router_lsa_shutdown_cmd,
7116 "max-metric router-lsa on-shutdown <5-86400>",
7117 "OSPF maximum / infinite-distance metric\n"
7118 "Advertise own Router-LSA with infinite distance (stub router)\n"
7119 "Advertise stub-router prior to full shutdown of OSPF\n"
7120 "Time (seconds) to wait till full shutdown\n")
7121{
7122 unsigned int seconds;
7123 struct ospf *ospf = vty->index;
7124
7125 if (argc != 1)
7126 {
7127 vty_out (vty, "%% Must supply stub-router shutdown period");
7128 return CMD_WARNING;
7129 }
7130
7131 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
7132
7133 ospf->stub_router_shutdown_time = seconds;
7134
7135 return CMD_SUCCESS;
7136}
7137
7138DEFUN (no_ospf_max_metric_router_lsa_shutdown,
7139 no_ospf_max_metric_router_lsa_shutdown_cmd,
7140 "no max-metric router-lsa on-shutdown",
7141 NO_STR
7142 "OSPF maximum / infinite-distance metric\n"
7143 "Advertise own Router-LSA with infinite distance (stub router)\n"
7144 "Advertise stub-router prior to full shutdown of OSPF\n")
7145{
7146 struct ospf *ospf = vty->index;
7147
7148 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7149
7150 return CMD_SUCCESS;
7151}
7152
7153static void
7154config_write_stub_router (struct vty *vty, struct ospf *ospf)
7155{
7156 struct listnode *ln;
7157 struct ospf_area *area;
7158
7159 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7160 vty_out (vty, " max-metric router-lsa on-startup %u%s",
7161 ospf->stub_router_startup_time, VTY_NEWLINE);
7162 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7163 vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
7164 ospf->stub_router_shutdown_time, VTY_NEWLINE);
7165 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7166 {
7167 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7168 {
7169 vty_out (vty, " max-metric router-lsa administrative%s",
7170 VTY_NEWLINE);
7171 break;
7172 }
7173 }
7174 return;
7175}
7176
paul4dadc292005-05-06 21:37:42 +00007177static void
paul718e3742002-12-13 20:15:29 +00007178show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
7179{
7180 struct route_node *rn;
7181 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007182 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007183 struct ospf_path *path;
7184
7185 vty_out (vty, "============ OSPF network routing table ============%s",
7186 VTY_NEWLINE);
7187
7188 for (rn = route_top (rt); rn; rn = route_next (rn))
7189 if ((or = rn->info) != NULL)
7190 {
7191 char buf1[19];
7192 snprintf (buf1, 19, "%s/%d",
7193 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7194
7195 switch (or->path_type)
7196 {
7197 case OSPF_PATH_INTER_AREA:
7198 if (or->type == OSPF_DESTINATION_NETWORK)
7199 vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
7200 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7201 else if (or->type == OSPF_DESTINATION_DISCARD)
7202 vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
7203 break;
7204 case OSPF_PATH_INTRA_AREA:
7205 vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
7206 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7207 break;
7208 default:
7209 break;
7210 }
7211
7212 if (or->type == OSPF_DESTINATION_NETWORK)
paul1eb8ef22005-04-07 07:30:20 +00007213 for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
paul96735ee2003-08-10 02:51:22 +00007214 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007215 if (if_lookup_by_index(path->ifindex))
paul96735ee2003-08-10 02:51:22 +00007216 {
7217 if (path->nexthop.s_addr == 0)
7218 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007219 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007220 else
7221 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007222 inet_ntoa (path->nexthop),
7223 ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007224 }
7225 }
paul718e3742002-12-13 20:15:29 +00007226 }
7227 vty_out (vty, "%s", VTY_NEWLINE);
7228}
7229
paul4dadc292005-05-06 21:37:42 +00007230static void
paul718e3742002-12-13 20:15:29 +00007231show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
7232{
7233 struct route_node *rn;
7234 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00007235 struct listnode *pnode;
7236 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007237 struct ospf_path *path;
7238
7239 vty_out (vty, "============ OSPF router routing table =============%s",
7240 VTY_NEWLINE);
7241 for (rn = route_top (rtrs); rn; rn = route_next (rn))
7242 if (rn->info)
7243 {
7244 int flag = 0;
7245
7246 vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
7247
paul1eb8ef22005-04-07 07:30:20 +00007248 for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
7249 {
7250 if (flag++)
7251 vty_out (vty, "%24s", "");
paul718e3742002-12-13 20:15:29 +00007252
paul1eb8ef22005-04-07 07:30:20 +00007253 /* Show path. */
7254 vty_out (vty, "%s [%d] area: %s",
7255 (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
7256 or->cost, inet_ntoa (or->u.std.area_id));
7257 /* Show flags. */
7258 vty_out (vty, "%s%s%s",
7259 (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
7260 (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
7261 VTY_NEWLINE);
7262
7263 for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
7264 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007265 if (if_lookup_by_index(path->ifindex))
hasso54bedb52005-08-17 13:31:47 +00007266 {
7267 if (path->nexthop.s_addr == 0)
7268 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007269 "", ifindex2ifname (path->ifindex),
7270 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00007271 else
7272 vty_out (vty, "%24s via %s, %s%s", "",
7273 inet_ntoa (path->nexthop),
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007274 ifindex2ifname (path->ifindex),
7275 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00007276 }
paul1eb8ef22005-04-07 07:30:20 +00007277 }
7278 }
paul718e3742002-12-13 20:15:29 +00007279 }
7280 vty_out (vty, "%s", VTY_NEWLINE);
7281}
7282
paul4dadc292005-05-06 21:37:42 +00007283static void
paul718e3742002-12-13 20:15:29 +00007284show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
7285{
7286 struct route_node *rn;
7287 struct ospf_route *er;
paul1eb8ef22005-04-07 07:30:20 +00007288 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00007289 struct ospf_path *path;
7290
7291 vty_out (vty, "============ OSPF external routing table ===========%s",
7292 VTY_NEWLINE);
7293 for (rn = route_top (rt); rn; rn = route_next (rn))
7294 if ((er = rn->info) != NULL)
7295 {
7296 char buf1[19];
7297 snprintf (buf1, 19, "%s/%d",
7298 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7299
7300 switch (er->path_type)
7301 {
7302 case OSPF_PATH_TYPE1_EXTERNAL:
7303 vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
7304 er->cost, er->u.ext.tag, VTY_NEWLINE);
7305 break;
7306 case OSPF_PATH_TYPE2_EXTERNAL:
7307 vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
7308 er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
7309 break;
7310 }
7311
paul1eb8ef22005-04-07 07:30:20 +00007312 for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
paul718e3742002-12-13 20:15:29 +00007313 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007314 if (if_lookup_by_index(path->ifindex))
paul718e3742002-12-13 20:15:29 +00007315 {
7316 if (path->nexthop.s_addr == 0)
paul96735ee2003-08-10 02:51:22 +00007317 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007318 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00007319 else
7320 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02007321 inet_ntoa (path->nexthop),
7322 ifindex2ifname (path->ifindex),
paul96735ee2003-08-10 02:51:22 +00007323 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007324 }
7325 }
7326 }
7327 vty_out (vty, "%s", VTY_NEWLINE);
7328}
7329
paul718e3742002-12-13 20:15:29 +00007330DEFUN (show_ip_ospf_border_routers,
7331 show_ip_ospf_border_routers_cmd,
7332 "show ip ospf border-routers",
7333 SHOW_STR
7334 IP_STR
7335 "show all the ABR's and ASBR's\n"
7336 "for this area\n")
7337{
paul020709f2003-04-04 02:44:16 +00007338 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007339
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007340 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007341 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007342 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007343 return CMD_SUCCESS;
7344 }
7345
paul68980082003-03-25 05:07:42 +00007346 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007347 {
7348 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7349 return CMD_SUCCESS;
7350 }
7351
7352 /* Show Network routes.
paul020709f2003-04-04 02:44:16 +00007353 show_ip_ospf_route_network (vty, ospf->new_table); */
paul718e3742002-12-13 20:15:29 +00007354
7355 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007356 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007357
7358 return CMD_SUCCESS;
7359}
paul718e3742002-12-13 20:15:29 +00007360
7361DEFUN (show_ip_ospf_route,
7362 show_ip_ospf_route_cmd,
7363 "show ip ospf route",
7364 SHOW_STR
7365 IP_STR
7366 "OSPF information\n"
7367 "OSPF routing table\n")
7368{
paul020709f2003-04-04 02:44:16 +00007369 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00007370
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007371 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00007372 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00007373 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007374 return CMD_SUCCESS;
7375 }
7376
paul68980082003-03-25 05:07:42 +00007377 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00007378 {
7379 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7380 return CMD_SUCCESS;
7381 }
7382
7383 /* Show Network routes. */
paul68980082003-03-25 05:07:42 +00007384 show_ip_ospf_route_network (vty, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00007385
7386 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00007387 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00007388
7389 /* Show AS External routes. */
paul68980082003-03-25 05:07:42 +00007390 show_ip_ospf_route_external (vty, ospf->old_external_route);
paul718e3742002-12-13 20:15:29 +00007391
7392 return CMD_SUCCESS;
7393}
7394
7395
hassoeb1ce602004-10-08 08:17:22 +00007396const char *ospf_abr_type_str[] =
paul718e3742002-12-13 20:15:29 +00007397{
7398 "unknown",
7399 "standard",
7400 "ibm",
7401 "cisco",
7402 "shortcut"
7403};
7404
hassoeb1ce602004-10-08 08:17:22 +00007405const char *ospf_shortcut_mode_str[] =
paul718e3742002-12-13 20:15:29 +00007406{
7407 "default",
7408 "enable",
7409 "disable"
7410};
7411
7412
paul4dadc292005-05-06 21:37:42 +00007413static void
paul718e3742002-12-13 20:15:29 +00007414area_id2str (char *buf, int length, struct ospf_area *area)
7415{
7416 memset (buf, 0, length);
7417
7418 if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7419 strncpy (buf, inet_ntoa (area->area_id), length);
7420 else
7421 sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
7422}
7423
7424
hassoeb1ce602004-10-08 08:17:22 +00007425const char *ospf_int_type_str[] =
paul718e3742002-12-13 20:15:29 +00007426{
7427 "unknown", /* should never be used. */
7428 "point-to-point",
7429 "broadcast",
7430 "non-broadcast",
7431 "point-to-multipoint",
7432 "virtual-link", /* should never be used. */
7433 "loopback"
7434};
7435
7436/* Configuration write function for ospfd. */
paul4dadc292005-05-06 21:37:42 +00007437static int
paul718e3742002-12-13 20:15:29 +00007438config_write_interface (struct vty *vty)
7439{
hasso52dc7ee2004-09-23 19:18:23 +00007440 struct listnode *n1, *n2;
paul718e3742002-12-13 20:15:29 +00007441 struct interface *ifp;
7442 struct crypt_key *ck;
7443 int write = 0;
7444 struct route_node *rn = NULL;
7445 struct ospf_if_params *params;
7446
paul1eb8ef22005-04-07 07:30:20 +00007447 for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
paul718e3742002-12-13 20:15:29 +00007448 {
paul718e3742002-12-13 20:15:29 +00007449 if (memcmp (ifp->name, "VLINK", 5) == 0)
7450 continue;
7451
7452 vty_out (vty, "!%s", VTY_NEWLINE);
7453 vty_out (vty, "interface %s%s", ifp->name,
7454 VTY_NEWLINE);
7455 if (ifp->desc)
7456 vty_out (vty, " description %s%s", ifp->desc,
7457 VTY_NEWLINE);
7458
7459 write++;
7460
7461 params = IF_DEF_PARAMS (ifp);
7462
7463 do {
7464 /* Interface Network print. */
7465 if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
paul718e3742002-12-13 20:15:29 +00007466 params->type != OSPF_IFTYPE_LOOPBACK)
7467 {
ajsbc18d612004-12-15 15:07:19 +00007468 if (params->type != ospf_default_iftype(ifp))
hasso7b901432004-08-31 13:37:42 +00007469 {
7470 vty_out (vty, " ip ospf network %s",
7471 ospf_int_type_str[params->type]);
7472 if (params != IF_DEF_PARAMS (ifp))
7473 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7474 vty_out (vty, "%s", VTY_NEWLINE);
7475 }
paul718e3742002-12-13 20:15:29 +00007476 }
7477
7478 /* OSPF interface authentication print */
7479 if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
7480 params->auth_type != OSPF_AUTH_NOTSET)
7481 {
hassoeb1ce602004-10-08 08:17:22 +00007482 const char *auth_str;
paul718e3742002-12-13 20:15:29 +00007483
7484 /* Translation tables are not that much help here due to syntax
7485 of the simple option */
7486 switch (params->auth_type)
7487 {
7488
7489 case OSPF_AUTH_NULL:
7490 auth_str = " null";
7491 break;
7492
7493 case OSPF_AUTH_SIMPLE:
7494 auth_str = "";
7495 break;
7496
7497 case OSPF_AUTH_CRYPTOGRAPHIC:
7498 auth_str = " message-digest";
7499 break;
7500
7501 default:
7502 auth_str = "";
7503 break;
7504 }
7505
7506 vty_out (vty, " ip ospf authentication%s", auth_str);
7507 if (params != IF_DEF_PARAMS (ifp))
7508 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7509 vty_out (vty, "%s", VTY_NEWLINE);
7510 }
7511
7512 /* Simple Authentication Password print. */
7513 if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
7514 params->auth_simple[0] != '\0')
7515 {
7516 vty_out (vty, " ip ospf authentication-key %s",
7517 params->auth_simple);
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
7523 /* Cryptographic Authentication Key print. */
paul1eb8ef22005-04-07 07:30:20 +00007524 for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
paul718e3742002-12-13 20:15:29 +00007525 {
paul718e3742002-12-13 20:15:29 +00007526 vty_out (vty, " ip ospf message-digest-key %d md5 %s",
7527 ck->key_id, ck->auth_key);
7528 if (params != IF_DEF_PARAMS (ifp))
7529 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7530 vty_out (vty, "%s", VTY_NEWLINE);
7531 }
7532
7533 /* Interface Output Cost print. */
7534 if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
7535 {
7536 vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
7537 if (params != IF_DEF_PARAMS (ifp))
7538 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7539 vty_out (vty, "%s", VTY_NEWLINE);
7540 }
7541
7542 /* Hello Interval print. */
7543 if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
7544 params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
7545 {
7546 vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
7547 if (params != IF_DEF_PARAMS (ifp))
7548 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7549 vty_out (vty, "%s", VTY_NEWLINE);
7550 }
7551
7552
7553 /* Router Dead Interval print. */
7554 if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
7555 params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
7556 {
paulf9ad9372005-10-21 00:45:17 +00007557 vty_out (vty, " ip ospf dead-interval ");
7558
7559 /* fast hello ? */
7560 if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
7561 vty_out (vty, "minimal hello-multiplier %d",
7562 params->fast_hello);
7563 else
7564 vty_out (vty, "%u", params->v_wait);
7565
paul718e3742002-12-13 20:15:29 +00007566 if (params != IF_DEF_PARAMS (ifp))
7567 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7568 vty_out (vty, "%s", VTY_NEWLINE);
7569 }
7570
7571 /* Router Priority print. */
7572 if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
7573 params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
7574 {
7575 vty_out (vty, " ip ospf priority %u", params->priority);
7576 if (params != IF_DEF_PARAMS (ifp))
7577 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7578 vty_out (vty, "%s", VTY_NEWLINE);
7579 }
7580
7581 /* Retransmit Interval print. */
7582 if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
7583 params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
7584 {
7585 vty_out (vty, " ip ospf retransmit-interval %u",
7586 params->retransmit_interval);
7587 if (params != IF_DEF_PARAMS (ifp))
7588 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7589 vty_out (vty, "%s", VTY_NEWLINE);
7590 }
7591
7592 /* Transmit Delay print. */
7593 if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
7594 params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
7595 {
7596 vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
7597 if (params != IF_DEF_PARAMS (ifp))
7598 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7599 vty_out (vty, "%s", VTY_NEWLINE);
7600 }
7601
vincentba682532005-09-29 13:52:57 +00007602 /* MTU ignore print. */
7603 if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7604 params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7605 {
7606 if (params->mtu_ignore == 0)
7607 vty_out (vty, " no ip ospf mtu-ignore");
7608 else
7609 vty_out (vty, " ip ospf mtu-ignore");
7610 if (params != IF_DEF_PARAMS (ifp))
7611 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7612 vty_out (vty, "%s", VTY_NEWLINE);
7613 }
7614
7615
paul718e3742002-12-13 20:15:29 +00007616 while (1)
7617 {
7618 if (rn == NULL)
7619 rn = route_top (IF_OIFS_PARAMS (ifp));
7620 else
7621 rn = route_next (rn);
7622
7623 if (rn == NULL)
7624 break;
7625 params = rn->info;
7626 if (params != NULL)
7627 break;
7628 }
7629 } while (rn);
7630
7631#ifdef HAVE_OPAQUE_LSA
7632 ospf_opaque_config_write_if (vty, ifp);
7633#endif /* HAVE_OPAQUE_LSA */
7634 }
7635
7636 return write;
7637}
7638
paul4dadc292005-05-06 21:37:42 +00007639static int
paul68980082003-03-25 05:07:42 +00007640config_write_network_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007641{
7642 struct route_node *rn;
7643 u_char buf[INET_ADDRSTRLEN];
7644
7645 /* `network area' print. */
paul68980082003-03-25 05:07:42 +00007646 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007647 if (rn->info)
7648 {
7649 struct ospf_network *n = rn->info;
7650
7651 memset (buf, 0, INET_ADDRSTRLEN);
7652
7653 /* Create Area ID string by specified Area ID format. */
7654 if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007655 strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007656 else
hassoc9e52be2004-09-26 16:09:34 +00007657 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007658 (unsigned long int) ntohl (n->area_id.s_addr));
7659
7660 /* Network print. */
7661 vty_out (vty, " network %s/%d area %s%s",
7662 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7663 buf, VTY_NEWLINE);
7664 }
7665
7666 return 0;
7667}
7668
paul4dadc292005-05-06 21:37:42 +00007669static int
paul68980082003-03-25 05:07:42 +00007670config_write_ospf_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007671{
hasso52dc7ee2004-09-23 19:18:23 +00007672 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007673 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00007674 u_char buf[INET_ADDRSTRLEN];
7675
7676 /* Area configuration print. */
paul1eb8ef22005-04-07 07:30:20 +00007677 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00007678 {
paul718e3742002-12-13 20:15:29 +00007679 struct route_node *rn1;
7680
hassoc9e52be2004-09-26 16:09:34 +00007681 area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
paul718e3742002-12-13 20:15:29 +00007682
7683 if (area->auth_type != OSPF_AUTH_NULL)
7684 {
7685 if (area->auth_type == OSPF_AUTH_SIMPLE)
7686 vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7687 else
7688 vty_out (vty, " area %s authentication message-digest%s",
7689 buf, VTY_NEWLINE);
7690 }
7691
7692 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7693 vty_out (vty, " area %s shortcut %s%s", buf,
7694 ospf_shortcut_mode_str[area->shortcut_configured],
7695 VTY_NEWLINE);
7696
7697 if ((area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007698 || (area->external_routing == OSPF_AREA_NSSA)
paul718e3742002-12-13 20:15:29 +00007699 )
7700 {
paulb0a053b2003-06-22 09:04:47 +00007701 if (area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00007702 vty_out (vty, " area %s stub", buf);
paulb0a053b2003-06-22 09:04:47 +00007703 else if (area->external_routing == OSPF_AREA_NSSA)
7704 {
7705 vty_out (vty, " area %s nssa", buf);
7706 switch (area->NSSATranslatorRole)
7707 {
7708 case OSPF_NSSA_ROLE_NEVER:
7709 vty_out (vty, " translate-never");
7710 break;
7711 case OSPF_NSSA_ROLE_ALWAYS:
7712 vty_out (vty, " translate-always");
7713 break;
7714 case OSPF_NSSA_ROLE_CANDIDATE:
7715 default:
7716 vty_out (vty, " translate-candidate");
7717 }
7718 }
paul718e3742002-12-13 20:15:29 +00007719
7720 if (area->no_summary)
7721 vty_out (vty, " no-summary");
7722
7723 vty_out (vty, "%s", VTY_NEWLINE);
7724
7725 if (area->default_cost != 1)
7726 vty_out (vty, " area %s default-cost %d%s", buf,
7727 area->default_cost, VTY_NEWLINE);
7728 }
7729
7730 for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7731 if (rn1->info)
7732 {
7733 struct ospf_area_range *range = rn1->info;
7734
7735 vty_out (vty, " area %s range %s/%d", buf,
7736 inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7737
paul6c835672004-10-11 11:00:30 +00007738 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +00007739 vty_out (vty, " cost %d", range->cost_config);
7740
7741 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7742 vty_out (vty, " not-advertise");
7743
7744 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7745 vty_out (vty, " substitute %s/%d",
7746 inet_ntoa (range->subst_addr), range->subst_masklen);
7747
7748 vty_out (vty, "%s", VTY_NEWLINE);
7749 }
7750
7751 if (EXPORT_NAME (area))
7752 vty_out (vty, " area %s export-list %s%s", buf,
7753 EXPORT_NAME (area), VTY_NEWLINE);
7754
7755 if (IMPORT_NAME (area))
7756 vty_out (vty, " area %s import-list %s%s", buf,
7757 IMPORT_NAME (area), VTY_NEWLINE);
7758
7759 if (PREFIX_NAME_IN (area))
7760 vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7761 PREFIX_NAME_IN (area), VTY_NEWLINE);
7762
7763 if (PREFIX_NAME_OUT (area))
7764 vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7765 PREFIX_NAME_OUT (area), VTY_NEWLINE);
7766 }
7767
7768 return 0;
7769}
7770
paul4dadc292005-05-06 21:37:42 +00007771static int
paul68980082003-03-25 05:07:42 +00007772config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007773{
7774 struct ospf_nbr_nbma *nbr_nbma;
7775 struct route_node *rn;
7776
7777 /* Static Neighbor configuration print. */
paul68980082003-03-25 05:07:42 +00007778 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007779 if ((nbr_nbma = rn->info))
7780 {
7781 vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7782
7783 if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7784 vty_out (vty, " priority %d", nbr_nbma->priority);
7785
7786 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7787 vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7788
7789 vty_out (vty, "%s", VTY_NEWLINE);
7790 }
7791
7792 return 0;
7793}
7794
paul4dadc292005-05-06 21:37:42 +00007795static int
paul68980082003-03-25 05:07:42 +00007796config_write_virtual_link (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007797{
hasso52dc7ee2004-09-23 19:18:23 +00007798 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007799 struct ospf_vl_data *vl_data;
paul718e3742002-12-13 20:15:29 +00007800 u_char buf[INET_ADDRSTRLEN];
7801
7802 /* Virtual-Link print */
paul1eb8ef22005-04-07 07:30:20 +00007803 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
paul718e3742002-12-13 20:15:29 +00007804 {
hasso52dc7ee2004-09-23 19:18:23 +00007805 struct listnode *n2;
paul718e3742002-12-13 20:15:29 +00007806 struct crypt_key *ck;
paul718e3742002-12-13 20:15:29 +00007807 struct ospf_interface *oi;
7808
7809 if (vl_data != NULL)
7810 {
7811 memset (buf, 0, INET_ADDRSTRLEN);
7812
7813 if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007814 strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007815 else
hassoc9e52be2004-09-26 16:09:34 +00007816 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007817 (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7818 oi = vl_data->vl_oi;
7819
7820 /* timers */
7821 if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7822 OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7823 OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7824 OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7825 vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7826 buf,
7827 inet_ntoa (vl_data->vl_peer),
7828 OSPF_IF_PARAM (oi, v_hello),
7829 OSPF_IF_PARAM (oi, retransmit_interval),
7830 OSPF_IF_PARAM (oi, transmit_delay),
7831 OSPF_IF_PARAM (oi, v_wait),
7832 VTY_NEWLINE);
7833 else
7834 vty_out (vty, " area %s virtual-link %s%s", buf,
7835 inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7836 /* Auth key */
7837 if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7838 vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7839 buf,
7840 inet_ntoa (vl_data->vl_peer),
7841 IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7842 VTY_NEWLINE);
7843 /* md5 keys */
paul1eb8ef22005-04-07 07:30:20 +00007844 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7845 n2, ck))
7846 vty_out (vty, " area %s virtual-link %s"
7847 " message-digest-key %d md5 %s%s",
7848 buf,
7849 inet_ntoa (vl_data->vl_peer),
7850 ck->key_id, ck->auth_key, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007851
7852 }
7853 }
7854
7855 return 0;
7856}
7857
7858
paul4dadc292005-05-06 21:37:42 +00007859static int
paul68980082003-03-25 05:07:42 +00007860config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007861{
7862 int type;
7863
7864 /* redistribute print. */
7865 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7866 if (type != zclient->redist_default && zclient->redist[type])
7867 {
ajsf52d13c2005-10-01 17:38:06 +00007868 vty_out (vty, " redistribute %s", zebra_route_string(type));
paul68980082003-03-25 05:07:42 +00007869 if (ospf->dmetric[type].value >= 0)
paul020709f2003-04-04 02:44:16 +00007870 vty_out (vty, " metric %d", ospf->dmetric[type].value);
paul718e3742002-12-13 20:15:29 +00007871
paul68980082003-03-25 05:07:42 +00007872 if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007873 vty_out (vty, " metric-type 1");
7874
paul020709f2003-04-04 02:44:16 +00007875 if (ROUTEMAP_NAME (ospf, type))
7876 vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
paul718e3742002-12-13 20:15:29 +00007877
7878 vty_out (vty, "%s", VTY_NEWLINE);
7879 }
7880
7881 return 0;
7882}
7883
paul4dadc292005-05-06 21:37:42 +00007884static int
paul68980082003-03-25 05:07:42 +00007885config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007886{
paul68980082003-03-25 05:07:42 +00007887 if (ospf->default_metric != -1)
7888 vty_out (vty, " default-metric %d%s", ospf->default_metric,
paul718e3742002-12-13 20:15:29 +00007889 VTY_NEWLINE);
7890 return 0;
7891}
7892
paul4dadc292005-05-06 21:37:42 +00007893static int
paul68980082003-03-25 05:07:42 +00007894config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007895{
7896 int type;
7897
paul68980082003-03-25 05:07:42 +00007898 if (ospf)
paul718e3742002-12-13 20:15:29 +00007899 {
7900 /* distribute-list print. */
7901 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
Denis Ovsienko171c9a92011-09-10 16:40:23 +04007902 if (DISTRIBUTE_NAME (ospf, type))
paul718e3742002-12-13 20:15:29 +00007903 vty_out (vty, " distribute-list %s out %s%s",
Denis Ovsienko171c9a92011-09-10 16:40:23 +04007904 DISTRIBUTE_NAME (ospf, type),
ajsf52d13c2005-10-01 17:38:06 +00007905 zebra_route_string(type), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007906
7907 /* default-information print. */
paul68980082003-03-25 05:07:42 +00007908 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
paul718e3742002-12-13 20:15:29 +00007909 {
paulc42c1772006-01-10 20:36:49 +00007910 vty_out (vty, " default-information originate");
7911 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7912 vty_out (vty, " always");
paul718e3742002-12-13 20:15:29 +00007913
paul68980082003-03-25 05:07:42 +00007914 if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
paul718e3742002-12-13 20:15:29 +00007915 vty_out (vty, " metric %d",
paul68980082003-03-25 05:07:42 +00007916 ospf->dmetric[DEFAULT_ROUTE].value);
7917 if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007918 vty_out (vty, " metric-type 1");
7919
paul020709f2003-04-04 02:44:16 +00007920 if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7921 vty_out (vty, " route-map %s",
7922 ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
paul718e3742002-12-13 20:15:29 +00007923
7924 vty_out (vty, "%s", VTY_NEWLINE);
7925 }
7926
7927 }
7928
7929 return 0;
7930}
7931
paul4dadc292005-05-06 21:37:42 +00007932static int
paul68980082003-03-25 05:07:42 +00007933config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007934{
7935 struct route_node *rn;
7936 struct ospf_distance *odistance;
7937
paul68980082003-03-25 05:07:42 +00007938 if (ospf->distance_all)
7939 vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007940
paul68980082003-03-25 05:07:42 +00007941 if (ospf->distance_intra
7942 || ospf->distance_inter
7943 || ospf->distance_external)
paul718e3742002-12-13 20:15:29 +00007944 {
7945 vty_out (vty, " distance ospf");
7946
paul68980082003-03-25 05:07:42 +00007947 if (ospf->distance_intra)
7948 vty_out (vty, " intra-area %d", ospf->distance_intra);
7949 if (ospf->distance_inter)
7950 vty_out (vty, " inter-area %d", ospf->distance_inter);
7951 if (ospf->distance_external)
7952 vty_out (vty, " external %d", ospf->distance_external);
paul718e3742002-12-13 20:15:29 +00007953
7954 vty_out (vty, "%s", VTY_NEWLINE);
7955 }
7956
paul68980082003-03-25 05:07:42 +00007957 for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007958 if ((odistance = rn->info) != NULL)
7959 {
7960 vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7961 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7962 odistance->access_list ? odistance->access_list : "",
7963 VTY_NEWLINE);
7964 }
7965 return 0;
7966}
7967
7968/* OSPF configuration write function. */
paul4dadc292005-05-06 21:37:42 +00007969static int
paul718e3742002-12-13 20:15:29 +00007970ospf_config_write (struct vty *vty)
7971{
paul020709f2003-04-04 02:44:16 +00007972 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00007973 struct interface *ifp;
7974 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00007975 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007976 int write = 0;
7977
paul020709f2003-04-04 02:44:16 +00007978 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00007979 if (ospf != NULL)
paul718e3742002-12-13 20:15:29 +00007980 {
7981 /* `router ospf' print. */
7982 vty_out (vty, "router ospf%s", VTY_NEWLINE);
7983
7984 write++;
7985
paul68980082003-03-25 05:07:42 +00007986 if (!ospf->networks)
paul718e3742002-12-13 20:15:29 +00007987 return write;
7988
7989 /* Router ID print. */
paul68980082003-03-25 05:07:42 +00007990 if (ospf->router_id_static.s_addr != 0)
paul718e3742002-12-13 20:15:29 +00007991 vty_out (vty, " ospf router-id %s%s",
paul68980082003-03-25 05:07:42 +00007992 inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007993
7994 /* ABR type print. */
pauld57834f2005-07-12 20:04:22 +00007995 if (ospf->abr_type != OSPF_ABR_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007996 vty_out (vty, " ospf abr-type %s%s",
paul68980082003-03-25 05:07:42 +00007997 ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007998
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007999 /* log-adjacency-changes flag print. */
8000 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
8001 {
8002 vty_out(vty, " log-adjacency-changes");
8003 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
8004 vty_out(vty, " detail");
8005 vty_out(vty, "%s", VTY_NEWLINE);
8006 }
8007
paul718e3742002-12-13 20:15:29 +00008008 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
paul68980082003-03-25 05:07:42 +00008009 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
paul718e3742002-12-13 20:15:29 +00008010 vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
8011
8012 /* auto-cost reference-bandwidth configuration. */
paul68980082003-03-25 05:07:42 +00008013 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
paulf9ad9372005-10-21 00:45:17 +00008014 {
8015 vty_out (vty, "! Important: ensure reference bandwidth "
8016 "is consistent across all routers%s", VTY_NEWLINE);
8017 vty_out (vty, " auto-cost reference-bandwidth %d%s",
8018 ospf->ref_bandwidth / 1000, VTY_NEWLINE);
8019 }
paul718e3742002-12-13 20:15:29 +00008020
8021 /* SPF timers print. */
paul68980082003-03-25 05:07:42 +00008022 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
paulea4ffc92005-10-21 20:04:41 +00008023 ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
8024 ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
8025 vty_out (vty, " timers throttle spf %d %d %d%s",
paul88d6cf32005-10-29 12:50:09 +00008026 ospf->spf_delay, ospf->spf_holdtime,
paulea4ffc92005-10-21 20:04:41 +00008027 ospf->spf_max_holdtime, VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00008028
8029 /* Max-metric router-lsa print */
8030 config_write_stub_router (vty, ospf);
8031
paul718e3742002-12-13 20:15:29 +00008032 /* SPF refresh parameters print. */
paul68980082003-03-25 05:07:42 +00008033 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
paul718e3742002-12-13 20:15:29 +00008034 vty_out (vty, " refresh timer %d%s",
paul68980082003-03-25 05:07:42 +00008035 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00008036
8037 /* Redistribute information print. */
paul68980082003-03-25 05:07:42 +00008038 config_write_ospf_redistribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008039
8040 /* passive-interface print. */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008041 if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
8042 vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
8043
paul1eb8ef22005-04-07 07:30:20 +00008044 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008045 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
8046 && IF_DEF_PARAMS (ifp)->passive_interface !=
8047 ospf->passive_interface_default)
8048 {
8049 vty_out (vty, " %spassive-interface %s%s",
8050 IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
8051 ifp->name, VTY_NEWLINE);
8052 }
paul1eb8ef22005-04-07 07:30:20 +00008053 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008054 {
8055 if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
8056 continue;
8057 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
8058 passive_interface))
8059 {
8060 if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
8061 continue;
8062 }
8063 else if (oi->params->passive_interface == ospf->passive_interface_default)
8064 continue;
8065
8066 vty_out (vty, " %spassive-interface %s %s%s",
8067 oi->params->passive_interface ? "" : "no ",
paul1eb8ef22005-04-07 07:30:20 +00008068 oi->ifp->name,
8069 inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008070 }
paul718e3742002-12-13 20:15:29 +00008071
8072 /* Network area print. */
paul68980082003-03-25 05:07:42 +00008073 config_write_network_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008074
8075 /* Area config print. */
paul68980082003-03-25 05:07:42 +00008076 config_write_ospf_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008077
8078 /* static neighbor print. */
paul68980082003-03-25 05:07:42 +00008079 config_write_ospf_nbr_nbma (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008080
8081 /* Virtual-Link print. */
paul68980082003-03-25 05:07:42 +00008082 config_write_virtual_link (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008083
8084 /* Default metric configuration. */
paul68980082003-03-25 05:07:42 +00008085 config_write_ospf_default_metric (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008086
8087 /* Distribute-list and default-information print. */
paul68980082003-03-25 05:07:42 +00008088 config_write_ospf_distribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008089
8090 /* Distance configuration. */
paul68980082003-03-25 05:07:42 +00008091 config_write_ospf_distance (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008092
8093#ifdef HAVE_OPAQUE_LSA
paul68980082003-03-25 05:07:42 +00008094 ospf_opaque_config_write_router (vty, ospf);
paul718e3742002-12-13 20:15:29 +00008095#endif /* HAVE_OPAQUE_LSA */
8096 }
8097
8098 return write;
8099}
8100
8101void
paul4dadc292005-05-06 21:37:42 +00008102ospf_vty_show_init (void)
paul718e3742002-12-13 20:15:29 +00008103{
8104 /* "show ip ospf" commands. */
8105 install_element (VIEW_NODE, &show_ip_ospf_cmd);
8106 install_element (ENABLE_NODE, &show_ip_ospf_cmd);
8107
8108 /* "show ip ospf database" commands. */
8109 install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
8110 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
8111 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8112 install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8113 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
8114 install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
8115 install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
8116 install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
8117 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
8118 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8119 install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8120 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
8121 install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
8122 install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
8123
8124 /* "show ip ospf interface" commands. */
8125 install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
8126 install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
8127
8128 /* "show ip ospf neighbor" commands. */
8129 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8130 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
8131 install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
8132 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8133 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
8134 install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
8135 install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
8136 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8137 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
8138 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
8139 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8140 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
8141 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
8142 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
8143
8144 /* "show ip ospf route" commands. */
8145 install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
8146 install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
paul718e3742002-12-13 20:15:29 +00008147 install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
8148 install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
paul718e3742002-12-13 20:15:29 +00008149}
8150
8151
8152/* ospfd's interface node. */
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08008153static struct cmd_node interface_node =
paul718e3742002-12-13 20:15:29 +00008154{
8155 INTERFACE_NODE,
8156 "%s(config-if)# ",
8157 1
8158};
8159
8160/* Initialization of OSPF interface. */
paul4dadc292005-05-06 21:37:42 +00008161static void
8162ospf_vty_if_init (void)
paul718e3742002-12-13 20:15:29 +00008163{
8164 /* Install interface node. */
8165 install_node (&interface_node, config_write_interface);
8166
8167 install_element (CONFIG_NODE, &interface_cmd);
paul32d24632003-05-23 09:25:20 +00008168 install_element (CONFIG_NODE, &no_interface_cmd);
paul718e3742002-12-13 20:15:29 +00008169 install_default (INTERFACE_NODE);
8170
8171 /* "description" commands. */
8172 install_element (INTERFACE_NODE, &interface_desc_cmd);
8173 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
8174
8175 /* "ip ospf authentication" commands. */
8176 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
8177 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
8178 install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
8179 install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
8180 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
8181 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
8182 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
8183 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
8184 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
8185 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
8186
8187 /* "ip ospf message-digest-key" commands. */
8188 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
8189 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
8190 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
8191 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
8192
8193 /* "ip ospf cost" commands. */
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008194 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
8195 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04008196 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
8197 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008198 install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008199 install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
8200
vincentba682532005-09-29 13:52:57 +00008201 /* "ip ospf mtu-ignore" commands. */
8202 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
8203 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
8204 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
8205 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
8206
paul718e3742002-12-13 20:15:29 +00008207 /* "ip ospf dead-interval" commands. */
8208 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
8209 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008210 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
8211 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
paul718e3742002-12-13 20:15:29 +00008212 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
8213 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00008214
paul718e3742002-12-13 20:15:29 +00008215 /* "ip ospf hello-interval" commands. */
8216 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
8217 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
8218 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
8219 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
8220
8221 /* "ip ospf network" commands. */
8222 install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
8223 install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
8224
8225 /* "ip ospf priority" commands. */
8226 install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
8227 install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
8228 install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
8229 install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
8230
8231 /* "ip ospf retransmit-interval" commands. */
8232 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
8233 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
8234 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
8235 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
8236
8237 /* "ip ospf transmit-delay" commands. */
8238 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
8239 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
8240 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
8241 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
8242
8243 /* These commands are compatibitliy for previous version. */
8244 install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
8245 install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
8246 install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
8247 install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008248 install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
8249 install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008250 install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04008251 install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
8252 install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04008253 install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00008254 install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
8255 install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
8256 install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
8257 install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
8258 install_element (INTERFACE_NODE, &ospf_network_cmd);
8259 install_element (INTERFACE_NODE, &no_ospf_network_cmd);
8260 install_element (INTERFACE_NODE, &ospf_priority_cmd);
8261 install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
8262 install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
8263 install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
8264 install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
8265 install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
8266}
8267
paul4dadc292005-05-06 21:37:42 +00008268static void
8269ospf_vty_zebra_init (void)
paul718e3742002-12-13 20:15:29 +00008270{
8271 install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
8272 install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
8273 install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
8274 install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
8275 install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
8276 install_element (OSPF_NODE,
8277 &ospf_redistribute_source_metric_type_routemap_cmd);
8278 install_element (OSPF_NODE,
8279 &ospf_redistribute_source_type_metric_routemap_cmd);
8280 install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
8281 install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
8282 install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
8283
8284 install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
8285
8286 install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
8287 install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
8288
8289 install_element (OSPF_NODE,
8290 &ospf_default_information_originate_metric_type_cmd);
8291 install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
8292 install_element (OSPF_NODE,
8293 &ospf_default_information_originate_type_metric_cmd);
8294 install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
8295 install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
8296 install_element (OSPF_NODE,
8297 &ospf_default_information_originate_always_metric_type_cmd);
8298 install_element (OSPF_NODE,
8299 &ospf_default_information_originate_always_metric_cmd);
8300 install_element (OSPF_NODE,
8301 &ospf_default_information_originate_always_cmd);
8302 install_element (OSPF_NODE,
8303 &ospf_default_information_originate_always_type_metric_cmd);
8304 install_element (OSPF_NODE,
8305 &ospf_default_information_originate_always_type_cmd);
8306
8307 install_element (OSPF_NODE,
8308 &ospf_default_information_originate_metric_type_routemap_cmd);
8309 install_element (OSPF_NODE,
8310 &ospf_default_information_originate_metric_routemap_cmd);
8311 install_element (OSPF_NODE,
8312 &ospf_default_information_originate_routemap_cmd);
8313 install_element (OSPF_NODE,
8314 &ospf_default_information_originate_type_metric_routemap_cmd);
8315 install_element (OSPF_NODE,
8316 &ospf_default_information_originate_type_routemap_cmd);
8317 install_element (OSPF_NODE,
8318 &ospf_default_information_originate_always_metric_type_routemap_cmd);
8319 install_element (OSPF_NODE,
8320 &ospf_default_information_originate_always_metric_routemap_cmd);
8321 install_element (OSPF_NODE,
8322 &ospf_default_information_originate_always_routemap_cmd);
8323 install_element (OSPF_NODE,
8324 &ospf_default_information_originate_always_type_metric_routemap_cmd);
8325 install_element (OSPF_NODE,
8326 &ospf_default_information_originate_always_type_routemap_cmd);
8327
8328 install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
8329
8330 install_element (OSPF_NODE, &ospf_default_metric_cmd);
8331 install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
8332 install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
8333
8334 install_element (OSPF_NODE, &ospf_distance_cmd);
8335 install_element (OSPF_NODE, &no_ospf_distance_cmd);
8336 install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
8337 install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
8338 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
8339 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
8340 install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
8341 install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
8342 install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
8343 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
8344 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
8345 install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
8346 install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
8347 install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
8348 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
8349 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
8350 install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
8351 install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
8352#if 0
8353 install_element (OSPF_NODE, &ospf_distance_source_cmd);
8354 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
8355 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
8356 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
8357#endif /* 0 */
8358}
8359
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08008360static struct cmd_node ospf_node =
paul718e3742002-12-13 20:15:29 +00008361{
8362 OSPF_NODE,
8363 "%s(config-router)# ",
8364 1
8365};
8366
8367
8368/* Install OSPF related vty commands. */
8369void
paul4dadc292005-05-06 21:37:42 +00008370ospf_vty_init (void)
paul718e3742002-12-13 20:15:29 +00008371{
8372 /* Install ospf top node. */
8373 install_node (&ospf_node, ospf_config_write);
8374
8375 /* "router ospf" commands. */
8376 install_element (CONFIG_NODE, &router_ospf_cmd);
8377 install_element (CONFIG_NODE, &no_router_ospf_cmd);
8378
8379 install_default (OSPF_NODE);
8380
8381 /* "ospf router-id" commands. */
8382 install_element (OSPF_NODE, &ospf_router_id_cmd);
8383 install_element (OSPF_NODE, &no_ospf_router_id_cmd);
paula2c62832003-04-23 17:01:31 +00008384 install_element (OSPF_NODE, &router_ospf_id_cmd);
8385 install_element (OSPF_NODE, &no_router_ospf_id_cmd);
paul718e3742002-12-13 20:15:29 +00008386
8387 /* "passive-interface" commands. */
paula2c62832003-04-23 17:01:31 +00008388 install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
8389 install_element (OSPF_NODE, &ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008390 install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
paula2c62832003-04-23 17:01:31 +00008391 install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
8392 install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00008393 install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
paul718e3742002-12-13 20:15:29 +00008394
8395 /* "ospf abr-type" commands. */
8396 install_element (OSPF_NODE, &ospf_abr_type_cmd);
8397 install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
8398
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00008399 /* "ospf log-adjacency-changes" commands. */
8400 install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
8401 install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
8402 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
8403 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
8404
paul718e3742002-12-13 20:15:29 +00008405 /* "ospf rfc1583-compatible" commands. */
8406 install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
8407 install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
8408 install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
8409 install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
8410
8411 /* "network area" commands. */
paula2c62832003-04-23 17:01:31 +00008412 install_element (OSPF_NODE, &ospf_network_area_cmd);
8413 install_element (OSPF_NODE, &no_ospf_network_area_cmd);
paul718e3742002-12-13 20:15:29 +00008414
8415 /* "area authentication" commands. */
paula2c62832003-04-23 17:01:31 +00008416 install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
8417 install_element (OSPF_NODE, &ospf_area_authentication_cmd);
8418 install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
paul718e3742002-12-13 20:15:29 +00008419
8420 /* "area range" commands. */
paula2c62832003-04-23 17:01:31 +00008421 install_element (OSPF_NODE, &ospf_area_range_cmd);
8422 install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
8423 install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
8424 install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
8425 install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
8426 install_element (OSPF_NODE, &no_ospf_area_range_cmd);
8427 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
8428 install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
8429 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
8430 install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
8431 install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
paul718e3742002-12-13 20:15:29 +00008432
8433 /* "area virtual-link" commands. */
paula2c62832003-04-23 17:01:31 +00008434 install_element (OSPF_NODE, &ospf_area_vlink_cmd);
8435 install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
paul718e3742002-12-13 20:15:29 +00008436
paula2c62832003-04-23 17:01:31 +00008437 install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
8438 install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
paul718e3742002-12-13 20:15:29 +00008439
paula2c62832003-04-23 17:01:31 +00008440 install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
8441 install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
paul718e3742002-12-13 20:15:29 +00008442
paula2c62832003-04-23 17:01:31 +00008443 install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
8444 install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
paul718e3742002-12-13 20:15:29 +00008445
paula2c62832003-04-23 17:01:31 +00008446 install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
8447 install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
paul718e3742002-12-13 20:15:29 +00008448
paula2c62832003-04-23 17:01:31 +00008449 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
8450 install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
8451 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
paul718e3742002-12-13 20:15:29 +00008452
paula2c62832003-04-23 17:01:31 +00008453 install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
8454 install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008455
paula2c62832003-04-23 17:01:31 +00008456 install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
8457 install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008458
paula2c62832003-04-23 17:01:31 +00008459 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
8460 install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
8461 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00008462
paula2c62832003-04-23 17:01:31 +00008463 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
8464 install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
8465 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
paul718e3742002-12-13 20:15:29 +00008466
8467 /* "area stub" commands. */
paula2c62832003-04-23 17:01:31 +00008468 install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
8469 install_element (OSPF_NODE, &ospf_area_stub_cmd);
8470 install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
8471 install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
paul718e3742002-12-13 20:15:29 +00008472
paul718e3742002-12-13 20:15:29 +00008473 /* "area nssa" commands. */
paula2c62832003-04-23 17:01:31 +00008474 install_element (OSPF_NODE, &ospf_area_nssa_cmd);
8475 install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
8476 install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
8477 install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
8478 install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
8479 install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
paul718e3742002-12-13 20:15:29 +00008480
paula2c62832003-04-23 17:01:31 +00008481 install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
8482 install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
paul718e3742002-12-13 20:15:29 +00008483
paula2c62832003-04-23 17:01:31 +00008484 install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
8485 install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
paul718e3742002-12-13 20:15:29 +00008486
paula2c62832003-04-23 17:01:31 +00008487 install_element (OSPF_NODE, &ospf_area_export_list_cmd);
8488 install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
paul718e3742002-12-13 20:15:29 +00008489
paula2c62832003-04-23 17:01:31 +00008490 install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
8491 install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
paul718e3742002-12-13 20:15:29 +00008492
paula2c62832003-04-23 17:01:31 +00008493 install_element (OSPF_NODE, &ospf_area_import_list_cmd);
8494 install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
paul88d6cf32005-10-29 12:50:09 +00008495
8496 /* SPF timer commands */
paula2c62832003-04-23 17:01:31 +00008497 install_element (OSPF_NODE, &ospf_timers_spf_cmd);
8498 install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
pauld24f6e22005-10-21 09:23:12 +00008499 install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
8500 install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
8501
paul88d6cf32005-10-29 12:50:09 +00008502 /* refresh timer commands */
paula2c62832003-04-23 17:01:31 +00008503 install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
8504 install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
8505 install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
paul718e3742002-12-13 20:15:29 +00008506
paul88d6cf32005-10-29 12:50:09 +00008507 /* max-metric commands */
8508 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
8509 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
8510 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
8511 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
8512 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
8513 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
8514
8515 /* reference bandwidth commands */
paula2c62832003-04-23 17:01:31 +00008516 install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
8517 install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
paul718e3742002-12-13 20:15:29 +00008518
8519 /* "neighbor" commands. */
paula2c62832003-04-23 17:01:31 +00008520 install_element (OSPF_NODE, &ospf_neighbor_cmd);
8521 install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
8522 install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
8523 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
8524 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
8525 install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
8526 install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
8527 install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
paul718e3742002-12-13 20:15:29 +00008528
8529 /* Init interface related vty commands. */
8530 ospf_vty_if_init ();
8531
8532 /* Init zebra related vty commands. */
8533 ospf_vty_zebra_init ();
8534}