blob: d57eb41d063ccd389f9fabca393ded96d3a87afd [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
David Lamparter6b0655a2014-06-04 06:53:35 +020052
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
David Lamparter6b0655a2014-06-04 06:53:35 +020064
paul718e3742002-12-13 20:15:29 +000065/* 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
David Lamparter6b0655a2014-06-04 06:53:35 +020097
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
David Lamparter6b0655a2014-06-04 06:53:35 +0200145
paul718e3742002-12-13 20:15:29 +0000146DEFUN (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
Paul Jakmae1bcd472014-09-19 16:41:10 +0100257ospf_passive_interface_update_addr (struct ospf *ospf, struct interface *ifp,
258 struct ospf_if_params *params, u_char value,
259 struct in_addr addr)
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000260{
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 }
Paul Jakmae1bcd472014-09-19 16:41:10 +0100279}
280
281static void
282ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
283 struct ospf_if_params *params, u_char value)
284{
285 params->passive_interface = value;
286 if (params == IF_DEF_PARAMS (ifp))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000287 {
288 if (value != ospf->passive_interface_default)
289 SET_IF_PARAM (params, passive_interface);
290 else
291 UNSET_IF_PARAM (params, passive_interface);
292 }
293}
294
paula2c62832003-04-23 17:01:31 +0000295DEFUN (ospf_passive_interface,
296 ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000297 "passive-interface IFNAME A.B.C.D",
298 "Suppress routing updates on an interface\n"
299 "Interface's name\n")
300{
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000301 struct interface *ifp;
302 struct in_addr addr;
303 int ret;
304 struct ospf_if_params *params;
305 struct route_node *rn;
306 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000307
Andrew J. Schorr43540882006-11-28 16:36:39 +0000308 if (argc == 0)
309 {
310 ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
311 return CMD_SUCCESS;
312 }
313
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000314 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000315
316 params = IF_DEF_PARAMS (ifp);
317
Andrew J. Schorr43540882006-11-28 16:36:39 +0000318 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000319 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000320 ret = inet_aton(argv[1], &addr);
321 if (!ret)
322 {
323 vty_out (vty, "Please specify interface address by A.B.C.D%s",
324 VTY_NEWLINE);
325 return CMD_WARNING;
326 }
paul718e3742002-12-13 20:15:29 +0000327
Andrew J. Schorr43540882006-11-28 16:36:39 +0000328 params = ospf_get_if_params (ifp, addr);
329 ospf_if_update_params (ifp, addr);
Paul Jakmae1bcd472014-09-19 16:41:10 +0100330 ospf_passive_interface_update_addr (ospf, ifp, params,
331 OSPF_IF_PASSIVE, addr);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000332 }
Paul Jakmae1bcd472014-09-19 16:41:10 +0100333
334 ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_PASSIVE);
Andrew J. Schorr43540882006-11-28 16:36:39 +0000335
ajsba6454e2005-02-08 15:37:30 +0000336 /* XXX We should call ospf_if_set_multicast on exactly those
337 * interfaces for which the passive property changed. It is too much
338 * work to determine this set, so we do this for every interface.
339 * This is safe and reasonable because ospf_if_set_multicast uses a
340 * record of joined groups to avoid systems calls if the desired
341 * memberships match the current memership.
342 */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000343
ajsba6454e2005-02-08 15:37:30 +0000344 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
345 {
346 struct ospf_interface *oi = rn->info;
347
348 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
Andrew J. Schorr43540882006-11-28 16:36:39 +0000349 ospf_if_set_multicast(oi);
ajsba6454e2005-02-08 15:37:30 +0000350 }
351 /*
352 * XXX It is not clear what state transitions the interface needs to
353 * undergo when going from active to passive. Fixing this will
354 * require precise identification of interfaces having such a
355 * transition.
356 */
357
paul718e3742002-12-13 20:15:29 +0000358 return CMD_SUCCESS;
359}
360
paula2c62832003-04-23 17:01:31 +0000361ALIAS (ospf_passive_interface,
362 ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000363 "passive-interface IFNAME",
364 "Suppress routing updates on an interface\n"
365 "Interface's name\n")
366
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000367ALIAS (ospf_passive_interface,
368 ospf_passive_interface_default_cmd,
369 "passive-interface default",
370 "Suppress routing updates on an interface\n"
371 "Suppress routing updates on interfaces by default\n")
372
paula2c62832003-04-23 17:01:31 +0000373DEFUN (no_ospf_passive_interface,
374 no_ospf_passive_interface_addr_cmd,
paul718e3742002-12-13 20:15:29 +0000375 "no passive-interface IFNAME A.B.C.D",
376 NO_STR
377 "Allow routing updates on an interface\n"
378 "Interface's name\n")
379{
380 struct interface *ifp;
381 struct in_addr addr;
382 struct ospf_if_params *params;
383 int ret;
ajsba6454e2005-02-08 15:37:30 +0000384 struct route_node *rn;
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000385 struct ospf *ospf = vty->index;
Andrew J. Schorr43540882006-11-28 16:36:39 +0000386
387 if (argc == 0)
388 {
389 ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
390 return CMD_SUCCESS;
391 }
paul718e3742002-12-13 20:15:29 +0000392
Andrew J. Schorr6e72cb62006-06-18 00:45:48 +0000393 ifp = if_get_by_name (argv[0]);
paul718e3742002-12-13 20:15:29 +0000394
395 params = IF_DEF_PARAMS (ifp);
396
Andrew J. Schorr43540882006-11-28 16:36:39 +0000397 if (argc == 2)
paul718e3742002-12-13 20:15:29 +0000398 {
Andrew J. Schorr43540882006-11-28 16:36:39 +0000399 ret = inet_aton(argv[1], &addr);
400 if (!ret)
401 {
402 vty_out (vty, "Please specify interface address by A.B.C.D%s",
403 VTY_NEWLINE);
404 return CMD_WARNING;
405 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000406
Andrew J. Schorr43540882006-11-28 16:36:39 +0000407 params = ospf_lookup_if_params (ifp, addr);
408 if (params == NULL)
409 return CMD_SUCCESS;
Paul Jakmae1bcd472014-09-19 16:41:10 +0100410 ospf_passive_interface_update_addr (ospf, ifp, params, OSPF_IF_ACTIVE,
411 addr);
paul718e3742002-12-13 20:15:29 +0000412 }
Paul Jakmae1bcd472014-09-19 16:41:10 +0100413 ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_ACTIVE);
414
ajsba6454e2005-02-08 15:37:30 +0000415 /* XXX We should call ospf_if_set_multicast on exactly those
416 * interfaces for which the passive property changed. It is too much
417 * work to determine this set, so we do this for every interface.
418 * This is safe and reasonable because ospf_if_set_multicast uses a
419 * record of joined groups to avoid systems calls if the desired
420 * memberships match the current memership.
421 */
422 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
423 {
424 struct ospf_interface *oi = rn->info;
425
426 if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
427 ospf_if_set_multicast(oi);
428 }
429
paul718e3742002-12-13 20:15:29 +0000430 return CMD_SUCCESS;
431}
432
paula2c62832003-04-23 17:01:31 +0000433ALIAS (no_ospf_passive_interface,
434 no_ospf_passive_interface_cmd,
paul718e3742002-12-13 20:15:29 +0000435 "no passive-interface IFNAME",
436 NO_STR
437 "Allow routing updates on an interface\n"
438 "Interface's name\n")
439
Paul Jakma7ffa8fa2006-10-22 20:07:53 +0000440ALIAS (no_ospf_passive_interface,
441 no_ospf_passive_interface_default_cmd,
442 "no passive-interface default",
443 NO_STR
444 "Allow routing updates on an interface\n"
445 "Allow routing updates on interfaces by default\n")
446
paula2c62832003-04-23 17:01:31 +0000447DEFUN (ospf_network_area,
448 ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000449 "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
450 "Enable routing on an IP network\n"
451 "OSPF network prefix\n"
452 "Set the OSPF area ID\n"
453 "OSPF area ID in IP address format\n"
454 "OSPF area ID as a decimal value\n")
455{
456 struct ospf *ospf= vty->index;
457 struct prefix_ipv4 p;
458 struct in_addr area_id;
459 int ret, format;
460
461 /* Get network prefix and Area ID. */
462 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
463 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
464
465 ret = ospf_network_set (ospf, &p, area_id);
466 if (ret == 0)
467 {
468 vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
469 return CMD_WARNING;
470 }
471
472 return CMD_SUCCESS;
473}
474
paula2c62832003-04-23 17:01:31 +0000475DEFUN (no_ospf_network_area,
476 no_ospf_network_area_cmd,
paul718e3742002-12-13 20:15:29 +0000477 "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
478 NO_STR
479 "Enable routing on an IP network\n"
480 "OSPF network prefix\n"
481 "Set the OSPF area ID\n"
482 "OSPF area ID in IP address format\n"
483 "OSPF area ID as a decimal value\n")
484{
485 struct ospf *ospf = (struct ospf *) vty->index;
486 struct prefix_ipv4 p;
487 struct in_addr area_id;
488 int ret, format;
489
490 /* Get network prefix and Area ID. */
491 VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
492 VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
493
494 ret = ospf_network_unset (ospf, &p, area_id);
495 if (ret == 0)
496 {
497 vty_out (vty, "Can't find specified network area configuration.%s",
498 VTY_NEWLINE);
499 return CMD_WARNING;
500 }
501
502 return CMD_SUCCESS;
503}
504
David Lamparter6b0655a2014-06-04 06:53:35 +0200505
paula2c62832003-04-23 17:01:31 +0000506DEFUN (ospf_area_range,
507 ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000508 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
509 "OSPF area parameters\n"
510 "OSPF area ID in IP address format\n"
511 "OSPF area ID as a decimal value\n"
512 "Summarize routes matching address/mask (border routers only)\n"
513 "Area range prefix\n")
514{
515 struct ospf *ospf = vty->index;
516 struct prefix_ipv4 p;
517 struct in_addr area_id;
518 int format;
519 u_int32_t cost;
520
521 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
522 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
523
524 ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
525 if (argc > 2)
526 {
paul4dadc292005-05-06 21:37:42 +0000527 VTY_GET_INTEGER ("range cost", cost, argv[2]);
paul718e3742002-12-13 20:15:29 +0000528 ospf_area_range_cost_set (ospf, area_id, &p, cost);
529 }
530
531 return CMD_SUCCESS;
532}
533
paula2c62832003-04-23 17:01:31 +0000534ALIAS (ospf_area_range,
535 ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000536 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
537 "OSPF area parameters\n"
538 "OSPF area ID in IP address format\n"
539 "OSPF area ID as a decimal value\n"
540 "OSPF area range for route advertise (default)\n"
541 "Area range prefix\n"
542 "Advertise this range (default)\n")
543
paula2c62832003-04-23 17:01:31 +0000544ALIAS (ospf_area_range,
545 ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000546 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
547 "OSPF area parameters\n"
548 "OSPF area ID in IP address format\n"
549 "OSPF area ID as a decimal value\n"
550 "Summarize routes matching address/mask (border routers only)\n"
551 "Area range prefix\n"
552 "User specified metric for this range\n"
553 "Advertised metric for this range\n")
554
paula2c62832003-04-23 17:01:31 +0000555ALIAS (ospf_area_range,
556 ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000557 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
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 "Advertise this range (default)\n"
564 "User specified metric for this range\n"
565 "Advertised metric for this range\n")
566
paula2c62832003-04-23 17:01:31 +0000567DEFUN (ospf_area_range_not_advertise,
568 ospf_area_range_not_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000569 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
570 "OSPF area parameters\n"
571 "OSPF area ID in IP address format\n"
572 "OSPF area ID as a decimal value\n"
573 "Summarize routes matching address/mask (border routers only)\n"
574 "Area range prefix\n"
575 "DoNotAdvertise this range\n")
576{
577 struct ospf *ospf = vty->index;
578 struct prefix_ipv4 p;
579 struct in_addr area_id;
580 int format;
581
582 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
583 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
584
585 ospf_area_range_set (ospf, area_id, &p, 0);
586
587 return CMD_SUCCESS;
588}
589
paula2c62832003-04-23 17:01:31 +0000590DEFUN (no_ospf_area_range,
591 no_ospf_area_range_cmd,
paul718e3742002-12-13 20:15:29 +0000592 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
593 NO_STR
594 "OSPF area parameters\n"
595 "OSPF area ID in IP address format\n"
596 "OSPF area ID as a decimal value\n"
597 "Summarize routes matching address/mask (border routers only)\n"
598 "Area range prefix\n")
599{
600 struct ospf *ospf = vty->index;
601 struct prefix_ipv4 p;
602 struct in_addr area_id;
603 int format;
604
605 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
606 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
607
608 ospf_area_range_unset (ospf, area_id, &p);
609
610 return CMD_SUCCESS;
611}
612
paula2c62832003-04-23 17:01:31 +0000613ALIAS (no_ospf_area_range,
614 no_ospf_area_range_advertise_cmd,
paul718e3742002-12-13 20:15:29 +0000615 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
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 "Advertise this range (default)\n"
623 "DoNotAdvertise this range\n")
624
paula2c62832003-04-23 17:01:31 +0000625ALIAS (no_ospf_area_range,
626 no_ospf_area_range_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000627 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M 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 "User specified metric for this range\n"
635 "Advertised metric for this range\n")
636
paula2c62832003-04-23 17:01:31 +0000637ALIAS (no_ospf_area_range,
638 no_ospf_area_range_advertise_cost_cmd,
paul718e3742002-12-13 20:15:29 +0000639 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
640 NO_STR
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 "Advertise this range (default)\n"
647 "User specified metric for this range\n"
648 "Advertised metric for this range\n")
David Lamparter6b0655a2014-06-04 06:53:35 +0200649
paula2c62832003-04-23 17:01:31 +0000650DEFUN (ospf_area_range_substitute,
651 ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000652 "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
653 "OSPF area parameters\n"
654 "OSPF area ID in IP address format\n"
655 "OSPF area ID as a decimal value\n"
656 "Summarize routes matching address/mask (border routers only)\n"
657 "Area range prefix\n"
658 "Announce area range as another prefix\n"
659 "Network prefix to be announced instead of range\n")
660{
661 struct ospf *ospf = vty->index;
662 struct prefix_ipv4 p, s;
663 struct in_addr area_id;
664 int format;
665
666 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
667 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
668 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
669
670 ospf_area_range_substitute_set (ospf, area_id, &p, &s);
671
672 return CMD_SUCCESS;
673}
674
paula2c62832003-04-23 17:01:31 +0000675DEFUN (no_ospf_area_range_substitute,
676 no_ospf_area_range_substitute_cmd,
paul718e3742002-12-13 20:15:29 +0000677 "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
678 NO_STR
679 "OSPF area parameters\n"
680 "OSPF area ID in IP address format\n"
681 "OSPF area ID as a decimal value\n"
682 "Summarize routes matching address/mask (border routers only)\n"
683 "Area range prefix\n"
684 "Announce area range as another prefix\n"
685 "Network prefix to be announced instead of range\n")
686{
687 struct ospf *ospf = vty->index;
688 struct prefix_ipv4 p, s;
689 struct in_addr area_id;
690 int format;
691
692 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
693 VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
694 VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
695
696 ospf_area_range_substitute_unset (ospf, area_id, &p);
697
698 return CMD_SUCCESS;
699}
700
David Lamparter6b0655a2014-06-04 06:53:35 +0200701
paul718e3742002-12-13 20:15:29 +0000702/* Command Handler Logic in VLink stuff is delicate!!
703
704 ALTER AT YOUR OWN RISK!!!!
705
706 Various dummy values are used to represent 'NoChange' state for
707 VLink configuration NOT being changed by a VLink command, and
708 special syntax is used within the command strings so that the
709 typed in command verbs can be seen in the configuration command
710 bacckend handler. This is to drastically reduce the verbeage
711 required to coe up with a reasonably compatible Cisco VLink command
712
713 - Matthew Grant <grantma@anathoth.gen.nz>
714 Wed, 21 Feb 2001 15:13:52 +1300
715 */
716
717
718/* Configuration data for virtual links
719 */
720struct ospf_vl_config_data {
721 struct vty *vty; /* vty stuff */
722 struct in_addr area_id; /* area ID from command line */
723 int format; /* command line area ID format */
724 struct in_addr vl_peer; /* command line vl_peer */
725 int auth_type; /* Authehntication type, if given */
726 char *auth_key; /* simple password if present */
727 int crypto_key_id; /* Cryptographic key ID */
728 char *md5_key; /* MD5 authentication key */
729 int hello_interval; /* Obvious what these are... */
730 int retransmit_interval;
731 int transmit_delay;
732 int dead_interval;
733};
734
paul4dadc292005-05-06 21:37:42 +0000735static void
paul718e3742002-12-13 20:15:29 +0000736ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
737 struct vty *vty)
738{
739 memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
740 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
741 vl_config->vty = vty;
742}
743
paul4dadc292005-05-06 21:37:42 +0000744static struct ospf_vl_data *
paul68980082003-03-25 05:07:42 +0000745ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000746{
747 struct ospf_area *area;
748 struct ospf_vl_data *vl_data;
749 struct vty *vty;
750 struct in_addr area_id;
751
752 vty = vl_config->vty;
753 area_id = vl_config->area_id;
754
755 if (area_id.s_addr == OSPF_AREA_BACKBONE)
756 {
757 vty_out (vty,
758 "Configuring VLs over the backbone is not allowed%s",
759 VTY_NEWLINE);
760 return NULL;
761 }
paul68980082003-03-25 05:07:42 +0000762 area = ospf_area_get (ospf, area_id, vl_config->format);
paul718e3742002-12-13 20:15:29 +0000763
764 if (area->external_routing != OSPF_AREA_DEFAULT)
765 {
766 if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
767 vty_out (vty, "Area %s is %s%s",
768 inet_ntoa (area_id),
paul718e3742002-12-13 20:15:29 +0000769 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000770 VTY_NEWLINE);
771 else
772 vty_out (vty, "Area %ld is %s%s",
773 (u_long)ntohl (area_id.s_addr),
paul718e3742002-12-13 20:15:29 +0000774 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
paul718e3742002-12-13 20:15:29 +0000775 VTY_NEWLINE);
776 return NULL;
777 }
778
Paul Jakma9c27ef92006-05-04 07:32:57 +0000779 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
paul718e3742002-12-13 20:15:29 +0000780 {
781 vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
782 if (vl_data->vl_oi == NULL)
783 {
paul68980082003-03-25 05:07:42 +0000784 vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
785 ospf_vl_add (ospf, vl_data);
Paul Jakmab6eef002014-10-09 14:19:51 +0100786 ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
paul718e3742002-12-13 20:15:29 +0000787 }
788 }
789 return vl_data;
790}
791
792
paul4dadc292005-05-06 21:37:42 +0000793static int
paul718e3742002-12-13 20:15:29 +0000794ospf_vl_set_security (struct ospf_vl_data *vl_data,
795 struct ospf_vl_config_data *vl_config)
796{
797 struct crypt_key *ck;
798 struct vty *vty;
799 struct interface *ifp = vl_data->vl_oi->ifp;
800
801 vty = vl_config->vty;
802
803 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
804 {
805 SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
806 IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
807 }
808
809 if (vl_config->auth_key)
810 {
811 memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000812 strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
paul718e3742002-12-13 20:15:29 +0000813 OSPF_AUTH_SIMPLE_SIZE);
814 }
815 else if (vl_config->md5_key)
816 {
817 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
818 != NULL)
819 {
820 vty_out (vty, "OSPF: Key %d already exists%s",
821 vl_config->crypto_key_id, VTY_NEWLINE);
822 return CMD_WARNING;
823 }
824 ck = ospf_crypt_key_new ();
825 ck->key_id = vl_config->crypto_key_id;
826 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +0000827 strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +0000828
829 ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
830 }
831 else if (vl_config->crypto_key_id != 0)
832 {
833 /* Delete a key */
834
835 if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
836 vl_config->crypto_key_id) == NULL)
837 {
838 vty_out (vty, "OSPF: Key %d does not exist%s",
839 vl_config->crypto_key_id, VTY_NEWLINE);
840 return CMD_WARNING;
841 }
842
843 ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
844
845 }
846
847 return CMD_SUCCESS;
848}
849
paul4dadc292005-05-06 21:37:42 +0000850static int
paul718e3742002-12-13 20:15:29 +0000851ospf_vl_set_timers (struct ospf_vl_data *vl_data,
852 struct ospf_vl_config_data *vl_config)
853{
854 struct interface *ifp = ifp = vl_data->vl_oi->ifp;
855 /* Virtual Link data initialised to defaults, so only set
856 if a value given */
857 if (vl_config->hello_interval)
858 {
859 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
860 IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
861 }
862
863 if (vl_config->dead_interval)
864 {
865 SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
866 IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
867 }
868
869 if (vl_config->retransmit_interval)
870 {
871 SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
872 IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
873 }
874
875 if (vl_config->transmit_delay)
876 {
877 SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
878 IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
879 }
880
881 return CMD_SUCCESS;
882}
883
884
885
886/* The business end of all of the above */
paul4dadc292005-05-06 21:37:42 +0000887static int
paul68980082003-03-25 05:07:42 +0000888ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
paul718e3742002-12-13 20:15:29 +0000889{
890 struct ospf_vl_data *vl_data;
891 int ret;
892
paul68980082003-03-25 05:07:42 +0000893 vl_data = ospf_find_vl_data (ospf, vl_config);
paul718e3742002-12-13 20:15:29 +0000894 if (!vl_data)
895 return CMD_WARNING;
896
897 /* Process this one first as it can have a fatal result, which can
898 only logically occur if the virtual link exists already
899 Thus a command error does not result in a change to the
900 running configuration such as unexpectedly altered timer
901 values etc.*/
902 ret = ospf_vl_set_security (vl_data, vl_config);
903 if (ret != CMD_SUCCESS)
904 return ret;
905
906 /* Set any time based parameters, these area already range checked */
907
908 ret = ospf_vl_set_timers (vl_data, vl_config);
909 if (ret != CMD_SUCCESS)
910 return ret;
911
912 return CMD_SUCCESS;
913
914}
915
916/* This stuff exists to make specifying all the alias commands A LOT simpler
917 */
918#define VLINK_HELPSTR_IPADDR \
919 "OSPF area parameters\n" \
920 "OSPF area ID in IP address format\n" \
921 "OSPF area ID as a decimal value\n" \
922 "Configure a virtual link\n" \
923 "Router ID of the remote ABR\n"
924
925#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
926 "Enable authentication on this virtual link\n" \
927 "dummy string \n"
928
929#define VLINK_HELPSTR_AUTHTYPE_ALL \
930 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
931 "Use null authentication\n" \
932 "Use message-digest authentication\n"
933
934#define VLINK_HELPSTR_TIME_PARAM_NOSECS \
935 "Time between HELLO packets\n" \
936 "Time between retransmitting lost link state advertisements\n" \
937 "Link state transmit delay\n" \
938 "Interval after which a neighbor is declared dead\n"
939
940#define VLINK_HELPSTR_TIME_PARAM \
941 VLINK_HELPSTR_TIME_PARAM_NOSECS \
942 "Seconds\n"
943
944#define VLINK_HELPSTR_AUTH_SIMPLE \
945 "Authentication password (key)\n" \
946 "The OSPF password (key)"
947
948#define VLINK_HELPSTR_AUTH_MD5 \
949 "Message digest authentication password (key)\n" \
950 "dummy string \n" \
951 "Key ID\n" \
952 "Use MD5 algorithm\n" \
953 "The OSPF password (key)"
954
paula2c62832003-04-23 17:01:31 +0000955DEFUN (ospf_area_vlink,
956 ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +0000957 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
958 VLINK_HELPSTR_IPADDR)
959{
paul68980082003-03-25 05:07:42 +0000960 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +0000961 struct ospf_vl_config_data vl_config;
962 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
963 char md5_key[OSPF_AUTH_MD5_SIZE+1];
964 int i;
965 int ret;
966
967 ospf_vl_config_data_init(&vl_config, vty);
968
969 /* Read off first 2 parameters and check them */
970 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
971 if (ret < 0)
972 {
973 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
974 return CMD_WARNING;
975 }
976
977 ret = inet_aton (argv[1], &vl_config.vl_peer);
978 if (! ret)
979 {
980 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
981 VTY_NEWLINE);
982 return CMD_WARNING;
983 }
984
985 if (argc <=2)
986 {
987 /* Thats all folks! - BUGS B. strikes again!!!*/
988
paul68980082003-03-25 05:07:42 +0000989 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +0000990 }
991
992 /* Deal with other parameters */
993 for (i=2; i < argc; i++)
994 {
995
996 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
997
998 switch (argv[i][0])
999 {
1000
1001 case 'a':
1002 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1003 {
1004 /* authentication-key - this option can occur anywhere on
1005 command line. At start of command line
1006 must check for authentication option. */
1007 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1008 strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
1009 vl_config.auth_key = auth_key;
1010 i++;
1011 }
1012 else if (strncmp (argv[i], "authentication", 14) == 0)
1013 {
1014 /* authentication - this option can only occur at start
1015 of command line */
1016 vl_config.auth_type = OSPF_AUTH_SIMPLE;
1017 if ((i+1) < argc)
1018 {
1019 if (strncmp (argv[i+1], "n", 1) == 0)
1020 {
1021 /* "authentication null" */
1022 vl_config.auth_type = OSPF_AUTH_NULL;
1023 i++;
1024 }
1025 else if (strncmp (argv[i+1], "m", 1) == 0
1026 && strcmp (argv[i+1], "message-digest-") != 0)
1027 {
1028 /* "authentication message-digest" */
1029 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1030 i++;
1031 }
1032 }
1033 }
1034 break;
1035
1036 case 'm':
1037 /* message-digest-key */
1038 i++;
1039 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1040 if (vl_config.crypto_key_id < 0)
1041 return CMD_WARNING;
1042 i++;
1043 memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1044 strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1045 vl_config.md5_key = md5_key;
1046 break;
1047
1048 case 'h':
1049 /* Hello interval */
1050 i++;
1051 vl_config.hello_interval = strtol (argv[i], NULL, 10);
1052 if (vl_config.hello_interval < 0)
1053 return CMD_WARNING;
1054 break;
1055
1056 case 'r':
1057 /* Retransmit Interval */
1058 i++;
1059 vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1060 if (vl_config.retransmit_interval < 0)
1061 return CMD_WARNING;
1062 break;
1063
1064 case 't':
1065 /* Transmit Delay */
1066 i++;
1067 vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1068 if (vl_config.transmit_delay < 0)
1069 return CMD_WARNING;
1070 break;
1071
1072 case 'd':
1073 /* Dead Interval */
1074 i++;
1075 vl_config.dead_interval = strtol (argv[i], NULL, 10);
1076 if (vl_config.dead_interval < 0)
1077 return CMD_WARNING;
1078 break;
1079 }
1080 }
1081
1082
1083 /* Action configuration */
1084
paul68980082003-03-25 05:07:42 +00001085 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001086
1087}
1088
paula2c62832003-04-23 17:01:31 +00001089DEFUN (no_ospf_area_vlink,
1090 no_ospf_area_vlink_cmd,
paul718e3742002-12-13 20:15:29 +00001091 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1092 NO_STR
1093 VLINK_HELPSTR_IPADDR)
1094{
paul68980082003-03-25 05:07:42 +00001095 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001096 struct ospf_area *area;
1097 struct ospf_vl_config_data vl_config;
1098 struct ospf_vl_data *vl_data = NULL;
1099 char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1100 int i;
1101 int ret, format;
1102
1103 ospf_vl_config_data_init(&vl_config, vty);
1104
1105 ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1106 if (ret < 0)
1107 {
1108 vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1109 return CMD_WARNING;
1110 }
1111
paul68980082003-03-25 05:07:42 +00001112 area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001113 if (!area)
1114 {
1115 vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1116 return CMD_WARNING;
1117 }
1118
1119 ret = inet_aton (argv[1], &vl_config.vl_peer);
1120 if (! ret)
1121 {
1122 vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1123 VTY_NEWLINE);
1124 return CMD_WARNING;
1125 }
1126
1127 if (argc <=2)
1128 {
1129 /* Basic VLink no command */
1130 /* Thats all folks! - BUGS B. strikes again!!!*/
Paul Jakma9c27ef92006-05-04 07:32:57 +00001131 if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
paul68980082003-03-25 05:07:42 +00001132 ospf_vl_delete (ospf, vl_data);
paul718e3742002-12-13 20:15:29 +00001133
paul68980082003-03-25 05:07:42 +00001134 ospf_area_check_free (ospf, vl_config.area_id);
paul718e3742002-12-13 20:15:29 +00001135
1136 return CMD_SUCCESS;
1137 }
1138
1139 /* If we are down here, we are reseting parameters */
1140
1141 /* Deal with other parameters */
1142 for (i=2; i < argc; i++)
1143 {
paul718e3742002-12-13 20:15:29 +00001144 /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1145
1146 switch (argv[i][0])
1147 {
1148
1149 case 'a':
1150 if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1151 {
1152 /* authentication-key - this option can occur anywhere on
1153 command line. At start of command line
1154 must check for authentication option. */
1155 memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1156 vl_config.auth_key = auth_key;
1157 }
1158 else if (strncmp (argv[i], "authentication", 14) == 0)
1159 {
1160 /* authentication - this option can only occur at start
1161 of command line */
1162 vl_config.auth_type = OSPF_AUTH_NOTSET;
1163 }
1164 break;
1165
1166 case 'm':
1167 /* message-digest-key */
1168 /* Delete one key */
1169 i++;
1170 vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1171 if (vl_config.crypto_key_id < 0)
1172 return CMD_WARNING;
1173 vl_config.md5_key = NULL;
1174 break;
1175
1176 case 'h':
1177 /* Hello interval */
1178 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1179 break;
1180
1181 case 'r':
1182 /* Retransmit Interval */
1183 vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1184 break;
1185
1186 case 't':
1187 /* Transmit Delay */
1188 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1189 break;
1190
1191 case 'd':
1192 /* Dead Interval */
1193 i++;
1194 vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1195 break;
1196 }
1197 }
1198
1199
1200 /* Action configuration */
1201
paul68980082003-03-25 05:07:42 +00001202 return ospf_vl_set (ospf, &vl_config);
paul718e3742002-12-13 20:15:29 +00001203}
1204
paula2c62832003-04-23 17:01:31 +00001205ALIAS (ospf_area_vlink,
1206 ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001207 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1208 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1209 VLINK_HELPSTR_IPADDR
1210 VLINK_HELPSTR_TIME_PARAM)
1211
paula2c62832003-04-23 17:01:31 +00001212ALIAS (no_ospf_area_vlink,
1213 no_ospf_area_vlink_param1_cmd,
paul718e3742002-12-13 20:15:29 +00001214 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1215 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1216 NO_STR
1217 VLINK_HELPSTR_IPADDR
1218 VLINK_HELPSTR_TIME_PARAM)
1219
paula2c62832003-04-23 17:01:31 +00001220ALIAS (ospf_area_vlink,
1221 ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001222 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1223 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1224 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1225 VLINK_HELPSTR_IPADDR
1226 VLINK_HELPSTR_TIME_PARAM
1227 VLINK_HELPSTR_TIME_PARAM)
1228
paula2c62832003-04-23 17:01:31 +00001229ALIAS (no_ospf_area_vlink,
1230 no_ospf_area_vlink_param2_cmd,
paul718e3742002-12-13 20:15:29 +00001231 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1232 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1233 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1234 NO_STR
1235 VLINK_HELPSTR_IPADDR
1236 VLINK_HELPSTR_TIME_PARAM
1237 VLINK_HELPSTR_TIME_PARAM)
1238
paula2c62832003-04-23 17:01:31 +00001239ALIAS (ospf_area_vlink,
1240 ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001241 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1242 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1243 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1244 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
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 (no_ospf_area_vlink,
1251 no_ospf_area_vlink_param3_cmd,
paul718e3742002-12-13 20:15:29 +00001252 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1253 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1254 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1255 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1256 NO_STR
1257 VLINK_HELPSTR_IPADDR
1258 VLINK_HELPSTR_TIME_PARAM
1259 VLINK_HELPSTR_TIME_PARAM
1260 VLINK_HELPSTR_TIME_PARAM)
1261
paula2c62832003-04-23 17:01:31 +00001262ALIAS (ospf_area_vlink,
1263 ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001264 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1265 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1266 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1267 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1268 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1269 VLINK_HELPSTR_IPADDR
1270 VLINK_HELPSTR_TIME_PARAM
1271 VLINK_HELPSTR_TIME_PARAM
1272 VLINK_HELPSTR_TIME_PARAM
1273 VLINK_HELPSTR_TIME_PARAM)
1274
paula2c62832003-04-23 17:01:31 +00001275ALIAS (no_ospf_area_vlink,
1276 no_ospf_area_vlink_param4_cmd,
paul718e3742002-12-13 20:15:29 +00001277 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1278 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1279 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1280 "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1281 "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1282 NO_STR
1283 VLINK_HELPSTR_IPADDR
1284 VLINK_HELPSTR_TIME_PARAM
1285 VLINK_HELPSTR_TIME_PARAM
1286 VLINK_HELPSTR_TIME_PARAM
1287 VLINK_HELPSTR_TIME_PARAM)
1288
paula2c62832003-04-23 17:01:31 +00001289ALIAS (ospf_area_vlink,
1290 ospf_area_vlink_authtype_args_cmd,
paul718e3742002-12-13 20:15:29 +00001291 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1292 "(authentication|) (message-digest|null)",
1293 VLINK_HELPSTR_IPADDR
1294 VLINK_HELPSTR_AUTHTYPE_ALL)
1295
paula2c62832003-04-23 17:01:31 +00001296ALIAS (ospf_area_vlink,
1297 ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001298 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1299 "(authentication|)",
1300 VLINK_HELPSTR_IPADDR
1301 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1302
paula2c62832003-04-23 17:01:31 +00001303ALIAS (no_ospf_area_vlink,
1304 no_ospf_area_vlink_authtype_cmd,
paul718e3742002-12-13 20:15:29 +00001305 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1306 "(authentication|)",
1307 NO_STR
1308 VLINK_HELPSTR_IPADDR
1309 VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1310
paula2c62832003-04-23 17:01:31 +00001311ALIAS (ospf_area_vlink,
1312 ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001313 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1314 "(message-digest-key|) <1-255> md5 KEY",
1315 VLINK_HELPSTR_IPADDR
1316 VLINK_HELPSTR_AUTH_MD5)
1317
paula2c62832003-04-23 17:01:31 +00001318ALIAS (no_ospf_area_vlink,
1319 no_ospf_area_vlink_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001320 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1321 "(message-digest-key|) <1-255>",
1322 NO_STR
1323 VLINK_HELPSTR_IPADDR
1324 VLINK_HELPSTR_AUTH_MD5)
1325
paula2c62832003-04-23 17:01:31 +00001326ALIAS (ospf_area_vlink,
1327 ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001328 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1329 "(authentication-key|) AUTH_KEY",
1330 VLINK_HELPSTR_IPADDR
1331 VLINK_HELPSTR_AUTH_SIMPLE)
1332
paula2c62832003-04-23 17:01:31 +00001333ALIAS (no_ospf_area_vlink,
1334 no_ospf_area_vlink_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001335 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1336 "(authentication-key|)",
1337 NO_STR
1338 VLINK_HELPSTR_IPADDR
1339 VLINK_HELPSTR_AUTH_SIMPLE)
1340
paula2c62832003-04-23 17:01:31 +00001341ALIAS (ospf_area_vlink,
1342 ospf_area_vlink_authtype_args_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001343 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1344 "(authentication|) (message-digest|null) "
1345 "(authentication-key|) AUTH_KEY",
1346 VLINK_HELPSTR_IPADDR
1347 VLINK_HELPSTR_AUTHTYPE_ALL
1348 VLINK_HELPSTR_AUTH_SIMPLE)
1349
paula2c62832003-04-23 17:01:31 +00001350ALIAS (ospf_area_vlink,
1351 ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001352 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1353 "(authentication|) "
1354 "(authentication-key|) AUTH_KEY",
1355 VLINK_HELPSTR_IPADDR
1356 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1357 VLINK_HELPSTR_AUTH_SIMPLE)
1358
paula2c62832003-04-23 17:01:31 +00001359ALIAS (no_ospf_area_vlink,
1360 no_ospf_area_vlink_authtype_authkey_cmd,
paul718e3742002-12-13 20:15:29 +00001361 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1362 "(authentication|) "
1363 "(authentication-key|)",
1364 NO_STR
1365 VLINK_HELPSTR_IPADDR
1366 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1367 VLINK_HELPSTR_AUTH_SIMPLE)
1368
paula2c62832003-04-23 17:01:31 +00001369ALIAS (ospf_area_vlink,
1370 ospf_area_vlink_authtype_args_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001371 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1372 "(authentication|) (message-digest|null) "
1373 "(message-digest-key|) <1-255> md5 KEY",
1374 VLINK_HELPSTR_IPADDR
1375 VLINK_HELPSTR_AUTHTYPE_ALL
1376 VLINK_HELPSTR_AUTH_MD5)
1377
paula2c62832003-04-23 17:01:31 +00001378ALIAS (ospf_area_vlink,
1379 ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001380 "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1381 "(authentication|) "
1382 "(message-digest-key|) <1-255> md5 KEY",
1383 VLINK_HELPSTR_IPADDR
1384 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1385 VLINK_HELPSTR_AUTH_MD5)
1386
paula2c62832003-04-23 17:01:31 +00001387ALIAS (no_ospf_area_vlink,
1388 no_ospf_area_vlink_authtype_md5_cmd,
paul718e3742002-12-13 20:15:29 +00001389 "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1390 "(authentication|) "
1391 "(message-digest-key|)",
1392 NO_STR
1393 VLINK_HELPSTR_IPADDR
1394 VLINK_HELPSTR_AUTHTYPE_SIMPLE
1395 VLINK_HELPSTR_AUTH_MD5)
1396
David Lamparter6b0655a2014-06-04 06:53:35 +02001397
paula2c62832003-04-23 17:01:31 +00001398DEFUN (ospf_area_shortcut,
1399 ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001400 "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1401 "OSPF area parameters\n"
1402 "OSPF area ID in IP address format\n"
1403 "OSPF area ID as a decimal value\n"
1404 "Configure the area's shortcutting mode\n"
1405 "Set default shortcutting behavior\n"
1406 "Enable shortcutting through the area\n"
1407 "Disable shortcutting through the area\n")
1408{
paul68980082003-03-25 05:07:42 +00001409 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001410 struct ospf_area *area;
1411 struct in_addr area_id;
1412 int mode;
1413 int format;
1414
1415 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1416
paul68980082003-03-25 05:07:42 +00001417 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001418
1419 if (strncmp (argv[1], "de", 2) == 0)
1420 mode = OSPF_SHORTCUT_DEFAULT;
1421 else if (strncmp (argv[1], "di", 2) == 0)
1422 mode = OSPF_SHORTCUT_DISABLE;
1423 else if (strncmp (argv[1], "e", 1) == 0)
1424 mode = OSPF_SHORTCUT_ENABLE;
1425 else
1426 return CMD_WARNING;
1427
paul68980082003-03-25 05:07:42 +00001428 ospf_area_shortcut_set (ospf, area, mode);
paul718e3742002-12-13 20:15:29 +00001429
paul68980082003-03-25 05:07:42 +00001430 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
paul718e3742002-12-13 20:15:29 +00001431 vty_out (vty, "Shortcut area setting will take effect "
1432 "only when the router is configured as Shortcut ABR%s",
1433 VTY_NEWLINE);
1434
1435 return CMD_SUCCESS;
1436}
1437
paula2c62832003-04-23 17:01:31 +00001438DEFUN (no_ospf_area_shortcut,
1439 no_ospf_area_shortcut_cmd,
paul718e3742002-12-13 20:15:29 +00001440 "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1441 NO_STR
1442 "OSPF area parameters\n"
1443 "OSPF area ID in IP address format\n"
1444 "OSPF area ID as a decimal value\n"
1445 "Deconfigure the area's shortcutting mode\n"
1446 "Deconfigure enabled shortcutting through the area\n"
1447 "Deconfigure disabled shortcutting through the area\n")
1448{
paul68980082003-03-25 05:07:42 +00001449 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001450 struct ospf_area *area;
1451 struct in_addr area_id;
1452 int format;
1453
1454 VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1455
paul68980082003-03-25 05:07:42 +00001456 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001457 if (!area)
1458 return CMD_SUCCESS;
1459
paul68980082003-03-25 05:07:42 +00001460 ospf_area_shortcut_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001461
1462 return CMD_SUCCESS;
1463}
1464
David Lamparter6b0655a2014-06-04 06:53:35 +02001465
paula2c62832003-04-23 17:01:31 +00001466DEFUN (ospf_area_stub,
1467 ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001468 "area (A.B.C.D|<0-4294967295>) stub",
1469 "OSPF area parameters\n"
1470 "OSPF area ID in IP address format\n"
1471 "OSPF area ID as a decimal value\n"
1472 "Configure OSPF area as stub\n")
1473{
1474 struct ospf *ospf = vty->index;
1475 struct in_addr area_id;
1476 int ret, format;
1477
1478 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1479
1480 ret = ospf_area_stub_set (ospf, area_id);
1481 if (ret == 0)
1482 {
1483 vty_out (vty, "First deconfigure all virtual link through this area%s",
1484 VTY_NEWLINE);
1485 return CMD_WARNING;
1486 }
1487
1488 ospf_area_no_summary_unset (ospf, area_id);
1489
1490 return CMD_SUCCESS;
1491}
1492
paula2c62832003-04-23 17:01:31 +00001493DEFUN (ospf_area_stub_no_summary,
1494 ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001495 "area (A.B.C.D|<0-4294967295>) stub no-summary",
1496 "OSPF stub parameters\n"
1497 "OSPF area ID in IP address format\n"
1498 "OSPF area ID as a decimal value\n"
1499 "Configure OSPF area as stub\n"
1500 "Do not inject inter-area routes into stub\n")
1501{
1502 struct ospf *ospf = vty->index;
1503 struct in_addr area_id;
1504 int ret, format;
1505
1506 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1507
1508 ret = ospf_area_stub_set (ospf, area_id);
1509 if (ret == 0)
1510 {
paulb0a053b2003-06-22 09:04:47 +00001511 vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
paul718e3742002-12-13 20:15:29 +00001512 VTY_NEWLINE);
1513 return CMD_WARNING;
1514 }
1515
1516 ospf_area_no_summary_set (ospf, area_id);
1517
1518 return CMD_SUCCESS;
1519}
1520
paula2c62832003-04-23 17:01:31 +00001521DEFUN (no_ospf_area_stub,
1522 no_ospf_area_stub_cmd,
paul718e3742002-12-13 20:15:29 +00001523 "no area (A.B.C.D|<0-4294967295>) stub",
1524 NO_STR
1525 "OSPF area parameters\n"
1526 "OSPF area ID in IP address format\n"
1527 "OSPF area ID as a decimal value\n"
1528 "Configure OSPF area as stub\n")
1529{
1530 struct ospf *ospf = vty->index;
1531 struct in_addr area_id;
1532 int format;
1533
1534 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1535
1536 ospf_area_stub_unset (ospf, area_id);
1537 ospf_area_no_summary_unset (ospf, area_id);
1538
1539 return CMD_SUCCESS;
1540}
1541
paula2c62832003-04-23 17:01:31 +00001542DEFUN (no_ospf_area_stub_no_summary,
1543 no_ospf_area_stub_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001544 "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1545 NO_STR
1546 "OSPF area parameters\n"
1547 "OSPF area ID in IP address format\n"
1548 "OSPF area ID as a decimal value\n"
1549 "Configure OSPF area as stub\n"
1550 "Do not inject inter-area routes into area\n")
1551{
1552 struct ospf *ospf = vty->index;
1553 struct in_addr area_id;
1554 int format;
1555
1556 VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1557 ospf_area_no_summary_unset (ospf, area_id);
1558
1559 return CMD_SUCCESS;
1560}
1561
paul4dadc292005-05-06 21:37:42 +00001562static int
paul6c835672004-10-11 11:00:30 +00001563ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1564 int nosum)
paul718e3742002-12-13 20:15:29 +00001565{
1566 struct ospf *ospf = vty->index;
1567 struct in_addr area_id;
1568 int ret, format;
1569
1570 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1571
1572 ret = ospf_area_nssa_set (ospf, area_id);
1573 if (ret == 0)
1574 {
1575 vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1576 VTY_NEWLINE);
1577 return CMD_WARNING;
1578 }
1579
1580 if (argc > 1)
1581 {
1582 if (strncmp (argv[1], "translate-c", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001583 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001584 OSPF_NSSA_ROLE_CANDIDATE);
1585 else if (strncmp (argv[1], "translate-n", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001586 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001587 OSPF_NSSA_ROLE_NEVER);
1588 else if (strncmp (argv[1], "translate-a", 11) == 0)
paulb0a053b2003-06-22 09:04:47 +00001589 ospf_area_nssa_translator_role_set (ospf, area_id,
paul718e3742002-12-13 20:15:29 +00001590 OSPF_NSSA_ROLE_ALWAYS);
1591 }
paulb0a053b2003-06-22 09:04:47 +00001592 else
1593 {
1594 ospf_area_nssa_translator_role_set (ospf, area_id,
1595 OSPF_NSSA_ROLE_CANDIDATE);
1596 }
paul718e3742002-12-13 20:15:29 +00001597
paulb0a053b2003-06-22 09:04:47 +00001598 if (nosum)
paul718e3742002-12-13 20:15:29 +00001599 ospf_area_no_summary_set (ospf, area_id);
paulb0a053b2003-06-22 09:04:47 +00001600 else
1601 ospf_area_no_summary_unset (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001602
paulb0a053b2003-06-22 09:04:47 +00001603 ospf_schedule_abr_task (ospf);
1604
paul718e3742002-12-13 20:15:29 +00001605 return CMD_SUCCESS;
1606}
1607
paulb0a053b2003-06-22 09:04:47 +00001608DEFUN (ospf_area_nssa_translate_no_summary,
paula2c62832003-04-23 17:01:31 +00001609 ospf_area_nssa_translate_no_summary_cmd,
paulb0a053b2003-06-22 09:04:47 +00001610 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
paul718e3742002-12-13 20:15:29 +00001611 "OSPF area parameters\n"
1612 "OSPF area ID in IP address format\n"
1613 "OSPF area ID as a decimal value\n"
1614 "Configure OSPF area as nssa\n"
1615 "Configure NSSA-ABR for translate election (default)\n"
1616 "Configure NSSA-ABR to never translate\n"
1617 "Configure NSSA-ABR to always translate\n"
paulb0a053b2003-06-22 09:04:47 +00001618 "Do not inject inter-area routes into nssa\n")
1619{
1620 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1621}
paul718e3742002-12-13 20:15:29 +00001622
paulb0a053b2003-06-22 09:04:47 +00001623DEFUN (ospf_area_nssa_translate,
paula2c62832003-04-23 17:01:31 +00001624 ospf_area_nssa_translate_cmd,
paul718e3742002-12-13 20:15:29 +00001625 "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1626 "OSPF area parameters\n"
1627 "OSPF area ID in IP address format\n"
1628 "OSPF area ID as a decimal value\n"
1629 "Configure OSPF area as nssa\n"
1630 "Configure NSSA-ABR for translate election (default)\n"
1631 "Configure NSSA-ABR to never translate\n"
1632 "Configure NSSA-ABR to always translate\n")
paulb0a053b2003-06-22 09:04:47 +00001633{
1634 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1635}
1636
1637DEFUN (ospf_area_nssa,
1638 ospf_area_nssa_cmd,
1639 "area (A.B.C.D|<0-4294967295>) nssa",
1640 "OSPF area parameters\n"
1641 "OSPF area ID in IP address format\n"
1642 "OSPF area ID as a decimal value\n"
1643 "Configure OSPF area as nssa\n")
1644{
1645 return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1646}
paul718e3742002-12-13 20:15:29 +00001647
paula2c62832003-04-23 17:01:31 +00001648DEFUN (ospf_area_nssa_no_summary,
1649 ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001650 "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1651 "OSPF area parameters\n"
1652 "OSPF area ID in IP address format\n"
1653 "OSPF area ID as a decimal value\n"
1654 "Configure OSPF area as nssa\n"
1655 "Do not inject inter-area routes into nssa\n")
1656{
paulb0a053b2003-06-22 09:04:47 +00001657 return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
paul718e3742002-12-13 20:15:29 +00001658}
1659
paula2c62832003-04-23 17:01:31 +00001660DEFUN (no_ospf_area_nssa,
1661 no_ospf_area_nssa_cmd,
paul718e3742002-12-13 20:15:29 +00001662 "no area (A.B.C.D|<0-4294967295>) nssa",
1663 NO_STR
1664 "OSPF area parameters\n"
1665 "OSPF area ID in IP address format\n"
1666 "OSPF area ID as a decimal value\n"
1667 "Configure OSPF area as nssa\n")
1668{
1669 struct ospf *ospf = vty->index;
1670 struct in_addr area_id;
1671 int format;
1672
1673 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1674
1675 ospf_area_nssa_unset (ospf, area_id);
1676 ospf_area_no_summary_unset (ospf, area_id);
1677
paulb0a053b2003-06-22 09:04:47 +00001678 ospf_schedule_abr_task (ospf);
1679
paul718e3742002-12-13 20:15:29 +00001680 return CMD_SUCCESS;
1681}
1682
paula2c62832003-04-23 17:01:31 +00001683DEFUN (no_ospf_area_nssa_no_summary,
1684 no_ospf_area_nssa_no_summary_cmd,
paul718e3742002-12-13 20:15:29 +00001685 "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1686 NO_STR
1687 "OSPF area parameters\n"
1688 "OSPF area ID in IP address format\n"
1689 "OSPF area ID as a decimal value\n"
1690 "Configure OSPF area as nssa\n"
1691 "Do not inject inter-area routes into nssa\n")
1692{
1693 struct ospf *ospf = vty->index;
1694 struct in_addr area_id;
1695 int format;
1696
1697 VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1698 ospf_area_no_summary_unset (ospf, area_id);
1699
1700 return CMD_SUCCESS;
1701}
1702
paula2c62832003-04-23 17:01:31 +00001703DEFUN (ospf_area_default_cost,
1704 ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001705 "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1706 "OSPF area parameters\n"
1707 "OSPF area ID in IP address format\n"
1708 "OSPF area ID as a decimal value\n"
1709 "Set the summary-default cost of a NSSA or stub area\n"
1710 "Stub's advertised default summary cost\n")
1711{
paul68980082003-03-25 05:07:42 +00001712 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001713 struct ospf_area *area;
1714 struct in_addr area_id;
1715 u_int32_t cost;
1716 int format;
vincentba682532005-09-29 13:52:57 +00001717 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001718
1719 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1720 VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1721
paul68980082003-03-25 05:07:42 +00001722 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001723
1724 if (area->external_routing == OSPF_AREA_DEFAULT)
1725 {
1726 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1727 return CMD_WARNING;
1728 }
1729
1730 area->default_cost = cost;
1731
vincentba682532005-09-29 13:52:57 +00001732 p.family = AF_INET;
1733 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1734 p.prefixlen = 0;
1735 if (IS_DEBUG_OSPF_EVENT)
1736 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1737 "announcing 0.0.0.0/0 to area %s",
1738 inet_ntoa (area->area_id));
1739 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1740
paul718e3742002-12-13 20:15:29 +00001741 return CMD_SUCCESS;
1742}
1743
paula2c62832003-04-23 17:01:31 +00001744DEFUN (no_ospf_area_default_cost,
1745 no_ospf_area_default_cost_cmd,
paul718e3742002-12-13 20:15:29 +00001746 "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1747 NO_STR
1748 "OSPF area parameters\n"
1749 "OSPF area ID in IP address format\n"
1750 "OSPF area ID as a decimal value\n"
1751 "Set the summary-default cost of a NSSA or stub area\n"
1752 "Stub's advertised default summary cost\n")
1753{
paul68980082003-03-25 05:07:42 +00001754 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001755 struct ospf_area *area;
1756 struct in_addr area_id;
paul718e3742002-12-13 20:15:29 +00001757 int format;
vincentba682532005-09-29 13:52:57 +00001758 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00001759
1760 VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
Andrew Certain0798cee2012-12-04 13:43:42 -08001761 VTY_CHECK_INTEGER_RANGE ("stub default cost", argv[1], 0, OSPF_LS_INFINITY);
paul718e3742002-12-13 20:15:29 +00001762
paul68980082003-03-25 05:07:42 +00001763 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001764 if (area == NULL)
1765 return CMD_SUCCESS;
1766
1767 if (area->external_routing == OSPF_AREA_DEFAULT)
1768 {
1769 vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1770 return CMD_WARNING;
1771 }
1772
1773 area->default_cost = 1;
1774
vincentba682532005-09-29 13:52:57 +00001775 p.family = AF_INET;
1776 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1777 p.prefixlen = 0;
1778 if (IS_DEBUG_OSPF_EVENT)
1779 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1780 "announcing 0.0.0.0/0 to area %s",
1781 inet_ntoa (area->area_id));
1782 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1783
1784
paul68980082003-03-25 05:07:42 +00001785 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001786
1787 return CMD_SUCCESS;
1788}
1789
paula2c62832003-04-23 17:01:31 +00001790DEFUN (ospf_area_export_list,
1791 ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001792 "area (A.B.C.D|<0-4294967295>) export-list NAME",
1793 "OSPF area parameters\n"
1794 "OSPF area ID in IP address format\n"
1795 "OSPF area ID as a decimal value\n"
1796 "Set the filter for networks announced to other areas\n"
1797 "Name of the access-list\n")
1798{
paul68980082003-03-25 05:07:42 +00001799 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001800 struct ospf_area *area;
1801 struct in_addr area_id;
1802 int format;
1803
hasso52930762004-04-19 18:26:53 +00001804 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1805
paul68980082003-03-25 05:07:42 +00001806 area = ospf_area_get (ospf, area_id, format);
1807 ospf_area_export_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001808
1809 return CMD_SUCCESS;
1810}
1811
paula2c62832003-04-23 17:01:31 +00001812DEFUN (no_ospf_area_export_list,
1813 no_ospf_area_export_list_cmd,
paul718e3742002-12-13 20:15:29 +00001814 "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1815 NO_STR
1816 "OSPF area parameters\n"
1817 "OSPF area ID in IP address format\n"
1818 "OSPF area ID as a decimal value\n"
1819 "Unset the filter for networks announced to other areas\n"
1820 "Name of the access-list\n")
1821{
paul68980082003-03-25 05:07:42 +00001822 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001823 struct ospf_area *area;
1824 struct in_addr area_id;
1825 int format;
1826
hasso52930762004-04-19 18:26:53 +00001827 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1828
paul68980082003-03-25 05:07:42 +00001829 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001830 if (area == NULL)
1831 return CMD_SUCCESS;
1832
paul68980082003-03-25 05:07:42 +00001833 ospf_area_export_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001834
1835 return CMD_SUCCESS;
1836}
1837
1838
paula2c62832003-04-23 17:01:31 +00001839DEFUN (ospf_area_import_list,
1840 ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001841 "area (A.B.C.D|<0-4294967295>) import-list NAME",
1842 "OSPF area parameters\n"
1843 "OSPF area ID in IP address format\n"
1844 "OSPF area ID as a decimal value\n"
1845 "Set the filter for networks from other areas announced to the specified one\n"
1846 "Name of the access-list\n")
1847{
paul68980082003-03-25 05:07:42 +00001848 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001849 struct ospf_area *area;
1850 struct in_addr area_id;
1851 int format;
1852
hasso52930762004-04-19 18:26:53 +00001853 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1854
paul68980082003-03-25 05:07:42 +00001855 area = ospf_area_get (ospf, area_id, format);
1856 ospf_area_import_list_set (ospf, area, argv[1]);
paul718e3742002-12-13 20:15:29 +00001857
1858 return CMD_SUCCESS;
1859}
1860
paula2c62832003-04-23 17:01:31 +00001861DEFUN (no_ospf_area_import_list,
1862 no_ospf_area_import_list_cmd,
paul718e3742002-12-13 20:15:29 +00001863 "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1864 NO_STR
1865 "OSPF area parameters\n"
1866 "OSPF area ID in IP address format\n"
1867 "OSPF area ID as a decimal value\n"
1868 "Unset the filter for networks announced to other areas\n"
1869 "Name of the access-list\n")
1870{
paul68980082003-03-25 05:07:42 +00001871 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001872 struct ospf_area *area;
1873 struct in_addr area_id;
1874 int format;
1875
hasso52930762004-04-19 18:26:53 +00001876 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1877
paul68980082003-03-25 05:07:42 +00001878 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00001879 if (area == NULL)
1880 return CMD_SUCCESS;
1881
paul68980082003-03-25 05:07:42 +00001882 ospf_area_import_list_unset (ospf, area);
paul718e3742002-12-13 20:15:29 +00001883
1884 return CMD_SUCCESS;
1885}
1886
paula2c62832003-04-23 17:01:31 +00001887DEFUN (ospf_area_filter_list,
1888 ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001889 "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1890 "OSPF area parameters\n"
1891 "OSPF area ID in IP address format\n"
1892 "OSPF area ID as a decimal value\n"
1893 "Filter networks between OSPF areas\n"
1894 "Filter prefixes between OSPF areas\n"
1895 "Name of an IP prefix-list\n"
1896 "Filter networks sent to this area\n"
1897 "Filter networks sent from this area\n")
1898{
paul68980082003-03-25 05:07:42 +00001899 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001900 struct ospf_area *area;
1901 struct in_addr area_id;
1902 struct prefix_list *plist;
1903 int format;
1904
1905 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1906
paul68980082003-03-25 05:07:42 +00001907 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00001908 plist = prefix_list_lookup (AFI_IP, argv[1]);
1909 if (strncmp (argv[2], "in", 2) == 0)
1910 {
1911 PREFIX_LIST_IN (area) = plist;
1912 if (PREFIX_NAME_IN (area))
1913 free (PREFIX_NAME_IN (area));
1914
1915 PREFIX_NAME_IN (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001916 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001917 }
1918 else
1919 {
1920 PREFIX_LIST_OUT (area) = plist;
1921 if (PREFIX_NAME_OUT (area))
1922 free (PREFIX_NAME_OUT (area));
1923
1924 PREFIX_NAME_OUT (area) = strdup (argv[1]);
paul68980082003-03-25 05:07:42 +00001925 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001926 }
1927
1928 return CMD_SUCCESS;
1929}
1930
paula2c62832003-04-23 17:01:31 +00001931DEFUN (no_ospf_area_filter_list,
1932 no_ospf_area_filter_list_cmd,
paul718e3742002-12-13 20:15:29 +00001933 "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1934 NO_STR
1935 "OSPF area parameters\n"
1936 "OSPF area ID in IP address format\n"
1937 "OSPF area ID as a decimal value\n"
1938 "Filter networks between OSPF areas\n"
1939 "Filter prefixes between OSPF areas\n"
1940 "Name of an IP prefix-list\n"
1941 "Filter networks sent to this area\n"
1942 "Filter networks sent from this area\n")
1943{
paul68980082003-03-25 05:07:42 +00001944 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001945 struct ospf_area *area;
1946 struct in_addr area_id;
paul718e3742002-12-13 20:15:29 +00001947 int format;
1948
1949 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1950
Paul Jakma1a8ec2b2006-05-11 13:34:08 +00001951 if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1952 return CMD_SUCCESS;
1953
paul718e3742002-12-13 20:15:29 +00001954 if (strncmp (argv[2], "in", 2) == 0)
1955 {
1956 if (PREFIX_NAME_IN (area))
1957 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1958 return CMD_SUCCESS;
1959
1960 PREFIX_LIST_IN (area) = NULL;
1961 if (PREFIX_NAME_IN (area))
1962 free (PREFIX_NAME_IN (area));
1963
1964 PREFIX_NAME_IN (area) = NULL;
1965
paul68980082003-03-25 05:07:42 +00001966 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001967 }
1968 else
1969 {
1970 if (PREFIX_NAME_OUT (area))
1971 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1972 return CMD_SUCCESS;
1973
1974 PREFIX_LIST_OUT (area) = NULL;
1975 if (PREFIX_NAME_OUT (area))
1976 free (PREFIX_NAME_OUT (area));
1977
1978 PREFIX_NAME_OUT (area) = NULL;
1979
paul68980082003-03-25 05:07:42 +00001980 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00001981 }
1982
1983 return CMD_SUCCESS;
1984}
1985
David Lamparter6b0655a2014-06-04 06:53:35 +02001986
paula2c62832003-04-23 17:01:31 +00001987DEFUN (ospf_area_authentication_message_digest,
1988 ospf_area_authentication_message_digest_cmd,
paul718e3742002-12-13 20:15:29 +00001989 "area (A.B.C.D|<0-4294967295>) authentication message-digest",
1990 "OSPF area parameters\n"
Christian Franke2b005152013-09-30 12:27:49 +00001991 "OSPF area ID in IP address format\n"
1992 "OSPF area ID as a decimal value\n"
paul718e3742002-12-13 20:15:29 +00001993 "Enable authentication\n"
1994 "Use message-digest authentication\n")
1995{
paul68980082003-03-25 05:07:42 +00001996 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00001997 struct ospf_area *area;
1998 struct in_addr area_id;
1999 int format;
2000
2001 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2002
paul68980082003-03-25 05:07:42 +00002003 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002004 area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
2005
2006 return CMD_SUCCESS;
2007}
2008
paula2c62832003-04-23 17:01:31 +00002009DEFUN (ospf_area_authentication,
2010 ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002011 "area (A.B.C.D|<0-4294967295>) authentication",
2012 "OSPF area parameters\n"
2013 "OSPF area ID in IP address format\n"
2014 "OSPF area ID as a decimal value\n"
2015 "Enable authentication\n")
2016{
paul68980082003-03-25 05:07:42 +00002017 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002018 struct ospf_area *area;
2019 struct in_addr area_id;
2020 int format;
2021
2022 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2023
paul68980082003-03-25 05:07:42 +00002024 area = ospf_area_get (ospf, area_id, format);
paul718e3742002-12-13 20:15:29 +00002025 area->auth_type = OSPF_AUTH_SIMPLE;
2026
2027 return CMD_SUCCESS;
2028}
2029
paula2c62832003-04-23 17:01:31 +00002030DEFUN (no_ospf_area_authentication,
2031 no_ospf_area_authentication_cmd,
paul718e3742002-12-13 20:15:29 +00002032 "no area (A.B.C.D|<0-4294967295>) authentication",
2033 NO_STR
2034 "OSPF area parameters\n"
2035 "OSPF area ID in IP address format\n"
2036 "OSPF area ID as a decimal value\n"
2037 "Enable authentication\n")
2038{
paul68980082003-03-25 05:07:42 +00002039 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002040 struct ospf_area *area;
2041 struct in_addr area_id;
2042 int format;
2043
2044 VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2045
paul68980082003-03-25 05:07:42 +00002046 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002047 if (area == NULL)
2048 return CMD_SUCCESS;
2049
2050 area->auth_type = OSPF_AUTH_NULL;
2051
paul68980082003-03-25 05:07:42 +00002052 ospf_area_check_free (ospf, area_id);
paul718e3742002-12-13 20:15:29 +00002053
2054 return CMD_SUCCESS;
2055}
2056
David Lamparter6b0655a2014-06-04 06:53:35 +02002057
paul718e3742002-12-13 20:15:29 +00002058DEFUN (ospf_abr_type,
2059 ospf_abr_type_cmd,
2060 "ospf abr-type (cisco|ibm|shortcut|standard)",
2061 "OSPF specific commands\n"
2062 "Set OSPF ABR type\n"
2063 "Alternative ABR, cisco implementation\n"
2064 "Alternative ABR, IBM implementation\n"
2065 "Shortcut ABR\n"
2066 "Standard behavior (RFC2328)\n")
2067{
paul68980082003-03-25 05:07:42 +00002068 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002069 u_char abr_type = OSPF_ABR_UNKNOWN;
2070
2071 if (strncmp (argv[0], "c", 1) == 0)
2072 abr_type = OSPF_ABR_CISCO;
2073 else if (strncmp (argv[0], "i", 1) == 0)
2074 abr_type = OSPF_ABR_IBM;
2075 else if (strncmp (argv[0], "sh", 2) == 0)
2076 abr_type = OSPF_ABR_SHORTCUT;
2077 else if (strncmp (argv[0], "st", 2) == 0)
2078 abr_type = OSPF_ABR_STAND;
2079 else
2080 return CMD_WARNING;
2081
2082 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002083 if (ospf->abr_type != abr_type)
paul718e3742002-12-13 20:15:29 +00002084 {
paul68980082003-03-25 05:07:42 +00002085 ospf->abr_type = abr_type;
2086 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002087 }
2088
2089 return CMD_SUCCESS;
2090}
2091
2092DEFUN (no_ospf_abr_type,
2093 no_ospf_abr_type_cmd,
pauld57834f2005-07-12 20:04:22 +00002094 "no ospf abr-type (cisco|ibm|shortcut|standard)",
paul718e3742002-12-13 20:15:29 +00002095 NO_STR
2096 "OSPF specific commands\n"
2097 "Set OSPF ABR type\n"
2098 "Alternative ABR, cisco implementation\n"
2099 "Alternative ABR, IBM implementation\n"
2100 "Shortcut ABR\n")
2101{
paul68980082003-03-25 05:07:42 +00002102 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002103 u_char abr_type = OSPF_ABR_UNKNOWN;
2104
2105 if (strncmp (argv[0], "c", 1) == 0)
2106 abr_type = OSPF_ABR_CISCO;
2107 else if (strncmp (argv[0], "i", 1) == 0)
2108 abr_type = OSPF_ABR_IBM;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002109 else if (strncmp (argv[0], "sh", 2) == 0)
paul718e3742002-12-13 20:15:29 +00002110 abr_type = OSPF_ABR_SHORTCUT;
Francesco Dolcini04d23312009-06-02 18:20:09 +01002111 else if (strncmp (argv[0], "st", 2) == 0)
2112 abr_type = OSPF_ABR_STAND;
paul718e3742002-12-13 20:15:29 +00002113 else
2114 return CMD_WARNING;
2115
2116 /* If ABR type value is changed, schedule ABR task. */
paul68980082003-03-25 05:07:42 +00002117 if (ospf->abr_type == abr_type)
paul718e3742002-12-13 20:15:29 +00002118 {
pauld57834f2005-07-12 20:04:22 +00002119 ospf->abr_type = OSPF_ABR_DEFAULT;
paul68980082003-03-25 05:07:42 +00002120 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +00002121 }
2122
2123 return CMD_SUCCESS;
2124}
2125
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002126DEFUN (ospf_log_adjacency_changes,
2127 ospf_log_adjacency_changes_cmd,
2128 "log-adjacency-changes",
2129 "Log changes in adjacency state\n")
2130{
2131 struct ospf *ospf = vty->index;
2132
2133 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2134 return CMD_SUCCESS;
2135}
2136
2137DEFUN (ospf_log_adjacency_changes_detail,
2138 ospf_log_adjacency_changes_detail_cmd,
2139 "log-adjacency-changes detail",
2140 "Log changes in adjacency state\n"
2141 "Log all state changes\n")
2142{
2143 struct ospf *ospf = vty->index;
2144
2145 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2146 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2147 return CMD_SUCCESS;
2148}
2149
2150DEFUN (no_ospf_log_adjacency_changes,
2151 no_ospf_log_adjacency_changes_cmd,
2152 "no log-adjacency-changes",
2153 NO_STR
2154 "Log changes in adjacency state\n")
2155{
2156 struct ospf *ospf = vty->index;
2157
2158 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2159 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2160 return CMD_SUCCESS;
2161}
2162
2163DEFUN (no_ospf_log_adjacency_changes_detail,
2164 no_ospf_log_adjacency_changes_detail_cmd,
2165 "no log-adjacency-changes detail",
2166 NO_STR
2167 "Log changes in adjacency state\n"
2168 "Log all state changes\n")
2169{
2170 struct ospf *ospf = vty->index;
2171
2172 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2173 return CMD_SUCCESS;
2174}
2175
paul718e3742002-12-13 20:15:29 +00002176DEFUN (ospf_compatible_rfc1583,
2177 ospf_compatible_rfc1583_cmd,
2178 "compatible rfc1583",
2179 "OSPF compatibility list\n"
2180 "compatible with RFC 1583\n")
2181{
2182 struct ospf *ospf = vty->index;
2183
2184 if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2185 {
2186 SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
Paul Jakmab6eef002014-10-09 14:19:51 +01002187 ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
paul718e3742002-12-13 20:15:29 +00002188 }
2189 return CMD_SUCCESS;
2190}
2191
2192DEFUN (no_ospf_compatible_rfc1583,
2193 no_ospf_compatible_rfc1583_cmd,
2194 "no compatible rfc1583",
2195 NO_STR
2196 "OSPF compatibility list\n"
2197 "compatible with RFC 1583\n")
2198{
2199 struct ospf *ospf = vty->index;
2200
2201 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2202 {
2203 UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
Paul Jakmab6eef002014-10-09 14:19:51 +01002204 ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
paul718e3742002-12-13 20:15:29 +00002205 }
2206 return CMD_SUCCESS;
2207}
2208
2209ALIAS (ospf_compatible_rfc1583,
2210 ospf_rfc1583_flag_cmd,
2211 "ospf rfc1583compatibility",
2212 "OSPF specific commands\n"
2213 "Enable the RFC1583Compatibility flag\n")
2214
2215ALIAS (no_ospf_compatible_rfc1583,
2216 no_ospf_rfc1583_flag_cmd,
2217 "no ospf rfc1583compatibility",
2218 NO_STR
2219 "OSPF specific commands\n"
2220 "Disable the RFC1583Compatibility flag\n")
David Lamparter6b0655a2014-06-04 06:53:35 +02002221
pauld24f6e22005-10-21 09:23:12 +00002222static int
2223ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2224 unsigned int hold,
2225 unsigned int max)
2226{
2227 struct ospf *ospf = vty->index;
2228
2229 ospf->spf_delay = delay;
2230 ospf->spf_holdtime = hold;
2231 ospf->spf_max_holdtime = max;
2232
2233 return CMD_SUCCESS;
2234}
paul718e3742002-12-13 20:15:29 +00002235
pauld24f6e22005-10-21 09:23:12 +00002236DEFUN (ospf_timers_throttle_spf,
2237 ospf_timers_throttle_spf_cmd,
2238 "timers throttle spf <0-600000> <0-600000> <0-600000>",
2239 "Adjust routing timers\n"
2240 "Throttling adaptive timer\n"
2241 "OSPF SPF timers\n"
2242 "Delay (msec) from first change received till SPF calculation\n"
2243 "Initial hold time (msec) between consecutive SPF calculations\n"
2244 "Maximum hold time (msec)\n")
2245{
2246 unsigned int delay, hold, max;
2247
2248 if (argc != 3)
2249 {
2250 vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2251 return CMD_WARNING;
2252 }
2253
2254 VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2255 VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2256 VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2257
2258 return ospf_timers_spf_set (vty, delay, hold, max);
2259}
2260
2261DEFUN_DEPRECATED (ospf_timers_spf,
paula2c62832003-04-23 17:01:31 +00002262 ospf_timers_spf_cmd,
paul718e3742002-12-13 20:15:29 +00002263 "timers spf <0-4294967295> <0-4294967295>",
2264 "Adjust routing timers\n"
2265 "OSPF SPF timers\n"
pauld24f6e22005-10-21 09:23:12 +00002266 "Delay (s) between receiving a change to SPF calculation\n"
2267 "Hold time (s) between consecutive SPF calculations\n")
paul718e3742002-12-13 20:15:29 +00002268{
pauld24f6e22005-10-21 09:23:12 +00002269 unsigned int delay, hold;
2270
2271 if (argc != 2)
2272 {
2273 vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2274 return CMD_WARNING;
2275 }
2276
paul4dadc292005-05-06 21:37:42 +00002277 VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2278 VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
pauld24f6e22005-10-21 09:23:12 +00002279
2280 /* truncate down the second values if they're greater than 600000ms */
2281 if (delay > (600000 / 1000))
2282 delay = 600000;
2283 else if (delay == 0)
2284 /* 0s delay was probably specified because of lack of ms resolution */
2285 delay = OSPF_SPF_DELAY_DEFAULT;
2286 if (hold > (600000 / 1000))
2287 hold = 600000;
2288
2289 return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
paul718e3742002-12-13 20:15:29 +00002290}
2291
pauld24f6e22005-10-21 09:23:12 +00002292DEFUN (no_ospf_timers_throttle_spf,
2293 no_ospf_timers_throttle_spf_cmd,
2294 "no timers throttle spf",
paul718e3742002-12-13 20:15:29 +00002295 NO_STR
2296 "Adjust routing timers\n"
pauld24f6e22005-10-21 09:23:12 +00002297 "Throttling adaptive timer\n"
paul718e3742002-12-13 20:15:29 +00002298 "OSPF SPF timers\n")
2299{
pauld24f6e22005-10-21 09:23:12 +00002300 return ospf_timers_spf_set (vty,
2301 OSPF_SPF_DELAY_DEFAULT,
2302 OSPF_SPF_HOLDTIME_DEFAULT,
2303 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
paul718e3742002-12-13 20:15:29 +00002304}
2305
pauld24f6e22005-10-21 09:23:12 +00002306ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2307 no_ospf_timers_spf_cmd,
2308 "no timers spf",
2309 NO_STR
2310 "Adjust routing timers\n"
2311 "OSPF SPF timers\n")
David Lamparter6b0655a2014-06-04 06:53:35 +02002312
paula2c62832003-04-23 17:01:31 +00002313DEFUN (ospf_neighbor,
2314 ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002315 "neighbor A.B.C.D",
2316 NEIGHBOR_STR
2317 "Neighbor IP address\n")
2318{
2319 struct ospf *ospf = vty->index;
2320 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002321 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2322 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002323
2324 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2325
2326 if (argc > 1)
2327 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2328
2329 if (argc > 2)
2330 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2331
2332 ospf_nbr_nbma_set (ospf, nbr_addr);
2333 if (argc > 1)
2334 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2335 if (argc > 2)
Andrew Certain1a61ad12012-12-04 12:50:23 -08002336 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
paul718e3742002-12-13 20:15:29 +00002337
2338 return CMD_SUCCESS;
2339}
2340
paula2c62832003-04-23 17:01:31 +00002341ALIAS (ospf_neighbor,
2342 ospf_neighbor_priority_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002343 "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2344 NEIGHBOR_STR
2345 "Neighbor IP address\n"
2346 "Neighbor Priority\n"
2347 "Priority\n"
2348 "Dead Neighbor Polling interval\n"
2349 "Seconds\n")
2350
paula2c62832003-04-23 17:01:31 +00002351ALIAS (ospf_neighbor,
2352 ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002353 "neighbor A.B.C.D priority <0-255>",
2354 NEIGHBOR_STR
2355 "Neighbor IP address\n"
2356 "Neighbor Priority\n"
2357 "Seconds\n")
2358
paula2c62832003-04-23 17:01:31 +00002359DEFUN (ospf_neighbor_poll_interval,
2360 ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002361 "neighbor A.B.C.D poll-interval <1-65535>",
2362 NEIGHBOR_STR
2363 "Neighbor IP address\n"
2364 "Dead Neighbor Polling interval\n"
2365 "Seconds\n")
2366{
2367 struct ospf *ospf = vty->index;
2368 struct in_addr nbr_addr;
hassoeb1ce602004-10-08 08:17:22 +00002369 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2370 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00002371
2372 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2373
2374 if (argc > 1)
2375 VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2376
2377 if (argc > 2)
2378 VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2379
2380 ospf_nbr_nbma_set (ospf, nbr_addr);
2381 if (argc > 1)
2382 ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2383 if (argc > 2)
2384 ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2385
2386 return CMD_SUCCESS;
2387}
2388
paula2c62832003-04-23 17:01:31 +00002389ALIAS (ospf_neighbor_poll_interval,
2390 ospf_neighbor_poll_interval_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002391 "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2392 NEIGHBOR_STR
2393 "Neighbor address\n"
2394 "OSPF dead-router polling interval\n"
2395 "Seconds\n"
2396 "OSPF priority of non-broadcast neighbor\n"
2397 "Priority\n")
2398
paula2c62832003-04-23 17:01:31 +00002399DEFUN (no_ospf_neighbor,
2400 no_ospf_neighbor_cmd,
paul718e3742002-12-13 20:15:29 +00002401 "no neighbor A.B.C.D",
2402 NO_STR
2403 NEIGHBOR_STR
2404 "Neighbor IP address\n")
2405{
2406 struct ospf *ospf = vty->index;
2407 struct in_addr nbr_addr;
paul718e3742002-12-13 20:15:29 +00002408
2409 VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2410
Andrew Certain0798cee2012-12-04 13:43:42 -08002411 (void)ospf_nbr_nbma_unset (ospf, nbr_addr);
paul718e3742002-12-13 20:15:29 +00002412
2413 return CMD_SUCCESS;
2414}
2415
paula2c62832003-04-23 17:01:31 +00002416ALIAS (no_ospf_neighbor,
2417 no_ospf_neighbor_priority_cmd,
paul718e3742002-12-13 20:15:29 +00002418 "no neighbor A.B.C.D priority <0-255>",
2419 NO_STR
2420 NEIGHBOR_STR
2421 "Neighbor IP address\n"
2422 "Neighbor Priority\n"
2423 "Priority\n")
2424
paula2c62832003-04-23 17:01:31 +00002425ALIAS (no_ospf_neighbor,
2426 no_ospf_neighbor_poll_interval_cmd,
paul718e3742002-12-13 20:15:29 +00002427 "no neighbor A.B.C.D poll-interval <1-65535>",
2428 NO_STR
2429 NEIGHBOR_STR
2430 "Neighbor IP address\n"
2431 "Dead Neighbor Polling interval\n"
2432 "Seconds\n")
2433
paula2c62832003-04-23 17:01:31 +00002434ALIAS (no_ospf_neighbor,
2435 no_ospf_neighbor_priority_pollinterval_cmd,
paul718e3742002-12-13 20:15:29 +00002436 "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2437 NO_STR
2438 NEIGHBOR_STR
2439 "Neighbor IP address\n"
2440 "Neighbor Priority\n"
2441 "Priority\n"
2442 "Dead Neighbor Polling interval\n"
2443 "Seconds\n")
2444
David Lamparter6b0655a2014-06-04 06:53:35 +02002445
paula2c62832003-04-23 17:01:31 +00002446DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002447 "refresh timer <10-1800>",
2448 "Adjust refresh parameters\n"
2449 "Set refresh timer\n"
2450 "Timer value in seconds\n")
2451{
2452 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002453 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002454
2455 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2456 interval = (interval / 10) * 10;
2457
2458 ospf_timers_refresh_set (ospf, interval);
2459
2460 return CMD_SUCCESS;
2461}
2462
paula2c62832003-04-23 17:01:31 +00002463DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
paul718e3742002-12-13 20:15:29 +00002464 "no refresh timer <10-1800>",
2465 "Adjust refresh parameters\n"
2466 "Unset refresh timer\n"
2467 "Timer value in seconds\n")
2468{
2469 struct ospf *ospf = vty->index;
hassoeb1ce602004-10-08 08:17:22 +00002470 unsigned int interval;
paul718e3742002-12-13 20:15:29 +00002471
2472 if (argc == 1)
2473 {
2474 VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2475
2476 if (ospf->lsa_refresh_interval != interval ||
2477 interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2478 return CMD_SUCCESS;
2479 }
2480
2481 ospf_timers_refresh_unset (ospf);
2482
2483 return CMD_SUCCESS;
2484}
2485
paula2c62832003-04-23 17:01:31 +00002486ALIAS (no_ospf_refresh_timer,
2487 no_ospf_refresh_timer_cmd,
paul718e3742002-12-13 20:15:29 +00002488 "no refresh timer",
2489 "Adjust refresh parameters\n"
2490 "Unset refresh timer\n")
2491
paula2c62832003-04-23 17:01:31 +00002492DEFUN (ospf_auto_cost_reference_bandwidth,
2493 ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002494 "auto-cost reference-bandwidth <1-4294967>",
2495 "Calculate OSPF interface cost according to bandwidth\n"
2496 "Use reference bandwidth method to assign OSPF cost\n"
2497 "The reference bandwidth in terms of Mbits per second\n")
2498{
paul68980082003-03-25 05:07:42 +00002499 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00002500 u_int32_t refbw;
hasso52dc7ee2004-09-23 19:18:23 +00002501 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00002502 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002503
2504 refbw = strtol (argv[0], NULL, 10);
2505 if (refbw < 1 || refbw > 4294967)
2506 {
2507 vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2508 return CMD_WARNING;
2509 }
2510
2511 /* If reference bandwidth is changed. */
paul68980082003-03-25 05:07:42 +00002512 if ((refbw * 1000) == ospf->ref_bandwidth)
paul718e3742002-12-13 20:15:29 +00002513 return CMD_SUCCESS;
2514
paul68980082003-03-25 05:07:42 +00002515 ospf->ref_bandwidth = refbw * 1000;
paul1eb8ef22005-04-07 07:30:20 +00002516 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2517 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002518
2519 return CMD_SUCCESS;
2520}
2521
paula2c62832003-04-23 17:01:31 +00002522DEFUN (no_ospf_auto_cost_reference_bandwidth,
2523 no_ospf_auto_cost_reference_bandwidth_cmd,
paul718e3742002-12-13 20:15:29 +00002524 "no auto-cost reference-bandwidth",
2525 NO_STR
2526 "Calculate OSPF interface cost according to bandwidth\n"
2527 "Use reference bandwidth method to assign OSPF cost\n")
2528{
paul68980082003-03-25 05:07:42 +00002529 struct ospf *ospf = vty->index;
paul1eb8ef22005-04-07 07:30:20 +00002530 struct listnode *node, *nnode;
2531 struct interface *ifp;
paul718e3742002-12-13 20:15:29 +00002532
paul68980082003-03-25 05:07:42 +00002533 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
paul718e3742002-12-13 20:15:29 +00002534 return CMD_SUCCESS;
2535
paul68980082003-03-25 05:07:42 +00002536 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
paul718e3742002-12-13 20:15:29 +00002537 vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2538 vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2539
paul1eb8ef22005-04-07 07:30:20 +00002540 for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2541 ospf_if_recalculate_output_cost (ifp);
paul718e3742002-12-13 20:15:29 +00002542
2543 return CMD_SUCCESS;
2544}
2545
hassoeb1ce602004-10-08 08:17:22 +00002546const char *ospf_abr_type_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002547{
2548 "Unknown",
2549 "Standard (RFC2328)",
2550 "Alternative IBM",
2551 "Alternative Cisco",
2552 "Alternative Shortcut"
2553};
2554
hassoeb1ce602004-10-08 08:17:22 +00002555const char *ospf_shortcut_mode_descr_str[] =
paul718e3742002-12-13 20:15:29 +00002556{
2557 "Default",
2558 "Enabled",
2559 "Disabled"
2560};
2561
2562
David Lamparter6b0655a2014-06-04 06:53:35 +02002563
paul4dadc292005-05-06 21:37:42 +00002564static void
paul718e3742002-12-13 20:15:29 +00002565show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2566{
2567 /* Show Area ID. */
2568 vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2569
2570 /* Show Area type/mode. */
2571 if (OSPF_IS_AREA_BACKBONE (area))
2572 vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2573 else
2574 {
2575 if (area->external_routing == OSPF_AREA_STUB)
paulb0a053b2003-06-22 09:04:47 +00002576 vty_out (vty, " (Stub%s%s)",
2577 area->no_summary ? ", no summary" : "",
2578 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002579
paulb0a053b2003-06-22 09:04:47 +00002580 else if (area->external_routing == OSPF_AREA_NSSA)
2581 vty_out (vty, " (NSSA%s%s)",
2582 area->no_summary ? ", no summary" : "",
2583 area->shortcut_configured ? "; " : "");
paul718e3742002-12-13 20:15:29 +00002584
2585 vty_out (vty, "%s", VTY_NEWLINE);
2586 vty_out (vty, " Shortcutting mode: %s",
paulb0a053b2003-06-22 09:04:47 +00002587 ospf_shortcut_mode_descr_str[area->shortcut_configured]);
paul718e3742002-12-13 20:15:29 +00002588 vty_out (vty, ", S-bit consensus: %s%s",
paulb0a053b2003-06-22 09:04:47 +00002589 area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002590 }
2591
2592 /* Show number of interfaces. */
2593 vty_out (vty, " Number of interfaces in this area: Total: %d, "
2594 "Active: %d%s", listcount (area->oiflist),
2595 area->act_ints, VTY_NEWLINE);
2596
paul718e3742002-12-13 20:15:29 +00002597 if (area->external_routing == OSPF_AREA_NSSA)
2598 {
2599 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 +00002600 if (! IS_OSPF_ABR (area->ospf))
paulb0a053b2003-06-22 09:04:47 +00002601 vty_out (vty, " It is not ABR, therefore not Translator. %s",
2602 VTY_NEWLINE);
2603 else if (area->NSSATranslatorState)
2604 {
2605 vty_out (vty, " We are an ABR and ");
2606 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2607 vty_out (vty, "the NSSA Elected Translator. %s",
2608 VTY_NEWLINE);
2609 else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2610 vty_out (vty, "always an NSSA Translator. %s",
2611 VTY_NEWLINE);
2612 }
paul718e3742002-12-13 20:15:29 +00002613 else
paulb0a053b2003-06-22 09:04:47 +00002614 {
2615 vty_out (vty, " We are an ABR, but ");
2616 if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2617 vty_out (vty, "not the NSSA Elected Translator. %s",
2618 VTY_NEWLINE);
2619 else
hassoc6b87812004-12-22 13:09:59 +00002620 vty_out (vty, "never an NSSA Translator. %s",
paulb0a053b2003-06-22 09:04:47 +00002621 VTY_NEWLINE);
2622 }
paul718e3742002-12-13 20:15:29 +00002623 }
paul88d6cf32005-10-29 12:50:09 +00002624 /* Stub-router state for this area */
2625 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2626 {
ajs649654a2005-11-16 20:17:52 +00002627 char timebuf[OSPF_TIME_DUMP_SIZE];
paul88d6cf32005-10-29 12:50:09 +00002628 vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2629 VTY_NEWLINE);
2630 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2631 vty_out (vty, " Administratively activated (indefinitely)%s",
2632 VTY_NEWLINE);
2633 if (area->t_stub_router)
2634 vty_out (vty, " Active from startup, %s remaining%s",
2635 ospf_timer_dump (area->t_stub_router, timebuf,
2636 sizeof(timebuf)), VTY_NEWLINE);
2637 }
2638
paul718e3742002-12-13 20:15:29 +00002639 /* Show number of fully adjacent neighbors. */
2640 vty_out (vty, " Number of fully adjacent neighbors in this area:"
paulb0a053b2003-06-22 09:04:47 +00002641 " %d%s", area->full_nbrs, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002642
2643 /* Show authentication type. */
2644 vty_out (vty, " Area has ");
2645 if (area->auth_type == OSPF_AUTH_NULL)
2646 vty_out (vty, "no authentication%s", VTY_NEWLINE);
2647 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2648 vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2649 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2650 vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2651
2652 if (!OSPF_IS_AREA_BACKBONE (area))
2653 vty_out (vty, " Number of full virtual adjacencies going through"
2654 " this area: %d%s", area->full_vls, VTY_NEWLINE);
2655
2656 /* Show SPF calculation times. */
2657 vty_out (vty, " SPF algorithm executed %d times%s",
2658 area->spf_calculation, VTY_NEWLINE);
2659
2660 /* Show number of LSA. */
2661 vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
hassofe71a972004-12-22 16:16:02 +00002662 vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2663 ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2664 ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2665 vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2666 ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2667 ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2668 vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2669 ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2670 ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2671 vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2672 ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2673 ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2674 vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2675 ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2676 ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2677#ifdef HAVE_OPAQUE_LSA
2678 vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2679 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2680 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2681 vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2682 ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2683 ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2684#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002685 vty_out (vty, "%s", VTY_NEWLINE);
2686}
2687
2688DEFUN (show_ip_ospf,
2689 show_ip_ospf_cmd,
2690 "show ip ospf",
2691 SHOW_STR
2692 IP_STR
2693 "OSPF information\n")
2694{
paul1eb8ef22005-04-07 07:30:20 +00002695 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00002696 struct ospf_area * area;
paul020709f2003-04-04 02:44:16 +00002697 struct ospf *ospf;
pauld24f6e22005-10-21 09:23:12 +00002698 struct timeval result;
ajs649654a2005-11-16 20:17:52 +00002699 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00002700
2701 /* Check OSPF is enable. */
paul020709f2003-04-04 02:44:16 +00002702 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00002703 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00002704 {
2705 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2706 return CMD_SUCCESS;
2707 }
2708
2709 /* Show Router ID. */
2710 vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
paul68980082003-03-25 05:07:42 +00002711 inet_ntoa (ospf->router_id),
paul718e3742002-12-13 20:15:29 +00002712 VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00002713
2714 /* Graceful shutdown */
paulc9c93d52005-11-26 13:31:11 +00002715 if (ospf->t_deferred_shutdown)
2716 vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2717 ospf_timer_dump (ospf->t_deferred_shutdown,
paul88d6cf32005-10-29 12:50:09 +00002718 timebuf, sizeof (timebuf)), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002719 /* Show capability. */
2720 vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2721 vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2722 vty_out (vty, " RFC1583Compatibility flag is %s%s",
paul68980082003-03-25 05:07:42 +00002723 CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
paul718e3742002-12-13 20:15:29 +00002724 "enabled" : "disabled", VTY_NEWLINE);
2725#ifdef HAVE_OPAQUE_LSA
Paul Jakmae30677a2015-01-20 15:45:36 +00002726 vty_out (vty, " OpaqueCapability flag is %s%s",
paul68980082003-03-25 05:07:42 +00002727 CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
paul718e3742002-12-13 20:15:29 +00002728 "enabled" : "disabled",
paul718e3742002-12-13 20:15:29 +00002729 VTY_NEWLINE);
2730#endif /* HAVE_OPAQUE_LSA */
paul88d6cf32005-10-29 12:50:09 +00002731
2732 /* Show stub-router configuration */
2733 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2734 || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2735 {
2736 vty_out (vty, " Stub router advertisement is configured%s",
2737 VTY_NEWLINE);
2738 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2739 vty_out (vty, " Enabled for %us after start-up%s",
2740 ospf->stub_router_startup_time, VTY_NEWLINE);
2741 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2742 vty_out (vty, " Enabled for %us prior to full shutdown%s",
2743 ospf->stub_router_shutdown_time, VTY_NEWLINE);
2744 }
2745
paul718e3742002-12-13 20:15:29 +00002746 /* Show SPF timers. */
pauld24f6e22005-10-21 09:23:12 +00002747 vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2748 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2749 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2750 " Hold time multiplier is currently %d%s",
2751 ospf->spf_delay, VTY_NEWLINE,
2752 ospf->spf_holdtime, VTY_NEWLINE,
2753 ospf->spf_max_holdtime, VTY_NEWLINE,
2754 ospf->spf_hold_multiplier, VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002755 vty_out (vty, " SPF algorithm ");
2756 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2757 {
Paul Jakma2518efd2006-08-27 06:49:29 +00002758 result = tv_sub (recent_relative_time (), ospf->ts_spf);
paulb8ad39d2005-10-23 15:23:05 +00002759 vty_out (vty, "last executed %s ago%s",
2760 ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2761 VTY_NEWLINE);
Dinesh G Dutt50f38b32014-09-30 12:53:28 -07002762 vty_out (vty, " Last SPF duration %s%s",
2763 ospf_timeval_dump (&ospf->ts_spf_duration, timebuf, sizeof (timebuf)),
2764 VTY_NEWLINE);
paulb8ad39d2005-10-23 15:23:05 +00002765 }
2766 else
2767 vty_out (vty, "has not been run%s", VTY_NEWLINE);
pauld24f6e22005-10-21 09:23:12 +00002768 vty_out (vty, " SPF timer %s%s%s",
2769 (ospf->t_spf_calc ? "due in " : "is "),
2770 ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2771 VTY_NEWLINE);
2772
paul718e3742002-12-13 20:15:29 +00002773 /* Show refresh parameters. */
2774 vty_out (vty, " Refresh timer %d secs%s",
paul68980082003-03-25 05:07:42 +00002775 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002776
2777 /* Show ABR/ASBR flags. */
paul68980082003-03-25 05:07:42 +00002778 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
paul718e3742002-12-13 20:15:29 +00002779 vty_out (vty, " This router is an ABR, ABR type is: %s%s",
paul68980082003-03-25 05:07:42 +00002780 ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002781
paul68980082003-03-25 05:07:42 +00002782 if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
paul718e3742002-12-13 20:15:29 +00002783 vty_out (vty, " This router is an ASBR "
2784 "(injecting external routing information)%s", VTY_NEWLINE);
2785
2786 /* Show Number of AS-external-LSAs. */
hassofe71a972004-12-22 16:16:02 +00002787 vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2788 ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2789 ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2790#ifdef HAVE_OPAQUE_LSA
2791 vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2792 ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2793 ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2794#endif /* HAVE_OPAQUE_LSA */
paul718e3742002-12-13 20:15:29 +00002795 /* Show number of areas attached. */
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00002796 vty_out (vty, " Number of areas attached to this router: %d%s",
2797 listcount (ospf->areas), VTY_NEWLINE);
2798
2799 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2800 {
2801 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2802 vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2803 else
2804 vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2805 }
2806
2807 vty_out (vty, "%s",VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002808
2809 /* Show each area status. */
paul1eb8ef22005-04-07 07:30:20 +00002810 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2811 show_ip_ospf_area (vty, area);
paul718e3742002-12-13 20:15:29 +00002812
2813 return CMD_SUCCESS;
2814}
2815
David Lamparter6b0655a2014-06-04 06:53:35 +02002816
ajsfd651fa2005-03-29 16:08:16 +00002817static void
paul68980082003-03-25 05:07:42 +00002818show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2819 struct interface *ifp)
paul718e3742002-12-13 20:15:29 +00002820{
ajsfd651fa2005-03-29 16:08:16 +00002821 int is_up;
paul718e3742002-12-13 20:15:29 +00002822 struct ospf_neighbor *nbr;
paul718e3742002-12-13 20:15:29 +00002823 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00002824
paul718e3742002-12-13 20:15:29 +00002825 /* Is interface up? */
ajsfd651fa2005-03-29 16:08:16 +00002826 vty_out (vty, "%s is %s%s", ifp->name,
2827 ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
ajsd2fc8892005-04-02 18:38:43 +00002828 vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2829 ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2830 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00002831
2832 /* Is interface OSPF enabled? */
ajsfd651fa2005-03-29 16:08:16 +00002833 if (ospf_oi_count(ifp) == 0)
paul718e3742002-12-13 20:15:29 +00002834 {
2835 vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2836 return;
2837 }
ajsfd651fa2005-03-29 16:08:16 +00002838 else if (!is_up)
2839 {
2840 vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2841 VTY_NEWLINE);
2842 return;
2843 }
2844
paul718e3742002-12-13 20:15:29 +00002845 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2846 {
2847 struct ospf_interface *oi = rn->info;
2848
2849 if (oi == NULL)
2850 continue;
2851
2852 /* Show OSPF interface information. */
2853 vty_out (vty, " Internet Address %s/%d,",
2854 inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2855
Paul Jakma9c27ef92006-05-04 07:32:57 +00002856 if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2857 {
2858 struct in_addr *dest;
2859 const char *dstr;
2860
Andrew J. Schorre4529632006-12-12 19:18:21 +00002861 if (CONNECTED_PEER(oi->connected)
2862 || oi->type == OSPF_IFTYPE_VIRTUALLINK)
Paul Jakma9c27ef92006-05-04 07:32:57 +00002863 dstr = "Peer";
2864 else
2865 dstr = "Broadcast";
2866
2867 /* For Vlinks, showing the peer address is probably more
2868 * informative than the local interface that is being used
2869 */
2870 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2871 dest = &oi->vl_data->peer_addr;
2872 else
2873 dest = &oi->connected->destination->u.prefix4;
2874
2875 vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2876 }
hasso3fb9cd62004-10-19 19:44:43 +00002877
paul718e3742002-12-13 20:15:29 +00002878 vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2879 VTY_NEWLINE);
2880
vincentba682532005-09-29 13:52:57 +00002881 vty_out (vty, " MTU mismatch detection:%s%s",
2882 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2883
paul718e3742002-12-13 20:15:29 +00002884 vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
paul68980082003-03-25 05:07:42 +00002885 inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
paul718e3742002-12-13 20:15:29 +00002886 oi->output_cost, VTY_NEWLINE);
2887
2888 vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2889 OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2890 PRIORITY (oi), VTY_NEWLINE);
2891
2892 /* Show DR information. */
2893 if (DR (oi).s_addr == 0)
2894 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2895 else
2896 {
2897 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2898 if (nbr == NULL)
2899 vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2900 else
2901 {
2902 vty_out (vty, " Designated Router (ID) %s,",
2903 inet_ntoa (nbr->router_id));
2904 vty_out (vty, " Interface Address %s%s",
2905 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2906 }
2907 }
2908
2909 /* Show BDR information. */
2910 if (BDR (oi).s_addr == 0)
2911 vty_out (vty, " No backup designated router on this network%s",
2912 VTY_NEWLINE);
2913 else
2914 {
2915 nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2916 if (nbr == NULL)
2917 vty_out (vty, " No backup designated router on this network%s",
2918 VTY_NEWLINE);
2919 else
2920 {
2921 vty_out (vty, " Backup Designated Router (ID) %s,",
2922 inet_ntoa (nbr->router_id));
2923 vty_out (vty, " Interface Address %s%s",
2924 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2925 }
2926 }
Paul Jakma7eb5b472009-10-13 16:13:13 +01002927
2928 /* Next network-LSA sequence number we'll use, if we're elected DR */
2929 if (oi->params && ntohl (oi->params->network_lsa_seqnum)
2930 != OSPF_INITIAL_SEQUENCE_NUMBER)
2931 vty_out (vty, " Saved Network-LSA sequence number 0x%x%s",
2932 ntohl (oi->params->network_lsa_seqnum), VTY_NEWLINE);
2933
ajsba6454e2005-02-08 15:37:30 +00002934 vty_out (vty, " Multicast group memberships:");
Paul Jakma429ac782006-06-15 18:40:49 +00002935 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2936 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2937 {
2938 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2939 vty_out (vty, " OSPFAllRouters");
2940 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2941 vty_out (vty, " OSPFDesignatedRouters");
2942 }
2943 else
ajsba6454e2005-02-08 15:37:30 +00002944 vty_out (vty, " <None>");
2945 vty_out (vty, "%s", VTY_NEWLINE);
2946
paul718e3742002-12-13 20:15:29 +00002947 vty_out (vty, " Timer intervals configured,");
paulf9ad9372005-10-21 00:45:17 +00002948 vty_out (vty, " Hello ");
2949 if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2950 vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2951 else
2952 vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2953 vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2954 OSPF_IF_PARAM (oi, v_wait),
paul718e3742002-12-13 20:15:29 +00002955 OSPF_IF_PARAM (oi, v_wait),
2956 OSPF_IF_PARAM (oi, retransmit_interval),
2957 VTY_NEWLINE);
2958
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002959 if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
paulf9ad9372005-10-21 00:45:17 +00002960 {
ajs649654a2005-11-16 20:17:52 +00002961 char timebuf[OSPF_TIME_DUMP_SIZE];
paulf9ad9372005-10-21 00:45:17 +00002962 vty_out (vty, " Hello due in %s%s",
ajs649654a2005-11-16 20:17:52 +00002963 ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
paulf9ad9372005-10-21 00:45:17 +00002964 VTY_NEWLINE);
2965 }
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00002966 else /* passive-interface is set */
paul718e3742002-12-13 20:15:29 +00002967 vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2968
2969 vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
paul68980082003-03-25 05:07:42 +00002970 ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
paul718e3742002-12-13 20:15:29 +00002971 VTY_NEWLINE);
2972 }
2973}
2974
2975DEFUN (show_ip_ospf_interface,
2976 show_ip_ospf_interface_cmd,
2977 "show ip ospf interface [INTERFACE]",
2978 SHOW_STR
2979 IP_STR
2980 "OSPF information\n"
2981 "Interface information\n"
2982 "Interface name\n")
2983{
2984 struct interface *ifp;
paul020709f2003-04-04 02:44:16 +00002985 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00002986 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00002987
paul020709f2003-04-04 02:44:16 +00002988 ospf = ospf_lookup ();
Paul Jakmacac3b5c2006-05-11 13:31:11 +00002989 if (ospf == NULL)
2990 {
2991 vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
2992 return CMD_SUCCESS;
2993 }
paul020709f2003-04-04 02:44:16 +00002994
paul718e3742002-12-13 20:15:29 +00002995 /* Show All Interfaces. */
2996 if (argc == 0)
paul1eb8ef22005-04-07 07:30:20 +00002997 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
2998 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00002999 /* Interface name is specified. */
3000 else
3001 {
3002 if ((ifp = if_lookup_by_name (argv[0])) == NULL)
3003 vty_out (vty, "No such interface name%s", VTY_NEWLINE);
3004 else
paul68980082003-03-25 05:07:42 +00003005 show_ip_ospf_interface_sub (vty, ospf, ifp);
paul718e3742002-12-13 20:15:29 +00003006 }
3007
3008 return CMD_SUCCESS;
3009}
3010
paul4dadc292005-05-06 21:37:42 +00003011static void
pauld24f6e22005-10-21 09:23:12 +00003012show_ip_ospf_neighbour_header (struct vty *vty)
3013{
3014 vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3015 VTY_NEWLINE,
3016 "Neighbor ID", "Pri", "State", "Dead Time",
3017 "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3018 VTY_NEWLINE);
3019}
3020
3021static void
paul718e3742002-12-13 20:15:29 +00003022show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3023{
3024 struct route_node *rn;
3025 struct ospf_neighbor *nbr;
3026 char msgbuf[16];
ajs649654a2005-11-16 20:17:52 +00003027 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003028
3029 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3030 if ((nbr = rn->info))
3031 /* Do not show myself. */
3032 if (nbr != oi->nbr_self)
3033 /* Down state is not shown. */
3034 if (nbr->state != NSM_Down)
3035 {
3036 ospf_nbr_state_message (nbr, msgbuf, 16);
3037
3038 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
pauld24f6e22005-10-21 09:23:12 +00003039 vty_out (vty, "%-15s %3d %-15s ",
3040 "-", nbr->priority,
3041 msgbuf);
3042 else
3043 vty_out (vty, "%-15s %3d %-15s ",
3044 inet_ntoa (nbr->router_id), nbr->priority,
3045 msgbuf);
3046
3047 vty_out (vty, "%9s ",
3048 ospf_timer_dump (nbr->t_inactivity, timebuf,
3049 sizeof(timebuf)));
3050
paul718e3742002-12-13 20:15:29 +00003051 vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
pauld24f6e22005-10-21 09:23:12 +00003052 vty_out (vty, "%-20s %5ld %5ld %5d%s",
paul718e3742002-12-13 20:15:29 +00003053 IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3054 ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3055 VTY_NEWLINE);
3056 }
3057}
3058
3059DEFUN (show_ip_ospf_neighbor,
3060 show_ip_ospf_neighbor_cmd,
3061 "show ip ospf neighbor",
3062 SHOW_STR
3063 IP_STR
3064 "OSPF information\n"
3065 "Neighbor list\n")
3066{
paul020709f2003-04-04 02:44:16 +00003067 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003068 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003069 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003070
paul020709f2003-04-04 02:44:16 +00003071 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003072 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003073 {
3074 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3075 return CMD_SUCCESS;
3076 }
3077
pauld24f6e22005-10-21 09:23:12 +00003078 show_ip_ospf_neighbour_header (vty);
paul718e3742002-12-13 20:15:29 +00003079
paul1eb8ef22005-04-07 07:30:20 +00003080 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3081 show_ip_ospf_neighbor_sub (vty, oi);
paul718e3742002-12-13 20:15:29 +00003082
3083 return CMD_SUCCESS;
3084}
3085
3086DEFUN (show_ip_ospf_neighbor_all,
3087 show_ip_ospf_neighbor_all_cmd,
3088 "show ip ospf neighbor all",
3089 SHOW_STR
3090 IP_STR
3091 "OSPF information\n"
3092 "Neighbor list\n"
3093 "include down status neighbor\n")
3094{
Joakim Tjernlund35f89142008-07-01 16:54:07 +02003095 struct ospf *ospf = ospf_lookup ();
hasso52dc7ee2004-09-23 19:18:23 +00003096 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003097 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003098
paul68980082003-03-25 05:07:42 +00003099 if (ospf == NULL)
paul718e3742002-12-13 20:15:29 +00003100 {
3101 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3102 return CMD_SUCCESS;
3103 }
pauld24f6e22005-10-21 09:23:12 +00003104
3105 show_ip_ospf_neighbour_header (vty);
3106
paul1eb8ef22005-04-07 07:30:20 +00003107 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003108 {
hasso52dc7ee2004-09-23 19:18:23 +00003109 struct listnode *nbr_node;
paul1eb8ef22005-04-07 07:30:20 +00003110 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003111
3112 show_ip_ospf_neighbor_sub (vty, oi);
3113
3114 /* print Down neighbor status */
paul1eb8ef22005-04-07 07:30:20 +00003115 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
paul718e3742002-12-13 20:15:29 +00003116 {
paul718e3742002-12-13 20:15:29 +00003117 if (nbr_nbma->nbr == NULL
3118 || nbr_nbma->nbr->state == NSM_Down)
3119 {
pauld24f6e22005-10-21 09:23:12 +00003120 vty_out (vty, "%-15s %3d %-15s %9s ",
paul718e3742002-12-13 20:15:29 +00003121 "-", nbr_nbma->priority, "Down", "-");
pauld24f6e22005-10-21 09:23:12 +00003122 vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
paul718e3742002-12-13 20:15:29 +00003123 inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3124 0, 0, 0, VTY_NEWLINE);
3125 }
3126 }
3127 }
3128
3129 return CMD_SUCCESS;
3130}
3131
3132DEFUN (show_ip_ospf_neighbor_int,
3133 show_ip_ospf_neighbor_int_cmd,
hassobb5b7552005-08-21 20:01:15 +00003134 "show ip ospf neighbor IFNAME",
paul718e3742002-12-13 20:15:29 +00003135 SHOW_STR
3136 IP_STR
3137 "OSPF information\n"
3138 "Neighbor list\n"
3139 "Interface name\n")
3140{
paul020709f2003-04-04 02:44:16 +00003141 struct ospf *ospf;
hassobb5b7552005-08-21 20:01:15 +00003142 struct interface *ifp;
3143 struct route_node *rn;
3144
3145 ifp = if_lookup_by_name (argv[0]);
3146 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003147 {
hassobb5b7552005-08-21 20:01:15 +00003148 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003149 return CMD_WARNING;
3150 }
3151
paul020709f2003-04-04 02:44:16 +00003152 ospf = ospf_lookup ();
3153 if (ospf == NULL)
3154 {
3155 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3156 return CMD_SUCCESS;
3157 }
pauld24f6e22005-10-21 09:23:12 +00003158
3159 show_ip_ospf_neighbour_header (vty);
3160
hassobb5b7552005-08-21 20:01:15 +00003161 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00003162 {
hassobb5b7552005-08-21 20:01:15 +00003163 struct ospf_interface *oi = rn->info;
3164
3165 if (oi == NULL)
3166 continue;
3167
paul718e3742002-12-13 20:15:29 +00003168 show_ip_ospf_neighbor_sub (vty, oi);
3169 }
3170
3171 return CMD_SUCCESS;
3172}
3173
paul4dadc292005-05-06 21:37:42 +00003174static void
paul718e3742002-12-13 20:15:29 +00003175show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3176 struct ospf_nbr_nbma *nbr_nbma)
3177{
ajs649654a2005-11-16 20:17:52 +00003178 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003179
3180 /* Show neighbor ID. */
3181 vty_out (vty, " Neighbor %s,", "-");
3182
3183 /* Show interface address. */
3184 vty_out (vty, " interface address %s%s",
3185 inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3186 /* Show Area ID. */
3187 vty_out (vty, " In the area %s via interface %s%s",
3188 ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3189 /* Show neighbor priority and state. */
3190 vty_out (vty, " Neighbor priority is %d, State is %s,",
3191 nbr_nbma->priority, "Down");
3192 /* Show state changes. */
3193 vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3194
3195 /* Show PollInterval */
3196 vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3197
3198 /* Show poll-interval timer. */
3199 vty_out (vty, " Poll timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003200 ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3201 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003202
3203 /* Show poll-interval timer thread. */
3204 vty_out (vty, " Thread Poll Timer %s%s",
3205 nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3206}
3207
paul4dadc292005-05-06 21:37:42 +00003208static void
paul718e3742002-12-13 20:15:29 +00003209show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3210 struct ospf_neighbor *nbr)
3211{
ajs649654a2005-11-16 20:17:52 +00003212 char timebuf[OSPF_TIME_DUMP_SIZE];
paul718e3742002-12-13 20:15:29 +00003213
3214 /* Show neighbor ID. */
3215 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3216 vty_out (vty, " Neighbor %s,", "-");
3217 else
3218 vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3219
3220 /* Show interface address. */
3221 vty_out (vty, " interface address %s%s",
3222 inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3223 /* Show Area ID. */
3224 vty_out (vty, " In the area %s via interface %s%s",
3225 ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3226 /* Show neighbor priority and state. */
3227 vty_out (vty, " Neighbor priority is %d, State is %s,",
3228 nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3229 /* Show state changes. */
3230 vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
Paul Jakma3fed4162006-07-25 20:44:12 +00003231 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
Paul Jakma90c33172006-07-11 17:57:25 +00003232 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003233 struct timeval res
3234 = tv_sub (recent_relative_time (), nbr->ts_last_progress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003235 vty_out (vty, " Most recent state change statistics:%s",
3236 VTY_NEWLINE);
3237 vty_out (vty, " Progressive change %s ago%s",
Paul Jakma90c33172006-07-11 17:57:25 +00003238 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
Paul Jakma3fed4162006-07-25 20:44:12 +00003239 VTY_NEWLINE);
3240 }
3241 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3242 {
Paul Jakma2518efd2006-08-27 06:49:29 +00003243 struct timeval res
3244 = tv_sub (recent_relative_time (), nbr->ts_last_regress);
Paul Jakma3fed4162006-07-25 20:44:12 +00003245 vty_out (vty, " Regressive change %s ago, due to %s%s",
3246 ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3247 (nbr->last_regress_str ? nbr->last_regress_str : "??"),
Paul Jakma90c33172006-07-11 17:57:25 +00003248 VTY_NEWLINE);
3249 }
paul718e3742002-12-13 20:15:29 +00003250 /* Show Designated Rotuer ID. */
3251 vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3252 /* Show Backup Designated Rotuer ID. */
3253 vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3254 /* Show options. */
3255 vty_out (vty, " Options %d %s%s", nbr->options,
3256 ospf_options_dump (nbr->options), VTY_NEWLINE);
3257 /* Show Router Dead interval timer. */
3258 vty_out (vty, " Dead timer due in %s%s",
pauld24f6e22005-10-21 09:23:12 +00003259 ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3260 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003261 /* Show Database Summary list. */
3262 vty_out (vty, " Database Summary List %d%s",
3263 ospf_db_summary_count (nbr), VTY_NEWLINE);
3264 /* Show Link State Request list. */
3265 vty_out (vty, " Link State Request List %ld%s",
3266 ospf_ls_request_count (nbr), VTY_NEWLINE);
3267 /* Show Link State Retransmission list. */
3268 vty_out (vty, " Link State Retransmission List %ld%s",
3269 ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3270 /* Show inactivity timer thread. */
3271 vty_out (vty, " Thread Inactivity Timer %s%s",
3272 nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3273 /* Show Database Description retransmission thread. */
3274 vty_out (vty, " Thread Database Description Retransmision %s%s",
3275 nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3276 /* Show Link State Request Retransmission thread. */
3277 vty_out (vty, " Thread Link State Request Retransmission %s%s",
3278 nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3279 /* Show Link State Update Retransmission thread. */
3280 vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3281 nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3282}
3283
3284DEFUN (show_ip_ospf_neighbor_id,
3285 show_ip_ospf_neighbor_id_cmd,
3286 "show ip ospf neighbor A.B.C.D",
3287 SHOW_STR
3288 IP_STR
3289 "OSPF information\n"
3290 "Neighbor list\n"
3291 "Neighbor ID\n")
3292{
paul020709f2003-04-04 02:44:16 +00003293 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003294 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003295 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003296 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003297 struct in_addr router_id;
3298 int ret;
3299
3300 ret = inet_aton (argv[0], &router_id);
3301 if (!ret)
3302 {
3303 vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3304 return CMD_WARNING;
3305 }
3306
paul020709f2003-04-04 02:44:16 +00003307 ospf = ospf_lookup ();
3308 if (ospf == NULL)
3309 {
3310 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3311 return CMD_SUCCESS;
3312 }
3313
paul1eb8ef22005-04-07 07:30:20 +00003314 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3315 if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
Andrew J. Schorr1c066bf2006-06-30 16:53:47 +00003316 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003317
paul718e3742002-12-13 20:15:29 +00003318 return CMD_SUCCESS;
3319}
3320
3321DEFUN (show_ip_ospf_neighbor_detail,
3322 show_ip_ospf_neighbor_detail_cmd,
3323 "show ip ospf neighbor detail",
3324 SHOW_STR
3325 IP_STR
3326 "OSPF information\n"
3327 "Neighbor list\n"
3328 "detail of all neighbors\n")
3329{
paul020709f2003-04-04 02:44:16 +00003330 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00003331 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00003332 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003333
paul020709f2003-04-04 02:44:16 +00003334 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003335 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003336 {
3337 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3338 return CMD_SUCCESS;
3339 }
paul718e3742002-12-13 20:15:29 +00003340
paul1eb8ef22005-04-07 07:30:20 +00003341 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003342 {
paul718e3742002-12-13 20:15:29 +00003343 struct route_node *rn;
3344 struct ospf_neighbor *nbr;
3345
3346 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3347 if ((nbr = rn->info))
3348 if (nbr != oi->nbr_self)
3349 if (nbr->state != NSM_Down)
3350 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3351 }
3352
3353 return CMD_SUCCESS;
3354}
3355
3356DEFUN (show_ip_ospf_neighbor_detail_all,
3357 show_ip_ospf_neighbor_detail_all_cmd,
3358 "show ip ospf neighbor detail all",
3359 SHOW_STR
3360 IP_STR
3361 "OSPF information\n"
3362 "Neighbor list\n"
3363 "detail of all neighbors\n"
3364 "include down status neighbor\n")
3365{
paul020709f2003-04-04 02:44:16 +00003366 struct ospf *ospf;
hasso52dc7ee2004-09-23 19:18:23 +00003367 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003368 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +00003369
paul020709f2003-04-04 02:44:16 +00003370 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00003371 if (ospf == NULL)
paul020709f2003-04-04 02:44:16 +00003372 {
3373 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3374 return CMD_SUCCESS;
3375 }
paul718e3742002-12-13 20:15:29 +00003376
paul1eb8ef22005-04-07 07:30:20 +00003377 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
paul718e3742002-12-13 20:15:29 +00003378 {
paul718e3742002-12-13 20:15:29 +00003379 struct route_node *rn;
3380 struct ospf_neighbor *nbr;
paul1eb8ef22005-04-07 07:30:20 +00003381 struct ospf_nbr_nbma *nbr_nbma;
paul718e3742002-12-13 20:15:29 +00003382
3383 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3384 if ((nbr = rn->info))
3385 if (nbr != oi->nbr_self)
3386 if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3387 show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3388
3389 if (oi->type == OSPF_IFTYPE_NBMA)
3390 {
hasso52dc7ee2004-09-23 19:18:23 +00003391 struct listnode *nd;
paul718e3742002-12-13 20:15:29 +00003392
paul1eb8ef22005-04-07 07:30:20 +00003393 for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3394 if (nbr_nbma->nbr == NULL
3395 || nbr_nbma->nbr->state == NSM_Down)
3396 show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
paul718e3742002-12-13 20:15:29 +00003397 }
3398 }
3399
3400 return CMD_SUCCESS;
3401}
3402
3403DEFUN (show_ip_ospf_neighbor_int_detail,
3404 show_ip_ospf_neighbor_int_detail_cmd,
hassobb5b7552005-08-21 20:01:15 +00003405 "show ip ospf neighbor IFNAME detail",
paul718e3742002-12-13 20:15:29 +00003406 SHOW_STR
3407 IP_STR
3408 "OSPF information\n"
3409 "Neighbor list\n"
hassobb5b7552005-08-21 20:01:15 +00003410 "Interface name\n"
paul718e3742002-12-13 20:15:29 +00003411 "detail of all neighbors")
3412{
paul020709f2003-04-04 02:44:16 +00003413 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00003414 struct ospf_interface *oi;
hassobb5b7552005-08-21 20:01:15 +00003415 struct interface *ifp;
3416 struct route_node *rn, *nrn;
3417 struct ospf_neighbor *nbr;
3418
3419 ifp = if_lookup_by_name (argv[0]);
3420 if (!ifp)
paul718e3742002-12-13 20:15:29 +00003421 {
hassobb5b7552005-08-21 20:01:15 +00003422 vty_out (vty, "No such interface.%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003423 return CMD_WARNING;
3424 }
3425
paul020709f2003-04-04 02:44:16 +00003426 ospf = ospf_lookup ();
3427 if (ospf == NULL)
3428 {
3429 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3430 return CMD_SUCCESS;
3431 }
paul68980082003-03-25 05:07:42 +00003432
paul718e3742002-12-13 20:15:29 +00003433
hassobb5b7552005-08-21 20:01:15 +00003434 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3435 if ((oi = rn->info))
3436 for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3437 if ((nbr = nrn->info))
paul718e3742002-12-13 20:15:29 +00003438 if (nbr != oi->nbr_self)
3439 if (nbr->state != NSM_Down)
3440 show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
paul718e3742002-12-13 20:15:29 +00003441
3442 return CMD_SUCCESS;
3443}
3444
David Lamparter6b0655a2014-06-04 06:53:35 +02003445
paul718e3742002-12-13 20:15:29 +00003446/* Show functions */
paul4dadc292005-05-06 21:37:42 +00003447static int
paul020709f2003-04-04 02:44:16 +00003448show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
paul718e3742002-12-13 20:15:29 +00003449{
paul718e3742002-12-13 20:15:29 +00003450 struct router_lsa *rl;
3451 struct summary_lsa *sl;
3452 struct as_external_lsa *asel;
3453 struct prefix_ipv4 p;
3454
3455 if (lsa != NULL)
3456 /* If self option is set, check LSA self flag. */
3457 if (self == 0 || IS_LSA_SELF (lsa))
3458 {
3459 /* LSA common part show. */
3460 vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3461 vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3462 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3463 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3464 /* LSA specific part show. */
3465 switch (lsa->data->type)
3466 {
3467 case OSPF_ROUTER_LSA:
3468 rl = (struct router_lsa *) lsa->data;
3469 vty_out (vty, " %-d", ntohs (rl->links));
3470 break;
3471 case OSPF_SUMMARY_LSA:
3472 sl = (struct summary_lsa *) lsa->data;
3473
3474 p.family = AF_INET;
3475 p.prefix = sl->header.id;
3476 p.prefixlen = ip_masklen (sl->mask);
3477 apply_mask_ipv4 (&p);
3478
3479 vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3480 break;
3481 case OSPF_AS_EXTERNAL_LSA:
paul551a8972003-05-18 15:22:55 +00003482 case OSPF_AS_NSSA_LSA:
paul718e3742002-12-13 20:15:29 +00003483 asel = (struct as_external_lsa *) lsa->data;
3484
3485 p.family = AF_INET;
3486 p.prefix = asel->header.id;
3487 p.prefixlen = ip_masklen (asel->mask);
3488 apply_mask_ipv4 (&p);
3489
3490 vty_out (vty, " %s %s/%d [0x%lx]",
3491 IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3492 inet_ntoa (p.prefix), p.prefixlen,
3493 (u_long)ntohl (asel->e[0].route_tag));
3494 break;
3495 case OSPF_NETWORK_LSA:
3496 case OSPF_ASBR_SUMMARY_LSA:
3497#ifdef HAVE_OPAQUE_LSA
3498 case OSPF_OPAQUE_LINK_LSA:
3499 case OSPF_OPAQUE_AREA_LSA:
3500 case OSPF_OPAQUE_AS_LSA:
3501#endif /* HAVE_OPAQUE_LSA */
3502 default:
3503 break;
3504 }
3505 vty_out (vty, VTY_NEWLINE);
3506 }
3507
3508 return 0;
3509}
3510
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003511static const char *show_database_desc[] =
paul718e3742002-12-13 20:15:29 +00003512{
3513 "unknown",
3514 "Router Link States",
3515 "Net Link States",
3516 "Summary Link States",
3517 "ASBR-Summary Link States",
3518 "AS External Link States",
paul718e3742002-12-13 20:15:29 +00003519 "Group Membership LSA",
3520 "NSSA-external Link States",
paul718e3742002-12-13 20:15:29 +00003521#ifdef HAVE_OPAQUE_LSA
3522 "Type-8 LSA",
3523 "Link-Local Opaque-LSA",
3524 "Area-Local Opaque-LSA",
3525 "AS-external Opaque-LSA",
3526#endif /* HAVE_OPAQUE_LSA */
3527};
3528
Stephen Hemminger8b6a15b2009-12-03 19:25:04 +03003529static const char *show_database_header[] =
paul718e3742002-12-13 20:15:29 +00003530{
3531 "",
3532 "Link ID ADV Router Age Seq# CkSum Link count",
3533 "Link ID ADV Router Age Seq# CkSum",
3534 "Link ID ADV Router Age Seq# CkSum Route",
3535 "Link ID ADV Router Age Seq# CkSum",
3536 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003537 " --- header for Group Member ----",
3538 "Link ID ADV Router Age Seq# CkSum Route",
paul718e3742002-12-13 20:15:29 +00003539#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003540 " --- type-8 ---",
3541 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3542 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3543 "Opaque-Type/Id ADV Router Age Seq# CkSum",
3544#endif /* HAVE_OPAQUE_LSA */
3545};
3546
paul4dadc292005-05-06 21:37:42 +00003547static void
paul718e3742002-12-13 20:15:29 +00003548show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3549{
3550 struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
paul4957f492003-06-27 01:28:45 +00003551
paul718e3742002-12-13 20:15:29 +00003552 vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
paul4957f492003-06-27 01:28:45 +00003553 vty_out (vty, " Options: 0x%-2x : %s%s",
3554 lsa->data->options,
3555 ospf_options_dump(lsa->data->options),
3556 VTY_NEWLINE);
3557 vty_out (vty, " LS Flags: 0x%-2x %s%s",
paul9d526032003-06-30 22:46:14 +00003558 lsa->flags,
paul4957f492003-06-27 01:28:45 +00003559 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3560 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003561
3562 if (lsa->data->type == OSPF_ROUTER_LSA)
3563 {
3564 vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3565
3566 if (rlsa->flags)
3567 vty_out (vty, " :%s%s%s%s",
3568 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3569 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3570 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3571 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3572
3573 vty_out (vty, "%s", VTY_NEWLINE);
3574 }
3575 vty_out (vty, " LS Type: %s%s",
3576 LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3577 vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3578 LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3579 vty_out (vty, " Advertising Router: %s%s",
3580 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3581 vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3582 VTY_NEWLINE);
3583 vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3584 VTY_NEWLINE);
3585 vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3586}
3587
hassoeb1ce602004-10-08 08:17:22 +00003588const char *link_type_desc[] =
paul718e3742002-12-13 20:15:29 +00003589{
3590 "(null)",
3591 "another Router (point-to-point)",
3592 "a Transit Network",
3593 "Stub Network",
3594 "a Virtual Link",
3595};
3596
hassoeb1ce602004-10-08 08:17:22 +00003597const char *link_id_desc[] =
paul718e3742002-12-13 20:15:29 +00003598{
3599 "(null)",
3600 "Neighboring Router ID",
3601 "Designated Router address",
paul68980082003-03-25 05:07:42 +00003602 "Net",
paul718e3742002-12-13 20:15:29 +00003603 "Neighboring Router ID",
3604};
3605
hassoeb1ce602004-10-08 08:17:22 +00003606const char *link_data_desc[] =
paul718e3742002-12-13 20:15:29 +00003607{
3608 "(null)",
3609 "Router Interface address",
3610 "Router Interface address",
3611 "Network Mask",
3612 "Router Interface address",
3613};
3614
3615/* Show router-LSA each Link information. */
paul4dadc292005-05-06 21:37:42 +00003616static void
paul718e3742002-12-13 20:15:29 +00003617show_ip_ospf_database_router_links (struct vty *vty,
3618 struct router_lsa *rl)
3619{
3620 int len, i, type;
3621
3622 len = ntohs (rl->header.length) - 4;
3623 for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3624 {
3625 type = rl->link[i].type;
3626
3627 vty_out (vty, " Link connected to: %s%s",
3628 link_type_desc[type], VTY_NEWLINE);
3629 vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3630 inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3631 vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3632 inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3633 vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3634 vty_out (vty, " TOS 0 Metric: %d%s",
3635 ntohs (rl->link[i].metric), VTY_NEWLINE);
3636 vty_out (vty, "%s", VTY_NEWLINE);
3637 }
3638}
3639
3640/* Show router-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003641static int
paul718e3742002-12-13 20:15:29 +00003642show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3643{
3644 if (lsa != NULL)
3645 {
3646 struct router_lsa *rl = (struct router_lsa *) lsa->data;
3647
3648 show_ip_ospf_database_header (vty, lsa);
3649
3650 vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3651 VTY_NEWLINE, VTY_NEWLINE);
3652
3653 show_ip_ospf_database_router_links (vty, rl);
paulb0a053b2003-06-22 09:04:47 +00003654 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003655 }
3656
3657 return 0;
3658}
3659
3660/* Show network-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003661static int
paul718e3742002-12-13 20:15:29 +00003662show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3663{
3664 int length, i;
3665
3666 if (lsa != NULL)
3667 {
3668 struct network_lsa *nl = (struct network_lsa *) lsa->data;
3669
3670 show_ip_ospf_database_header (vty, lsa);
3671
3672 vty_out (vty, " Network Mask: /%d%s",
3673 ip_masklen (nl->mask), VTY_NEWLINE);
3674
3675 length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3676
3677 for (i = 0; length > 0; i++, length -= 4)
3678 vty_out (vty, " Attached Router: %s%s",
3679 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3680
3681 vty_out (vty, "%s", VTY_NEWLINE);
3682 }
3683
3684 return 0;
3685}
3686
3687/* Show summary-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003688static int
paul718e3742002-12-13 20:15:29 +00003689show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3690{
3691 if (lsa != NULL)
3692 {
3693 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3694
3695 show_ip_ospf_database_header (vty, lsa);
3696
3697 vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3698 VTY_NEWLINE);
3699 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3700 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003701 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003702 }
3703
3704 return 0;
3705}
3706
3707/* Show summary-ASBR-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003708static int
paul718e3742002-12-13 20:15:29 +00003709show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3710{
3711 if (lsa != NULL)
3712 {
3713 struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3714
3715 show_ip_ospf_database_header (vty, lsa);
3716
3717 vty_out (vty, " Network Mask: /%d%s",
3718 ip_masklen (sl->mask), VTY_NEWLINE);
3719 vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3720 VTY_NEWLINE);
paulb0a053b2003-06-22 09:04:47 +00003721 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00003722 }
3723
3724 return 0;
3725}
3726
3727/* Show AS-external-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003728static int
paul718e3742002-12-13 20:15:29 +00003729show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3730{
3731 if (lsa != NULL)
3732 {
3733 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3734
3735 show_ip_ospf_database_header (vty, lsa);
3736
3737 vty_out (vty, " Network Mask: /%d%s",
3738 ip_masklen (al->mask), VTY_NEWLINE);
3739 vty_out (vty, " Metric Type: %s%s",
3740 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3741 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3742 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3743 vty_out (vty, " Metric: %d%s",
3744 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3745 vty_out (vty, " Forward Address: %s%s",
3746 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3747
3748 vty_out (vty, " External Route Tag: %lu%s%s",
3749 (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3750 }
3751
3752 return 0;
3753}
3754
Stephen Hemminger075e12f2011-12-06 23:54:17 +04003755#if 0
paul4dadc292005-05-06 21:37:42 +00003756static int
paul718e3742002-12-13 20:15:29 +00003757show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3758{
3759 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3760
3761 /* show_ip_ospf_database_header (vty, lsa); */
3762
ajs2a42e282004-12-08 18:43:03 +00003763 zlog_debug( " Network Mask: /%d%s",
paul718e3742002-12-13 20:15:29 +00003764 ip_masklen (al->mask), "\n");
ajs2a42e282004-12-08 18:43:03 +00003765 zlog_debug( " Metric Type: %s%s",
paul718e3742002-12-13 20:15:29 +00003766 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3767 "2 (Larger than any link state path)" : "1", "\n");
ajs2a42e282004-12-08 18:43:03 +00003768 zlog_debug( " TOS: 0%s", "\n");
3769 zlog_debug( " Metric: %d%s",
paul718e3742002-12-13 20:15:29 +00003770 GET_METRIC (al->e[0].metric), "\n");
ajs2a42e282004-12-08 18:43:03 +00003771 zlog_debug( " Forward Address: %s%s",
paul718e3742002-12-13 20:15:29 +00003772 inet_ntoa (al->e[0].fwd_addr), "\n");
3773
ajs2a42e282004-12-08 18:43:03 +00003774 zlog_debug( " External Route Tag: %u%s%s",
paul718e3742002-12-13 20:15:29 +00003775 ntohl (al->e[0].route_tag), "\n", "\n");
3776
3777 return 0;
3778}
Stephen Hemminger075e12f2011-12-06 23:54:17 +04003779#endif
paul718e3742002-12-13 20:15:29 +00003780
3781/* Show AS-NSSA-LSA detail information. */
paul4dadc292005-05-06 21:37:42 +00003782static int
paul718e3742002-12-13 20:15:29 +00003783show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3784{
3785 if (lsa != NULL)
3786 {
3787 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3788
3789 show_ip_ospf_database_header (vty, lsa);
3790
3791 vty_out (vty, " Network Mask: /%d%s",
3792 ip_masklen (al->mask), VTY_NEWLINE);
3793 vty_out (vty, " Metric Type: %s%s",
3794 IS_EXTERNAL_METRIC (al->e[0].tos) ?
3795 "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3796 vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3797 vty_out (vty, " Metric: %d%s",
3798 GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3799 vty_out (vty, " NSSA: Forward Address: %s%s",
3800 inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3801
3802 vty_out (vty, " External Route Tag: %u%s%s",
3803 ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3804 }
3805
3806 return 0;
3807}
3808
paul4dadc292005-05-06 21:37:42 +00003809static int
paul718e3742002-12-13 20:15:29 +00003810show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3811{
3812 return 0;
3813}
3814
3815#ifdef HAVE_OPAQUE_LSA
paul4dadc292005-05-06 21:37:42 +00003816static int
paul718e3742002-12-13 20:15:29 +00003817show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3818{
3819 if (lsa != NULL)
3820 {
3821 show_ip_ospf_database_header (vty, lsa);
3822 show_opaque_info_detail (vty, lsa);
3823
3824 vty_out (vty, "%s", VTY_NEWLINE);
3825 }
3826 return 0;
3827}
3828#endif /* HAVE_OPAQUE_LSA */
3829
3830int (*show_function[])(struct vty *, struct ospf_lsa *) =
3831{
3832 NULL,
3833 show_router_lsa_detail,
3834 show_network_lsa_detail,
3835 show_summary_lsa_detail,
3836 show_summary_asbr_lsa_detail,
3837 show_as_external_lsa_detail,
paul718e3742002-12-13 20:15:29 +00003838 show_func_dummy,
3839 show_as_nssa_lsa_detail, /* almost same as external */
paul718e3742002-12-13 20:15:29 +00003840#ifdef HAVE_OPAQUE_LSA
paul718e3742002-12-13 20:15:29 +00003841 NULL, /* type-8 */
3842 show_opaque_lsa_detail,
3843 show_opaque_lsa_detail,
3844 show_opaque_lsa_detail,
3845#endif /* HAVE_OPAQUE_LSA */
3846};
3847
paul4dadc292005-05-06 21:37:42 +00003848static void
paul718e3742002-12-13 20:15:29 +00003849show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3850 struct in_addr *adv_router)
3851{
3852 memset (lp, 0, sizeof (struct prefix_ls));
3853 lp->family = 0;
3854 if (id == NULL)
3855 lp->prefixlen = 0;
3856 else if (adv_router == NULL)
3857 {
3858 lp->prefixlen = 32;
3859 lp->id = *id;
3860 }
3861 else
3862 {
3863 lp->prefixlen = 64;
3864 lp->id = *id;
3865 lp->adv_router = *adv_router;
3866 }
3867}
3868
paul4dadc292005-05-06 21:37:42 +00003869static void
paul718e3742002-12-13 20:15:29 +00003870show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3871 struct in_addr *id, struct in_addr *adv_router)
3872{
3873 struct prefix_ls lp;
3874 struct route_node *rn, *start;
3875 struct ospf_lsa *lsa;
3876
3877 show_lsa_prefix_set (vty, &lp, id, adv_router);
3878 start = route_node_get (rt, (struct prefix *) &lp);
3879 if (start)
3880 {
3881 route_lock_node (start);
3882 for (rn = start; rn; rn = route_next_until (rn, start))
3883 if ((lsa = rn->info))
3884 {
paul718e3742002-12-13 20:15:29 +00003885 if (show_function[lsa->data->type] != NULL)
3886 show_function[lsa->data->type] (vty, lsa);
3887 }
3888 route_unlock_node (start);
3889 }
3890}
3891
3892/* Show detail LSA information
3893 -- if id is NULL then show all LSAs. */
paul4dadc292005-05-06 21:37:42 +00003894static void
paul020709f2003-04-04 02:44:16 +00003895show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003896 struct in_addr *id, struct in_addr *adv_router)
3897{
hasso52dc7ee2004-09-23 19:18:23 +00003898 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003899 struct ospf_area *area;
3900
paul718e3742002-12-13 20:15:29 +00003901 switch (type)
3902 {
3903 case OSPF_AS_EXTERNAL_LSA:
3904#ifdef HAVE_OPAQUE_LSA
3905 case OSPF_OPAQUE_AS_LSA:
3906#endif /* HAVE_OPAQUE_LSA */
3907 vty_out (vty, " %s %s%s",
3908 show_database_desc[type],
3909 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003910 show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
paul718e3742002-12-13 20:15:29 +00003911 break;
3912 default:
paul1eb8ef22005-04-07 07:30:20 +00003913 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003914 {
paul718e3742002-12-13 20:15:29 +00003915 vty_out (vty, "%s %s (Area %s)%s%s",
3916 VTY_NEWLINE, show_database_desc[type],
3917 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3918 show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3919 }
3920 break;
3921 }
3922}
3923
paul4dadc292005-05-06 21:37:42 +00003924static void
paul718e3742002-12-13 20:15:29 +00003925show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3926 struct in_addr *adv_router)
3927{
3928 struct route_node *rn;
3929 struct ospf_lsa *lsa;
3930
3931 for (rn = route_top (rt); rn; rn = route_next (rn))
3932 if ((lsa = rn->info))
3933 if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3934 {
paul718e3742002-12-13 20:15:29 +00003935 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3936 continue;
paul718e3742002-12-13 20:15:29 +00003937 if (show_function[lsa->data->type] != NULL)
3938 show_function[lsa->data->type] (vty, lsa);
3939 }
3940}
3941
3942/* Show detail LSA information. */
paul4dadc292005-05-06 21:37:42 +00003943static void
paul020709f2003-04-04 02:44:16 +00003944show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
paul718e3742002-12-13 20:15:29 +00003945 struct in_addr *adv_router)
3946{
hasso52dc7ee2004-09-23 19:18:23 +00003947 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00003948 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00003949
3950 switch (type)
3951 {
3952 case OSPF_AS_EXTERNAL_LSA:
3953#ifdef HAVE_OPAQUE_LSA
3954 case OSPF_OPAQUE_AS_LSA:
3955#endif /* HAVE_OPAQUE_LSA */
3956 vty_out (vty, " %s %s%s",
3957 show_database_desc[type],
3958 VTY_NEWLINE, VTY_NEWLINE);
paul68980082003-03-25 05:07:42 +00003959 show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
paul718e3742002-12-13 20:15:29 +00003960 adv_router);
3961 break;
3962 default:
paul1eb8ef22005-04-07 07:30:20 +00003963 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003964 {
paul718e3742002-12-13 20:15:29 +00003965 vty_out (vty, "%s %s (Area %s)%s%s",
3966 VTY_NEWLINE, show_database_desc[type],
3967 ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3968 show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3969 adv_router);
3970 }
3971 break;
3972 }
3973}
3974
paul4dadc292005-05-06 21:37:42 +00003975static void
paul020709f2003-04-04 02:44:16 +00003976show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
paul718e3742002-12-13 20:15:29 +00003977{
paul020709f2003-04-04 02:44:16 +00003978 struct ospf_lsa *lsa;
3979 struct route_node *rn;
paul1eb8ef22005-04-07 07:30:20 +00003980 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +00003981 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00003982 int type;
3983
paul1eb8ef22005-04-07 07:30:20 +00003984 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00003985 {
paul718e3742002-12-13 20:15:29 +00003986 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3987 {
3988 switch (type)
3989 {
3990 case OSPF_AS_EXTERNAL_LSA:
3991#ifdef HAVE_OPAQUE_LSA
3992 case OSPF_OPAQUE_AS_LSA:
3993#endif /* HAVE_OPAQUE_LSA */
3994 continue;
3995 default:
3996 break;
3997 }
3998 if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
3999 (!self && ospf_lsdb_count (area->lsdb, type) > 0))
4000 {
4001 vty_out (vty, " %s (Area %s)%s%s",
4002 show_database_desc[type],
4003 ospf_area_desc_string (area),
4004 VTY_NEWLINE, VTY_NEWLINE);
4005 vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
4006
paul020709f2003-04-04 02:44:16 +00004007 LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
4008 show_lsa_summary (vty, lsa, self);
paul718e3742002-12-13 20:15:29 +00004009
4010 vty_out (vty, "%s", VTY_NEWLINE);
4011 }
4012 }
4013 }
4014
4015 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4016 {
4017 switch (type)
4018 {
4019 case OSPF_AS_EXTERNAL_LSA:
4020#ifdef HAVE_OPAQUE_LSA
4021 case OSPF_OPAQUE_AS_LSA:
4022#endif /* HAVE_OPAQUE_LSA */
paule8e19462006-01-19 20:16:55 +00004023 break;
paul718e3742002-12-13 20:15:29 +00004024 default:
4025 continue;
4026 }
paul68980082003-03-25 05:07:42 +00004027 if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4028 (!self && ospf_lsdb_count (ospf->lsdb, type)))
paul718e3742002-12-13 20:15:29 +00004029 {
4030 vty_out (vty, " %s%s%s",
4031 show_database_desc[type],
4032 VTY_NEWLINE, VTY_NEWLINE);
4033 vty_out (vty, "%s%s", show_database_header[type],
4034 VTY_NEWLINE);
paul020709f2003-04-04 02:44:16 +00004035
4036 LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4037 show_lsa_summary (vty, lsa, self);
4038
paul718e3742002-12-13 20:15:29 +00004039 vty_out (vty, "%s", VTY_NEWLINE);
4040 }
4041 }
4042
4043 vty_out (vty, "%s", VTY_NEWLINE);
4044}
4045
paul4dadc292005-05-06 21:37:42 +00004046static void
paul020709f2003-04-04 02:44:16 +00004047show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00004048{
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004049 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00004050
4051 vty_out (vty, "%s MaxAge Link States:%s%s",
4052 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4053
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004054 for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
paul1eb8ef22005-04-07 07:30:20 +00004055 {
Dinesh Dutt91e6a0e2012-12-04 10:46:37 -08004056 struct ospf_lsa *lsa;
4057
4058 if ((lsa = rn->info) != NULL)
4059 {
4060 vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4061 vty_out (vty, "Link State ID: %s%s",
4062 inet_ntoa (lsa->data->id), VTY_NEWLINE);
4063 vty_out (vty, "Advertising Router: %s%s",
4064 inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4065 vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4066 vty_out (vty, "%s", VTY_NEWLINE);
4067 }
paul1eb8ef22005-04-07 07:30:20 +00004068 }
paul718e3742002-12-13 20:15:29 +00004069}
4070
paul718e3742002-12-13 20:15:29 +00004071#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4072#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
paul718e3742002-12-13 20:15:29 +00004073
4074#ifdef HAVE_OPAQUE_LSA
4075#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4076#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4077#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4078#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4079#else /* HAVE_OPAQUE_LSA */
4080#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4081#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4082#define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4083#define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4084#endif /* HAVE_OPAQUE_LSA */
4085
4086#define OSPF_LSA_TYPES_CMD_STR \
4087 "asbr-summary|external|network|router|summary" \
4088 OSPF_LSA_TYPE_NSSA_CMD_STR \
4089 OSPF_LSA_TYPE_OPAQUE_CMD_STR
4090
4091#define OSPF_LSA_TYPES_DESC \
4092 "ASBR summary link states\n" \
4093 "External link states\n" \
4094 "Network link states\n" \
4095 "Router link states\n" \
4096 "Network summary link states\n" \
4097 OSPF_LSA_TYPE_NSSA_DESC \
4098 OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4099 OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4100 OSPF_LSA_TYPE_OPAQUE_AS_DESC
4101
4102DEFUN (show_ip_ospf_database,
4103 show_ip_ospf_database_cmd,
4104 "show ip ospf database",
4105 SHOW_STR
4106 IP_STR
4107 "OSPF information\n"
4108 "Database summary\n")
4109{
paul020709f2003-04-04 02:44:16 +00004110 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004111 int type, ret;
4112 struct in_addr id, adv_router;
4113
paul020709f2003-04-04 02:44:16 +00004114 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004115 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004116 {
4117 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4118 return CMD_SUCCESS;
4119 }
paul718e3742002-12-13 20:15:29 +00004120
4121 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004122 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004123
4124 /* Show all LSA. */
4125 if (argc == 0)
4126 {
paul020709f2003-04-04 02:44:16 +00004127 show_ip_ospf_database_summary (vty, ospf, 0);
paul718e3742002-12-13 20:15:29 +00004128 return CMD_SUCCESS;
4129 }
4130
4131 /* Set database type to show. */
4132 if (strncmp (argv[0], "r", 1) == 0)
4133 type = OSPF_ROUTER_LSA;
4134 else if (strncmp (argv[0], "ne", 2) == 0)
4135 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004136 else if (strncmp (argv[0], "ns", 2) == 0)
4137 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004138 else if (strncmp (argv[0], "su", 2) == 0)
4139 type = OSPF_SUMMARY_LSA;
4140 else if (strncmp (argv[0], "a", 1) == 0)
4141 type = OSPF_ASBR_SUMMARY_LSA;
4142 else if (strncmp (argv[0], "e", 1) == 0)
4143 type = OSPF_AS_EXTERNAL_LSA;
4144 else if (strncmp (argv[0], "se", 2) == 0)
4145 {
paul020709f2003-04-04 02:44:16 +00004146 show_ip_ospf_database_summary (vty, ospf, 1);
paul718e3742002-12-13 20:15:29 +00004147 return CMD_SUCCESS;
4148 }
4149 else if (strncmp (argv[0], "m", 1) == 0)
4150 {
paul020709f2003-04-04 02:44:16 +00004151 show_ip_ospf_database_maxage (vty, ospf);
paul718e3742002-12-13 20:15:29 +00004152 return CMD_SUCCESS;
4153 }
4154#ifdef HAVE_OPAQUE_LSA
4155 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4156 type = OSPF_OPAQUE_LINK_LSA;
4157 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4158 type = OSPF_OPAQUE_AREA_LSA;
4159 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4160 type = OSPF_OPAQUE_AS_LSA;
4161#endif /* HAVE_OPAQUE_LSA */
4162 else
4163 return CMD_WARNING;
4164
4165 /* `show ip ospf database LSA'. */
4166 if (argc == 1)
paul020709f2003-04-04 02:44:16 +00004167 show_lsa_detail (vty, ospf, type, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00004168 else if (argc >= 2)
4169 {
4170 ret = inet_aton (argv[1], &id);
4171 if (!ret)
4172 return CMD_WARNING;
4173
4174 /* `show ip ospf database LSA ID'. */
4175 if (argc == 2)
paul020709f2003-04-04 02:44:16 +00004176 show_lsa_detail (vty, ospf, type, &id, NULL);
paul718e3742002-12-13 20:15:29 +00004177 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4178 else if (argc == 3)
4179 {
4180 if (strncmp (argv[2], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004181 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004182 else
4183 {
4184 ret = inet_aton (argv[2], &adv_router);
4185 if (!ret)
4186 return CMD_WARNING;
4187 }
paul020709f2003-04-04 02:44:16 +00004188 show_lsa_detail (vty, ospf, type, &id, &adv_router);
paul718e3742002-12-13 20:15:29 +00004189 }
4190 }
4191
4192 return CMD_SUCCESS;
4193}
4194
4195ALIAS (show_ip_ospf_database,
4196 show_ip_ospf_database_type_cmd,
4197 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4198 SHOW_STR
4199 IP_STR
4200 "OSPF information\n"
4201 "Database summary\n"
4202 OSPF_LSA_TYPES_DESC
4203 "LSAs in MaxAge list\n"
4204 "Self-originated link states\n")
4205
4206ALIAS (show_ip_ospf_database,
4207 show_ip_ospf_database_type_id_cmd,
4208 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4209 SHOW_STR
4210 IP_STR
4211 "OSPF information\n"
4212 "Database summary\n"
4213 OSPF_LSA_TYPES_DESC
4214 "Link State ID (as an IP address)\n")
4215
4216ALIAS (show_ip_ospf_database,
4217 show_ip_ospf_database_type_id_adv_router_cmd,
4218 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
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 "Advertising Router link states\n"
4226 "Advertising Router (as an IP address)\n")
4227
4228ALIAS (show_ip_ospf_database,
4229 show_ip_ospf_database_type_id_self_cmd,
4230 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4231 SHOW_STR
4232 IP_STR
4233 "OSPF information\n"
4234 "Database summary\n"
4235 OSPF_LSA_TYPES_DESC
4236 "Link State ID (as an IP address)\n"
4237 "Self-originated link states\n"
4238 "\n")
4239
4240DEFUN (show_ip_ospf_database_type_adv_router,
4241 show_ip_ospf_database_type_adv_router_cmd,
4242 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4243 SHOW_STR
4244 IP_STR
4245 "OSPF information\n"
4246 "Database summary\n"
4247 OSPF_LSA_TYPES_DESC
4248 "Advertising Router link states\n"
4249 "Advertising Router (as an IP address)\n")
4250{
paul020709f2003-04-04 02:44:16 +00004251 struct ospf *ospf;
paul718e3742002-12-13 20:15:29 +00004252 int type, ret;
4253 struct in_addr adv_router;
4254
paul020709f2003-04-04 02:44:16 +00004255 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00004256 if (ospf == NULL)
Paul Jakmacac3b5c2006-05-11 13:31:11 +00004257 {
4258 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4259 return CMD_SUCCESS;
4260 }
paul718e3742002-12-13 20:15:29 +00004261
4262 vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
paul68980082003-03-25 05:07:42 +00004263 inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00004264
4265 if (argc != 2)
4266 return CMD_WARNING;
4267
4268 /* Set database type to show. */
4269 if (strncmp (argv[0], "r", 1) == 0)
4270 type = OSPF_ROUTER_LSA;
4271 else if (strncmp (argv[0], "ne", 2) == 0)
4272 type = OSPF_NETWORK_LSA;
paul718e3742002-12-13 20:15:29 +00004273 else if (strncmp (argv[0], "ns", 2) == 0)
4274 type = OSPF_AS_NSSA_LSA;
paul718e3742002-12-13 20:15:29 +00004275 else if (strncmp (argv[0], "s", 1) == 0)
4276 type = OSPF_SUMMARY_LSA;
4277 else if (strncmp (argv[0], "a", 1) == 0)
4278 type = OSPF_ASBR_SUMMARY_LSA;
4279 else if (strncmp (argv[0], "e", 1) == 0)
4280 type = OSPF_AS_EXTERNAL_LSA;
4281#ifdef HAVE_OPAQUE_LSA
4282 else if (strncmp (argv[0], "opaque-l", 8) == 0)
4283 type = OSPF_OPAQUE_LINK_LSA;
4284 else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4285 type = OSPF_OPAQUE_AREA_LSA;
4286 else if (strncmp (argv[0], "opaque-as", 9) == 0)
4287 type = OSPF_OPAQUE_AS_LSA;
4288#endif /* HAVE_OPAQUE_LSA */
4289 else
4290 return CMD_WARNING;
4291
4292 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4293 if (strncmp (argv[1], "s", 1) == 0)
paul68980082003-03-25 05:07:42 +00004294 adv_router = ospf->router_id;
paul718e3742002-12-13 20:15:29 +00004295 else
4296 {
4297 ret = inet_aton (argv[1], &adv_router);
4298 if (!ret)
4299 return CMD_WARNING;
4300 }
4301
paul020709f2003-04-04 02:44:16 +00004302 show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
paul718e3742002-12-13 20:15:29 +00004303
4304 return CMD_SUCCESS;
4305}
4306
4307ALIAS (show_ip_ospf_database_type_adv_router,
4308 show_ip_ospf_database_type_self_cmd,
4309 "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4310 SHOW_STR
4311 IP_STR
4312 "OSPF information\n"
4313 "Database summary\n"
4314 OSPF_LSA_TYPES_DESC
4315 "Self-originated link states\n")
4316
David Lamparter6b0655a2014-06-04 06:53:35 +02004317
paul718e3742002-12-13 20:15:29 +00004318DEFUN (ip_ospf_authentication_args,
4319 ip_ospf_authentication_args_addr_cmd,
4320 "ip ospf authentication (null|message-digest) A.B.C.D",
4321 "IP Information\n"
4322 "OSPF interface commands\n"
4323 "Enable authentication on this interface\n"
4324 "Use null authentication\n"
4325 "Use message-digest authentication\n"
4326 "Address of interface")
4327{
4328 struct interface *ifp;
4329 struct in_addr addr;
4330 int ret;
4331 struct ospf_if_params *params;
4332
4333 ifp = vty->index;
4334 params = IF_DEF_PARAMS (ifp);
4335
4336 if (argc == 2)
4337 {
4338 ret = inet_aton(argv[1], &addr);
4339 if (!ret)
4340 {
4341 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4342 VTY_NEWLINE);
4343 return CMD_WARNING;
4344 }
4345
4346 params = ospf_get_if_params (ifp, addr);
4347 ospf_if_update_params (ifp, addr);
4348 }
4349
4350 /* Handle null authentication */
4351 if ( argv[0][0] == 'n' )
4352 {
4353 SET_IF_PARAM (params, auth_type);
4354 params->auth_type = OSPF_AUTH_NULL;
4355 return CMD_SUCCESS;
4356 }
4357
4358 /* Handle message-digest authentication */
4359 if ( argv[0][0] == 'm' )
4360 {
4361 SET_IF_PARAM (params, auth_type);
4362 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4363 return CMD_SUCCESS;
4364 }
4365
4366 vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4367 return CMD_WARNING;
4368}
4369
4370ALIAS (ip_ospf_authentication_args,
4371 ip_ospf_authentication_args_cmd,
4372 "ip ospf authentication (null|message-digest)",
4373 "IP Information\n"
4374 "OSPF interface commands\n"
4375 "Enable authentication on this interface\n"
4376 "Use null authentication\n"
4377 "Use message-digest authentication\n")
4378
4379DEFUN (ip_ospf_authentication,
4380 ip_ospf_authentication_addr_cmd,
4381 "ip ospf authentication A.B.C.D",
4382 "IP Information\n"
4383 "OSPF interface commands\n"
4384 "Enable authentication on this interface\n"
4385 "Address of interface")
4386{
4387 struct interface *ifp;
4388 struct in_addr addr;
4389 int ret;
4390 struct ospf_if_params *params;
4391
4392 ifp = vty->index;
4393 params = IF_DEF_PARAMS (ifp);
4394
4395 if (argc == 1)
4396 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004397 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004398 if (!ret)
4399 {
4400 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4401 VTY_NEWLINE);
4402 return CMD_WARNING;
4403 }
4404
4405 params = ospf_get_if_params (ifp, addr);
4406 ospf_if_update_params (ifp, addr);
4407 }
4408
4409 SET_IF_PARAM (params, auth_type);
4410 params->auth_type = OSPF_AUTH_SIMPLE;
4411
4412 return CMD_SUCCESS;
4413}
4414
4415ALIAS (ip_ospf_authentication,
4416 ip_ospf_authentication_cmd,
4417 "ip ospf authentication",
4418 "IP Information\n"
4419 "OSPF interface commands\n"
4420 "Enable authentication on this interface\n")
4421
4422DEFUN (no_ip_ospf_authentication,
4423 no_ip_ospf_authentication_addr_cmd,
4424 "no ip ospf authentication A.B.C.D",
4425 NO_STR
4426 "IP Information\n"
4427 "OSPF interface commands\n"
4428 "Enable authentication on this interface\n"
4429 "Address of interface")
4430{
4431 struct interface *ifp;
4432 struct in_addr addr;
4433 int ret;
4434 struct ospf_if_params *params;
4435
4436 ifp = vty->index;
4437 params = IF_DEF_PARAMS (ifp);
4438
4439 if (argc == 1)
4440 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004441 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004442 if (!ret)
4443 {
4444 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4445 VTY_NEWLINE);
4446 return CMD_WARNING;
4447 }
4448
4449 params = ospf_lookup_if_params (ifp, addr);
4450 if (params == NULL)
4451 return CMD_SUCCESS;
4452 }
4453
4454 params->auth_type = OSPF_AUTH_NOTSET;
4455 UNSET_IF_PARAM (params, auth_type);
4456
4457 if (params != IF_DEF_PARAMS (ifp))
4458 {
4459 ospf_free_if_params (ifp, addr);
4460 ospf_if_update_params (ifp, addr);
4461 }
4462
4463 return CMD_SUCCESS;
4464}
4465
4466ALIAS (no_ip_ospf_authentication,
4467 no_ip_ospf_authentication_cmd,
4468 "no ip ospf authentication",
4469 NO_STR
4470 "IP Information\n"
4471 "OSPF interface commands\n"
4472 "Enable authentication on this interface\n")
4473
4474DEFUN (ip_ospf_authentication_key,
4475 ip_ospf_authentication_key_addr_cmd,
4476 "ip ospf authentication-key AUTH_KEY A.B.C.D",
4477 "IP Information\n"
4478 "OSPF interface commands\n"
4479 "Authentication password (key)\n"
4480 "The OSPF password (key)\n"
4481 "Address of interface")
4482{
4483 struct interface *ifp;
4484 struct in_addr addr;
4485 int ret;
4486 struct ospf_if_params *params;
4487
4488 ifp = vty->index;
4489 params = IF_DEF_PARAMS (ifp);
4490
4491 if (argc == 2)
4492 {
4493 ret = inet_aton(argv[1], &addr);
4494 if (!ret)
4495 {
4496 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4497 VTY_NEWLINE);
4498 return CMD_WARNING;
4499 }
4500
4501 params = ospf_get_if_params (ifp, addr);
4502 ospf_if_update_params (ifp, addr);
4503 }
4504
4505
4506 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
hassoc9e52be2004-09-26 16:09:34 +00004507 strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
paul718e3742002-12-13 20:15:29 +00004508 SET_IF_PARAM (params, auth_simple);
4509
4510 return CMD_SUCCESS;
4511}
4512
4513ALIAS (ip_ospf_authentication_key,
4514 ip_ospf_authentication_key_cmd,
4515 "ip ospf authentication-key AUTH_KEY",
4516 "IP Information\n"
4517 "OSPF interface commands\n"
4518 "Authentication password (key)\n"
4519 "The OSPF password (key)")
4520
4521ALIAS (ip_ospf_authentication_key,
4522 ospf_authentication_key_cmd,
4523 "ospf authentication-key AUTH_KEY",
4524 "OSPF interface commands\n"
4525 "Authentication password (key)\n"
4526 "The OSPF password (key)")
4527
4528DEFUN (no_ip_ospf_authentication_key,
4529 no_ip_ospf_authentication_key_addr_cmd,
4530 "no ip ospf authentication-key A.B.C.D",
4531 NO_STR
4532 "IP Information\n"
4533 "OSPF interface commands\n"
4534 "Authentication password (key)\n"
4535 "Address of interface")
4536{
4537 struct interface *ifp;
4538 struct in_addr addr;
4539 int ret;
4540 struct ospf_if_params *params;
4541
4542 ifp = vty->index;
4543 params = IF_DEF_PARAMS (ifp);
4544
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004545 if (argc == 1)
paul718e3742002-12-13 20:15:29 +00004546 {
Paul Jakma5dcf71d2007-05-10 03:00:09 +00004547 ret = inet_aton(argv[0], &addr);
paul718e3742002-12-13 20:15:29 +00004548 if (!ret)
4549 {
4550 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4551 VTY_NEWLINE);
4552 return CMD_WARNING;
4553 }
4554
4555 params = ospf_lookup_if_params (ifp, addr);
4556 if (params == NULL)
4557 return CMD_SUCCESS;
4558 }
4559
4560 memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4561 UNSET_IF_PARAM (params, auth_simple);
4562
4563 if (params != IF_DEF_PARAMS (ifp))
4564 {
4565 ospf_free_if_params (ifp, addr);
4566 ospf_if_update_params (ifp, addr);
4567 }
4568
4569 return CMD_SUCCESS;
4570}
4571
4572ALIAS (no_ip_ospf_authentication_key,
4573 no_ip_ospf_authentication_key_cmd,
4574 "no ip ospf authentication-key",
4575 NO_STR
4576 "IP Information\n"
4577 "OSPF interface commands\n"
4578 "Authentication password (key)\n")
4579
4580ALIAS (no_ip_ospf_authentication_key,
4581 no_ospf_authentication_key_cmd,
4582 "no ospf authentication-key",
4583 NO_STR
4584 "OSPF interface commands\n"
4585 "Authentication password (key)\n")
4586
4587DEFUN (ip_ospf_message_digest_key,
4588 ip_ospf_message_digest_key_addr_cmd,
4589 "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4590 "IP Information\n"
4591 "OSPF interface commands\n"
4592 "Message digest authentication password (key)\n"
4593 "Key ID\n"
4594 "Use MD5 algorithm\n"
4595 "The OSPF password (key)"
4596 "Address of interface")
4597{
4598 struct interface *ifp;
4599 struct crypt_key *ck;
4600 u_char key_id;
4601 struct in_addr addr;
4602 int ret;
4603 struct ospf_if_params *params;
4604
4605 ifp = vty->index;
4606 params = IF_DEF_PARAMS (ifp);
4607
4608 if (argc == 3)
4609 {
4610 ret = inet_aton(argv[2], &addr);
4611 if (!ret)
4612 {
4613 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4614 VTY_NEWLINE);
4615 return CMD_WARNING;
4616 }
4617
4618 params = ospf_get_if_params (ifp, addr);
4619 ospf_if_update_params (ifp, addr);
4620 }
4621
4622 key_id = strtol (argv[0], NULL, 10);
4623 if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4624 {
4625 vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4626 return CMD_WARNING;
4627 }
4628
4629 ck = ospf_crypt_key_new ();
4630 ck->key_id = (u_char) key_id;
4631 memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
hassoc9e52be2004-09-26 16:09:34 +00004632 strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
paul718e3742002-12-13 20:15:29 +00004633
4634 ospf_crypt_key_add (params->auth_crypt, ck);
4635 SET_IF_PARAM (params, auth_crypt);
4636
4637 return CMD_SUCCESS;
4638}
4639
4640ALIAS (ip_ospf_message_digest_key,
4641 ip_ospf_message_digest_key_cmd,
4642 "ip ospf message-digest-key <1-255> md5 KEY",
4643 "IP Information\n"
4644 "OSPF interface commands\n"
4645 "Message digest authentication password (key)\n"
4646 "Key ID\n"
4647 "Use MD5 algorithm\n"
4648 "The OSPF password (key)")
4649
4650ALIAS (ip_ospf_message_digest_key,
4651 ospf_message_digest_key_cmd,
4652 "ospf message-digest-key <1-255> md5 KEY",
4653 "OSPF interface commands\n"
4654 "Message digest authentication password (key)\n"
4655 "Key ID\n"
4656 "Use MD5 algorithm\n"
4657 "The OSPF password (key)")
4658
4659DEFUN (no_ip_ospf_message_digest_key,
4660 no_ip_ospf_message_digest_key_addr_cmd,
4661 "no ip ospf message-digest-key <1-255> A.B.C.D",
4662 NO_STR
4663 "IP Information\n"
4664 "OSPF interface commands\n"
4665 "Message digest authentication password (key)\n"
4666 "Key ID\n"
4667 "Address of interface")
4668{
4669 struct interface *ifp;
4670 struct crypt_key *ck;
4671 int key_id;
4672 struct in_addr addr;
4673 int ret;
4674 struct ospf_if_params *params;
4675
4676 ifp = vty->index;
4677 params = IF_DEF_PARAMS (ifp);
4678
4679 if (argc == 2)
4680 {
4681 ret = inet_aton(argv[1], &addr);
4682 if (!ret)
4683 {
4684 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4685 VTY_NEWLINE);
4686 return CMD_WARNING;
4687 }
4688
4689 params = ospf_lookup_if_params (ifp, addr);
4690 if (params == NULL)
4691 return CMD_SUCCESS;
4692 }
4693
4694 key_id = strtol (argv[0], NULL, 10);
4695 ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4696 if (ck == NULL)
4697 {
4698 vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4699 return CMD_WARNING;
4700 }
4701
4702 ospf_crypt_key_delete (params->auth_crypt, key_id);
4703
4704 if (params != IF_DEF_PARAMS (ifp))
4705 {
4706 ospf_free_if_params (ifp, addr);
4707 ospf_if_update_params (ifp, addr);
4708 }
4709
4710 return CMD_SUCCESS;
4711}
4712
4713ALIAS (no_ip_ospf_message_digest_key,
4714 no_ip_ospf_message_digest_key_cmd,
4715 "no ip ospf message-digest-key <1-255>",
4716 NO_STR
4717 "IP Information\n"
4718 "OSPF interface commands\n"
4719 "Message digest authentication password (key)\n"
4720 "Key ID\n")
4721
4722ALIAS (no_ip_ospf_message_digest_key,
4723 no_ospf_message_digest_key_cmd,
4724 "no ospf message-digest-key <1-255>",
4725 NO_STR
4726 "OSPF interface commands\n"
4727 "Message digest authentication password (key)\n"
4728 "Key ID\n")
4729
4730DEFUN (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004731 ip_ospf_cost_u32_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004732 "ip ospf cost <1-65535> A.B.C.D",
4733 "IP Information\n"
4734 "OSPF interface commands\n"
4735 "Interface cost\n"
4736 "Cost\n"
4737 "Address of interface")
4738{
4739 struct interface *ifp = vty->index;
4740 u_int32_t cost;
4741 struct in_addr addr;
4742 int ret;
4743 struct ospf_if_params *params;
4744
4745 params = IF_DEF_PARAMS (ifp);
4746
4747 cost = strtol (argv[0], NULL, 10);
4748
4749 /* cost range is <1-65535>. */
4750 if (cost < 1 || cost > 65535)
4751 {
4752 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4753 return CMD_WARNING;
4754 }
4755
4756 if (argc == 2)
4757 {
4758 ret = inet_aton(argv[1], &addr);
4759 if (!ret)
4760 {
4761 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4762 VTY_NEWLINE);
4763 return CMD_WARNING;
4764 }
4765
4766 params = ospf_get_if_params (ifp, addr);
4767 ospf_if_update_params (ifp, addr);
4768 }
4769
4770 SET_IF_PARAM (params, output_cost_cmd);
4771 params->output_cost_cmd = cost;
4772
4773 ospf_if_recalculate_output_cost (ifp);
4774
4775 return CMD_SUCCESS;
4776}
4777
4778ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004779 ip_ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004780 "ip ospf cost <1-65535>",
4781 "IP Information\n"
4782 "OSPF interface commands\n"
4783 "Interface cost\n"
4784 "Cost")
4785
4786ALIAS (ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004787 ospf_cost_u32_cmd,
paul718e3742002-12-13 20:15:29 +00004788 "ospf cost <1-65535>",
4789 "OSPF interface commands\n"
4790 "Interface cost\n"
4791 "Cost")
4792
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004793ALIAS (ip_ospf_cost,
4794 ospf_cost_u32_inet4_cmd,
4795 "ospf cost <1-65535> A.B.C.D",
4796 "OSPF interface commands\n"
4797 "Interface cost\n"
4798 "Cost\n"
4799 "Address of interface")
4800
paul718e3742002-12-13 20:15:29 +00004801DEFUN (no_ip_ospf_cost,
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004802 no_ip_ospf_cost_inet4_cmd,
paul718e3742002-12-13 20:15:29 +00004803 "no ip ospf cost A.B.C.D",
4804 NO_STR
4805 "IP Information\n"
4806 "OSPF interface commands\n"
4807 "Interface cost\n"
4808 "Address of interface")
4809{
4810 struct interface *ifp = vty->index;
4811 struct in_addr addr;
4812 int ret;
4813 struct ospf_if_params *params;
4814
4815 ifp = vty->index;
4816 params = IF_DEF_PARAMS (ifp);
4817
4818 if (argc == 1)
4819 {
4820 ret = inet_aton(argv[0], &addr);
4821 if (!ret)
4822 {
4823 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4824 VTY_NEWLINE);
4825 return CMD_WARNING;
4826 }
4827
4828 params = ospf_lookup_if_params (ifp, addr);
4829 if (params == NULL)
4830 return CMD_SUCCESS;
4831 }
4832
4833 UNSET_IF_PARAM (params, output_cost_cmd);
4834
4835 if (params != IF_DEF_PARAMS (ifp))
4836 {
4837 ospf_free_if_params (ifp, addr);
4838 ospf_if_update_params (ifp, addr);
4839 }
4840
4841 ospf_if_recalculate_output_cost (ifp);
4842
4843 return CMD_SUCCESS;
4844}
4845
4846ALIAS (no_ip_ospf_cost,
4847 no_ip_ospf_cost_cmd,
4848 "no ip ospf cost",
4849 NO_STR
4850 "IP Information\n"
4851 "OSPF interface commands\n"
4852 "Interface cost\n")
4853
4854ALIAS (no_ip_ospf_cost,
4855 no_ospf_cost_cmd,
4856 "no ospf cost",
4857 NO_STR
4858 "OSPF interface commands\n"
4859 "Interface cost\n")
4860
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004861ALIAS (no_ip_ospf_cost,
4862 no_ospf_cost_inet4_cmd,
4863 "no ospf cost A.B.C.D",
4864 NO_STR
4865 "OSPF interface commands\n"
4866 "Interface cost\n"
4867 "Address of interface")
4868
Denis Ovsienko827341b2009-09-28 19:34:59 +04004869DEFUN (no_ip_ospf_cost2,
4870 no_ip_ospf_cost_u32_cmd,
4871 "no ip ospf cost <1-65535>",
4872 NO_STR
4873 "IP Information\n"
4874 "OSPF interface commands\n"
4875 "Interface cost\n"
4876 "Cost")
4877{
4878 struct interface *ifp = vty->index;
4879 struct in_addr addr;
4880 u_int32_t cost;
4881 int ret;
4882 struct ospf_if_params *params;
4883
4884 ifp = vty->index;
4885 params = IF_DEF_PARAMS (ifp);
4886
4887 /* According to the semantics we are mimicking "no ip ospf cost N" is
4888 * always treated as "no ip ospf cost" regardless of the actual value
4889 * of N already configured for the interface. Thus the first argument
4890 * is always checked to be a number, but is ignored after that.
4891 */
4892 cost = strtol (argv[0], NULL, 10);
4893 if (cost < 1 || cost > 65535)
4894 {
4895 vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4896 return CMD_WARNING;
4897 }
4898
4899 if (argc == 2)
4900 {
4901 ret = inet_aton(argv[1], &addr);
4902 if (!ret)
4903 {
4904 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4905 VTY_NEWLINE);
4906 return CMD_WARNING;
4907 }
4908
4909 params = ospf_lookup_if_params (ifp, addr);
4910 if (params == NULL)
4911 return CMD_SUCCESS;
4912 }
4913
4914 UNSET_IF_PARAM (params, output_cost_cmd);
4915
4916 if (params != IF_DEF_PARAMS (ifp))
4917 {
4918 ospf_free_if_params (ifp, addr);
4919 ospf_if_update_params (ifp, addr);
4920 }
4921
4922 ospf_if_recalculate_output_cost (ifp);
4923
4924 return CMD_SUCCESS;
4925}
4926
4927ALIAS (no_ip_ospf_cost2,
4928 no_ospf_cost_u32_cmd,
4929 "no ospf cost <1-65535>",
4930 NO_STR
4931 "OSPF interface commands\n"
4932 "Interface cost\n"
4933 "Cost")
4934
4935ALIAS (no_ip_ospf_cost2,
4936 no_ip_ospf_cost_u32_inet4_cmd,
4937 "no ip ospf cost <1-65535> A.B.C.D",
4938 NO_STR
4939 "IP Information\n"
4940 "OSPF interface commands\n"
4941 "Interface cost\n"
4942 "Cost\n"
4943 "Address of interface")
4944
4945ALIAS (no_ip_ospf_cost2,
4946 no_ospf_cost_u32_inet4_cmd,
4947 "no ospf cost <1-65535> A.B.C.D",
4948 NO_STR
4949 "OSPF interface commands\n"
4950 "Interface cost\n"
4951 "Cost\n"
4952 "Address of interface")
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04004953
paul4dadc292005-05-06 21:37:42 +00004954static void
paul718e3742002-12-13 20:15:29 +00004955ospf_nbr_timer_update (struct ospf_interface *oi)
4956{
4957 struct route_node *rn;
4958 struct ospf_neighbor *nbr;
4959
4960 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4961 if ((nbr = rn->info))
4962 {
4963 nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4964 nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4965 nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4966 nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4967 }
4968}
4969
paulf9ad9372005-10-21 00:45:17 +00004970static int
4971ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4972 const char *nbr_str,
4973 const char *fast_hello_str)
paul718e3742002-12-13 20:15:29 +00004974{
4975 struct interface *ifp = vty->index;
4976 u_int32_t seconds;
paulf9ad9372005-10-21 00:45:17 +00004977 u_char hellomult;
paul718e3742002-12-13 20:15:29 +00004978 struct in_addr addr;
4979 int ret;
4980 struct ospf_if_params *params;
4981 struct ospf_interface *oi;
4982 struct route_node *rn;
4983
4984 params = IF_DEF_PARAMS (ifp);
paulf9ad9372005-10-21 00:45:17 +00004985
4986 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00004987 {
paulf9ad9372005-10-21 00:45:17 +00004988 ret = inet_aton(nbr_str, &addr);
paul718e3742002-12-13 20:15:29 +00004989 if (!ret)
4990 {
4991 vty_out (vty, "Please specify interface address by A.B.C.D%s",
4992 VTY_NEWLINE);
4993 return CMD_WARNING;
4994 }
4995
4996 params = ospf_get_if_params (ifp, addr);
4997 ospf_if_update_params (ifp, addr);
4998 }
4999
paulf9ad9372005-10-21 00:45:17 +00005000 if (interval_str)
5001 {
5002 VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
5003 1, 65535);
5004
5005 /* reset fast_hello too, just to be sure */
5006 UNSET_IF_PARAM (params, fast_hello);
5007 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5008 }
5009 else if (fast_hello_str)
5010 {
5011 VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
5012 1, 10);
5013 /* 1s dead-interval with sub-second hellos desired */
5014 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
5015 SET_IF_PARAM (params, fast_hello);
5016 params->fast_hello = hellomult;
5017 }
5018 else
5019 {
5020 vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
5021 VTY_NEWLINE);
5022 return CMD_WARNING;
5023 }
5024
paul718e3742002-12-13 20:15:29 +00005025 SET_IF_PARAM (params, v_wait);
5026 params->v_wait = seconds;
5027
5028 /* Update timer values in neighbor structure. */
paulf9ad9372005-10-21 00:45:17 +00005029 if (nbr_str)
paul718e3742002-12-13 20:15:29 +00005030 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005031 struct ospf *ospf;
5032 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005033 {
5034 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5035 if (oi)
5036 ospf_nbr_timer_update (oi);
5037 }
paul718e3742002-12-13 20:15:29 +00005038 }
5039 else
5040 {
5041 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5042 if ((oi = rn->info))
5043 ospf_nbr_timer_update (oi);
5044 }
5045
5046 return CMD_SUCCESS;
5047}
5048
paulf9ad9372005-10-21 00:45:17 +00005049
5050DEFUN (ip_ospf_dead_interval,
5051 ip_ospf_dead_interval_addr_cmd,
5052 "ip ospf dead-interval <1-65535> A.B.C.D",
5053 "IP Information\n"
5054 "OSPF interface commands\n"
5055 "Interval after which a neighbor is declared dead\n"
5056 "Seconds\n"
5057 "Address of interface\n")
5058{
5059 if (argc == 2)
5060 return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
5061 else
5062 return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
5063}
5064
paul718e3742002-12-13 20:15:29 +00005065ALIAS (ip_ospf_dead_interval,
5066 ip_ospf_dead_interval_cmd,
5067 "ip ospf dead-interval <1-65535>",
5068 "IP Information\n"
5069 "OSPF interface commands\n"
5070 "Interval after which a neighbor is declared dead\n"
5071 "Seconds\n")
5072
5073ALIAS (ip_ospf_dead_interval,
5074 ospf_dead_interval_cmd,
5075 "ospf dead-interval <1-65535>",
5076 "OSPF interface commands\n"
5077 "Interval after which a neighbor is declared dead\n"
5078 "Seconds\n")
5079
paulf9ad9372005-10-21 00:45:17 +00005080DEFUN (ip_ospf_dead_interval_minimal,
5081 ip_ospf_dead_interval_minimal_addr_cmd,
5082 "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5083 "IP Information\n"
5084 "OSPF interface commands\n"
5085 "Interval after which a neighbor is declared dead\n"
5086 "Minimal 1s dead-interval with fast sub-second hellos\n"
5087 "Hello multiplier factor\n"
5088 "Number of Hellos to send each second\n"
5089 "Address of interface\n")
5090{
5091 if (argc == 2)
5092 return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5093 else
5094 return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5095}
5096
5097ALIAS (ip_ospf_dead_interval_minimal,
5098 ip_ospf_dead_interval_minimal_cmd,
5099 "ip ospf dead-interval minimal hello-multiplier <1-10>",
5100 "IP Information\n"
5101 "OSPF interface commands\n"
5102 "Interval after which a neighbor is declared dead\n"
5103 "Minimal 1s dead-interval with fast sub-second hellos\n"
5104 "Hello multiplier factor\n"
5105 "Number of Hellos to send each second\n")
5106
paul718e3742002-12-13 20:15:29 +00005107DEFUN (no_ip_ospf_dead_interval,
5108 no_ip_ospf_dead_interval_addr_cmd,
5109 "no ip ospf dead-interval A.B.C.D",
5110 NO_STR
5111 "IP Information\n"
5112 "OSPF interface commands\n"
5113 "Interval after which a neighbor is declared dead\n"
5114 "Address of interface")
5115{
5116 struct interface *ifp = vty->index;
5117 struct in_addr addr;
5118 int ret;
5119 struct ospf_if_params *params;
5120 struct ospf_interface *oi;
5121 struct route_node *rn;
paul020709f2003-04-04 02:44:16 +00005122
paul718e3742002-12-13 20:15:29 +00005123 ifp = vty->index;
5124 params = IF_DEF_PARAMS (ifp);
5125
5126 if (argc == 1)
5127 {
5128 ret = inet_aton(argv[0], &addr);
5129 if (!ret)
5130 {
5131 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5132 VTY_NEWLINE);
5133 return CMD_WARNING;
5134 }
5135
5136 params = ospf_lookup_if_params (ifp, addr);
5137 if (params == NULL)
5138 return CMD_SUCCESS;
5139 }
5140
5141 UNSET_IF_PARAM (params, v_wait);
5142 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
paulf9ad9372005-10-21 00:45:17 +00005143
5144 UNSET_IF_PARAM (params, fast_hello);
5145 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5146
paul718e3742002-12-13 20:15:29 +00005147 if (params != IF_DEF_PARAMS (ifp))
5148 {
5149 ospf_free_if_params (ifp, addr);
5150 ospf_if_update_params (ifp, addr);
5151 }
5152
5153 /* Update timer values in neighbor structure. */
5154 if (argc == 1)
5155 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00005156 struct ospf *ospf;
5157
5158 if ((ospf = ospf_lookup()))
paul68980082003-03-25 05:07:42 +00005159 {
5160 oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5161 if (oi)
5162 ospf_nbr_timer_update (oi);
5163 }
paul718e3742002-12-13 20:15:29 +00005164 }
5165 else
5166 {
5167 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5168 if ((oi = rn->info))
5169 ospf_nbr_timer_update (oi);
5170 }
5171
5172 return CMD_SUCCESS;
5173}
5174
5175ALIAS (no_ip_ospf_dead_interval,
5176 no_ip_ospf_dead_interval_cmd,
5177 "no ip ospf dead-interval",
5178 NO_STR
5179 "IP Information\n"
5180 "OSPF interface commands\n"
5181 "Interval after which a neighbor is declared dead\n")
5182
5183ALIAS (no_ip_ospf_dead_interval,
5184 no_ospf_dead_interval_cmd,
5185 "no ospf dead-interval",
5186 NO_STR
5187 "OSPF interface commands\n"
5188 "Interval after which a neighbor is declared dead\n")
5189
5190DEFUN (ip_ospf_hello_interval,
5191 ip_ospf_hello_interval_addr_cmd,
5192 "ip ospf hello-interval <1-65535> A.B.C.D",
5193 "IP Information\n"
5194 "OSPF interface commands\n"
5195 "Time between HELLO packets\n"
5196 "Seconds\n"
5197 "Address of interface")
5198{
5199 struct interface *ifp = vty->index;
5200 u_int32_t seconds;
5201 struct in_addr addr;
5202 int ret;
5203 struct ospf_if_params *params;
5204
5205 params = IF_DEF_PARAMS (ifp);
5206
5207 seconds = strtol (argv[0], NULL, 10);
5208
5209 /* HelloInterval range is <1-65535>. */
5210 if (seconds < 1 || seconds > 65535)
5211 {
5212 vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5213 return CMD_WARNING;
5214 }
5215
5216 if (argc == 2)
5217 {
5218 ret = inet_aton(argv[1], &addr);
5219 if (!ret)
5220 {
5221 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5222 VTY_NEWLINE);
5223 return CMD_WARNING;
5224 }
5225
5226 params = ospf_get_if_params (ifp, addr);
5227 ospf_if_update_params (ifp, addr);
5228 }
5229
paulf9ad9372005-10-21 00:45:17 +00005230 SET_IF_PARAM (params, v_hello);
paul718e3742002-12-13 20:15:29 +00005231 params->v_hello = seconds;
5232
5233 return CMD_SUCCESS;
5234}
5235
5236ALIAS (ip_ospf_hello_interval,
5237 ip_ospf_hello_interval_cmd,
5238 "ip ospf hello-interval <1-65535>",
5239 "IP Information\n"
5240 "OSPF interface commands\n"
5241 "Time between HELLO packets\n"
5242 "Seconds\n")
5243
5244ALIAS (ip_ospf_hello_interval,
5245 ospf_hello_interval_cmd,
5246 "ospf hello-interval <1-65535>",
5247 "OSPF interface commands\n"
5248 "Time between HELLO packets\n"
5249 "Seconds\n")
5250
5251DEFUN (no_ip_ospf_hello_interval,
5252 no_ip_ospf_hello_interval_addr_cmd,
5253 "no ip ospf hello-interval A.B.C.D",
5254 NO_STR
5255 "IP Information\n"
5256 "OSPF interface commands\n"
5257 "Time between HELLO packets\n"
5258 "Address of interface")
5259{
5260 struct interface *ifp = vty->index;
5261 struct in_addr addr;
5262 int ret;
5263 struct ospf_if_params *params;
5264
5265 ifp = vty->index;
5266 params = IF_DEF_PARAMS (ifp);
5267
5268 if (argc == 1)
5269 {
5270 ret = inet_aton(argv[0], &addr);
5271 if (!ret)
5272 {
5273 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5274 VTY_NEWLINE);
5275 return CMD_WARNING;
5276 }
5277
5278 params = ospf_lookup_if_params (ifp, addr);
5279 if (params == NULL)
5280 return CMD_SUCCESS;
5281 }
5282
5283 UNSET_IF_PARAM (params, v_hello);
paulf9ad9372005-10-21 00:45:17 +00005284 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
paul718e3742002-12-13 20:15:29 +00005285
5286 if (params != IF_DEF_PARAMS (ifp))
5287 {
5288 ospf_free_if_params (ifp, addr);
5289 ospf_if_update_params (ifp, addr);
5290 }
5291
5292 return CMD_SUCCESS;
5293}
5294
5295ALIAS (no_ip_ospf_hello_interval,
5296 no_ip_ospf_hello_interval_cmd,
5297 "no ip ospf hello-interval",
5298 NO_STR
5299 "IP Information\n"
5300 "OSPF interface commands\n"
5301 "Time between HELLO packets\n")
5302
5303ALIAS (no_ip_ospf_hello_interval,
5304 no_ospf_hello_interval_cmd,
5305 "no ospf hello-interval",
5306 NO_STR
5307 "OSPF interface commands\n"
5308 "Time between HELLO packets\n")
5309
5310DEFUN (ip_ospf_network,
5311 ip_ospf_network_cmd,
5312 "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5313 "IP Information\n"
5314 "OSPF interface commands\n"
5315 "Network type\n"
5316 "Specify OSPF broadcast multi-access network\n"
5317 "Specify OSPF NBMA network\n"
5318 "Specify OSPF point-to-multipoint network\n"
5319 "Specify OSPF point-to-point network\n")
5320{
5321 struct interface *ifp = vty->index;
5322 int old_type = IF_DEF_PARAMS (ifp)->type;
5323 struct route_node *rn;
Christian Franke4b4bda92013-07-11 07:56:29 +00005324
5325 if (old_type == OSPF_IFTYPE_LOOPBACK)
5326 {
5327 vty_out (vty, "This is a loopback interface. Can't set network type.%s", VTY_NEWLINE);
5328 return CMD_WARNING;
5329 }
5330
paul718e3742002-12-13 20:15:29 +00005331 if (strncmp (argv[0], "b", 1) == 0)
5332 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5333 else if (strncmp (argv[0], "n", 1) == 0)
5334 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5335 else if (strncmp (argv[0], "point-to-m", 10) == 0)
5336 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5337 else if (strncmp (argv[0], "point-to-p", 10) == 0)
5338 IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5339
5340 if (IF_DEF_PARAMS (ifp)->type == old_type)
5341 return CMD_SUCCESS;
5342
5343 SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5344
5345 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5346 {
5347 struct ospf_interface *oi = rn->info;
5348
5349 if (!oi)
5350 continue;
5351
5352 oi->type = IF_DEF_PARAMS (ifp)->type;
5353
5354 if (oi->state > ISM_Down)
5355 {
5356 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5357 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5358 }
5359 }
5360
5361 return CMD_SUCCESS;
5362}
5363
5364ALIAS (ip_ospf_network,
5365 ospf_network_cmd,
5366 "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5367 "OSPF interface commands\n"
5368 "Network type\n"
5369 "Specify OSPF broadcast multi-access network\n"
5370 "Specify OSPF NBMA network\n"
5371 "Specify OSPF point-to-multipoint network\n"
5372 "Specify OSPF point-to-point network\n")
5373
5374DEFUN (no_ip_ospf_network,
5375 no_ip_ospf_network_cmd,
5376 "no ip ospf network",
5377 NO_STR
5378 "IP Information\n"
5379 "OSPF interface commands\n"
5380 "Network type\n")
5381{
5382 struct interface *ifp = vty->index;
5383 int old_type = IF_DEF_PARAMS (ifp)->type;
5384 struct route_node *rn;
5385
ajsbc18d612004-12-15 15:07:19 +00005386 IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
paul718e3742002-12-13 20:15:29 +00005387
5388 if (IF_DEF_PARAMS (ifp)->type == old_type)
5389 return CMD_SUCCESS;
5390
5391 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5392 {
5393 struct ospf_interface *oi = rn->info;
5394
5395 if (!oi)
5396 continue;
5397
5398 oi->type = IF_DEF_PARAMS (ifp)->type;
5399
5400 if (oi->state > ISM_Down)
5401 {
5402 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5403 OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5404 }
5405 }
5406
5407 return CMD_SUCCESS;
5408}
5409
5410ALIAS (no_ip_ospf_network,
5411 no_ospf_network_cmd,
5412 "no ospf network",
5413 NO_STR
5414 "OSPF interface commands\n"
5415 "Network type\n")
5416
5417DEFUN (ip_ospf_priority,
5418 ip_ospf_priority_addr_cmd,
5419 "ip ospf priority <0-255> A.B.C.D",
5420 "IP Information\n"
5421 "OSPF interface commands\n"
5422 "Router priority\n"
5423 "Priority\n"
5424 "Address of interface")
5425{
5426 struct interface *ifp = vty->index;
Andrew Certain0798cee2012-12-04 13:43:42 -08005427 long priority;
paul718e3742002-12-13 20:15:29 +00005428 struct route_node *rn;
5429 struct in_addr addr;
5430 int ret;
5431 struct ospf_if_params *params;
5432
5433 params = IF_DEF_PARAMS (ifp);
5434
5435 priority = strtol (argv[0], NULL, 10);
5436
5437 /* Router Priority range is <0-255>. */
5438 if (priority < 0 || priority > 255)
5439 {
5440 vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5441 return CMD_WARNING;
5442 }
5443
5444 if (argc == 2)
5445 {
5446 ret = inet_aton(argv[1], &addr);
5447 if (!ret)
5448 {
5449 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5450 VTY_NEWLINE);
5451 return CMD_WARNING;
5452 }
5453
5454 params = ospf_get_if_params (ifp, addr);
5455 ospf_if_update_params (ifp, addr);
5456 }
5457
5458 SET_IF_PARAM (params, priority);
5459 params->priority = priority;
5460
5461 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5462 {
5463 struct ospf_interface *oi = rn->info;
5464
5465 if (!oi)
5466 continue;
5467
5468
5469 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5470 {
5471 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5472 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5473 }
5474 }
5475
5476 return CMD_SUCCESS;
5477}
5478
5479ALIAS (ip_ospf_priority,
5480 ip_ospf_priority_cmd,
5481 "ip ospf priority <0-255>",
5482 "IP Information\n"
5483 "OSPF interface commands\n"
5484 "Router priority\n"
5485 "Priority\n")
5486
5487ALIAS (ip_ospf_priority,
5488 ospf_priority_cmd,
5489 "ospf priority <0-255>",
5490 "OSPF interface commands\n"
5491 "Router priority\n"
5492 "Priority\n")
5493
5494DEFUN (no_ip_ospf_priority,
5495 no_ip_ospf_priority_addr_cmd,
5496 "no ip ospf priority A.B.C.D",
5497 NO_STR
5498 "IP Information\n"
5499 "OSPF interface commands\n"
5500 "Router priority\n"
5501 "Address of interface")
5502{
5503 struct interface *ifp = vty->index;
5504 struct route_node *rn;
5505 struct in_addr addr;
5506 int ret;
5507 struct ospf_if_params *params;
5508
5509 ifp = vty->index;
5510 params = IF_DEF_PARAMS (ifp);
5511
5512 if (argc == 1)
5513 {
5514 ret = inet_aton(argv[0], &addr);
5515 if (!ret)
5516 {
5517 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5518 VTY_NEWLINE);
5519 return CMD_WARNING;
5520 }
5521
5522 params = ospf_lookup_if_params (ifp, addr);
5523 if (params == NULL)
5524 return CMD_SUCCESS;
5525 }
5526
5527 UNSET_IF_PARAM (params, priority);
5528 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5529
5530 if (params != IF_DEF_PARAMS (ifp))
5531 {
5532 ospf_free_if_params (ifp, addr);
5533 ospf_if_update_params (ifp, addr);
5534 }
5535
5536 for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5537 {
5538 struct ospf_interface *oi = rn->info;
5539
5540 if (!oi)
5541 continue;
5542
5543
5544 if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5545 {
5546 PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5547 OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5548 }
5549 }
5550
5551 return CMD_SUCCESS;
5552}
5553
5554ALIAS (no_ip_ospf_priority,
5555 no_ip_ospf_priority_cmd,
5556 "no ip ospf priority",
5557 NO_STR
5558 "IP Information\n"
5559 "OSPF interface commands\n"
5560 "Router priority\n")
5561
5562ALIAS (no_ip_ospf_priority,
5563 no_ospf_priority_cmd,
5564 "no ospf priority",
5565 NO_STR
5566 "OSPF interface commands\n"
5567 "Router priority\n")
5568
5569DEFUN (ip_ospf_retransmit_interval,
5570 ip_ospf_retransmit_interval_addr_cmd,
5571 "ip ospf retransmit-interval <3-65535> A.B.C.D",
5572 "IP Information\n"
5573 "OSPF interface commands\n"
5574 "Time between retransmitting lost link state advertisements\n"
5575 "Seconds\n"
5576 "Address of interface")
5577{
5578 struct interface *ifp = vty->index;
5579 u_int32_t seconds;
5580 struct in_addr addr;
5581 int ret;
5582 struct ospf_if_params *params;
5583
5584 params = IF_DEF_PARAMS (ifp);
5585 seconds = strtol (argv[0], NULL, 10);
5586
5587 /* Retransmit Interval range is <3-65535>. */
5588 if (seconds < 3 || seconds > 65535)
5589 {
5590 vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5591 return CMD_WARNING;
5592 }
5593
5594
5595 if (argc == 2)
5596 {
5597 ret = inet_aton(argv[1], &addr);
5598 if (!ret)
5599 {
5600 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5601 VTY_NEWLINE);
5602 return CMD_WARNING;
5603 }
5604
5605 params = ospf_get_if_params (ifp, addr);
5606 ospf_if_update_params (ifp, addr);
5607 }
5608
5609 SET_IF_PARAM (params, retransmit_interval);
5610 params->retransmit_interval = seconds;
5611
5612 return CMD_SUCCESS;
5613}
5614
5615ALIAS (ip_ospf_retransmit_interval,
5616 ip_ospf_retransmit_interval_cmd,
5617 "ip ospf retransmit-interval <3-65535>",
5618 "IP Information\n"
5619 "OSPF interface commands\n"
5620 "Time between retransmitting lost link state advertisements\n"
5621 "Seconds\n")
5622
5623ALIAS (ip_ospf_retransmit_interval,
5624 ospf_retransmit_interval_cmd,
5625 "ospf retransmit-interval <3-65535>",
5626 "OSPF interface commands\n"
5627 "Time between retransmitting lost link state advertisements\n"
5628 "Seconds\n")
5629
5630DEFUN (no_ip_ospf_retransmit_interval,
5631 no_ip_ospf_retransmit_interval_addr_cmd,
5632 "no ip ospf retransmit-interval A.B.C.D",
5633 NO_STR
5634 "IP Information\n"
5635 "OSPF interface commands\n"
5636 "Time between retransmitting lost link state advertisements\n"
5637 "Address of interface")
5638{
5639 struct interface *ifp = vty->index;
5640 struct in_addr addr;
5641 int ret;
5642 struct ospf_if_params *params;
5643
5644 ifp = vty->index;
5645 params = IF_DEF_PARAMS (ifp);
5646
5647 if (argc == 1)
5648 {
5649 ret = inet_aton(argv[0], &addr);
5650 if (!ret)
5651 {
5652 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5653 VTY_NEWLINE);
5654 return CMD_WARNING;
5655 }
5656
5657 params = ospf_lookup_if_params (ifp, addr);
5658 if (params == NULL)
5659 return CMD_SUCCESS;
5660 }
5661
5662 UNSET_IF_PARAM (params, retransmit_interval);
5663 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5664
5665 if (params != IF_DEF_PARAMS (ifp))
5666 {
5667 ospf_free_if_params (ifp, addr);
5668 ospf_if_update_params (ifp, addr);
5669 }
5670
5671 return CMD_SUCCESS;
5672}
5673
5674ALIAS (no_ip_ospf_retransmit_interval,
5675 no_ip_ospf_retransmit_interval_cmd,
5676 "no ip ospf retransmit-interval",
5677 NO_STR
5678 "IP Information\n"
5679 "OSPF interface commands\n"
5680 "Time between retransmitting lost link state advertisements\n")
5681
5682ALIAS (no_ip_ospf_retransmit_interval,
5683 no_ospf_retransmit_interval_cmd,
5684 "no ospf retransmit-interval",
5685 NO_STR
5686 "OSPF interface commands\n"
5687 "Time between retransmitting lost link state advertisements\n")
5688
5689DEFUN (ip_ospf_transmit_delay,
5690 ip_ospf_transmit_delay_addr_cmd,
5691 "ip ospf transmit-delay <1-65535> A.B.C.D",
5692 "IP Information\n"
5693 "OSPF interface commands\n"
5694 "Link state transmit delay\n"
5695 "Seconds\n"
5696 "Address of interface")
5697{
5698 struct interface *ifp = vty->index;
5699 u_int32_t seconds;
5700 struct in_addr addr;
5701 int ret;
5702 struct ospf_if_params *params;
5703
5704 params = IF_DEF_PARAMS (ifp);
5705 seconds = strtol (argv[0], NULL, 10);
5706
5707 /* Transmit Delay range is <1-65535>. */
5708 if (seconds < 1 || seconds > 65535)
5709 {
5710 vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5711 return CMD_WARNING;
5712 }
5713
5714 if (argc == 2)
5715 {
5716 ret = inet_aton(argv[1], &addr);
5717 if (!ret)
5718 {
5719 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5720 VTY_NEWLINE);
5721 return CMD_WARNING;
5722 }
5723
5724 params = ospf_get_if_params (ifp, addr);
5725 ospf_if_update_params (ifp, addr);
5726 }
5727
5728 SET_IF_PARAM (params, transmit_delay);
5729 params->transmit_delay = seconds;
5730
5731 return CMD_SUCCESS;
5732}
5733
5734ALIAS (ip_ospf_transmit_delay,
5735 ip_ospf_transmit_delay_cmd,
5736 "ip ospf transmit-delay <1-65535>",
5737 "IP Information\n"
5738 "OSPF interface commands\n"
5739 "Link state transmit delay\n"
5740 "Seconds\n")
5741
5742ALIAS (ip_ospf_transmit_delay,
5743 ospf_transmit_delay_cmd,
5744 "ospf transmit-delay <1-65535>",
5745 "OSPF interface commands\n"
5746 "Link state transmit delay\n"
5747 "Seconds\n")
5748
5749DEFUN (no_ip_ospf_transmit_delay,
5750 no_ip_ospf_transmit_delay_addr_cmd,
5751 "no ip ospf transmit-delay A.B.C.D",
5752 NO_STR
5753 "IP Information\n"
5754 "OSPF interface commands\n"
5755 "Link state transmit delay\n"
5756 "Address of interface")
5757{
5758 struct interface *ifp = vty->index;
5759 struct in_addr addr;
5760 int ret;
5761 struct ospf_if_params *params;
5762
5763 ifp = vty->index;
5764 params = IF_DEF_PARAMS (ifp);
5765
5766 if (argc == 1)
5767 {
5768 ret = inet_aton(argv[0], &addr);
5769 if (!ret)
5770 {
5771 vty_out (vty, "Please specify interface address by A.B.C.D%s",
5772 VTY_NEWLINE);
5773 return CMD_WARNING;
5774 }
5775
5776 params = ospf_lookup_if_params (ifp, addr);
5777 if (params == NULL)
5778 return CMD_SUCCESS;
5779 }
5780
5781 UNSET_IF_PARAM (params, transmit_delay);
5782 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5783
5784 if (params != IF_DEF_PARAMS (ifp))
5785 {
5786 ospf_free_if_params (ifp, addr);
5787 ospf_if_update_params (ifp, addr);
5788 }
5789
5790 return CMD_SUCCESS;
5791}
5792
5793ALIAS (no_ip_ospf_transmit_delay,
5794 no_ip_ospf_transmit_delay_cmd,
5795 "no ip ospf transmit-delay",
5796 NO_STR
5797 "IP Information\n"
5798 "OSPF interface commands\n"
5799 "Link state transmit delay\n")
5800
5801ALIAS (no_ip_ospf_transmit_delay,
5802 no_ospf_transmit_delay_cmd,
5803 "no ospf transmit-delay",
5804 NO_STR
5805 "OSPF interface commands\n"
5806 "Link state transmit delay\n")
5807
Christian Franke6f2a6702013-09-30 12:27:52 +00005808DEFUN (ospf_redistribute_source,
5809 ospf_redistribute_source_cmd,
5810 "redistribute " QUAGGA_REDIST_STR_OSPFD
5811 " {metric <0-16777214>|metric-type (1|2)|route-map WORD}",
Paul Jakmad1c65c22006-06-27 08:01:43 +00005812 REDIST_STR
5813 QUAGGA_REDIST_HELP_STR_OSPFD
paul718e3742002-12-13 20:15:29 +00005814 "Metric for redistributed routes\n"
5815 "OSPF default metric\n"
5816 "OSPF exterior metric type for redistributed routes\n"
5817 "Set OSPF External Type 1 metrics\n"
5818 "Set OSPF External Type 2 metrics\n"
5819 "Route map reference\n"
5820 "Pointer to route-map entries\n")
5821{
paul020709f2003-04-04 02:44:16 +00005822 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005823 int source;
5824 int type = -1;
5825 int metric = -1;
5826
Christian Franke6f2a6702013-09-30 12:27:52 +00005827 if (argc < 4)
5828 return CMD_WARNING; /* should not happen */
5829
paul718e3742002-12-13 20:15:29 +00005830 /* Get distribute source. */
David Lampartere0ca5fd2009-09-16 01:52:42 +02005831 source = proto_redistnum(AFI_IP, argv[0]);
5832 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005833 return CMD_WARNING;
5834
5835 /* Get metric value. */
Christian Franke6f2a6702013-09-30 12:27:52 +00005836 if (argv[1] != NULL)
paul718e3742002-12-13 20:15:29 +00005837 if (!str2metric (argv[1], &metric))
5838 return CMD_WARNING;
5839
5840 /* Get metric type. */
Christian Franke6f2a6702013-09-30 12:27:52 +00005841 if (argv[2] != NULL)
paul718e3742002-12-13 20:15:29 +00005842 if (!str2metric_type (argv[2], &type))
5843 return CMD_WARNING;
5844
Christian Franke6f2a6702013-09-30 12:27:52 +00005845 if (argv[3] != NULL)
paul020709f2003-04-04 02:44:16 +00005846 ospf_routemap_set (ospf, source, argv[3]);
paul718e3742002-12-13 20:15:29 +00005847 else
paul020709f2003-04-04 02:44:16 +00005848 ospf_routemap_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005849
paul020709f2003-04-04 02:44:16 +00005850 return ospf_redistribute_set (ospf, source, type, metric);
paul718e3742002-12-13 20:15:29 +00005851}
5852
paul718e3742002-12-13 20:15:29 +00005853DEFUN (no_ospf_redistribute_source,
5854 no_ospf_redistribute_source_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005855 "no redistribute " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005856 NO_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005857 REDIST_STR
5858 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005859{
paul020709f2003-04-04 02:44:16 +00005860 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005861 int source;
5862
David Lampartere0ca5fd2009-09-16 01:52:42 +02005863 source = proto_redistnum(AFI_IP, argv[0]);
5864 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005865 return CMD_WARNING;
5866
paul020709f2003-04-04 02:44:16 +00005867 ospf_routemap_unset (ospf, source);
5868 return ospf_redistribute_unset (ospf, source);
paul718e3742002-12-13 20:15:29 +00005869}
5870
5871DEFUN (ospf_distribute_list_out,
5872 ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005873 "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005874 "Filter networks in routing updates\n"
5875 "Access-list name\n"
5876 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005877 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005878{
paul68980082003-03-25 05:07:42 +00005879 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005880 int source;
5881
5882 /* Get distribute source. */
Christian Frankebda3c322012-12-04 11:31:16 -08005883 source = proto_redistnum(AFI_IP, argv[1]);
David Lampartere0ca5fd2009-09-16 01:52:42 +02005884 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005885 return CMD_WARNING;
5886
paul68980082003-03-25 05:07:42 +00005887 return ospf_distribute_list_out_set (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005888}
5889
5890DEFUN (no_ospf_distribute_list_out,
5891 no_ospf_distribute_list_out_cmd,
Paul Jakmad1c65c22006-06-27 08:01:43 +00005892 "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
paul718e3742002-12-13 20:15:29 +00005893 NO_STR
5894 "Filter networks in routing updates\n"
5895 "Access-list name\n"
5896 OUT_STR
Paul Jakmad1c65c22006-06-27 08:01:43 +00005897 QUAGGA_REDIST_HELP_STR_OSPFD)
paul718e3742002-12-13 20:15:29 +00005898{
paul68980082003-03-25 05:07:42 +00005899 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005900 int source;
5901
Christian Frankebda3c322012-12-04 11:31:16 -08005902 source = proto_redistnum(AFI_IP, argv[1]);
David Lampartere0ca5fd2009-09-16 01:52:42 +02005903 if (source < 0 || source == ZEBRA_ROUTE_OSPF)
paul718e3742002-12-13 20:15:29 +00005904 return CMD_WARNING;
5905
paul68980082003-03-25 05:07:42 +00005906 return ospf_distribute_list_out_unset (ospf, source, argv[0]);
paul718e3742002-12-13 20:15:29 +00005907}
5908
5909/* Default information originate. */
Christian Franke6f2a6702013-09-30 12:27:52 +00005910DEFUN (ospf_default_information_originate,
paul718e3742002-12-13 20:15:29 +00005911 ospf_default_information_originate_cmd,
Christian Franke6f2a6702013-09-30 12:27:52 +00005912 "default-information originate "
5913 "{always|metric <0-16777214>|metric-type (1|2)|route-map WORD}",
paul718e3742002-12-13 20:15:29 +00005914 "Control distribution of default information\n"
5915 "Distribute a default route\n"
Christian Franke6f2a6702013-09-30 12:27:52 +00005916 "Always advertise default route\n"
paul718e3742002-12-13 20:15:29 +00005917 "OSPF default metric\n"
5918 "OSPF metric\n"
paul718e3742002-12-13 20:15:29 +00005919 "OSPF metric type for default routes\n"
5920 "Set OSPF External Type 1 metrics\n"
5921 "Set OSPF External Type 2 metrics\n"
paul718e3742002-12-13 20:15:29 +00005922 "Route map reference\n"
5923 "Pointer to route-map entries\n")
5924{
paul020709f2003-04-04 02:44:16 +00005925 struct ospf *ospf = vty->index;
Christian Franke6f2a6702013-09-30 12:27:52 +00005926 int default_originate = DEFAULT_ORIGINATE_ZEBRA;
paul718e3742002-12-13 20:15:29 +00005927 int type = -1;
5928 int metric = -1;
5929
Christian Franke6f2a6702013-09-30 12:27:52 +00005930 if (argc < 4)
5931 return CMD_WARNING; /* this should not happen */
5932
5933 /* Check whether "always" was specified */
5934 if (argv[0] != NULL)
5935 default_originate = DEFAULT_ORIGINATE_ALWAYS;
paul718e3742002-12-13 20:15:29 +00005936
5937 /* Get metric value. */
Christian Franke6f2a6702013-09-30 12:27:52 +00005938 if (argv[1] != NULL)
paul718e3742002-12-13 20:15:29 +00005939 if (!str2metric (argv[1], &metric))
5940 return CMD_WARNING;
5941
Christian Franke6f2a6702013-09-30 12:27:52 +00005942 /* Get metric type. */
5943 if (argv[2] != NULL)
5944 if (!str2metric_type (argv[2], &type))
5945 return CMD_WARNING;
5946
5947 if (argv[3] != NULL)
5948 ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[3]);
paul718e3742002-12-13 20:15:29 +00005949 else
paul020709f2003-04-04 02:44:16 +00005950 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
paul718e3742002-12-13 20:15:29 +00005951
Christian Franke6f2a6702013-09-30 12:27:52 +00005952 return ospf_redistribute_default_set (ospf, default_originate,
paul020709f2003-04-04 02:44:16 +00005953 type, metric);
paul718e3742002-12-13 20:15:29 +00005954}
5955
paul718e3742002-12-13 20:15:29 +00005956DEFUN (no_ospf_default_information_originate,
5957 no_ospf_default_information_originate_cmd,
5958 "no default-information originate",
5959 NO_STR
5960 "Control distribution of default information\n"
5961 "Distribute a default route\n")
5962{
paul68980082003-03-25 05:07:42 +00005963 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005964 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +00005965
5966 p.family = AF_INET;
5967 p.prefix.s_addr = 0;
5968 p.prefixlen = 0;
5969
ajs5339cfd2005-09-19 13:28:05 +00005970 ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
paul718e3742002-12-13 20:15:29 +00005971
5972 if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
5973 ospf_external_info_delete (DEFAULT_ROUTE, p);
5974 route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
5975 EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
5976 }
5977
paul020709f2003-04-04 02:44:16 +00005978 ospf_routemap_unset (ospf, DEFAULT_ROUTE);
5979 return ospf_redistribute_default_unset (ospf);
paul718e3742002-12-13 20:15:29 +00005980}
5981
5982DEFUN (ospf_default_metric,
5983 ospf_default_metric_cmd,
5984 "default-metric <0-16777214>",
5985 "Set metric of redistributed routes\n"
5986 "Default metric\n")
5987{
paul68980082003-03-25 05:07:42 +00005988 struct ospf *ospf = vty->index;
paul718e3742002-12-13 20:15:29 +00005989 int metric = -1;
5990
5991 if (!str2metric (argv[0], &metric))
5992 return CMD_WARNING;
5993
paul68980082003-03-25 05:07:42 +00005994 ospf->default_metric = metric;
paul718e3742002-12-13 20:15:29 +00005995
5996 return CMD_SUCCESS;
5997}
5998
5999DEFUN (no_ospf_default_metric,
6000 no_ospf_default_metric_cmd,
6001 "no default-metric",
6002 NO_STR
6003 "Set metric of redistributed routes\n")
6004{
paul68980082003-03-25 05:07:42 +00006005 struct ospf *ospf = vty->index;
6006
6007 ospf->default_metric = -1;
6008
paul718e3742002-12-13 20:15:29 +00006009 return CMD_SUCCESS;
6010}
6011
6012ALIAS (no_ospf_default_metric,
6013 no_ospf_default_metric_val_cmd,
6014 "no default-metric <0-16777214>",
6015 NO_STR
6016 "Set metric of redistributed routes\n"
6017 "Default metric\n")
6018
6019DEFUN (ospf_distance,
6020 ospf_distance_cmd,
6021 "distance <1-255>",
6022 "Define an administrative distance\n"
6023 "OSPF Administrative distance\n")
6024{
paul68980082003-03-25 05:07:42 +00006025 struct ospf *ospf = vty->index;
6026
6027 ospf->distance_all = atoi (argv[0]);
6028
paul718e3742002-12-13 20:15:29 +00006029 return CMD_SUCCESS;
6030}
6031
6032DEFUN (no_ospf_distance,
6033 no_ospf_distance_cmd,
6034 "no distance <1-255>",
6035 NO_STR
6036 "Define an administrative distance\n"
6037 "OSPF Administrative distance\n")
6038{
paul68980082003-03-25 05:07:42 +00006039 struct ospf *ospf = vty->index;
6040
6041 ospf->distance_all = 0;
6042
paul718e3742002-12-13 20:15:29 +00006043 return CMD_SUCCESS;
6044}
6045
6046DEFUN (no_ospf_distance_ospf,
6047 no_ospf_distance_ospf_cmd,
Christian Franke6f2a6702013-09-30 12:27:52 +00006048 "no distance ospf {intra-area|inter-area|external}",
paul718e3742002-12-13 20:15:29 +00006049 NO_STR
6050 "Define an administrative distance\n"
6051 "OSPF Administrative distance\n"
Christian Franke6f2a6702013-09-30 12:27:52 +00006052 "OSPF Distance\n"
6053 "Intra-area routes\n"
6054 "Inter-area routes\n"
6055 "External routes\n")
paul718e3742002-12-13 20:15:29 +00006056{
paul68980082003-03-25 05:07:42 +00006057 struct ospf *ospf = vty->index;
6058
Christian Franke6f2a6702013-09-30 12:27:52 +00006059 if (argc < 3)
6060 return CMD_WARNING;
6061
6062 if (argv[0] != NULL)
6063 ospf->distance_intra = 0;
6064
6065 if (argv[1] != NULL)
6066 ospf->distance_inter = 0;
6067
6068 if (argv[2] != NULL)
6069 ospf->distance_external = 0;
6070
6071 if (argv[0] || argv[1] || argv[2])
6072 return CMD_SUCCESS;
6073
6074 /* If no arguments are given, clear all distance information */
paul68980082003-03-25 05:07:42 +00006075 ospf->distance_intra = 0;
6076 ospf->distance_inter = 0;
6077 ospf->distance_external = 0;
6078
paul718e3742002-12-13 20:15:29 +00006079 return CMD_SUCCESS;
6080}
6081
Christian Franke6f2a6702013-09-30 12:27:52 +00006082DEFUN (ospf_distance_ospf,
6083 ospf_distance_ospf_cmd,
6084 "distance ospf "
6085 "{intra-area <1-255>|inter-area <1-255>|external <1-255>}",
paul718e3742002-12-13 20:15:29 +00006086 "Define an administrative distance\n"
6087 "OSPF Administrative distance\n"
6088 "Intra-area routes\n"
6089 "Distance for intra-area routes\n"
6090 "Inter-area routes\n"
6091 "Distance for inter-area routes\n"
6092 "External routes\n"
6093 "Distance for external routes\n")
6094{
paul68980082003-03-25 05:07:42 +00006095 struct ospf *ospf = vty->index;
6096
Christian Franke6f2a6702013-09-30 12:27:52 +00006097 if (argc < 3) /* should not happen */
6098 return CMD_WARNING;
paul68980082003-03-25 05:07:42 +00006099
Christian Franke6f2a6702013-09-30 12:27:52 +00006100 if (!argv[0] && !argv[1] && !argv[2])
6101 {
6102 vty_out(vty, "%% Command incomplete. (Arguments required)%s",
6103 VTY_NEWLINE);
6104 return CMD_WARNING;
6105 }
paul718e3742002-12-13 20:15:29 +00006106
Christian Franke6f2a6702013-09-30 12:27:52 +00006107 if (argv[0] != NULL)
6108 ospf->distance_intra = atoi(argv[0]);
paul68980082003-03-25 05:07:42 +00006109
Christian Franke6f2a6702013-09-30 12:27:52 +00006110 if (argv[1] != NULL)
6111 ospf->distance_inter = atoi(argv[1]);
paul68980082003-03-25 05:07:42 +00006112
Christian Franke6f2a6702013-09-30 12:27:52 +00006113 if (argv[2] != NULL)
6114 ospf->distance_external = atoi(argv[2]);
paul68980082003-03-25 05:07:42 +00006115
paul718e3742002-12-13 20:15:29 +00006116 return CMD_SUCCESS;
6117}
6118
6119DEFUN (ospf_distance_source,
6120 ospf_distance_source_cmd,
6121 "distance <1-255> A.B.C.D/M",
6122 "Administrative distance\n"
6123 "Distance value\n"
6124 "IP source prefix\n")
6125{
paul020709f2003-04-04 02:44:16 +00006126 struct ospf *ospf = vty->index;
6127
6128 ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
paul68980082003-03-25 05:07:42 +00006129
paul718e3742002-12-13 20:15:29 +00006130 return CMD_SUCCESS;
6131}
6132
6133DEFUN (no_ospf_distance_source,
6134 no_ospf_distance_source_cmd,
6135 "no distance <1-255> A.B.C.D/M",
6136 NO_STR
6137 "Administrative distance\n"
6138 "Distance value\n"
6139 "IP source prefix\n")
6140{
paul020709f2003-04-04 02:44:16 +00006141 struct ospf *ospf = vty->index;
6142
6143 ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6144
paul718e3742002-12-13 20:15:29 +00006145 return CMD_SUCCESS;
6146}
6147
6148DEFUN (ospf_distance_source_access_list,
6149 ospf_distance_source_access_list_cmd,
6150 "distance <1-255> A.B.C.D/M WORD",
6151 "Administrative distance\n"
6152 "Distance value\n"
6153 "IP source prefix\n"
6154 "Access list name\n")
6155{
paul020709f2003-04-04 02:44:16 +00006156 struct ospf *ospf = vty->index;
6157
6158 ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6159
paul718e3742002-12-13 20:15:29 +00006160 return CMD_SUCCESS;
6161}
6162
6163DEFUN (no_ospf_distance_source_access_list,
6164 no_ospf_distance_source_access_list_cmd,
6165 "no distance <1-255> A.B.C.D/M WORD",
6166 NO_STR
6167 "Administrative distance\n"
6168 "Distance value\n"
6169 "IP source prefix\n"
6170 "Access list name\n")
6171{
paul020709f2003-04-04 02:44:16 +00006172 struct ospf *ospf = vty->index;
6173
6174 ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6175
paul718e3742002-12-13 20:15:29 +00006176 return CMD_SUCCESS;
6177}
6178
vincentba682532005-09-29 13:52:57 +00006179DEFUN (ip_ospf_mtu_ignore,
6180 ip_ospf_mtu_ignore_addr_cmd,
6181 "ip ospf mtu-ignore A.B.C.D",
6182 "IP Information\n"
6183 "OSPF interface commands\n"
6184 "Disable mtu mismatch detection\n"
6185 "Address of interface")
6186{
6187 struct interface *ifp = vty->index;
6188 struct in_addr addr;
6189 int ret;
6190
6191 struct ospf_if_params *params;
6192 params = IF_DEF_PARAMS (ifp);
6193
6194 if (argc == 1)
6195 {
6196 ret = inet_aton(argv[0], &addr);
6197 if (!ret)
6198 {
6199 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6200 VTY_NEWLINE);
6201 return CMD_WARNING;
6202 }
6203 params = ospf_get_if_params (ifp, addr);
6204 ospf_if_update_params (ifp, addr);
6205 }
6206 params->mtu_ignore = 1;
6207 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6208 SET_IF_PARAM (params, mtu_ignore);
6209 else
6210 {
6211 UNSET_IF_PARAM (params, mtu_ignore);
6212 if (params != IF_DEF_PARAMS (ifp))
6213 {
6214 ospf_free_if_params (ifp, addr);
6215 ospf_if_update_params (ifp, addr);
6216 }
6217 }
6218 return CMD_SUCCESS;
6219}
6220
6221ALIAS (ip_ospf_mtu_ignore,
6222 ip_ospf_mtu_ignore_cmd,
6223 "ip ospf mtu-ignore",
6224 "IP Information\n"
6225 "OSPF interface commands\n"
6226 "Disable mtu mismatch detection\n")
6227
6228
6229DEFUN (no_ip_ospf_mtu_ignore,
6230 no_ip_ospf_mtu_ignore_addr_cmd,
6231 "no ip ospf mtu-ignore A.B.C.D",
6232 "IP Information\n"
6233 "OSPF interface commands\n"
6234 "Disable mtu mismatch detection\n"
6235 "Address of interface")
6236{
6237 struct interface *ifp = vty->index;
6238 struct in_addr addr;
6239 int ret;
6240
6241 struct ospf_if_params *params;
6242 params = IF_DEF_PARAMS (ifp);
6243
6244 if (argc == 1)
6245 {
6246 ret = inet_aton(argv[0], &addr);
6247 if (!ret)
6248 {
6249 vty_out (vty, "Please specify interface address by A.B.C.D%s",
6250 VTY_NEWLINE);
6251 return CMD_WARNING;
6252 }
6253 params = ospf_get_if_params (ifp, addr);
6254 ospf_if_update_params (ifp, addr);
6255 }
6256 params->mtu_ignore = 0;
6257 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6258 SET_IF_PARAM (params, mtu_ignore);
6259 else
6260 {
6261 UNSET_IF_PARAM (params, mtu_ignore);
6262 if (params != IF_DEF_PARAMS (ifp))
6263 {
6264 ospf_free_if_params (ifp, addr);
6265 ospf_if_update_params (ifp, addr);
6266 }
6267 }
6268 return CMD_SUCCESS;
6269}
6270
6271ALIAS (no_ip_ospf_mtu_ignore,
6272 no_ip_ospf_mtu_ignore_cmd,
6273 "no ip ospf mtu-ignore",
6274 "IP Information\n"
6275 "OSPF interface commands\n"
6276 "Disable mtu mismatch detection\n")
David Lamparter6b0655a2014-06-04 06:53:35 +02006277
paul88d6cf32005-10-29 12:50:09 +00006278DEFUN (ospf_max_metric_router_lsa_admin,
6279 ospf_max_metric_router_lsa_admin_cmd,
6280 "max-metric router-lsa administrative",
6281 "OSPF maximum / infinite-distance metric\n"
6282 "Advertise own Router-LSA with infinite distance (stub router)\n"
6283 "Administratively applied, for an indefinite period\n")
6284{
6285 struct listnode *ln;
6286 struct ospf_area *area;
6287 struct ospf *ospf = vty->index;
vincentba682532005-09-29 13:52:57 +00006288
paul88d6cf32005-10-29 12:50:09 +00006289 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6290 {
6291 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6292
6293 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
Paul Jakmac363d382010-01-24 22:42:13 +00006294 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00006295 }
Ayan Banerjee4ba4fc82012-12-03 11:17:24 -08006296
6297 /* Allows for areas configured later to get the property */
6298 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
6299
paul88d6cf32005-10-29 12:50:09 +00006300 return CMD_SUCCESS;
6301}
6302
6303DEFUN (no_ospf_max_metric_router_lsa_admin,
6304 no_ospf_max_metric_router_lsa_admin_cmd,
6305 "no max-metric router-lsa administrative",
6306 NO_STR
6307 "OSPF maximum / infinite-distance metric\n"
6308 "Advertise own Router-LSA with infinite distance (stub router)\n"
6309 "Administratively applied, for an indefinite period\n")
6310{
6311 struct listnode *ln;
6312 struct ospf_area *area;
6313 struct ospf *ospf = vty->index;
6314
6315 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6316 {
6317 UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
6318
6319 /* Don't trample on the start-up stub timer */
6320 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
6321 && !area->t_stub_router)
6322 {
6323 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
Paul Jakmac363d382010-01-24 22:42:13 +00006324 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00006325 }
6326 }
Ayan Banerjee4ba4fc82012-12-03 11:17:24 -08006327 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
paul88d6cf32005-10-29 12:50:09 +00006328 return CMD_SUCCESS;
6329}
6330
6331DEFUN (ospf_max_metric_router_lsa_startup,
6332 ospf_max_metric_router_lsa_startup_cmd,
6333 "max-metric router-lsa on-startup <5-86400>",
6334 "OSPF maximum / infinite-distance metric\n"
6335 "Advertise own Router-LSA with infinite distance (stub router)\n"
6336 "Automatically advertise stub Router-LSA on startup of OSPF\n"
6337 "Time (seconds) to advertise self as stub-router\n")
6338{
6339 unsigned int seconds;
6340 struct ospf *ospf = vty->index;
6341
6342 if (argc != 1)
6343 {
6344 vty_out (vty, "%% Must supply stub-router period");
6345 return CMD_WARNING;
6346 }
6347
6348 VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
6349
6350 ospf->stub_router_startup_time = seconds;
6351
6352 return CMD_SUCCESS;
6353}
6354
6355DEFUN (no_ospf_max_metric_router_lsa_startup,
6356 no_ospf_max_metric_router_lsa_startup_cmd,
6357 "no max-metric router-lsa on-startup",
6358 NO_STR
6359 "OSPF maximum / infinite-distance metric\n"
6360 "Advertise own Router-LSA with infinite distance (stub router)\n"
6361 "Automatically advertise stub Router-LSA on startup of OSPF\n")
6362{
6363 struct listnode *ln;
6364 struct ospf_area *area;
6365 struct ospf *ospf = vty->index;
6366
6367 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6368
6369 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6370 {
6371 SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
6372 OSPF_TIMER_OFF (area->t_stub_router);
6373
6374 /* Don't trample on admin stub routed */
6375 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6376 {
6377 UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
Paul Jakmac363d382010-01-24 22:42:13 +00006378 ospf_router_lsa_update_area (area);
paul88d6cf32005-10-29 12:50:09 +00006379 }
6380 }
6381 return CMD_SUCCESS;
6382}
6383
6384DEFUN (ospf_max_metric_router_lsa_shutdown,
6385 ospf_max_metric_router_lsa_shutdown_cmd,
6386 "max-metric router-lsa on-shutdown <5-86400>",
6387 "OSPF maximum / infinite-distance metric\n"
6388 "Advertise own Router-LSA with infinite distance (stub router)\n"
6389 "Advertise stub-router prior to full shutdown of OSPF\n"
6390 "Time (seconds) to wait till full shutdown\n")
6391{
6392 unsigned int seconds;
6393 struct ospf *ospf = vty->index;
6394
6395 if (argc != 1)
6396 {
6397 vty_out (vty, "%% Must supply stub-router shutdown period");
6398 return CMD_WARNING;
6399 }
6400
6401 VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
6402
6403 ospf->stub_router_shutdown_time = seconds;
6404
6405 return CMD_SUCCESS;
6406}
6407
6408DEFUN (no_ospf_max_metric_router_lsa_shutdown,
6409 no_ospf_max_metric_router_lsa_shutdown_cmd,
6410 "no max-metric router-lsa on-shutdown",
6411 NO_STR
6412 "OSPF maximum / infinite-distance metric\n"
6413 "Advertise own Router-LSA with infinite distance (stub router)\n"
6414 "Advertise stub-router prior to full shutdown of OSPF\n")
6415{
6416 struct ospf *ospf = vty->index;
6417
6418 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
6419
6420 return CMD_SUCCESS;
6421}
6422
6423static void
6424config_write_stub_router (struct vty *vty, struct ospf *ospf)
6425{
6426 struct listnode *ln;
6427 struct ospf_area *area;
6428
6429 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6430 vty_out (vty, " max-metric router-lsa on-startup %u%s",
6431 ospf->stub_router_startup_time, VTY_NEWLINE);
6432 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
6433 vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
6434 ospf->stub_router_shutdown_time, VTY_NEWLINE);
6435 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
6436 {
6437 if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
6438 {
6439 vty_out (vty, " max-metric router-lsa administrative%s",
6440 VTY_NEWLINE);
6441 break;
6442 }
6443 }
6444 return;
6445}
David Lamparter6b0655a2014-06-04 06:53:35 +02006446
paul4dadc292005-05-06 21:37:42 +00006447static void
paul718e3742002-12-13 20:15:29 +00006448show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
6449{
6450 struct route_node *rn;
6451 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00006452 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00006453 struct ospf_path *path;
6454
6455 vty_out (vty, "============ OSPF network routing table ============%s",
6456 VTY_NEWLINE);
6457
6458 for (rn = route_top (rt); rn; rn = route_next (rn))
6459 if ((or = rn->info) != NULL)
6460 {
6461 char buf1[19];
6462 snprintf (buf1, 19, "%s/%d",
6463 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
6464
6465 switch (or->path_type)
6466 {
6467 case OSPF_PATH_INTER_AREA:
6468 if (or->type == OSPF_DESTINATION_NETWORK)
6469 vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
6470 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
6471 else if (or->type == OSPF_DESTINATION_DISCARD)
6472 vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
6473 break;
6474 case OSPF_PATH_INTRA_AREA:
6475 vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
6476 inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
6477 break;
6478 default:
6479 break;
6480 }
6481
6482 if (or->type == OSPF_DESTINATION_NETWORK)
paul1eb8ef22005-04-07 07:30:20 +00006483 for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
paul96735ee2003-08-10 02:51:22 +00006484 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006485 if (if_lookup_by_index(path->ifindex))
paul96735ee2003-08-10 02:51:22 +00006486 {
6487 if (path->nexthop.s_addr == 0)
6488 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006489 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00006490 else
6491 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006492 inet_ntoa (path->nexthop),
6493 ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00006494 }
6495 }
paul718e3742002-12-13 20:15:29 +00006496 }
6497 vty_out (vty, "%s", VTY_NEWLINE);
6498}
6499
paul4dadc292005-05-06 21:37:42 +00006500static void
paul718e3742002-12-13 20:15:29 +00006501show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
6502{
6503 struct route_node *rn;
6504 struct ospf_route *or;
paul1eb8ef22005-04-07 07:30:20 +00006505 struct listnode *pnode;
6506 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00006507 struct ospf_path *path;
6508
6509 vty_out (vty, "============ OSPF router routing table =============%s",
6510 VTY_NEWLINE);
6511 for (rn = route_top (rtrs); rn; rn = route_next (rn))
6512 if (rn->info)
6513 {
6514 int flag = 0;
6515
6516 vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
6517
paul1eb8ef22005-04-07 07:30:20 +00006518 for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
6519 {
6520 if (flag++)
6521 vty_out (vty, "%24s", "");
paul718e3742002-12-13 20:15:29 +00006522
paul1eb8ef22005-04-07 07:30:20 +00006523 /* Show path. */
6524 vty_out (vty, "%s [%d] area: %s",
6525 (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
6526 or->cost, inet_ntoa (or->u.std.area_id));
6527 /* Show flags. */
6528 vty_out (vty, "%s%s%s",
6529 (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
6530 (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
6531 VTY_NEWLINE);
6532
6533 for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
6534 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006535 if (if_lookup_by_index(path->ifindex))
hasso54bedb52005-08-17 13:31:47 +00006536 {
6537 if (path->nexthop.s_addr == 0)
6538 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006539 "", ifindex2ifname (path->ifindex),
6540 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00006541 else
6542 vty_out (vty, "%24s via %s, %s%s", "",
6543 inet_ntoa (path->nexthop),
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006544 ifindex2ifname (path->ifindex),
6545 VTY_NEWLINE);
hasso54bedb52005-08-17 13:31:47 +00006546 }
paul1eb8ef22005-04-07 07:30:20 +00006547 }
6548 }
paul718e3742002-12-13 20:15:29 +00006549 }
6550 vty_out (vty, "%s", VTY_NEWLINE);
6551}
6552
paul4dadc292005-05-06 21:37:42 +00006553static void
paul718e3742002-12-13 20:15:29 +00006554show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
6555{
6556 struct route_node *rn;
6557 struct ospf_route *er;
paul1eb8ef22005-04-07 07:30:20 +00006558 struct listnode *pnode, *pnnode;
paul718e3742002-12-13 20:15:29 +00006559 struct ospf_path *path;
6560
6561 vty_out (vty, "============ OSPF external routing table ===========%s",
6562 VTY_NEWLINE);
6563 for (rn = route_top (rt); rn; rn = route_next (rn))
6564 if ((er = rn->info) != NULL)
6565 {
6566 char buf1[19];
6567 snprintf (buf1, 19, "%s/%d",
6568 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
6569
6570 switch (er->path_type)
6571 {
6572 case OSPF_PATH_TYPE1_EXTERNAL:
6573 vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
6574 er->cost, er->u.ext.tag, VTY_NEWLINE);
6575 break;
6576 case OSPF_PATH_TYPE2_EXTERNAL:
6577 vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
6578 er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
6579 break;
6580 }
6581
paul1eb8ef22005-04-07 07:30:20 +00006582 for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
paul718e3742002-12-13 20:15:29 +00006583 {
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006584 if (if_lookup_by_index(path->ifindex))
paul718e3742002-12-13 20:15:29 +00006585 {
6586 if (path->nexthop.s_addr == 0)
paul96735ee2003-08-10 02:51:22 +00006587 vty_out (vty, "%24s directly attached to %s%s",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006588 "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
paul96735ee2003-08-10 02:51:22 +00006589 else
6590 vty_out (vty, "%24s via %s, %s%s", "",
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +02006591 inet_ntoa (path->nexthop),
6592 ifindex2ifname (path->ifindex),
paul96735ee2003-08-10 02:51:22 +00006593 VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006594 }
6595 }
6596 }
6597 vty_out (vty, "%s", VTY_NEWLINE);
6598}
6599
paul718e3742002-12-13 20:15:29 +00006600DEFUN (show_ip_ospf_border_routers,
6601 show_ip_ospf_border_routers_cmd,
6602 "show ip ospf border-routers",
6603 SHOW_STR
6604 IP_STR
6605 "show all the ABR's and ASBR's\n"
6606 "for this area\n")
6607{
paul020709f2003-04-04 02:44:16 +00006608 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00006609
Paul Jakmacac3b5c2006-05-11 13:31:11 +00006610 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00006611 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00006612 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006613 return CMD_SUCCESS;
6614 }
6615
paul68980082003-03-25 05:07:42 +00006616 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00006617 {
6618 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
6619 return CMD_SUCCESS;
6620 }
6621
6622 /* Show Network routes.
paul020709f2003-04-04 02:44:16 +00006623 show_ip_ospf_route_network (vty, ospf->new_table); */
paul718e3742002-12-13 20:15:29 +00006624
6625 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00006626 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00006627
6628 return CMD_SUCCESS;
6629}
paul718e3742002-12-13 20:15:29 +00006630
6631DEFUN (show_ip_ospf_route,
6632 show_ip_ospf_route_cmd,
6633 "show ip ospf route",
6634 SHOW_STR
6635 IP_STR
6636 "OSPF information\n"
6637 "OSPF routing table\n")
6638{
paul020709f2003-04-04 02:44:16 +00006639 struct ospf *ospf;
paul68980082003-03-25 05:07:42 +00006640
Paul Jakmacac3b5c2006-05-11 13:31:11 +00006641 if ((ospf = ospf_lookup ()) == NULL)
paul718e3742002-12-13 20:15:29 +00006642 {
Paul Jakmacac3b5c2006-05-11 13:31:11 +00006643 vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00006644 return CMD_SUCCESS;
6645 }
6646
paul68980082003-03-25 05:07:42 +00006647 if (ospf->new_table == NULL)
paul718e3742002-12-13 20:15:29 +00006648 {
6649 vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
6650 return CMD_SUCCESS;
6651 }
6652
6653 /* Show Network routes. */
paul68980082003-03-25 05:07:42 +00006654 show_ip_ospf_route_network (vty, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00006655
6656 /* Show Router routes. */
paul68980082003-03-25 05:07:42 +00006657 show_ip_ospf_route_router (vty, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00006658
6659 /* Show AS External routes. */
paul68980082003-03-25 05:07:42 +00006660 show_ip_ospf_route_external (vty, ospf->old_external_route);
paul718e3742002-12-13 20:15:29 +00006661
6662 return CMD_SUCCESS;
6663}
6664
David Lamparter6b0655a2014-06-04 06:53:35 +02006665
hassoeb1ce602004-10-08 08:17:22 +00006666const char *ospf_abr_type_str[] =
paul718e3742002-12-13 20:15:29 +00006667{
6668 "unknown",
6669 "standard",
6670 "ibm",
6671 "cisco",
6672 "shortcut"
6673};
6674
hassoeb1ce602004-10-08 08:17:22 +00006675const char *ospf_shortcut_mode_str[] =
paul718e3742002-12-13 20:15:29 +00006676{
6677 "default",
6678 "enable",
6679 "disable"
6680};
6681
6682
paul4dadc292005-05-06 21:37:42 +00006683static void
paul718e3742002-12-13 20:15:29 +00006684area_id2str (char *buf, int length, struct ospf_area *area)
6685{
6686 memset (buf, 0, length);
6687
6688 if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
6689 strncpy (buf, inet_ntoa (area->area_id), length);
6690 else
6691 sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
6692}
6693
David Lamparter6b0655a2014-06-04 06:53:35 +02006694
hassoeb1ce602004-10-08 08:17:22 +00006695const char *ospf_int_type_str[] =
paul718e3742002-12-13 20:15:29 +00006696{
6697 "unknown", /* should never be used. */
6698 "point-to-point",
6699 "broadcast",
6700 "non-broadcast",
6701 "point-to-multipoint",
6702 "virtual-link", /* should never be used. */
6703 "loopback"
6704};
6705
6706/* Configuration write function for ospfd. */
paul4dadc292005-05-06 21:37:42 +00006707static int
paul718e3742002-12-13 20:15:29 +00006708config_write_interface (struct vty *vty)
6709{
hasso52dc7ee2004-09-23 19:18:23 +00006710 struct listnode *n1, *n2;
paul718e3742002-12-13 20:15:29 +00006711 struct interface *ifp;
6712 struct crypt_key *ck;
6713 int write = 0;
6714 struct route_node *rn = NULL;
6715 struct ospf_if_params *params;
6716
paul1eb8ef22005-04-07 07:30:20 +00006717 for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
paul718e3742002-12-13 20:15:29 +00006718 {
paul718e3742002-12-13 20:15:29 +00006719 if (memcmp (ifp->name, "VLINK", 5) == 0)
6720 continue;
6721
6722 vty_out (vty, "!%s", VTY_NEWLINE);
6723 vty_out (vty, "interface %s%s", ifp->name,
6724 VTY_NEWLINE);
6725 if (ifp->desc)
6726 vty_out (vty, " description %s%s", ifp->desc,
6727 VTY_NEWLINE);
6728
6729 write++;
6730
6731 params = IF_DEF_PARAMS (ifp);
6732
6733 do {
6734 /* Interface Network print. */
6735 if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
paul718e3742002-12-13 20:15:29 +00006736 params->type != OSPF_IFTYPE_LOOPBACK)
6737 {
ajsbc18d612004-12-15 15:07:19 +00006738 if (params->type != ospf_default_iftype(ifp))
hasso7b901432004-08-31 13:37:42 +00006739 {
6740 vty_out (vty, " ip ospf network %s",
6741 ospf_int_type_str[params->type]);
6742 if (params != IF_DEF_PARAMS (ifp))
6743 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6744 vty_out (vty, "%s", VTY_NEWLINE);
6745 }
paul718e3742002-12-13 20:15:29 +00006746 }
6747
6748 /* OSPF interface authentication print */
6749 if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
6750 params->auth_type != OSPF_AUTH_NOTSET)
6751 {
hassoeb1ce602004-10-08 08:17:22 +00006752 const char *auth_str;
paul718e3742002-12-13 20:15:29 +00006753
6754 /* Translation tables are not that much help here due to syntax
6755 of the simple option */
6756 switch (params->auth_type)
6757 {
6758
6759 case OSPF_AUTH_NULL:
6760 auth_str = " null";
6761 break;
6762
6763 case OSPF_AUTH_SIMPLE:
6764 auth_str = "";
6765 break;
6766
6767 case OSPF_AUTH_CRYPTOGRAPHIC:
6768 auth_str = " message-digest";
6769 break;
6770
6771 default:
6772 auth_str = "";
6773 break;
6774 }
6775
6776 vty_out (vty, " ip ospf authentication%s", auth_str);
6777 if (params != IF_DEF_PARAMS (ifp))
6778 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6779 vty_out (vty, "%s", VTY_NEWLINE);
6780 }
6781
6782 /* Simple Authentication Password print. */
6783 if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
6784 params->auth_simple[0] != '\0')
6785 {
6786 vty_out (vty, " ip ospf authentication-key %s",
6787 params->auth_simple);
6788 if (params != IF_DEF_PARAMS (ifp))
6789 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6790 vty_out (vty, "%s", VTY_NEWLINE);
6791 }
6792
6793 /* Cryptographic Authentication Key print. */
paul1eb8ef22005-04-07 07:30:20 +00006794 for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
paul718e3742002-12-13 20:15:29 +00006795 {
paul718e3742002-12-13 20:15:29 +00006796 vty_out (vty, " ip ospf message-digest-key %d md5 %s",
6797 ck->key_id, ck->auth_key);
6798 if (params != IF_DEF_PARAMS (ifp))
6799 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6800 vty_out (vty, "%s", VTY_NEWLINE);
6801 }
6802
6803 /* Interface Output Cost print. */
6804 if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
6805 {
6806 vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
6807 if (params != IF_DEF_PARAMS (ifp))
6808 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6809 vty_out (vty, "%s", VTY_NEWLINE);
6810 }
6811
6812 /* Hello Interval print. */
6813 if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
6814 params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
6815 {
6816 vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
6817 if (params != IF_DEF_PARAMS (ifp))
6818 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6819 vty_out (vty, "%s", VTY_NEWLINE);
6820 }
6821
6822
6823 /* Router Dead Interval print. */
6824 if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
6825 params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
6826 {
paulf9ad9372005-10-21 00:45:17 +00006827 vty_out (vty, " ip ospf dead-interval ");
6828
6829 /* fast hello ? */
6830 if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
6831 vty_out (vty, "minimal hello-multiplier %d",
6832 params->fast_hello);
6833 else
6834 vty_out (vty, "%u", params->v_wait);
6835
paul718e3742002-12-13 20:15:29 +00006836 if (params != IF_DEF_PARAMS (ifp))
6837 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6838 vty_out (vty, "%s", VTY_NEWLINE);
6839 }
6840
6841 /* Router Priority print. */
6842 if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
6843 params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
6844 {
6845 vty_out (vty, " ip ospf priority %u", params->priority);
6846 if (params != IF_DEF_PARAMS (ifp))
6847 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6848 vty_out (vty, "%s", VTY_NEWLINE);
6849 }
6850
6851 /* Retransmit Interval print. */
6852 if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
6853 params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
6854 {
6855 vty_out (vty, " ip ospf retransmit-interval %u",
6856 params->retransmit_interval);
6857 if (params != IF_DEF_PARAMS (ifp))
6858 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6859 vty_out (vty, "%s", VTY_NEWLINE);
6860 }
6861
6862 /* Transmit Delay print. */
6863 if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
6864 params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
6865 {
6866 vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
6867 if (params != IF_DEF_PARAMS (ifp))
6868 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6869 vty_out (vty, "%s", VTY_NEWLINE);
6870 }
6871
vincentba682532005-09-29 13:52:57 +00006872 /* MTU ignore print. */
6873 if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
6874 params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6875 {
6876 if (params->mtu_ignore == 0)
6877 vty_out (vty, " no ip ospf mtu-ignore");
6878 else
6879 vty_out (vty, " ip ospf mtu-ignore");
6880 if (params != IF_DEF_PARAMS (ifp))
6881 vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
6882 vty_out (vty, "%s", VTY_NEWLINE);
6883 }
6884
6885
paul718e3742002-12-13 20:15:29 +00006886 while (1)
6887 {
6888 if (rn == NULL)
6889 rn = route_top (IF_OIFS_PARAMS (ifp));
6890 else
6891 rn = route_next (rn);
6892
6893 if (rn == NULL)
6894 break;
6895 params = rn->info;
6896 if (params != NULL)
6897 break;
6898 }
6899 } while (rn);
6900
6901#ifdef HAVE_OPAQUE_LSA
6902 ospf_opaque_config_write_if (vty, ifp);
6903#endif /* HAVE_OPAQUE_LSA */
6904 }
6905
6906 return write;
6907}
6908
paul4dadc292005-05-06 21:37:42 +00006909static int
paul68980082003-03-25 05:07:42 +00006910config_write_network_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00006911{
6912 struct route_node *rn;
6913 u_char buf[INET_ADDRSTRLEN];
6914
6915 /* `network area' print. */
paul68980082003-03-25 05:07:42 +00006916 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00006917 if (rn->info)
6918 {
6919 struct ospf_network *n = rn->info;
6920
6921 memset (buf, 0, INET_ADDRSTRLEN);
6922
6923 /* Create Area ID string by specified Area ID format. */
6924 if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00006925 strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00006926 else
hassoc9e52be2004-09-26 16:09:34 +00006927 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00006928 (unsigned long int) ntohl (n->area_id.s_addr));
6929
6930 /* Network print. */
6931 vty_out (vty, " network %s/%d area %s%s",
6932 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
6933 buf, VTY_NEWLINE);
6934 }
6935
6936 return 0;
6937}
6938
paul4dadc292005-05-06 21:37:42 +00006939static int
paul68980082003-03-25 05:07:42 +00006940config_write_ospf_area (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00006941{
hasso52dc7ee2004-09-23 19:18:23 +00006942 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00006943 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00006944 u_char buf[INET_ADDRSTRLEN];
6945
6946 /* Area configuration print. */
paul1eb8ef22005-04-07 07:30:20 +00006947 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00006948 {
paul718e3742002-12-13 20:15:29 +00006949 struct route_node *rn1;
6950
hassoc9e52be2004-09-26 16:09:34 +00006951 area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
paul718e3742002-12-13 20:15:29 +00006952
6953 if (area->auth_type != OSPF_AUTH_NULL)
6954 {
6955 if (area->auth_type == OSPF_AUTH_SIMPLE)
6956 vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
6957 else
6958 vty_out (vty, " area %s authentication message-digest%s",
6959 buf, VTY_NEWLINE);
6960 }
6961
6962 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
6963 vty_out (vty, " area %s shortcut %s%s", buf,
6964 ospf_shortcut_mode_str[area->shortcut_configured],
6965 VTY_NEWLINE);
6966
6967 if ((area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00006968 || (area->external_routing == OSPF_AREA_NSSA)
paul718e3742002-12-13 20:15:29 +00006969 )
6970 {
paulb0a053b2003-06-22 09:04:47 +00006971 if (area->external_routing == OSPF_AREA_STUB)
paul718e3742002-12-13 20:15:29 +00006972 vty_out (vty, " area %s stub", buf);
paulb0a053b2003-06-22 09:04:47 +00006973 else if (area->external_routing == OSPF_AREA_NSSA)
6974 {
6975 vty_out (vty, " area %s nssa", buf);
6976 switch (area->NSSATranslatorRole)
6977 {
6978 case OSPF_NSSA_ROLE_NEVER:
6979 vty_out (vty, " translate-never");
6980 break;
6981 case OSPF_NSSA_ROLE_ALWAYS:
6982 vty_out (vty, " translate-always");
6983 break;
6984 case OSPF_NSSA_ROLE_CANDIDATE:
6985 default:
6986 vty_out (vty, " translate-candidate");
6987 }
6988 }
paul718e3742002-12-13 20:15:29 +00006989
6990 if (area->no_summary)
6991 vty_out (vty, " no-summary");
6992
6993 vty_out (vty, "%s", VTY_NEWLINE);
6994
6995 if (area->default_cost != 1)
6996 vty_out (vty, " area %s default-cost %d%s", buf,
6997 area->default_cost, VTY_NEWLINE);
6998 }
6999
7000 for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7001 if (rn1->info)
7002 {
7003 struct ospf_area_range *range = rn1->info;
7004
7005 vty_out (vty, " area %s range %s/%d", buf,
7006 inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7007
paul6c835672004-10-11 11:00:30 +00007008 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +00007009 vty_out (vty, " cost %d", range->cost_config);
7010
7011 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7012 vty_out (vty, " not-advertise");
7013
7014 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7015 vty_out (vty, " substitute %s/%d",
7016 inet_ntoa (range->subst_addr), range->subst_masklen);
7017
7018 vty_out (vty, "%s", VTY_NEWLINE);
7019 }
7020
7021 if (EXPORT_NAME (area))
7022 vty_out (vty, " area %s export-list %s%s", buf,
7023 EXPORT_NAME (area), VTY_NEWLINE);
7024
7025 if (IMPORT_NAME (area))
7026 vty_out (vty, " area %s import-list %s%s", buf,
7027 IMPORT_NAME (area), VTY_NEWLINE);
7028
7029 if (PREFIX_NAME_IN (area))
7030 vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7031 PREFIX_NAME_IN (area), VTY_NEWLINE);
7032
7033 if (PREFIX_NAME_OUT (area))
7034 vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7035 PREFIX_NAME_OUT (area), VTY_NEWLINE);
7036 }
7037
7038 return 0;
7039}
7040
paul4dadc292005-05-06 21:37:42 +00007041static int
paul68980082003-03-25 05:07:42 +00007042config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007043{
7044 struct ospf_nbr_nbma *nbr_nbma;
7045 struct route_node *rn;
7046
7047 /* Static Neighbor configuration print. */
paul68980082003-03-25 05:07:42 +00007048 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007049 if ((nbr_nbma = rn->info))
7050 {
7051 vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7052
7053 if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7054 vty_out (vty, " priority %d", nbr_nbma->priority);
7055
7056 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7057 vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7058
7059 vty_out (vty, "%s", VTY_NEWLINE);
7060 }
7061
7062 return 0;
7063}
7064
paul4dadc292005-05-06 21:37:42 +00007065static int
paul68980082003-03-25 05:07:42 +00007066config_write_virtual_link (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007067{
hasso52dc7ee2004-09-23 19:18:23 +00007068 struct listnode *node;
paul1eb8ef22005-04-07 07:30:20 +00007069 struct ospf_vl_data *vl_data;
paul718e3742002-12-13 20:15:29 +00007070 u_char buf[INET_ADDRSTRLEN];
7071
7072 /* Virtual-Link print */
paul1eb8ef22005-04-07 07:30:20 +00007073 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
paul718e3742002-12-13 20:15:29 +00007074 {
hasso52dc7ee2004-09-23 19:18:23 +00007075 struct listnode *n2;
paul718e3742002-12-13 20:15:29 +00007076 struct crypt_key *ck;
paul718e3742002-12-13 20:15:29 +00007077 struct ospf_interface *oi;
7078
7079 if (vl_data != NULL)
7080 {
7081 memset (buf, 0, INET_ADDRSTRLEN);
7082
7083 if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
hassoc9e52be2004-09-26 16:09:34 +00007084 strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
paul718e3742002-12-13 20:15:29 +00007085 else
hassoc9e52be2004-09-26 16:09:34 +00007086 sprintf ((char *) buf, "%lu",
paul718e3742002-12-13 20:15:29 +00007087 (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7088 oi = vl_data->vl_oi;
7089
7090 /* timers */
7091 if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7092 OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7093 OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7094 OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7095 vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7096 buf,
7097 inet_ntoa (vl_data->vl_peer),
7098 OSPF_IF_PARAM (oi, v_hello),
7099 OSPF_IF_PARAM (oi, retransmit_interval),
7100 OSPF_IF_PARAM (oi, transmit_delay),
7101 OSPF_IF_PARAM (oi, v_wait),
7102 VTY_NEWLINE);
7103 else
7104 vty_out (vty, " area %s virtual-link %s%s", buf,
7105 inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7106 /* Auth key */
7107 if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7108 vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7109 buf,
7110 inet_ntoa (vl_data->vl_peer),
7111 IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7112 VTY_NEWLINE);
7113 /* md5 keys */
paul1eb8ef22005-04-07 07:30:20 +00007114 for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7115 n2, ck))
7116 vty_out (vty, " area %s virtual-link %s"
7117 " message-digest-key %d md5 %s%s",
7118 buf,
7119 inet_ntoa (vl_data->vl_peer),
7120 ck->key_id, ck->auth_key, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007121
7122 }
7123 }
7124
7125 return 0;
7126}
7127
David Lamparter6b0655a2014-06-04 06:53:35 +02007128
paul4dadc292005-05-06 21:37:42 +00007129static int
paul68980082003-03-25 05:07:42 +00007130config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007131{
7132 int type;
7133
7134 /* redistribute print. */
7135 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7136 if (type != zclient->redist_default && zclient->redist[type])
7137 {
ajsf52d13c2005-10-01 17:38:06 +00007138 vty_out (vty, " redistribute %s", zebra_route_string(type));
paul68980082003-03-25 05:07:42 +00007139 if (ospf->dmetric[type].value >= 0)
paul020709f2003-04-04 02:44:16 +00007140 vty_out (vty, " metric %d", ospf->dmetric[type].value);
paul718e3742002-12-13 20:15:29 +00007141
paul68980082003-03-25 05:07:42 +00007142 if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007143 vty_out (vty, " metric-type 1");
7144
paul020709f2003-04-04 02:44:16 +00007145 if (ROUTEMAP_NAME (ospf, type))
7146 vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
paul718e3742002-12-13 20:15:29 +00007147
7148 vty_out (vty, "%s", VTY_NEWLINE);
7149 }
7150
7151 return 0;
7152}
7153
paul4dadc292005-05-06 21:37:42 +00007154static int
paul68980082003-03-25 05:07:42 +00007155config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007156{
paul68980082003-03-25 05:07:42 +00007157 if (ospf->default_metric != -1)
7158 vty_out (vty, " default-metric %d%s", ospf->default_metric,
paul718e3742002-12-13 20:15:29 +00007159 VTY_NEWLINE);
7160 return 0;
7161}
7162
paul4dadc292005-05-06 21:37:42 +00007163static int
paul68980082003-03-25 05:07:42 +00007164config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007165{
7166 int type;
7167
paul68980082003-03-25 05:07:42 +00007168 if (ospf)
paul718e3742002-12-13 20:15:29 +00007169 {
7170 /* distribute-list print. */
7171 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
Denis Ovsienko171c9a92011-09-10 16:40:23 +04007172 if (DISTRIBUTE_NAME (ospf, type))
paul718e3742002-12-13 20:15:29 +00007173 vty_out (vty, " distribute-list %s out %s%s",
Denis Ovsienko171c9a92011-09-10 16:40:23 +04007174 DISTRIBUTE_NAME (ospf, type),
ajsf52d13c2005-10-01 17:38:06 +00007175 zebra_route_string(type), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007176
7177 /* default-information print. */
paul68980082003-03-25 05:07:42 +00007178 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
paul718e3742002-12-13 20:15:29 +00007179 {
paulc42c1772006-01-10 20:36:49 +00007180 vty_out (vty, " default-information originate");
7181 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7182 vty_out (vty, " always");
paul718e3742002-12-13 20:15:29 +00007183
paul68980082003-03-25 05:07:42 +00007184 if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
paul718e3742002-12-13 20:15:29 +00007185 vty_out (vty, " metric %d",
paul68980082003-03-25 05:07:42 +00007186 ospf->dmetric[DEFAULT_ROUTE].value);
7187 if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
paul718e3742002-12-13 20:15:29 +00007188 vty_out (vty, " metric-type 1");
7189
paul020709f2003-04-04 02:44:16 +00007190 if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7191 vty_out (vty, " route-map %s",
7192 ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
paul718e3742002-12-13 20:15:29 +00007193
7194 vty_out (vty, "%s", VTY_NEWLINE);
7195 }
7196
7197 }
7198
7199 return 0;
7200}
7201
paul4dadc292005-05-06 21:37:42 +00007202static int
paul68980082003-03-25 05:07:42 +00007203config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00007204{
7205 struct route_node *rn;
7206 struct ospf_distance *odistance;
7207
paul68980082003-03-25 05:07:42 +00007208 if (ospf->distance_all)
7209 vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007210
paul68980082003-03-25 05:07:42 +00007211 if (ospf->distance_intra
7212 || ospf->distance_inter
7213 || ospf->distance_external)
paul718e3742002-12-13 20:15:29 +00007214 {
7215 vty_out (vty, " distance ospf");
7216
paul68980082003-03-25 05:07:42 +00007217 if (ospf->distance_intra)
7218 vty_out (vty, " intra-area %d", ospf->distance_intra);
7219 if (ospf->distance_inter)
7220 vty_out (vty, " inter-area %d", ospf->distance_inter);
7221 if (ospf->distance_external)
7222 vty_out (vty, " external %d", ospf->distance_external);
paul718e3742002-12-13 20:15:29 +00007223
7224 vty_out (vty, "%s", VTY_NEWLINE);
7225 }
7226
paul68980082003-03-25 05:07:42 +00007227 for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
paul718e3742002-12-13 20:15:29 +00007228 if ((odistance = rn->info) != NULL)
7229 {
7230 vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7231 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7232 odistance->access_list ? odistance->access_list : "",
7233 VTY_NEWLINE);
7234 }
7235 return 0;
7236}
7237
7238/* OSPF configuration write function. */
paul4dadc292005-05-06 21:37:42 +00007239static int
paul718e3742002-12-13 20:15:29 +00007240ospf_config_write (struct vty *vty)
7241{
paul020709f2003-04-04 02:44:16 +00007242 struct ospf *ospf;
paul1eb8ef22005-04-07 07:30:20 +00007243 struct interface *ifp;
7244 struct ospf_interface *oi;
hasso52dc7ee2004-09-23 19:18:23 +00007245 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00007246 int write = 0;
7247
paul020709f2003-04-04 02:44:16 +00007248 ospf = ospf_lookup ();
paul68980082003-03-25 05:07:42 +00007249 if (ospf != NULL)
paul718e3742002-12-13 20:15:29 +00007250 {
7251 /* `router ospf' print. */
7252 vty_out (vty, "router ospf%s", VTY_NEWLINE);
7253
7254 write++;
7255
paul68980082003-03-25 05:07:42 +00007256 if (!ospf->networks)
paul718e3742002-12-13 20:15:29 +00007257 return write;
7258
7259 /* Router ID print. */
paul68980082003-03-25 05:07:42 +00007260 if (ospf->router_id_static.s_addr != 0)
paul718e3742002-12-13 20:15:29 +00007261 vty_out (vty, " ospf router-id %s%s",
paul68980082003-03-25 05:07:42 +00007262 inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007263
7264 /* ABR type print. */
pauld57834f2005-07-12 20:04:22 +00007265 if (ospf->abr_type != OSPF_ABR_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007266 vty_out (vty, " ospf abr-type %s%s",
paul68980082003-03-25 05:07:42 +00007267 ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007268
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007269 /* log-adjacency-changes flag print. */
7270 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
7271 {
7272 vty_out(vty, " log-adjacency-changes");
7273 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
7274 vty_out(vty, " detail");
7275 vty_out(vty, "%s", VTY_NEWLINE);
7276 }
7277
paul718e3742002-12-13 20:15:29 +00007278 /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
paul68980082003-03-25 05:07:42 +00007279 if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
paul718e3742002-12-13 20:15:29 +00007280 vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
7281
7282 /* auto-cost reference-bandwidth configuration. */
paul68980082003-03-25 05:07:42 +00007283 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
paulf9ad9372005-10-21 00:45:17 +00007284 {
7285 vty_out (vty, "! Important: ensure reference bandwidth "
7286 "is consistent across all routers%s", VTY_NEWLINE);
7287 vty_out (vty, " auto-cost reference-bandwidth %d%s",
7288 ospf->ref_bandwidth / 1000, VTY_NEWLINE);
7289 }
paul718e3742002-12-13 20:15:29 +00007290
7291 /* SPF timers print. */
paul68980082003-03-25 05:07:42 +00007292 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
paulea4ffc92005-10-21 20:04:41 +00007293 ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
7294 ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
7295 vty_out (vty, " timers throttle spf %d %d %d%s",
paul88d6cf32005-10-29 12:50:09 +00007296 ospf->spf_delay, ospf->spf_holdtime,
paulea4ffc92005-10-21 20:04:41 +00007297 ospf->spf_max_holdtime, VTY_NEWLINE);
paul88d6cf32005-10-29 12:50:09 +00007298
7299 /* Max-metric router-lsa print */
7300 config_write_stub_router (vty, ospf);
7301
paul718e3742002-12-13 20:15:29 +00007302 /* SPF refresh parameters print. */
paul68980082003-03-25 05:07:42 +00007303 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
paul718e3742002-12-13 20:15:29 +00007304 vty_out (vty, " refresh timer %d%s",
paul68980082003-03-25 05:07:42 +00007305 ospf->lsa_refresh_interval, VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00007306
7307 /* Redistribute information print. */
paul68980082003-03-25 05:07:42 +00007308 config_write_ospf_redistribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007309
7310 /* passive-interface print. */
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007311 if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
7312 vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
7313
paul1eb8ef22005-04-07 07:30:20 +00007314 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007315 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
7316 && IF_DEF_PARAMS (ifp)->passive_interface !=
7317 ospf->passive_interface_default)
7318 {
7319 vty_out (vty, " %spassive-interface %s%s",
7320 IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
7321 ifp->name, VTY_NEWLINE);
7322 }
paul1eb8ef22005-04-07 07:30:20 +00007323 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007324 {
7325 if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
7326 continue;
7327 if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
7328 passive_interface))
7329 {
7330 if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
7331 continue;
7332 }
7333 else if (oi->params->passive_interface == ospf->passive_interface_default)
7334 continue;
7335
7336 vty_out (vty, " %spassive-interface %s %s%s",
7337 oi->params->passive_interface ? "" : "no ",
paul1eb8ef22005-04-07 07:30:20 +00007338 oi->ifp->name,
7339 inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007340 }
paul718e3742002-12-13 20:15:29 +00007341
7342 /* Network area print. */
paul68980082003-03-25 05:07:42 +00007343 config_write_network_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007344
7345 /* Area config print. */
paul68980082003-03-25 05:07:42 +00007346 config_write_ospf_area (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007347
7348 /* static neighbor print. */
paul68980082003-03-25 05:07:42 +00007349 config_write_ospf_nbr_nbma (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007350
7351 /* Virtual-Link print. */
paul68980082003-03-25 05:07:42 +00007352 config_write_virtual_link (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007353
7354 /* Default metric configuration. */
paul68980082003-03-25 05:07:42 +00007355 config_write_ospf_default_metric (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007356
7357 /* Distribute-list and default-information print. */
paul68980082003-03-25 05:07:42 +00007358 config_write_ospf_distribute (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007359
7360 /* Distance configuration. */
paul68980082003-03-25 05:07:42 +00007361 config_write_ospf_distance (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007362
7363#ifdef HAVE_OPAQUE_LSA
paul68980082003-03-25 05:07:42 +00007364 ospf_opaque_config_write_router (vty, ospf);
paul718e3742002-12-13 20:15:29 +00007365#endif /* HAVE_OPAQUE_LSA */
7366 }
7367
7368 return write;
7369}
7370
7371void
paul4dadc292005-05-06 21:37:42 +00007372ospf_vty_show_init (void)
paul718e3742002-12-13 20:15:29 +00007373{
7374 /* "show ip ospf" commands. */
7375 install_element (VIEW_NODE, &show_ip_ospf_cmd);
7376 install_element (ENABLE_NODE, &show_ip_ospf_cmd);
7377
7378 /* "show ip ospf database" commands. */
7379 install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
7380 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
7381 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
7382 install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
7383 install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
7384 install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
7385 install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
7386 install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
7387 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
7388 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
7389 install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
7390 install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
7391 install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
7392 install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
7393
7394 /* "show ip ospf interface" commands. */
7395 install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
7396 install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
7397
7398 /* "show ip ospf neighbor" commands. */
7399 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
7400 install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
7401 install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
7402 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
7403 install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
7404 install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
7405 install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
7406 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
7407 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
7408 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
7409 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
7410 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
7411 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
7412 install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
7413
7414 /* "show ip ospf route" commands. */
7415 install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
7416 install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
paul718e3742002-12-13 20:15:29 +00007417 install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
7418 install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
paul718e3742002-12-13 20:15:29 +00007419}
7420
David Lamparter6b0655a2014-06-04 06:53:35 +02007421
paul718e3742002-12-13 20:15:29 +00007422/* ospfd's interface node. */
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08007423static struct cmd_node interface_node =
paul718e3742002-12-13 20:15:29 +00007424{
7425 INTERFACE_NODE,
7426 "%s(config-if)# ",
7427 1
7428};
7429
7430/* Initialization of OSPF interface. */
paul4dadc292005-05-06 21:37:42 +00007431static void
7432ospf_vty_if_init (void)
paul718e3742002-12-13 20:15:29 +00007433{
7434 /* Install interface node. */
7435 install_node (&interface_node, config_write_interface);
7436
7437 install_element (CONFIG_NODE, &interface_cmd);
paul32d24632003-05-23 09:25:20 +00007438 install_element (CONFIG_NODE, &no_interface_cmd);
paul718e3742002-12-13 20:15:29 +00007439 install_default (INTERFACE_NODE);
7440
7441 /* "description" commands. */
7442 install_element (INTERFACE_NODE, &interface_desc_cmd);
7443 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
7444
7445 /* "ip ospf authentication" commands. */
7446 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
7447 install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
7448 install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
7449 install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
7450 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
7451 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
7452 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
7453 install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
7454 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
7455 install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
7456
7457 /* "ip ospf message-digest-key" commands. */
7458 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
7459 install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
7460 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
7461 install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
7462
7463 /* "ip ospf cost" commands. */
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04007464 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
7465 install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04007466 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
7467 install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04007468 install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00007469 install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
7470
vincentba682532005-09-29 13:52:57 +00007471 /* "ip ospf mtu-ignore" commands. */
7472 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
7473 install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
7474 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
7475 install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
7476
paul718e3742002-12-13 20:15:29 +00007477 /* "ip ospf dead-interval" commands. */
7478 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
7479 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00007480 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
7481 install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
paul718e3742002-12-13 20:15:29 +00007482 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
7483 install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
paulf9ad9372005-10-21 00:45:17 +00007484
paul718e3742002-12-13 20:15:29 +00007485 /* "ip ospf hello-interval" commands. */
7486 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
7487 install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
7488 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
7489 install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
7490
7491 /* "ip ospf network" commands. */
7492 install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
7493 install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
7494
7495 /* "ip ospf priority" commands. */
7496 install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
7497 install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
7498 install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
7499 install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
7500
7501 /* "ip ospf retransmit-interval" commands. */
7502 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
7503 install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
7504 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
7505 install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
7506
7507 /* "ip ospf transmit-delay" commands. */
7508 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
7509 install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
7510 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
7511 install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
7512
7513 /* These commands are compatibitliy for previous version. */
7514 install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
7515 install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
7516 install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
7517 install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04007518 install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
7519 install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00007520 install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
Denis Ovsienko827341b2009-09-28 19:34:59 +04007521 install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
7522 install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
Denis Ovsienko9eff36b2009-04-10 18:51:24 +04007523 install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
paul718e3742002-12-13 20:15:29 +00007524 install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
7525 install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
7526 install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
7527 install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
7528 install_element (INTERFACE_NODE, &ospf_network_cmd);
7529 install_element (INTERFACE_NODE, &no_ospf_network_cmd);
7530 install_element (INTERFACE_NODE, &ospf_priority_cmd);
7531 install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
7532 install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
7533 install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
7534 install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
7535 install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
7536}
7537
paul4dadc292005-05-06 21:37:42 +00007538static void
7539ospf_vty_zebra_init (void)
paul718e3742002-12-13 20:15:29 +00007540{
paul718e3742002-12-13 20:15:29 +00007541 install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
paul718e3742002-12-13 20:15:29 +00007542 install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
7543
7544 install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
7545 install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
7546
paul718e3742002-12-13 20:15:29 +00007547 install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
paul718e3742002-12-13 20:15:29 +00007548 install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
7549
7550 install_element (OSPF_NODE, &ospf_default_metric_cmd);
7551 install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
7552 install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
7553
7554 install_element (OSPF_NODE, &ospf_distance_cmd);
7555 install_element (OSPF_NODE, &no_ospf_distance_cmd);
7556 install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
Christian Franke6f2a6702013-09-30 12:27:52 +00007557 install_element (OSPF_NODE, &ospf_distance_ospf_cmd);
paul718e3742002-12-13 20:15:29 +00007558#if 0
7559 install_element (OSPF_NODE, &ospf_distance_source_cmd);
7560 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
7561 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
7562 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
7563#endif /* 0 */
7564}
7565
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08007566static struct cmd_node ospf_node =
paul718e3742002-12-13 20:15:29 +00007567{
7568 OSPF_NODE,
7569 "%s(config-router)# ",
7570 1
7571};
7572
David Lamparter6b0655a2014-06-04 06:53:35 +02007573
paul718e3742002-12-13 20:15:29 +00007574/* Install OSPF related vty commands. */
7575void
paul4dadc292005-05-06 21:37:42 +00007576ospf_vty_init (void)
paul718e3742002-12-13 20:15:29 +00007577{
7578 /* Install ospf top node. */
7579 install_node (&ospf_node, ospf_config_write);
7580
7581 /* "router ospf" commands. */
7582 install_element (CONFIG_NODE, &router_ospf_cmd);
7583 install_element (CONFIG_NODE, &no_router_ospf_cmd);
7584
7585 install_default (OSPF_NODE);
7586
7587 /* "ospf router-id" commands. */
7588 install_element (OSPF_NODE, &ospf_router_id_cmd);
7589 install_element (OSPF_NODE, &no_ospf_router_id_cmd);
paula2c62832003-04-23 17:01:31 +00007590 install_element (OSPF_NODE, &router_ospf_id_cmd);
7591 install_element (OSPF_NODE, &no_router_ospf_id_cmd);
paul718e3742002-12-13 20:15:29 +00007592
7593 /* "passive-interface" commands. */
paula2c62832003-04-23 17:01:31 +00007594 install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
7595 install_element (OSPF_NODE, &ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007596 install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
paula2c62832003-04-23 17:01:31 +00007597 install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
7598 install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
Paul Jakma7ffa8fa2006-10-22 20:07:53 +00007599 install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
paul718e3742002-12-13 20:15:29 +00007600
7601 /* "ospf abr-type" commands. */
7602 install_element (OSPF_NODE, &ospf_abr_type_cmd);
7603 install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
7604
Andrew J. Schorrd7e60dd2006-06-29 20:20:52 +00007605 /* "ospf log-adjacency-changes" commands. */
7606 install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
7607 install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
7608 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
7609 install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
7610
paul718e3742002-12-13 20:15:29 +00007611 /* "ospf rfc1583-compatible" commands. */
7612 install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
7613 install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
7614 install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
7615 install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
7616
7617 /* "network area" commands. */
paula2c62832003-04-23 17:01:31 +00007618 install_element (OSPF_NODE, &ospf_network_area_cmd);
7619 install_element (OSPF_NODE, &no_ospf_network_area_cmd);
paul718e3742002-12-13 20:15:29 +00007620
7621 /* "area authentication" commands. */
paula2c62832003-04-23 17:01:31 +00007622 install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
7623 install_element (OSPF_NODE, &ospf_area_authentication_cmd);
7624 install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
paul718e3742002-12-13 20:15:29 +00007625
7626 /* "area range" commands. */
paula2c62832003-04-23 17:01:31 +00007627 install_element (OSPF_NODE, &ospf_area_range_cmd);
7628 install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
7629 install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
7630 install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
7631 install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
7632 install_element (OSPF_NODE, &no_ospf_area_range_cmd);
7633 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
7634 install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
7635 install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
7636 install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
7637 install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
paul718e3742002-12-13 20:15:29 +00007638
7639 /* "area virtual-link" commands. */
paula2c62832003-04-23 17:01:31 +00007640 install_element (OSPF_NODE, &ospf_area_vlink_cmd);
7641 install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
paul718e3742002-12-13 20:15:29 +00007642
paula2c62832003-04-23 17:01:31 +00007643 install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
7644 install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
paul718e3742002-12-13 20:15:29 +00007645
paula2c62832003-04-23 17:01:31 +00007646 install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
7647 install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
paul718e3742002-12-13 20:15:29 +00007648
paula2c62832003-04-23 17:01:31 +00007649 install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
7650 install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
paul718e3742002-12-13 20:15:29 +00007651
paula2c62832003-04-23 17:01:31 +00007652 install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
7653 install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
paul718e3742002-12-13 20:15:29 +00007654
paula2c62832003-04-23 17:01:31 +00007655 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
7656 install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
7657 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
paul718e3742002-12-13 20:15:29 +00007658
paula2c62832003-04-23 17:01:31 +00007659 install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
7660 install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
paul718e3742002-12-13 20:15:29 +00007661
paula2c62832003-04-23 17:01:31 +00007662 install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
7663 install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00007664
paula2c62832003-04-23 17:01:31 +00007665 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
7666 install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
7667 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
paul718e3742002-12-13 20:15:29 +00007668
paula2c62832003-04-23 17:01:31 +00007669 install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
7670 install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
7671 install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
paul718e3742002-12-13 20:15:29 +00007672
7673 /* "area stub" commands. */
paula2c62832003-04-23 17:01:31 +00007674 install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
7675 install_element (OSPF_NODE, &ospf_area_stub_cmd);
7676 install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
7677 install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
paul718e3742002-12-13 20:15:29 +00007678
paul718e3742002-12-13 20:15:29 +00007679 /* "area nssa" commands. */
paula2c62832003-04-23 17:01:31 +00007680 install_element (OSPF_NODE, &ospf_area_nssa_cmd);
7681 install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
7682 install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
7683 install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
7684 install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
7685 install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
paul718e3742002-12-13 20:15:29 +00007686
paula2c62832003-04-23 17:01:31 +00007687 install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
7688 install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
paul718e3742002-12-13 20:15:29 +00007689
paula2c62832003-04-23 17:01:31 +00007690 install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
7691 install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
paul718e3742002-12-13 20:15:29 +00007692
paula2c62832003-04-23 17:01:31 +00007693 install_element (OSPF_NODE, &ospf_area_export_list_cmd);
7694 install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
paul718e3742002-12-13 20:15:29 +00007695
paula2c62832003-04-23 17:01:31 +00007696 install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
7697 install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
paul718e3742002-12-13 20:15:29 +00007698
paula2c62832003-04-23 17:01:31 +00007699 install_element (OSPF_NODE, &ospf_area_import_list_cmd);
7700 install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
paul88d6cf32005-10-29 12:50:09 +00007701
7702 /* SPF timer commands */
paula2c62832003-04-23 17:01:31 +00007703 install_element (OSPF_NODE, &ospf_timers_spf_cmd);
7704 install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
pauld24f6e22005-10-21 09:23:12 +00007705 install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
7706 install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
7707
paul88d6cf32005-10-29 12:50:09 +00007708 /* refresh timer commands */
paula2c62832003-04-23 17:01:31 +00007709 install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
7710 install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
7711 install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
paul718e3742002-12-13 20:15:29 +00007712
paul88d6cf32005-10-29 12:50:09 +00007713 /* max-metric commands */
7714 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
7715 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
7716 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
7717 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
7718 install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
7719 install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
7720
7721 /* reference bandwidth commands */
paula2c62832003-04-23 17:01:31 +00007722 install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
7723 install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
paul718e3742002-12-13 20:15:29 +00007724
7725 /* "neighbor" commands. */
paula2c62832003-04-23 17:01:31 +00007726 install_element (OSPF_NODE, &ospf_neighbor_cmd);
7727 install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
7728 install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
7729 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
7730 install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
7731 install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
7732 install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
7733 install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
paul718e3742002-12-13 20:15:29 +00007734
7735 /* Init interface related vty commands. */
7736 ospf_vty_if_init ();
7737
7738 /* Init zebra related vty commands. */
7739 ospf_vty_zebra_init ();
7740}