]> git.proxmox.com Git - mirror_frr.git/blame - ospfd/ospf_vty.c
Merge pull request #5468 from qlyoung/bgpd-remove-bgp-attr-dup
[mirror_frr.git] / ospfd / ospf_vty.c
CommitLineData
718e3744 1/* OSPF VTY interface.
ba682537 2 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
718e3744 3 * 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 *
896014f4
DL
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
718e3744 20 */
21
22#include <zebra.h>
7ec4159b 23#include <string.h>
718e3744 24
cbf3e3eb 25#include "monotime.h"
718e3744 26#include "memory.h"
27#include "thread.h"
28#include "prefix.h"
29#include "table.h"
30#include "vty.h"
31#include "command.h"
32#include "plist.h"
33#include "log.h"
34#include "zclient.h"
bf2bfafd 35#include <lib/json.h>
8efe88ea 36#include "defaults.h"
718e3744 37
38#include "ospfd/ospfd.h"
39#include "ospfd/ospf_asbr.h"
40#include "ospfd/ospf_lsa.h"
41#include "ospfd/ospf_lsdb.h"
42#include "ospfd/ospf_ism.h"
43#include "ospfd/ospf_interface.h"
44#include "ospfd/ospf_nsm.h"
45#include "ospfd/ospf_neighbor.h"
46#include "ospfd/ospf_flood.h"
47#include "ospfd/ospf_abr.h"
48#include "ospfd/ospf_spf.h"
49#include "ospfd/ospf_route.h"
50#include "ospfd/ospf_zebra.h"
51/*#include "ospfd/ospf_routemap.h" */
52#include "ospfd/ospf_vty.h"
53#include "ospfd/ospf_dump.h"
7f342629 54#include "ospfd/ospf_bfd.h"
718e3744 55
2b64873d 56static const char *const ospf_network_type_str[] = {
d62a17ae 57 "Null", "POINTOPOINT", "BROADCAST", "NBMA", "POINTOMULTIPOINT",
58 "VIRTUALLINK", "LOOPBACK"};
718e3744 59
718e3744 60/* Utility functions. */
d62a17ae 61int str2area_id(const char *str, struct in_addr *area_id, int *area_id_fmt)
718e3744 62{
d62a17ae 63 char *ep;
718e3744 64
d62a17ae 65 area_id->s_addr = htonl(strtoul(str, &ep, 10));
66 if (*ep && !inet_aton(str, area_id))
67 return -1;
718e3744 68
d62a17ae 69 *area_id_fmt =
70 *ep ? OSPF_AREA_ID_FMT_DOTTEDQUAD : OSPF_AREA_ID_FMT_DECIMAL;
718e3744 71
d62a17ae 72 return 0;
718e3744 73}
74
1f9d4e3d 75static void area_id2str(char *buf, int length, struct in_addr *area_id,
76 int area_id_fmt)
86573dcb 77{
d62a17ae 78 if (area_id_fmt == OSPF_AREA_ID_FMT_DOTTEDQUAD)
1f9d4e3d 79 inet_ntop(AF_INET, area_id, buf, length);
d62a17ae 80 else
81 sprintf(buf, "%lu", (unsigned long)ntohl(area_id->s_addr));
86573dcb 82}
6b0655a2 83
d62a17ae 84static int str2metric(const char *str, int *metric)
718e3744 85{
d62a17ae 86 /* Sanity check. */
87 if (str == NULL)
88 return 0;
718e3744 89
d62a17ae 90 *metric = strtol(str, NULL, 10);
91 if (*metric < 0 && *metric > 16777214) {
92 /* vty_out (vty, "OSPF metric value is invalid\n"); */
93 return 0;
94 }
718e3744 95
d62a17ae 96 return 1;
718e3744 97}
98
d62a17ae 99static int str2metric_type(const char *str, int *metric_type)
718e3744 100{
d62a17ae 101 /* Sanity check. */
102 if (str == NULL)
103 return 0;
718e3744 104
d62a17ae 105 if (strncmp(str, "1", 1) == 0)
106 *metric_type = EXTERNAL_METRIC_TYPE_1;
107 else if (strncmp(str, "2", 1) == 0)
108 *metric_type = EXTERNAL_METRIC_TYPE_2;
109 else
110 return 0;
718e3744 111
d62a17ae 112 return 1;
718e3744 113}
114
d62a17ae 115int ospf_oi_count(struct interface *ifp)
718e3744 116{
d62a17ae 117 struct route_node *rn;
118 int i = 0;
718e3744 119
d62a17ae 120 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
121 if (rn->info)
122 i++;
718e3744 123
d62a17ae 124 return i;
718e3744 125}
126
996c9314
LB
127#define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
128 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
129 vrf_name = argv[idx_vrf + 1]->arg; \
130 all_vrf = strmatch(vrf_name, "all"); \
43b8d1d8
CS
131 }
132
133static struct ospf *ospf_cmd_lookup_ospf(struct vty *vty,
134 struct cmd_token *argv[],
996c9314 135 const int argc, uint32_t enable,
d7c0a89a 136 unsigned short *instance)
718e3744 137{
b5a8894d 138 struct ospf *ospf = NULL;
34d6798f 139 int idx_vrf = 0, idx_inst = 0;
b5a8894d
CS
140 const char *vrf_name = NULL;
141
34d6798f
CS
142 *instance = 0;
143 if (argv_find(argv, argc, "(1-65535)", &idx_inst))
144 *instance = strtoul(argv[idx_inst]->arg, NULL, 10);
145
b5a8894d 146 if (argv_find(argv, argc, "vrf", &idx_vrf)) {
b5a8894d 147 vrf_name = argv[idx_vrf + 1]->arg;
6895b354
PG
148 if (vrf_name == NULL || strmatch(vrf_name, VRF_DEFAULT_NAME))
149 vrf_name = NULL;
43b8d1d8 150 if (enable) {
43b8d1d8
CS
151 /* Allocate VRF aware instance */
152 ospf = ospf_get(*instance, vrf_name);
153 } else {
43b8d1d8
CS
154 ospf = ospf_lookup_by_inst_name(*instance, vrf_name);
155 }
b5a8894d 156 } else {
43b8d1d8 157 if (enable) {
34d6798f 158 ospf = ospf_get(*instance, NULL);
43b8d1d8 159 } else {
43b8d1d8 160 ospf = ospf_lookup_instance(*instance);
b5a8894d 161 }
d62a17ae 162 }
34d6798f 163
43b8d1d8
CS
164 return ospf;
165}
166
52d0c099 167static void ospf_show_vrf_name(struct ospf *ospf, struct vty *vty,
d7c0a89a 168 json_object *json, uint8_t use_vrf)
52d0c099 169{
b1c3ae8c
CS
170 if (use_vrf) {
171 if (json) {
172 if (ospf->vrf_id == VRF_DEFAULT)
173 json_object_string_add(json, "vrfName",
174 "default");
175 else
176 json_object_string_add(json, "vrfName",
177 ospf->name);
178 json_object_int_add(json, "vrfId", ospf->vrf_id);
179 } else {
180 if (ospf->vrf_id == VRF_DEFAULT)
181 vty_out(vty, "VRF Name: %s\n", "default");
182 else if (ospf->name)
183 vty_out(vty, "VRF Name: %s\n", ospf->name);
184 }
52d0c099 185 }
52d0c099
CS
186}
187
43b8d1d8 188#ifndef VTYSH_EXTRACT_PL
2e4c2296 189#include "ospfd/ospf_vty_clippy.c"
43b8d1d8
CS
190#endif
191
192DEFUN_NOSH (router_ospf,
193 router_ospf_cmd,
194 "router ospf [{(1-65535)|vrf NAME}]",
195 "Enable a routing process\n"
196 "Start OSPF configuration\n"
197 "Instance ID\n"
198 VRF_CMD_HELP_STR)
199{
200 struct ospf *ospf = NULL;
201 int ret = CMD_SUCCESS;
d7c0a89a 202 unsigned short instance = 0;
aed7cc62
CS
203 struct vrf *vrf = NULL;
204 struct route_node *rn;
205 struct interface *ifp;
43b8d1d8
CS
206
207 ospf = ospf_cmd_lookup_ospf(vty, argv, argc, 1, &instance);
208 if (!ospf)
209 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 210
d62a17ae 211 /* The following logic to set the vty qobj index is in place to be able
212 to ignore the commands which dont belong to this instance. */
64ac44f6 213 if (ospf->instance != instance) {
d62a17ae 214 VTY_PUSH_CONTEXT_NULL(OSPF_NODE);
64ac44f6
CS
215 ret = CMD_NOT_MY_INSTANCE;
216 } else {
b5a8894d
CS
217 if (ospf->vrf_id != VRF_UNKNOWN)
218 ospf->oi_running = 1;
d62a17ae 219 if (IS_DEBUG_OSPF_EVENT)
996c9314
LB
220 zlog_debug(
221 "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
222 instance, ospf->name ? ospf->name : "NIL",
223 ospf->vrf_id, ospf->oi_running);
d62a17ae 224 VTY_PUSH_CONTEXT(OSPF_NODE, ospf);
aed7cc62
CS
225
226 /* Activate 'ip ospf area x' configured interfaces for given
227 * vrf. Activate area on vrf x aware interfaces.
228 * vrf_enable callback calls router_id_update which
229 * internally will call ospf_if_update to trigger
230 * network_run_state
231 */
232 vrf = vrf_lookup_by_id(ospf->vrf_id);
233
234 FOR_ALL_INTERFACES (vrf, ifp) {
235 struct ospf_if_params *params;
236
237 params = IF_DEF_PARAMS(ifp);
238 if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
239 for (rn = route_top(ospf->networks); rn;
240 rn = route_next(rn)) {
241 if (rn->info != NULL) {
242 vty_out(vty,
996c9314
LB
243 "Interface %s has area config but please remove all network commands first.\n",
244 ifp->name);
aed7cc62
CS
245 return ret;
246 }
247 }
e9f07a30
PG
248 if (!ospf_interface_area_is_already_set(ospf,
249 ifp)) {
250 ospf_interface_area_set(ospf, ifp);
251 ospf->if_ospf_cli_count++;
252 }
aed7cc62
CS
253 }
254 }
255
d62a17ae 256 ospf_router_id_update(ospf);
257 }
258
64ac44f6 259 return ret;
718e3744 260}
261
262DEFUN (no_router_ospf,
263 no_router_ospf_cmd,
43b8d1d8 264 "no router ospf [{(1-65535)|vrf NAME}]",
718e3744 265 NO_STR
266 "Enable a routing process\n"
7a7be519 267 "Start OSPF configuration\n"
b5a8894d
CS
268 "Instance ID\n"
269 VRF_CMD_HELP_STR)
718e3744 270{
d62a17ae 271 struct ospf *ospf;
d7c0a89a 272 unsigned short instance = 0;
b5a8894d 273
43b8d1d8
CS
274 ospf = ospf_cmd_lookup_ospf(vty, argv, argc, 0, &instance);
275 if (ospf == NULL) {
276 if (instance)
b5a8894d 277 return CMD_NOT_MY_INSTANCE;
43b8d1d8
CS
278 else
279 return CMD_WARNING;
b5a8894d 280 }
d62a17ae 281 ospf_finish(ospf);
718e3744 282
d62a17ae 283 return CMD_SUCCESS;
718e3744 284}
285
7c8ff89e 286
43b8d1d8 287DEFPY (ospf_router_id,
718e3744 288 ospf_router_id_cmd,
289 "ospf router-id A.B.C.D",
290 "OSPF specific commands\n"
291 "router-id for the OSPF process\n"
292 "OSPF router-id in IP address format\n")
293{
a3d826f0 294 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
43b8d1d8 295
d62a17ae 296 struct listnode *node;
297 struct ospf_area *area;
d62a17ae 298
299 ospf->router_id_static = router_id;
300
301 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
302 if (area->full_nbrs) {
303 vty_out(vty,
304 "For this router-id change to take effect,"
305 " save config and restart ospfd\n");
306 return CMD_SUCCESS;
307 }
308
309 ospf_router_id_update(ospf);
310
311 return CMD_SUCCESS;
718e3744 312}
313
7a7be519 314DEFUN_HIDDEN (ospf_router_id_old,
747e489c
DW
315 ospf_router_id_old_cmd,
316 "router-id A.B.C.D",
317 "router-id for the OSPF process\n"
318 "OSPF router-id in IP address format\n")
7a7be519 319{
a3d826f0 320 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 321 int idx_ipv4 = 1;
322 struct listnode *node;
323 struct ospf_area *area;
324 struct in_addr router_id;
325 int ret;
326
327 ret = inet_aton(argv[idx_ipv4]->arg, &router_id);
328 if (!ret) {
329 vty_out(vty, "Please specify Router ID by A.B.C.D\n");
330 return CMD_WARNING_CONFIG_FAILED;
331 }
7a7be519 332
d62a17ae 333 ospf->router_id_static = router_id;
334
335 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
336 if (area->full_nbrs) {
337 vty_out(vty,
338 "For this router-id change to take effect,"
339 " save config and restart ospfd\n");
340 return CMD_SUCCESS;
341 }
342
343 ospf_router_id_update(ospf);
344
345 return CMD_SUCCESS;
7a7be519 346}
747e489c 347
43b8d1d8 348DEFPY (no_ospf_router_id,
718e3744 349 no_ospf_router_id_cmd,
7a7be519 350 "no ospf router-id [A.B.C.D]",
718e3744 351 NO_STR
352 "OSPF specific commands\n"
7a7be519 353 "router-id for the OSPF process\n"
354 "OSPF router-id in IP address format\n")
718e3744 355{
a3d826f0 356 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 357 struct listnode *node;
358 struct ospf_area *area;
68980084 359
43b8d1d8
CS
360 if (router_id_str) {
361 if (!IPV4_ADDR_SAME(&ospf->router_id_static, &router_id)) {
362 vty_out(vty, "%% OSPF router-id doesn't match\n");
363 return CMD_WARNING_CONFIG_FAILED;
364 }
365 }
366
d62a17ae 367 ospf->router_id_static.s_addr = 0;
718e3744 368
d62a17ae 369 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
370 if (area->full_nbrs) {
371 vty_out(vty,
372 "For this router-id change to take effect,"
373 " save config and restart ospfd\n");
374 return CMD_SUCCESS;
375 }
2c19a6ec 376
d62a17ae 377 ospf_router_id_update(ospf);
718e3744 378
d62a17ae 379 return CMD_SUCCESS;
718e3744 380}
381
718e3744 382
d7c0a89a 383static void ospf_passive_interface_default(struct ospf *ospf, uint8_t newval)
d62a17ae 384{
f4e14fdb 385 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
d62a17ae 386 struct listnode *ln;
387 struct interface *ifp;
388 struct ospf_interface *oi;
389
390 ospf->passive_interface_default = newval;
391
451fda4f 392 FOR_ALL_INTERFACES (vrf, ifp) {
9d303b37
DL
393 if (ifp && OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp),
394 passive_interface))
d62a17ae 395 UNSET_IF_PARAM(IF_DEF_PARAMS(ifp), passive_interface);
396 }
397 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, ln, oi)) {
398 if (OSPF_IF_PARAM_CONFIGURED(oi->params, passive_interface))
399 UNSET_IF_PARAM(oi->params, passive_interface);
400 /* update multicast memberships */
401 ospf_if_set_multicast(oi);
402 }
403}
404
405static void ospf_passive_interface_update_addr(struct ospf *ospf,
406 struct interface *ifp,
407 struct ospf_if_params *params,
d7c0a89a 408 uint8_t value,
d62a17ae 409 struct in_addr addr)
410{
d7c0a89a 411 uint8_t dflt;
d62a17ae 412
413 params->passive_interface = value;
414 if (params != IF_DEF_PARAMS(ifp)) {
415 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp),
416 passive_interface))
417 dflt = IF_DEF_PARAMS(ifp)->passive_interface;
418 else
419 dflt = ospf->passive_interface_default;
420
421 if (value != dflt)
422 SET_IF_PARAM(params, passive_interface);
423 else
424 UNSET_IF_PARAM(params, passive_interface);
425
426 ospf_free_if_params(ifp, addr);
427 ospf_if_update_params(ifp, addr);
428 }
429}
430
431static void ospf_passive_interface_update(struct ospf *ospf,
432 struct interface *ifp,
433 struct ospf_if_params *params,
d7c0a89a 434 uint8_t value)
d62a17ae 435{
436 params->passive_interface = value;
437 if (params == IF_DEF_PARAMS(ifp)) {
438 if (value != ospf->passive_interface_default)
439 SET_IF_PARAM(params, passive_interface);
440 else
441 UNSET_IF_PARAM(params, passive_interface);
442 }
7ffa8fa2
PJ
443}
444
a2c62831 445DEFUN (ospf_passive_interface,
446 ospf_passive_interface_addr_cmd,
7a7be519 447 "passive-interface <IFNAME [A.B.C.D]|default>",
718e3744 448 "Suppress routing updates on an interface\n"
7a7be519 449 "Interface's name\n"
3a2d747c 450 "IPv4 address\n"
7a7be519 451 "Suppress routing updates on interfaces by default\n")
718e3744 452{
a3d826f0 453 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 454 int idx_ipv4 = 2;
e99734f1 455 struct interface *ifp = NULL;
d62a17ae 456 struct in_addr addr = {.s_addr = INADDR_ANY};
457 int ret;
458 struct ospf_if_params *params;
459 struct route_node *rn;
460
461 if (strmatch(argv[1]->text, "default")) {
462 ospf_passive_interface_default(ospf, OSPF_IF_PASSIVE);
463 return CMD_SUCCESS;
464 }
e99734f1 465 if (ospf->vrf_id != VRF_UNKNOWN)
a36898e7 466 ifp = if_get_by_name(argv[1]->arg, ospf->vrf_id);
d62a17ae 467
b5a8894d 468 if (ifp == NULL) {
996c9314 469 vty_out(vty, "interface %s not found.\n", (char *)argv[1]->arg);
e99734f1 470 return CMD_WARNING_CONFIG_FAILED;
b5a8894d 471 }
d62a17ae 472
473 params = IF_DEF_PARAMS(ifp);
474
475 if (argc == 3) {
476 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
477 if (!ret) {
478 vty_out(vty,
479 "Please specify interface address by A.B.C.D\n");
480 return CMD_WARNING_CONFIG_FAILED;
481 }
482
483 params = ospf_get_if_params(ifp, addr);
484 ospf_if_update_params(ifp, addr);
485 ospf_passive_interface_update_addr(ospf, ifp, params,
486 OSPF_IF_PASSIVE, addr);
487 }
488
489 ospf_passive_interface_update(ospf, ifp, params, OSPF_IF_PASSIVE);
490
491 /* XXX We should call ospf_if_set_multicast on exactly those
492 * interfaces for which the passive property changed. It is too much
493 * work to determine this set, so we do this for every interface.
494 * This is safe and reasonable because ospf_if_set_multicast uses a
495 * record of joined groups to avoid systems calls if the desired
496 * memberships match the current memership.
497 */
498
499 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
500 struct ospf_interface *oi = rn->info;
501
9d303b37
DL
502 if (oi && (OSPF_IF_PARAM(oi, passive_interface)
503 == OSPF_IF_PASSIVE))
d62a17ae 504 ospf_if_set_multicast(oi);
505 }
506 /*
507 * XXX It is not clear what state transitions the interface needs to
508 * undergo when going from active to passive. Fixing this will
509 * require precise identification of interfaces having such a
510 * transition.
511 */
512
513 return CMD_SUCCESS;
718e3744 514}
515
a2c62831 516DEFUN (no_ospf_passive_interface,
517 no_ospf_passive_interface_addr_cmd,
7a7be519 518 "no passive-interface <IFNAME [A.B.C.D]|default>",
718e3744 519 NO_STR
520 "Allow routing updates on an interface\n"
7a7be519 521 "Interface's name\n"
3a2d747c 522 "IPv4 address\n"
7a7be519 523 "Allow routing updates on interfaces by default\n")
718e3744 524{
a3d826f0 525 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 526 int idx_ipv4 = 3;
e99734f1 527 struct interface *ifp = NULL;
d62a17ae 528 struct in_addr addr = {.s_addr = INADDR_ANY};
529 struct ospf_if_params *params;
530 int ret;
531 struct route_node *rn;
532
533 if (strmatch(argv[2]->text, "default")) {
534 ospf_passive_interface_default(ospf, OSPF_IF_ACTIVE);
535 return CMD_SUCCESS;
43540886
AS
536 }
537
e99734f1 538 if (ospf->vrf_id != VRF_UNKNOWN)
a36898e7 539 ifp = if_get_by_name(argv[2]->arg, ospf->vrf_id);
e99734f1 540
b5a8894d 541 if (ifp == NULL) {
996c9314 542 vty_out(vty, "interface %s not found.\n", (char *)argv[2]->arg);
e99734f1 543 return CMD_WARNING_CONFIG_FAILED;
b5a8894d 544 }
ba6454ec 545
d62a17ae 546 params = IF_DEF_PARAMS(ifp);
547
548 if (argc == 4) {
549 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
550 if (!ret) {
551 vty_out(vty,
552 "Please specify interface address by A.B.C.D\n");
553 return CMD_WARNING_CONFIG_FAILED;
554 }
555
556 params = ospf_lookup_if_params(ifp, addr);
557 if (params == NULL)
558 return CMD_SUCCESS;
559 ospf_passive_interface_update_addr(ospf, ifp, params,
560 OSPF_IF_ACTIVE, addr);
561 }
562 ospf_passive_interface_update(ospf, ifp, params, OSPF_IF_ACTIVE);
563
564 /* XXX We should call ospf_if_set_multicast on exactly those
565 * interfaces for which the passive property changed. It is too much
566 * work to determine this set, so we do this for every interface.
567 * This is safe and reasonable because ospf_if_set_multicast uses a
568 * record of joined groups to avoid systems calls if the desired
569 * memberships match the current memership.
570 */
571 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
572 struct ospf_interface *oi = rn->info;
573
574 if (oi
575 && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
576 ospf_if_set_multicast(oi);
577 }
578
579 return CMD_SUCCESS;
718e3744 580}
581
718e3744 582
a2c62831 583DEFUN (ospf_network_area,
584 ospf_network_area_cmd,
6147e2c6 585 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
718e3744 586 "Enable routing on an IP network\n"
587 "OSPF network prefix\n"
588 "Set the OSPF area ID\n"
589 "OSPF area ID in IP address format\n"
590 "OSPF area ID as a decimal value\n")
591{
a3d826f0 592 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 593 int idx_ipv4_prefixlen = 1;
594 int idx_ipv4_number = 3;
595 struct prefix_ipv4 p;
596 struct in_addr area_id;
597 int ret, format;
598
599 if (ospf->instance) {
600 vty_out(vty,
601 "The network command is not supported in multi-instance ospf\n");
602 return CMD_WARNING_CONFIG_FAILED;
603 }
718e3744 604
d62a17ae 605 if (ospf->if_ospf_cli_count > 0) {
606 vty_out(vty,
607 "Please remove all ip ospf area x.x.x.x commands first.\n");
aed7cc62 608 if (IS_DEBUG_OSPF_EVENT)
996c9314
LB
609 zlog_debug(
610 "%s ospf vrf %s num of %u ip osp area x config",
611 __PRETTY_FUNCTION__,
612 ospf->name ? ospf->name : "NIL",
613 ospf->if_ospf_cli_count);
d62a17ae 614 return CMD_WARNING_CONFIG_FAILED;
615 }
616
617 /* Get network prefix and Area ID. */
618 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
619 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
620
621 ret = ospf_network_set(ospf, &p, area_id, format);
622 if (ret == 0) {
623 vty_out(vty, "There is already same network statement.\n");
2b0a905a 624 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 625 }
626
627 return CMD_SUCCESS;
718e3744 628}
629
a2c62831 630DEFUN (no_ospf_network_area,
631 no_ospf_network_area_cmd,
6147e2c6 632 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
718e3744 633 NO_STR
634 "Enable routing on an IP network\n"
635 "OSPF network prefix\n"
636 "Set the OSPF area ID\n"
637 "OSPF area ID in IP address format\n"
638 "OSPF area ID as a decimal value\n")
639{
a3d826f0 640 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 641 int idx_ipv4_prefixlen = 2;
642 int idx_ipv4_number = 4;
643 struct prefix_ipv4 p;
644 struct in_addr area_id;
645 int ret, format;
646
647 if (ospf->instance) {
648 vty_out(vty,
649 "The network command is not supported in multi-instance ospf\n");
650 return CMD_WARNING_CONFIG_FAILED;
651 }
718e3744 652
d62a17ae 653 /* Get network prefix and Area ID. */
654 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
655 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
656
657 ret = ospf_network_unset(ospf, &p, area_id);
658 if (ret == 0) {
659 vty_out(vty,
660 "Can't find specified network area configuration.\n");
661 return CMD_WARNING_CONFIG_FAILED;
662 }
663
664 return CMD_SUCCESS;
718e3744 665}
666
a2c62831 667DEFUN (ospf_area_range,
668 ospf_area_range_cmd,
7a7be519 669 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
718e3744 670 "OSPF area parameters\n"
671 "OSPF area ID in IP address format\n"
672 "OSPF area ID as a decimal value\n"
673 "Summarize routes matching address/mask (border routers only)\n"
7a7be519 674 "Area range prefix\n"
675 "Advertise this range (default)\n"
676 "User specified metric for this range\n"
677 "Advertised metric for this range\n")
718e3744 678{
a3d826f0 679 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 680 int idx_ipv4_number = 1;
681 int idx_ipv4_prefixlen = 3;
682 int idx_cost = 6;
683 struct prefix_ipv4 p;
684 struct in_addr area_id;
685 int format;
d7c0a89a 686 uint32_t cost;
d62a17ae 687
688 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
689 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
690
691 ospf_area_range_set(ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
692 if (argc > 5) {
693 cost = strtoul(argv[idx_cost]->arg, NULL, 10);
694 ospf_area_range_cost_set(ospf, area_id, &p, cost);
695 }
718e3744 696
d62a17ae 697 return CMD_SUCCESS;
718e3744 698}
699
7a7be519 700DEFUN (ospf_area_range_cost,
701 ospf_area_range_cost_cmd,
702 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M cost (0-16777215)",
703 "OSPF area parameters\n"
704 "OSPF area ID in IP address format\n"
705 "OSPF area ID as a decimal value\n"
706 "Summarize routes matching address/mask (border routers only)\n"
707 "Area range prefix\n"
708 "User specified metric for this range\n"
709 "Advertised metric for this range\n")
710{
a3d826f0 711 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 712 int idx_ipv4_number = 1;
713 int idx_ipv4_prefixlen = 3;
714 int idx_cost = 5;
715 struct prefix_ipv4 p;
716 struct in_addr area_id;
717 int format;
d7c0a89a 718 uint32_t cost;
7a7be519 719
d62a17ae 720 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
721 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
7a7be519 722
d62a17ae 723 ospf_area_range_set(ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
724 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
725 format);
718e3744 726
d62a17ae 727 cost = strtoul(argv[idx_cost]->arg, NULL, 10);
728 ospf_area_range_cost_set(ospf, area_id, &p, cost);
718e3744 729
d62a17ae 730 return CMD_SUCCESS;
7a7be519 731}
718e3744 732
a2c62831 733DEFUN (ospf_area_range_not_advertise,
734 ospf_area_range_not_advertise_cmd,
6147e2c6 735 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
718e3744 736 "OSPF area parameters\n"
737 "OSPF area ID in IP address format\n"
738 "OSPF area ID as a decimal value\n"
739 "Summarize routes matching address/mask (border routers only)\n"
740 "Area range prefix\n"
741 "DoNotAdvertise this range\n")
742{
a3d826f0 743 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 744 int idx_ipv4_number = 1;
745 int idx_ipv4_prefixlen = 3;
746 struct prefix_ipv4 p;
747 struct in_addr area_id;
748 int format;
718e3744 749
d62a17ae 750 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
751 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
718e3744 752
d62a17ae 753 ospf_area_range_set(ospf, area_id, &p, 0);
754 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
755 format);
990baca0 756 ospf_area_range_substitute_unset(ospf, area_id, &p);
718e3744 757
d62a17ae 758 return CMD_SUCCESS;
718e3744 759}
760
a2c62831 761DEFUN (no_ospf_area_range,
762 no_ospf_area_range_cmd,
3a2d747c 763 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
718e3744 764 NO_STR
765 "OSPF area parameters\n"
766 "OSPF area ID in IP address format\n"
767 "OSPF area ID as a decimal value\n"
768 "Summarize routes matching address/mask (border routers only)\n"
7a7be519 769 "Area range prefix\n"
3a2d747c
QY
770 "User specified metric for this range\n"
771 "Advertised metric for this range\n"
7a7be519 772 "Advertise this range (default)\n"
3a2d747c
QY
773 "User specified metric for this range\n"
774 "Advertised metric for this range\n"
7a7be519 775 "DoNotAdvertise this range\n")
718e3744 776{
a3d826f0 777 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 778 int idx_ipv4_number = 2;
779 int idx_ipv4_prefixlen = 4;
780 struct prefix_ipv4 p;
781 struct in_addr area_id;
782 int format;
718e3744 783
d62a17ae 784 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
785 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
718e3744 786
d62a17ae 787 ospf_area_range_unset(ospf, area_id, &p);
718e3744 788
d62a17ae 789 return CMD_SUCCESS;
718e3744 790}
791
a2c62831 792DEFUN (ospf_area_range_substitute,
793 ospf_area_range_substitute_cmd,
6147e2c6 794 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
718e3744 795 "OSPF area parameters\n"
796 "OSPF area ID in IP address format\n"
797 "OSPF area ID as a decimal value\n"
798 "Summarize routes matching address/mask (border routers only)\n"
799 "Area range prefix\n"
800 "Announce area range as another prefix\n"
801 "Network prefix to be announced instead of range\n")
802{
a3d826f0 803 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 804 int idx_ipv4_number = 1;
805 int idx_ipv4_prefixlen = 3;
806 int idx_ipv4_prefixlen_2 = 5;
807 struct prefix_ipv4 p, s;
808 struct in_addr area_id;
809 int format;
718e3744 810
d62a17ae 811 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
812 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
813 str2prefix_ipv4(argv[idx_ipv4_prefixlen_2]->arg, &s);
718e3744 814
d62a17ae 815 ospf_area_range_substitute_set(ospf, area_id, &p, &s);
816 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
817 format);
718e3744 818
d62a17ae 819 return CMD_SUCCESS;
718e3744 820}
821
a2c62831 822DEFUN (no_ospf_area_range_substitute,
823 no_ospf_area_range_substitute_cmd,
6147e2c6 824 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
718e3744 825 NO_STR
826 "OSPF area parameters\n"
827 "OSPF area ID in IP address format\n"
828 "OSPF area ID as a decimal value\n"
829 "Summarize routes matching address/mask (border routers only)\n"
830 "Area range prefix\n"
831 "Announce area range as another prefix\n"
832 "Network prefix to be announced instead of range\n")
833{
a3d826f0 834 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 835 int idx_ipv4_number = 2;
836 int idx_ipv4_prefixlen = 4;
837 int idx_ipv4_prefixlen_2 = 6;
838 struct prefix_ipv4 p, s;
839 struct in_addr area_id;
840 int format;
718e3744 841
d62a17ae 842 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
843 str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
844 str2prefix_ipv4(argv[idx_ipv4_prefixlen_2]->arg, &s);
718e3744 845
d62a17ae 846 ospf_area_range_substitute_unset(ospf, area_id, &p);
718e3744 847
d62a17ae 848 return CMD_SUCCESS;
718e3744 849}
850
6b0655a2 851
718e3744 852/* Command Handler Logic in VLink stuff is delicate!!
853
854 ALTER AT YOUR OWN RISK!!!!
855
856 Various dummy values are used to represent 'NoChange' state for
857 VLink configuration NOT being changed by a VLink command, and
858 special syntax is used within the command strings so that the
859 typed in command verbs can be seen in the configuration command
860 bacckend handler. This is to drastically reduce the verbeage
861 required to coe up with a reasonably compatible Cisco VLink command
862
d62a17ae 863 - Matthew Grant <grantma@anathoth.gen.nz>
718e3744 864 Wed, 21 Feb 2001 15:13:52 +1300
865 */
866
d62a17ae 867/* Configuration data for virtual links
868 */
718e3744 869struct ospf_vl_config_data {
d62a17ae 870 struct vty *vty; /* vty stuff */
871 struct in_addr area_id; /* area ID from command line */
872 int area_id_fmt; /* command line area ID format */
873 struct in_addr vl_peer; /* command line vl_peer */
874 int auth_type; /* Authehntication type, if given */
875 char *auth_key; /* simple password if present */
876 int crypto_key_id; /* Cryptographic key ID */
877 char *md5_key; /* MD5 authentication key */
878 int hello_interval; /* Obvious what these are... */
879 int retransmit_interval;
880 int transmit_delay;
881 int dead_interval;
718e3744 882};
883
d62a17ae 884static void ospf_vl_config_data_init(struct ospf_vl_config_data *vl_config,
885 struct vty *vty)
718e3744 886{
d62a17ae 887 memset(vl_config, 0, sizeof(struct ospf_vl_config_data));
888 vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
889 vl_config->vty = vty;
718e3744 890}
891
4dadc291 892static struct ospf_vl_data *
d62a17ae 893ospf_find_vl_data(struct ospf *ospf, struct ospf_vl_config_data *vl_config)
894{
895 struct ospf_area *area;
896 struct ospf_vl_data *vl_data;
897 struct vty *vty;
898 struct in_addr area_id;
899
900 vty = vl_config->vty;
901 area_id = vl_config->area_id;
902
903 if (area_id.s_addr == OSPF_AREA_BACKBONE) {
904 vty_out(vty,
905 "Configuring VLs over the backbone is not allowed\n");
906 return NULL;
907 }
908 area = ospf_area_get(ospf, area_id);
909 ospf_area_display_format_set(ospf, area, vl_config->area_id_fmt);
910
911 if (area->external_routing != OSPF_AREA_DEFAULT) {
912 if (vl_config->area_id_fmt == OSPF_AREA_ID_FMT_DOTTEDQUAD)
913 vty_out(vty, "Area %s is %s\n", inet_ntoa(area_id),
914 area->external_routing == OSPF_AREA_NSSA
915 ? "nssa"
916 : "stub");
917 else
918 vty_out(vty, "Area %ld is %s\n",
d7c0a89a 919 (unsigned long)ntohl(area_id.s_addr),
d62a17ae 920 area->external_routing == OSPF_AREA_NSSA
921 ? "nssa"
922 : "stub");
923 return NULL;
924 }
925
926 if ((vl_data = ospf_vl_lookup(ospf, area, vl_config->vl_peer))
927 == NULL) {
928 vl_data = ospf_vl_data_new(area, vl_config->vl_peer);
929 if (vl_data->vl_oi == NULL) {
930 vl_data->vl_oi = ospf_vl_new(ospf, vl_data);
931 ospf_vl_add(ospf, vl_data);
932 ospf_spf_calculate_schedule(ospf,
933 SPF_FLAG_CONFIG_CHANGE);
934 }
718e3744 935 }
d62a17ae 936 return vl_data;
718e3744 937}
938
939
d62a17ae 940static int ospf_vl_set_security(struct ospf_vl_data *vl_data,
941 struct ospf_vl_config_data *vl_config)
942{
943 struct crypt_key *ck;
944 struct vty *vty;
945 struct interface *ifp = vl_data->vl_oi->ifp;
946
947 vty = vl_config->vty;
948
949 if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN) {
950 SET_IF_PARAM(IF_DEF_PARAMS(ifp), auth_type);
951 IF_DEF_PARAMS(ifp)->auth_type = vl_config->auth_type;
718e3744 952 }
718e3744 953
d62a17ae 954 if (vl_config->auth_key) {
955 memset(IF_DEF_PARAMS(ifp)->auth_simple, 0,
956 OSPF_AUTH_SIMPLE_SIZE + 1);
4d65d927
QY
957 strlcpy((char *)IF_DEF_PARAMS(ifp)->auth_simple,
958 vl_config->auth_key,
959 sizeof(IF_DEF_PARAMS(ifp)->auth_simple));
d62a17ae 960 } else if (vl_config->md5_key) {
961 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp)->auth_crypt,
962 vl_config->crypto_key_id)
963 != NULL) {
964 vty_out(vty, "OSPF: Key %d already exists\n",
965 vl_config->crypto_key_id);
851fcbae 966 return CMD_WARNING;
d62a17ae 967 }
968 ck = ospf_crypt_key_new();
969 ck->key_id = vl_config->crypto_key_id;
970 memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE + 1);
4d65d927
QY
971 strlcpy((char *)ck->auth_key, vl_config->md5_key,
972 sizeof(ck->auth_key));
d62a17ae 973
974 ospf_crypt_key_add(IF_DEF_PARAMS(ifp)->auth_crypt, ck);
975 } else if (vl_config->crypto_key_id != 0) {
976 /* Delete a key */
977
978 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp)->auth_crypt,
979 vl_config->crypto_key_id)
980 == NULL) {
981 vty_out(vty, "OSPF: Key %d does not exist\n",
982 vl_config->crypto_key_id);
983 return CMD_WARNING_CONFIG_FAILED;
984 }
985
986 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp)->auth_crypt,
987 vl_config->crypto_key_id);
988 }
989
990 return CMD_SUCCESS;
718e3744 991}
992
d62a17ae 993static int ospf_vl_set_timers(struct ospf_vl_data *vl_data,
994 struct ospf_vl_config_data *vl_config)
995{
996 struct interface *ifp = vl_data->vl_oi->ifp;
997 /* Virtual Link data initialised to defaults, so only set
998 if a value given */
999 if (vl_config->hello_interval) {
1000 SET_IF_PARAM(IF_DEF_PARAMS(ifp), v_hello);
1001 IF_DEF_PARAMS(ifp)->v_hello = vl_config->hello_interval;
1002 }
1003
1004 if (vl_config->dead_interval) {
1005 SET_IF_PARAM(IF_DEF_PARAMS(ifp), v_wait);
1006 IF_DEF_PARAMS(ifp)->v_wait = vl_config->dead_interval;
1007 }
1008
1009 if (vl_config->retransmit_interval) {
1010 SET_IF_PARAM(IF_DEF_PARAMS(ifp), retransmit_interval);
1011 IF_DEF_PARAMS(ifp)->retransmit_interval =
1012 vl_config->retransmit_interval;
1013 }
1014
1015 if (vl_config->transmit_delay) {
1016 SET_IF_PARAM(IF_DEF_PARAMS(ifp), transmit_delay);
1017 IF_DEF_PARAMS(ifp)->transmit_delay = vl_config->transmit_delay;
1018 }
1019
1020 return CMD_SUCCESS;
718e3744 1021}
1022
1023
718e3744 1024/* The business end of all of the above */
d62a17ae 1025static int ospf_vl_set(struct ospf *ospf, struct ospf_vl_config_data *vl_config)
1026{
1027 struct ospf_vl_data *vl_data;
1028 int ret;
718e3744 1029
d62a17ae 1030 vl_data = ospf_find_vl_data(ospf, vl_config);
1031 if (!vl_data)
1032 return CMD_WARNING_CONFIG_FAILED;
1033
1034 /* Process this one first as it can have a fatal result, which can
1035 only logically occur if the virtual link exists already
1036 Thus a command error does not result in a change to the
1037 running configuration such as unexpectedly altered timer
1038 values etc.*/
1039 ret = ospf_vl_set_security(vl_data, vl_config);
1040 if (ret != CMD_SUCCESS)
1041 return ret;
1042
1043 /* Set any time based parameters, these area already range checked */
1044
1045 ret = ospf_vl_set_timers(vl_data, vl_config);
1046 if (ret != CMD_SUCCESS)
1047 return ret;
718e3744 1048
d62a17ae 1049 return CMD_SUCCESS;
718e3744 1050}
1051
1052/* This stuff exists to make specifying all the alias commands A LOT simpler
1053 */
d62a17ae 1054#define VLINK_HELPSTR_IPADDR \
1055 "OSPF area parameters\n" \
1056 "OSPF area ID in IP address format\n" \
1057 "OSPF area ID as a decimal value\n" \
1058 "Configure a virtual link\n" \
1059 "Router ID of the remote ABR\n"
1060
1061#define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1062 "Enable authentication on this virtual link\n" \
1063 "dummy string \n"
1064
1065#define VLINK_HELPSTR_AUTHTYPE_ALL \
1066 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1067 "Use null authentication\n" \
1068 "Use message-digest authentication\n"
1069
1070#define VLINK_HELPSTR_TIME_PARAM \
1071 "Time between HELLO packets\n" \
1072 "Seconds\n" \
1073 "Time between retransmitting lost link state advertisements\n" \
1074 "Seconds\n" \
1075 "Link state transmit delay\n" \
1076 "Seconds\n" \
1077 "Interval time after which a neighbor is declared down\n" \
1078 "Seconds\n"
1079
1080#define VLINK_HELPSTR_AUTH_SIMPLE \
1081 "Authentication password (key)\n" \
baf9eaad 1082 "The OSPF password (key)\n"
d62a17ae 1083
1084#define VLINK_HELPSTR_AUTH_MD5 \
1085 "Message digest authentication password (key)\n" \
d62a17ae 1086 "Key ID\n" \
1087 "Use MD5 algorithm\n" \
baf9eaad 1088 "The OSPF password (key)\n"
718e3744 1089
a2c62831 1090DEFUN (ospf_area_vlink,
1091 ospf_area_vlink_cmd,
3d1c6dc2 1092 "area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D [authentication [<message-digest|null>]] [<message-digest-key (1-255) md5 KEY|authentication-key AUTH_KEY>]",
7a7be519 1093 VLINK_HELPSTR_IPADDR
3d1c6dc2 1094 "Enable authentication on this virtual link\n"
7a7be519 1095 "Use message-digest authentication\n"
3d1c6dc2 1096 "Use null authentication\n"
baf9eaad
CS
1097 VLINK_HELPSTR_AUTH_MD5
1098 VLINK_HELPSTR_AUTH_SIMPLE)
718e3744 1099{
a3d826f0 1100 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1101 int idx_ipv4_number = 1;
1102 int idx_ipv4 = 3;
1103 struct ospf_vl_config_data vl_config;
1104 char auth_key[OSPF_AUTH_SIMPLE_SIZE + 1];
1105 char md5_key[OSPF_AUTH_MD5_SIZE + 1];
d62a17ae 1106 int ret;
55d1da24 1107 int idx = 0;
d62a17ae 1108
1109 ospf_vl_config_data_init(&vl_config, vty);
1110
1111 /* Read off first 2 parameters and check them */
1112 ret = str2area_id(argv[idx_ipv4_number]->arg, &vl_config.area_id,
1113 &vl_config.area_id_fmt);
1114 if (ret < 0) {
1115 vty_out(vty, "OSPF area ID is invalid\n");
1116 return CMD_WARNING_CONFIG_FAILED;
1117 }
718e3744 1118
d62a17ae 1119 ret = inet_aton(argv[idx_ipv4]->arg, &vl_config.vl_peer);
1120 if (!ret) {
1121 vty_out(vty, "Please specify valid Router ID as a.b.c.d\n");
1122 return CMD_WARNING_CONFIG_FAILED;
7a7be519 1123 }
7a7be519 1124
d62a17ae 1125 if (argc <= 4) {
1126 /* Thats all folks! - BUGS B. strikes again!!!*/
7a7be519 1127
d62a17ae 1128 return ospf_vl_set(ospf, &vl_config);
1129 }
1130
3d1c6dc2
CS
1131 if (argv_find(argv, argc, "authentication", &idx)) {
1132 /* authentication - this option can only occur
1133 at start of command line */
1134 vl_config.auth_type = OSPF_AUTH_SIMPLE;
1135 }
1136
3d1c6dc2 1137 if (argv_find(argv, argc, "message-digest", &idx)) {
baf9eaad 1138 /* authentication message-digest */
3d1c6dc2
CS
1139 vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1140 } else if (argv_find(argv, argc, "null", &idx)) {
1141 /* "authentication null" */
1142 vl_config.auth_type = OSPF_AUTH_NULL;
d62a17ae 1143 }
7a7be519 1144
3d1c6dc2 1145 if (argv_find(argv, argc, "message-digest-key", &idx)) {
3d1c6dc2 1146 vl_config.md5_key = NULL;
cbb9b53d 1147 vl_config.crypto_key_id = strtol(argv[idx + 1]->arg, NULL, 10);
3d1c6dc2
CS
1148 if (vl_config.crypto_key_id < 0)
1149 return CMD_WARNING_CONFIG_FAILED;
1150
4d65d927 1151 strlcpy(md5_key, argv[idx + 3]->arg, sizeof(md5_key));
3d1c6dc2
CS
1152 vl_config.md5_key = md5_key;
1153 }
1154
3d1c6dc2 1155 if (argv_find(argv, argc, "authentication-key", &idx)) {
4d65d927 1156 strlcpy(auth_key, argv[idx + 1]->arg, sizeof(auth_key));
3d1c6dc2
CS
1157 vl_config.auth_key = auth_key;
1158 }
7a7be519 1159
d62a17ae 1160 /* Action configuration */
1161
1162 return ospf_vl_set(ospf, &vl_config);
7a7be519 1163}
1164
a2c62831 1165DEFUN (no_ospf_area_vlink,
1166 no_ospf_area_vlink_cmd,
3d1c6dc2 1167 "no area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D [authentication [<message-digest|null>]] [<message-digest-key (1-255) md5 KEY|authentication-key AUTH_KEY>]",
718e3744 1168 NO_STR
7a7be519 1169 VLINK_HELPSTR_IPADDR
1170 "Enable authentication on this virtual link\n" \
3d1c6dc2 1171 "Use message-digest authentication\n" \
7a7be519 1172 "Use null authentication\n" \
baf9eaad
CS
1173 VLINK_HELPSTR_AUTH_MD5
1174 VLINK_HELPSTR_AUTH_SIMPLE)
718e3744 1175{
a3d826f0 1176 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1177 int idx_ipv4_number = 2;
1178 int idx_ipv4 = 4;
1179 struct ospf_area *area;
1180 struct ospf_vl_config_data vl_config;
1181 struct ospf_vl_data *vl_data = NULL;
1182 char auth_key[OSPF_AUTH_SIMPLE_SIZE + 1];
3d1c6dc2 1183 int idx = 0;
d62a17ae 1184 int ret, format;
1185
1186 ospf_vl_config_data_init(&vl_config, vty);
1187
1188 ret = str2area_id(argv[idx_ipv4_number]->arg, &vl_config.area_id,
1189 &format);
1190 if (ret < 0) {
1191 vty_out(vty, "OSPF area ID is invalid\n");
1192 return CMD_WARNING_CONFIG_FAILED;
1193 }
1194
1195 area = ospf_area_lookup_by_area_id(ospf, vl_config.area_id);
1196 if (!area) {
1197 vty_out(vty, "Area does not exist\n");
1198 return CMD_WARNING_CONFIG_FAILED;
1199 }
1200
1201 ret = inet_aton(argv[idx_ipv4]->arg, &vl_config.vl_peer);
1202 if (!ret) {
1203 vty_out(vty, "Please specify valid Router ID as a.b.c.d\n");
1204 return CMD_WARNING_CONFIG_FAILED;
1205 }
718e3744 1206
188823b0
EDP
1207 vl_data = ospf_vl_lookup(ospf, area, vl_config.vl_peer);
1208 if (!vl_data) {
1209 vty_out(vty, "Virtual link does not exist\n");
1210 return CMD_WARNING_CONFIG_FAILED;
1211 }
1212
d62a17ae 1213 if (argc <= 5) {
1214 /* Basic VLink no command */
1215 /* Thats all folks! - BUGS B. strikes again!!!*/
188823b0 1216 ospf_vl_delete(ospf, vl_data);
d62a17ae 1217 ospf_area_check_free(ospf, vl_config.area_id);
d62a17ae 1218 return CMD_SUCCESS;
1219 }
1220
1221 /* If we are down here, we are reseting parameters */
d62a17ae 1222 /* Deal with other parameters */
3d1c6dc2
CS
1223
1224 if (argv_find(argv, argc, "authentication", &idx)) {
1225 /* authentication - this option can only occur
1226 at start of command line */
1227 vl_config.auth_type = OSPF_AUTH_NOTSET;
1228 }
1229
3d1c6dc2 1230 if (argv_find(argv, argc, "message-digest-key", &idx)) {
3d1c6dc2 1231 vl_config.md5_key = NULL;
cbb9b53d 1232 vl_config.crypto_key_id = strtol(argv[idx + 1]->arg, NULL, 10);
3d1c6dc2
CS
1233 if (vl_config.crypto_key_id < 0)
1234 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 1235 }
1236
3d1c6dc2 1237 if (argv_find(argv, argc, "authentication-key", &idx)) {
cbb9b53d 1238 /* Reset authentication-key to 0 */
3d1c6dc2
CS
1239 memset(auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1240 vl_config.auth_key = auth_key;
1241 }
d62a17ae 1242
1243 /* Action configuration */
1244
1245 return ospf_vl_set(ospf, &vl_config);
7a7be519 1246}
1247
b1c02cec
QY
1248DEFUN (ospf_area_vlink_intervals,
1249 ospf_area_vlink_intervals_cmd,
1250 "area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D {hello-interval (1-65535)|retransmit-interval (1-65535)|transmit-delay (1-65535)|dead-interval (1-65535)}",
1251 VLINK_HELPSTR_IPADDR
1252 VLINK_HELPSTR_TIME_PARAM)
1253{
a3d826f0 1254 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1255 struct ospf_vl_config_data vl_config;
1256 int ret = 0;
1257
1258 ospf_vl_config_data_init(&vl_config, vty);
1259
1260 char *area_id = argv[1]->arg;
1261 char *router_id = argv[3]->arg;
1262
1263 ret = str2area_id(area_id, &vl_config.area_id, &vl_config.area_id_fmt);
1264 if (ret < 0) {
1265 vty_out(vty, "OSPF area ID is invalid\n");
1266 return CMD_WARNING_CONFIG_FAILED;
1267 }
1268
1269 ret = inet_aton(router_id, &vl_config.vl_peer);
1270 if (!ret) {
1271 vty_out(vty, "Please specify valid Router ID as a.b.c.d\n");
1272 return CMD_WARNING_CONFIG_FAILED;
1273 }
1274
1275 for (int idx = 4; idx < argc; idx++) {
1276 if (strmatch(argv[idx]->text, "hello-interval"))
1277 vl_config.hello_interval =
1278 strtol(argv[++idx]->arg, NULL, 10);
1279 else if (strmatch(argv[idx]->text, "retransmit-interval"))
1280 vl_config.retransmit_interval =
1281 strtol(argv[++idx]->arg, NULL, 10);
1282 else if (strmatch(argv[idx]->text, "transmit-delay"))
1283 vl_config.transmit_delay =
1284 strtol(argv[++idx]->arg, NULL, 10);
1285 else if (strmatch(argv[idx]->text, "dead-interval"))
1286 vl_config.dead_interval =
1287 strtol(argv[++idx]->arg, NULL, 10);
1288 }
1289
1290 /* Action configuration */
1291 return ospf_vl_set(ospf, &vl_config);
b1c02cec
QY
1292}
1293
7a7be519 1294DEFUN (no_ospf_area_vlink_intervals,
1295 no_ospf_area_vlink_intervals_cmd,
a663a38e 1296 "no area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D {hello-interval (1-65535)|retransmit-interval (1-65535)|transmit-delay (1-65535)|dead-interval (1-65535)}",
3a2d747c 1297 NO_STR
7a7be519 1298 VLINK_HELPSTR_IPADDR
7a7be519 1299 VLINK_HELPSTR_TIME_PARAM)
1300{
a3d826f0 1301 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1302 struct ospf_vl_config_data vl_config;
1303 int ret = 0;
1304
1305 ospf_vl_config_data_init(&vl_config, vty);
1306
1307 char *area_id = argv[2]->arg;
1308 char *router_id = argv[4]->arg;
1309
1310 ret = str2area_id(area_id, &vl_config.area_id, &vl_config.area_id_fmt);
1311 if (ret < 0) {
1312 vty_out(vty, "OSPF area ID is invalid\n");
1313 return CMD_WARNING_CONFIG_FAILED;
1314 }
1315
1316 ret = inet_aton(router_id, &vl_config.vl_peer);
1317 if (!ret) {
1318 vty_out(vty, "Please specify valid Router ID as a.b.c.d\n");
1319 return CMD_WARNING_CONFIG_FAILED;
1320 }
1321
1322 for (int idx = 5; idx < argc; idx++) {
1323 if (strmatch(argv[idx]->text, "hello-interval"))
1324 vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1325 else if (strmatch(argv[idx]->text, "retransmit-interval"))
1326 vl_config.retransmit_interval =
1327 OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1328 else if (strmatch(argv[idx]->text, "transmit-delay"))
1329 vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1330 else if (strmatch(argv[idx]->text, "dead-interval"))
1331 vl_config.dead_interval =
1332 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1333 }
1334
1335 /* Action configuration */
1336 return ospf_vl_set(ospf, &vl_config);
718e3744 1337}
1338
a2c62831 1339DEFUN (ospf_area_shortcut,
1340 ospf_area_shortcut_cmd,
6147e2c6 1341 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
718e3744 1342 "OSPF area parameters\n"
1343 "OSPF area ID in IP address format\n"
1344 "OSPF area ID as a decimal value\n"
1345 "Configure the area's shortcutting mode\n"
1346 "Set default shortcutting behavior\n"
1347 "Enable shortcutting through the area\n"
1348 "Disable shortcutting through the area\n")
1349{
a3d826f0 1350 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1351 int idx_ipv4_number = 1;
1352 int idx_enable_disable = 3;
1353 struct ospf_area *area;
1354 struct in_addr area_id;
1355 int mode;
1356 int format;
1357
1358 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id, format,
1359 argv[idx_ipv4_number]->arg);
1360
1361 area = ospf_area_get(ospf, area_id);
1362 ospf_area_display_format_set(ospf, area, format);
1363
1364 if (strncmp(argv[idx_enable_disable]->arg, "de", 2) == 0)
1365 mode = OSPF_SHORTCUT_DEFAULT;
1366 else if (strncmp(argv[idx_enable_disable]->arg, "di", 2) == 0)
1367 mode = OSPF_SHORTCUT_DISABLE;
1368 else if (strncmp(argv[idx_enable_disable]->arg, "e", 1) == 0)
1369 mode = OSPF_SHORTCUT_ENABLE;
1370 else
1371 return CMD_WARNING_CONFIG_FAILED;
718e3744 1372
d62a17ae 1373 ospf_area_shortcut_set(ospf, area, mode);
718e3744 1374
d62a17ae 1375 if (ospf->abr_type != OSPF_ABR_SHORTCUT)
1376 vty_out(vty,
1377 "Shortcut area setting will take effect "
1378 "only when the router is configured as Shortcut ABR\n");
718e3744 1379
d62a17ae 1380 return CMD_SUCCESS;
718e3744 1381}
1382
a2c62831 1383DEFUN (no_ospf_area_shortcut,
1384 no_ospf_area_shortcut_cmd,
6147e2c6 1385 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
718e3744 1386 NO_STR
1387 "OSPF area parameters\n"
1388 "OSPF area ID in IP address format\n"
1389 "OSPF area ID as a decimal value\n"
1390 "Deconfigure the area's shortcutting mode\n"
1391 "Deconfigure enabled shortcutting through the area\n"
1392 "Deconfigure disabled shortcutting through the area\n")
1393{
a3d826f0 1394 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1395 int idx_ipv4_number = 2;
1396 struct ospf_area *area;
1397 struct in_addr area_id;
1398 int format;
718e3744 1399
d62a17ae 1400 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id, format,
1401 argv[idx_ipv4_number]->arg);
718e3744 1402
d62a17ae 1403 area = ospf_area_lookup_by_area_id(ospf, area_id);
1404 if (!area)
1405 return CMD_SUCCESS;
718e3744 1406
d62a17ae 1407 ospf_area_shortcut_unset(ospf, area);
718e3744 1408
d62a17ae 1409 return CMD_SUCCESS;
718e3744 1410}
1411
6b0655a2 1412
a2c62831 1413DEFUN (ospf_area_stub,
1414 ospf_area_stub_cmd,
6147e2c6 1415 "area <A.B.C.D|(0-4294967295)> stub",
718e3744 1416 "OSPF area parameters\n"
1417 "OSPF area ID in IP address format\n"
1418 "OSPF area ID as a decimal value\n"
1419 "Configure OSPF area as stub\n")
1420{
a3d826f0 1421 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1422 int idx_ipv4_number = 1;
1423 struct in_addr area_id;
1424 int ret, format;
1425
1426 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id, format,
1427 argv[idx_ipv4_number]->arg);
1428
1429 ret = ospf_area_stub_set(ospf, area_id);
1430 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
1431 format);
1432 if (ret == 0) {
1433 vty_out(vty,
1434 "First deconfigure all virtual link through this area\n");
1435 return CMD_WARNING_CONFIG_FAILED;
1436 }
718e3744 1437
d62a17ae 1438 ospf_area_no_summary_unset(ospf, area_id);
718e3744 1439
d62a17ae 1440 return CMD_SUCCESS;
718e3744 1441}
1442
a2c62831 1443DEFUN (ospf_area_stub_no_summary,
1444 ospf_area_stub_no_summary_cmd,
6147e2c6 1445 "area <A.B.C.D|(0-4294967295)> stub no-summary",
718e3744 1446 "OSPF stub parameters\n"
1447 "OSPF area ID in IP address format\n"
1448 "OSPF area ID as a decimal value\n"
1449 "Configure OSPF area as stub\n"
1450 "Do not inject inter-area routes into stub\n")
1451{
a3d826f0 1452 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1453 int idx_ipv4_number = 1;
1454 struct in_addr area_id;
1455 int ret, format;
1456
1457 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id, format,
1458 argv[idx_ipv4_number]->arg);
1459
1460 ret = ospf_area_stub_set(ospf, area_id);
1461 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
1462 format);
1463 if (ret == 0) {
1464 vty_out(vty,
1465 "%% Area cannot be stub as it contains a virtual link\n");
1466 return CMD_WARNING_CONFIG_FAILED;
1467 }
718e3744 1468
d62a17ae 1469 ospf_area_no_summary_set(ospf, area_id);
718e3744 1470
d62a17ae 1471 return CMD_SUCCESS;
718e3744 1472}
1473
a2c62831 1474DEFUN (no_ospf_area_stub,
1475 no_ospf_area_stub_cmd,
6147e2c6 1476 "no area <A.B.C.D|(0-4294967295)> stub",
718e3744 1477 NO_STR
1478 "OSPF area parameters\n"
1479 "OSPF area ID in IP address format\n"
1480 "OSPF area ID as a decimal value\n"
1481 "Configure OSPF area as stub\n")
1482{
a3d826f0 1483 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1484 int idx_ipv4_number = 2;
1485 struct in_addr area_id;
1486 int format;
718e3744 1487
d62a17ae 1488 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id, format,
1489 argv[idx_ipv4_number]->arg);
718e3744 1490
d62a17ae 1491 ospf_area_stub_unset(ospf, area_id);
1492 ospf_area_no_summary_unset(ospf, area_id);
718e3744 1493
d62a17ae 1494 return CMD_SUCCESS;
718e3744 1495}
1496
a2c62831 1497DEFUN (no_ospf_area_stub_no_summary,
1498 no_ospf_area_stub_no_summary_cmd,
6147e2c6 1499 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
718e3744 1500 NO_STR
1501 "OSPF area parameters\n"
1502 "OSPF area ID in IP address format\n"
1503 "OSPF area ID as a decimal value\n"
1504 "Configure OSPF area as stub\n"
1505 "Do not inject inter-area routes into area\n")
1506{
a3d826f0 1507 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1508 int idx_ipv4_number = 2;
1509 struct in_addr area_id;
1510 int format;
718e3744 1511
d62a17ae 1512 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id, format,
1513 argv[idx_ipv4_number]->arg);
1514 ospf_area_no_summary_unset(ospf, area_id);
718e3744 1515
d62a17ae 1516 return CMD_SUCCESS;
718e3744 1517}
1518
d62a17ae 1519static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc,
7ef56a73
CS
1520 struct cmd_token **argv, int cfg_nosum,
1521 int nosum)
718e3744 1522{
a3d826f0 1523 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1524 struct in_addr area_id;
1525 int ret, format;
1526
1527 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format, argv[1]->arg);
1528
1529 ret = ospf_area_nssa_set(ospf, area_id);
1530 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
1531 format);
1532 if (ret == 0) {
1533 vty_out(vty,
1534 "%% Area cannot be nssa as it contains a virtual link\n");
1535 return CMD_WARNING_CONFIG_FAILED;
1536 }
1537
1538 if (argc > 3) {
1539 if (strncmp(argv[3]->text, "translate-c", 11) == 0)
1540 ospf_area_nssa_translator_role_set(
1541 ospf, area_id, OSPF_NSSA_ROLE_CANDIDATE);
1542 else if (strncmp(argv[3]->text, "translate-n", 11) == 0)
1543 ospf_area_nssa_translator_role_set(
1544 ospf, area_id, OSPF_NSSA_ROLE_NEVER);
1545 else if (strncmp(argv[3]->text, "translate-a", 11) == 0)
1546 ospf_area_nssa_translator_role_set(
1547 ospf, area_id, OSPF_NSSA_ROLE_ALWAYS);
1548 } else {
1549 ospf_area_nssa_translator_role_set(ospf, area_id,
1550 OSPF_NSSA_ROLE_CANDIDATE);
1551 }
1552
7ef56a73
CS
1553 if (cfg_nosum) {
1554 if (nosum)
1555 ospf_area_no_summary_set(ospf, area_id);
1556 else
1557 ospf_area_no_summary_unset(ospf, area_id);
1558 }
d62a17ae 1559
1560 ospf_schedule_abr_task(ospf);
1561
1562 return CMD_SUCCESS;
718e3744 1563}
1564
718e3744 1565
b0a053be 1566DEFUN (ospf_area_nssa_translate,
a2c62831 1567 ospf_area_nssa_translate_cmd,
6147e2c6 1568 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
718e3744 1569 "OSPF area parameters\n"
1570 "OSPF area ID in IP address format\n"
1571 "OSPF area ID as a decimal value\n"
1572 "Configure OSPF area as nssa\n"
1573 "Configure NSSA-ABR for translate election (default)\n"
1574 "Configure NSSA-ABR to never translate\n"
1575 "Configure NSSA-ABR to always translate\n")
b0a053be 1576{
7ef56a73 1577 return ospf_area_nssa_cmd_handler(vty, argc, argv, 0, 0);
b0a053be 1578}
1579
1580DEFUN (ospf_area_nssa,
1581 ospf_area_nssa_cmd,
6147e2c6 1582 "area <A.B.C.D|(0-4294967295)> nssa",
b0a053be 1583 "OSPF area parameters\n"
1584 "OSPF area ID in IP address format\n"
1585 "OSPF area ID as a decimal value\n"
1586 "Configure OSPF area as nssa\n")
1587{
2643b2bc 1588 return ospf_area_nssa_cmd_handler(vty, argc, argv, 0, 0);
b0a053be 1589}
718e3744 1590
a2c62831 1591DEFUN (ospf_area_nssa_no_summary,
1592 ospf_area_nssa_no_summary_cmd,
6147e2c6 1593 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
718e3744 1594 "OSPF area parameters\n"
1595 "OSPF area ID in IP address format\n"
1596 "OSPF area ID as a decimal value\n"
1597 "Configure OSPF area as nssa\n"
1598 "Do not inject inter-area routes into nssa\n")
1599{
7ef56a73
CS
1600 int idx_ipv4_number = 1;
1601 struct in_addr area_id;
1602 int format;
1603
1604 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
1605 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format,
1606 argv[idx_ipv4_number]->arg);
1607
1608 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
1609 format);
1610 ospf_area_nssa_no_summary_set(ospf, area_id);
1611
1612 ospf_schedule_abr_task(ospf);
1613
1614 return CMD_SUCCESS;
1615}
1616
1617DEFUN (no_ospf_area_nssa_no_summary,
1618 no_ospf_area_nssa_no_summary_cmd,
1619 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1620 NO_STR
1621 "OSPF area parameters\n"
1622 "OSPF area ID in IP address format\n"
1623 "OSPF area ID as a decimal value\n"
1624 "Configure OSPF area as nssa\n"
1625 "Do not inject inter-area routes into nssa\n")
1626{
1627 int idx_ipv4_number = 2;
1628 struct in_addr area_id;
1629 int format;
1630
1631 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
1632
1633 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id, format,
1634 argv[idx_ipv4_number]->arg);
1635
1636 ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
1637 format);
1638 ospf_area_no_summary_unset(ospf, area_id);
1639
1640 ospf_schedule_abr_task(ospf);
1641
1642 return CMD_SUCCESS;
718e3744 1643}
1644
a2c62831 1645DEFUN (no_ospf_area_nssa,
1646 no_ospf_area_nssa_cmd,
7ef56a73 1647 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
718e3744 1648 NO_STR
1649 "OSPF area parameters\n"
1650 "OSPF area ID in IP address format\n"
1651 "OSPF area ID as a decimal value\n"
7a7be519 1652 "Configure OSPF area as nssa\n"
1653 "Configure NSSA-ABR for translate election (default)\n"
1654 "Configure NSSA-ABR to never translate\n"
7ef56a73 1655 "Configure NSSA-ABR to always translate\n")
22b27e95 1656{
a3d826f0 1657 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1658 int idx_ipv4_number = 2;
1659 struct in_addr area_id;
1660 int format;
718e3744 1661
d62a17ae 1662 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format,
1663 argv[idx_ipv4_number]->arg);
718e3744 1664
7ef56a73 1665 ospf_area_nssa_unset(ospf, area_id, argc);
718e3744 1666
d62a17ae 1667 ospf_schedule_abr_task(ospf);
b0a053be 1668
d62a17ae 1669 return CMD_SUCCESS;
718e3744 1670}
1671
718e3744 1672
a2c62831 1673DEFUN (ospf_area_default_cost,
1674 ospf_area_default_cost_cmd,
6147e2c6 1675 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
718e3744 1676 "OSPF area parameters\n"
1677 "OSPF area ID in IP address format\n"
1678 "OSPF area ID as a decimal value\n"
1679 "Set the summary-default cost of a NSSA or stub area\n"
1680 "Stub's advertised default summary cost\n")
1681{
a3d826f0 1682 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1683 int idx_ipv4_number = 1;
1684 int idx_number = 3;
1685 struct ospf_area *area;
1686 struct in_addr area_id;
d7c0a89a 1687 uint32_t cost;
d62a17ae 1688 int format;
1689 struct prefix_ipv4 p;
1690
1691 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id, format,
1692 argv[idx_ipv4_number]->arg);
1693 cost = strtoul(argv[idx_number]->arg, NULL, 10);
1694
1695 area = ospf_area_get(ospf, area_id);
1696 ospf_area_display_format_set(ospf, area, format);
1697
1698 if (area->external_routing == OSPF_AREA_DEFAULT) {
1699 vty_out(vty, "The area is neither stub, nor NSSA\n");
1700 return CMD_WARNING_CONFIG_FAILED;
1701 }
ba682537 1702
d62a17ae 1703 area->default_cost = cost;
1704
1705 p.family = AF_INET;
1706 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1707 p.prefixlen = 0;
1708 if (IS_DEBUG_OSPF_EVENT)
1709 zlog_debug(
1710 "ospf_abr_announce_stub_defaults(): "
1711 "announcing 0.0.0.0/0 to area %s",
1712 inet_ntoa(area->area_id));
1713 ospf_abr_announce_network_to_area(&p, area->default_cost, area);
1714
1715 return CMD_SUCCESS;
718e3744 1716}
1717
a2c62831 1718DEFUN (no_ospf_area_default_cost,
1719 no_ospf_area_default_cost_cmd,
6147e2c6 1720 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
718e3744 1721 NO_STR
1722 "OSPF area parameters\n"
1723 "OSPF area ID in IP address format\n"
1724 "OSPF area ID as a decimal value\n"
1725 "Set the summary-default cost of a NSSA or stub area\n"
1726 "Stub's advertised default summary cost\n")
1727{
a3d826f0 1728 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1729 int idx_ipv4_number = 2;
1730 struct ospf_area *area;
1731 struct in_addr area_id;
1732 int format;
1733 struct prefix_ipv4 p;
718e3744 1734
d62a17ae 1735 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id, format,
1736 argv[idx_ipv4_number]->arg);
718e3744 1737
d62a17ae 1738 area = ospf_area_lookup_by_area_id(ospf, area_id);
1739 if (area == NULL)
1740 return CMD_SUCCESS;
718e3744 1741
d62a17ae 1742 if (area->external_routing == OSPF_AREA_DEFAULT) {
1743 vty_out(vty, "The area is neither stub, nor NSSA\n");
1744 return CMD_WARNING_CONFIG_FAILED;
1745 }
718e3744 1746
d62a17ae 1747 area->default_cost = 1;
718e3744 1748
d62a17ae 1749 p.family = AF_INET;
1750 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1751 p.prefixlen = 0;
1752 if (IS_DEBUG_OSPF_EVENT)
1753 zlog_debug(
1754 "ospf_abr_announce_stub_defaults(): "
1755 "announcing 0.0.0.0/0 to area %s",
1756 inet_ntoa(area->area_id));
1757 ospf_abr_announce_network_to_area(&p, area->default_cost, area);
ba682537 1758
1759
d62a17ae 1760 ospf_area_check_free(ospf, area_id);
718e3744 1761
d62a17ae 1762 return CMD_SUCCESS;
718e3744 1763}
1764
a2c62831 1765DEFUN (ospf_area_export_list,
1766 ospf_area_export_list_cmd,
6147e2c6 1767 "area <A.B.C.D|(0-4294967295)> export-list NAME",
718e3744 1768 "OSPF area parameters\n"
1769 "OSPF area ID in IP address format\n"
1770 "OSPF area ID as a decimal value\n"
1771 "Set the filter for networks announced to other areas\n"
1772 "Name of the access-list\n")
1773{
a3d826f0 1774 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1775 int idx_ipv4_number = 1;
1776 struct ospf_area *area;
1777 struct in_addr area_id;
1778 int format;
718e3744 1779
d62a17ae 1780 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
52930766 1781
d62a17ae 1782 area = ospf_area_get(ospf, area_id);
1783 ospf_area_display_format_set(ospf, area, format);
1784 ospf_area_export_list_set(ospf, area, argv[3]->arg);
718e3744 1785
d62a17ae 1786 return CMD_SUCCESS;
718e3744 1787}
1788
a2c62831 1789DEFUN (no_ospf_area_export_list,
1790 no_ospf_area_export_list_cmd,
6147e2c6 1791 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
718e3744 1792 NO_STR
1793 "OSPF area parameters\n"
1794 "OSPF area ID in IP address format\n"
1795 "OSPF area ID as a decimal value\n"
1796 "Unset the filter for networks announced to other areas\n"
1797 "Name of the access-list\n")
1798{
a3d826f0 1799 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1800 int idx_ipv4_number = 2;
1801 struct ospf_area *area;
1802 struct in_addr area_id;
1803 int format;
718e3744 1804
d62a17ae 1805 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
52930766 1806
d62a17ae 1807 area = ospf_area_lookup_by_area_id(ospf, area_id);
1808 if (area == NULL)
1809 return CMD_SUCCESS;
718e3744 1810
d62a17ae 1811 ospf_area_export_list_unset(ospf, area);
718e3744 1812
d62a17ae 1813 return CMD_SUCCESS;
718e3744 1814}
1815
1816
a2c62831 1817DEFUN (ospf_area_import_list,
1818 ospf_area_import_list_cmd,
6147e2c6 1819 "area <A.B.C.D|(0-4294967295)> import-list NAME",
718e3744 1820 "OSPF area parameters\n"
1821 "OSPF area ID in IP address format\n"
1822 "OSPF area ID as a decimal value\n"
1823 "Set the filter for networks from other areas announced to the specified one\n"
1824 "Name of the access-list\n")
1825{
a3d826f0 1826 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1827 int idx_ipv4_number = 1;
1828 struct ospf_area *area;
1829 struct in_addr area_id;
1830 int format;
718e3744 1831
d62a17ae 1832 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
52930766 1833
d62a17ae 1834 area = ospf_area_get(ospf, area_id);
1835 ospf_area_display_format_set(ospf, area, format);
1836 ospf_area_import_list_set(ospf, area, argv[3]->arg);
718e3744 1837
d62a17ae 1838 return CMD_SUCCESS;
718e3744 1839}
1840
a2c62831 1841DEFUN (no_ospf_area_import_list,
1842 no_ospf_area_import_list_cmd,
6147e2c6 1843 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
718e3744 1844 NO_STR
1845 "OSPF area parameters\n"
1846 "OSPF area ID in IP address format\n"
1847 "OSPF area ID as a decimal value\n"
1848 "Unset the filter for networks announced to other areas\n"
1849 "Name of the access-list\n")
1850{
a3d826f0 1851 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1852 int idx_ipv4_number = 2;
1853 struct ospf_area *area;
1854 struct in_addr area_id;
1855 int format;
718e3744 1856
d62a17ae 1857 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
52930766 1858
d62a17ae 1859 area = ospf_area_lookup_by_area_id(ospf, area_id);
1860 if (area == NULL)
1861 return CMD_SUCCESS;
718e3744 1862
d62a17ae 1863 ospf_area_import_list_unset(ospf, area);
718e3744 1864
d62a17ae 1865 return CMD_SUCCESS;
718e3744 1866}
1867
a2c62831 1868DEFUN (ospf_area_filter_list,
1869 ospf_area_filter_list_cmd,
6147e2c6 1870 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
718e3744 1871 "OSPF area parameters\n"
1872 "OSPF area ID in IP address format\n"
1873 "OSPF area ID as a decimal value\n"
1874 "Filter networks between OSPF areas\n"
1875 "Filter prefixes between OSPF areas\n"
1876 "Name of an IP prefix-list\n"
1877 "Filter networks sent to this area\n"
1878 "Filter networks sent from this area\n")
1879{
a3d826f0 1880 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1881 int idx_ipv4_number = 1;
1882 int idx_word = 4;
1883 int idx_in_out = 5;
1884 struct ospf_area *area;
1885 struct in_addr area_id;
1886 struct prefix_list *plist;
1887 int format;
1888
1889 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
1890
1891 area = ospf_area_get(ospf, area_id);
1892 ospf_area_display_format_set(ospf, area, format);
1893 plist = prefix_list_lookup(AFI_IP, argv[idx_word]->arg);
1894 if (strncmp(argv[idx_in_out]->arg, "in", 2) == 0) {
1895 PREFIX_LIST_IN(area) = plist;
1896 if (PREFIX_NAME_IN(area))
1897 free(PREFIX_NAME_IN(area));
1898
1899 PREFIX_NAME_IN(area) = strdup(argv[idx_word]->arg);
1900 ospf_schedule_abr_task(ospf);
1901 } else {
1902 PREFIX_LIST_OUT(area) = plist;
1903 if (PREFIX_NAME_OUT(area))
1904 free(PREFIX_NAME_OUT(area));
1905
1906 PREFIX_NAME_OUT(area) = strdup(argv[idx_word]->arg);
1907 ospf_schedule_abr_task(ospf);
1908 }
718e3744 1909
d62a17ae 1910 return CMD_SUCCESS;
718e3744 1911}
1912
a2c62831 1913DEFUN (no_ospf_area_filter_list,
1914 no_ospf_area_filter_list_cmd,
6147e2c6 1915 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
718e3744 1916 NO_STR
1917 "OSPF area parameters\n"
1918 "OSPF area ID in IP address format\n"
1919 "OSPF area ID as a decimal value\n"
1920 "Filter networks between OSPF areas\n"
1921 "Filter prefixes between OSPF areas\n"
1922 "Name of an IP prefix-list\n"
1923 "Filter networks sent to this area\n"
1924 "Filter networks sent from this area\n")
1925{
a3d826f0 1926 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 1927 int idx_ipv4_number = 2;
1928 int idx_word = 5;
1929 int idx_in_out = 6;
1930 struct ospf_area *area;
1931 struct in_addr area_id;
1932 int format;
718e3744 1933
d62a17ae 1934 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
718e3744 1935
d62a17ae 1936 if ((area = ospf_area_lookup_by_area_id(ospf, area_id)) == NULL)
1937 return CMD_SUCCESS;
718e3744 1938
d62a17ae 1939 if (strncmp(argv[idx_in_out]->arg, "in", 2) == 0) {
1940 if (PREFIX_NAME_IN(area))
1941 if (strcmp(PREFIX_NAME_IN(area), argv[idx_word]->arg)
1942 != 0)
1943 return CMD_SUCCESS;
718e3744 1944
d62a17ae 1945 PREFIX_LIST_IN(area) = NULL;
1946 if (PREFIX_NAME_IN(area))
1947 free(PREFIX_NAME_IN(area));
718e3744 1948
d62a17ae 1949 PREFIX_NAME_IN(area) = NULL;
718e3744 1950
d62a17ae 1951 ospf_schedule_abr_task(ospf);
1952 } else {
1953 if (PREFIX_NAME_OUT(area))
1954 if (strcmp(PREFIX_NAME_OUT(area), argv[idx_word]->arg)
1955 != 0)
1956 return CMD_SUCCESS;
718e3744 1957
d62a17ae 1958 PREFIX_LIST_OUT(area) = NULL;
1959 if (PREFIX_NAME_OUT(area))
1960 free(PREFIX_NAME_OUT(area));
718e3744 1961
d62a17ae 1962 PREFIX_NAME_OUT(area) = NULL;
718e3744 1963
d62a17ae 1964 ospf_schedule_abr_task(ospf);
1965 }
1966
1967 return CMD_SUCCESS;
718e3744 1968}
1969
6b0655a2 1970
a2c62831 1971DEFUN (ospf_area_authentication_message_digest,
1972 ospf_area_authentication_message_digest_cmd,
32573073
QY
1973 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1974 NO_STR
718e3744 1975 "OSPF area parameters\n"
2b00515a
CF
1976 "OSPF area ID in IP address format\n"
1977 "OSPF area ID as a decimal value\n"
718e3744 1978 "Enable authentication\n"
1979 "Use message-digest authentication\n")
1980{
a3d826f0 1981 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
ca19319b 1982 int idx = 0;
d62a17ae 1983 struct ospf_area *area;
1984 struct in_addr area_id;
1985 int format;
718e3744 1986
ca19319b 1987 argv_find(argv, argc, "area", &idx);
1988 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx + 1]->arg);
718e3744 1989
d62a17ae 1990 area = ospf_area_get(ospf, area_id);
1991 ospf_area_display_format_set(ospf, area, format);
996c9314
LB
1992 area->auth_type = strmatch(argv[0]->text, "no")
1993 ? OSPF_AUTH_NULL
1994 : OSPF_AUTH_CRYPTOGRAPHIC;
718e3744 1995
d62a17ae 1996 return CMD_SUCCESS;
718e3744 1997}
1998
a2c62831 1999DEFUN (ospf_area_authentication,
2000 ospf_area_authentication_cmd,
6147e2c6 2001 "area <A.B.C.D|(0-4294967295)> authentication",
718e3744 2002 "OSPF area parameters\n"
2003 "OSPF area ID in IP address format\n"
2004 "OSPF area ID as a decimal value\n"
2005 "Enable authentication\n")
2006{
a3d826f0 2007 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2008 int idx_ipv4_number = 1;
2009 struct ospf_area *area;
2010 struct in_addr area_id;
2011 int format;
718e3744 2012
d62a17ae 2013 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
718e3744 2014
d62a17ae 2015 area = ospf_area_get(ospf, area_id);
2016 ospf_area_display_format_set(ospf, area, format);
2017 area->auth_type = OSPF_AUTH_SIMPLE;
718e3744 2018
d62a17ae 2019 return CMD_SUCCESS;
718e3744 2020}
2021
a2c62831 2022DEFUN (no_ospf_area_authentication,
2023 no_ospf_area_authentication_cmd,
6147e2c6 2024 "no area <A.B.C.D|(0-4294967295)> authentication",
718e3744 2025 NO_STR
2026 "OSPF area parameters\n"
2027 "OSPF area ID in IP address format\n"
2028 "OSPF area ID as a decimal value\n"
2029 "Enable authentication\n")
2030{
a3d826f0 2031 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2032 int idx_ipv4_number = 2;
2033 struct ospf_area *area;
2034 struct in_addr area_id;
2035 int format;
718e3744 2036
d62a17ae 2037 VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
718e3744 2038
d62a17ae 2039 area = ospf_area_lookup_by_area_id(ospf, area_id);
2040 if (area == NULL)
2041 return CMD_SUCCESS;
718e3744 2042
d62a17ae 2043 area->auth_type = OSPF_AUTH_NULL;
718e3744 2044
d62a17ae 2045 ospf_area_check_free(ospf, area_id);
2046
2047 return CMD_SUCCESS;
718e3744 2048}
2049
6b0655a2 2050
718e3744 2051DEFUN (ospf_abr_type,
2052 ospf_abr_type_cmd,
6147e2c6 2053 "ospf abr-type <cisco|ibm|shortcut|standard>",
718e3744 2054 "OSPF specific commands\n"
2055 "Set OSPF ABR type\n"
2056 "Alternative ABR, cisco implementation\n"
2057 "Alternative ABR, IBM implementation\n"
2058 "Shortcut ABR\n"
2059 "Standard behavior (RFC2328)\n")
2060{
a3d826f0 2061 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2062 int idx_vendor = 2;
d7c0a89a 2063 uint8_t abr_type = OSPF_ABR_UNKNOWN;
d62a17ae 2064
2065 if (strncmp(argv[idx_vendor]->arg, "c", 1) == 0)
2066 abr_type = OSPF_ABR_CISCO;
2067 else if (strncmp(argv[idx_vendor]->arg, "i", 1) == 0)
2068 abr_type = OSPF_ABR_IBM;
2069 else if (strncmp(argv[idx_vendor]->arg, "sh", 2) == 0)
2070 abr_type = OSPF_ABR_SHORTCUT;
2071 else if (strncmp(argv[idx_vendor]->arg, "st", 2) == 0)
2072 abr_type = OSPF_ABR_STAND;
2073 else
2074 return CMD_WARNING_CONFIG_FAILED;
718e3744 2075
d62a17ae 2076 /* If ABR type value is changed, schedule ABR task. */
2077 if (ospf->abr_type != abr_type) {
2078 ospf->abr_type = abr_type;
2079 ospf_schedule_abr_task(ospf);
2080 }
2081
2082 return CMD_SUCCESS;
718e3744 2083}
2084
2085DEFUN (no_ospf_abr_type,
2086 no_ospf_abr_type_cmd,
6147e2c6 2087 "no ospf abr-type <cisco|ibm|shortcut|standard>",
718e3744 2088 NO_STR
2089 "OSPF specific commands\n"
2090 "Set OSPF ABR type\n"
2091 "Alternative ABR, cisco implementation\n"
2092 "Alternative ABR, IBM implementation\n"
3a2d747c
QY
2093 "Shortcut ABR\n"
2094 "Standard ABR\n")
718e3744 2095{
a3d826f0 2096 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2097 int idx_vendor = 3;
d7c0a89a 2098 uint8_t abr_type = OSPF_ABR_UNKNOWN;
d62a17ae 2099
2100 if (strncmp(argv[idx_vendor]->arg, "c", 1) == 0)
2101 abr_type = OSPF_ABR_CISCO;
2102 else if (strncmp(argv[idx_vendor]->arg, "i", 1) == 0)
2103 abr_type = OSPF_ABR_IBM;
2104 else if (strncmp(argv[idx_vendor]->arg, "sh", 2) == 0)
2105 abr_type = OSPF_ABR_SHORTCUT;
2106 else if (strncmp(argv[idx_vendor]->arg, "st", 2) == 0)
2107 abr_type = OSPF_ABR_STAND;
2108 else
2109 return CMD_WARNING_CONFIG_FAILED;
718e3744 2110
d62a17ae 2111 /* If ABR type value is changed, schedule ABR task. */
2112 if (ospf->abr_type == abr_type) {
2113 ospf->abr_type = OSPF_ABR_DEFAULT;
2114 ospf_schedule_abr_task(ospf);
2115 }
2116
2117 return CMD_SUCCESS;
718e3744 2118}
2119
d7e60dd7
AS
2120DEFUN (ospf_log_adjacency_changes,
2121 ospf_log_adjacency_changes_cmd,
2122 "log-adjacency-changes",
2123 "Log changes in adjacency state\n")
2124{
a3d826f0 2125 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d7e60dd7 2126
d62a17ae 2127 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2128 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2129 return CMD_SUCCESS;
d7e60dd7
AS
2130}
2131
2132DEFUN (ospf_log_adjacency_changes_detail,
2133 ospf_log_adjacency_changes_detail_cmd,
2134 "log-adjacency-changes detail",
2135 "Log changes in adjacency state\n"
2136 "Log all state changes\n")
2137{
a3d826f0 2138 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d7e60dd7 2139
d62a17ae 2140 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2141 SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2142 return CMD_SUCCESS;
d7e60dd7
AS
2143}
2144
2145DEFUN (no_ospf_log_adjacency_changes,
2146 no_ospf_log_adjacency_changes_cmd,
2147 "no log-adjacency-changes",
2148 NO_STR
2149 "Log changes in adjacency state\n")
2150{
a3d826f0 2151 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d7e60dd7 2152
d62a17ae 2153 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2154 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2155 return CMD_SUCCESS;
d7e60dd7
AS
2156}
2157
2158DEFUN (no_ospf_log_adjacency_changes_detail,
2159 no_ospf_log_adjacency_changes_detail_cmd,
2160 "no log-adjacency-changes detail",
2161 NO_STR
2162 "Log changes in adjacency state\n"
2163 "Log all state changes\n")
2164{
a3d826f0 2165 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d7e60dd7 2166
d62a17ae 2167 UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2168 return CMD_SUCCESS;
d7e60dd7
AS
2169}
2170
718e3744 2171DEFUN (ospf_compatible_rfc1583,
2172 ospf_compatible_rfc1583_cmd,
2173 "compatible rfc1583",
2174 "OSPF compatibility list\n"
2175 "compatible with RFC 1583\n")
2176{
a3d826f0 2177 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
718e3744 2178
d62a17ae 2179 if (!CHECK_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE)) {
2180 SET_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE);
2181 ospf_spf_calculate_schedule(ospf, SPF_FLAG_CONFIG_CHANGE);
2182 }
2183 return CMD_SUCCESS;
718e3744 2184}
2185
2186DEFUN (no_ospf_compatible_rfc1583,
2187 no_ospf_compatible_rfc1583_cmd,
2188 "no compatible rfc1583",
2189 NO_STR
2190 "OSPF compatibility list\n"
2191 "compatible with RFC 1583\n")
2192{
a3d826f0 2193 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
718e3744 2194
d62a17ae 2195 if (CHECK_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE)) {
2196 UNSET_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE);
2197 ospf_spf_calculate_schedule(ospf, SPF_FLAG_CONFIG_CHANGE);
2198 }
2199 return CMD_SUCCESS;
718e3744 2200}
2201
d62a17ae 2202ALIAS(ospf_compatible_rfc1583, ospf_rfc1583_flag_cmd,
2203 "ospf rfc1583compatibility",
2204 "OSPF specific commands\n"
2205 "Enable the RFC1583Compatibility flag\n")
718e3744 2206
d62a17ae 2207ALIAS(no_ospf_compatible_rfc1583, no_ospf_rfc1583_flag_cmd,
9d303b37 2208 "no ospf rfc1583compatibility", NO_STR
d62a17ae 2209 "OSPF specific commands\n"
2210 "Disable the RFC1583Compatibility flag\n")
6b0655a2 2211
d62a17ae 2212static int ospf_timers_spf_set(struct vty *vty, unsigned int delay,
2213 unsigned int hold, unsigned int max)
d24f6e2a 2214{
a3d826f0 2215 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
7c8ff89e 2216
d62a17ae 2217 ospf->spf_delay = delay;
2218 ospf->spf_holdtime = hold;
2219 ospf->spf_max_holdtime = max;
2220
2221 return CMD_SUCCESS;
d24f6e2a 2222}
718e3744 2223
ac7424f9
MR
2224DEFUN (ospf_timers_min_ls_interval,
2225 ospf_timers_min_ls_interval_cmd,
6147e2c6 2226 "timers throttle lsa all (0-5000)",
ac7424f9
MR
2227 "Adjust routing timers\n"
2228 "Throttling adaptive timer\n"
2229 "LSA delay between transmissions\n"
813d4307 2230 "All LSA types\n"
ac7424f9
MR
2231 "Delay (msec) between sending LSAs\n")
2232{
a3d826f0 2233 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2234 int idx_number = 4;
2235 unsigned int interval;
ac7424f9 2236
d62a17ae 2237 if (argc < 5) {
2238 vty_out(vty, "Insufficient arguments\n");
2239 return CMD_WARNING_CONFIG_FAILED;
2240 }
ac7424f9 2241
d62a17ae 2242 interval = strtoul(argv[idx_number]->arg, NULL, 10);
ac7424f9 2243
d62a17ae 2244 ospf->min_ls_interval = interval;
ac7424f9 2245
d62a17ae 2246 return CMD_SUCCESS;
ac7424f9
MR
2247}
2248
2249DEFUN (no_ospf_timers_min_ls_interval,
2250 no_ospf_timers_min_ls_interval_cmd,
7a7be519 2251 "no timers throttle lsa all [(0-5000)]",
ac7424f9
MR
2252 NO_STR
2253 "Adjust routing timers\n"
2254 "Throttling adaptive timer\n"
813d4307 2255 "LSA delay between transmissions\n"
7a7be519 2256 "All LSA types\n"
2257 "Delay (msec) between sending LSAs\n")
ac7424f9 2258{
a3d826f0 2259 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2260 ospf->min_ls_interval = OSPF_MIN_LS_INTERVAL;
ac7424f9 2261
d62a17ae 2262 return CMD_SUCCESS;
ac7424f9
MR
2263}
2264
d24f6e2a 2265DEFUN (ospf_timers_throttle_spf,
2266 ospf_timers_throttle_spf_cmd,
6147e2c6 2267 "timers throttle spf (0-600000) (0-600000) (0-600000)",
d24f6e2a 2268 "Adjust routing timers\n"
2269 "Throttling adaptive timer\n"
2270 "OSPF SPF timers\n"
2271 "Delay (msec) from first change received till SPF calculation\n"
2272 "Initial hold time (msec) between consecutive SPF calculations\n"
2273 "Maximum hold time (msec)\n")
2274{
d62a17ae 2275 int idx_number = 3;
2276 int idx_number_2 = 4;
2277 int idx_number_3 = 5;
2278 unsigned int delay, hold, max;
2279
2280 if (argc < 6) {
2281 vty_out(vty, "Insufficient arguments\n");
2282 return CMD_WARNING_CONFIG_FAILED;
2283 }
2284
2285 delay = strtoul(argv[idx_number]->arg, NULL, 10);
2286 hold = strtoul(argv[idx_number_2]->arg, NULL, 10);
2287 max = strtoul(argv[idx_number_3]->arg, NULL, 10);
2288
2289 return ospf_timers_spf_set(vty, delay, hold, max);
d24f6e2a 2290}
2291
d24f6e2a 2292DEFUN (no_ospf_timers_throttle_spf,
2293 no_ospf_timers_throttle_spf_cmd,
7a7be519 2294 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
718e3744 2295 NO_STR
2296 "Adjust routing timers\n"
d24f6e2a 2297 "Throttling adaptive timer\n"
7a7be519 2298 "OSPF SPF timers\n"
2299 "Delay (msec) from first change received till SPF calculation\n"
2300 "Initial hold time (msec) between consecutive SPF calculations\n"
2301 "Maximum hold time (msec)\n")
22b27e95 2302{
d62a17ae 2303 return ospf_timers_spf_set(vty, OSPF_SPF_DELAY_DEFAULT,
2304 OSPF_SPF_HOLDTIME_DEFAULT,
2305 OSPF_SPF_MAX_HOLDTIME_DEFAULT);
718e3744 2306}
2307
b4a039bf 2308
0e88de35
QY
2309DEFUN (ospf_timers_lsa_min_arrival,
2310 ospf_timers_lsa_min_arrival_cmd,
6147e2c6 2311 "timers lsa min-arrival (0-600000)",
b6927875
DS
2312 "Adjust routing timers\n"
2313 "OSPF LSA timers\n"
2314 "Minimum delay in receiving new version of a LSA\n"
2315 "Delay in milliseconds\n")
2316{
a3d826f0 2317 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
0e88de35 2318 ospf->min_ls_arrival = strtoul(argv[argc - 1]->arg, NULL, 10);
d62a17ae 2319 return CMD_SUCCESS;
b6927875
DS
2320}
2321
0e88de35
QY
2322DEFUN (no_ospf_timers_lsa_min_arrival,
2323 no_ospf_timers_lsa_min_arrival_cmd,
7a7be519 2324 "no timers lsa min-arrival [(0-600000)]",
b6927875
DS
2325 NO_STR
2326 "Adjust routing timers\n"
2327 "OSPF LSA timers\n"
7a7be519 2328 "Minimum delay in receiving new version of a LSA\n"
2329 "Delay in milliseconds\n")
b6927875 2330{
a3d826f0 2331 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2332 unsigned int minarrival;
b6927875 2333
d62a17ae 2334 if (argc > 4) {
0e88de35 2335 minarrival = strtoul(argv[argc - 1]->arg, NULL, 10);
b6927875 2336
d62a17ae 2337 if (ospf->min_ls_arrival != minarrival
2338 || minarrival == OSPF_MIN_LS_ARRIVAL)
2339 return CMD_SUCCESS;
2340 }
b6927875 2341
d62a17ae 2342 ospf->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
b6927875 2343
d62a17ae 2344 return CMD_SUCCESS;
b6927875
DS
2345}
2346
a2c62831 2347DEFUN (ospf_neighbor,
2348 ospf_neighbor_cmd,
7a7be519 2349 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
718e3744 2350 NEIGHBOR_STR
7a7be519 2351 "Neighbor IP address\n"
2352 "Neighbor Priority\n"
2353 "Priority\n"
2354 "Dead Neighbor Polling interval\n"
2355 "Seconds\n")
718e3744 2356{
a3d826f0 2357 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2358 int idx_ipv4 = 1;
2359 int idx_pri = 3;
2360 int idx_poll = 5;
2361 struct in_addr nbr_addr;
2362 unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2363 unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
718e3744 2364
cc9b06ad
DS
2365 if (!inet_aton(argv[idx_ipv4]->arg, &nbr_addr)) {
2366 vty_out(vty, "Please specify Neighbor ID by A.B.C.D\n");
2367 return CMD_WARNING_CONFIG_FAILED;
2368 }
718e3744 2369
d62a17ae 2370 if (argc > 2)
2371 priority = strtoul(argv[idx_pri]->arg, NULL, 10);
7a7be519 2372
d62a17ae 2373 if (argc > 4)
2374 interval = strtoul(argv[idx_poll]->arg, NULL, 10);
718e3744 2375
d62a17ae 2376 ospf_nbr_nbma_set(ospf, nbr_addr);
7a7be519 2377
d62a17ae 2378 if (argc > 2)
2379 ospf_nbr_nbma_priority_set(ospf, nbr_addr, priority);
7a7be519 2380
d62a17ae 2381 if (argc > 4)
2382 ospf_nbr_nbma_poll_interval_set(ospf, nbr_addr, interval);
718e3744 2383
d62a17ae 2384 return CMD_SUCCESS;
718e3744 2385}
2386
a2c62831 2387DEFUN (ospf_neighbor_poll_interval,
2388 ospf_neighbor_poll_interval_cmd,
7a7be519 2389 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
718e3744 2390 NEIGHBOR_STR
2391 "Neighbor IP address\n"
2392 "Dead Neighbor Polling interval\n"
7a7be519 2393 "Seconds\n"
2394 "OSPF priority of non-broadcast neighbor\n"
2395 "Priority\n")
22b27e95 2396{
a3d826f0 2397 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2398 int idx_ipv4 = 1;
2399 int idx_poll = 3;
2400 int idx_pri = 5;
2401 struct in_addr nbr_addr;
a2b6e694 2402 unsigned int priority;
2403 unsigned int interval;
718e3744 2404
cc9b06ad
DS
2405 if (!inet_aton(argv[idx_ipv4]->arg, &nbr_addr)) {
2406 vty_out(vty, "Please specify Neighbor ID by A.B.C.D\n");
2407 return CMD_WARNING_CONFIG_FAILED;
2408 }
718e3744 2409
d62a17ae 2410 interval = strtoul(argv[idx_poll]->arg, NULL, 10);
718e3744 2411
a2b6e694 2412 priority = argc > 4 ? strtoul(argv[idx_pri]->arg, NULL, 10)
2413 : OSPF_NEIGHBOR_PRIORITY_DEFAULT;
718e3744 2414
d62a17ae 2415 ospf_nbr_nbma_set(ospf, nbr_addr);
2416 ospf_nbr_nbma_poll_interval_set(ospf, nbr_addr, interval);
7a7be519 2417
d62a17ae 2418 if (argc > 4)
2419 ospf_nbr_nbma_priority_set(ospf, nbr_addr, priority);
718e3744 2420
d62a17ae 2421 return CMD_SUCCESS;
718e3744 2422}
2423
a2c62831 2424DEFUN (no_ospf_neighbor,
2425 no_ospf_neighbor_cmd,
7a7be519 2426 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
718e3744 2427 NO_STR
2428 NEIGHBOR_STR
7a7be519 2429 "Neighbor IP address\n"
2430 "Neighbor Priority\n"
2431 "Priority\n"
2432 "Dead Neighbor Polling interval\n"
2433 "Seconds\n")
718e3744 2434{
a3d826f0 2435 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2436 int idx_ipv4 = 2;
2437 struct in_addr nbr_addr;
718e3744 2438
cc9b06ad
DS
2439 if (!inet_aton(argv[idx_ipv4]->arg, &nbr_addr)) {
2440 vty_out(vty, "Please specify Neighbor ID by A.B.C.D\n");
2441 return CMD_WARNING_CONFIG_FAILED;
2442 }
718e3744 2443
d62a17ae 2444 (void)ospf_nbr_nbma_unset(ospf, nbr_addr);
718e3744 2445
d62a17ae 2446 return CMD_SUCCESS;
718e3744 2447}
2448
7a7be519 2449DEFUN (no_ospf_neighbor_poll,
2450 no_ospf_neighbor_poll_cmd,
2451 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2452 NO_STR
2453 NEIGHBOR_STR
2454 "Neighbor IP address\n"
2455 "Dead Neighbor Polling interval\n"
2456 "Seconds\n"
2457 "Neighbor Priority\n"
2458 "Priority\n")
2459{
a3d826f0 2460 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2461 int idx_ipv4 = 2;
2462 struct in_addr nbr_addr;
7a7be519 2463
cc9b06ad
DS
2464 if (!inet_aton(argv[idx_ipv4]->arg, &nbr_addr)) {
2465 vty_out(vty, "Please specify Neighbor ID by A.B.C.D\n");
2466 return CMD_WARNING_CONFIG_FAILED;
2467 }
718e3744 2468
d62a17ae 2469 (void)ospf_nbr_nbma_unset(ospf, nbr_addr);
813d4307 2470
d62a17ae 2471 return CMD_SUCCESS;
7a7be519 2472}
718e3744 2473
bf2bfafd
DW
2474DEFUN (ospf_refresh_timer,
2475 ospf_refresh_timer_cmd,
6147e2c6 2476 "refresh timer (10-1800)",
718e3744 2477 "Adjust refresh parameters\n"
2478 "Set refresh timer\n"
2479 "Timer value in seconds\n")
2480{
a3d826f0 2481 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2482 int idx_number = 2;
2483 unsigned int interval;
7c8ff89e 2484
d62a17ae 2485 interval = strtoul(argv[idx_number]->arg, NULL, 10);
2486 interval = (interval / OSPF_LSA_REFRESHER_GRANULARITY)
2487 * OSPF_LSA_REFRESHER_GRANULARITY;
718e3744 2488
d62a17ae 2489 ospf_timers_refresh_set(ospf, interval);
718e3744 2490
d62a17ae 2491 return CMD_SUCCESS;
718e3744 2492}
2493
bf2bfafd
DW
2494DEFUN (no_ospf_refresh_timer,
2495 no_ospf_refresh_timer_val_cmd,
7a7be519 2496 "no refresh timer [(10-1800)]",
3a2d747c 2497 NO_STR
718e3744 2498 "Adjust refresh parameters\n"
2499 "Unset refresh timer\n"
2500 "Timer value in seconds\n")
2501{
a3d826f0 2502 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2503 int idx_number = 3;
2504 unsigned int interval;
718e3744 2505
d62a17ae 2506 if (argc == 1) {
2507 interval = strtoul(argv[idx_number]->arg, NULL, 10);
718e3744 2508
d62a17ae 2509 if (ospf->lsa_refresh_interval != interval
2510 || interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2511 return CMD_SUCCESS;
2512 }
2513
2514 ospf_timers_refresh_unset(ospf);
2515
2516 return CMD_SUCCESS;
718e3744 2517}
2518
718e3744 2519
a2c62831 2520DEFUN (ospf_auto_cost_reference_bandwidth,
2521 ospf_auto_cost_reference_bandwidth_cmd,
6147e2c6 2522 "auto-cost reference-bandwidth (1-4294967)",
718e3744 2523 "Calculate OSPF interface cost according to bandwidth\n"
2524 "Use reference bandwidth method to assign OSPF cost\n"
2525 "The reference bandwidth in terms of Mbits per second\n")
2526{
a3d826f0 2527 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
f4e14fdb 2528 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
d62a17ae 2529 int idx_number = 2;
d7c0a89a 2530 uint32_t refbw;
d62a17ae 2531 struct interface *ifp;
2532
2533 refbw = strtol(argv[idx_number]->arg, NULL, 10);
2534 if (refbw < 1 || refbw > 4294967) {
2535 vty_out(vty, "reference-bandwidth value is invalid\n");
2536 return CMD_WARNING_CONFIG_FAILED;
2537 }
2538
2539 /* If reference bandwidth is changed. */
2540 if ((refbw) == ospf->ref_bandwidth)
2541 return CMD_SUCCESS;
2542
2543 ospf->ref_bandwidth = refbw;
451fda4f 2544 FOR_ALL_INTERFACES (vrf, ifp)
d62a17ae 2545 ospf_if_recalculate_output_cost(ifp);
2546
2547 return CMD_SUCCESS;
718e3744 2548}
2549
a2c62831 2550DEFUN (no_ospf_auto_cost_reference_bandwidth,
2551 no_ospf_auto_cost_reference_bandwidth_cmd,
7a7be519 2552 "no auto-cost reference-bandwidth [(1-4294967)]",
718e3744 2553 NO_STR
2554 "Calculate OSPF interface cost according to bandwidth\n"
7a7be519 2555 "Use reference bandwidth method to assign OSPF cost\n"
2556 "The reference bandwidth in terms of Mbits per second\n")
718e3744 2557{
a3d826f0 2558 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
f4e14fdb 2559 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
d62a17ae 2560 struct interface *ifp;
718e3744 2561
d62a17ae 2562 if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
2563 return CMD_SUCCESS;
2564
2565 ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
2566 vty_out(vty, "%% OSPF: Reference bandwidth is changed.\n");
2567 vty_out(vty,
2568 " Please ensure reference bandwidth is consistent across all routers\n");
2569
451fda4f 2570 FOR_ALL_INTERFACES (vrf, ifp)
d62a17ae 2571 ospf_if_recalculate_output_cost(ifp);
2572
2573 return CMD_SUCCESS;
718e3744 2574}
2575
2f8f370e
DS
2576DEFUN (ospf_write_multiplier,
2577 ospf_write_multiplier_cmd,
6147e2c6 2578 "ospf write-multiplier (1-100)",
e8f45e82
DS
2579 "OSPF specific commands\n"
2580 "Write multiplier\n"
2581 "Maximum number of interface serviced per write\n")
2f8f370e 2582{
a3d826f0 2583 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 2584 int idx_number;
d7c0a89a 2585 uint32_t write_oi_count;
d62a17ae 2586
2587 if (argc == 3)
2588 idx_number = 2;
2589 else
2590 idx_number = 1;
2591
2592 write_oi_count = strtol(argv[idx_number]->arg, NULL, 10);
2593 if (write_oi_count < 1 || write_oi_count > 100) {
2594 vty_out(vty, "write-multiplier value is invalid\n");
2595 return CMD_WARNING_CONFIG_FAILED;
2596 }
2597
2598 ospf->write_oi_count = write_oi_count;
2599 return CMD_SUCCESS;
2f8f370e
DS
2600}
2601
d62a17ae 2602ALIAS(ospf_write_multiplier, write_multiplier_cmd, "write-multiplier (1-100)",
2603 "Write multiplier\n"
2604 "Maximum number of interface serviced per write\n")
e8f45e82 2605
2f8f370e
DS
2606DEFUN (no_ospf_write_multiplier,
2607 no_ospf_write_multiplier_cmd,
6147e2c6 2608 "no ospf write-multiplier (1-100)",
2f8f370e 2609 NO_STR
e8f45e82 2610 "OSPF specific commands\n"
813d4307
DW
2611 "Write multiplier\n"
2612 "Maximum number of interface serviced per write\n")
2f8f370e 2613{
a3d826f0 2614 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
2f8f370e 2615
d62a17ae 2616 ospf->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
2617 return CMD_SUCCESS;
2f8f370e
DS
2618}
2619
d62a17ae 2620ALIAS(no_ospf_write_multiplier, no_write_multiplier_cmd,
9d303b37 2621 "no write-multiplier (1-100)", NO_STR
d62a17ae 2622 "Write multiplier\n"
2623 "Maximum number of interface serviced per write\n")
2624
2b64873d
DL
2625static const char *const ospf_abr_type_descr_str[] = {
2626 "Unknown", "Standard (RFC2328)", "Alternative IBM",
2627 "Alternative Cisco", "Alternative Shortcut"
2628};
d62a17ae 2629
2b64873d
DL
2630static const char *const ospf_shortcut_mode_descr_str[] = {
2631 "Default", "Enabled", "Disabled"
2632};
d62a17ae 2633
2634static void show_ip_ospf_area(struct vty *vty, struct ospf_area *area,
9f049418 2635 json_object *json_areas, bool use_json)
d62a17ae 2636{
2637 json_object *json_area = NULL;
2638
2639 if (use_json)
2640 json_area = json_object_new_object();
2641
2642 /* Show Area ID. */
2643 if (!use_json)
2644 vty_out(vty, " Area ID: %s", inet_ntoa(area->area_id));
2645
2646 /* Show Area type/mode. */
2647 if (OSPF_IS_AREA_BACKBONE(area)) {
2648 if (use_json)
2649 json_object_boolean_true_add(json_area, "backbone");
2650 else
2651 vty_out(vty, " (Backbone)\n");
2652 } else {
2653 if (use_json) {
2654 if (area->external_routing == OSPF_AREA_STUB) {
2655 if (area->no_summary)
2656 json_object_boolean_true_add(
2657 json_area, "stubNoSummary");
2658 if (area->shortcut_configured)
2659 json_object_boolean_true_add(
2660 json_area, "stubShortcut");
2661 } else if (area->external_routing == OSPF_AREA_NSSA) {
2662 if (area->no_summary)
2663 json_object_boolean_true_add(
2664 json_area, "nssaNoSummary");
2665 if (area->shortcut_configured)
2666 json_object_boolean_true_add(
2667 json_area, "nssaShortcut");
2668 }
813d4307 2669
d62a17ae 2670 json_object_string_add(
2671 json_area, "shortcuttingMode",
2672 ospf_shortcut_mode_descr_str
2673 [area->shortcut_configured]);
2674 if (area->shortcut_capability)
2675 json_object_boolean_true_add(json_area,
2676 "sBitConcensus");
2677 } else {
2678 if (area->external_routing == OSPF_AREA_STUB)
2679 vty_out(vty, " (Stub%s%s)",
2680 area->no_summary ? ", no summary" : "",
2681 area->shortcut_configured ? "; " : "");
2682 else if (area->external_routing == OSPF_AREA_NSSA)
2683 vty_out(vty, " (NSSA%s%s)",
2684 area->no_summary ? ", no summary" : "",
2685 area->shortcut_configured ? "; " : "");
2686
2687 vty_out(vty, "\n");
2688 vty_out(vty, " Shortcutting mode: %s",
2689 ospf_shortcut_mode_descr_str
2690 [area->shortcut_configured]);
2691 vty_out(vty, ", S-bit consensus: %s\n",
2692 area->shortcut_capability ? "ok" : "no");
2693 }
2694 }
718e3744 2695
d62a17ae 2696 /* Show number of interfaces */
2697 if (use_json) {
2698 json_object_int_add(json_area, "areaIfTotalCounter",
2699 listcount(area->oiflist));
2700 json_object_int_add(json_area, "areaIfActiveCounter",
2701 area->act_ints);
2702 } else
2703 vty_out(vty,
2704 " Number of interfaces in this area: Total: %d, "
2705 "Active: %d\n",
2706 listcount(area->oiflist), area->act_ints);
2707
2708 if (area->external_routing == OSPF_AREA_NSSA) {
2709 if (use_json) {
2710 json_object_boolean_true_add(json_area, "nssa");
2711 if (!IS_OSPF_ABR(area->ospf))
2712 json_object_boolean_false_add(json_area, "abr");
2713 else if (area->NSSATranslatorState) {
2714 json_object_boolean_true_add(json_area, "abr");
2715 if (area->NSSATranslatorRole
2716 == OSPF_NSSA_ROLE_CANDIDATE)
2717 json_object_boolean_true_add(
2718 json_area,
2719 "nssaTranslatorElected");
2720 else if (area->NSSATranslatorRole
2721 == OSPF_NSSA_ROLE_ALWAYS)
2722 json_object_boolean_true_add(
2723 json_area,
2724 "nssaTranslatorAlways");
2725 } else {
2726 json_object_boolean_true_add(json_area, "abr");
2727 if (area->NSSATranslatorRole
2728 == OSPF_NSSA_ROLE_CANDIDATE)
2729 json_object_boolean_false_add(
2730 json_area,
2731 "nssaTranslatorElected");
2732 else
2733 json_object_boolean_true_add(
2734 json_area,
2735 "nssaTranslatorNever");
2736 }
2737 } else {
2738 vty_out(vty,
2739 " It is an NSSA configuration. \n Elected NSSA/ABR performs type-7/type-5 LSA translation. \n");
2740 if (!IS_OSPF_ABR(area->ospf))
2741 vty_out(vty,
2742 " It is not ABR, therefore not Translator. \n");
2743 else if (area->NSSATranslatorState) {
2744 vty_out(vty, " We are an ABR and ");
2745 if (area->NSSATranslatorRole
2746 == OSPF_NSSA_ROLE_CANDIDATE)
2747 vty_out(vty,
2748 "the NSSA Elected Translator. \n");
2749 else if (area->NSSATranslatorRole
2750 == OSPF_NSSA_ROLE_ALWAYS)
2751 vty_out(vty,
2752 "always an NSSA Translator. \n");
2753 } else {
2754 vty_out(vty, " We are an ABR, but ");
2755 if (area->NSSATranslatorRole
2756 == OSPF_NSSA_ROLE_CANDIDATE)
2757 vty_out(vty,
2758 "not the NSSA Elected Translator. \n");
2759 else
2760 vty_out(vty,
2761 "never an NSSA Translator. \n");
2762 }
2763 }
2764 }
2765
2766 /* Stub-router state for this area */
2767 if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)) {
2768 char timebuf[OSPF_TIME_DUMP_SIZE];
2769
2770 if (use_json) {
2771 json_object_boolean_true_add(
2772 json_area, "originStubMaxDistRouterLsa");
2773 if (CHECK_FLAG(area->stub_router_state,
2774 OSPF_AREA_ADMIN_STUB_ROUTED))
2775 json_object_boolean_true_add(
2776 json_area, "indefiniteActiveAdmin");
2777 if (area->t_stub_router) {
2778 long time_store;
2779 time_store =
2780 monotime_until(
2781 &area->t_stub_router->u.sands,
2782 NULL)
2783 / 1000LL;
2784 json_object_int_add(
2785 json_area,
2786 "activeStartupRemainderMsecs",
2787 time_store);
2788 }
2789 } else {
2790 vty_out(vty,
2791 " Originating stub / maximum-distance Router-LSA\n");
2792 if (CHECK_FLAG(area->stub_router_state,
2793 OSPF_AREA_ADMIN_STUB_ROUTED))
2794 vty_out(vty,
2795 " Administratively activated (indefinitely)\n");
2796 if (area->t_stub_router)
2797 vty_out(vty,
2798 " Active from startup, %s remaining\n",
2799 ospf_timer_dump(area->t_stub_router,
2800 timebuf,
2801 sizeof(timebuf)));
2802 }
2803 }
2804
2805 if (use_json) {
2806 /* Show number of fully adjacent neighbors. */
2807 json_object_int_add(json_area, "nbrFullAdjacentCounter",
2808 area->full_nbrs);
2809
2810 /* Show authentication type. */
2811 if (area->auth_type == OSPF_AUTH_NULL)
2812 json_object_string_add(json_area, "authentication",
2813 "authenticationNone");
2814 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2815 json_object_string_add(json_area, "authentication",
2816 "authenticationSimplePassword");
2817 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2818 json_object_string_add(json_area, "authentication",
2819 "authenticationMessageDigest");
2820
2821 if (!OSPF_IS_AREA_BACKBONE(area))
2822 json_object_int_add(json_area,
2823 "virtualAdjacenciesPassingCounter",
2824 area->full_vls);
2825
2826 /* Show SPF calculation times. */
2827 json_object_int_add(json_area, "spfExecutedCounter",
2828 area->spf_calculation);
2829 json_object_int_add(json_area, "lsaNumber", area->lsdb->total);
2830 json_object_int_add(
2831 json_area, "lsaRouterNumber",
2832 ospf_lsdb_count(area->lsdb, OSPF_ROUTER_LSA));
2833 json_object_int_add(
2834 json_area, "lsaRouterChecksum",
2835 ospf_lsdb_checksum(area->lsdb, OSPF_ROUTER_LSA));
2836 json_object_int_add(
2837 json_area, "lsaNetworkNumber",
2838 ospf_lsdb_count(area->lsdb, OSPF_NETWORK_LSA));
2839 json_object_int_add(
2840 json_area, "lsaNetworkChecksum",
2841 ospf_lsdb_checksum(area->lsdb, OSPF_NETWORK_LSA));
2842 json_object_int_add(
2843 json_area, "lsaSummaryNumber",
2844 ospf_lsdb_count(area->lsdb, OSPF_SUMMARY_LSA));
2845 json_object_int_add(
2846 json_area, "lsaSummaryChecksum",
2847 ospf_lsdb_checksum(area->lsdb, OSPF_SUMMARY_LSA));
2848 json_object_int_add(
2849 json_area, "lsaAsbrNumber",
2850 ospf_lsdb_count(area->lsdb, OSPF_ASBR_SUMMARY_LSA));
2851 json_object_int_add(
2852 json_area, "lsaAsbrChecksum",
2853 ospf_lsdb_checksum(area->lsdb, OSPF_ASBR_SUMMARY_LSA));
2854 json_object_int_add(
2855 json_area, "lsaNssaNumber",
2856 ospf_lsdb_count(area->lsdb, OSPF_AS_NSSA_LSA));
2857 json_object_int_add(
2858 json_area, "lsaNssaChecksum",
2859 ospf_lsdb_checksum(area->lsdb, OSPF_AS_NSSA_LSA));
2860 } else {
2861 /* Show number of fully adjacent neighbors. */
2862 vty_out(vty,
2863 " Number of fully adjacent neighbors in this area:"
2864 " %d\n",
2865 area->full_nbrs);
2866
2867 /* Show authentication type. */
2868 vty_out(vty, " Area has ");
2869 if (area->auth_type == OSPF_AUTH_NULL)
2870 vty_out(vty, "no authentication\n");
2871 else if (area->auth_type == OSPF_AUTH_SIMPLE)
2872 vty_out(vty, "simple password authentication\n");
2873 else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2874 vty_out(vty, "message digest authentication\n");
2875
2876 if (!OSPF_IS_AREA_BACKBONE(area))
2877 vty_out(vty,
2878 " Number of full virtual adjacencies going through"
2879 " this area: %d\n",
2880 area->full_vls);
2881
2882 /* Show SPF calculation times. */
2883 vty_out(vty, " SPF algorithm executed %d times\n",
2884 area->spf_calculation);
2885
2886 /* Show number of LSA. */
2887 vty_out(vty, " Number of LSA %ld\n", area->lsdb->total);
2888 vty_out(vty,
2889 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
2890 ospf_lsdb_count(area->lsdb, OSPF_ROUTER_LSA),
2891 ospf_lsdb_checksum(area->lsdb, OSPF_ROUTER_LSA));
2892 vty_out(vty,
2893 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
2894 ospf_lsdb_count(area->lsdb, OSPF_NETWORK_LSA),
2895 ospf_lsdb_checksum(area->lsdb, OSPF_NETWORK_LSA));
2896 vty_out(vty,
2897 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
2898 ospf_lsdb_count(area->lsdb, OSPF_SUMMARY_LSA),
2899 ospf_lsdb_checksum(area->lsdb, OSPF_SUMMARY_LSA));
2900 vty_out(vty,
2901 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
2902 ospf_lsdb_count(area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2903 ospf_lsdb_checksum(area->lsdb, OSPF_ASBR_SUMMARY_LSA));
2904 vty_out(vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
2905 ospf_lsdb_count(area->lsdb, OSPF_AS_NSSA_LSA),
2906 ospf_lsdb_checksum(area->lsdb, OSPF_AS_NSSA_LSA));
2907 }
2908
2909 if (use_json) {
2910 json_object_int_add(
2911 json_area, "lsaOpaqueLinkNumber",
2912 ospf_lsdb_count(area->lsdb, OSPF_OPAQUE_LINK_LSA));
2913 json_object_int_add(
2914 json_area, "lsaOpaqueLinkChecksum",
2915 ospf_lsdb_checksum(area->lsdb, OSPF_OPAQUE_LINK_LSA));
2916 json_object_int_add(
2917 json_area, "lsaOpaqueAreaNumber",
2918 ospf_lsdb_count(area->lsdb, OSPF_OPAQUE_AREA_LSA));
2919 json_object_int_add(
2920 json_area, "lsaOpaqueAreaChecksum",
2921 ospf_lsdb_checksum(area->lsdb, OSPF_OPAQUE_AREA_LSA));
2922 } else {
2923 vty_out(vty,
2924 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
2925 ospf_lsdb_count(area->lsdb, OSPF_OPAQUE_LINK_LSA),
2926 ospf_lsdb_checksum(area->lsdb, OSPF_OPAQUE_LINK_LSA));
2927 vty_out(vty,
2928 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
2929 ospf_lsdb_count(area->lsdb, OSPF_OPAQUE_AREA_LSA),
2930 ospf_lsdb_checksum(area->lsdb, OSPF_OPAQUE_AREA_LSA));
2931 }
718e3744 2932
d62a17ae 2933 if (use_json)
2934 json_object_object_add(json_areas, inet_ntoa(area->area_id),
2935 json_area);
2936 else
2937 vty_out(vty, "\n");
718e3744 2938}
2939
d62a17ae 2940static int show_ip_ospf_common(struct vty *vty, struct ospf *ospf,
d7c0a89a 2941 json_object *json, uint8_t use_vrf)
d62a17ae 2942{
2943 struct listnode *node, *nnode;
2944 struct ospf_area *area;
2945 struct timeval result;
2946 char timebuf[OSPF_TIME_DUMP_SIZE];
b1c3ae8c 2947 json_object *json_vrf = NULL;
d62a17ae 2948 json_object *json_areas = NULL;
718e3744 2949
b1c3ae8c
CS
2950 if (json) {
2951 if (use_vrf)
2952 json_vrf = json_object_new_object();
2953 else
2954 json_vrf = json;
d62a17ae 2955 json_areas = json_object_new_object();
2956 }
2957
2958 if (ospf->instance) {
b1c3ae8c 2959 if (json) {
d62a17ae 2960 json_object_int_add(json, "ospfInstance",
2961 ospf->instance);
2962 } else {
2963 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
2964 }
2965 }
2966
b1c3ae8c 2967 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
87bd50e8 2968
d62a17ae 2969 /* Show Router ID. */
b1c3ae8c
CS
2970 if (json) {
2971 json_object_string_add(json_vrf, "routerId",
d62a17ae 2972 inet_ntoa(ospf->router_id));
2973 } else {
2974 vty_out(vty, " OSPF Routing Process, Router ID: %s\n",
2975 inet_ntoa(ospf->router_id));
2976 }
2977
2978 /* Graceful shutdown */
2979 if (ospf->t_deferred_shutdown) {
b1c3ae8c 2980 if (json) {
d62a17ae 2981 long time_store;
2982 time_store =
2983 monotime_until(
2984 &ospf->t_deferred_shutdown->u.sands,
2985 NULL)
2986 / 1000LL;
b1c3ae8c 2987 json_object_int_add(json_vrf, "deferredShutdownMsecs",
d62a17ae 2988 time_store);
2989 } else {
2990 vty_out(vty,
2991 " Deferred shutdown in progress, %s remaining\n",
2992 ospf_timer_dump(ospf->t_deferred_shutdown,
2993 timebuf, sizeof(timebuf)));
2994 }
2995 }
2996
2997 /* Show capability. */
b1c3ae8c
CS
2998 if (json) {
2999 json_object_boolean_true_add(json_vrf, "tosRoutesOnly");
3000 json_object_boolean_true_add(json_vrf, "rfc2328Conform");
d62a17ae 3001 if (CHECK_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE)) {
b1c3ae8c 3002 json_object_boolean_true_add(json_vrf,
d62a17ae 3003 "rfc1583Compatibility");
3004 }
3005 } else {
3006 vty_out(vty, " Supports only single TOS (TOS0) routes\n");
3007 vty_out(vty, " This implementation conforms to RFC2328\n");
3008 vty_out(vty, " RFC1583Compatibility flag is %s\n",
3009 CHECK_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE)
3010 ? "enabled"
3011 : "disabled");
3012 }
3013
b1c3ae8c 3014 if (json) {
d62a17ae 3015 if (CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
b1c3ae8c 3016 json_object_boolean_true_add(json_vrf, "opaqueCapable");
d62a17ae 3017 }
3018 } else {
3019 vty_out(vty, " OpaqueCapability flag is %s\n",
3020 CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)
3021 ? "enabled"
3022 : "disabled");
3023 }
3024
3025 /* Show stub-router configuration */
3026 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
3027 || ospf->stub_router_shutdown_time
3028 != OSPF_STUB_ROUTER_UNCONFIGURED) {
b1c3ae8c
CS
3029 if (json) {
3030 json_object_boolean_true_add(json_vrf,
3031 "stubAdvertisement");
d62a17ae 3032 if (ospf->stub_router_startup_time
3033 != OSPF_STUB_ROUTER_UNCONFIGURED)
3034 json_object_int_add(
50ad4b42
MS
3035 json_vrf, "postStartEnabledSecs",
3036 ospf->stub_router_startup_time);
d62a17ae 3037 if (ospf->stub_router_shutdown_time
3038 != OSPF_STUB_ROUTER_UNCONFIGURED)
3039 json_object_int_add(
50ad4b42
MS
3040 json_vrf, "preShutdownEnabledSecs",
3041 ospf->stub_router_shutdown_time);
d62a17ae 3042 } else {
3043 vty_out(vty,
3044 " Stub router advertisement is configured\n");
3045 if (ospf->stub_router_startup_time
3046 != OSPF_STUB_ROUTER_UNCONFIGURED)
3047 vty_out(vty,
3048 " Enabled for %us after start-up\n",
3049 ospf->stub_router_startup_time);
3050 if (ospf->stub_router_shutdown_time
3051 != OSPF_STUB_ROUTER_UNCONFIGURED)
3052 vty_out(vty,
3053 " Enabled for %us prior to full shutdown\n",
3054 ospf->stub_router_shutdown_time);
3055 }
3056 }
3057
3058 /* Show SPF timers. */
b1c3ae8c
CS
3059 if (json) {
3060 json_object_int_add(json_vrf, "spfScheduleDelayMsecs",
d62a17ae 3061 ospf->spf_delay);
b1c3ae8c 3062 json_object_int_add(json_vrf, "holdtimeMinMsecs",
d62a17ae 3063 ospf->spf_holdtime);
b1c3ae8c 3064 json_object_int_add(json_vrf, "holdtimeMaxMsecs",
d62a17ae 3065 ospf->spf_max_holdtime);
b1c3ae8c 3066 json_object_int_add(json_vrf, "holdtimeMultplier",
d62a17ae 3067 ospf->spf_hold_multiplier);
3068 } else {
3069 vty_out(vty,
3070 " Initial SPF scheduling delay %d millisec(s)\n"
3071 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3072 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3073 " Hold time multiplier is currently %d\n",
3074 ospf->spf_delay, ospf->spf_holdtime,
3075 ospf->spf_max_holdtime, ospf->spf_hold_multiplier);
3076 }
3077
b1c3ae8c 3078 if (json) {
d62a17ae 3079 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec) {
3080 long time_store = 0;
3081
3082 time_store =
3083 monotime_since(&ospf->ts_spf, NULL) / 1000LL;
b1c3ae8c 3084 json_object_int_add(json_vrf, "spfLastExecutedMsecs",
d62a17ae 3085 time_store);
3086
3087 time_store = (1000 * ospf->ts_spf_duration.tv_sec)
3088 + (ospf->ts_spf_duration.tv_usec / 1000);
b1c3ae8c 3089 json_object_int_add(json_vrf, "spfLastDurationMsecs",
d62a17ae 3090 time_store);
3091 } else
b1c3ae8c 3092 json_object_boolean_true_add(json_vrf, "spfHasNotRun");
d62a17ae 3093 } else {
3094 vty_out(vty, " SPF algorithm ");
3095 if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec) {
3096 monotime_since(&ospf->ts_spf, &result);
3097 vty_out(vty, "last executed %s ago\n",
3098 ospf_timeval_dump(&result, timebuf,
3099 sizeof(timebuf)));
3100 vty_out(vty, " Last SPF duration %s\n",
3101 ospf_timeval_dump(&ospf->ts_spf_duration,
3102 timebuf, sizeof(timebuf)));
3103 } else
3104 vty_out(vty, "has not been run\n");
3105 }
3106
b1c3ae8c 3107 if (json) {
d62a17ae 3108 if (ospf->t_spf_calc) {
3109 long time_store;
3110 time_store =
3111 monotime_until(&ospf->t_spf_calc->u.sands, NULL)
3112 / 1000LL;
b1c3ae8c 3113 json_object_int_add(json_vrf, "spfTimerDueInMsecs",
d62a17ae 3114 time_store);
3115 }
3116
b1c3ae8c 3117 json_object_int_add(json_vrf, "lsaMinIntervalMsecs",
d62a17ae 3118 ospf->min_ls_interval);
b1c3ae8c 3119 json_object_int_add(json_vrf, "lsaMinArrivalMsecs",
d62a17ae 3120 ospf->min_ls_arrival);
3121 /* Show write multiplier values */
b1c3ae8c 3122 json_object_int_add(json_vrf, "writeMultiplier",
d62a17ae 3123 ospf->write_oi_count);
3124 /* Show refresh parameters. */
b1c3ae8c 3125 json_object_int_add(json_vrf, "refreshTimerMsecs",
d62a17ae 3126 ospf->lsa_refresh_interval * 1000);
3127 } else {
3128 vty_out(vty, " SPF timer %s%s\n",
3129 (ospf->t_spf_calc ? "due in " : "is "),
3130 ospf_timer_dump(ospf->t_spf_calc, timebuf,
3131 sizeof(timebuf)));
3132
3133 vty_out(vty, " LSA minimum interval %d msecs\n",
3134 ospf->min_ls_interval);
3135 vty_out(vty, " LSA minimum arrival %d msecs\n",
3136 ospf->min_ls_arrival);
3137
3138 /* Show write multiplier values */
3139 vty_out(vty, " Write Multiplier set to %d \n",
3140 ospf->write_oi_count);
3141
3142 /* Show refresh parameters. */
3143 vty_out(vty, " Refresh timer %d secs\n",
3144 ospf->lsa_refresh_interval);
3145 }
3146
3147 /* Show ABR/ASBR flags. */
3148 if (CHECK_FLAG(ospf->flags, OSPF_FLAG_ABR)) {
b1c3ae8c 3149 if (json)
d62a17ae 3150 json_object_string_add(
b1c3ae8c 3151 json_vrf, "abrType",
d62a17ae 3152 ospf_abr_type_descr_str[ospf->abr_type]);
3153 else
3154 vty_out(vty,
3155 " This router is an ABR, ABR type is: %s\n",
3156 ospf_abr_type_descr_str[ospf->abr_type]);
3157 }
3158 if (CHECK_FLAG(ospf->flags, OSPF_FLAG_ASBR)) {
b1c3ae8c 3159 if (json)
d62a17ae 3160 json_object_string_add(
b1c3ae8c 3161 json_vrf, "asbrRouter",
d62a17ae 3162 "injectingExternalRoutingInformation");
3163 else
3164 vty_out(vty,
3165 " This router is an ASBR "
3166 "(injecting external routing information)\n");
3167 }
3168
3169 /* Show Number of AS-external-LSAs. */
b1c3ae8c 3170 if (json) {
d62a17ae 3171 json_object_int_add(
b1c3ae8c 3172 json_vrf, "lsaExternalCounter",
d62a17ae 3173 ospf_lsdb_count(ospf->lsdb, OSPF_AS_EXTERNAL_LSA));
3174 json_object_int_add(
b1c3ae8c 3175 json_vrf, "lsaExternalChecksum",
d62a17ae 3176 ospf_lsdb_checksum(ospf->lsdb, OSPF_AS_EXTERNAL_LSA));
3177 } else {
3178 vty_out(vty,
3179 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3180 ospf_lsdb_count(ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
3181 ospf_lsdb_checksum(ospf->lsdb, OSPF_AS_EXTERNAL_LSA));
3182 }
3183
b1c3ae8c 3184 if (json) {
d62a17ae 3185 json_object_int_add(
b1c3ae8c 3186 json_vrf, "lsaAsopaqueCounter",
d62a17ae 3187 ospf_lsdb_count(ospf->lsdb, OSPF_OPAQUE_AS_LSA));
3188 json_object_int_add(
b1c3ae8c 3189 json_vrf, "lsaAsOpaqueChecksum",
d62a17ae 3190 ospf_lsdb_checksum(ospf->lsdb, OSPF_OPAQUE_AS_LSA));
3191 } else {
3192 vty_out(vty,
3193 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3194 ospf_lsdb_count(ospf->lsdb, OSPF_OPAQUE_AS_LSA),
3195 ospf_lsdb_checksum(ospf->lsdb, OSPF_OPAQUE_AS_LSA));
3196 }
3197
3198 /* Show number of areas attached. */
b1c3ae8c
CS
3199 if (json)
3200 json_object_int_add(json_vrf, "attachedAreaCounter",
d62a17ae 3201 listcount(ospf->areas));
3202 else
3203 vty_out(vty, " Number of areas attached to this router: %d\n",
3204 listcount(ospf->areas));
3205
3206 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES)) {
3207 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL)) {
b1c3ae8c 3208 if (json)
d62a17ae 3209 json_object_boolean_true_add(
b1c3ae8c 3210 json_vrf, "adjacencyChangesLoggedAll");
d62a17ae 3211 else
3212 vty_out(vty,
3213 " All adjacency changes are logged\n");
3214 } else {
b1c3ae8c 3215 if (json)
d62a17ae 3216 json_object_boolean_true_add(
b1c3ae8c 3217 json_vrf, "adjacencyChangesLogged");
d62a17ae 3218 else
3219 vty_out(vty, " Adjacency changes are logged\n");
3220 }
3221 }
3222 /* Show each area status. */
3223 for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
b1c3ae8c
CS
3224 show_ip_ospf_area(vty, area, json_areas, json ? 1 : 0);
3225
3226 if (json) {
3227 if (use_vrf) {
3228 json_object_object_add(json_vrf, "areas", json_areas);
3229 if (ospf->vrf_id == VRF_DEFAULT)
3230 json_object_object_add(json, "default",
3231 json_vrf);
3232 else
3233 json_object_object_add(json, ospf->name,
3234 json_vrf);
3235 } else {
3236 json_object_object_add(json, "areas", json_areas);
3237 }
d62a17ae 3238 } else
3239 vty_out(vty, "\n");
3240
3241 return CMD_SUCCESS;
718e3744 3242}
3243
7c8ff89e
DS
3244DEFUN (show_ip_ospf,
3245 show_ip_ospf_cmd,
b5a8894d 3246 "show ip ospf [vrf <NAME|all>] [json]",
7c8ff89e
DS
3247 SHOW_STR
3248 IP_STR
ca08c43d 3249 "OSPF information\n"
b5a8894d
CS
3250 VRF_CMD_HELP_STR
3251 "All VRFs\n"
9973d184 3252 JSON_STR)
7c8ff89e 3253{
d62a17ae 3254 struct ospf *ospf;
9f049418 3255 bool uj = use_json(argc, argv);
b5a8894d
CS
3256 struct listnode *node = NULL;
3257 char *vrf_name = NULL;
2951a7a4 3258 bool all_vrf = false;
b5a8894d
CS
3259 int ret = CMD_SUCCESS;
3260 int inst = 0;
3261 int idx_vrf = 0;
b1c3ae8c 3262 json_object *json = NULL;
d7c0a89a 3263 uint8_t use_vrf = 0;
7c8ff89e 3264
b5a8894d 3265 if (listcount(om->ospf) == 0)
d62a17ae 3266 return CMD_SUCCESS;
7c8ff89e 3267
43b8d1d8 3268 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
b5a8894d 3269
b1c3ae8c
CS
3270 if (uj)
3271 json = json_object_new_object();
3272
996c9314 3273 /* vrf input is provided could be all or specific vrf*/
b5a8894d 3274 if (vrf_name) {
2951a7a4 3275 bool ospf_output = false;
874f58d8 3276
b1c3ae8c 3277 use_vrf = 1;
94d4c685 3278
b5a8894d
CS
3279 if (all_vrf) {
3280 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
3281 if (!ospf->oi_running)
3282 continue;
2951a7a4 3283 ospf_output = true;
b1c3ae8c
CS
3284 ret = show_ip_ospf_common(vty, ospf, json,
3285 use_vrf);
3286 }
3287 if (uj) {
3288 vty_out(vty, "%s\n",
996c9314
LB
3289 json_object_to_json_string_ext(
3290 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 3291 json_object_free(json);
9f049418
DS
3292 } else if (!ospf_output)
3293 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d
CS
3294 return ret;
3295 }
3296 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c 3297 if ((ospf == NULL) || !ospf->oi_running) {
9f049418
DS
3298 if (uj) {
3299 vty_out(vty, "%s\n",
3300 json_object_to_json_string_ext(
3301 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 3302 json_object_free(json);
9f049418 3303 } else
94d4c685 3304 vty_out(vty, "%% OSPF instance not found\n");
9f049418 3305
b5a8894d 3306 return CMD_SUCCESS;
b1c3ae8c 3307 }
b5a8894d
CS
3308 } else {
3309 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
3310 /* Display default ospf (instance 0) info */
b1c3ae8c 3311 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
3312 if (uj) {
3313 vty_out(vty, "%s\n",
3314 json_object_to_json_string_ext(
3315 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 3316 json_object_free(json);
9f049418 3317 } else
94d4c685 3318 vty_out(vty, "%% OSPF instance not found\n");
9f049418 3319
b5a8894d 3320 return CMD_SUCCESS;
b1c3ae8c 3321 }
b5a8894d
CS
3322 }
3323
996c9314 3324 if (ospf) {
b1c3ae8c
CS
3325 show_ip_ospf_common(vty, ospf, json, use_vrf);
3326 if (uj)
996c9314
LB
3327 vty_out(vty, "%s\n",
3328 json_object_to_json_string_ext(
3329 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
3330 }
3331
3332 if (uj)
3333 json_object_free(json);
b5a8894d
CS
3334
3335 return ret;
7c8ff89e
DS
3336}
3337
3338DEFUN (show_ip_ospf_instance,
3339 show_ip_ospf_instance_cmd,
6147e2c6 3340 "show ip ospf (1-65535) [json]",
7c8ff89e
DS
3341 SHOW_STR
3342 IP_STR
3343 "OSPF information\n"
ca08c43d 3344 "Instance ID\n"
9973d184 3345 JSON_STR)
7c8ff89e 3346{
d62a17ae 3347 int idx_number = 3;
3348 struct ospf *ospf;
d7c0a89a 3349 unsigned short instance = 0;
9f049418 3350 bool uj = use_json(argc, argv);
b1c3ae8c
CS
3351 int ret = CMD_SUCCESS;
3352 json_object *json = NULL;
d62a17ae 3353
3354 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
3355 ospf = ospf_lookup_instance(instance);
3356 if (ospf == NULL)
3357 return CMD_NOT_MY_INSTANCE;
3358
3359 if (!ospf->oi_running)
d62a17ae 3360 return CMD_SUCCESS;
3361
b1c3ae8c
CS
3362 if (uj)
3363 json = json_object_new_object();
3364
3365 ret = show_ip_ospf_common(vty, ospf, json, 0);
3366
3367 if (uj) {
996c9314
LB
3368 vty_out(vty, "%s\n", json_object_to_json_string_ext(
3369 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
3370 json_object_free(json);
3371 }
3372
3373 return ret;
d62a17ae 3374}
3375
3376static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf,
3377 struct interface *ifp,
3378 json_object *json_interface_sub,
9f049418 3379 bool use_json)
d62a17ae 3380{
3381 int is_up;
3382 struct ospf_neighbor *nbr;
3383 struct route_node *rn;
3384 uint32_t bandwidth = ifp->bandwidth ? ifp->bandwidth : ifp->speed;
3385
3386 /* Is interface up? */
3387 if (use_json) {
3388 is_up = if_is_operative(ifp);
3389 if (is_up)
3390 json_object_boolean_true_add(json_interface_sub,
3391 "ifUp");
3392 else
3393 json_object_boolean_false_add(json_interface_sub,
3394 "ifDown");
3395
3396 json_object_int_add(json_interface_sub, "ifIndex",
3397 ifp->ifindex);
3398 json_object_int_add(json_interface_sub, "mtuBytes", ifp->mtu);
3399 json_object_int_add(json_interface_sub, "bandwidthMbit",
3400 bandwidth);
3401 json_object_string_add(json_interface_sub, "ifFlags",
3402 if_flag_dump(ifp->flags));
3403 } else {
3404 vty_out(vty, "%s is %s\n", ifp->name,
3405 ((is_up = if_is_operative(ifp)) ? "up" : "down"));
3406 vty_out(vty, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3407 ifp->ifindex, ifp->mtu, bandwidth,
3408 if_flag_dump(ifp->flags));
3409 }
7c8ff89e 3410
d62a17ae 3411 /* Is interface OSPF enabled? */
3412 if (use_json) {
3413 if (ospf_oi_count(ifp) == 0) {
3414 json_object_boolean_false_add(json_interface_sub,
3415 "ospfEnabled");
3416 return;
3417 } else if (!is_up) {
3418 json_object_boolean_false_add(json_interface_sub,
3419 "ospfRunning");
3420 return;
3421 } else
3422 json_object_boolean_true_add(json_interface_sub,
3423 "ospfEnabled");
3424 } else {
3425 if (ospf_oi_count(ifp) == 0) {
3426 vty_out(vty, " OSPF not enabled on this interface\n");
3427 return;
3428 } else if (!is_up) {
3429 vty_out(vty,
3430 " OSPF is enabled, but not running on this interface\n");
3431 return;
3432 }
3433 }
3434
3435 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
3436 struct ospf_interface *oi = rn->info;
3437
3438 if (oi == NULL)
3439 continue;
3440
3441 if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED)) {
3442 if (use_json)
3443 json_object_boolean_true_add(json_interface_sub,
3444 "ifUnnumbered");
3445 else
3446 vty_out(vty, " This interface is UNNUMBERED,");
3447 } else {
0f3af738
JW
3448 struct in_addr dest;
3449 const char *dstr;
3450
d62a17ae 3451 /* Show OSPF interface information. */
3452 if (use_json) {
3453 json_object_string_add(
3454 json_interface_sub, "ipAddress",
3455 inet_ntoa(oi->address->u.prefix4));
3456 json_object_int_add(json_interface_sub,
3457 "ipAddressPrefixlen",
3458 oi->address->prefixlen);
3459 } else
3460 vty_out(vty, " Internet Address %s/%d,",
3461 inet_ntoa(oi->address->u.prefix4),
3462 oi->address->prefixlen);
3463
0f3af738
JW
3464 /* For Vlinks, showing the peer address is
3465 * probably more informative than the local
3466 * interface that is being used */
3467 if (oi->type == OSPF_IFTYPE_VIRTUALLINK) {
3468 dstr = "Peer";
3469 dest = oi->vl_data->peer_addr;
3470 } else if (CONNECTED_PEER(oi->connected)
3471 && oi->connected->destination) {
3472 dstr = "Peer";
3473 dest = oi->connected->destination->u.prefix4;
3474 } else {
3475 dstr = "Broadcast";
3476 dest.s_addr = ipv4_broadcast_addr(
3477 oi->connected->address->u.prefix4.s_addr,
3478 oi->connected->address->prefixlen);
3479 }
d62a17ae 3480
0f3af738
JW
3481 if (use_json) {
3482 json_object_string_add(
3483 json_interface_sub,
3484 "ospfIfType", dstr);
d62a17ae 3485 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
0f3af738
JW
3486 json_object_string_add(
3487 json_interface_sub,
3488 "vlinkPeer",
3489 inet_ntoa(dest));
d62a17ae 3490 else
d62a17ae 3491 json_object_string_add(
3492 json_interface_sub,
0f3af738
JW
3493 "localIfUsed",
3494 inet_ntoa(dest));
3495 } else
3496 vty_out(vty, " %s %s,", dstr,
3497 inet_ntoa(dest));
d62a17ae 3498 }
3499 if (use_json) {
3500 json_object_string_add(json_interface_sub, "area",
3501 ospf_area_desc_string(oi->area));
3502 if (OSPF_IF_PARAM(oi, mtu_ignore))
3503 json_object_boolean_true_add(
3504 json_interface_sub,
3505 "mtuMismatchDetect");
3506 json_object_string_add(json_interface_sub, "routerId",
3507 inet_ntoa(ospf->router_id));
3508 json_object_string_add(json_interface_sub,
3509 "networkType",
3510 ospf_network_type_str[oi->type]);
3511 json_object_int_add(json_interface_sub, "cost",
3512 oi->output_cost);
3513 json_object_int_add(
50ad4b42
MS
3514 json_interface_sub, "transmitDelaySecs",
3515 OSPF_IF_PARAM(oi, transmit_delay));
d62a17ae 3516 json_object_string_add(json_interface_sub, "state",
3517 lookup_msg(ospf_ism_state_msg,
3518 oi->state, NULL));
3519 json_object_int_add(json_interface_sub, "priority",
3520 PRIORITY(oi));
3521 } else {
3522 vty_out(vty, " Area %s\n",
3523 ospf_area_desc_string(oi->area));
3524
3525 vty_out(vty, " MTU mismatch detection: %s\n",
3526 OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled"
3527 : "enabled");
3528
3529 vty_out(vty,
3530 " Router ID %s, Network Type %s, Cost: %d\n",
3531 inet_ntoa(ospf->router_id),
3532 ospf_network_type_str[oi->type],
3533 oi->output_cost);
3534
3535 vty_out(vty,
3536 " Transmit Delay is %d sec, State %s, Priority %d\n",
3537 OSPF_IF_PARAM(oi, transmit_delay),
3538 lookup_msg(ospf_ism_state_msg, oi->state, NULL),
3539 PRIORITY(oi));
3540 }
3541
3542 /* Show DR information. */
3543 if (DR(oi).s_addr == 0) {
3544 if (!use_json)
3545 vty_out(vty,
3546 " No backup designated router on this network\n");
3547 } else {
3548 nbr = ospf_nbr_lookup_by_addr(oi->nbrs, &BDR(oi));
3549 if (nbr == NULL) {
3550 if (!use_json)
3551 vty_out(vty,
3552 " No backup designated router on this network\n");
3553 } else {
3554 if (use_json) {
3555 json_object_string_add(
3556 json_interface_sub, "bdrId",
3557 inet_ntoa(nbr->router_id));
3558 json_object_string_add(
3559 json_interface_sub,
3560 "bdrAddress",
3561 inet_ntoa(nbr->address.u
3562 .prefix4));
3563 } else {
3564 vty_out(vty,
3565 " Backup Designated Router (ID) %s,",
3566 inet_ntoa(nbr->router_id));
3567 vty_out(vty, " Interface Address %s\n",
3568 inet_ntoa(nbr->address.u
3569 .prefix4));
3570 }
3571 }
3572 }
3573
3574 /* Next network-LSA sequence number we'll use, if we're elected
3575 * DR */
3576 if (oi->params
3577 && ntohl(oi->params->network_lsa_seqnum)
3578 != OSPF_INITIAL_SEQUENCE_NUMBER) {
3579 if (use_json)
3580 json_object_int_add(
3581 json_interface_sub,
3582 "networkLsaSequence",
3583 ntohl(oi->params->network_lsa_seqnum));
3584 else
3585 vty_out(vty,
3586 " Saved Network-LSA sequence number 0x%x\n",
3587 ntohl(oi->params->network_lsa_seqnum));
3588 }
3589
3590 if (use_json) {
3591 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
3592 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS)) {
3593 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
3594 json_object_boolean_true_add(
3595 json_interface_sub,
3596 "mcastMemberOspfAllRouters");
3597 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
3598 json_object_boolean_true_add(
3599 json_interface_sub,
3600 "mcastMemberOspfDesignatedRouters");
3601 }
3602 } else {
3603 vty_out(vty, " Multicast group memberships:");
3604 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
3605 || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS)) {
3606 if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
3607 vty_out(vty, " OSPFAllRouters");
3608 if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
3609 vty_out(vty, " OSPFDesignatedRouters");
3610 } else
3611 vty_out(vty, " <None>");
3612 vty_out(vty, "\n");
3613 }
3614
3615 if (use_json) {
3616 if (OSPF_IF_PARAM(oi, fast_hello) == 0)
3617 json_object_int_add(
3618 json_interface_sub, "timerMsecs",
50ad4b42 3619 OSPF_IF_PARAM(oi, v_hello) * 1000);
d62a17ae 3620 else
3621 json_object_int_add(
3622 json_interface_sub, "timerMsecs",
50ad4b42 3623 1000 / OSPF_IF_PARAM(oi, fast_hello));
d62a17ae 3624 json_object_int_add(json_interface_sub,
50ad4b42
MS
3625 "timerDeadSecs",
3626 OSPF_IF_PARAM(oi, v_wait));
d62a17ae 3627 json_object_int_add(json_interface_sub,
50ad4b42
MS
3628 "timerWaitSecs",
3629 OSPF_IF_PARAM(oi, v_wait));
d62a17ae 3630 json_object_int_add(
50ad4b42
MS
3631 json_interface_sub, "timerRetransmitSecs",
3632 OSPF_IF_PARAM(oi, retransmit_interval));
d62a17ae 3633 } else {
3634 vty_out(vty, " Timer intervals configured,");
3635 vty_out(vty, " Hello ");
3636 if (OSPF_IF_PARAM(oi, fast_hello) == 0)
3637 vty_out(vty, "%ds,",
3638 OSPF_IF_PARAM(oi, v_hello));
3639 else
3640 vty_out(vty, "%dms,",
3641 1000 / OSPF_IF_PARAM(oi, fast_hello));
3642 vty_out(vty, " Dead %ds, Wait %ds, Retransmit %d\n",
3643 OSPF_IF_PARAM(oi, v_wait),
3644 OSPF_IF_PARAM(oi, v_wait),
3645 OSPF_IF_PARAM(oi, retransmit_interval));
3646 }
3647
3648 if (OSPF_IF_PASSIVE_STATUS(oi) == OSPF_IF_ACTIVE) {
3649 char timebuf[OSPF_TIME_DUMP_SIZE];
3650 if (use_json) {
3651 long time_store = 0;
3652 if (oi->t_hello)
3653 time_store =
3654 monotime_until(
3655 &oi->t_hello->u.sands,
3656 NULL)
3657 / 1000LL;
3658 json_object_int_add(json_interface_sub,
3659 "timerHelloInMsecs",
3660 time_store);
3661 } else
3662 vty_out(vty, " Hello due in %s\n",
3663 ospf_timer_dump(oi->t_hello, timebuf,
3664 sizeof(timebuf)));
3665 } else /* passive-interface is set */
3666 {
3667 if (use_json)
3668 json_object_boolean_true_add(
3669 json_interface_sub,
3670 "timerPassiveIface");
3671 else
3672 vty_out(vty,
3673 " No Hellos (Passive interface)\n");
3674 }
7c8ff89e 3675
d62a17ae 3676 if (use_json) {
3677 json_object_int_add(json_interface_sub, "nbrCount",
3678 ospf_nbr_count(oi, 0));
3679 json_object_int_add(json_interface_sub,
3680 "nbrAdjacentCount",
3681 ospf_nbr_count(oi, NSM_Full));
3682 } else
3683 vty_out(vty,
3684 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3685 ospf_nbr_count(oi, 0),
3686 ospf_nbr_count(oi, NSM_Full));
3687 ospf_bfd_interface_show(vty, ifp, json_interface_sub, use_json);
3688 }
718e3744 3689}
3690
d62a17ae 3691static int show_ip_ospf_interface_common(struct vty *vty, struct ospf *ospf,
d7c0a89a 3692 char *intf_name, uint8_t use_vrf,
9f049418 3693 json_object *json, bool use_json)
d62a17ae 3694{
3695 struct interface *ifp;
f4e14fdb 3696 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
6282e124 3697 json_object *json_vrf = NULL;
7dab10ce 3698 json_object *json_interface_sub = NULL, *json_interface = NULL;
7c8ff89e 3699
d62a17ae 3700 if (use_json) {
b1c3ae8c
CS
3701 if (use_vrf)
3702 json_vrf = json_object_new_object();
3703 else
3704 json_vrf = json;
6282e124 3705 json_interface = json_object_new_object();
d62a17ae 3706 }
3707
3708 if (ospf->instance) {
3709 if (use_json)
3710 json_object_int_add(json, "ospfInstance",
3711 ospf->instance);
3712 else
3713 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
3714 }
3715
b1c3ae8c
CS
3716 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
3717
3718 if (intf_name == NULL) {
d62a17ae 3719 /* Show All Interfaces.*/
451fda4f 3720 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 3721 if (ospf_oi_count(ifp)) {
7dab10ce 3722 if (use_json) {
d62a17ae 3723 json_interface_sub =
3724 json_object_new_object();
7dab10ce 3725 }
d62a17ae 3726 show_ip_ospf_interface_sub(vty, ospf, ifp,
3727 json_interface_sub,
3728 use_json);
3729
7dab10ce 3730 if (use_json) {
d62a17ae 3731 json_object_object_add(
7dab10ce 3732 json_interface, ifp->name,
d62a17ae 3733 json_interface_sub);
7dab10ce 3734 }
d62a17ae 3735 }
3736 }
6282e124
CS
3737 if (use_json)
3738 json_object_object_add(json_vrf, "interfaces",
996c9314 3739 json_interface);
d62a17ae 3740 } else {
3741 /* Interface name is specified. */
a36898e7 3742 ifp = if_lookup_by_name(intf_name, ospf->vrf_id);
b1c3ae8c 3743 if (ifp == NULL) {
d62a17ae 3744 if (use_json)
b1c3ae8c 3745 json_object_boolean_true_add(json_vrf,
d62a17ae 3746 "noSuchIface");
3747 else
3748 vty_out(vty, "No such interface name\n");
3749 } else {
7dab10ce 3750 if (use_json) {
d62a17ae 3751 json_interface_sub = json_object_new_object();
7dab10ce 3752 json_interface = json_object_new_object();
7dab10ce 3753 }
d62a17ae 3754
3755 show_ip_ospf_interface_sub(
3756 vty, ospf, ifp, json_interface_sub, use_json);
3757
7dab10ce 3758 if (use_json) {
7dab10ce
CS
3759 json_object_object_add(json_interface,
3760 ifp->name,
d62a17ae 3761 json_interface_sub);
6282e124
CS
3762 json_object_object_add(json_vrf, "interfaces",
3763 json_interface);
7dab10ce 3764 }
d62a17ae 3765 }
3766 }
3767
3768 if (use_json) {
b1c3ae8c
CS
3769 if (use_vrf) {
3770 if (ospf->vrf_id == VRF_DEFAULT)
3771 json_object_object_add(json, "default",
3772 json_vrf);
3773 else
3774 json_object_object_add(json, ospf->name,
3775 json_vrf);
3776 }
d62a17ae 3777 } else
3778 vty_out(vty, "\n");
3779
3780 return CMD_SUCCESS;
718e3744 3781}
3782
c9339663
CS
3783static void show_ip_ospf_interface_traffic_sub(struct vty *vty,
3784 struct ospf_interface *oi,
3785 json_object *json_interface_sub,
9f049418 3786 bool use_json)
c9339663
CS
3787{
3788 if (use_json) {
996c9314
LB
3789 json_object_int_add(json_interface_sub, "ifIndex",
3790 oi->ifp->ifindex);
3791 json_object_int_add(json_interface_sub, "helloIn",
3792 oi->hello_in);
3793 json_object_int_add(json_interface_sub, "helloOut",
3794 oi->hello_out);
3795 json_object_int_add(json_interface_sub, "dbDescIn",
3796 oi->db_desc_in);
3797 json_object_int_add(json_interface_sub, "dbDescOut",
3798 oi->db_desc_out);
3799 json_object_int_add(json_interface_sub, "lsReqIn",
3800 oi->ls_req_in);
3801 json_object_int_add(json_interface_sub, "lsReqOut",
3802 oi->ls_req_out);
3803 json_object_int_add(json_interface_sub, "lsUpdIn",
3804 oi->ls_upd_in);
3805 json_object_int_add(json_interface_sub, "lsUpdOut",
3806 oi->ls_upd_out);
3807 json_object_int_add(json_interface_sub, "lsAckIn",
3808 oi->ls_ack_in);
3809 json_object_int_add(json_interface_sub, "lsAckOut",
3810 oi->ls_ack_out);
c9339663
CS
3811 } else {
3812 vty_out(vty,
3813 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
996c9314
LB
3814 oi->ifp->name, oi->hello_in, oi->hello_out,
3815 oi->db_desc_in, oi->db_desc_out, oi->ls_req_in,
3816 oi->ls_req_out, oi->ls_upd_in, oi->ls_upd_out,
c9339663
CS
3817 oi->ls_ack_in, oi->ls_ack_out);
3818 }
3819}
3820
3821/* OSPFv2 Packet Counters */
996c9314
LB
3822static int show_ip_ospf_interface_traffic_common(
3823 struct vty *vty, struct ospf *ospf, char *intf_name, json_object *json,
9f049418 3824 int display_once, uint8_t use_vrf, bool use_json)
c9339663
CS
3825{
3826 struct vrf *vrf = NULL;
3827 struct interface *ifp = NULL;
b1c3ae8c 3828 json_object *json_vrf = NULL;
c9339663
CS
3829 json_object *json_interface_sub = NULL;
3830
3831 if (!use_json && !display_once) {
3832 vty_out(vty, "\n");
996c9314
LB
3833 vty_out(vty, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface",
3834 " HELLO", " DB-Desc", " LS-Req", " LS-Update",
3835 " LS-Ack");
c9339663 3836 vty_out(vty, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
996c9314
LB
3837 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
3838 " Rx/Tx");
c9339663 3839 vty_out(vty,
996c9314 3840 "--------------------------------------------------------------------------------------------\n");
c9339663 3841 } else if (use_json) {
b1c3ae8c
CS
3842 if (use_vrf)
3843 json_vrf = json_object_new_object();
3844 else
3845 json_vrf = json;
c9339663
CS
3846 }
3847
b1c3ae8c
CS
3848 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
3849
c9339663
CS
3850 if (intf_name == NULL) {
3851 vrf = vrf_lookup_by_id(ospf->vrf_id);
3852 FOR_ALL_INTERFACES (vrf, ifp) {
3853 struct route_node *rn;
3854 struct ospf_interface *oi;
3855
3856 if (ospf_oi_count(ifp) == 0)
3857 continue;
3858
3859 for (rn = route_top(IF_OIFS(ifp)); rn;
996c9314 3860 rn = route_next(rn)) {
c9339663
CS
3861 oi = rn->info;
3862
3863 if (oi == NULL)
3864 continue;
3865
3866 if (use_json) {
3867 json_interface_sub =
3868 json_object_new_object();
3869 }
3870
996c9314
LB
3871 show_ip_ospf_interface_traffic_sub(
3872 vty, oi, json_interface_sub, use_json);
c9339663 3873 if (use_json) {
996c9314
LB
3874 json_object_object_add(
3875 json_vrf, ifp->name,
3876 json_interface_sub);
c9339663
CS
3877 }
3878 }
3879 }
3880 } else {
3881 /* Interface name is specified. */
a36898e7 3882 ifp = if_lookup_by_name(intf_name, ospf->vrf_id);
c9339663
CS
3883 if (ifp != NULL) {
3884 struct route_node *rn;
3885 struct ospf_interface *oi;
3886
3887 if (ospf_oi_count(ifp) == 0) {
996c9314
LB
3888 vty_out(vty,
3889 " OSPF not enabled on this interface %s\n",
c9339663
CS
3890 ifp->name);
3891 return CMD_SUCCESS;
3892 }
3893
3894 for (rn = route_top(IF_OIFS(ifp)); rn;
3895 rn = route_next(rn)) {
3896 oi = rn->info;
3897
3898 if (use_json) {
3899 json_interface_sub =
3900 json_object_new_object();
3901 }
3902
996c9314
LB
3903 show_ip_ospf_interface_traffic_sub(
3904 vty, oi, json_interface_sub, use_json);
c9339663 3905 if (use_json) {
996c9314
LB
3906 json_object_object_add(
3907 json_vrf, ifp->name,
3908 json_interface_sub);
c9339663
CS
3909 }
3910 }
3911 }
3912 }
3913
3914 if (use_json) {
b1c3ae8c
CS
3915 if (use_vrf) {
3916 if (ospf->vrf_id == VRF_DEFAULT)
3917 json_object_object_add(json, "default",
3918 json_vrf);
3919 else
3920 json_object_object_add(json, ospf->name,
3921 json_vrf);
3922 }
3923 } else
3924 vty_out(vty, "\n");
c9339663
CS
3925
3926 return CMD_SUCCESS;
3927}
3928
7c8ff89e
DS
3929DEFUN (show_ip_ospf_interface,
3930 show_ip_ospf_interface_cmd,
43b8d1d8 3931 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
7c8ff89e
DS
3932 SHOW_STR
3933 IP_STR
3934 "OSPF information\n"
b5a8894d 3935 VRF_CMD_HELP_STR
43b8d1d8 3936 "All VRFs\n"
7c8ff89e 3937 "Interface information\n"
7ec4159b 3938 "Interface name\n"
9973d184 3939 JSON_STR)
7c8ff89e 3940{
d62a17ae 3941 struct ospf *ospf;
9f049418 3942 bool uj = use_json(argc, argv);
b5a8894d 3943 struct listnode *node = NULL;
b1c3ae8c 3944 char *vrf_name = NULL, *intf_name = NULL;
2951a7a4 3945 bool all_vrf = false;
b5a8894d
CS
3946 int ret = CMD_SUCCESS;
3947 int inst = 0;
b1c3ae8c 3948 int idx_vrf = 0, idx_intf = 0;
d7c0a89a 3949 uint8_t use_vrf = 0;
b1c3ae8c 3950 json_object *json = NULL;
7c8ff89e 3951
43b8d1d8
CS
3952 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
3953
b1c3ae8c
CS
3954 if (argv_find(argv, argc, "INTERFACE", &idx_intf))
3955 intf_name = argv[idx_intf]->arg;
3956
d62a17ae 3957 if (uj)
b1c3ae8c 3958 json = json_object_new_object();
6be4da3d 3959
b5a8894d
CS
3960 /* vrf input is provided could be all or specific vrf*/
3961 if (vrf_name) {
b1c3ae8c 3962 use_vrf = 1;
b5a8894d
CS
3963 if (all_vrf) {
3964 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
3965 if (!ospf->oi_running)
3966 continue;
996c9314
LB
3967 ret = show_ip_ospf_interface_common(
3968 vty, ospf, intf_name, use_vrf, json,
3969 uj);
b5a8894d 3970 }
b1c3ae8c
CS
3971
3972 if (uj) {
3973 vty_out(vty, "%s\n",
996c9314
LB
3974 json_object_to_json_string_ext(
3975 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 3976 json_object_free(json);
9f049418 3977 } else if (!ospf)
94d4c685 3978 vty_out(vty, "%% OSPF instance not found\n");
b1c3ae8c 3979
b5a8894d
CS
3980 return ret;
3981 }
3982 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c 3983 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
3984 if (uj) {
3985 vty_out(vty, "%s\n",
3986 json_object_to_json_string_ext(
3987 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 3988 json_object_free(json);
9f049418 3989 } else
94d4c685 3990 vty_out(vty, "%% OSPF instance not found\n");
9f049418 3991
b5a8894d 3992 return CMD_SUCCESS;
b1c3ae8c
CS
3993 }
3994 ret = show_ip_ospf_interface_common(vty, ospf, intf_name,
3995 use_vrf, json, uj);
b5a8894d
CS
3996
3997 } else {
3998 /* Display default ospf (instance 0) info */
3999 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c 4000 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
4001 if (uj) {
4002 vty_out(vty, "%s\n",
4003 json_object_to_json_string_ext(
4004 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4005 json_object_free(json);
9f049418 4006 } else
94d4c685 4007 vty_out(vty, "%% OSPF instance not found\n");
9f049418 4008
b5a8894d 4009 return CMD_SUCCESS;
b1c3ae8c
CS
4010 }
4011 ret = show_ip_ospf_interface_common(vty, ospf, intf_name,
4012 use_vrf, json, uj);
4013 }
4014
4015 if (uj) {
996c9314
LB
4016 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4017 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4018 json_object_free(json);
b5a8894d
CS
4019 }
4020
4021 return ret;
7c8ff89e
DS
4022}
4023
4024DEFUN (show_ip_ospf_instance_interface,
4025 show_ip_ospf_instance_interface_cmd,
6147e2c6 4026 "show ip ospf (1-65535) interface [INTERFACE] [json]",
7c8ff89e
DS
4027 SHOW_STR
4028 IP_STR
4029 "OSPF information\n"
4030 "Instance ID\n"
4031 "Interface information\n"
7ec4159b 4032 "Interface name\n"
9973d184 4033 JSON_STR)
7c8ff89e 4034{
d62a17ae 4035 int idx_number = 3;
b1c3ae8c 4036 int idx_intf = 0;
d62a17ae 4037 struct ospf *ospf;
d7c0a89a 4038 unsigned short instance = 0;
9f049418 4039 bool uj = use_json(argc, argv);
b1c3ae8c
CS
4040 char *intf_name = NULL;
4041 int ret = CMD_SUCCESS;
4042 json_object *json = NULL;
d62a17ae 4043
4044 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
4045 ospf = ospf_lookup_instance(instance);
4046 if (ospf == NULL)
4047 return CMD_NOT_MY_INSTANCE;
4048
4049 if (!ospf->oi_running)
d62a17ae 4050 return CMD_SUCCESS;
4051
4052 if (uj)
b1c3ae8c
CS
4053 json = json_object_new_object();
4054
4055 if (argv_find(argv, argc, "INTERFACE", &idx_intf))
4056 intf_name = argv[idx_intf]->arg;
4057
4058 ret = show_ip_ospf_interface_common(vty, ospf, intf_name, 0, json, uj);
4059
4060 if (uj) {
996c9314
LB
4061 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4062 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
4063 json_object_free(json);
4064 }
d62a17ae 4065
b1c3ae8c 4066 return ret;
d62a17ae 4067}
4068
c9339663
CS
4069DEFUN (show_ip_ospf_interface_traffic,
4070 show_ip_ospf_interface_traffic_cmd,
4071 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4072 SHOW_STR
4073 IP_STR
4074 "OSPF information\n"
4075 VRF_CMD_HELP_STR
4076 "All VRFs\n"
4077 "Interface information\n"
4078 "Protocol Packet counters\n"
4079 "Interface name\n"
4080 JSON_STR)
4081{
4082 struct ospf *ospf = NULL;
4083 struct listnode *node = NULL;
4084 char *vrf_name = NULL, *intf_name = NULL;
2951a7a4 4085 bool all_vrf = false;
c9339663
CS
4086 int inst = 0;
4087 int idx_vrf = 0, idx_intf = 0;
9f049418 4088 bool uj = use_json(argc, argv);
b1c3ae8c 4089 json_object *json = NULL;
c9339663
CS
4090 int ret = CMD_SUCCESS;
4091 int display_once = 0;
d7c0a89a 4092 uint8_t use_vrf = 0;
c9339663
CS
4093
4094 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
4095
4096 if (argv_find(argv, argc, "INTERFACE", &idx_intf))
4097 intf_name = argv[idx_intf]->arg;
4098
b1c3ae8c
CS
4099 if (uj)
4100 json = json_object_new_object();
4101
c9339663 4102 if (vrf_name) {
b1c3ae8c 4103 use_vrf = 1;
c9339663
CS
4104 if (all_vrf) {
4105 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
4106 if (!ospf->oi_running)
4107 continue;
4108
996c9314
LB
4109 ret = show_ip_ospf_interface_traffic_common(
4110 vty, ospf, intf_name, json,
4111 display_once, use_vrf, uj);
c9339663
CS
4112 display_once = 1;
4113 }
b1c3ae8c
CS
4114
4115 if (uj) {
4116 vty_out(vty, "%s\n",
996c9314
LB
4117 json_object_to_json_string_ext(
4118 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
4119 json_object_free(json);
4120 }
4121
c9339663
CS
4122 return ret;
4123 }
4124 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c
CS
4125 if (ospf == NULL || !ospf->oi_running) {
4126 if (uj)
4127 json_object_free(json);
c9339663 4128 return CMD_SUCCESS;
b1c3ae8c
CS
4129 }
4130
996c9314
LB
4131 ret = show_ip_ospf_interface_traffic_common(
4132 vty, ospf, intf_name, json, display_once, use_vrf, uj);
c9339663
CS
4133 } else {
4134 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c
CS
4135 if (ospf == NULL || !ospf->oi_running) {
4136 if (uj)
4137 json_object_free(json);
c9339663 4138 return CMD_SUCCESS;
b1c3ae8c
CS
4139 }
4140
996c9314
LB
4141 ret = show_ip_ospf_interface_traffic_common(
4142 vty, ospf, intf_name, json, display_once, use_vrf, uj);
b1c3ae8c
CS
4143 }
4144
4145 if (uj) {
996c9314
LB
4146 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4147 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4148 json_object_free(json);
c9339663
CS
4149 }
4150
4151 return ret;
4152}
4153
4154
d62a17ae 4155static void show_ip_ospf_neighbour_header(struct vty *vty)
4156{
4157 vty_out(vty, "\n%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s\n",
4158 "Neighbor ID", "Pri", "State", "Dead Time", "Address",
4159 "Interface", "RXmtL", "RqstL", "DBsmL");
4160}
4161
4162static void show_ip_ospf_neighbor_sub(struct vty *vty,
4163 struct ospf_interface *oi,
9f049418 4164 json_object *json, bool use_json)
d62a17ae 4165{
4166 struct route_node *rn;
cef262c3 4167 struct ospf_neighbor *nbr, *prev_nbr = NULL;
d62a17ae 4168 char msgbuf[16];
4169 char timebuf[OSPF_TIME_DUMP_SIZE];
cef262c3 4170 json_object *json_neighbor = NULL, *json_neigh_array = NULL;
d62a17ae 4171
4172 for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) {
4173 if ((nbr = rn->info)) {
4174 /* Do not show myself. */
cef262c3
CS
4175 if (nbr == oi->nbr_self)
4176 continue;
4177 /* Down state is not shown. */
4178 if (nbr->state == NSM_Down)
4179 continue;
4180 if (use_json) {
4181 char neigh_str[INET_ADDRSTRLEN];
4182
996c9314
LB
4183 if (prev_nbr
4184 && !IPV4_ADDR_SAME(&prev_nbr->src,
4185 &nbr->src)) {
cef262c3
CS
4186 /* Start new neigh list */
4187 json_neigh_array = NULL;
4188 }
4189
996c9314
LB
4190 if (nbr->state == NSM_Attempt
4191 && nbr->router_id.s_addr == 0)
6021c6c0
CS
4192 strlcpy(neigh_str, "neighbor",
4193 sizeof(neigh_str));
cef262c3 4194 else
6021c6c0 4195 strlcpy(neigh_str,
cef262c3 4196 inet_ntoa(nbr->router_id),
6021c6c0 4197 sizeof(neigh_str));
cef262c3
CS
4198
4199 json_object_object_get_ex(json, neigh_str,
4200 &json_neigh_array);
4201
4202 if (!json_neigh_array) {
996c9314
LB
4203 json_neigh_array =
4204 json_object_new_array();
4205 json_object_object_add(
4206 json, neigh_str,
4207 json_neigh_array);
d62a17ae 4208 }
cef262c3 4209
996c9314 4210 json_neighbor = json_object_new_object();
cef262c3
CS
4211
4212 ospf_nbr_state_message(nbr, msgbuf, 16);
4213
4214 long time_store;
4215
996c9314
LB
4216 time_store =
4217 monotime_until(
cef262c3 4218 &nbr->t_inactivity->u.sands,
996c9314
LB
4219 NULL)
4220 / 1000LL;
cef262c3 4221
996c9314 4222 json_object_int_add(json_neighbor, "priority",
cef262c3
CS
4223 nbr->priority);
4224 json_object_string_add(json_neighbor, "state",
4225 msgbuf);
4226 json_object_int_add(json_neighbor,
4227 "deadTimeMsecs",
4228 time_store);
996c9314 4229 json_object_string_add(json_neighbor, "address",
cef262c3
CS
4230 inet_ntoa(nbr->src));
4231 json_object_string_add(json_neighbor,
4232 "ifaceName",
4233 IF_NAME(oi));
996c9314
LB
4234 json_object_int_add(
4235 json_neighbor, "retransmitCounter",
4236 ospf_ls_retransmit_count(nbr));
cef262c3 4237 json_object_int_add(json_neighbor,
996c9314
LB
4238 "requestCounter",
4239 ospf_ls_request_count(nbr));
cef262c3 4240 json_object_int_add(json_neighbor,
996c9314
LB
4241 "dbSummaryCounter",
4242 ospf_db_summary_count(nbr));
cef262c3
CS
4243
4244 json_object_array_add(json_neigh_array,
4245 json_neighbor);
4246 } else {
4247 ospf_nbr_state_message(nbr, msgbuf, 16);
4248
996c9314
LB
4249 if (nbr->state == NSM_Attempt
4250 && nbr->router_id.s_addr == 0)
4251 vty_out(vty, "%-15s %3d %-15s ", "-",
4252 nbr->priority, msgbuf);
cef262c3 4253 else
996c9314 4254 vty_out(vty, "%-15s %3d %-15s ",
cef262c3 4255 inet_ntoa(nbr->router_id),
996c9314 4256 nbr->priority, msgbuf);
cef262c3
CS
4257
4258 vty_out(vty, "%9s ",
4259 ospf_timer_dump(nbr->t_inactivity,
4260 timebuf,
4261 sizeof(timebuf)));
4262 vty_out(vty, "%-15s ", inet_ntoa(nbr->src));
996c9314 4263 vty_out(vty, "%-20s %5ld %5ld %5d\n",
cef262c3
CS
4264 IF_NAME(oi),
4265 ospf_ls_retransmit_count(nbr),
4266 ospf_ls_request_count(nbr),
4267 ospf_db_summary_count(nbr));
d62a17ae 4268 }
cef262c3 4269 prev_nbr = nbr;
d62a17ae 4270 }
4271 }
4272}
4273
4274static int show_ip_ospf_neighbor_common(struct vty *vty, struct ospf *ospf,
9f049418 4275 json_object *json, bool use_json,
d7c0a89a 4276 uint8_t use_vrf)
d62a17ae 4277{
4278 struct ospf_interface *oi;
4279 struct listnode *node;
6282e124 4280 json_object *json_vrf = NULL;
2bc7673f 4281 json_object *json_nbr_sub = NULL;
7c8ff89e 4282
b1c3ae8c
CS
4283 if (use_json) {
4284 if (use_vrf)
4285 json_vrf = json_object_new_object();
4286 else
4287 json_vrf = json;
6282e124 4288 json_nbr_sub = json_object_new_object();
b1c3ae8c 4289 }
d62a17ae 4290
4291 if (ospf->instance) {
4292 if (use_json)
4293 json_object_int_add(json, "ospfInstance",
4294 ospf->instance);
4295 else
4296 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
4297 }
7c8ff89e 4298
b1c3ae8c
CS
4299 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
4300 if (!use_json)
4301 show_ip_ospf_neighbour_header(vty);
87bd50e8 4302
2bc7673f
CS
4303 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
4304 if (ospf_interface_neighbor_count(oi) == 0)
4305 continue;
2bc7673f
CS
4306 show_ip_ospf_neighbor_sub(vty, oi, json_nbr_sub, use_json);
4307 }
718e3744 4308
d62a17ae 4309 if (use_json) {
996c9314 4310 json_object_object_add(json_vrf, "neighbors", json_nbr_sub);
b1c3ae8c
CS
4311 if (use_vrf) {
4312 if (ospf->vrf_id == VRF_DEFAULT)
4313 json_object_object_add(json, "default",
4314 json_vrf);
4315 else
4316 json_object_object_add(json, ospf->name,
4317 json_vrf);
4318 }
d62a17ae 4319 } else
4320 vty_out(vty, "\n");
7c8ff89e 4321
d62a17ae 4322 return CMD_SUCCESS;
718e3744 4323}
4324
7c8ff89e
DS
4325DEFUN (show_ip_ospf_neighbor,
4326 show_ip_ospf_neighbor_cmd,
b5a8894d 4327 "show ip ospf [vrf <NAME|all>] neighbor [json]",
718e3744 4328 SHOW_STR
4329 IP_STR
4330 "OSPF information\n"
b5a8894d
CS
4331 VRF_CMD_HELP_STR
4332 "All VRFs\n"
91756b38 4333 "Neighbor list\n"
9973d184 4334 JSON_STR)
718e3744 4335{
d62a17ae 4336 struct ospf *ospf;
9f049418 4337 bool uj = use_json(argc, argv);
b5a8894d
CS
4338 struct listnode *node = NULL;
4339 char *vrf_name = NULL;
2951a7a4 4340 bool all_vrf = false;
b5a8894d
CS
4341 int ret = CMD_SUCCESS;
4342 int inst = 0;
4343 int idx_vrf = 0;
d7c0a89a 4344 uint8_t use_vrf = 0;
b1c3ae8c 4345 json_object *json = NULL;
718e3744 4346
43b8d1d8 4347 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 4348
b1c3ae8c
CS
4349 if (uj)
4350 json = json_object_new_object();
b5a8894d
CS
4351
4352 /* vrf input is provided could be all or specific vrf*/
4353 if (vrf_name) {
b1c3ae8c 4354 use_vrf = 1;
b5a8894d
CS
4355 if (all_vrf) {
4356 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
4357 if (!ospf->oi_running)
4358 continue;
996c9314
LB
4359 ret = show_ip_ospf_neighbor_common(
4360 vty, ospf, json, uj, use_vrf);
b1c3ae8c
CS
4361 }
4362
4363 if (uj) {
4364 vty_out(vty, "%s\n",
996c9314
LB
4365 json_object_to_json_string_ext(
4366 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4367 json_object_free(json);
9f049418
DS
4368 } else if (!ospf)
4369 vty_out(vty, "OSPF instance not found\n");
b1c3ae8c 4370
b5a8894d
CS
4371 return ret;
4372 }
b1c3ae8c 4373
b5a8894d 4374 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c 4375 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
4376 if (uj) {
4377 vty_out(vty, "%s\n",
4378 json_object_to_json_string_ext(
4379 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4380 json_object_free(json);
9f049418
DS
4381 } else
4382 vty_out(vty, "%% OSPF instance not found\n");
4383
b5a8894d 4384 return CMD_SUCCESS;
b1c3ae8c 4385 }
b5a8894d
CS
4386 } else {
4387 /* Display default ospf (instance 0) info */
4388 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c 4389 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
4390 if (uj) {
4391 vty_out(vty, "%s\n",
4392 json_object_to_json_string_ext(
4393 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4394 json_object_free(json);
9f049418
DS
4395 } else
4396 vty_out(vty, "%% OSPF instance not found\n");
4397
b5a8894d 4398 return CMD_SUCCESS;
b1c3ae8c 4399 }
b5a8894d
CS
4400 }
4401
b1c3ae8c
CS
4402 if (ospf) {
4403 ret = show_ip_ospf_neighbor_common(vty, ospf, json, uj,
4404 use_vrf);
4405
4406 if (uj) {
4407 vty_out(vty, "%s\n",
996c9314
LB
4408 json_object_to_json_string_ext(
4409 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
4410 }
4411 }
4412
4413 if (uj)
4414 json_object_free(json);
b5a8894d
CS
4415
4416 return ret;
7c8ff89e
DS
4417}
4418
4419
4420DEFUN (show_ip_ospf_instance_neighbor,
4421 show_ip_ospf_instance_neighbor_cmd,
6147e2c6 4422 "show ip ospf (1-65535) neighbor [json]",
7c8ff89e
DS
4423 SHOW_STR
4424 IP_STR
4425 "OSPF information\n"
4426 "Instance ID\n"
91756b38 4427 "Neighbor list\n"
9973d184 4428 JSON_STR)
7c8ff89e 4429{
d62a17ae 4430 int idx_number = 3;
4431 struct ospf *ospf;
d7c0a89a 4432 unsigned short instance = 0;
9f049418 4433 bool uj = use_json(argc, argv);
b1c3ae8c
CS
4434 json_object *json = NULL;
4435 int ret = CMD_SUCCESS;
7c8ff89e 4436
d62a17ae 4437 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
4438 ospf = ospf_lookup_instance(instance);
4439 if (ospf == NULL)
4440 return CMD_NOT_MY_INSTANCE;
4441
4442 if (!ospf->oi_running)
d62a17ae 4443 return CMD_SUCCESS;
7c8ff89e 4444
b1c3ae8c
CS
4445 if (uj)
4446 json = json_object_new_object();
b5a8894d 4447
b1c3ae8c
CS
4448 ret = show_ip_ospf_neighbor_common(vty, ospf, json, uj, 0);
4449
4450 if (uj) {
996c9314
LB
4451 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4452 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
4453 json_object_free(json);
4454 }
4455
4456 return ret;
7c8ff89e
DS
4457}
4458
d62a17ae 4459static int show_ip_ospf_neighbor_all_common(struct vty *vty, struct ospf *ospf,
9f049418 4460 json_object *json, bool use_json,
d7c0a89a 4461 uint8_t use_vrf)
d62a17ae 4462{
4463 struct listnode *node;
4464 struct ospf_interface *oi;
b1c3ae8c 4465 json_object *json_vrf = NULL;
d62a17ae 4466 json_object *json_neighbor_sub = NULL;
7c8ff89e 4467
d62a17ae 4468 if (use_json) {
b1c3ae8c
CS
4469 if (use_vrf)
4470 json_vrf = json_object_new_object();
4471 else
4472 json_vrf = json;
d62a17ae 4473 json_neighbor_sub = json_object_new_object();
b5a8894d 4474 }
d62a17ae 4475
b1c3ae8c
CS
4476 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
4477 if (!use_json)
4478 show_ip_ospf_neighbour_header(vty);
4479
d62a17ae 4480 if (ospf->instance) {
4481 if (use_json)
b1c3ae8c 4482 json_object_int_add(json_vrf, "ospfInstance",
d62a17ae 4483 ospf->instance);
4484 else
4485 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
4486 }
4487
4488 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
4489 struct listnode *nbr_node;
4490 struct ospf_nbr_nbma *nbr_nbma;
4491
b1c3ae8c 4492 show_ip_ospf_neighbor_sub(vty, oi, json_vrf, use_json);
d62a17ae 4493
4494 /* print Down neighbor status */
4495 for (ALL_LIST_ELEMENTS_RO(oi->nbr_nbma, nbr_node, nbr_nbma)) {
4496 if (nbr_nbma->nbr == NULL
4497 || nbr_nbma->nbr->state == NSM_Down) {
4498 if (use_json) {
4499 json_object_int_add(json_neighbor_sub,
4500 "nbrNbmaPriority",
4501 nbr_nbma->priority);
4502 json_object_boolean_true_add(
4503 json_neighbor_sub,
4504 "nbrNbmaDown");
4505 json_object_string_add(
4506 json_neighbor_sub,
4507 "nbrNbmaIfaceName",
4508 IF_NAME(oi));
4509 json_object_int_add(
4510 json_neighbor_sub,
4511 "nbrNbmaRetransmitCounter", 0);
4512 json_object_int_add(
4513 json_neighbor_sub,
4514 "nbrNbmaRequestCounter", 0);
4515 json_object_int_add(
4516 json_neighbor_sub,
4517 "nbrNbmaDbSummaryCounter", 0);
4518 json_object_object_add(
b1c3ae8c
CS
4519 json_vrf,
4520 inet_ntoa(nbr_nbma->addr),
d62a17ae 4521 json_neighbor_sub);
4522 } else {
4523 vty_out(vty, "%-15s %3d %-15s %9s ",
4524 "-", nbr_nbma->priority, "Down",
4525 "-");
4526 vty_out(vty,
4527 "%-15s %-20s %5d %5d %5d\n",
4528 inet_ntoa(nbr_nbma->addr),
4529 IF_NAME(oi), 0, 0, 0);
4530 }
4531 }
4532 }
4533 }
4534
4535 if (use_json) {
b1c3ae8c
CS
4536 if (use_vrf) {
4537 if (ospf->vrf_id == VRF_DEFAULT)
4538 json_object_object_add(json, "default",
4539 json_vrf);
4540 else
4541 json_object_object_add(json, ospf->name,
4542 json_vrf);
4543 }
d62a17ae 4544 } else
4545 vty_out(vty, "\n");
4546
4547 return CMD_SUCCESS;
718e3744 4548}
4549
7c8ff89e
DS
4550DEFUN (show_ip_ospf_neighbor_all,
4551 show_ip_ospf_neighbor_all_cmd,
b5a8894d 4552 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
718e3744 4553 SHOW_STR
4554 IP_STR
4555 "OSPF information\n"
b5a8894d
CS
4556 VRF_CMD_HELP_STR
4557 "All VRFs\n"
718e3744 4558 "Neighbor list\n"
91756b38 4559 "include down status neighbor\n"
9973d184 4560 JSON_STR)
7c8ff89e 4561{
d62a17ae 4562 struct ospf *ospf;
9f049418 4563 bool uj = use_json(argc, argv);
b5a8894d
CS
4564 struct listnode *node = NULL;
4565 char *vrf_name = NULL;
2951a7a4 4566 bool all_vrf = false;
b5a8894d
CS
4567 int ret = CMD_SUCCESS;
4568 int inst = 0;
4569 int idx_vrf = 0;
d7c0a89a 4570 uint8_t use_vrf = 0;
b1c3ae8c 4571 json_object *json = NULL;
7c8ff89e 4572
43b8d1d8 4573 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 4574
b1c3ae8c
CS
4575 if (uj)
4576 json = json_object_new_object();
b5a8894d
CS
4577
4578 /* vrf input is provided could be all or specific vrf*/
4579 if (vrf_name) {
b1c3ae8c 4580 use_vrf = 1;
b5a8894d
CS
4581 if (all_vrf) {
4582 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
4583 if (!ospf->oi_running)
4584 continue;
996c9314
LB
4585 ret = show_ip_ospf_neighbor_all_common(
4586 vty, ospf, json, uj, use_vrf);
b1c3ae8c
CS
4587 }
4588
4589 if (uj) {
4590 vty_out(vty, "%s\n",
996c9314
LB
4591 json_object_to_json_string_ext(
4592 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 4593 json_object_free(json);
b5a8894d 4594 }
b1c3ae8c 4595
b5a8894d
CS
4596 return ret;
4597 }
b1c3ae8c 4598
b5a8894d 4599 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c
CS
4600 if (ospf == NULL || !ospf->oi_running) {
4601 if (uj)
4602 json_object_free(json);
b5a8894d 4603 return CMD_SUCCESS;
b1c3ae8c 4604 }
b5a8894d
CS
4605 } else {
4606 /* Display default ospf (instance 0) info */
4607 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c
CS
4608 if (ospf == NULL || !ospf->oi_running) {
4609 if (uj)
4610 json_object_free(json);
b5a8894d 4611 return CMD_SUCCESS;
b1c3ae8c 4612 }
b5a8894d
CS
4613 }
4614
b1c3ae8c
CS
4615 if (ospf) {
4616 ret = show_ip_ospf_neighbor_all_common(vty, ospf, json, uj,
4617 use_vrf);
4618 if (uj) {
4619 vty_out(vty, "%s\n",
996c9314
LB
4620 json_object_to_json_string_ext(
4621 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
4622 }
4623 }
4624
4625 if (uj)
4626 json_object_free(json);
b5a8894d
CS
4627
4628 return ret;
7c8ff89e
DS
4629}
4630
4631DEFUN (show_ip_ospf_instance_neighbor_all,
4632 show_ip_ospf_instance_neighbor_all_cmd,
6147e2c6 4633 "show ip ospf (1-65535) neighbor all [json]",
7c8ff89e
DS
4634 SHOW_STR
4635 IP_STR
4636 "OSPF information\n"
4637 "Instance ID\n"
4638 "Neighbor list\n"
91756b38 4639 "include down status neighbor\n"
9973d184 4640 JSON_STR)
718e3744 4641{
d62a17ae 4642 int idx_number = 3;
4643 struct ospf *ospf;
d7c0a89a 4644 unsigned short instance = 0;
9f049418 4645 bool uj = use_json(argc, argv);
b1c3ae8c
CS
4646 json_object *json = NULL;
4647 int ret = CMD_SUCCESS;
7c8ff89e 4648
d62a17ae 4649 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
4650 ospf = ospf_lookup_instance(instance);
4651 if (ospf == NULL)
4652 return CMD_NOT_MY_INSTANCE;
4653
4654 if (!ospf->oi_running)
d62a17ae 4655 return CMD_SUCCESS;
b1c3ae8c
CS
4656 if (uj)
4657 json = json_object_new_object();
4658
4659 ret = show_ip_ospf_neighbor_all_common(vty, ospf, json, uj, 0);
4660
4661 if (uj) {
4662 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4663 json, JSON_C_TO_STRING_PRETTY));
4664 json_object_free(json);
4665 }
7c8ff89e 4666
b1c3ae8c 4667 return ret;
7c8ff89e
DS
4668}
4669
d62a17ae 4670static int show_ip_ospf_neighbor_int_common(struct vty *vty, struct ospf *ospf,
4671 int arg_base,
4672 struct cmd_token **argv,
9f049418 4673 bool use_json, uint8_t use_vrf)
d62a17ae 4674{
4675 struct interface *ifp;
4676 struct route_node *rn;
4677 json_object *json = NULL;
91756b38 4678
d62a17ae 4679 if (use_json)
4680 json = json_object_new_object();
d62a17ae 4681
4682 if (ospf->instance) {
4683 if (use_json)
4684 json_object_int_add(json, "ospfInstance",
4685 ospf->instance);
4686 else
4687 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
4688 }
4689
b1c3ae8c 4690 ospf_show_vrf_name(ospf, vty, json, use_vrf);
87bd50e8 4691
a36898e7 4692 ifp = if_lookup_by_name(argv[arg_base]->arg, ospf->vrf_id);
d62a17ae 4693 if (!ifp) {
4694 if (use_json)
4695 json_object_boolean_true_add(json, "noSuchIface");
4696 else
4697 vty_out(vty, "No such interface.\n");
4698 return CMD_WARNING;
4699 }
4700
4701 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
4702 struct ospf_interface *oi = rn->info;
4703
4704 if (oi == NULL)
4705 continue;
4706
4707 show_ip_ospf_neighbor_sub(vty, oi, json, use_json);
4708 }
4709
4710 if (use_json) {
9d303b37
DL
4711 vty_out(vty, "%s\n", json_object_to_json_string_ext(
4712 json, JSON_C_TO_STRING_PRETTY));
d62a17ae 4713 json_object_free(json);
4714 } else
4715 vty_out(vty, "\n");
4716
4717 return CMD_SUCCESS;
718e3744 4718}
4719
7c8ff89e
DS
4720DEFUN (show_ip_ospf_neighbor_int,
4721 show_ip_ospf_neighbor_int_cmd,
03ed9f02 4722 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
7c8ff89e
DS
4723 SHOW_STR
4724 IP_STR
4725 "OSPF information\n"
03ed9f02 4726 VRF_CMD_HELP_STR
7c8ff89e 4727 "Neighbor list\n"
91756b38 4728 "Interface name\n"
9973d184 4729 JSON_STR)
7c8ff89e 4730{
d62a17ae 4731 struct ospf *ospf;
03ed9f02
PG
4732 int idx_ifname = 0;
4733 int idx_vrf = 0;
9f049418 4734 bool uj = use_json(argc, argv);
b5a8894d
CS
4735 int ret = CMD_SUCCESS;
4736 struct interface *ifp = NULL;
03ed9f02
PG
4737 char *vrf_name = NULL;
4738 vrf_id_t vrf_id = VRF_DEFAULT;
4739 struct vrf *vrf = NULL;
4740
4741 if (argv_find(argv, argc, "vrf", &idx_vrf))
4742 vrf_name = argv[idx_vrf + 1]->arg;
4743 if (vrf_name && strmatch(vrf_name, VRF_DEFAULT_NAME))
4744 vrf_name = NULL;
4745 if (vrf_name) {
4746 vrf = vrf_lookup_by_name(vrf_name);
4747 if (vrf)
4748 vrf_id = vrf->vrf_id;
4749 }
4750 ospf = ospf_lookup_by_vrf_id(vrf_id);
4751
4752 if (!ospf || !ospf->oi_running)
4753 return ret;
7c8ff89e 4754
b5a8894d
CS
4755 if (!uj)
4756 show_ip_ospf_neighbour_header(vty);
7c8ff89e 4757
03ed9f02 4758 argv_find(argv, argc, "IFNAME", &idx_ifname);
b5a8894d 4759
a36898e7 4760 ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf_id);
03ed9f02
PG
4761 if (!ifp)
4762 return ret;
4763
4764 ret = show_ip_ospf_neighbor_int_common(vty, ospf, idx_ifname,
4765 argv, uj, 0);
b5a8894d 4766 return ret;
7c8ff89e
DS
4767}
4768
4769DEFUN (show_ip_ospf_instance_neighbor_int,
4770 show_ip_ospf_instance_neighbor_int_cmd,
6147e2c6 4771 "show ip ospf (1-65535) neighbor IFNAME [json]",
7c8ff89e
DS
4772 SHOW_STR
4773 IP_STR
4774 "OSPF information\n"
4775 "Instance ID\n"
4776 "Neighbor list\n"
91756b38 4777 "Interface name\n"
9973d184 4778 JSON_STR)
7c8ff89e 4779{
d62a17ae 4780 int idx_number = 3;
b4e84315 4781 int idx_ifname = 5;
d62a17ae 4782 struct ospf *ospf;
d7c0a89a 4783 unsigned short instance = 0;
9f049418 4784 bool uj = use_json(argc, argv);
7c8ff89e 4785
b5a8894d
CS
4786 if (!uj)
4787 show_ip_ospf_neighbour_header(vty);
4788
d62a17ae 4789 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
4790 ospf = ospf_lookup_instance(instance);
4791 if (ospf == NULL)
4792 return CMD_NOT_MY_INSTANCE;
4793
4794 if (!ospf->oi_running)
d62a17ae 4795 return CMD_SUCCESS;
7c8ff89e 4796
b5a8894d
CS
4797 if (!uj)
4798 show_ip_ospf_neighbour_header(vty);
4799
996c9314
LB
4800 return show_ip_ospf_neighbor_int_common(vty, ospf, idx_ifname, argv, uj,
4801 0);
718e3744 4802}
4803
d62a17ae 4804static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty,
4805 struct ospf_interface *oi,
4806 struct ospf_nbr_nbma *nbr_nbma,
9f049418 4807 bool use_json, json_object *json)
d62a17ae 4808{
4809 char timebuf[OSPF_TIME_DUMP_SIZE];
4810 json_object *json_sub = NULL;
718e3744 4811
d62a17ae 4812 if (use_json)
4813 json_sub = json_object_new_object();
4814 else /* Show neighbor ID. */
4815 vty_out(vty, " Neighbor %s,", "-");
4816
4817 /* Show interface address. */
4818 if (use_json)
4819 json_object_string_add(json_sub, "ifaceAddress",
4820 inet_ntoa(nbr_nbma->addr));
4821 else
4822 vty_out(vty, " interface address %s\n",
4823 inet_ntoa(nbr_nbma->addr));
4824
4825 /* Show Area ID. */
4826 if (use_json) {
4827 json_object_string_add(json_sub, "areaId",
4828 ospf_area_desc_string(oi->area));
4829 json_object_string_add(json_sub, "iface", IF_NAME(oi));
4830 } else
4831 vty_out(vty, " In the area %s via interface %s\n",
4832 ospf_area_desc_string(oi->area), IF_NAME(oi));
4833
4834 /* Show neighbor priority and state. */
4835 if (use_json) {
4836 json_object_int_add(json_sub, "nbrPriority",
4837 nbr_nbma->priority);
4838 json_object_string_add(json_sub, "nbrState", "down");
4839 } else
4840 vty_out(vty, " Neighbor priority is %d, State is %s,",
4841 nbr_nbma->priority, "Down");
4842
4843 /* Show state changes. */
4844 if (use_json)
4845 json_object_int_add(json_sub, "stateChangeCounter",
4846 nbr_nbma->state_change);
4847 else
4848 vty_out(vty, " %d state changes\n", nbr_nbma->state_change);
4849
4850 /* Show PollInterval */
4851 if (use_json)
4852 json_object_int_add(json_sub, "pollInterval", nbr_nbma->v_poll);
4853 else
4854 vty_out(vty, " Poll interval %d\n", nbr_nbma->v_poll);
4855
4856 /* Show poll-interval timer. */
b575a12c
A
4857 if (nbr_nbma->t_poll) {
4858 if (use_json) {
4859 long time_store;
4860 time_store = monotime_until(&nbr_nbma->t_poll->u.sands,
4861 NULL) / 1000LL;
4862 json_object_int_add(json_sub,
4863 "pollIntervalTimerDueMsec",
4864 time_store);
4865 } else
4866 vty_out(vty, " Poll timer due in %s\n",
4867 ospf_timer_dump(nbr_nbma->t_poll, timebuf,
4868 sizeof(timebuf)));
4869 }
d62a17ae 4870
4871 /* Show poll-interval timer thread. */
4872 if (use_json) {
4873 if (nbr_nbma->t_poll != NULL)
4874 json_object_string_add(json_sub,
4875 "pollIntervalTimerThread", "on");
4876 } else
4877 vty_out(vty, " Thread Poll Timer %s\n",
4878 nbr_nbma->t_poll != NULL ? "on" : "off");
4879
4880 if (use_json)
4881 json_object_object_add(json, "noNbrId", json_sub);
4882}
4883
4884static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
4885 struct ospf_interface *oi,
4886 struct ospf_neighbor *nbr,
cb0b2ac6 4887 struct ospf_neighbor *prev_nbr,
9f049418 4888 json_object *json, bool use_json)
d62a17ae 4889{
4890 char timebuf[OSPF_TIME_DUMP_SIZE];
cb0b2ac6
CS
4891 json_object *json_neigh = NULL, *json_neigh_array = NULL;
4892 char neigh_str[INET_ADDRSTRLEN] = {0};
d62a17ae 4893
cb0b2ac6
CS
4894 if (use_json) {
4895 if (prev_nbr &&
4896 !IPV4_ADDR_SAME(&prev_nbr->src, &nbr->src)) {
4897 json_neigh_array = NULL;
4898 }
4899
4900 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
4901 strlcpy(neigh_str, "noNbrId", sizeof(neigh_str));
4902 else
4903 strlcpy(neigh_str, inet_ntoa(nbr->router_id),
4904 sizeof(neigh_str));
4905
4906 json_object_object_get_ex(json, neigh_str, &json_neigh_array);
4907
4908 if (!json_neigh_array) {
4909 json_neigh_array = json_object_new_array();
4910 json_object_object_add(json, neigh_str,
4911 json_neigh_array);
4912 }
4913
4914 json_neigh = json_object_new_object();
4915
4916 } else {
d62a17ae 4917 /* Show neighbor ID. */
4918 if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
4919 vty_out(vty, " Neighbor %s,", "-");
4920 else
4921 vty_out(vty, " Neighbor %s,",
4922 inet_ntoa(nbr->router_id));
4923 }
4924
4925 /* Show interface address. */
4926 if (use_json)
cb0b2ac6 4927 json_object_string_add(json_neigh, "ifaceAddress",
d62a17ae 4928 inet_ntoa(nbr->address.u.prefix4));
4929 else
4930 vty_out(vty, " interface address %s\n",
4931 inet_ntoa(nbr->address.u.prefix4));
4932
4933 /* Show Area ID. */
4934 if (use_json) {
cb0b2ac6 4935 json_object_string_add(json_neigh, "areaId",
d62a17ae 4936 ospf_area_desc_string(oi->area));
cb0b2ac6 4937 json_object_string_add(json_neigh, "ifaceName", oi->ifp->name);
d62a17ae 4938 } else
4939 vty_out(vty, " In the area %s via interface %s\n",
4940 ospf_area_desc_string(oi->area), oi->ifp->name);
4941
4942 /* Show neighbor priority and state. */
4943 if (use_json) {
cb0b2ac6 4944 json_object_int_add(json_neigh, "nbrPriority", nbr->priority);
d62a17ae 4945 json_object_string_add(
cb0b2ac6 4946 json_neigh, "nbrState",
d62a17ae 4947 lookup_msg(ospf_nsm_state_msg, nbr->state, NULL));
4948 } else
4949 vty_out(vty, " Neighbor priority is %d, State is %s,",
4950 nbr->priority,
4951 lookup_msg(ospf_nsm_state_msg, nbr->state, NULL));
4952
4953 /* Show state changes. */
4954 if (use_json)
cb0b2ac6 4955 json_object_int_add(json_neigh, "stateChangeCounter",
d62a17ae 4956 nbr->state_change);
4957 else
4958 vty_out(vty, " %d state changes\n", nbr->state_change);
4959
4960 if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec) {
4961 struct timeval res;
4962 long time_store;
4963
4964 time_store =
4965 monotime_since(&nbr->ts_last_progress, &res) / 1000LL;
4966 if (use_json) {
cb0b2ac6 4967 json_object_int_add(json_neigh, "lastPrgrsvChangeMsec",
d62a17ae 4968 time_store);
4969 } else {
4970 vty_out(vty,
4971 " Most recent state change statistics:\n");
4972 vty_out(vty, " Progressive change %s ago\n",
4973 ospf_timeval_dump(&res, timebuf,
4974 sizeof(timebuf)));
4975 }
4976 }
4977
4978 if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec) {
4979 struct timeval res;
4980 long time_store;
4981
4982 time_store =
4983 monotime_since(&nbr->ts_last_regress, &res) / 1000LL;
4984 if (use_json) {
cb0b2ac6 4985 json_object_int_add(json_neigh,
d62a17ae 4986 "lastRegressiveChangeMsec",
4987 time_store);
4988 if (nbr->last_regress_str)
4989 json_object_string_add(
cb0b2ac6
CS
4990 json_neigh,
4991 "lastRegressiveChangeReason",
d62a17ae 4992 nbr->last_regress_str);
4993 } else {
4994 vty_out(vty,
4995 " Regressive change %s ago, due to %s\n",
4996 ospf_timeval_dump(&res, timebuf,
4997 sizeof(timebuf)),
4998 (nbr->last_regress_str ? nbr->last_regress_str
4999 : "??"));
5000 }
5001 }
5002
5003 /* Show Designated Rotuer ID. */
5004 if (use_json)
cb0b2ac6 5005 json_object_string_add(json_neigh, "routerDesignatedId",
d62a17ae 5006 inet_ntoa(nbr->d_router));
5007 else
5008 vty_out(vty, " DR is %s,", inet_ntoa(nbr->d_router));
5009
5010 /* Show Backup Designated Rotuer ID. */
5011 if (use_json)
cb0b2ac6 5012 json_object_string_add(json_neigh, "routerDesignatedBackupId",
d62a17ae 5013 inet_ntoa(nbr->bd_router));
5014 else
5015 vty_out(vty, " BDR is %s\n", inet_ntoa(nbr->bd_router));
5016
5017 /* Show options. */
5018 if (use_json) {
cb0b2ac6
CS
5019 json_object_int_add(json_neigh, "optionsCounter", nbr->options);
5020 json_object_string_add(json_neigh, "optionsList",
d62a17ae 5021 ospf_options_dump(nbr->options));
5022 } else
5023 vty_out(vty, " Options %d %s\n", nbr->options,
5024 ospf_options_dump(nbr->options));
5025
5026 /* Show Router Dead interval timer. */
5027 if (use_json) {
5028 if (nbr->t_inactivity) {
5029 long time_store;
5030 time_store = monotime_until(&nbr->t_inactivity->u.sands,
5031 NULL)
5032 / 1000LL;
cb0b2ac6 5033 json_object_int_add(json_neigh,
d62a17ae 5034 "routerDeadIntervalTimerDueMsec",
5035 time_store);
5036 } else
5037 json_object_int_add(
cb0b2ac6
CS
5038 json_neigh,
5039 "routerDeadIntervalTimerDueMsec", -1);
d62a17ae 5040 } else
5041 vty_out(vty, " Dead timer due in %s\n",
5042 ospf_timer_dump(nbr->t_inactivity, timebuf,
5043 sizeof(timebuf)));
5044
5045 /* Show Database Summary list. */
5046 if (use_json)
cb0b2ac6 5047 json_object_int_add(json_neigh, "databaseSummaryListCounter",
d62a17ae 5048 ospf_db_summary_count(nbr));
5049 else
5050 vty_out(vty, " Database Summary List %d\n",
5051 ospf_db_summary_count(nbr));
5052
5053 /* Show Link State Request list. */
5054 if (use_json)
cb0b2ac6 5055 json_object_int_add(json_neigh, "linkStateRequestListCounter",
d62a17ae 5056 ospf_ls_request_count(nbr));
5057 else
5058 vty_out(vty, " Link State Request List %ld\n",
5059 ospf_ls_request_count(nbr));
5060
5061 /* Show Link State Retransmission list. */
5062 if (use_json)
cb0b2ac6 5063 json_object_int_add(json_neigh,
d62a17ae 5064 "linkStateRetransmissionListCounter",
5065 ospf_ls_retransmit_count(nbr));
5066 else
5067 vty_out(vty, " Link State Retransmission List %ld\n",
5068 ospf_ls_retransmit_count(nbr));
5069
5070 /* Show inactivity timer thread. */
5071 if (use_json) {
5072 if (nbr->t_inactivity != NULL)
cb0b2ac6 5073 json_object_string_add(json_neigh,
d62a17ae 5074 "threadInactivityTimer", "on");
5075 } else
5076 vty_out(vty, " Thread Inactivity Timer %s\n",
5077 nbr->t_inactivity != NULL ? "on" : "off");
5078
5079 /* Show Database Description retransmission thread. */
5080 if (use_json) {
5081 if (nbr->t_db_desc != NULL)
5082 json_object_string_add(
cb0b2ac6 5083 json_neigh,
d62a17ae 5084 "threadDatabaseDescriptionRetransmission",
5085 "on");
5086 } else
5087 vty_out(vty,
5088 " Thread Database Description Retransmision %s\n",
5089 nbr->t_db_desc != NULL ? "on" : "off");
5090
5091 /* Show Link State Request Retransmission thread. */
5092 if (use_json) {
5093 if (nbr->t_ls_req != NULL)
5094 json_object_string_add(
cb0b2ac6 5095 json_neigh,
d62a17ae 5096 "threadLinkStateRequestRetransmission", "on");
5097 } else
5098 vty_out(vty,
5099 " Thread Link State Request Retransmission %s\n",
5100 nbr->t_ls_req != NULL ? "on" : "off");
5101
5102 /* Show Link State Update Retransmission thread. */
5103 if (use_json) {
5104 if (nbr->t_ls_upd != NULL)
5105 json_object_string_add(
cb0b2ac6
CS
5106 json_neigh,
5107 "threadLinkStateUpdateRetransmission",
d62a17ae 5108 "on");
5109 } else
5110 vty_out(vty,
5111 " Thread Link State Update Retransmission %s\n\n",
5112 nbr->t_ls_upd != NULL ? "on" : "off");
5113
cb0b2ac6
CS
5114 ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
5115
5116 if (use_json)
5117 json_object_array_add(json_neigh_array, json_neigh);
d62a17ae 5118
d62a17ae 5119}
5120
5121static int show_ip_ospf_neighbor_id_common(struct vty *vty, struct ospf *ospf,
986b87cb 5122 struct in_addr *router_id,
9f049418 5123 bool use_json, uint8_t use_vrf)
d62a17ae 5124{
5125 struct listnode *node;
5126 struct ospf_neighbor *nbr;
5127 struct ospf_interface *oi;
d62a17ae 5128 json_object *json = NULL;
5129
5130 if (use_json)
5131 json = json_object_new_object();
5132
5133 if (ospf->instance) {
5134 if (use_json)
5135 json_object_int_add(json, "ospfInstance",
5136 ospf->instance);
5137 else
5138 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
5139 }
5140
b1c3ae8c 5141 ospf_show_vrf_name(ospf, vty, json, use_vrf);
87bd50e8 5142
d62a17ae 5143 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
986b87cb 5144 if ((nbr = ospf_nbr_lookup_by_routerid(oi->nbrs, router_id))) {
cb0b2ac6
CS
5145 show_ip_ospf_neighbor_detail_sub(vty, oi, nbr, NULL,
5146 json, use_json);
d62a17ae 5147 }
5148 }
5149
5150 if (use_json) {
9d303b37
DL
5151 vty_out(vty, "%s\n", json_object_to_json_string_ext(
5152 json, JSON_C_TO_STRING_PRETTY));
d62a17ae 5153 json_object_free(json);
5154 } else
5155 vty_out(vty, "\n");
5156
5157 return CMD_SUCCESS;
718e3744 5158}
5159
986b87cb 5160DEFPY (show_ip_ospf_neighbor_id,
7c8ff89e 5161 show_ip_ospf_neighbor_id_cmd,
986b87cb 5162 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
718e3744 5163 SHOW_STR
5164 IP_STR
5165 "OSPF information\n"
5166 "Neighbor list\n"
3ac237f8 5167 "Neighbor ID\n"
9973d184 5168 JSON_STR)
718e3744 5169{
d62a17ae 5170 struct ospf *ospf;
986b87cb 5171 struct listnode *node;
b5a8894d 5172 int ret = CMD_SUCCESS;
7c8ff89e 5173
b5a8894d
CS
5174 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
5175 if (!ospf->oi_running)
5176 continue;
986b87cb
RW
5177 ret = show_ip_ospf_neighbor_id_common(vty, ospf, &router_id,
5178 !!json, 0);
b5a8894d 5179 }
7c8ff89e 5180
b5a8894d 5181 return ret;
7c8ff89e
DS
5182}
5183
986b87cb 5184DEFPY (show_ip_ospf_instance_neighbor_id,
7c8ff89e 5185 show_ip_ospf_instance_neighbor_id_cmd,
986b87cb 5186 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
7c8ff89e
DS
5187 SHOW_STR
5188 IP_STR
5189 "OSPF information\n"
5190 "Instance ID\n"
5191 "Neighbor list\n"
3ac237f8 5192 "Neighbor ID\n"
9973d184 5193 JSON_STR)
7c8ff89e 5194{
d62a17ae 5195 struct ospf *ospf;
7c8ff89e 5196
ac28e4ec
CS
5197 ospf = ospf_lookup_instance(instance);
5198 if (ospf == NULL)
5199 return CMD_NOT_MY_INSTANCE;
5200
5201 if (!ospf->oi_running)
d62a17ae 5202 return CMD_SUCCESS;
7c8ff89e 5203
986b87cb
RW
5204 return show_ip_ospf_neighbor_id_common(vty, ospf, &router_id, !!json,
5205 0);
7c8ff89e
DS
5206}
5207
d62a17ae 5208static int show_ip_ospf_neighbor_detail_common(struct vty *vty,
5209 struct ospf *ospf,
9f049418 5210 json_object *json, bool use_json,
d7c0a89a 5211 uint8_t use_vrf)
d62a17ae 5212{
5213 struct ospf_interface *oi;
5214 struct listnode *node;
b1c3ae8c 5215 json_object *json_vrf = NULL;
cb0b2ac6 5216 json_object *json_nbr_sub = NULL;
d62a17ae 5217
b1c3ae8c
CS
5218 if (use_json) {
5219 if (use_vrf)
5220 json_vrf = json_object_new_object();
5221 else
5222 json_vrf = json;
cb0b2ac6
CS
5223
5224 json_nbr_sub = json_object_new_object();
b1c3ae8c 5225 }
cb0b2ac6 5226
d62a17ae 5227 if (ospf->instance) {
5228 if (use_json)
cb0b2ac6 5229 json_object_int_add(json, "ospfInstance",
d62a17ae 5230 ospf->instance);
5231 else
5232 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
5233 }
5234
b1c3ae8c 5235 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
87bd50e8 5236
d62a17ae 5237 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
5238 struct route_node *rn;
cb0b2ac6 5239 struct ospf_neighbor *nbr, *prev_nbr = NULL;
d62a17ae 5240
5241 for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) {
5242 if ((nbr = rn->info)) {
5243 if (nbr != oi->nbr_self) {
5244 if (nbr->state != NSM_Down) {
5245 show_ip_ospf_neighbor_detail_sub(
cb0b2ac6
CS
5246 vty, oi, nbr, prev_nbr,
5247 json_nbr_sub, use_json);
d62a17ae 5248 }
5249 }
cb0b2ac6 5250 prev_nbr = nbr;
d62a17ae 5251 }
5252 }
5253 }
5254
5255 if (use_json) {
cb0b2ac6
CS
5256 json_object_object_add(json_vrf, "neighbors",
5257 json_nbr_sub);
b1c3ae8c
CS
5258 if (use_vrf) {
5259 if (ospf->vrf_id == VRF_DEFAULT)
5260 json_object_object_add(json, "default",
5261 json_vrf);
5262 else
5263 json_object_object_add(json, ospf->name,
5264 json_vrf);
5265 }
d62a17ae 5266 } else
5267 vty_out(vty, "\n");
5268
5269 return CMD_SUCCESS;
718e3744 5270}
5271
7c8ff89e
DS
5272DEFUN (show_ip_ospf_neighbor_detail,
5273 show_ip_ospf_neighbor_detail_cmd,
b5a8894d 5274 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
718e3744 5275 SHOW_STR
5276 IP_STR
5277 "OSPF information\n"
b5a8894d
CS
5278 VRF_CMD_HELP_STR
5279 "All VRFs\n"
718e3744 5280 "Neighbor list\n"
3ac237f8 5281 "detail of all neighbors\n"
9973d184 5282 JSON_STR)
718e3744 5283{
d62a17ae 5284 struct ospf *ospf;
9f049418 5285 bool uj = use_json(argc, argv);
b5a8894d
CS
5286 struct listnode *node = NULL;
5287 char *vrf_name = NULL;
2951a7a4 5288 bool all_vrf = false;
b5a8894d
CS
5289 int ret = CMD_SUCCESS;
5290 int inst = 0;
5291 int idx_vrf = 0;
d7c0a89a 5292 uint8_t use_vrf = 0;
b1c3ae8c 5293 json_object *json = NULL;
7c8ff89e 5294
43b8d1d8 5295 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 5296
b1c3ae8c
CS
5297 if (uj)
5298 json = json_object_new_object();
5299
b5a8894d
CS
5300 /* vrf input is provided could be all or specific vrf*/
5301 if (vrf_name) {
b1c3ae8c 5302 use_vrf = 1;
b5a8894d
CS
5303 if (all_vrf) {
5304 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
5305 if (!ospf->oi_running)
5306 continue;
996c9314
LB
5307 ret = show_ip_ospf_neighbor_detail_common(
5308 vty, ospf, json, uj, use_vrf);
b1c3ae8c
CS
5309 }
5310 if (uj) {
5311 vty_out(vty, "%s\n",
996c9314
LB
5312 json_object_to_json_string_ext(
5313 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c 5314 json_object_free(json);
b5a8894d 5315 }
b1c3ae8c 5316
b5a8894d
CS
5317 return ret;
5318 }
5319 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c
CS
5320 if (ospf == NULL || !ospf->oi_running) {
5321 if (uj)
5322 json_object_free(json);
b5a8894d 5323 return CMD_SUCCESS;
b1c3ae8c 5324 }
b5a8894d
CS
5325 } else {
5326 /* Display default ospf (instance 0) info */
5327 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c
CS
5328 if (ospf == NULL || !ospf->oi_running) {
5329 if (uj)
5330 json_object_free(json);
b5a8894d 5331 return CMD_SUCCESS;
b1c3ae8c 5332 }
b5a8894d
CS
5333 }
5334
b1c3ae8c
CS
5335 if (ospf) {
5336 ret = show_ip_ospf_neighbor_detail_common(vty, ospf, json, uj,
5337 use_vrf);
5338 if (uj) {
5339 vty_out(vty, "%s\n",
996c9314
LB
5340 json_object_to_json_string_ext(
5341 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
5342 }
5343 }
5344
5345 if (uj)
5346 json_object_free(json);
b5a8894d
CS
5347
5348 return ret;
7c8ff89e
DS
5349}
5350
5351DEFUN (show_ip_ospf_instance_neighbor_detail,
5352 show_ip_ospf_instance_neighbor_detail_cmd,
6147e2c6 5353 "show ip ospf (1-65535) neighbor detail [json]",
7c8ff89e
DS
5354 SHOW_STR
5355 IP_STR
5356 "OSPF information\n"
5357 "Instance ID\n"
5358 "Neighbor list\n"
3ac237f8 5359 "detail of all neighbors\n"
9973d184 5360 JSON_STR)
7c8ff89e 5361{
d62a17ae 5362 int idx_number = 3;
5363 struct ospf *ospf;
d7c0a89a 5364 unsigned short instance = 0;
9f049418 5365 bool uj = use_json(argc, argv);
b1c3ae8c
CS
5366 json_object *json = NULL;
5367 int ret = CMD_SUCCESS;
7c8ff89e 5368
d62a17ae 5369 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
5370 ospf = ospf_lookup_instance(instance);
5371 if (ospf == NULL)
5372 return CMD_NOT_MY_INSTANCE;
5373
5374 if (!ospf->oi_running)
d62a17ae 5375 return CMD_SUCCESS;
7c8ff89e 5376
b1c3ae8c
CS
5377 if (uj)
5378 json = json_object_new_object();
5379
5380 ret = show_ip_ospf_neighbor_detail_common(vty, ospf, json, uj, 0);
5381
5382 if (uj) {
5383 vty_out(vty, "%s\n", json_object_to_json_string_ext(
5384 json, JSON_C_TO_STRING_PRETTY));
5385 json_object_free(json);
5386 }
5387
5388 return ret;
7c8ff89e
DS
5389}
5390
d62a17ae 5391static int show_ip_ospf_neighbor_detail_all_common(struct vty *vty,
5392 struct ospf *ospf,
b1c3ae8c 5393 json_object *json,
9f049418 5394 bool use_json,
d7c0a89a 5395 uint8_t use_vrf)
d62a17ae 5396{
5397 struct listnode *node;
5398 struct ospf_interface *oi;
b1c3ae8c 5399 json_object *json_vrf = NULL;
718e3744 5400
b1c3ae8c
CS
5401 if (use_json) {
5402 if (use_vrf)
5403 json_vrf = json_object_new_object();
5404 else
5405 json_vrf = json;
5406 }
d62a17ae 5407
5408 if (ospf->instance) {
5409 if (use_json)
5410 json_object_int_add(json, "ospfInstance",
5411 ospf->instance);
5412 else
5413 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
5414 }
5415
b1c3ae8c 5416 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
87bd50e8 5417
d62a17ae 5418 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
5419 struct route_node *rn;
cb0b2ac6 5420 struct ospf_neighbor *nbr, *prev_nbr = NULL;
d62a17ae 5421 struct ospf_nbr_nbma *nbr_nbma;
5422
cb0b2ac6
CS
5423 for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) {
5424 if ((nbr = rn->info)) {
d62a17ae 5425 if (nbr != oi->nbr_self)
5426 if (nbr->state != NSM_Down)
5427 show_ip_ospf_neighbor_detail_sub(
5428 vty, oi, rn->info,
cb0b2ac6 5429 prev_nbr,
b1c3ae8c 5430 json_vrf, use_json);
cb0b2ac6
CS
5431 prev_nbr = nbr;
5432 }
5433 }
d62a17ae 5434
5435 if (oi->type == OSPF_IFTYPE_NBMA) {
5436 struct listnode *nd;
5437
5438 for (ALL_LIST_ELEMENTS_RO(oi->nbr_nbma, nd, nbr_nbma)) {
5439 if (nbr_nbma->nbr == NULL
5440 || nbr_nbma->nbr->state == NSM_Down)
5441 show_ip_ospf_nbr_nbma_detail_sub(
5442 vty, oi, nbr_nbma, use_json,
b1c3ae8c 5443 json_vrf);
d62a17ae 5444 }
5445 }
5446 }
5447
5448 if (use_json) {
b1c3ae8c
CS
5449 if (use_vrf) {
5450 if (ospf->vrf_id == VRF_DEFAULT)
5451 json_object_object_add(json, "default",
5452 json_vrf);
5453 else
5454 json_object_object_add(json, ospf->name,
5455 json_vrf);
5456 }
d62a17ae 5457 } else {
5458 vty_out(vty, "\n");
5459 }
5460
5461 return CMD_SUCCESS;
718e3744 5462}
5463
7c8ff89e
DS
5464DEFUN (show_ip_ospf_neighbor_detail_all,
5465 show_ip_ospf_neighbor_detail_all_cmd,
b5a8894d 5466 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
718e3744 5467 SHOW_STR
5468 IP_STR
5469 "OSPF information\n"
b5a8894d
CS
5470 VRF_CMD_HELP_STR
5471 "All VRFs\n"
718e3744 5472 "Neighbor list\n"
7c8ff89e 5473 "detail of all neighbors\n"
3ac237f8 5474 "include down status neighbor\n"
9973d184 5475 JSON_STR)
718e3744 5476{
d62a17ae 5477 struct ospf *ospf;
9f049418 5478 bool uj = use_json(argc, argv);
b5a8894d
CS
5479 struct listnode *node = NULL;
5480 char *vrf_name = NULL;
2951a7a4 5481 bool all_vrf = false;
b5a8894d
CS
5482 int ret = CMD_SUCCESS;
5483 int inst = 0;
5484 int idx_vrf = 0;
d7c0a89a 5485 uint8_t use_vrf = 0;
b1c3ae8c 5486 json_object *json = NULL;
7c8ff89e 5487
43b8d1d8 5488 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 5489
b1c3ae8c
CS
5490 if (uj)
5491 json = json_object_new_object();
5492
b5a8894d
CS
5493 /* vrf input is provided could be all or specific vrf*/
5494 if (vrf_name) {
b1c3ae8c 5495 use_vrf = 1;
b5a8894d
CS
5496 if (all_vrf) {
5497 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
5498 if (!ospf->oi_running)
5499 continue;
996c9314
LB
5500 ret = show_ip_ospf_neighbor_detail_all_common(
5501 vty, ospf, json, uj, use_vrf);
b5a8894d 5502 }
b1c3ae8c
CS
5503
5504 if (uj) {
5505 vty_out(vty, "%s\n",
996c9314
LB
5506 json_object_to_json_string_ext(
5507 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
5508 json_object_free(json);
5509 }
5510
b5a8894d
CS
5511 return ret;
5512 }
5513 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
b1c3ae8c
CS
5514 if (ospf == NULL || !ospf->oi_running) {
5515 if (uj)
5516 json_object_free(json);
b5a8894d 5517 return CMD_SUCCESS;
b1c3ae8c 5518 }
b5a8894d
CS
5519 } else {
5520 /* Display default ospf (instance 0) info */
5521 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
b1c3ae8c
CS
5522 if (ospf == NULL || !ospf->oi_running) {
5523 if (uj)
5524 json_object_free(json);
b5a8894d 5525 return CMD_SUCCESS;
b1c3ae8c 5526 }
b5a8894d
CS
5527 }
5528
b1c3ae8c
CS
5529 if (ospf) {
5530 ret = show_ip_ospf_neighbor_detail_all_common(vty, ospf, json,
5531 uj, use_vrf);
5532 if (uj) {
5533 vty_out(vty, "%s\n",
996c9314
LB
5534 json_object_to_json_string_ext(
5535 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
5536 }
5537 }
5538
5539 if (uj)
5540 json_object_free(json);
b5a8894d
CS
5541
5542 return ret;
7c8ff89e
DS
5543}
5544
5545DEFUN (show_ip_ospf_instance_neighbor_detail_all,
5546 show_ip_ospf_instance_neighbor_detail_all_cmd,
6147e2c6 5547 "show ip ospf (1-65535) neighbor detail all [json]",
7c8ff89e
DS
5548 SHOW_STR
5549 IP_STR
5550 "OSPF information\n"
5551 "Instance ID\n"
5552 "Neighbor list\n"
5553 "detail of all neighbors\n"
3ac237f8 5554 "include down status neighbor\n"
9973d184 5555 JSON_STR)
7c8ff89e 5556{
d62a17ae 5557 int idx_number = 3;
5558 struct ospf *ospf;
d7c0a89a 5559 unsigned short instance = 0;
9f049418 5560 bool uj = use_json(argc, argv);
b1c3ae8c
CS
5561 json_object *json = NULL;
5562 int ret = CMD_SUCCESS;
7c8ff89e 5563
d62a17ae 5564 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
5565 ospf = ospf_lookup_instance(instance);
5566 if (ospf == NULL)
5567 return CMD_NOT_MY_INSTANCE;
5568
5569 if (!ospf->oi_running)
d62a17ae 5570 return CMD_SUCCESS;
7c8ff89e 5571
b1c3ae8c
CS
5572 if (uj)
5573 json = json_object_new_object();
5574
5575 ret = show_ip_ospf_neighbor_detail_all_common(vty, ospf, json, uj, 0);
5576
5577 if (uj) {
996c9314
LB
5578 vty_out(vty, "%s\n", json_object_to_json_string_ext(
5579 json, JSON_C_TO_STRING_PRETTY));
b1c3ae8c
CS
5580 json_object_free(json);
5581 }
5582
5583 return ret;
7c8ff89e
DS
5584}
5585
d62a17ae 5586static int show_ip_ospf_neighbor_int_detail_common(struct vty *vty,
5587 struct ospf *ospf,
5588 int arg_base,
5589 struct cmd_token **argv,
9f049418 5590 bool use_json)
d62a17ae 5591{
5592 struct ospf_interface *oi;
5593 struct interface *ifp;
5594 struct route_node *rn, *nrn;
5595 struct ospf_neighbor *nbr;
5596 json_object *json = NULL;
718e3744 5597
d62a17ae 5598 if (use_json)
5599 json = json_object_new_object();
5600
5601 if (ospf->instance) {
5602 if (use_json)
5603 json_object_int_add(json, "ospfInstance",
5604 ospf->instance);
5605 else
5606 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
5607 }
5608
a36898e7 5609 ifp = if_lookup_by_name(argv[arg_base]->arg, ospf->vrf_id);
d62a17ae 5610 if (!ifp) {
5611 if (!use_json)
5612 vty_out(vty, "No such interface.\n");
16307668
RW
5613 else {
5614 vty_out(vty, "{}\n");
5615 json_object_free(json);
5616 }
d62a17ae 5617 return CMD_WARNING;
5618 }
5619
5620 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
5621 if ((oi = rn->info)) {
5622 for (nrn = route_top(oi->nbrs); nrn;
5623 nrn = route_next(nrn)) {
5624 if ((nbr = nrn->info)) {
5625 if (nbr != oi->nbr_self) {
5626 if (nbr->state != NSM_Down)
5627 show_ip_ospf_neighbor_detail_sub(
5628 vty, oi, nbr,
cb0b2ac6 5629 NULL,
b1c3ae8c 5630 json, use_json);
d62a17ae 5631 }
5632 }
5633 }
5634 }
5635 }
5636
5637 if (use_json) {
9d303b37
DL
5638 vty_out(vty, "%s\n", json_object_to_json_string_ext(
5639 json, JSON_C_TO_STRING_PRETTY));
d62a17ae 5640 json_object_free(json);
5641 } else
5642 vty_out(vty, "\n");
5643
5644 return CMD_SUCCESS;
718e3744 5645}
5646
7c8ff89e
DS
5647DEFUN (show_ip_ospf_neighbor_int_detail,
5648 show_ip_ospf_neighbor_int_detail_cmd,
b162fa78 5649 "show ip ospf neighbor IFNAME detail [json]",
7c8ff89e
DS
5650 SHOW_STR
5651 IP_STR
5652 "OSPF information\n"
5653 "Neighbor list\n"
5654 "Interface name\n"
3ac237f8 5655 "detail of all neighbors\n"
9973d184 5656 JSON_STR)
7c8ff89e 5657{
d62a17ae 5658 struct ospf *ospf;
9f049418 5659 bool uj = use_json(argc, argv);
b5a8894d
CS
5660 struct listnode *node = NULL;
5661 int ret = CMD_SUCCESS;
2951a7a4 5662 bool ospf_output = false;
7c8ff89e 5663
b5a8894d
CS
5664 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
5665 if (!ospf->oi_running)
5666 continue;
2951a7a4 5667 ospf_output = true;
cb0b2ac6 5668 ret = show_ip_ospf_neighbor_int_detail_common(vty, ospf, 4,
b5a8894d
CS
5669 argv, uj);
5670 }
7c8ff89e 5671
9f049418
DS
5672 if (!ospf_output)
5673 vty_out(vty, "%% OSPF instance not found\n");
5674
b5a8894d 5675 return ret;
7c8ff89e
DS
5676}
5677
5678DEFUN (show_ip_ospf_instance_neighbor_int_detail,
5679 show_ip_ospf_instance_neighbor_int_detail_cmd,
6147e2c6 5680 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
7c8ff89e
DS
5681 SHOW_STR
5682 IP_STR
5683 "OSPF information\n"
5684 "Instance ID\n"
5685 "Neighbor list\n"
5686 "Interface name\n"
3ac237f8 5687 "detail of all neighbors\n"
9973d184 5688 JSON_STR)
7c8ff89e 5689{
d62a17ae 5690 int idx_number = 3;
b4e84315 5691 int idx_ifname = 5;
d62a17ae 5692 struct ospf *ospf;
d7c0a89a 5693 unsigned short instance = 0;
9f049418 5694 bool uj = use_json(argc, argv);
7c8ff89e 5695
d62a17ae 5696 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
5697 ospf = ospf_lookup_instance(instance);
5698 if (ospf == NULL)
5699 return CMD_NOT_MY_INSTANCE;
5700
5701 if (!ospf->oi_running)
d62a17ae 5702 return CMD_SUCCESS;
7c8ff89e 5703
996c9314
LB
5704 return show_ip_ospf_neighbor_int_detail_common(vty, ospf, idx_ifname,
5705 argv, uj);
7c8ff89e 5706}
6b0655a2 5707
718e3744 5708/* Show functions */
d62a17ae 5709static int show_lsa_summary(struct vty *vty, struct ospf_lsa *lsa, int self)
5710{
5711 struct router_lsa *rl;
5712 struct summary_lsa *sl;
5713 struct as_external_lsa *asel;
5714 struct prefix_ipv4 p;
5715
5716 if (lsa != NULL)
5717 /* If self option is set, check LSA self flag. */
5718 if (self == 0 || IS_LSA_SELF(lsa)) {
5719 /* LSA common part show. */
5720 vty_out(vty, "%-15s ", inet_ntoa(lsa->data->id));
5721 vty_out(vty, "%-15s %4d 0x%08lx 0x%04x",
5722 inet_ntoa(lsa->data->adv_router), LS_AGE(lsa),
d7c0a89a 5723 (unsigned long)ntohl(lsa->data->ls_seqnum),
d62a17ae 5724 ntohs(lsa->data->checksum));
5725 /* LSA specific part show. */
5726 switch (lsa->data->type) {
5727 case OSPF_ROUTER_LSA:
5728 rl = (struct router_lsa *)lsa->data;
5729 vty_out(vty, " %-d", ntohs(rl->links));
5730 break;
5731 case OSPF_SUMMARY_LSA:
5732 sl = (struct summary_lsa *)lsa->data;
5733
5734 p.family = AF_INET;
5735 p.prefix = sl->header.id;
5736 p.prefixlen = ip_masklen(sl->mask);
5737 apply_mask_ipv4(&p);
5738
5739 vty_out(vty, " %s/%d", inet_ntoa(p.prefix),
5740 p.prefixlen);
5741 break;
5742 case OSPF_AS_EXTERNAL_LSA:
5743 case OSPF_AS_NSSA_LSA:
5744 asel = (struct as_external_lsa *)lsa->data;
5745
5746 p.family = AF_INET;
5747 p.prefix = asel->header.id;
5748 p.prefixlen = ip_masklen(asel->mask);
5749 apply_mask_ipv4(&p);
5750
5751 vty_out(vty, " %s %s/%d [0x%lx]",
5752 IS_EXTERNAL_METRIC(asel->e[0].tos)
5753 ? "E2"
5754 : "E1",
5755 inet_ntoa(p.prefix), p.prefixlen,
d7c0a89a
QY
5756 (unsigned long)ntohl(
5757 asel->e[0].route_tag));
d62a17ae 5758 break;
5759 case OSPF_NETWORK_LSA:
5760 case OSPF_ASBR_SUMMARY_LSA:
5761 case OSPF_OPAQUE_LINK_LSA:
5762 case OSPF_OPAQUE_AREA_LSA:
5763 case OSPF_OPAQUE_AS_LSA:
5764 default:
5765 break;
5766 }
5767 vty_out(vty, "\n");
5768 }
718e3744 5769
d62a17ae 5770 return 0;
5771}
5772
2b64873d 5773static const char *const show_database_desc[] = {
d62a17ae 5774 "unknown",
5775 "Router Link States",
5776 "Net Link States",
5777 "Summary Link States",
5778 "ASBR-Summary Link States",
5779 "AS External Link States",
5780 "Group Membership LSA",
5781 "NSSA-external Link States",
5782 "Type-8 LSA",
5783 "Link-Local Opaque-LSA",
5784 "Area-Local Opaque-LSA",
5785 "AS-external Opaque-LSA",
718e3744 5786};
5787
2b64873d 5788static const char *const show_database_header[] = {
d62a17ae 5789 "",
5790 "Link ID ADV Router Age Seq# CkSum Link count",
5791 "Link ID ADV Router Age Seq# CkSum",
5792 "Link ID ADV Router Age Seq# CkSum Route",
5793 "Link ID ADV Router Age Seq# CkSum",
5794 "Link ID ADV Router Age Seq# CkSum Route",
5795 " --- header for Group Member ----",
5796 "Link ID ADV Router Age Seq# CkSum Route",
5797 " --- type-8 ---",
5798 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5799 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5800 "Opaque-Type/Id ADV Router Age Seq# CkSum",
718e3744 5801};
5802
d62a17ae 5803static void show_ip_ospf_database_header(struct vty *vty, struct ospf_lsa *lsa)
5804{
5805 struct router_lsa *rlsa = (struct router_lsa *)lsa->data;
5806
5807 vty_out(vty, " LS age: %d\n", LS_AGE(lsa));
5808 vty_out(vty, " Options: 0x%-2x : %s\n", lsa->data->options,
5809 ospf_options_dump(lsa->data->options));
5810 vty_out(vty, " LS Flags: 0x%-2x %s\n", lsa->flags,
5811 ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)"
5812 : ""));
5813
5814 if (lsa->data->type == OSPF_ROUTER_LSA) {
5815 vty_out(vty, " Flags: 0x%x", rlsa->flags);
5816
5817 if (rlsa->flags)
5818 vty_out(vty, " :%s%s%s%s",
5819 IS_ROUTER_LSA_BORDER(rlsa) ? " ABR" : "",
5820 IS_ROUTER_LSA_EXTERNAL(rlsa) ? " ASBR" : "",
5821 IS_ROUTER_LSA_VIRTUAL(rlsa) ? " VL-endpoint"
5822 : "",
5823 IS_ROUTER_LSA_SHORTCUT(rlsa) ? " Shortcut"
5824 : "");
5825
5826 vty_out(vty, "\n");
5827 }
5828 vty_out(vty, " LS Type: %s\n",
5829 lookup_msg(ospf_lsa_type_msg, lsa->data->type, NULL));
5830 vty_out(vty, " Link State ID: %s %s\n", inet_ntoa(lsa->data->id),
5831 lookup_msg(ospf_link_state_id_type_msg, lsa->data->type, NULL));
5832 vty_out(vty, " Advertising Router: %s\n",
5833 inet_ntoa(lsa->data->adv_router));
5834 vty_out(vty, " LS Seq Number: %08lx\n",
d7c0a89a 5835 (unsigned long)ntohl(lsa->data->ls_seqnum));
d62a17ae 5836 vty_out(vty, " Checksum: 0x%04x\n", ntohs(lsa->data->checksum));
5837 vty_out(vty, " Length: %d\n\n", ntohs(lsa->data->length));
5838}
5839
2b64873d 5840static const char *const link_type_desc[] = {
d62a17ae 5841 "(null)",
5842 "another Router (point-to-point)",
5843 "a Transit Network",
5844 "Stub Network",
5845 "a Virtual Link",
718e3744 5846};
5847
2b64873d 5848static const char *const link_id_desc[] = {
d62a17ae 5849 "(null)", "Neighboring Router ID", "Designated Router address",
5850 "Net", "Neighboring Router ID",
718e3744 5851};
5852
2b64873d 5853static const char *const link_data_desc[] = {
d62a17ae 5854 "(null)", "Router Interface address", "Router Interface address",
5855 "Network Mask", "Router Interface address",
718e3744 5856};
5857
5858/* Show router-LSA each Link information. */
d62a17ae 5859static void show_ip_ospf_database_router_links(struct vty *vty,
5860 struct router_lsa *rl)
5861{
5862 int len, type;
5863 unsigned int i;
5864
5865 len = ntohs(rl->header.length) - 4;
5866 for (i = 0; i < ntohs(rl->links) && len > 0; len -= 12, i++) {
5867 type = rl->link[i].type;
5868
5869 vty_out(vty, " Link connected to: %s\n",
5870 link_type_desc[type]);
5871 vty_out(vty, " (Link ID) %s: %s\n", link_id_desc[type],
5872 inet_ntoa(rl->link[i].link_id));
5873 vty_out(vty, " (Link Data) %s: %s\n", link_data_desc[type],
5874 inet_ntoa(rl->link[i].link_data));
5875 vty_out(vty, " Number of TOS metrics: 0\n");
5876 vty_out(vty, " TOS 0 Metric: %d\n",
5877 ntohs(rl->link[i].metric));
5878 vty_out(vty, "\n");
5879 }
718e3744 5880}
5881
5882/* Show router-LSA detail information. */
d62a17ae 5883static int show_router_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
718e3744 5884{
d62a17ae 5885 if (lsa != NULL) {
5886 struct router_lsa *rl = (struct router_lsa *)lsa->data;
718e3744 5887
d62a17ae 5888 show_ip_ospf_database_header(vty, lsa);
718e3744 5889
d62a17ae 5890 vty_out(vty, " Number of Links: %d\n\n", ntohs(rl->links));
718e3744 5891
d62a17ae 5892 show_ip_ospf_database_router_links(vty, rl);
5893 vty_out(vty, "\n");
5894 }
5895
5896 return 0;
718e3744 5897}
5898
5899/* Show network-LSA detail information. */
d62a17ae 5900static int show_network_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
718e3744 5901{
d62a17ae 5902 int length, i;
718e3744 5903
d62a17ae 5904 if (lsa != NULL) {
5905 struct network_lsa *nl = (struct network_lsa *)lsa->data;
718e3744 5906
d62a17ae 5907 show_ip_ospf_database_header(vty, lsa);
718e3744 5908
d62a17ae 5909 vty_out(vty, " Network Mask: /%d\n", ip_masklen(nl->mask));
718e3744 5910
d62a17ae 5911 length = ntohs(lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
718e3744 5912
d62a17ae 5913 for (i = 0; length > 0; i++, length -= 4)
5914 vty_out(vty, " Attached Router: %s\n",
5915 inet_ntoa(nl->routers[i]));
718e3744 5916
d62a17ae 5917 vty_out(vty, "\n");
5918 }
718e3744 5919
d62a17ae 5920 return 0;
718e3744 5921}
5922
5923/* Show summary-LSA detail information. */
d62a17ae 5924static int show_summary_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
718e3744 5925{
d62a17ae 5926 if (lsa != NULL) {
5927 struct summary_lsa *sl = (struct summary_lsa *)lsa->data;
718e3744 5928
d62a17ae 5929 show_ip_ospf_database_header(vty, lsa);
718e3744 5930
d62a17ae 5931 vty_out(vty, " Network Mask: /%d\n", ip_masklen(sl->mask));
5932 vty_out(vty, " TOS: 0 Metric: %d\n",
5933 GET_METRIC(sl->metric));
5934 vty_out(vty, "\n");
5935 }
718e3744 5936
d62a17ae 5937 return 0;
718e3744 5938}
5939
5940/* Show summary-ASBR-LSA detail information. */
d62a17ae 5941static int show_summary_asbr_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
718e3744 5942{
d62a17ae 5943 if (lsa != NULL) {
5944 struct summary_lsa *sl = (struct summary_lsa *)lsa->data;
718e3744 5945
d62a17ae 5946 show_ip_ospf_database_header(vty, lsa);
718e3744 5947
d62a17ae 5948 vty_out(vty, " Network Mask: /%d\n", ip_masklen(sl->mask));
5949 vty_out(vty, " TOS: 0 Metric: %d\n",
5950 GET_METRIC(sl->metric));
5951 vty_out(vty, "\n");
5952 }
718e3744 5953
d62a17ae 5954 return 0;
718e3744 5955}
5956
5957/* Show AS-external-LSA detail information. */
d62a17ae 5958static int show_as_external_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
5959{
5960 if (lsa != NULL) {
5961 struct as_external_lsa *al =
5962 (struct as_external_lsa *)lsa->data;
5963
5964 show_ip_ospf_database_header(vty, lsa);
5965
5966 vty_out(vty, " Network Mask: /%d\n", ip_masklen(al->mask));
5967 vty_out(vty, " Metric Type: %s\n",
5968 IS_EXTERNAL_METRIC(al->e[0].tos)
5969 ? "2 (Larger than any link state path)"
5970 : "1");
5971 vty_out(vty, " TOS: 0\n");
5972 vty_out(vty, " Metric: %d\n",
5973 GET_METRIC(al->e[0].metric));
5974 vty_out(vty, " Forward Address: %s\n",
5975 inet_ntoa(al->e[0].fwd_addr));
5976
5977 vty_out(vty,
5978 " External Route Tag: %" ROUTE_TAG_PRI "\n\n",
5979 (route_tag_t)ntohl(al->e[0].route_tag));
5980 }
718e3744 5981
d62a17ae 5982 return 0;
718e3744 5983}
075e12f5 5984#if 0
4dadc291 5985static int
718e3744 5986show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
5987{
5988 struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
5989
5990 /* show_ip_ospf_database_header (vty, lsa); */
5991
2a42e285 5992 zlog_debug( " Network Mask: /%d%s",
718e3744 5993 ip_masklen (al->mask), "\n");
2a42e285 5994 zlog_debug( " Metric Type: %s%s",
718e3744 5995 IS_EXTERNAL_METRIC (al->e[0].tos) ?
5996 "2 (Larger than any link state path)" : "1", "\n");
2a42e285 5997 zlog_debug( " TOS: 0%s", "\n");
5998 zlog_debug( " Metric: %d%s",
718e3744 5999 GET_METRIC (al->e[0].metric), "\n");
2a42e285 6000 zlog_debug( " Forward Address: %s%s",
718e3744 6001 inet_ntoa (al->e[0].fwd_addr), "\n");
6002
dc9ffce8
CF
6003 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI"%s%s",
6004 (route_tag_t)ntohl (al->e[0].route_tag), "\n", "\n");
718e3744 6005
6006 return 0;
6007}
075e12f5 6008#endif
718e3744 6009/* Show AS-NSSA-LSA detail information. */
d62a17ae 6010static int show_as_nssa_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
6011{
6012 if (lsa != NULL) {
6013 struct as_external_lsa *al =
6014 (struct as_external_lsa *)lsa->data;
6015
6016 show_ip_ospf_database_header(vty, lsa);
6017
6018 vty_out(vty, " Network Mask: /%d\n", ip_masklen(al->mask));
6019 vty_out(vty, " Metric Type: %s\n",
6020 IS_EXTERNAL_METRIC(al->e[0].tos)
6021 ? "2 (Larger than any link state path)"
6022 : "1");
6023 vty_out(vty, " TOS: 0\n");
6024 vty_out(vty, " Metric: %d\n",
6025 GET_METRIC(al->e[0].metric));
6026 vty_out(vty, " NSSA: Forward Address: %s\n",
6027 inet_ntoa(al->e[0].fwd_addr));
6028
6029 vty_out(vty,
6030 " External Route Tag: %" ROUTE_TAG_PRI "\n\n",
6031 (route_tag_t)ntohl(al->e[0].route_tag));
6032 }
718e3744 6033
d62a17ae 6034 return 0;
718e3744 6035}
6036
d62a17ae 6037static int show_func_dummy(struct vty *vty, struct ospf_lsa *lsa)
718e3744 6038{
d62a17ae 6039 return 0;
718e3744 6040}
6041
d62a17ae 6042static int show_opaque_lsa_detail(struct vty *vty, struct ospf_lsa *lsa)
718e3744 6043{
d62a17ae 6044 if (lsa != NULL) {
6045 show_ip_ospf_database_header(vty, lsa);
6046 show_opaque_info_detail(vty, lsa);
718e3744 6047
d62a17ae 6048 vty_out(vty, "\n");
6049 }
6050 return 0;
6051}
6052
2b64873d 6053int (*const show_function[])(struct vty *, struct ospf_lsa *) = {
d62a17ae 6054 NULL,
6055 show_router_lsa_detail,
6056 show_network_lsa_detail,
6057 show_summary_lsa_detail,
6058 show_summary_asbr_lsa_detail,
6059 show_as_external_lsa_detail,
6060 show_func_dummy,
6061 show_as_nssa_lsa_detail, /* almost same as external */
6062 NULL, /* type-8 */
6063 show_opaque_lsa_detail,
6064 show_opaque_lsa_detail,
6065 show_opaque_lsa_detail,
6066};
6067
6068static void show_lsa_prefix_set(struct vty *vty, struct prefix_ls *lp,
6069 struct in_addr *id, struct in_addr *adv_router)
6070{
6071 memset(lp, 0, sizeof(struct prefix_ls));
6072 lp->family = 0;
6073 if (id == NULL)
6074 lp->prefixlen = 0;
6075 else if (adv_router == NULL) {
6076 lp->prefixlen = 32;
6077 lp->id = *id;
6078 } else {
6079 lp->prefixlen = 64;
6080 lp->id = *id;
6081 lp->adv_router = *adv_router;
6082 }
718e3744 6083}
718e3744 6084
d62a17ae 6085static void show_lsa_detail_proc(struct vty *vty, struct route_table *rt,
6086 struct in_addr *id, struct in_addr *adv_router)
6087{
6088 struct prefix_ls lp;
6089 struct route_node *rn, *start;
6090 struct ospf_lsa *lsa;
718e3744 6091
d62a17ae 6092 show_lsa_prefix_set(vty, &lp, id, adv_router);
6093 start = route_node_get(rt, (struct prefix *)&lp);
6094 if (start) {
6095 route_lock_node(start);
6096 for (rn = start; rn; rn = route_next_until(rn, start))
6097 if ((lsa = rn->info)) {
6098 if (show_function[lsa->data->type] != NULL)
6099 show_function[lsa->data->type](vty,
6100 lsa);
6101 }
6102 route_unlock_node(start);
6103 }
718e3744 6104}
6105
6106/* Show detail LSA information
6107 -- if id is NULL then show all LSAs. */
d62a17ae 6108static void show_lsa_detail(struct vty *vty, struct ospf *ospf, int type,
6109 struct in_addr *id, struct in_addr *adv_router)
6110{
6111 struct listnode *node;
6112 struct ospf_area *area;
6113
6114 switch (type) {
6115 case OSPF_AS_EXTERNAL_LSA:
6116 case OSPF_OPAQUE_AS_LSA:
6117 vty_out(vty, " %s \n\n",
6118 show_database_desc[type]);
6119 show_lsa_detail_proc(vty, AS_LSDB(ospf, type), id, adv_router);
6120 break;
6121 default:
6122 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
6123 vty_out(vty, "\n %s (Area %s)\n\n",
6124 show_database_desc[type],
6125 ospf_area_desc_string(area));
6126 show_lsa_detail_proc(vty, AREA_LSDB(area, type), id,
6127 adv_router);
6128 }
6129 break;
718e3744 6130 }
6131}
6132
d62a17ae 6133static void show_lsa_detail_adv_router_proc(struct vty *vty,
6134 struct route_table *rt,
6135 struct in_addr *adv_router)
6136{
6137 struct route_node *rn;
6138 struct ospf_lsa *lsa;
6139
6140 for (rn = route_top(rt); rn; rn = route_next(rn))
6141 if ((lsa = rn->info))
6142 if (IPV4_ADDR_SAME(adv_router,
6143 &lsa->data->adv_router)) {
6144 if (CHECK_FLAG(lsa->flags, OSPF_LSA_LOCAL_XLT))
6145 continue;
6146 if (show_function[lsa->data->type] != NULL)
6147 show_function[lsa->data->type](vty,
6148 lsa);
6149 }
6150}
6151
718e3744 6152/* Show detail LSA information. */
d62a17ae 6153static void show_lsa_detail_adv_router(struct vty *vty, struct ospf *ospf,
6154 int type, struct in_addr *adv_router)
6155{
6156 struct listnode *node;
6157 struct ospf_area *area;
6158
6159 switch (type) {
6160 case OSPF_AS_EXTERNAL_LSA:
6161 case OSPF_OPAQUE_AS_LSA:
6162 vty_out(vty, " %s \n\n",
6163 show_database_desc[type]);
6164 show_lsa_detail_adv_router_proc(vty, AS_LSDB(ospf, type),
6165 adv_router);
6166 break;
6167 default:
6168 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
6169 vty_out(vty, "\n %s (Area %s)\n\n",
6170 show_database_desc[type],
6171 ospf_area_desc_string(area));
6172 show_lsa_detail_adv_router_proc(
6173 vty, AREA_LSDB(area, type), adv_router);
6174 }
6175 break;
6176 }
6177}
6178
6179static void show_ip_ospf_database_summary(struct vty *vty, struct ospf *ospf,
6180 int self)
6181{
6182 struct ospf_lsa *lsa;
6183 struct route_node *rn;
6184 struct ospf_area *area;
6185 struct listnode *node;
6186 int type;
6187
6188 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
6189 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++) {
6190 switch (type) {
6191 case OSPF_AS_EXTERNAL_LSA:
6192 case OSPF_OPAQUE_AS_LSA:
6193 continue;
6194 default:
6195 break;
6196 }
6197 if (ospf_lsdb_count_self(area->lsdb, type) > 0
6198 || (!self
6199 && ospf_lsdb_count(area->lsdb, type) > 0)) {
6200 vty_out(vty, " %s (Area %s)\n\n",
6201 show_database_desc[type],
6202 ospf_area_desc_string(area));
6203 vty_out(vty, "%s\n",
6204 show_database_header[type]);
6205
996c9314 6206 LSDB_LOOP (AREA_LSDB(area, type), rn, lsa)
044506e7 6207 show_lsa_summary(vty, lsa, self);
d62a17ae 6208
6209 vty_out(vty, "\n");
6210 }
6211 }
6212 }
6213
6214 for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++) {
6215 switch (type) {
6216 case OSPF_AS_EXTERNAL_LSA:
6217 case OSPF_OPAQUE_AS_LSA:
6218 break;
6219 default:
6220 continue;
6221 }
6222 if (ospf_lsdb_count_self(ospf->lsdb, type)
6223 || (!self && ospf_lsdb_count(ospf->lsdb, type))) {
6224 vty_out(vty, " %s\n\n",
6225 show_database_desc[type]);
6226 vty_out(vty, "%s\n", show_database_header[type]);
6227
996c9314 6228 LSDB_LOOP (AS_LSDB(ospf, type), rn, lsa)
044506e7 6229 show_lsa_summary(vty, lsa, self);
d62a17ae 6230
6231 vty_out(vty, "\n");
6232 }
6233 }
6234
6235 vty_out(vty, "\n");
6236}
6237
6238static void show_ip_ospf_database_maxage(struct vty *vty, struct ospf *ospf)
6239{
6240 struct route_node *rn;
6241
6242 vty_out(vty, "\n MaxAge Link States:\n\n");
6243
6244 for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn)) {
6245 struct ospf_lsa *lsa;
6246
6247 if ((lsa = rn->info) != NULL) {
6248 vty_out(vty, "Link type: %d\n", lsa->data->type);
6249 vty_out(vty, "Link State ID: %s\n",
6250 inet_ntoa(lsa->data->id));
6251 vty_out(vty, "Advertising Router: %s\n",
6252 inet_ntoa(lsa->data->adv_router));
6253 vty_out(vty, "LSA lock count: %d\n", lsa->lock);
6254 vty_out(vty, "\n");
6255 }
91e6a0e5 6256 }
718e3744 6257}
6258
718e3744 6259#define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6260#define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
718e3744 6261
718e3744 6262#define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6263#define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6264#define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6265#define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
718e3744 6266
d62a17ae 6267#define OSPF_LSA_TYPES_DESC \
6268 "ASBR summary link states\n" \
6269 "External link states\n" \
6270 "Network link states\n" \
6271 "Router link states\n" \
6272 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6273 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6274 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6275
6276static int show_ip_ospf_database_common(struct vty *vty, struct ospf *ospf,
6277 int arg_base, int argc,
d7c0a89a
QY
6278 struct cmd_token **argv,
6279 uint8_t use_vrf)
d62a17ae 6280{
6281 int idx_type = 4;
6282 int type, ret;
6283 struct in_addr id, adv_router;
6284
6285 if (ospf->instance)
6286 vty_out(vty, "\nOSPF Instance: %d\n", ospf->instance);
6287
b1c3ae8c 6288 ospf_show_vrf_name(ospf, vty, NULL, use_vrf);
87bd50e8 6289
d62a17ae 6290 vty_out(vty, "\n OSPF Router with ID (%s)\n\n",
6291 inet_ntoa(ospf->router_id));
6292
6293 /* Show all LSA. */
6294 if (argc == arg_base + 4) {
6295 show_ip_ospf_database_summary(vty, ospf, 0);
6296 return CMD_SUCCESS;
6297 }
718e3744 6298
d62a17ae 6299 /* Set database type to show. */
6300 if (strncmp(argv[arg_base + idx_type]->text, "r", 1) == 0)
6301 type = OSPF_ROUTER_LSA;
6302 else if (strncmp(argv[arg_base + idx_type]->text, "ne", 2) == 0)
6303 type = OSPF_NETWORK_LSA;
6304 else if (strncmp(argv[arg_base + idx_type]->text, "ns", 2) == 0)
6305 type = OSPF_AS_NSSA_LSA;
6306 else if (strncmp(argv[arg_base + idx_type]->text, "su", 2) == 0)
6307 type = OSPF_SUMMARY_LSA;
6308 else if (strncmp(argv[arg_base + idx_type]->text, "a", 1) == 0)
6309 type = OSPF_ASBR_SUMMARY_LSA;
6310 else if (strncmp(argv[arg_base + idx_type]->text, "e", 1) == 0)
6311 type = OSPF_AS_EXTERNAL_LSA;
6312 else if (strncmp(argv[arg_base + idx_type]->text, "se", 2) == 0) {
6313 show_ip_ospf_database_summary(vty, ospf, 1);
6314 return CMD_SUCCESS;
6315 } else if (strncmp(argv[arg_base + idx_type]->text, "m", 1) == 0) {
6316 show_ip_ospf_database_maxage(vty, ospf);
6317 return CMD_SUCCESS;
6318 } else if (strncmp(argv[arg_base + idx_type]->text, "opaque-l", 8) == 0)
6319 type = OSPF_OPAQUE_LINK_LSA;
6320 else if (strncmp(argv[arg_base + idx_type]->text, "opaque-ar", 9) == 0)
6321 type = OSPF_OPAQUE_AREA_LSA;
6322 else if (strncmp(argv[arg_base + idx_type]->text, "opaque-as", 9) == 0)
6323 type = OSPF_OPAQUE_AS_LSA;
6324 else
718e3744 6325 return CMD_WARNING;
d62a17ae 6326
6327 /* `show ip ospf database LSA'. */
6328 if (argc == arg_base + 5)
6329 show_lsa_detail(vty, ospf, type, NULL, NULL);
6330 else if (argc >= arg_base + 6) {
6331 ret = inet_aton(argv[arg_base + 5]->arg, &id);
6332 if (!ret)
6333 return CMD_WARNING;
6334
6335 /* `show ip ospf database LSA ID'. */
6336 if (argc == arg_base + 6)
6337 show_lsa_detail(vty, ospf, type, &id, NULL);
6338 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6339 else if (argc == arg_base + 7) {
6340 if (strncmp(argv[arg_base + 6]->text, "s", 1) == 0)
6341 adv_router = ospf->router_id;
6342 else {
6343 ret = inet_aton(argv[arg_base + 7]->arg,
6344 &adv_router);
6345 if (!ret)
6346 return CMD_WARNING;
6347 }
6348 show_lsa_detail(vty, ospf, type, &id, &adv_router);
6349 }
718e3744 6350 }
718e3744 6351
d62a17ae 6352 return CMD_SUCCESS;
718e3744 6353}
6354
7a7be519 6355DEFUN (show_ip_ospf_database_max,
6356 show_ip_ospf_database_max_cmd,
b5a8894d 6357 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
7a7be519 6358 SHOW_STR
6359 IP_STR
6360 "OSPF information\n"
b5a8894d
CS
6361 VRF_CMD_HELP_STR
6362 "All VRFs\n"
7a7be519 6363 "Database summary\n"
6364 "LSAs in MaxAge list\n"
6365 "Self-originated link states\n")
6366{
b5a8894d
CS
6367 struct ospf *ospf = NULL;
6368 struct listnode *node = NULL;
6369 char *vrf_name = NULL;
2951a7a4 6370 bool all_vrf = false;
b5a8894d
CS
6371 int ret = CMD_SUCCESS;
6372 int inst = 0;
6373 int idx_vrf = 0;
d7c0a89a 6374 uint8_t use_vrf = 0;
f412b39a 6375
43b8d1d8 6376 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
f412b39a 6377
b5a8894d 6378 if (vrf_name) {
2951a7a4 6379 bool ospf_output = false;
874f58d8 6380
b1c3ae8c 6381 use_vrf = 1;
94d4c685 6382
b5a8894d
CS
6383 if (all_vrf) {
6384 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
6385 if (!ospf->oi_running)
6386 continue;
2951a7a4 6387 ospf_output = true;
996c9314
LB
6388 ret = show_ip_ospf_database_common(
6389 vty, ospf, idx_vrf ? 2 : 0, argc, argv,
6390 use_vrf);
b5a8894d 6391 }
9f049418
DS
6392
6393 if (!ospf_output)
6394 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d
CS
6395 } else {
6396 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
9f049418 6397 if (ospf == NULL || !ospf->oi_running) {
94d4c685 6398 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6399 return CMD_SUCCESS;
9f049418 6400 }
996c9314
LB
6401 ret = (show_ip_ospf_database_common(
6402 vty, ospf, idx_vrf ? 2 : 0, argc, argv,
6403 use_vrf));
b5a8894d
CS
6404 }
6405 } else {
6406 /* Display default ospf (instance 0) info */
6407 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
9f049418 6408 if (ospf == NULL || !ospf->oi_running) {
94d4c685 6409 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6410 return CMD_SUCCESS;
9f049418
DS
6411 }
6412
b1c3ae8c
CS
6413 ret = show_ip_ospf_database_common(vty, ospf, 0, argc, argv,
6414 use_vrf);
b5a8894d
CS
6415 }
6416
6417 return ret;
7a7be519 6418}
f412b39a 6419
f412b39a
DW
6420DEFUN (show_ip_ospf_instance_database,
6421 show_ip_ospf_instance_database_cmd,
43b8d1d8 6422 "show ip ospf [{(1-65535)|vrf NAME}] database [<asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> [A.B.C.D [<self-originate|adv-router A.B.C.D>]]]",
718e3744 6423 SHOW_STR
6424 IP_STR
6425 "OSPF information\n"
7c8ff89e 6426 "Instance ID\n"
b5a8894d 6427 VRF_CMD_HELP_STR
7a7be519 6428 "Database summary\n"
6429 OSPF_LSA_TYPES_DESC
6430 "Link State ID (as an IP address)\n"
6431 "Self-originated link states\n"
6432 "Advertising Router link states\n"
6433 "Advertising Router (as an IP address)\n")
7c8ff89e 6434{
d62a17ae 6435 struct ospf *ospf;
d7c0a89a 6436 unsigned short instance = 0;
b5a8894d
CS
6437 struct listnode *node = NULL;
6438 char *vrf_name = NULL;
2951a7a4 6439 bool all_vrf = false;
b5a8894d
CS
6440 int ret = CMD_SUCCESS;
6441 int inst = 0;
d62a17ae 6442 int idx = 0;
d7c0a89a 6443 uint8_t use_vrf = 0;
b5a8894d 6444
d62a17ae 6445 if (argv_find(argv, argc, "(1-65535)", &idx)) {
6446 instance = strtoul(argv[idx]->arg, NULL, 10);
6447 ospf = ospf_lookup_instance(instance);
ac28e4ec
CS
6448 if (ospf == NULL)
6449 return CMD_NOT_MY_INSTANCE;
b5a8894d
CS
6450 if (!ospf->oi_running)
6451 return CMD_SUCCESS;
6452
6453 return (show_ip_ospf_database_common(vty, ospf, idx ? 1 : 0,
b1c3ae8c 6454 argc, argv, use_vrf));
b5a8894d
CS
6455 } else if (argv_find(argv, argc, "vrf", &idx)) {
6456 vrf_name = argv[++idx]->arg;
6457 all_vrf = strmatch(vrf_name, "all");
d62a17ae 6458 }
7c8ff89e 6459
b5a8894d 6460 if (vrf_name) {
b1c3ae8c 6461 use_vrf = 1;
b5a8894d
CS
6462 if (all_vrf) {
6463 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
6464 if (!ospf->oi_running)
6465 continue;
996c9314
LB
6466 ret = (show_ip_ospf_database_common(
6467 vty, ospf, idx ? 2 : 0, argc, argv,
6468 use_vrf));
b5a8894d
CS
6469 }
6470 } else {
6471 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
9f049418 6472 if ((ospf == NULL) || !ospf->oi_running) {
94d4c685 6473 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6474 return CMD_SUCCESS;
9f049418
DS
6475 }
6476
996c9314
LB
6477 ret = (show_ip_ospf_database_common(
6478 vty, ospf, idx ? 2 : 0, argc, argv, use_vrf));
b5a8894d
CS
6479 }
6480 } else {
6481 /* Display default ospf (instance 0) info */
6482 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
9f049418 6483 if (ospf == NULL || !ospf->oi_running) {
94d4c685 6484 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6485 return CMD_SUCCESS;
9f049418
DS
6486 }
6487
b1c3ae8c
CS
6488 ret = (show_ip_ospf_database_common(vty, ospf, 0, argc, argv,
6489 use_vrf));
b5a8894d 6490 }
7c8ff89e 6491
b5a8894d 6492 return ret;
7c8ff89e
DS
6493}
6494
7a7be519 6495DEFUN (show_ip_ospf_instance_database_max,
6496 show_ip_ospf_instance_database_max_cmd,
6497 "show ip ospf (1-65535) database <max-age|self-originate>",
6498 SHOW_STR
6499 IP_STR
6500 "OSPF information\n"
6501 "Instance ID\n"
6502 "Database summary\n"
6503 "LSAs in MaxAge list\n"
6504 "Self-originated link states\n")
6505{
d62a17ae 6506 int idx_number = 3;
6507 struct ospf *ospf;
d7c0a89a 6508 unsigned short instance = 0;
d62a17ae 6509
6510 instance = strtoul(argv[idx_number]->arg, NULL, 10);
6511
ac28e4ec
CS
6512 ospf = ospf_lookup_instance(instance);
6513 if (ospf == NULL)
6514 return CMD_NOT_MY_INSTANCE;
6515
9f049418 6516 if (!ospf->oi_running) {
94d4c685 6517 vty_out(vty, "%% OSPF instance not found\n");
d62a17ae 6518 return CMD_SUCCESS;
9f049418 6519 }
d62a17ae 6520
b1c3ae8c 6521 return show_ip_ospf_database_common(vty, ospf, 1, argc, argv, 0);
d62a17ae 6522}
6523
6524
6525static int show_ip_ospf_database_type_adv_router_common(struct vty *vty,
6526 struct ospf *ospf,
6527 int arg_base, int argc,
b1c3ae8c 6528 struct cmd_token **argv,
d7c0a89a 6529 uint8_t use_vrf)
d62a17ae 6530{
6531 int idx_type = 4;
6532 int type, ret;
6533 struct in_addr adv_router;
6534
6535 if (ospf->instance)
6536 vty_out(vty, "\nOSPF Instance: %d\n", ospf->instance);
6537
b1c3ae8c 6538 ospf_show_vrf_name(ospf, vty, NULL, use_vrf);
87bd50e8 6539
d62a17ae 6540 vty_out(vty, "\n OSPF Router with ID (%s)\n\n",
6541 inet_ntoa(ospf->router_id));
6542
6543 /* Set database type to show. */
6544 if (strncmp(argv[arg_base + idx_type]->text, "r", 1) == 0)
6545 type = OSPF_ROUTER_LSA;
6546 else if (strncmp(argv[arg_base + idx_type]->text, "ne", 2) == 0)
6547 type = OSPF_NETWORK_LSA;
6548 else if (strncmp(argv[arg_base + idx_type]->text, "ns", 2) == 0)
6549 type = OSPF_AS_NSSA_LSA;
6550 else if (strncmp(argv[arg_base + idx_type]->text, "s", 1) == 0)
6551 type = OSPF_SUMMARY_LSA;
6552 else if (strncmp(argv[arg_base + idx_type]->text, "a", 1) == 0)
6553 type = OSPF_ASBR_SUMMARY_LSA;
6554 else if (strncmp(argv[arg_base + idx_type]->text, "e", 1) == 0)
6555 type = OSPF_AS_EXTERNAL_LSA;
6556 else if (strncmp(argv[arg_base + idx_type]->text, "opaque-l", 8) == 0)
6557 type = OSPF_OPAQUE_LINK_LSA;
6558 else if (strncmp(argv[arg_base + idx_type]->text, "opaque-ar", 9) == 0)
6559 type = OSPF_OPAQUE_AREA_LSA;
6560 else if (strncmp(argv[arg_base + idx_type]->text, "opaque-as", 9) == 0)
6561 type = OSPF_OPAQUE_AS_LSA;
6562 else
6563 return CMD_WARNING;
7c8ff89e 6564
d62a17ae 6565 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6566 if (strncmp(argv[arg_base + 5]->text, "s", 1) == 0)
6567 adv_router = ospf->router_id;
6568 else {
6569 ret = inet_aton(argv[arg_base + 6]->arg, &adv_router);
6570 if (!ret)
6571 return CMD_WARNING;
6572 }
7c8ff89e 6573
d62a17ae 6574 show_lsa_detail_adv_router(vty, ospf, type, &adv_router);
7c8ff89e 6575
d62a17ae 6576 return CMD_SUCCESS;
7c8ff89e
DS
6577}
6578
7c8ff89e
DS
6579DEFUN (show_ip_ospf_instance_database_type_adv_router,
6580 show_ip_ospf_instance_database_type_adv_router_cmd,
43b8d1d8 6581 "show ip ospf [{(1-65535)|vrf NAME}] database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate>",
7c8ff89e
DS
6582 SHOW_STR
6583 IP_STR
6584 "OSPF information\n"
6585 "Instance ID\n"
b5a8894d 6586 VRF_CMD_HELP_STR
7c8ff89e
DS
6587 "Database summary\n"
6588 OSPF_LSA_TYPES_DESC
6589 "Advertising Router link states\n"
3a2d747c
QY
6590 "Advertising Router (as an IP address)\n"
6591 "Self-originated link states\n")
7c8ff89e 6592{
b5a8894d 6593 struct ospf *ospf = NULL;
d7c0a89a 6594 unsigned short instance = 0;
b5a8894d
CS
6595 struct listnode *node = NULL;
6596 char *vrf_name = NULL;
2951a7a4 6597 bool all_vrf = false;
b5a8894d
CS
6598 int ret = CMD_SUCCESS;
6599 int inst = 0;
43b8d1d8 6600 int idx = 0, idx_vrf = 0;
d7c0a89a 6601 uint8_t use_vrf = 0;
7c8ff89e 6602
d62a17ae 6603 if (argv_find(argv, argc, "(1-65535)", &idx)) {
6604 instance = strtoul(argv[idx]->arg, NULL, 10);
6605 ospf = ospf_lookup_instance(instance);
ac28e4ec
CS
6606 if (ospf == NULL)
6607 return CMD_NOT_MY_INSTANCE;
9f049418 6608 if (!ospf->oi_running) {
94d4c685 6609 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6610 return CMD_SUCCESS;
9f049418
DS
6611 }
6612
996c9314
LB
6613 return (show_ip_ospf_database_type_adv_router_common(
6614 vty, ospf, idx ? 1 : 0, argc, argv, use_vrf));
b5a8894d 6615 }
43b8d1d8
CS
6616
6617 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
6618
b5a8894d 6619 if (vrf_name) {
2951a7a4 6620 bool ospf_output = false;
874f58d8 6621
b1c3ae8c 6622 use_vrf = 1;
94d4c685 6623
b5a8894d
CS
6624 if (all_vrf) {
6625 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
6626 if (!ospf->oi_running)
6627 continue;
2951a7a4 6628 ospf_output = true;
996c9314
LB
6629 ret = show_ip_ospf_database_type_adv_router_common(
6630 vty, ospf, idx ? 1 : 0, argc, argv,
6631 use_vrf);
b5a8894d 6632 }
9f049418
DS
6633 if (!ospf_output)
6634 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d
CS
6635 } else {
6636 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
9f049418 6637 if ((ospf == NULL) || !ospf->oi_running) {
94d4c685 6638 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6639 return CMD_SUCCESS;
9f049418
DS
6640 }
6641
996c9314
LB
6642 ret = show_ip_ospf_database_type_adv_router_common(
6643 vty, ospf, idx ? 1 : 0, argc, argv, use_vrf);
b5a8894d
CS
6644 }
6645 } else {
6646 /* Display default ospf (instance 0) info */
6647 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
9f049418 6648 if (ospf == NULL || !ospf->oi_running) {
94d4c685 6649 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 6650 return CMD_SUCCESS;
9f049418
DS
6651 }
6652
996c9314
LB
6653 ret = show_ip_ospf_database_type_adv_router_common(
6654 vty, ospf, idx ? 1 : 0, argc, argv, use_vrf);
b5a8894d
CS
6655 }
6656 return ret;
6657 /*return (show_ip_ospf_database_type_adv_router_common(
6658 vty, ospf, idx ? 1 : 0, argc, argv));*/
718e3744 6659}
6660
718e3744 6661DEFUN (ip_ospf_authentication_args,
6662 ip_ospf_authentication_args_addr_cmd,
7a7be519 6663 "ip ospf authentication <null|message-digest> [A.B.C.D]",
718e3744 6664 "IP Information\n"
6665 "OSPF interface commands\n"
6666 "Enable authentication on this interface\n"
6667 "Use null authentication\n"
6668 "Use message-digest authentication\n"
7a7be519 6669 "Address of interface\n")
718e3744 6670{
d62a17ae 6671 VTY_DECLVAR_CONTEXT(interface, ifp);
6672 int idx_encryption = 3;
6673 int idx_ipv4 = 4;
6674 struct in_addr addr;
6675 int ret;
6676 struct ospf_if_params *params;
6677
6678 params = IF_DEF_PARAMS(ifp);
6679
6680 if (argc == 5) {
6681 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
6682 if (!ret) {
6683 vty_out(vty,
6684 "Please specify interface address by A.B.C.D\n");
6685 return CMD_WARNING_CONFIG_FAILED;
6686 }
718e3744 6687
d62a17ae 6688 params = ospf_get_if_params(ifp, addr);
6689 ospf_if_update_params(ifp, addr);
6690 }
718e3744 6691
d62a17ae 6692 /* Handle null authentication */
6693 if (argv[idx_encryption]->arg[0] == 'n') {
6694 SET_IF_PARAM(params, auth_type);
6695 params->auth_type = OSPF_AUTH_NULL;
6696 return CMD_SUCCESS;
6697 }
718e3744 6698
d62a17ae 6699 /* Handle message-digest authentication */
6700 if (argv[idx_encryption]->arg[0] == 'm') {
6701 SET_IF_PARAM(params, auth_type);
6702 params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
6703 return CMD_SUCCESS;
6704 }
718e3744 6705
d62a17ae 6706 vty_out(vty, "You shouldn't get here!\n");
6707 return CMD_WARNING_CONFIG_FAILED;
718e3744 6708}
6709
718e3744 6710DEFUN (ip_ospf_authentication,
6711 ip_ospf_authentication_addr_cmd,
7a7be519 6712 "ip ospf authentication [A.B.C.D]",
718e3744 6713 "IP Information\n"
6714 "OSPF interface commands\n"
6715 "Enable authentication on this interface\n"
efd7904e 6716 "Address of interface\n")
718e3744 6717{
d62a17ae 6718 VTY_DECLVAR_CONTEXT(interface, ifp);
6719 int idx_ipv4 = 3;
6720 struct in_addr addr;
6721 int ret;
6722 struct ospf_if_params *params;
6723
6724 params = IF_DEF_PARAMS(ifp);
6725
6726 if (argc == 4) {
6727 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
6728 if (!ret) {
6729 vty_out(vty,
6730 "Please specify interface address by A.B.C.D\n");
6731 return CMD_WARNING_CONFIG_FAILED;
6732 }
6733
6734 params = ospf_get_if_params(ifp, addr);
6735 ospf_if_update_params(ifp, addr);
718e3744 6736 }
6737
d62a17ae 6738 SET_IF_PARAM(params, auth_type);
6739 params->auth_type = OSPF_AUTH_SIMPLE;
718e3744 6740
d62a17ae 6741 return CMD_SUCCESS;
718e3744 6742}
6743
b4a039bf
DS
6744DEFUN (no_ip_ospf_authentication_args,
6745 no_ip_ospf_authentication_args_addr_cmd,
7a7be519 6746 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
b4a039bf
DS
6747 NO_STR
6748 "IP Information\n"
6749 "OSPF interface commands\n"
6750 "Enable authentication on this interface\n"
6751 "Use null authentication\n"
6752 "Use message-digest authentication\n"
efd7904e 6753 "Address of interface\n")
b4a039bf 6754{
d62a17ae 6755 VTY_DECLVAR_CONTEXT(interface, ifp);
6756 int idx_encryption = 4;
6757 int idx_ipv4 = 5;
6758 struct in_addr addr;
6759 int ret;
6760 struct ospf_if_params *params;
6761 struct route_node *rn;
6762 int auth_type;
6763
6764 params = IF_DEF_PARAMS(ifp);
6765
6766 if (argc == 6) {
6767 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
6768 if (!ret) {
6769 vty_out(vty,
6770 "Please specify interface address by A.B.C.D\n");
6771 return CMD_WARNING_CONFIG_FAILED;
6772 }
b4a039bf 6773
d62a17ae 6774 params = ospf_lookup_if_params(ifp, addr);
6775 if (params == NULL) {
6776 vty_out(vty, "Ip Address specified is unknown\n");
6777 return CMD_WARNING_CONFIG_FAILED;
6778 }
6779 params->auth_type = OSPF_AUTH_NOTSET;
6780 UNSET_IF_PARAM(params, auth_type);
6781 if (params != IF_DEF_PARAMS(ifp)) {
6782 ospf_free_if_params(ifp, addr);
6783 ospf_if_update_params(ifp, addr);
6784 }
6785 } else {
6786 if (argv[idx_encryption]->arg[0] == 'n') {
6787 auth_type = OSPF_AUTH_NULL;
6788 } else if (argv[idx_encryption]->arg[0] == 'm') {
6789 auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
6790 } else {
6791 vty_out(vty, "Unexpected input encountered\n");
6792 return CMD_WARNING_CONFIG_FAILED;
6793 }
6794 /*
6795 * Here we have a case where the user has entered
6796 * 'no ip ospf authentication (null | message_digest )'
6797 * we need to find if we have any ip addresses underneath it
6798 * that
6799 * correspond to the associated type.
6800 */
6801 if (params->auth_type == auth_type) {
6802 params->auth_type = OSPF_AUTH_NOTSET;
6803 UNSET_IF_PARAM(params, auth_type);
6804 }
6805
6806 for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn;
6807 rn = route_next(rn)) {
6808 if ((params = rn->info)) {
6809 if (params->auth_type == auth_type) {
6810 params->auth_type = OSPF_AUTH_NOTSET;
6811 UNSET_IF_PARAM(params, auth_type);
6812 if (params != IF_DEF_PARAMS(ifp)) {
6813 ospf_free_if_params(
6814 ifp, rn->p.u.prefix4);
6815 ospf_if_update_params(
6816 ifp, rn->p.u.prefix4);
6817 }
6818 }
6819 }
b4a039bf 6820 }
b4a039bf 6821 }
b4a039bf 6822
d62a17ae 6823 return CMD_SUCCESS;
b4a039bf
DS
6824}
6825
718e3744 6826DEFUN (no_ip_ospf_authentication,
6827 no_ip_ospf_authentication_addr_cmd,
7a7be519 6828 "no ip ospf authentication [A.B.C.D]",
718e3744 6829 NO_STR
6830 "IP Information\n"
6831 "OSPF interface commands\n"
6832 "Enable authentication on this interface\n"
efd7904e 6833 "Address of interface\n")
718e3744 6834{
d62a17ae 6835 VTY_DECLVAR_CONTEXT(interface, ifp);
6836 int idx_ipv4 = 4;
6837 struct in_addr addr;
6838 int ret;
6839 struct ospf_if_params *params;
6840 struct route_node *rn;
6841
6842 params = IF_DEF_PARAMS(ifp);
6843
6844 if (argc == 5) {
6845 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
6846 if (!ret) {
6847 vty_out(vty,
6848 "Please specify interface address by A.B.C.D\n");
6849 return CMD_WARNING_CONFIG_FAILED;
6850 }
718e3744 6851
d62a17ae 6852 params = ospf_lookup_if_params(ifp, addr);
6853 if (params == NULL) {
6854 vty_out(vty, "Ip Address specified is unknown\n");
6855 return CMD_WARNING_CONFIG_FAILED;
6856 }
718e3744 6857
d62a17ae 6858 params->auth_type = OSPF_AUTH_NOTSET;
6859 UNSET_IF_PARAM(params, auth_type);
6860 if (params != IF_DEF_PARAMS(ifp)) {
6861 ospf_free_if_params(ifp, addr);
6862 ospf_if_update_params(ifp, addr);
6863 }
6864 } else {
6865 /*
6866 * When a user enters 'no ip ospf authentication'
6867 * We should remove all authentication types from
6868 * the interface.
6869 */
6870 if ((params->auth_type == OSPF_AUTH_NULL)
6871 || (params->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
6872 || (params->auth_type == OSPF_AUTH_SIMPLE)) {
6873 params->auth_type = OSPF_AUTH_NOTSET;
6874 UNSET_IF_PARAM(params, auth_type);
6875 }
813d4307 6876
d62a17ae 6877 for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn;
6878 rn = route_next(rn)) {
6879 if ((params = rn->info)) {
6880
6881 if ((params->auth_type == OSPF_AUTH_NULL)
6882 || (params->auth_type
6883 == OSPF_AUTH_CRYPTOGRAPHIC)
6884 || (params->auth_type
6885 == OSPF_AUTH_SIMPLE)) {
6886 params->auth_type = OSPF_AUTH_NOTSET;
6887 UNSET_IF_PARAM(params, auth_type);
6888 if (params != IF_DEF_PARAMS(ifp)) {
6889 ospf_free_if_params(
6890 ifp, rn->p.u.prefix4);
6891 ospf_if_update_params(
6892 ifp, rn->p.u.prefix4);
6893 }
6894 }
6895 }
b4a039bf 6896 }
b4a039bf 6897 }
d62a17ae 6898
6899 return CMD_SUCCESS;
718e3744 6900}
6901
0d829fa7 6902
718e3744 6903DEFUN (ip_ospf_authentication_key,
6904 ip_ospf_authentication_key_addr_cmd,
7a7be519 6905 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
718e3744 6906 "IP Information\n"
6907 "OSPF interface commands\n"
6908 "Authentication password (key)\n"
6909 "The OSPF password (key)\n"
efd7904e 6910 "Address of interface\n")
718e3744 6911{
d62a17ae 6912 VTY_DECLVAR_CONTEXT(interface, ifp);
6913 int idx = 0;
6914 struct in_addr addr;
6915 struct ospf_if_params *params;
718e3744 6916
d62a17ae 6917 params = IF_DEF_PARAMS(ifp);
6918
6919 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
6920 if (!inet_aton(argv[idx]->arg, &addr)) {
6921 vty_out(vty,
6922 "Please specify interface address by A.B.C.D\n");
6923 return CMD_WARNING_CONFIG_FAILED;
6924 }
718e3744 6925
d62a17ae 6926 params = ospf_get_if_params(ifp, addr);
6927 ospf_if_update_params(ifp, addr);
6928 }
718e3744 6929
4d65d927
QY
6930 strlcpy((char *)params->auth_simple, argv[3]->arg,
6931 sizeof(params->auth_simple));
d62a17ae 6932 SET_IF_PARAM(params, auth_simple);
718e3744 6933
d62a17ae 6934 return CMD_SUCCESS;
718e3744 6935}
6936
7a7be519 6937DEFUN_HIDDEN (ospf_authentication_key,
747e489c 6938 ospf_authentication_key_cmd,
0d829fa7 6939 "ospf authentication-key AUTH_KEY [A.B.C.D]",
747e489c 6940 "OSPF interface commands\n"
baf9eaad 6941 VLINK_HELPSTR_AUTH_SIMPLE
0d829fa7 6942 "Address of interface\n")
718e3744 6943{
d62a17ae 6944 return ip_ospf_authentication_key(self, vty, argc, argv);
718e3744 6945}
6946
7a7be519 6947DEFUN (no_ip_ospf_authentication_key,
6948 no_ip_ospf_authentication_key_authkey_addr_cmd,
6949 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6950 NO_STR
6951 "IP Information\n"
6952 "OSPF interface commands\n"
baf9eaad
CS
6953 VLINK_HELPSTR_AUTH_SIMPLE
6954 "Address of interface\n")
7a7be519 6955{
d62a17ae 6956 VTY_DECLVAR_CONTEXT(interface, ifp);
6957 int idx = 0;
6958 struct in_addr addr;
6959 struct ospf_if_params *params;
6960 params = IF_DEF_PARAMS(ifp);
6961
6962 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
6963 if (!inet_aton(argv[idx]->arg, &addr)) {
6964 vty_out(vty,
6965 "Please specify interface address by A.B.C.D\n");
6966 return CMD_WARNING_CONFIG_FAILED;
6967 }
7a7be519 6968
d62a17ae 6969 params = ospf_lookup_if_params(ifp, addr);
6970 if (params == NULL)
6971 return CMD_SUCCESS;
7a7be519 6972 }
813d4307 6973
d62a17ae 6974 memset(params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
6975 UNSET_IF_PARAM(params, auth_simple);
718e3744 6976
d62a17ae 6977 if (params != IF_DEF_PARAMS(ifp)) {
6978 ospf_free_if_params(ifp, addr);
6979 ospf_if_update_params(ifp, addr);
6980 }
813d4307 6981
d62a17ae 6982 return CMD_SUCCESS;
7a7be519 6983}
813d4307 6984
0d829fa7
QY
6985DEFUN_HIDDEN (no_ospf_authentication_key,
6986 no_ospf_authentication_key_authkey_addr_cmd,
6987 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6988 NO_STR
6989 "OSPF interface commands\n"
baf9eaad
CS
6990 VLINK_HELPSTR_AUTH_SIMPLE
6991 "Address of interface\n")
0d829fa7 6992{
d62a17ae 6993 return no_ip_ospf_authentication_key(self, vty, argc, argv);
0d829fa7
QY
6994}
6995
718e3744 6996DEFUN (ip_ospf_message_digest_key,
537eae3f 6997 ip_ospf_message_digest_key_cmd,
7a7be519 6998 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
718e3744 6999 "IP Information\n"
7000 "OSPF interface commands\n"
7001 "Message digest authentication password (key)\n"
7002 "Key ID\n"
7003 "Use MD5 algorithm\n"
fefa0d82
QY
7004 "The OSPF password (key)\n"
7005 "Address of interface\n")
718e3744 7006{
d62a17ae 7007 VTY_DECLVAR_CONTEXT(interface, ifp);
7008 struct crypt_key *ck;
d7c0a89a 7009 uint8_t key_id;
d62a17ae 7010 struct in_addr addr;
7011 struct ospf_if_params *params;
7012
7013 params = IF_DEF_PARAMS(ifp);
7014 int idx = 0;
7015
7016 argv_find(argv, argc, "(1-255)", &idx);
7017 char *keyid = argv[idx]->arg;
7018 argv_find(argv, argc, "KEY", &idx);
7019 char *cryptkey = argv[idx]->arg;
7020
7021 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7022 if (!inet_aton(argv[idx]->arg, &addr)) {
7023 vty_out(vty,
7024 "Please specify interface address by A.B.C.D\n");
7025 return CMD_WARNING_CONFIG_FAILED;
7026 }
7027
7028 params = ospf_get_if_params(ifp, addr);
7029 ospf_if_update_params(ifp, addr);
718e3744 7030 }
7031
d62a17ae 7032 key_id = strtol(keyid, NULL, 10);
7033 if (ospf_crypt_key_lookup(params->auth_crypt, key_id) != NULL) {
7034 vty_out(vty, "OSPF: Key %d already exists\n", key_id);
851fcbae 7035 return CMD_WARNING;
d62a17ae 7036 }
718e3744 7037
d62a17ae 7038 ck = ospf_crypt_key_new();
d7c0a89a 7039 ck->key_id = (uint8_t)key_id;
4d65d927 7040 strlcpy((char *)ck->auth_key, cryptkey, sizeof(ck->auth_key));
718e3744 7041
d62a17ae 7042 ospf_crypt_key_add(params->auth_crypt, ck);
7043 SET_IF_PARAM(params, auth_crypt);
718e3744 7044
d62a17ae 7045 return CMD_SUCCESS;
718e3744 7046}
7047
7a7be519 7048DEFUN_HIDDEN (ospf_message_digest_key,
747e489c 7049 ospf_message_digest_key_cmd,
0d829fa7 7050 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
747e489c
DW
7051 "OSPF interface commands\n"
7052 "Message digest authentication password (key)\n"
7053 "Key ID\n"
7054 "Use MD5 algorithm\n"
0d829fa7
QY
7055 "The OSPF password (key)\n"
7056 "Address of interface\n")
7a7be519 7057{
d62a17ae 7058 return ip_ospf_message_digest_key(self, vty, argc, argv);
7a7be519 7059}
718e3744 7060
537eae3f
QY
7061DEFUN (no_ip_ospf_message_digest_key,
7062 no_ip_ospf_message_digest_key_cmd,
0d829fa7 7063 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
813d4307
DW
7064 NO_STR
7065 "IP Information\n"
7066 "OSPF interface commands\n"
7067 "Message digest authentication password (key)\n"
7068 "Key ID\n"
7069 "Use MD5 algorithm\n"
0d829fa7
QY
7070 "The OSPF password (key)\n"
7071 "Address of interface\n")
813d4307 7072{
d62a17ae 7073 VTY_DECLVAR_CONTEXT(interface, ifp);
7074 int idx = 0;
7075 struct crypt_key *ck;
7076 int key_id;
7077 struct in_addr addr;
7078 struct ospf_if_params *params;
7079 params = IF_DEF_PARAMS(ifp);
7080
7081 argv_find(argv, argc, "(1-255)", &idx);
7082 char *keyid = argv[idx]->arg;
7083
7084 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7085 if (!inet_aton(argv[idx]->arg, &addr)) {
7086 vty_out(vty,
7087 "Please specify interface address by A.B.C.D\n");
7088 return CMD_WARNING_CONFIG_FAILED;
7089 }
7a7be519 7090
d62a17ae 7091 params = ospf_lookup_if_params(ifp, addr);
7092 if (params == NULL)
7093 return CMD_SUCCESS;
7a7be519 7094 }
7095
d62a17ae 7096 key_id = strtol(keyid, NULL, 10);
7097 ck = ospf_crypt_key_lookup(params->auth_crypt, key_id);
7098 if (ck == NULL) {
7099 vty_out(vty, "OSPF: Key %d does not exist\n", key_id);
7100 return CMD_WARNING_CONFIG_FAILED;
7101 }
7a7be519 7102
d62a17ae 7103 ospf_crypt_key_delete(params->auth_crypt, key_id);
7a7be519 7104
d62a17ae 7105 if (params != IF_DEF_PARAMS(ifp)) {
7106 ospf_free_if_params(ifp, addr);
7107 ospf_if_update_params(ifp, addr);
7108 }
7a7be519 7109
d62a17ae 7110 return CMD_SUCCESS;
7a7be519 7111}
813d4307 7112
0d829fa7 7113DEFUN_HIDDEN (no_ospf_message_digest_key,
537eae3f 7114 no_ospf_message_digest_key_cmd,
0d829fa7
QY
7115 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7116 NO_STR
7117 "OSPF interface commands\n"
7118 "Message digest authentication password (key)\n"
7119 "Key ID\n"
efd7904e
RW
7120 "Use MD5 algorithm\n"
7121 "The OSPF password (key)\n"
7122 "Address of interface\n")
718e3744 7123{
d62a17ae 7124 return no_ip_ospf_message_digest_key(self, vty, argc, argv);
718e3744 7125}
7126
718e3744 7127DEFUN (ip_ospf_cost,
5c2fc921 7128 ip_ospf_cost_cmd,
7a7be519 7129 "ip ospf cost (1-65535) [A.B.C.D]",
718e3744 7130 "IP Information\n"
7131 "OSPF interface commands\n"
7132 "Interface cost\n"
7133 "Cost\n"
5c2fc921 7134 "Address of interface\n")
718e3744 7135{
d62a17ae 7136 VTY_DECLVAR_CONTEXT(interface, ifp);
7137 int idx = 0;
d7c0a89a 7138 uint32_t cost = OSPF_OUTPUT_COST_DEFAULT;
d62a17ae 7139 struct in_addr addr;
7140 struct ospf_if_params *params;
7141 params = IF_DEF_PARAMS(ifp);
7142
7143 // get arguments
7144 char *coststr = NULL, *ifaddr = NULL;
35955c14 7145
c31a793b
VJ
7146 argv_find(argv, argc, "(1-65535)", &idx);
7147 coststr = argv[idx]->arg;
d62a17ae 7148 cost = strtol(coststr, NULL, 10);
7149
c31a793b 7150 ifaddr = argv_find(argv, argc, "A.B.C.D", &idx) ? argv[idx]->arg : NULL;
d62a17ae 7151 if (ifaddr) {
7152 if (!inet_aton(ifaddr, &addr)) {
7153 vty_out(vty,
7154 "Please specify interface address by A.B.C.D\n");
7155 return CMD_WARNING_CONFIG_FAILED;
7156 }
718e3744 7157
d62a17ae 7158 params = ospf_get_if_params(ifp, addr);
7159 ospf_if_update_params(ifp, addr);
718e3744 7160 }
7161
d62a17ae 7162 SET_IF_PARAM(params, output_cost_cmd);
7163 params->output_cost_cmd = cost;
718e3744 7164
d62a17ae 7165 ospf_if_recalculate_output_cost(ifp);
5c2fc921 7166
d62a17ae 7167 return CMD_SUCCESS;
718e3744 7168}
7169
7a7be519 7170DEFUN_HIDDEN (ospf_cost,
5c2fc921
QY
7171 ospf_cost_cmd,
7172 "ospf cost (1-65535) [A.B.C.D]",
747e489c
DW
7173 "OSPF interface commands\n"
7174 "Interface cost\n"
7175 "Cost\n"
5c2fc921 7176 "Address of interface\n")
7a7be519 7177{
d62a17ae 7178 return ip_ospf_cost(self, vty, argc, argv);
7a7be519 7179}
9eff36b3 7180
718e3744 7181DEFUN (no_ip_ospf_cost,
5c2fc921
QY
7182 no_ip_ospf_cost_cmd,
7183 "no ip ospf cost [(1-65535)] [A.B.C.D]",
718e3744 7184 NO_STR
efd7904e 7185 "IP Information\n"
718e3744 7186 "OSPF interface commands\n"
7187 "Interface cost\n"
efd7904e
RW
7188 "Cost\n"
7189 "Address of interface\n")
718e3744 7190{
d62a17ae 7191 VTY_DECLVAR_CONTEXT(interface, ifp);
7192 int idx = 0;
7193 struct in_addr addr;
7194 struct ospf_if_params *params;
7a7be519 7195
d62a17ae 7196 params = IF_DEF_PARAMS(ifp);
718e3744 7197
d62a17ae 7198 // get arguments
7199 char *ifaddr = NULL;
7200 ifaddr = argv_find(argv, argc, "A.B.C.D", &idx) ? argv[idx]->arg : NULL;
718e3744 7201
d62a17ae 7202 /* According to the semantics we are mimicking "no ip ospf cost N" is
7203 * always treated as "no ip ospf cost" regardless of the actual value
7204 * of N already configured for the interface. Thus ignore cost. */
7a7be519 7205
d62a17ae 7206 if (ifaddr) {
7207 if (!inet_aton(ifaddr, &addr)) {
7208 vty_out(vty,
7209 "Please specify interface address by A.B.C.D\n");
7210 return CMD_WARNING_CONFIG_FAILED;
7211 }
7a7be519 7212
d62a17ae 7213 params = ospf_lookup_if_params(ifp, addr);
7214 if (params == NULL)
7215 return CMD_SUCCESS;
7216 }
7a7be519 7217
d62a17ae 7218 UNSET_IF_PARAM(params, output_cost_cmd);
7a7be519 7219
d62a17ae 7220 if (params != IF_DEF_PARAMS(ifp)) {
7221 ospf_free_if_params(ifp, addr);
7222 ospf_if_update_params(ifp, addr);
7223 }
7a7be519 7224
d62a17ae 7225 ospf_if_recalculate_output_cost(ifp);
7a7be519 7226
d62a17ae 7227 return CMD_SUCCESS;
7a7be519 7228}
9eff36b3 7229
5c2fc921
QY
7230DEFUN_HIDDEN (no_ospf_cost,
7231 no_ospf_cost_cmd,
7232 "no ospf cost [(1-65535)] [A.B.C.D]",
7233 NO_STR
7234 "OSPF interface commands\n"
7235 "Interface cost\n"
7236 "Cost\n"
7237 "Address of interface\n")
827341b7 7238{
d62a17ae 7239 return no_ip_ospf_cost(self, vty, argc, argv);
827341b7
DO
7240}
7241
d62a17ae 7242static void ospf_nbr_timer_update(struct ospf_interface *oi)
718e3744 7243{
d62a17ae 7244 struct route_node *rn;
7245 struct ospf_neighbor *nbr;
718e3744 7246
d62a17ae 7247 for (rn = route_top(oi->nbrs); rn; rn = route_next(rn))
7248 if ((nbr = rn->info)) {
7249 nbr->v_inactivity = OSPF_IF_PARAM(oi, v_wait);
7250 nbr->v_db_desc = OSPF_IF_PARAM(oi, retransmit_interval);
7251 nbr->v_ls_req = OSPF_IF_PARAM(oi, retransmit_interval);
7252 nbr->v_ls_upd = OSPF_IF_PARAM(oi, retransmit_interval);
7253 }
718e3744 7254}
7255
d62a17ae 7256static int ospf_vty_dead_interval_set(struct vty *vty, const char *interval_str,
7257 const char *nbr_str,
7258 const char *fast_hello_str)
7259{
7260 VTY_DECLVAR_CONTEXT(interface, ifp);
d7c0a89a
QY
7261 uint32_t seconds;
7262 uint8_t hellomult;
d62a17ae 7263 struct in_addr addr;
7264 int ret;
7265 struct ospf_if_params *params;
7266 struct ospf_interface *oi;
7267 struct route_node *rn;
718e3744 7268
d62a17ae 7269 params = IF_DEF_PARAMS(ifp);
7270
7271 if (nbr_str) {
7272 ret = inet_aton(nbr_str, &addr);
7273 if (!ret) {
7274 vty_out(vty,
7275 "Please specify interface address by A.B.C.D\n");
7276 return CMD_WARNING_CONFIG_FAILED;
7277 }
7278
7279 params = ospf_get_if_params(ifp, addr);
7280 ospf_if_update_params(ifp, addr);
7281 }
7282
7283 if (interval_str) {
7284 seconds = strtoul(interval_str, NULL, 10);
7285
7286 /* reset fast_hello too, just to be sure */
7287 UNSET_IF_PARAM(params, fast_hello);
7288 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
7289 } else if (fast_hello_str) {
7290 hellomult = strtoul(fast_hello_str, NULL, 10);
7291 /* 1s dead-interval with sub-second hellos desired */
7292 seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
7293 SET_IF_PARAM(params, fast_hello);
7294 params->fast_hello = hellomult;
7295 } else {
7296 vty_out(vty,
7297 "Please specify dead-interval or hello-multiplier\n");
7298 return CMD_WARNING_CONFIG_FAILED;
7299 }
7300
7301 SET_IF_PARAM(params, v_wait);
7302 params->v_wait = seconds;
7303
7304 /* Update timer values in neighbor structure. */
7305 if (nbr_str) {
b5a8894d
CS
7306 struct ospf *ospf = NULL;
7307
a36898e7 7308 ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
b5a8894d 7309 if (ospf) {
d62a17ae 7310 oi = ospf_if_lookup_by_local_addr(ospf, ifp, addr);
7311 if (oi)
7312 ospf_nbr_timer_update(oi);
7313 }
7314 } else {
7315 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
7316 if ((oi = rn->info))
7317 ospf_nbr_timer_update(oi);
7318 }
7319
7320 return CMD_SUCCESS;
718e3744 7321}
7322
f9ad937f 7323DEFUN (ip_ospf_dead_interval,
0d829fa7 7324 ip_ospf_dead_interval_cmd,
7a7be519 7325 "ip ospf dead-interval (1-65535) [A.B.C.D]",
f9ad937f 7326 "IP Information\n"
7327 "OSPF interface commands\n"
99a522c7 7328 "Interval time after which a neighbor is declared down\n"
f9ad937f 7329 "Seconds\n"
7330 "Address of interface\n")
7331{
d62a17ae 7332 int idx = 0;
7333 char *interval = argv_find(argv, argc, "(1-65535)", &idx)
7334 ? argv[idx]->arg
7335 : NULL;
7336 char *ifaddr =
7337 argv_find(argv, argc, "A.B.C.D", &idx) ? argv[idx]->arg : NULL;
7338 return ospf_vty_dead_interval_set(vty, interval, ifaddr, NULL);
f9ad937f 7339}
7340
718e3744 7341
7a7be519 7342DEFUN_HIDDEN (ospf_dead_interval,
747e489c 7343 ospf_dead_interval_cmd,
0d829fa7 7344 "ospf dead-interval (1-65535) [A.B.C.D]",
747e489c 7345 "OSPF interface commands\n"
99a522c7 7346 "Interval time after which a neighbor is declared down\n"
0d829fa7
QY
7347 "Seconds\n"
7348 "Address of interface\n")
7a7be519 7349{
d62a17ae 7350 return ip_ospf_dead_interval(self, vty, argc, argv);
7a7be519 7351}
718e3744 7352
f9ad937f 7353DEFUN (ip_ospf_dead_interval_minimal,
7354 ip_ospf_dead_interval_minimal_addr_cmd,
7a7be519 7355 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
f9ad937f 7356 "IP Information\n"
7357 "OSPF interface commands\n"
99a522c7 7358 "Interval time after which a neighbor is declared down\n"
f9ad937f 7359 "Minimal 1s dead-interval with fast sub-second hellos\n"
7360 "Hello multiplier factor\n"
7361 "Number of Hellos to send each second\n"
7362 "Address of interface\n")
7363{
d62a17ae 7364 int idx_number = 5;
7365 int idx_ipv4 = 6;
7366 if (argc == 7)
7367 return ospf_vty_dead_interval_set(
7368 vty, NULL, argv[idx_ipv4]->arg, argv[idx_number]->arg);
7369 else
7370 return ospf_vty_dead_interval_set(vty, NULL, NULL,
7371 argv[idx_number]->arg);
f9ad937f 7372}
7373
718e3744 7374DEFUN (no_ip_ospf_dead_interval,
0d829fa7 7375 no_ip_ospf_dead_interval_cmd,
e83a9414 7376 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
718e3744 7377 NO_STR
7378 "IP Information\n"
7379 "OSPF interface commands\n"
99a522c7 7380 "Interval time after which a neighbor is declared down\n"
f9dfba8d 7381 "Seconds\n"
efd7904e
RW
7382 "Minimal 1s dead-interval with fast sub-second hellos\n"
7383 "Hello multiplier factor\n"
7384 "Number of Hellos to send each second\n"
7385 "Address of interface\n")
718e3744 7386{
d62a17ae 7387 VTY_DECLVAR_CONTEXT(interface, ifp);
7388 int idx_ipv4 = argc - 1;
7389 struct in_addr addr = {.s_addr = 0L};
7390 int ret;
7391 struct ospf_if_params *params;
7392 struct ospf_interface *oi;
7393 struct route_node *rn;
7394
7395 params = IF_DEF_PARAMS(ifp);
7396
7397 if (argv[idx_ipv4]->type == IPV4_TKN) {
7398 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
7399 if (!ret) {
7400 vty_out(vty,
7401 "Please specify interface address by A.B.C.D\n");
7402 return CMD_WARNING_CONFIG_FAILED;
7403 }
020709f9 7404
d62a17ae 7405 params = ospf_lookup_if_params(ifp, addr);
7406 if (params == NULL)
7407 return CMD_SUCCESS;
7408 }
718e3744 7409
d62a17ae 7410 UNSET_IF_PARAM(params, v_wait);
7411 params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
7412
7413 UNSET_IF_PARAM(params, fast_hello);
7414 params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
7415
7416 if (params != IF_DEF_PARAMS(ifp)) {
7417 ospf_free_if_params(ifp, addr);
7418 ospf_if_update_params(ifp, addr);
718e3744 7419 }
7420
d62a17ae 7421 /* Update timer values in neighbor structure. */
7422 if (argc == 1) {
b5a8894d 7423 struct ospf *ospf = NULL;
718e3744 7424
a36898e7 7425 ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
b5a8894d 7426 if (ospf) {
d62a17ae 7427 oi = ospf_if_lookup_by_local_addr(ospf, ifp, addr);
7428 if (oi)
7429 ospf_nbr_timer_update(oi);
7430 }
7431 } else {
7432 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
7433 if ((oi = rn->info))
7434 ospf_nbr_timer_update(oi);
7435 }
7436
7437 return CMD_SUCCESS;
718e3744 7438}
7439
0d829fa7
QY
7440DEFUN_HIDDEN (no_ospf_dead_interval,
7441 no_ospf_dead_interval_cmd,
7442 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7443 NO_STR
7444 "OSPF interface commands\n"
99a522c7 7445 "Interval time after which a neighbor is declared down\n"
0d829fa7 7446 "Seconds\n"
efd7904e
RW
7447 "Minimal 1s dead-interval with fast sub-second hellos\n"
7448 "Hello multiplier factor\n"
7449 "Number of Hellos to send each second\n"
7450 "Address of interface\n")
0d829fa7 7451{
d62a17ae 7452 return no_ip_ospf_dead_interval(self, vty, argc, argv);
0d829fa7
QY
7453}
7454
718e3744 7455DEFUN (ip_ospf_hello_interval,
0d829fa7 7456 ip_ospf_hello_interval_cmd,
7a7be519 7457 "ip ospf hello-interval (1-65535) [A.B.C.D]",
718e3744 7458 "IP Information\n"
7459 "OSPF interface commands\n"
7460 "Time between HELLO packets\n"
7461 "Seconds\n"
0d829fa7 7462 "Address of interface\n")
718e3744 7463{
d62a17ae 7464 VTY_DECLVAR_CONTEXT(interface, ifp);
7465 int idx = 0;
7466 struct in_addr addr;
7467 struct ospf_if_params *params;
7468 params = IF_DEF_PARAMS(ifp);
d7c0a89a 7469 uint32_t seconds = 0;
d62a17ae 7470
7471 argv_find(argv, argc, "(1-65535)", &idx);
7472 seconds = strtol(argv[idx]->arg, NULL, 10);
7473
7474 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7475 if (!inet_aton(argv[idx]->arg, &addr)) {
7476 vty_out(vty,
7477 "Please specify interface address by A.B.C.D\n");
7478 return CMD_WARNING_CONFIG_FAILED;
7479 }
718e3744 7480
d62a17ae 7481 params = ospf_get_if_params(ifp, addr);
7482 ospf_if_update_params(ifp, addr);
7483 }
718e3744 7484
d62a17ae 7485 SET_IF_PARAM(params, v_hello);
7486 params->v_hello = seconds;
718e3744 7487
d62a17ae 7488 return CMD_SUCCESS;
718e3744 7489}
7490
7a7be519 7491DEFUN_HIDDEN (ospf_hello_interval,
747e489c 7492 ospf_hello_interval_cmd,
0d829fa7 7493 "ospf hello-interval (1-65535) [A.B.C.D]",
747e489c
DW
7494 "OSPF interface commands\n"
7495 "Time between HELLO packets\n"
0d829fa7
QY
7496 "Seconds\n"
7497 "Address of interface\n")
7a7be519 7498{
d62a17ae 7499 return ip_ospf_hello_interval(self, vty, argc, argv);
7a7be519 7500}
718e3744 7501
7502DEFUN (no_ip_ospf_hello_interval,
0d829fa7
QY
7503 no_ip_ospf_hello_interval_cmd,
7504 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
718e3744 7505 NO_STR
7506 "IP Information\n"
7507 "OSPF interface commands\n"
0d829fa7 7508 "Time between HELLO packets\n" // ignored
f9dfba8d 7509 "Seconds\n"
0d829fa7 7510 "Address of interface\n")
718e3744 7511{
d62a17ae 7512 VTY_DECLVAR_CONTEXT(interface, ifp);
7513 int idx = 0;
7514 struct in_addr addr;
7515 struct ospf_if_params *params;
df581cd3 7516
d62a17ae 7517 params = IF_DEF_PARAMS(ifp);
718e3744 7518
d62a17ae 7519 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7520 if (!inet_aton(argv[idx]->arg, &addr)) {
7521 vty_out(vty,
7522 "Please specify interface address by A.B.C.D\n");
7523 return CMD_WARNING_CONFIG_FAILED;
7524 }
718e3744 7525
d62a17ae 7526 params = ospf_lookup_if_params(ifp, addr);
7527 if (params == NULL)
7528 return CMD_SUCCESS;
7529 }
718e3744 7530
d62a17ae 7531 UNSET_IF_PARAM(params, v_hello);
7532 params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
718e3744 7533
d62a17ae 7534 if (params != IF_DEF_PARAMS(ifp)) {
7535 ospf_free_if_params(ifp, addr);
7536 ospf_if_update_params(ifp, addr);
7537 }
718e3744 7538
d62a17ae 7539 return CMD_SUCCESS;
718e3744 7540}
7541
0d829fa7
QY
7542DEFUN_HIDDEN (no_ospf_hello_interval,
7543 no_ospf_hello_interval_cmd,
7544 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7545 NO_STR
7546 "OSPF interface commands\n"
7547 "Time between HELLO packets\n" // ignored
7548 "Seconds\n"
7549 "Address of interface\n")
7550{
d62a17ae 7551 return no_ip_ospf_hello_interval(self, vty, argc, argv);
0d829fa7 7552}
718e3744 7553
7554DEFUN (ip_ospf_network,
7555 ip_ospf_network_cmd,
6147e2c6 7556 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
718e3744 7557 "IP Information\n"
7558 "OSPF interface commands\n"
7559 "Network type\n"
7560 "Specify OSPF broadcast multi-access network\n"
7561 "Specify OSPF NBMA network\n"
7562 "Specify OSPF point-to-multipoint network\n"
7563 "Specify OSPF point-to-point network\n")
7564{
d62a17ae 7565 VTY_DECLVAR_CONTEXT(interface, ifp);
7566 int idx = 0;
7567 int old_type = IF_DEF_PARAMS(ifp)->type;
7568 struct route_node *rn;
718e3744 7569
d62a17ae 7570 if (old_type == OSPF_IFTYPE_LOOPBACK) {
7571 vty_out(vty,
7572 "This is a loopback interface. Can't set network type.\n");
7573 return CMD_WARNING_CONFIG_FAILED;
7574 }
718e3744 7575
d62a17ae 7576 if (argv_find(argv, argc, "broadcast", &idx))
7577 IF_DEF_PARAMS(ifp)->type = OSPF_IFTYPE_BROADCAST;
7578 else if (argv_find(argv, argc, "non-broadcast", &idx))
7579 IF_DEF_PARAMS(ifp)->type = OSPF_IFTYPE_NBMA;
7580 else if (argv_find(argv, argc, "point-to-multipoint", &idx))
7581 IF_DEF_PARAMS(ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
7582 else if (argv_find(argv, argc, "point-to-point", &idx))
7583 IF_DEF_PARAMS(ifp)->type = OSPF_IFTYPE_POINTOPOINT;
718e3744 7584
d62a17ae 7585 if (IF_DEF_PARAMS(ifp)->type == old_type)
7586 return CMD_SUCCESS;
7587
7588 SET_IF_PARAM(IF_DEF_PARAMS(ifp), type);
7589
7590 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
7591 struct ospf_interface *oi = rn->info;
7592
7593 if (!oi)
7594 continue;
7595
7596 oi->type = IF_DEF_PARAMS(ifp)->type;
7597
7598 if (oi->state > ISM_Down) {
7599 OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceDown);
7600 OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceUp);
7601 }
7a7be519 7602 }
7a7be519 7603
d62a17ae 7604 return CMD_SUCCESS;
7a7be519 7605}
7606
7607DEFUN_HIDDEN (ospf_network,
7608 ospf_network_cmd,
e83a9414 7609 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7a7be519 7610 "OSPF interface commands\n"
7611 "Network type\n"
7612 "Specify OSPF broadcast multi-access network\n"
7613 "Specify OSPF NBMA network\n"
7614 "Specify OSPF point-to-multipoint network\n"
7615 "Specify OSPF point-to-point network\n")
7616{
d62a17ae 7617 return ip_ospf_network(self, vty, argc, argv);
7a7be519 7618}
7619
7620DEFUN (no_ip_ospf_network,
7621 no_ip_ospf_network_cmd,
7622 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7623 NO_STR
7624 "IP Information\n"
7625 "OSPF interface commands\n"
7626 "Network type\n"
7627 "Specify OSPF broadcast multi-access network\n"
7628 "Specify OSPF NBMA network\n"
7629 "Specify OSPF point-to-multipoint network\n"
7630 "Specify OSPF point-to-point network\n")
22b27e95 7631{
d62a17ae 7632 VTY_DECLVAR_CONTEXT(interface, ifp);
7633 int old_type = IF_DEF_PARAMS(ifp)->type;
7634 struct route_node *rn;
7a7be519 7635
d62a17ae 7636 IF_DEF_PARAMS(ifp)->type = ospf_default_iftype(ifp);
7a7be519 7637
d62a17ae 7638 if (IF_DEF_PARAMS(ifp)->type == old_type)
7639 return CMD_SUCCESS;
7a7be519 7640
d62a17ae 7641 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
7642 struct ospf_interface *oi = rn->info;
7a7be519 7643
d62a17ae 7644 if (!oi)
7645 continue;
7a7be519 7646
d62a17ae 7647 oi->type = IF_DEF_PARAMS(ifp)->type;
7a7be519 7648
d62a17ae 7649 if (oi->state > ISM_Down) {
7650 OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceDown);
7651 OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceUp);
7652 }
7a7be519 7653 }
7a7be519 7654
d62a17ae 7655 return CMD_SUCCESS;
7a7be519 7656}
7657
0d829fa7
QY
7658DEFUN_HIDDEN (no_ospf_network,
7659 no_ospf_network_cmd,
7660 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7661 NO_STR
7662 "OSPF interface commands\n"
7663 "Network type\n"
7664 "Specify OSPF broadcast multi-access network\n"
7665 "Specify OSPF NBMA network\n"
7666 "Specify OSPF point-to-multipoint network\n"
7667 "Specify OSPF point-to-point network\n")
7668{
d62a17ae 7669 return no_ip_ospf_network(self, vty, argc, argv);
0d829fa7
QY
7670}
7671
7a7be519 7672DEFUN (ip_ospf_priority,
537eae3f 7673 ip_ospf_priority_cmd,
7a7be519 7674 "ip ospf priority (0-255) [A.B.C.D]",
7675 "IP Information\n"
7676 "OSPF interface commands\n"
7677 "Router priority\n"
7678 "Priority\n"
efd7904e 7679 "Address of interface\n")
7a7be519 7680{
d62a17ae 7681 VTY_DECLVAR_CONTEXT(interface, ifp);
7682 int idx = 0;
7683 long priority;
7684 struct route_node *rn;
7685 struct in_addr addr;
7686 struct ospf_if_params *params;
7687 params = IF_DEF_PARAMS(ifp);
7688
7689 argv_find(argv, argc, "(0-255)", &idx);
7690 priority = strtol(argv[idx]->arg, NULL, 10);
7691
7692 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7693 if (!inet_aton(argv[idx]->arg, &addr)) {
7694 vty_out(vty,
7695 "Please specify interface address by A.B.C.D\n");
7696 return CMD_WARNING_CONFIG_FAILED;
7697 }
7a7be519 7698
d62a17ae 7699 params = ospf_get_if_params(ifp, addr);
7700 ospf_if_update_params(ifp, addr);
7a7be519 7701 }
7702
d62a17ae 7703 SET_IF_PARAM(params, priority);
7704 params->priority = priority;
7a7be519 7705
d62a17ae 7706 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
7707 struct ospf_interface *oi = rn->info;
7a7be519 7708
d62a17ae 7709 if (!oi)
7710 continue;
7a7be519 7711
d62a17ae 7712 if (PRIORITY(oi) != OSPF_IF_PARAM(oi, priority)) {
7713 PRIORITY(oi) = OSPF_IF_PARAM(oi, priority);
7714 OSPF_ISM_EVENT_SCHEDULE(oi, ISM_NeighborChange);
7715 }
718e3744 7716 }
718e3744 7717
d62a17ae 7718 return CMD_SUCCESS;
718e3744 7719}
7720
7a7be519 7721DEFUN_HIDDEN (ospf_priority,
7722 ospf_priority_cmd,
0d829fa7 7723 "ospf priority (0-255) [A.B.C.D]",
7a7be519 7724 "OSPF interface commands\n"
7725 "Router priority\n"
3a2d747c 7726 "Priority\n"
efd7904e 7727 "Address of interface\n")
718e3744 7728{
d62a17ae 7729 return ip_ospf_priority(self, vty, argc, argv);
718e3744 7730}
7731
718e3744 7732DEFUN (no_ip_ospf_priority,
537eae3f 7733 no_ip_ospf_priority_cmd,
7a7be519 7734 "no ip ospf priority [(0-255) [A.B.C.D]]",
718e3744 7735 NO_STR
7736 "IP Information\n"
7737 "OSPF interface commands\n"
0d829fa7 7738 "Router priority\n" // ignored
813d4307 7739 "Priority\n"
efd7904e 7740 "Address of interface\n")
718e3744 7741{
d62a17ae 7742 VTY_DECLVAR_CONTEXT(interface, ifp);
7743 int idx = 0;
7744 struct route_node *rn;
7745 struct in_addr addr;
7746 struct ospf_if_params *params;
7747
7748 params = IF_DEF_PARAMS(ifp);
7749
7750 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7751 if (!inet_aton(argv[idx]->arg, &addr)) {
7752 vty_out(vty,
7753 "Please specify interface address by A.B.C.D\n");
7754 return CMD_WARNING_CONFIG_FAILED;
7755 }
7756
7757 params = ospf_lookup_if_params(ifp, addr);
7758 if (params == NULL)
7759 return CMD_SUCCESS;
718e3744 7760 }
7761
d62a17ae 7762 UNSET_IF_PARAM(params, priority);
7763 params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
7764
7765 if (params != IF_DEF_PARAMS(ifp)) {
7766 ospf_free_if_params(ifp, addr);
7767 ospf_if_update_params(ifp, addr);
718e3744 7768 }
d62a17ae 7769
7770 for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
7771 struct ospf_interface *oi = rn->info;
7772
7773 if (!oi)
7774 continue;
7775
7776 if (PRIORITY(oi) != OSPF_IF_PARAM(oi, priority)) {
7777 PRIORITY(oi) = OSPF_IF_PARAM(oi, priority);
7778 OSPF_ISM_EVENT_SCHEDULE(oi, ISM_NeighborChange);
7779 }
7780 }
7781
7782 return CMD_SUCCESS;
718e3744 7783}
7784
0d829fa7 7785DEFUN_HIDDEN (no_ospf_priority,
537eae3f 7786 no_ospf_priority_cmd,
0d829fa7
QY
7787 "no ospf priority [(0-255) [A.B.C.D]]",
7788 NO_STR
7789 "OSPF interface commands\n"
7790 "Router priority\n"
7791 "Priority\n"
efd7904e 7792 "Address of interface\n")
0d829fa7 7793{
d62a17ae 7794 return no_ip_ospf_priority(self, vty, argc, argv);
0d829fa7 7795}
a1afa410 7796
718e3744 7797DEFUN (ip_ospf_retransmit_interval,
7798 ip_ospf_retransmit_interval_addr_cmd,
7a7be519 7799 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
718e3744 7800 "IP Information\n"
7801 "OSPF interface commands\n"
7802 "Time between retransmitting lost link state advertisements\n"
7803 "Seconds\n"
efd7904e 7804 "Address of interface\n")
718e3744 7805{
d62a17ae 7806 VTY_DECLVAR_CONTEXT(interface, ifp);
7807 int idx = 0;
d7c0a89a 7808 uint32_t seconds;
d62a17ae 7809 struct in_addr addr;
7810 struct ospf_if_params *params;
7811 params = IF_DEF_PARAMS(ifp);
7812
7813 argv_find(argv, argc, "(3-65535)", &idx);
7814 seconds = strtol(argv[idx]->arg, NULL, 10);
7815
7816 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7817 if (!inet_aton(argv[idx]->arg, &addr)) {
7818 vty_out(vty,
7819 "Please specify interface address by A.B.C.D\n");
7820 return CMD_WARNING_CONFIG_FAILED;
7821 }
718e3744 7822
d62a17ae 7823 params = ospf_get_if_params(ifp, addr);
7824 ospf_if_update_params(ifp, addr);
718e3744 7825 }
7826
d62a17ae 7827 SET_IF_PARAM(params, retransmit_interval);
7828 params->retransmit_interval = seconds;
718e3744 7829
d62a17ae 7830 return CMD_SUCCESS;
718e3744 7831}
7832
7a7be519 7833DEFUN_HIDDEN (ospf_retransmit_interval,
747e489c 7834 ospf_retransmit_interval_cmd,
0d829fa7 7835 "ospf retransmit-interval (3-65535) [A.B.C.D]",
747e489c
DW
7836 "OSPF interface commands\n"
7837 "Time between retransmitting lost link state advertisements\n"
3a2d747c 7838 "Seconds\n"
efd7904e 7839 "Address of interface\n")
7a7be519 7840{
d62a17ae 7841 return ip_ospf_retransmit_interval(self, vty, argc, argv);
7a7be519 7842}
718e3744 7843
7844DEFUN (no_ip_ospf_retransmit_interval,
7845 no_ip_ospf_retransmit_interval_addr_cmd,
0d829fa7 7846 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
718e3744 7847 NO_STR
7848 "IP Information\n"
7849 "OSPF interface commands\n"
3a2d747c
QY
7850 "Time between retransmitting lost link state advertisements\n"
7851 "Seconds\n"
0d829fa7 7852 "Address of interface\n")
718e3744 7853{
d62a17ae 7854 VTY_DECLVAR_CONTEXT(interface, ifp);
7855 int idx = 0;
7856 struct in_addr addr;
7857 struct ospf_if_params *params;
47b91972 7858
d62a17ae 7859 params = IF_DEF_PARAMS(ifp);
718e3744 7860
d62a17ae 7861 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7862 if (!inet_aton(argv[idx]->arg, &addr)) {
7863 vty_out(vty,
7864 "Please specify interface address by A.B.C.D\n");
7865 return CMD_WARNING_CONFIG_FAILED;
7866 }
718e3744 7867
d62a17ae 7868 params = ospf_lookup_if_params(ifp, addr);
7869 if (params == NULL)
7870 return CMD_SUCCESS;
7871 }
718e3744 7872
d62a17ae 7873 UNSET_IF_PARAM(params, retransmit_interval);
7874 params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
718e3744 7875
d62a17ae 7876 if (params != IF_DEF_PARAMS(ifp)) {
7877 ospf_free_if_params(ifp, addr);
7878 ospf_if_update_params(ifp, addr);
7879 }
718e3744 7880
d62a17ae 7881 return CMD_SUCCESS;
718e3744 7882}
7883
0d829fa7
QY
7884DEFUN_HIDDEN (no_ospf_retransmit_interval,
7885 no_ospf_retransmit_interval_cmd,
7886 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7887 NO_STR
7888 "OSPF interface commands\n"
3a2d747c
QY
7889 "Time between retransmitting lost link state advertisements\n"
7890 "Seconds\n"
7891 "Address of interface\n")
0d829fa7 7892{
d62a17ae 7893 return no_ip_ospf_retransmit_interval(self, vty, argc, argv);
0d829fa7 7894}
813d4307 7895
718e3744 7896DEFUN (ip_ospf_transmit_delay,
7897 ip_ospf_transmit_delay_addr_cmd,
7a7be519 7898 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
718e3744 7899 "IP Information\n"
7900 "OSPF interface commands\n"
7901 "Link state transmit delay\n"
7902 "Seconds\n"
efd7904e 7903 "Address of interface\n")
718e3744 7904{
d62a17ae 7905 VTY_DECLVAR_CONTEXT(interface, ifp);
7906 int idx = 0;
d7c0a89a 7907 uint32_t seconds;
d62a17ae 7908 struct in_addr addr;
7909 struct ospf_if_params *params;
7910
7911 params = IF_DEF_PARAMS(ifp);
7912 argv_find(argv, argc, "(1-65535)", &idx);
7913 seconds = strtol(argv[idx]->arg, NULL, 10);
7914
7915 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7916 if (!inet_aton(argv[idx]->arg, &addr)) {
7917 vty_out(vty,
7918 "Please specify interface address by A.B.C.D\n");
7919 return CMD_WARNING_CONFIG_FAILED;
7920 }
718e3744 7921
d62a17ae 7922 params = ospf_get_if_params(ifp, addr);
7923 ospf_if_update_params(ifp, addr);
718e3744 7924 }
7925
d62a17ae 7926 SET_IF_PARAM(params, transmit_delay);
7927 params->transmit_delay = seconds;
718e3744 7928
d62a17ae 7929 return CMD_SUCCESS;
718e3744 7930}
7931
7a7be519 7932DEFUN_HIDDEN (ospf_transmit_delay,
747e489c 7933 ospf_transmit_delay_cmd,
0d829fa7 7934 "ospf transmit-delay (1-65535) [A.B.C.D]",
747e489c
DW
7935 "OSPF interface commands\n"
7936 "Link state transmit delay\n"
3a2d747c 7937 "Seconds\n"
efd7904e 7938 "Address of interface\n")
7a7be519 7939{
d62a17ae 7940 return ip_ospf_transmit_delay(self, vty, argc, argv);
7a7be519 7941}
718e3744 7942
7943DEFUN (no_ip_ospf_transmit_delay,
7944 no_ip_ospf_transmit_delay_addr_cmd,
0d829fa7 7945 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
718e3744 7946 NO_STR
7947 "IP Information\n"
7948 "OSPF interface commands\n"
7949 "Link state transmit delay\n"
efd7904e
RW
7950 "Seconds\n"
7951 "Address of interface\n")
718e3744 7952{
d62a17ae 7953 VTY_DECLVAR_CONTEXT(interface, ifp);
7954 int idx = 0;
7955 struct in_addr addr;
7956 struct ospf_if_params *params;
718e3744 7957
d62a17ae 7958 params = IF_DEF_PARAMS(ifp);
718e3744 7959
d62a17ae 7960 if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7961 if (!inet_aton(argv[idx]->arg, &addr)) {
7962 vty_out(vty,
7963 "Please specify interface address by A.B.C.D\n");
7964 return CMD_WARNING_CONFIG_FAILED;
7965 }
718e3744 7966
d62a17ae 7967 params = ospf_lookup_if_params(ifp, addr);
7968 if (params == NULL)
7969 return CMD_SUCCESS;
7970 }
718e3744 7971
d62a17ae 7972 UNSET_IF_PARAM(params, transmit_delay);
7973 params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
718e3744 7974
d62a17ae 7975 if (params != IF_DEF_PARAMS(ifp)) {
7976 ospf_free_if_params(ifp, addr);
7977 ospf_if_update_params(ifp, addr);
7978 }
7979
7980 return CMD_SUCCESS;
718e3744 7981}
7982
813d4307 7983
0d829fa7
QY
7984DEFUN_HIDDEN (no_ospf_transmit_delay,
7985 no_ospf_transmit_delay_cmd,
32573073 7986 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
0d829fa7
QY
7987 NO_STR
7988 "OSPF interface commands\n"
32573073
QY
7989 "Link state transmit delay\n"
7990 "Seconds\n"
efd7904e 7991 "Address of interface\n")
813d4307 7992{
d62a17ae 7993 return no_ip_ospf_transmit_delay(self, vty, argc, argv);
813d4307
DW
7994}
7995
e723861d
DS
7996DEFUN (ip_ospf_area,
7997 ip_ospf_area_cmd,
52c62ab8 7998 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
e723861d
DS
7999 "IP Information\n"
8000 "OSPF interface commands\n"
7a7be519 8001 "Instance ID\n"
e723861d
DS
8002 "Enable OSPF on this interface\n"
8003 "OSPF area ID in IP address format\n"
52c62ab8
JAG
8004 "OSPF area ID as a decimal value\n"
8005 "Address of interface\n")
e723861d 8006{
d62a17ae 8007 VTY_DECLVAR_CONTEXT(interface, ifp);
8008 int idx = 0;
8009 int format, ret;
8010 struct in_addr area_id;
8011 struct in_addr addr;
35955c14 8012 struct ospf_if_params *params = NULL;
d62a17ae 8013 struct route_node *rn;
b5a8894d 8014 struct ospf *ospf = NULL;
d7c0a89a 8015 unsigned short instance = 0;
d62a17ae 8016 char *areaid;
8017
8018 if (argv_find(argv, argc, "(1-65535)", &idx))
8019 instance = strtol(argv[idx]->arg, NULL, 10);
8020
8021 argv_find(argv, argc, "area", &idx);
8022 areaid = argv[idx + 1]->arg;
8023
a36898e7
DS
8024 if (ifp->vrf_id && !instance)
8025 ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
b5a8894d
CS
8026 else
8027 ospf = ospf_lookup_instance(instance);
8028
aed7cc62 8029 if (instance && ospf == NULL) {
d62a17ae 8030 params = IF_DEF_PARAMS(ifp);
8031 if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
8032 UNSET_IF_PARAM(params, if_area);
b5a8894d
CS
8033 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
8034 ospf_interface_area_unset(ospf, ifp);
d62a17ae 8035 ospf->if_ospf_cli_count--;
8036 }
ac28e4ec 8037 return CMD_NOT_MY_INSTANCE;
d62a17ae 8038 }
e723861d 8039
d62a17ae 8040 ret = str2area_id(areaid, &area_id, &format);
8041 if (ret < 0) {
8042 vty_out(vty, "Please specify area by A.B.C.D|<0-4294967295>\n");
8043 return CMD_WARNING_CONFIG_FAILED;
8044 }
8045 if (memcmp(ifp->name, "VLINK", 5) == 0) {
8046 vty_out(vty, "Cannot enable OSPF on a virtual link.\n");
8047 return CMD_WARNING_CONFIG_FAILED;
8048 }
8049
8050 params = IF_DEF_PARAMS(ifp);
8051 if (OSPF_IF_PARAM_CONFIGURED(params, if_area)
8052 && !IPV4_ADDR_SAME(&params->if_area, &area_id)) {
8053 vty_out(vty,
8054 "Must remove previous area config before changing ospf area \n");
8055 return CMD_WARNING_CONFIG_FAILED;
8056 }
8057
8058 // Check if we have an address arg and proccess it
8059 if (argc == idx + 3) {
cc9b06ad 8060 if (!inet_aton(argv[idx + 2]->arg, &addr)) {
996c9314
LB
8061 vty_out(vty,
8062 "Please specify Intf Address by A.B.C.D\n");
cc9b06ad
DS
8063 return CMD_WARNING_CONFIG_FAILED;
8064 }
d62a17ae 8065 // update/create address-level params
8066 params = ospf_get_if_params((ifp), (addr));
8067 if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
8068 vty_out(vty,
8069 "Must remove previous area/address config before changing ospf area");
8070 return CMD_WARNING_CONFIG_FAILED;
8071 }
8072 ospf_if_update_params((ifp), (addr));
8073 }
8074
aed7cc62
CS
8075 if (ospf) {
8076 for (rn = route_top(ospf->networks); rn; rn = route_next(rn)) {
8077 if (rn->info != NULL) {
8078 vty_out(vty,
8079 "Please remove all network commands first.\n");
8080 return CMD_WARNING_CONFIG_FAILED;
8081 }
d62a17ae 8082 }
8083 }
8084
8085 /* enable ospf on this interface with area_id */
35955c14
CS
8086 if (params) {
8087 SET_IF_PARAM(params, if_area);
8088 params->if_area = area_id;
8089 params->if_area_id_fmt = format;
8090 }
aed7cc62
CS
8091
8092 if (ospf) {
8093 ospf_interface_area_set(ospf, ifp);
8094 ospf->if_ospf_cli_count++;
8095 }
d62a17ae 8096
8097 return CMD_SUCCESS;
e723861d
DS
8098}
8099
8100DEFUN (no_ip_ospf_area,
8101 no_ip_ospf_area_cmd,
52c62ab8 8102 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
e723861d
DS
8103 NO_STR
8104 "IP Information\n"
8105 "OSPF interface commands\n"
3a2d747c 8106 "Instance ID\n"
7a7be519 8107 "Disable OSPF on this interface\n"
8108 "OSPF area ID in IP address format\n"
52c62ab8
JAG
8109 "OSPF area ID as a decimal value\n"
8110 "Address of interface\n")
e723861d 8111{
d62a17ae 8112 VTY_DECLVAR_CONTEXT(interface, ifp);
8113 int idx = 0;
8114 struct ospf *ospf;
8115 struct ospf_if_params *params;
d7c0a89a 8116 unsigned short instance = 0;
d62a17ae 8117 struct in_addr addr;
8118
8119 if (argv_find(argv, argc, "(1-65535)", &idx))
8120 instance = strtol(argv[idx]->arg, NULL, 10);
8121
a36898e7
DS
8122 if (ifp->vrf_id && !instance)
8123 ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
b5a8894d
CS
8124 else
8125 ospf = ospf_lookup_instance(instance);
8126
ac28e4ec
CS
8127 if (ospf == NULL)
8128 return CMD_NOT_MY_INSTANCE;
d62a17ae 8129
8130 argv_find(argv, argc, "area", &idx);
8131
8132 // Check if we have an address arg and proccess it
8133 if (argc == idx + 3) {
cc9b06ad 8134 if (!inet_aton(argv[idx + 2]->arg, &addr)) {
996c9314
LB
8135 vty_out(vty,
8136 "Please specify Intf Address by A.B.C.D\n");
cc9b06ad
DS
8137 return CMD_WARNING_CONFIG_FAILED;
8138 }
d62a17ae 8139 params = ospf_lookup_if_params(ifp, addr);
8140 if ((params) == NULL)
8141 return CMD_SUCCESS;
8142 } else
8143 params = IF_DEF_PARAMS(ifp);
8144
8145 if (!OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
8146 vty_out(vty,
8147 "Can't find specified interface area configuration.\n");
8148 return CMD_WARNING_CONFIG_FAILED;
8149 }
813d4307 8150
d62a17ae 8151 UNSET_IF_PARAM(params, if_area);
8152 if (params != IF_DEF_PARAMS((ifp))) {
8153 ospf_free_if_params((ifp), (addr));
8154 ospf_if_update_params((ifp), (addr));
8155 }
8156
b5a8894d 8157 ospf_interface_area_unset(ospf, ifp);
d62a17ae 8158 ospf->if_ospf_cli_count--;
8159 return CMD_SUCCESS;
813d4307
DW
8160}
8161
6f2a6703
CF
8162DEFUN (ospf_redistribute_source,
8163 ospf_redistribute_source_cmd,
ea38ced1 8164 "redistribute " FRR_REDIST_STR_OSPFD " [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
d1c65c21 8165 REDIST_STR
ab0181ee 8166 FRR_REDIST_HELP_STR_OSPFD
718e3744 8167 "Metric for redistributed routes\n"
8168 "OSPF default metric\n"
8169 "OSPF exterior metric type for redistributed routes\n"
7111c1a0 8170 "Set OSPF External Type 1/2 metrics\n"
718e3744 8171 "Route map reference\n"
8172 "Pointer to route-map entries\n")
8173{
a3d826f0 8174 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8175 int idx_protocol = 1;
8176 int source;
8177 int type = -1;
8178 int metric = -1;
8179 struct ospf_redist *red;
8180 int idx = 0;
6f2a6703 8181
d62a17ae 8182 /* Get distribute source. */
8183 source = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
8184 if (source < 0)
8185 return CMD_WARNING_CONFIG_FAILED;
8186
8187 red = ospf_redist_add(ospf, source, 0);
8188
8189 /* Get metric value. */
8190 if (argv_find(argv, argc, "(0-16777214)", &idx)) {
8191 if (!str2metric(argv[idx]->arg, &metric))
8192 return CMD_WARNING_CONFIG_FAILED;
8193 }
951da435 8194 idx = 1;
d62a17ae 8195 /* Get metric type. */
ea38ced1 8196 if (argv_find(argv, argc, "(1-2)", &idx)) {
d62a17ae 8197 if (!str2metric_type(argv[idx]->arg, &type))
8198 return CMD_WARNING_CONFIG_FAILED;
8199 }
951da435 8200 idx = 1;
d62a17ae 8201 /* Get route-map */
ea38ced1 8202 if (argv_find(argv, argc, "WORD", &idx)) {
d62a17ae 8203 ospf_routemap_set(red, argv[idx]->arg);
8204 } else
8205 ospf_routemap_unset(red);
7c8ff89e 8206
d62a17ae 8207 return ospf_redistribute_set(ospf, source, 0, type, metric);
718e3744 8208}
8209
718e3744 8210DEFUN (no_ospf_redistribute_source,
8211 no_ospf_redistribute_source_cmd,
ea38ced1 8212 "no redistribute " FRR_REDIST_STR_OSPFD " [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
718e3744 8213 NO_STR
d1c65c21 8214 REDIST_STR
ab0181ee 8215 FRR_REDIST_HELP_STR_OSPFD
813d4307
DW
8216 "Metric for redistributed routes\n"
8217 "OSPF default metric\n"
8218 "OSPF exterior metric type for redistributed routes\n"
7111c1a0 8219 "Set OSPF External Type 1/2 metrics\n"
813d4307
DW
8220 "Route map reference\n"
8221 "Pointer to route-map entries\n")
718e3744 8222{
a3d826f0 8223 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8224 int idx_protocol = 2;
8225 int source;
8226 struct ospf_redist *red;
718e3744 8227
d62a17ae 8228 source = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
8229 if (source < 0)
8230 return CMD_WARNING_CONFIG_FAILED;
718e3744 8231
d62a17ae 8232 red = ospf_redist_lookup(ospf, source, 0);
8233 if (!red)
8234 return CMD_SUCCESS;
7c8ff89e 8235
d62a17ae 8236 ospf_routemap_unset(red);
766b826f
DA
8237 ospf_redist_del(ospf, source, 0);
8238
d62a17ae 8239 return ospf_redistribute_unset(ospf, source, 0);
7c8ff89e
DS
8240}
8241
8242DEFUN (ospf_redistribute_instance_source,
8243 ospf_redistribute_instance_source_cmd,
1a5ce38b 8244 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
7c8ff89e
DS
8245 REDIST_STR
8246 "Open Shortest Path First\n"
2d627ff5
DS
8247 "Non-main Kernel Routing Table\n"
8248 "Instance ID/Table ID\n"
7c8ff89e
DS
8249 "Metric for redistributed routes\n"
8250 "OSPF default metric\n"
8251 "OSPF exterior metric type for redistributed routes\n"
7111c1a0 8252 "Set OSPF External Type 1/2 metrics\n"
7c8ff89e
DS
8253 "Route map reference\n"
8254 "Pointer to route-map entries\n")
8255{
a3d826f0 8256 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8257 int idx_ospf_table = 1;
8258 int idx_number = 2;
8259 int idx = 3;
8260 int source;
8261 int type = -1;
8262 int metric = -1;
d7c0a89a 8263 unsigned short instance;
d62a17ae 8264 struct ospf_redist *red;
7c8ff89e 8265
d62a17ae 8266 source = proto_redistnum(AFI_IP, argv[idx_ospf_table]->text);
2d627ff5 8267
13f0e434 8268 if (source < 0) {
8269 vty_out(vty, "Unknown instance redistribution\n");
8270 return CMD_WARNING_CONFIG_FAILED;
8271 }
8272
d62a17ae 8273 instance = strtoul(argv[idx_number]->arg, NULL, 10);
7c8ff89e 8274
d62a17ae 8275 if ((source == ZEBRA_ROUTE_OSPF) && !ospf->instance) {
8276 vty_out(vty,
8277 "Instance redistribution in non-instanced OSPF not allowed\n");
8278 return CMD_WARNING_CONFIG_FAILED;
8279 }
7c8ff89e 8280
d62a17ae 8281 if ((source == ZEBRA_ROUTE_OSPF) && (ospf->instance == instance)) {
8282 vty_out(vty, "Same instance OSPF redistribution not allowed\n");
8283 return CMD_WARNING_CONFIG_FAILED;
8284 }
7c8ff89e 8285
d62a17ae 8286 /* Get metric value. */
8287 if (argv_find(argv, argc, "metric", &idx))
8288 if (!str2metric(argv[idx + 1]->arg, &metric))
8289 return CMD_WARNING_CONFIG_FAILED;
7c8ff89e 8290
d62a17ae 8291 idx = 3;
8292 /* Get metric type. */
8293 if (argv_find(argv, argc, "metric-type", &idx))
8294 if (!str2metric_type(argv[idx + 1]->arg, &type))
8295 return CMD_WARNING_CONFIG_FAILED;
7c8ff89e 8296
d62a17ae 8297 red = ospf_redist_add(ospf, source, instance);
7a7be519 8298
d62a17ae 8299 idx = 3;
8300 if (argv_find(argv, argc, "route-map", &idx))
8301 ospf_routemap_set(red, argv[idx + 1]->arg);
8302 else
8303 ospf_routemap_unset(red);
7c8ff89e 8304
d62a17ae 8305 return ospf_redistribute_set(ospf, source, instance, type, metric);
7c8ff89e
DS
8306}
8307
8308DEFUN (no_ospf_redistribute_instance_source,
8309 no_ospf_redistribute_instance_source_cmd,
1a5ce38b 8310 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
7c8ff89e
DS
8311 NO_STR
8312 REDIST_STR
8313 "Open Shortest Path First\n"
2d627ff5
DS
8314 "Non-main Kernel Routing Table\n"
8315 "Instance ID/Table Id\n"
7c8ff89e
DS
8316 "Metric for redistributed routes\n"
8317 "OSPF default metric\n"
8318 "OSPF exterior metric type for redistributed routes\n"
7111c1a0 8319 "Set OSPF External Type 1/2 metrics\n"
7c8ff89e
DS
8320 "Route map reference\n"
8321 "Pointer to route-map entries\n")
8322{
a3d826f0 8323 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8324 int idx_ospf_table = 2;
8325 int idx_number = 3;
d7c0a89a 8326 unsigned int instance;
d62a17ae 8327 struct ospf_redist *red;
8328 int source;
8329
8330 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
8331 source = ZEBRA_ROUTE_OSPF;
8332 else
8333 source = ZEBRA_ROUTE_TABLE;
8334
8335 instance = strtoul(argv[idx_number]->arg, NULL, 10);
7c8ff89e 8336
d62a17ae 8337 if ((source == ZEBRA_ROUTE_OSPF) && !ospf->instance) {
8338 vty_out(vty,
8339 "Instance redistribution in non-instanced OSPF not allowed\n");
8340 return CMD_WARNING_CONFIG_FAILED;
8341 }
8342
8343 if ((source == ZEBRA_ROUTE_OSPF) && (ospf->instance == instance)) {
8344 vty_out(vty, "Same instance OSPF redistribution not allowed\n");
8345 return CMD_WARNING_CONFIG_FAILED;
8346 }
8347
8348 red = ospf_redist_lookup(ospf, source, instance);
8349 if (!red)
8350 return CMD_SUCCESS;
8351
8352 ospf_routemap_unset(red);
766b826f
DA
8353 ospf_redist_del(ospf, source, instance);
8354
d62a17ae 8355 return ospf_redistribute_unset(ospf, source, instance);
718e3744 8356}
8357
8358DEFUN (ospf_distribute_list_out,
8359 ospf_distribute_list_out_cmd,
40d1cbfb 8360 "distribute-list WORD out " FRR_REDIST_STR_OSPFD,
718e3744 8361 "Filter networks in routing updates\n"
6f2a6703
CF
8362 "Access-list name\n"
8363 OUT_STR
ab0181ee 8364 FRR_REDIST_HELP_STR_OSPFD)
718e3744 8365{
a3d826f0 8366 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8367 int idx_word = 1;
8368 int source;
718e3744 8369
d62a17ae 8370 char *proto = argv[argc - 1]->text;
6d681bd8 8371
d62a17ae 8372 /* Get distribute source. */
8373 source = proto_redistnum(AFI_IP, proto);
8374 if (source < 0)
8375 return CMD_WARNING_CONFIG_FAILED;
718e3744 8376
d62a17ae 8377 return ospf_distribute_list_out_set(ospf, source, argv[idx_word]->arg);
718e3744 8378}
8379
6f2a6703
CF
8380DEFUN (no_ospf_distribute_list_out,
8381 no_ospf_distribute_list_out_cmd,
40d1cbfb 8382 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD,
6f2a6703
CF
8383 NO_STR
8384 "Filter networks in routing updates\n"
8385 "Access-list name\n"
8386 OUT_STR
ab0181ee 8387 FRR_REDIST_HELP_STR_OSPFD)
718e3744 8388{
a3d826f0 8389 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8390 int idx_word = 2;
8391 int source;
020709f9 8392
d62a17ae 8393 char *proto = argv[argc - 1]->text;
8394 source = proto_redistnum(AFI_IP, proto);
8395 if (source < 0)
8396 return CMD_WARNING_CONFIG_FAILED;
718e3744 8397
d62a17ae 8398 return ospf_distribute_list_out_unset(ospf, source,
8399 argv[idx_word]->arg);
718e3744 8400}
8401
6f2a6703
CF
8402/* Default information originate. */
8403DEFUN (ospf_default_information_originate,
8404 ospf_default_information_originate_cmd,
ea38ced1 8405 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
718e3744 8406 "Control distribution of default information\n"
8407 "Distribute a default route\n"
8408 "Always advertise default route\n"
6f2a6703
CF
8409 "OSPF default metric\n"
8410 "OSPF metric\n"
718e3744 8411 "OSPF metric type for default routes\n"
7111c1a0 8412 "Set OSPF External Type 1/2 metrics\n"
718e3744 8413 "Route map reference\n"
8414 "Pointer to route-map entries\n")
8415{
a3d826f0 8416 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8417 int default_originate = DEFAULT_ORIGINATE_ZEBRA;
8418 int type = -1;
8419 int metric = -1;
8420 struct ospf_redist *red;
8421 int idx = 0;
1fb93326 8422 int cur_originate = ospf->default_originate;
8423 int sameRtmap = 0;
8424 char *rtmap = NULL;
d62a17ae 8425
8426 red = ospf_redist_add(ospf, DEFAULT_ROUTE, 0);
8427
8428 /* Check whether "always" was specified */
8429 if (argv_find(argv, argc, "always", &idx))
8430 default_originate = DEFAULT_ORIGINATE_ALWAYS;
951da435 8431 idx = 1;
d62a17ae 8432 /* Get metric value */
ea38ced1 8433 if (argv_find(argv, argc, "(0-16777214)", &idx)) {
d62a17ae 8434 if (!str2metric(argv[idx]->arg, &metric))
8435 return CMD_WARNING_CONFIG_FAILED;
8436 }
951da435 8437 idx = 1;
d62a17ae 8438 /* Get metric type. */
ea38ced1 8439 if (argv_find(argv, argc, "(1-2)", &idx)) {
d62a17ae 8440 if (!str2metric_type(argv[idx]->arg, &type))
8441 return CMD_WARNING_CONFIG_FAILED;
8442 }
951da435 8443 idx = 1;
d62a17ae 8444 /* Get route-map */
ea38ced1 8445 if (argv_find(argv, argc, "WORD", &idx))
1fb93326 8446 rtmap = argv[idx]->arg;
8447
8448 /* To check ,if user is providing same route map */
8449 if ((rtmap == ROUTEMAP_NAME(red)) ||
8450 (rtmap && ROUTEMAP_NAME(red)
8451 && (strcmp(rtmap, ROUTEMAP_NAME(red)) == 0)))
8452 sameRtmap = 1;
8453
8454 /* Don't allow if the same lsa is aleardy originated. */
8455 if ((sameRtmap)
8456 && (red->dmetric.type == type)
8457 && (red->dmetric.value == metric)
8458 && (cur_originate == default_originate))
8459 return CMD_SUCCESS;
8460
8461 /* Updating Metric details */
8462 red->dmetric.type = type;
8463 red->dmetric.value = metric;
8464
8465 /* updating route map details */
8466 if (rtmap)
8467 ospf_routemap_set(red, rtmap);
d62a17ae 8468 else
8469 ospf_routemap_unset(red);
8470
8471 return ospf_redistribute_default_set(ospf, default_originate, type,
8472 metric);
718e3744 8473}
8474
8475DEFUN (no_ospf_default_information_originate,
8476 no_ospf_default_information_originate_cmd,
ea38ced1 8477 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
718e3744 8478 NO_STR
8479 "Control distribution of default information\n"
813d4307
DW
8480 "Distribute a default route\n"
8481 "Always advertise default route\n"
8482 "OSPF default metric\n"
8483 "OSPF metric\n"
8484 "OSPF metric type for default routes\n"
7111c1a0 8485 "Set OSPF External Type 1/2 metrics\n"
813d4307
DW
8486 "Route map reference\n"
8487 "Pointer to route-map entries\n")
718e3744 8488{
a3d826f0 8489 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8490 struct ospf_redist *red;
7c8ff89e 8491
d62a17ae 8492 red = ospf_redist_lookup(ospf, DEFAULT_ROUTE, 0);
8493 if (!red)
8494 return CMD_SUCCESS;
7c8ff89e 8495
d62a17ae 8496 ospf_routemap_unset(red);
766b826f
DA
8497 ospf_redist_del(ospf, DEFAULT_ROUTE, 0);
8498
d5eac1e0
DL
8499 return ospf_redistribute_default_set(ospf, DEFAULT_ORIGINATE_NONE,
8500 0, 0);
718e3744 8501}
8502
8503DEFUN (ospf_default_metric,
8504 ospf_default_metric_cmd,
6147e2c6 8505 "default-metric (0-16777214)",
718e3744 8506 "Set metric of redistributed routes\n"
8507 "Default metric\n")
8508{
a3d826f0 8509 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8510 int idx_number = 1;
8511 int metric = -1;
718e3744 8512
d62a17ae 8513 if (!str2metric(argv[idx_number]->arg, &metric))
8514 return CMD_WARNING_CONFIG_FAILED;
718e3744 8515
d62a17ae 8516 ospf->default_metric = metric;
718e3744 8517
d62a17ae 8518 return CMD_SUCCESS;
718e3744 8519}
8520
8521DEFUN (no_ospf_default_metric,
8522 no_ospf_default_metric_cmd,
7a7be519 8523 "no default-metric [(0-16777214)]",
718e3744 8524 NO_STR
7a7be519 8525 "Set metric of redistributed routes\n"
8526 "Default metric\n")
718e3744 8527{
a3d826f0 8528 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
68980084 8529
d62a17ae 8530 ospf->default_metric = -1;
68980084 8531
d62a17ae 8532 return CMD_SUCCESS;
718e3744 8533}
8534
718e3744 8535
8536DEFUN (ospf_distance,
8537 ospf_distance_cmd,
6147e2c6 8538 "distance (1-255)",
eaa1ae0d 8539 "Administrative distance\n"
718e3744 8540 "OSPF Administrative distance\n")
8541{
a3d826f0 8542 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8543 int idx_number = 1;
68980084 8544
d62a17ae 8545 ospf->distance_all = atoi(argv[idx_number]->arg);
68980084 8546
d62a17ae 8547 return CMD_SUCCESS;
718e3744 8548}
8549
8550DEFUN (no_ospf_distance,
8551 no_ospf_distance_cmd,
6147e2c6 8552 "no distance (1-255)",
718e3744 8553 NO_STR
eaa1ae0d 8554 "Administrative distance\n"
718e3744 8555 "OSPF Administrative distance\n")
8556{
a3d826f0 8557 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
68980084 8558
d62a17ae 8559 ospf->distance_all = 0;
68980084 8560
d62a17ae 8561 return CMD_SUCCESS;
718e3744 8562}
8563
8564DEFUN (no_ospf_distance_ospf,
8565 no_ospf_distance_ospf_cmd,
eaa1ae0d 8566 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
718e3744 8567 NO_STR
eaa1ae0d
QY
8568 "Administrative distance\n"
8569 "OSPF administrative distance\n"
718e3744 8570 "Intra-area routes\n"
813d4307 8571 "Distance for intra-area routes\n"
718e3744 8572 "Inter-area routes\n"
813d4307
DW
8573 "Distance for inter-area routes\n"
8574 "External routes\n"
8575 "Distance for external routes\n")
718e3744 8576{
a3d826f0 8577 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8578 int idx = 0;
718e3744 8579
d62a17ae 8580 if (argv_find(argv, argc, "intra-area", &idx) || argc == 3)
8581 idx = ospf->distance_intra = 0;
8582 if (argv_find(argv, argc, "inter-area", &idx) || argc == 3)
8583 idx = ospf->distance_inter = 0;
8584 if (argv_find(argv, argc, "external", &idx) || argc == 3)
8585 ospf->distance_external = 0;
718e3744 8586
d62a17ae 8587 return CMD_SUCCESS;
718e3744 8588}
8589
6f2a6703
CF
8590DEFUN (ospf_distance_ospf,
8591 ospf_distance_ospf_cmd,
eaa1ae0d
QY
8592 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
8593 "Administrative distance\n"
8594 "OSPF administrative distance\n"
718e3744 8595 "Intra-area routes\n"
8596 "Distance for intra-area routes\n"
718e3744 8597 "Inter-area routes\n"
8598 "Distance for inter-area routes\n"
8599 "External routes\n"
718e3744 8600 "Distance for external routes\n")
8601{
a3d826f0 8602 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8603 int idx = 0;
68980084 8604
926b88f0
CS
8605 ospf->distance_intra = 0;
8606 ospf->distance_inter = 0;
8607 ospf->distance_external = 0;
8608
d62a17ae 8609 if (argv_find(argv, argc, "intra-area", &idx))
8610 ospf->distance_intra = atoi(argv[idx + 1]->arg);
8611 idx = 0;
8612 if (argv_find(argv, argc, "inter-area", &idx))
8613 ospf->distance_inter = atoi(argv[idx + 1]->arg);
8614 idx = 0;
8615 if (argv_find(argv, argc, "external", &idx))
8616 ospf->distance_external = atoi(argv[idx + 1]->arg);
68980084 8617
d62a17ae 8618 return CMD_SUCCESS;
718e3744 8619}
8620
d7d73ffc 8621#if 0
718e3744 8622DEFUN (ospf_distance_source,
8623 ospf_distance_source_cmd,
6147e2c6 8624 "distance (1-255) A.B.C.D/M",
718e3744 8625 "Administrative distance\n"
8626 "Distance value\n"
8627 "IP source prefix\n")
8628{
cdc2d765 8629 VTY_DECLVAR_CONTEXT(ospf, ospf);
8d769265
DW
8630 int idx_number = 1;
8631 int idx_ipv4_prefixlen = 2;
020709f9 8632
8d769265 8633 ospf_distance_set (vty, ospf, argv[idx_number]->arg, argv[idx_ipv4_prefixlen]->arg, NULL);
68980084 8634
718e3744 8635 return CMD_SUCCESS;
8636}
8637
8638DEFUN (no_ospf_distance_source,
8639 no_ospf_distance_source_cmd,
6147e2c6 8640 "no distance (1-255) A.B.C.D/M",
718e3744 8641 NO_STR
8642 "Administrative distance\n"
8643 "Distance value\n"
8644 "IP source prefix\n")
8645{
cdc2d765 8646 VTY_DECLVAR_CONTEXT(ospf, ospf);
8d769265
DW
8647 int idx_number = 2;
8648 int idx_ipv4_prefixlen = 3;
020709f9 8649
8d769265 8650 ospf_distance_unset (vty, ospf, argv[idx_number]->arg, argv[idx_ipv4_prefixlen]->arg, NULL);
020709f9 8651
718e3744 8652 return CMD_SUCCESS;
8653}
8654
8655DEFUN (ospf_distance_source_access_list,
8656 ospf_distance_source_access_list_cmd,
6147e2c6 8657 "distance (1-255) A.B.C.D/M WORD",
718e3744 8658 "Administrative distance\n"
8659 "Distance value\n"
8660 "IP source prefix\n"
8661 "Access list name\n")
8662{
cdc2d765 8663 VTY_DECLVAR_CONTEXT(ospf, ospf);
8d769265
DW
8664 int idx_number = 1;
8665 int idx_ipv4_prefixlen = 2;
8666 int idx_word = 3;
020709f9 8667
8d769265 8668 ospf_distance_set (vty, ospf, argv[idx_number]->arg, argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg);
020709f9 8669
718e3744 8670 return CMD_SUCCESS;
8671}
8672
8673DEFUN (no_ospf_distance_source_access_list,
8674 no_ospf_distance_source_access_list_cmd,
6147e2c6 8675 "no distance (1-255) A.B.C.D/M WORD",
718e3744 8676 NO_STR
8677 "Administrative distance\n"
8678 "Distance value\n"
8679 "IP source prefix\n"
8680 "Access list name\n")
8681{
cdc2d765 8682 VTY_DECLVAR_CONTEXT(ospf, ospf);
8d769265
DW
8683 int idx_number = 2;
8684 int idx_ipv4_prefixlen = 3;
8685 int idx_word = 4;
020709f9 8686
8d769265 8687 ospf_distance_unset (vty, ospf, argv[idx_number]->arg, argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg);
020709f9 8688
718e3744 8689 return CMD_SUCCESS;
8690}
d7d73ffc 8691#endif
718e3744 8692
ba682537 8693DEFUN (ip_ospf_mtu_ignore,
8694 ip_ospf_mtu_ignore_addr_cmd,
7a7be519 8695 "ip ospf mtu-ignore [A.B.C.D]",
ba682537 8696 "IP Information\n"
8697 "OSPF interface commands\n"
99a522c7 8698 "Disable MTU mismatch detection on this interface\n"
efd7904e 8699 "Address of interface\n")
ba682537 8700{
d62a17ae 8701 VTY_DECLVAR_CONTEXT(interface, ifp);
8702 int idx_ipv4 = 3;
8703 struct in_addr addr;
8704 int ret;
8705
8706 struct ospf_if_params *params;
8707 params = IF_DEF_PARAMS(ifp);
8708
8709 if (argc == 4) {
8710 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
8711 if (!ret) {
8712 vty_out(vty,
8713 "Please specify interface address by A.B.C.D\n");
8714 return CMD_WARNING_CONFIG_FAILED;
8715 }
8716 params = ospf_get_if_params(ifp, addr);
8717 ospf_if_update_params(ifp, addr);
8718 }
8719 params->mtu_ignore = 1;
8720 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
8721 SET_IF_PARAM(params, mtu_ignore);
8722 else {
8723 UNSET_IF_PARAM(params, mtu_ignore);
8724 if (params != IF_DEF_PARAMS(ifp)) {
8725 ospf_free_if_params(ifp, addr);
8726 ospf_if_update_params(ifp, addr);
8727 }
8728 }
8729 return CMD_SUCCESS;
ba682537 8730}
8731
ba682537 8732DEFUN (no_ip_ospf_mtu_ignore,
8733 no_ip_ospf_mtu_ignore_addr_cmd,
7a7be519 8734 "no ip ospf mtu-ignore [A.B.C.D]",
efd7904e 8735 NO_STR
ba682537 8736 "IP Information\n"
8737 "OSPF interface commands\n"
99a522c7 8738 "Disable MTU mismatch detection on this interface\n"
efd7904e 8739 "Address of interface\n")
ba682537 8740{
d62a17ae 8741 VTY_DECLVAR_CONTEXT(interface, ifp);
8742 int idx_ipv4 = 4;
8743 struct in_addr addr;
8744 int ret;
8745
8746 struct ospf_if_params *params;
8747 params = IF_DEF_PARAMS(ifp);
8748
8749 if (argc == 5) {
8750 ret = inet_aton(argv[idx_ipv4]->arg, &addr);
8751 if (!ret) {
8752 vty_out(vty,
8753 "Please specify interface address by A.B.C.D\n");
8754 return CMD_WARNING_CONFIG_FAILED;
8755 }
8756 params = ospf_get_if_params(ifp, addr);
8757 ospf_if_update_params(ifp, addr);
8758 }
8759 params->mtu_ignore = 0;
8760 if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
8761 SET_IF_PARAM(params, mtu_ignore);
8762 else {
8763 UNSET_IF_PARAM(params, mtu_ignore);
8764 if (params != IF_DEF_PARAMS(ifp)) {
8765 ospf_free_if_params(ifp, addr);
8766 ospf_if_update_params(ifp, addr);
8767 }
8768 }
8769 return CMD_SUCCESS;
ba682537 8770}
8771
6b0655a2 8772
88d6cf37 8773DEFUN (ospf_max_metric_router_lsa_admin,
8774 ospf_max_metric_router_lsa_admin_cmd,
8775 "max-metric router-lsa administrative",
8776 "OSPF maximum / infinite-distance metric\n"
8777 "Advertise own Router-LSA with infinite distance (stub router)\n"
8778 "Administratively applied, for an indefinite period\n")
8779{
a3d826f0 8780 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8781 struct listnode *ln;
8782 struct ospf_area *area;
7c8ff89e 8783
d62a17ae 8784 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
8785 SET_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
4ba4fc85 8786
d62a17ae 8787 if (!CHECK_FLAG(area->stub_router_state,
8788 OSPF_AREA_IS_STUB_ROUTED))
8789 ospf_router_lsa_update_area(area);
8790 }
4ba4fc85 8791
d62a17ae 8792 /* Allows for areas configured later to get the property */
8793 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
8794
8795 return CMD_SUCCESS;
88d6cf37 8796}
8797
8798DEFUN (no_ospf_max_metric_router_lsa_admin,
8799 no_ospf_max_metric_router_lsa_admin_cmd,
8800 "no max-metric router-lsa administrative",
8801 NO_STR
8802 "OSPF maximum / infinite-distance metric\n"
8803 "Advertise own Router-LSA with infinite distance (stub router)\n"
8804 "Administratively applied, for an indefinite period\n")
8805{
a3d826f0 8806 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8807 struct listnode *ln;
8808 struct ospf_area *area;
8809
8810 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
8811 UNSET_FLAG(area->stub_router_state,
8812 OSPF_AREA_ADMIN_STUB_ROUTED);
8813
8814 /* Don't trample on the start-up stub timer */
8815 if (CHECK_FLAG(area->stub_router_state,
8816 OSPF_AREA_IS_STUB_ROUTED)
8817 && !area->t_stub_router) {
8818 UNSET_FLAG(area->stub_router_state,
8819 OSPF_AREA_IS_STUB_ROUTED);
8820 ospf_router_lsa_update_area(area);
8821 }
8822 }
8823 ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
8824 return CMD_SUCCESS;
88d6cf37 8825}
8826
8827DEFUN (ospf_max_metric_router_lsa_startup,
8828 ospf_max_metric_router_lsa_startup_cmd,
6147e2c6 8829 "max-metric router-lsa on-startup (5-86400)",
88d6cf37 8830 "OSPF maximum / infinite-distance metric\n"
8831 "Advertise own Router-LSA with infinite distance (stub router)\n"
8832 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8833 "Time (seconds) to advertise self as stub-router\n")
8834{
a3d826f0 8835 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8836 int idx_number = 3;
8837 unsigned int seconds;
8838
b5a8894d 8839 if (argc < 4) {
d62a17ae 8840 vty_out(vty, "%% Must supply stub-router period");
8841 return CMD_WARNING_CONFIG_FAILED;
8842 }
8843
8844 seconds = strtoul(argv[idx_number]->arg, NULL, 10);
8845
8846 ospf->stub_router_startup_time = seconds;
8847
8848 return CMD_SUCCESS;
88d6cf37 8849}
8850
8851DEFUN (no_ospf_max_metric_router_lsa_startup,
8852 no_ospf_max_metric_router_lsa_startup_cmd,
7a7be519 8853 "no max-metric router-lsa on-startup [(5-86400)]",
88d6cf37 8854 NO_STR
8855 "OSPF maximum / infinite-distance metric\n"
8856 "Advertise own Router-LSA with infinite distance (stub router)\n"
813d4307
DW
8857 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8858 "Time (seconds) to advertise self as stub-router\n")
88d6cf37 8859{
a3d826f0 8860 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8861 struct listnode *ln;
8862 struct ospf_area *area;
8863
8864 ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
8865
8866 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
8867 SET_FLAG(area->stub_router_state,
8868 OSPF_AREA_WAS_START_STUB_ROUTED);
8869 OSPF_TIMER_OFF(area->t_stub_router);
8870
8871 /* Don't trample on admin stub routed */
8872 if (!CHECK_FLAG(area->stub_router_state,
8873 OSPF_AREA_ADMIN_STUB_ROUTED)) {
8874 UNSET_FLAG(area->stub_router_state,
8875 OSPF_AREA_IS_STUB_ROUTED);
8876 ospf_router_lsa_update_area(area);
8877 }
8878 }
8879 return CMD_SUCCESS;
88d6cf37 8880}
8881
a1afa410 8882
88d6cf37 8883DEFUN (ospf_max_metric_router_lsa_shutdown,
8884 ospf_max_metric_router_lsa_shutdown_cmd,
6147e2c6 8885 "max-metric router-lsa on-shutdown (5-100)",
88d6cf37 8886 "OSPF maximum / infinite-distance metric\n"
8887 "Advertise own Router-LSA with infinite distance (stub router)\n"
8888 "Advertise stub-router prior to full shutdown of OSPF\n"
8889 "Time (seconds) to wait till full shutdown\n")
8890{
a3d826f0 8891 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
d62a17ae 8892 int idx_number = 3;
8893 unsigned int seconds;
8894
b5a8894d 8895 if (argc < 4) {
d62a17ae 8896 vty_out(vty, "%% Must supply stub-router shutdown period");
8897 return CMD_WARNING_CONFIG_FAILED;
8898 }
8899
8900 seconds = strtoul(argv[idx_number]->arg, NULL, 10);
8901
8902 ospf->stub_router_shutdown_time = seconds;
8903
8904 return CMD_SUCCESS;
88d6cf37 8905}
8906
8907DEFUN (no_ospf_max_metric_router_lsa_shutdown,
8908 no_ospf_max_metric_router_lsa_shutdown_cmd,
7a7be519 8909 "no max-metric router-lsa on-shutdown [(5-100)]",
88d6cf37 8910 NO_STR
8911 "OSPF maximum / infinite-distance metric\n"
8912 "Advertise own Router-LSA with infinite distance (stub router)\n"
813d4307
DW
8913 "Advertise stub-router prior to full shutdown of OSPF\n"
8914 "Time (seconds) to wait till full shutdown\n")
88d6cf37 8915{
a3d826f0 8916 VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
7c8ff89e 8917
d62a17ae 8918 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
8919
8920 return CMD_SUCCESS;
88d6cf37 8921}
8922
d62a17ae 8923static void config_write_stub_router(struct vty *vty, struct ospf *ospf)
8924{
8925 struct listnode *ln;
8926 struct ospf_area *area;
8927
8928 if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
8929 vty_out(vty, " max-metric router-lsa on-startup %u\n",
8930 ospf->stub_router_startup_time);
8931 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
8932 vty_out(vty, " max-metric router-lsa on-shutdown %u\n",
8933 ospf->stub_router_shutdown_time);
8934 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
8935 if (CHECK_FLAG(area->stub_router_state,
8936 OSPF_AREA_ADMIN_STUB_ROUTED)) {
8937 vty_out(vty, " max-metric router-lsa administrative\n");
8938 break;
8939 }
8940 }
8941 return;
8942}
8943
b5a8894d 8944static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
0f478e30
CS
8945 struct route_table *rt,
8946 json_object *json)
d62a17ae 8947{
8948 struct route_node *rn;
8949 struct ospf_route * or ;
8950 struct listnode *pnode, *pnnode;
8951 struct ospf_path *path;
0f478e30
CS
8952 json_object *json_route = NULL, *json_nexthop_array = NULL,
8953 *json_nexthop = NULL;
d62a17ae 8954
0f478e30 8955 if (!json)
996c9314
LB
8956 vty_out(vty,
8957 "============ OSPF network routing table ============\n");
d62a17ae 8958
0f478e30
CS
8959 for (rn = route_top(rt); rn; rn = route_next(rn)) {
8960 if ((or = rn->info) == NULL)
8961 continue;
8962 char buf1[PREFIX2STR_BUFFER];
8963
8964 memset(buf1, 0, sizeof(buf1));
8965 prefix2str(&rn->p, buf1, sizeof(buf1));
8966
8967 json_route = json_object_new_object();
8968 if (json) {
996c9314
LB
8969 json_object_object_add(json, buf1, json_route);
8970 json_object_to_json_string_ext(
8971 json, JSON_C_TO_STRING_NOSLASHESCAPE);
0f478e30
CS
8972 }
8973
8974 switch (or->path_type) {
8975 case OSPF_PATH_INTER_AREA:
8976 if (or->type == OSPF_DESTINATION_NETWORK) {
8977 if (json) {
8978 json_object_string_add(json_route,
996c9314
LB
8979 "routeType",
8980 "N IA");
8981 json_object_int_add(json_route, "cost",
0f478e30
CS
8982 or->cost);
8983 json_object_string_add(
996c9314
LB
8984 json_route, "area",
8985 inet_ntoa(or->u.std.area_id));
0f478e30 8986 } else {
d62a17ae 8987 vty_out(vty,
996c9314 8988 "N IA %-18s [%d] area: %s\n",
d62a17ae 8989 buf1, or->cost,
996c9314 8990 inet_ntoa(or->u.std.area_id));
0f478e30 8991 }
996c9314 8992 } else if (or->type == OSPF_DESTINATION_DISCARD) {
0f478e30
CS
8993 if (json) {
8994 json_object_string_add(json_route,
996c9314
LB
8995 "routeType",
8996 "D IA");
0f478e30 8997 } else {
d62a17ae 8998 vty_out(vty,
8999 "D IA %-18s Discard entry\n",
9000 buf1);
0f478e30
CS
9001 }
9002 }
9003 break;
9004 case OSPF_PATH_INTRA_AREA:
9005 if (json) {
996c9314
LB
9006 json_object_string_add(json_route, "routeType",
9007 "N");
0f478e30 9008 json_object_int_add(json_route, "cost",
996c9314
LB
9009 or->cost);
9010 json_object_string_add(
9011 json_route, "area",
9012 inet_ntoa(or->u.std.area_id));
0f478e30 9013 } else {
d62a17ae 9014 vty_out(vty, "N %-18s [%d] area: %s\n",
9015 buf1, or->cost,
9016 inet_ntoa(or->u.std.area_id));
0f478e30
CS
9017 }
9018 break;
9019 default:
9020 break;
9021 }
9022
9023 if (or->type == OSPF_DESTINATION_NETWORK) {
9024 if (json) {
9025 json_nexthop_array = json_object_new_array();
9026 json_object_object_add(json_route, "nexthops",
996c9314 9027 json_nexthop_array);
d62a17ae 9028 }
9029
0f478e30
CS
9030 for (ALL_LIST_ELEMENTS(or->paths, pnode, pnnode,
9031 path)) {
9032 if (json) {
996c9314
LB
9033 json_nexthop = json_object_new_object();
9034 json_object_array_add(
9035 json_nexthop_array,
9036 json_nexthop);
0f478e30
CS
9037 }
9038 if (if_lookup_by_index(path->ifindex,
9039 ospf->vrf_id)) {
9040
9041 if (path->nexthop.s_addr == 0) {
9042 if (json) {
9043 json_object_string_add(
9044 json_nexthop,
996c9314 9045 "ip", " ");
0f478e30
CS
9046 json_object_string_add(
9047 json_nexthop,
9048 "directly attached to",
d62a17ae 9049 ifindex2ifname(
996c9314
LB
9050 path->ifindex,
9051 ospf->vrf_id));
0f478e30 9052 } else {
d62a17ae 9053 vty_out(vty,
996c9314
LB
9054 "%24s directly attached to %s\n",
9055 "",
9056 ifindex2ifname(
9057 path->ifindex,
9058 ospf->vrf_id));
0f478e30
CS
9059 }
9060 } else {
9061 if (json) {
9062 json_object_string_add(
9063 json_nexthop,
9064 "ip",
d62a17ae 9065 inet_ntoa(
996c9314 9066 path->nexthop));
0f478e30
CS
9067 json_object_string_add(
9068 json_nexthop,
9069 "via",
d62a17ae 9070 ifindex2ifname(
996c9314
LB
9071 path->ifindex,
9072 ospf->vrf_id));
0f478e30
CS
9073 } else {
9074 vty_out(vty,
996c9314
LB
9075 "%24s via %s, %s\n",
9076 "",
9077 inet_ntoa(
9078 path->nexthop),
9079 ifindex2ifname(
9080 path->ifindex,
9081 ospf->vrf_id));
0f478e30 9082 }
d62a17ae 9083 }
9084 }
0f478e30 9085 }
d62a17ae 9086 }
0f478e30
CS
9087 if (!json)
9088 json_object_free(json_route);
9089 }
9090 if (!json)
9091 vty_out(vty, "\n");
d62a17ae 9092}
9093
b5a8894d 9094static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf,
0f478e30
CS
9095 struct route_table *rtrs,
9096 json_object *json)
d62a17ae 9097{
9098 struct route_node *rn;
9099 struct ospf_route * or ;
9100 struct listnode *pnode;
9101 struct listnode *node;
9102 struct ospf_path *path;
0f478e30
CS
9103 json_object *json_route = NULL, *json_nexthop_array = NULL,
9104 *json_nexthop = NULL;
d62a17ae 9105
0f478e30 9106 if (!json)
996c9314
LB
9107 vty_out(vty,
9108 "============ OSPF router routing table =============\n");
d62a17ae 9109
0f478e30
CS
9110 for (rn = route_top(rtrs); rn; rn = route_next(rn)) {
9111 if (rn->info == NULL)
9112 continue;
9113 int flag = 0;
9114
9115 json_route = json_object_new_object();
9116 if (json) {
996c9314
LB
9117 json_object_object_add(json, inet_ntoa(rn->p.u.prefix4),
9118 json_route);
9119 json_object_string_add(json_route, "routeType", "R ");
0f478e30 9120 } else {
d62a17ae 9121 vty_out(vty, "R %-15s ",
9122 inet_ntoa(rn->p.u.prefix4));
0f478e30 9123 }
d62a17ae 9124
996c9314 9125 for (ALL_LIST_ELEMENTS_RO((struct list *)rn->info, node, or)) {
0f478e30
CS
9126 if (flag++) {
9127 if (!json)
d62a17ae 9128 vty_out(vty, "%24s", "");
0f478e30 9129 }
d62a17ae 9130
0f478e30
CS
9131 /* Show path. */
9132 if (json) {
9133 json_object_int_add(json_route, "cost",
9134 or->cost);
996c9314
LB
9135 json_object_string_add(
9136 json_route, "area",
0f478e30 9137 inet_ntoa(or->u.std.area_id));
996c9314
LB
9138 if (or->path_type == OSPF_PATH_INTER_AREA)
9139 json_object_boolean_true_add(json_route,
9140 "IA");
0f478e30 9141 if (or->u.std.flags & ROUTER_LSA_BORDER)
996c9314
LB
9142 json_object_string_add(json_route,
9143 "routerType",
9144 "abr");
9145 else if (or->u.std.flags & ROUTER_LSA_EXTERNAL)
9146 json_object_string_add(json_route,
9147 "routerType",
9148 "asbr");
0f478e30 9149 } else {
d62a17ae 9150 vty_out(vty, "%s [%d] area: %s",
996c9314
LB
9151 (or->path_type == OSPF_PATH_INTER_AREA
9152 ? "IA"
9153 : " "),
9154 or->cost, inet_ntoa(or->u.std.area_id));
d62a17ae 9155 /* Show flags. */
9156 vty_out(vty, "%s%s\n",
996c9314
LB
9157 (or->u.std.flags & ROUTER_LSA_BORDER
9158 ? ", ABR"
9159 : ""),
9160 (or->u.std.flags & ROUTER_LSA_EXTERNAL
9161 ? ", ASBR"
9162 : ""));
0f478e30
CS
9163 }
9164
9165 if (json) {
996c9314 9166 json_nexthop_array = json_object_new_array();
0f478e30 9167 json_object_object_add(json_route, "nexthops",
996c9314 9168 json_nexthop_array);
0f478e30
CS
9169 }
9170
996c9314 9171 for (ALL_LIST_ELEMENTS_RO(or->paths, pnode, path)) {
0f478e30 9172 if (json) {
996c9314 9173 json_nexthop = json_object_new_object();
0f478e30
CS
9174 json_object_array_add(
9175 json_nexthop_array,
9176 json_nexthop);
9177 }
9178 if (if_lookup_by_index(path->ifindex,
9179 ospf->vrf_id)) {
9180 if (path->nexthop.s_addr == 0) {
9181 if (json) {
9182 json_object_string_add(
9183 json_nexthop,
996c9314 9184 "ip", " ");
0f478e30
CS
9185 json_object_string_add(
9186 json_nexthop,
9187 "directly attached to",
d62a17ae 9188 ifindex2ifname(
9189 path->ifindex,
b5a8894d 9190 ospf->vrf_id));
0f478e30 9191 } else {
d62a17ae 9192 vty_out(vty,
996c9314
LB
9193 "%24s directly attached to %s\n",
9194 "",
9195 ifindex2ifname(
9196 path->ifindex,
9197 ospf->vrf_id));
0f478e30
CS
9198 }
9199 } else {
9200 if (json) {
9201 json_object_string_add(
9202 json_nexthop,
9203 "ip",
996c9314
LB
9204 inet_ntoa(
9205 path->nexthop));
0f478e30
CS
9206 json_object_string_add(
9207 json_nexthop,
9208 "via",
d62a17ae 9209 ifindex2ifname(
9210 path->ifindex,
b5a8894d 9211 ospf->vrf_id));
0f478e30
CS
9212 } else {
9213 vty_out(vty,
996c9314
LB
9214 "%24s via %s, %s\n",
9215 "",
9216 inet_ntoa(
9217 path->nexthop),
9218 ifindex2ifname(
9219 path->ifindex,
9220 ospf->vrf_id));
0f478e30 9221 }
d62a17ae 9222 }
9223 }
9224 }
9225 }
0f478e30
CS
9226 if (!json)
9227 json_object_free(json_route);
9228 }
9229 if (!json)
9230 vty_out(vty, "\n");
d62a17ae 9231}
9232
b5a8894d 9233static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf,
0f478e30
CS
9234 struct route_table *rt,
9235 json_object *json)
d62a17ae 9236{
9237 struct route_node *rn;
9238 struct ospf_route *er;
9239 struct listnode *pnode, *pnnode;
9240 struct ospf_path *path;
0f478e30
CS
9241 json_object *json_route = NULL, *json_nexthop_array = NULL,
9242 *json_nexthop = NULL;
d62a17ae 9243
0f478e30 9244 if (!json)
996c9314
LB
9245 vty_out(vty,
9246 "============ OSPF external routing table ===========\n");
0f478e30
CS
9247
9248 for (rn = route_top(rt); rn; rn = route_next(rn)) {
9249 if ((er = rn->info) == NULL)
9250 continue;
9251
9252 char buf1[19];
9253
9254 snprintf(buf1, 19, "%s/%d", inet_ntoa(rn->p.u.prefix4),
9255 rn->p.prefixlen);
9256 json_route = json_object_new_object();
9257 if (json) {
996c9314
LB
9258 json_object_object_add(json, buf1, json_route);
9259 json_object_to_json_string_ext(
9260 json, JSON_C_TO_STRING_NOSLASHESCAPE);
0f478e30 9261 }
d62a17ae 9262
0f478e30
CS
9263 switch (er->path_type) {
9264 case OSPF_PATH_TYPE1_EXTERNAL:
9265 if (json) {
996c9314 9266 json_object_string_add(json_route, "routeType",
0f478e30
CS
9267 "N E1");
9268 json_object_int_add(json_route, "cost",
996c9314 9269 er->cost);
0f478e30 9270 } else {
d62a17ae 9271 vty_out(vty,
996c9314
LB
9272 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
9273 "\n",
9274 buf1, er->cost, er->u.ext.tag);
0f478e30
CS
9275 }
9276 break;
9277 case OSPF_PATH_TYPE2_EXTERNAL:
9278 if (json) {
996c9314 9279 json_object_string_add(json_route, "routeType",
0f478e30
CS
9280 "N E2");
9281 json_object_int_add(json_route, "cost",
996c9314 9282 er->cost);
0f478e30 9283 } else {
d62a17ae 9284 vty_out(vty,
996c9314
LB
9285 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
9286 "\n",
9287 buf1, er->cost, er->u.ext.type2_cost,
d62a17ae 9288 er->u.ext.tag);
d62a17ae 9289 }
0f478e30
CS
9290 break;
9291 }
d62a17ae 9292
0f478e30
CS
9293 if (json) {
9294 json_nexthop_array = json_object_new_array();
9295 json_object_object_add(json_route, "nexthops",
996c9314 9296 json_nexthop_array);
0f478e30
CS
9297 }
9298
996c9314 9299 for (ALL_LIST_ELEMENTS(er->paths, pnode, pnnode, path)) {
0f478e30
CS
9300 if (json) {
9301 json_nexthop = json_object_new_object();
996c9314
LB
9302 json_object_array_add(json_nexthop_array,
9303 json_nexthop);
0f478e30
CS
9304 }
9305
996c9314 9306 if (if_lookup_by_index(path->ifindex, ospf->vrf_id)) {
0f478e30
CS
9307 if (path->nexthop.s_addr == 0) {
9308 if (json) {
9309 json_object_string_add(
996c9314
LB
9310 json_nexthop, "ip",
9311 " ");
0f478e30
CS
9312 json_object_string_add(
9313 json_nexthop,
9314 "directly attached to",
d62a17ae 9315 ifindex2ifname(
996c9314
LB
9316 path->ifindex,
9317 ospf->vrf_id));
0f478e30 9318 } else {
d62a17ae 9319 vty_out(vty,
996c9314
LB
9320 "%24s directly attached to %s\n",
9321 "",
9322 ifindex2ifname(
9323 path->ifindex,
9324 ospf->vrf_id));
0f478e30
CS
9325 }
9326 } else {
9327 if (json) {
9328 json_object_string_add(
996c9314 9329 json_nexthop, "ip",
d62a17ae 9330 inet_ntoa(
996c9314 9331 path->nexthop));
0f478e30 9332 json_object_string_add(
996c9314 9333 json_nexthop, "via",
d62a17ae 9334 ifindex2ifname(
996c9314
LB
9335 path->ifindex,
9336 ospf->vrf_id));
0f478e30
CS
9337 } else {
9338 vty_out(vty,
996c9314
LB
9339 "%24s via %s, %s\n",
9340 "",
9341 inet_ntoa(
9342 path->nexthop),
9343 ifindex2ifname(
9344 path->ifindex,
9345 ospf->vrf_id));
0f478e30 9346 }
d62a17ae 9347 }
54bedb55 9348 }
d62a17ae 9349 }
0f478e30
CS
9350 if (!json)
9351 json_object_free(json_route);
9352 }
9353 if (!json)
9354 vty_out(vty, "\n");
718e3744 9355}
9356
d62a17ae 9357static int show_ip_ospf_border_routers_common(struct vty *vty,
d7c0a89a
QY
9358 struct ospf *ospf,
9359 uint8_t use_vrf)
718e3744 9360{
d62a17ae 9361 if (ospf->instance)
9362 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
718e3744 9363
b1c3ae8c 9364 ospf_show_vrf_name(ospf, vty, NULL, use_vrf);
87bd50e8 9365
d62a17ae 9366 if (ospf->new_table == NULL) {
9367 vty_out(vty, "No OSPF routing information exist\n");
9368 return CMD_SUCCESS;
9369 }
718e3744 9370
d62a17ae 9371 /* Show Network routes.
9372 show_ip_ospf_route_network (vty, ospf->new_table); */
718e3744 9373
d62a17ae 9374 /* Show Router routes. */
0f478e30 9375 show_ip_ospf_route_router(vty, ospf, ospf->new_rtrs, NULL);
718e3744 9376
d62a17ae 9377 vty_out(vty, "\n");
7c8ff89e 9378
d62a17ae 9379 return CMD_SUCCESS;
718e3744 9380}
718e3744 9381
7c8ff89e
DS
9382DEFUN (show_ip_ospf_border_routers,
9383 show_ip_ospf_border_routers_cmd,
b5a8894d 9384 "show ip ospf [vrf <NAME|all>] border-routers",
718e3744 9385 SHOW_STR
9386 IP_STR
9387 "OSPF information\n"
b5a8894d
CS
9388 VRF_CMD_HELP_STR
9389 "All VRFs\n"
7c8ff89e 9390 "Show all the ABR's and ASBR's\n")
718e3744 9391{
b5a8894d
CS
9392 struct ospf *ospf = NULL;
9393 struct listnode *node = NULL;
9394 char *vrf_name = NULL;
2951a7a4 9395 bool all_vrf = false;
b5a8894d
CS
9396 int ret = CMD_SUCCESS;
9397 int inst = 0;
9398 int idx_vrf = 0;
d7c0a89a 9399 uint8_t use_vrf = 0;
68980084 9400
43b8d1d8 9401 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 9402
b5a8894d 9403 if (vrf_name) {
2951a7a4 9404 bool ospf_output = false;
874f58d8 9405
b1c3ae8c 9406 use_vrf = 1;
94d4c685 9407
b5a8894d
CS
9408 if (all_vrf) {
9409 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
9410 if (!ospf->oi_running)
9411 continue;
b5a8894d 9412
2951a7a4 9413 ospf_output = true;
996c9314
LB
9414 ret = show_ip_ospf_border_routers_common(
9415 vty, ospf, use_vrf);
b5a8894d 9416 }
9f049418
DS
9417
9418 if (!ospf_output)
94d4c685 9419 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d
CS
9420 } else {
9421 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
9f049418 9422 if (ospf == NULL || !ospf->oi_running) {
94d4c685 9423 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 9424 return CMD_SUCCESS;
9f049418 9425 }
b5a8894d 9426
b1c3ae8c
CS
9427 ret = show_ip_ospf_border_routers_common(vty, ospf,
9428 use_vrf);
b5a8894d
CS
9429 }
9430 } else {
9431 /* Display default ospf (instance 0) info */
9432 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
9f049418 9433 if (ospf == NULL || !ospf->oi_running) {
94d4c685 9434 vty_out(vty, "%% OSPF instance not found\n");
b5a8894d 9435 return CMD_SUCCESS;
9f049418
DS
9436 }
9437
b1c3ae8c 9438 ret = show_ip_ospf_border_routers_common(vty, ospf, use_vrf);
b5a8894d
CS
9439 }
9440
9441 return ret;
7c8ff89e
DS
9442}
9443
9444DEFUN (show_ip_ospf_instance_border_routers,
9445 show_ip_ospf_instance_border_routers_cmd,
6147e2c6 9446 "show ip ospf (1-65535) border-routers",
7c8ff89e
DS
9447 SHOW_STR
9448 IP_STR
9449 "OSPF information\n"
9450 "Instance ID\n"
9451 "Show all the ABR's and ASBR's\n")
9452{
d62a17ae 9453 int idx_number = 3;
9454 struct ospf *ospf;
d7c0a89a 9455 unsigned short instance = 0;
7c8ff89e 9456
d62a17ae 9457 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
9458 ospf = ospf_lookup_instance(instance);
9459 if (ospf == NULL)
9460 return CMD_NOT_MY_INSTANCE;
9461
9462 if (!ospf->oi_running)
d62a17ae 9463 return CMD_SUCCESS;
7c8ff89e 9464
b1c3ae8c 9465 return show_ip_ospf_border_routers_common(vty, ospf, 0);
7c8ff89e
DS
9466}
9467
b1c3ae8c 9468static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf,
d7c0a89a 9469 json_object *json, uint8_t use_vrf)
7c8ff89e 9470{
0f478e30
CS
9471 json_object *json_vrf = NULL;
9472
d62a17ae 9473 if (ospf->instance)
9474 vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
718e3744 9475
0f478e30
CS
9476
9477 if (json) {
9478 if (use_vrf)
9479 json_vrf = json_object_new_object();
9480 else
9481 json_vrf = json;
9482 }
9483
9484 ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
87bd50e8 9485
d62a17ae 9486 if (ospf->new_table == NULL) {
9487 vty_out(vty, "No OSPF routing information exist\n");
9488 return CMD_SUCCESS;
9489 }
718e3744 9490
d62a17ae 9491 /* Show Network routes. */
0f478e30 9492 show_ip_ospf_route_network(vty, ospf, ospf->new_table, json_vrf);
718e3744 9493
d62a17ae 9494 /* Show Router routes. */
0f478e30 9495 show_ip_ospf_route_router(vty, ospf, ospf->new_rtrs, json_vrf);
718e3744 9496
d62a17ae 9497 /* Show AS External routes. */
0f478e30
CS
9498 show_ip_ospf_route_external(vty, ospf, ospf->old_external_route,
9499 json_vrf);
718e3744 9500
0f478e30
CS
9501 if (json) {
9502 if (use_vrf) {
996c9314
LB
9503 // json_object_object_add(json_vrf, "areas",
9504 // json_areas);
0f478e30
CS
9505 if (ospf->vrf_id == VRF_DEFAULT)
9506 json_object_object_add(json, "default",
9507 json_vrf);
9508 else
9509 json_object_object_add(json, ospf->name,
9510 json_vrf);
9511 }
9512 } else {
9513 vty_out(vty, "\n");
9514 }
7c8ff89e 9515
d62a17ae 9516 return CMD_SUCCESS;
718e3744 9517}
9518
7c8ff89e
DS
9519DEFUN (show_ip_ospf_route,
9520 show_ip_ospf_route_cmd,
0f478e30 9521 "show ip ospf [vrf <NAME|all>] route [json]",
b5a8894d
CS
9522 SHOW_STR
9523 IP_STR
9524 "OSPF information\n"
9525 VRF_CMD_HELP_STR
9526 "All VRFs\n"
0f478e30
CS
9527 "OSPF routing table\n"
9528 JSON_STR)
b5a8894d
CS
9529{
9530 struct ospf *ospf = NULL;
9531 struct listnode *node = NULL;
9532 char *vrf_name = NULL;
2951a7a4 9533 bool all_vrf = false;
b5a8894d
CS
9534 int ret = CMD_SUCCESS;
9535 int inst = 0;
9536 int idx_vrf = 0;
d7c0a89a 9537 uint8_t use_vrf = 0;
9f049418 9538 bool uj = use_json(argc, argv);
0f478e30
CS
9539 json_object *json = NULL;
9540
9541 if (uj)
9542 json = json_object_new_object();
7c8ff89e 9543
43b8d1d8 9544 OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
7c8ff89e 9545
b5a8894d
CS
9546 /* vrf input is provided could be all or specific vrf*/
9547 if (vrf_name) {
2951a7a4 9548 bool ospf_output = false;
874f58d8 9549
b1c3ae8c 9550 use_vrf = 1;
94d4c685 9551
b5a8894d
CS
9552 if (all_vrf) {
9553 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
9554 if (!ospf->oi_running)
9555 continue;
2951a7a4 9556 ospf_output = true;
0f478e30 9557 ret = show_ip_ospf_route_common(vty, ospf, json,
b1c3ae8c 9558 use_vrf);
b5a8894d 9559 }
0f478e30
CS
9560
9561 if (uj) {
1406159f 9562 /* Keep Non-pretty format */
0f478e30 9563 vty_out(vty, "%s\n",
1406159f 9564 json_object_to_json_string(json));
0f478e30 9565 json_object_free(json);
9f049418
DS
9566 } else if (!ospf_output)
9567 vty_out(vty, "%% OSPF instance not found\n");
0f478e30 9568
b5a8894d
CS
9569 return ret;
9570 }
9571 ospf = ospf_lookup_by_inst_name(inst, vrf_name);
0f478e30 9572 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
9573 if (uj) {
9574 vty_out(vty, "%s\n",
9575 json_object_to_json_string_ext(
9576 json, JSON_C_TO_STRING_PRETTY));
0f478e30 9577 json_object_free(json);
9f049418 9578 } else
94d4c685 9579 vty_out(vty, "%% OSPF instance not found\n");
9f049418 9580
b5a8894d 9581 return CMD_SUCCESS;
0f478e30 9582 }
b5a8894d
CS
9583 } else {
9584 /* Display default ospf (instance 0) info */
9585 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
0f478e30 9586 if (ospf == NULL || !ospf->oi_running) {
9f049418
DS
9587 if (uj) {
9588 vty_out(vty, "%s\n",
9589 json_object_to_json_string_ext(
9590 json, JSON_C_TO_STRING_PRETTY));
0f478e30 9591 json_object_free(json);
9f049418 9592 } else
94d4c685 9593 vty_out(vty, "%% OSPF instance not found\n");
9f049418 9594
b5a8894d 9595 return CMD_SUCCESS;
0f478e30
CS
9596 }
9597 }
9598
9599 if (ospf) {
9600 ret = show_ip_ospf_route_common(vty, ospf, json, use_vrf);
1406159f 9601 /* Keep Non-pretty format */
0f478e30 9602 if (uj)
1406159f 9603 vty_out(vty, "%s\n", json_object_to_json_string(json));
b5a8894d
CS
9604 }
9605
0f478e30
CS
9606 if (uj)
9607 json_object_free(json);
b5a8894d
CS
9608
9609 return ret;
7c8ff89e
DS
9610}
9611
9612DEFUN (show_ip_ospf_instance_route,
9613 show_ip_ospf_instance_route_cmd,
6147e2c6 9614 "show ip ospf (1-65535) route",
7c8ff89e
DS
9615 SHOW_STR
9616 IP_STR
9617 "OSPF information\n"
9618 "Instance ID\n"
9619 "OSPF routing table\n")
9620{
d62a17ae 9621 int idx_number = 3;
9622 struct ospf *ospf;
d7c0a89a 9623 unsigned short instance = 0;
7c8ff89e 9624
d62a17ae 9625 instance = strtoul(argv[idx_number]->arg, NULL, 10);
ac28e4ec
CS
9626 ospf = ospf_lookup_instance(instance);
9627 if (ospf == NULL)
9628 return CMD_NOT_MY_INSTANCE;
9629
9630 if (!ospf->oi_running)
d62a17ae 9631 return CMD_SUCCESS;
7c8ff89e 9632
0f478e30 9633 return show_ip_ospf_route_common(vty, ospf, NULL, 0);
7c8ff89e 9634}
6b0655a2 9635
b5a8894d
CS
9636
9637DEFUN (show_ip_ospf_vrfs,
9638 show_ip_ospf_vrfs_cmd,
9639 "show ip ospf vrfs [json]",
9640 SHOW_STR
9641 IP_STR
9642 "OSPF information\n"
9643 "Show OSPF VRFs \n"
9644 JSON_STR)
9645{
9f049418 9646 bool uj = use_json(argc, argv);
b5a8894d
CS
9647 json_object *json = NULL;
9648 json_object *json_vrfs = NULL;
9649 struct ospf *ospf = NULL;
9650 struct listnode *node = NULL;
9651 int count = 0;
2b64873d 9652 static const char header[] = "Name Id RouterId ";
b5a8894d
CS
9653
9654 if (uj) {
9655 json = json_object_new_object();
9656 json_vrfs = json_object_new_object();
9657 }
9658
9659 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
9660 json_object *json_vrf = NULL;
9661 const char *name = NULL;
fe3da9e7 9662 int64_t vrf_id_ui = 0;
b5a8894d
CS
9663
9664 count++;
9665
9666 if (!uj && count == 1)
9667 vty_out(vty, "%s\n", header);
9668 if (uj)
9669 json_vrf = json_object_new_object();
9670
9671 if (ospf->vrf_id == 0)
9672 name = VRF_DEFAULT_NAME;
9673 else
9674 name = ospf->name;
9675
996c9314
LB
9676 vrf_id_ui = (ospf->vrf_id == VRF_UNKNOWN)
9677 ? -1
9678 : (int64_t)ospf->vrf_id;
b5a8894d
CS
9679
9680 if (uj) {
9681 json_object_int_add(json_vrf, "vrfId", vrf_id_ui);
9682 json_object_string_add(json_vrf, "routerId",
9683 inet_ntoa(ospf->router_id));
9684
9685 json_object_object_add(json_vrfs, name, json_vrf);
9686
9687 } else {
996c9314
LB
9688 vty_out(vty, "%-25s %-5d %-16s \n", name,
9689 ospf->vrf_id, inet_ntoa(ospf->router_id));
b5a8894d
CS
9690 }
9691 }
9692
9693 if (uj) {
9694 json_object_object_add(json, "vrfs", json_vrfs);
9695 json_object_int_add(json, "totalVrfs", count);
9696
996c9314
LB
9697 vty_out(vty, "%s\n", json_object_to_json_string_ext(
9698 json, JSON_C_TO_STRING_PRETTY));
b5a8894d
CS
9699 json_object_free(json);
9700 } else {
9701 if (count)
34d6798f 9702 vty_out(vty, "\nTotal number of OSPF VRFs: %d\n",
b5a8894d
CS
9703 count);
9704 }
9705
9706 return CMD_SUCCESS;
9707}
9708
2b64873d
DL
9709static const char *const ospf_abr_type_str[] = {
9710 "unknown", "standard", "ibm", "cisco", "shortcut"
9711};
718e3744 9712
2b64873d
DL
9713static const char *const ospf_shortcut_mode_str[] = {
9714 "default", "enable", "disable"
9715};
718e3744 9716
2b64873d
DL
9717static const char *const ospf_int_type_str[] = {
9718 "unknown", /* should never be used. */
9719 "point-to-point",
9720 "broadcast",
9721 "non-broadcast",
9722 "point-to-multipoint",
9723 "virtual-link", /* should never be used. */
9724 "loopback"
9725};
718e3744 9726
545f0503 9727static int config_write_interface_one(struct vty *vty, struct vrf *vrf)
d62a17ae 9728{
f4e14fdb 9729 struct listnode *node;
d62a17ae 9730 struct interface *ifp;
9731 struct crypt_key *ck;
d62a17ae 9732 struct route_node *rn = NULL;
9733 struct ospf_if_params *params;
43b8d1d8 9734 int write = 0;
545f0503 9735 struct ospf *ospf = vrf->info;
d62a17ae 9736
545f0503 9737 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 9738
545f0503
CS
9739 if (memcmp(ifp->name, "VLINK", 5) == 0)
9740 continue;
35955c14 9741
545f0503 9742 vty_frame(vty, "!\n");
a36898e7 9743 if (ifp->vrf_id == VRF_DEFAULT)
545f0503
CS
9744 vty_frame(vty, "interface %s\n", ifp->name);
9745 else
996c9314
LB
9746 vty_frame(vty, "interface %s vrf %s\n", ifp->name,
9747 vrf->name);
545f0503
CS
9748 if (ifp->desc)
9749 vty_out(vty, " description %s\n", ifp->desc);
d62a17ae 9750
545f0503 9751 write++;
43b8d1d8 9752
545f0503 9753 params = IF_DEF_PARAMS(ifp);
43b8d1d8 9754
545f0503
CS
9755 do {
9756 /* Interface Network print. */
9757 if (OSPF_IF_PARAM_CONFIGURED(params, type)
9758 && params->type != OSPF_IFTYPE_LOOPBACK) {
996c9314 9759 if (params->type != ospf_default_iftype(ifp)) {
545f0503
CS
9760 vty_out(vty, " ip ospf network %s",
9761 ospf_int_type_str
996c9314 9762 [params->type]);
e425c019 9763 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503
CS
9764 vty_out(vty, " %s",
9765 inet_ntoa(
996c9314 9766 rn->p.u.prefix4));
545f0503 9767 vty_out(vty, "\n");
d62a17ae 9768 }
545f0503 9769 }
d62a17ae 9770
545f0503
CS
9771 /* OSPF interface authentication print */
9772 if (OSPF_IF_PARAM_CONFIGURED(params, auth_type)
996c9314 9773 && params->auth_type != OSPF_AUTH_NOTSET) {
545f0503 9774 const char *auth_str;
d62a17ae 9775
545f0503
CS
9776 /* Translation tables are not that much help
9777 * here due to syntax
9778 * of the simple option */
9779 switch (params->auth_type) {
d62a17ae 9780
545f0503
CS
9781 case OSPF_AUTH_NULL:
9782 auth_str = " null";
9783 break;
d62a17ae 9784
545f0503
CS
9785 case OSPF_AUTH_SIMPLE:
9786 auth_str = "";
9787 break;
b5a8894d 9788
545f0503
CS
9789 case OSPF_AUTH_CRYPTOGRAPHIC:
9790 auth_str = " message-digest";
9791 break;
d62a17ae 9792
545f0503
CS
9793 default:
9794 auth_str = "";
9795 break;
c7fd72d2 9796 }
d62a17ae 9797
545f0503
CS
9798 vty_out(vty, " ip ospf authentication%s",
9799 auth_str);
e425c019 9800 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9801 vty_out(vty, " %s",
c7fd72d2 9802 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9803 vty_out(vty, "\n");
9804 }
d62a17ae 9805
545f0503
CS
9806 /* Simple Authentication Password print. */
9807 if (OSPF_IF_PARAM_CONFIGURED(params, auth_simple)
996c9314 9808 && params->auth_simple[0] != '\0') {
545f0503
CS
9809 vty_out(vty, " ip ospf authentication-key %s",
9810 params->auth_simple);
e425c019 9811 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503
CS
9812 vty_out(vty, " %s",
9813 inet_ntoa(rn->p.u.prefix4));
9814 vty_out(vty, "\n");
9815 }
c7fd72d2 9816
545f0503
CS
9817 /* Cryptographic Authentication Key print. */
9818 if (params && params->auth_crypt) {
996c9314
LB
9819 for (ALL_LIST_ELEMENTS_RO(params->auth_crypt,
9820 node, ck)) {
545f0503
CS
9821 vty_out(vty,
9822 " ip ospf message-digest-key %d md5 %s",
996c9314 9823 ck->key_id, ck->auth_key);
e425c019 9824 if (params != IF_DEF_PARAMS(ifp) && rn)
c7fd72d2 9825 vty_out(vty, " %s",
996c9314
LB
9826 inet_ntoa(
9827 rn->p.u.prefix4));
c7fd72d2
CS
9828 vty_out(vty, "\n");
9829 }
545f0503 9830 }
d62a17ae 9831
545f0503 9832 /* Interface Output Cost print. */
996c9314 9833 if (OSPF_IF_PARAM_CONFIGURED(params, output_cost_cmd)) {
545f0503
CS
9834 vty_out(vty, " ip ospf cost %u",
9835 params->output_cost_cmd);
e425c019 9836 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9837 vty_out(vty, " %s",
43b8d1d8 9838 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9839 vty_out(vty, "\n");
9840 }
d62a17ae 9841
545f0503
CS
9842 /* Hello Interval print. */
9843 if (OSPF_IF_PARAM_CONFIGURED(params, v_hello)
996c9314 9844 && params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT) {
545f0503
CS
9845 vty_out(vty, " ip ospf hello-interval %u",
9846 params->v_hello);
e425c019 9847 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503
CS
9848 vty_out(vty, " %s",
9849 inet_ntoa(rn->p.u.prefix4));
9850 vty_out(vty, "\n");
9851 }
d62a17ae 9852
d62a17ae 9853
545f0503
CS
9854 /* Router Dead Interval print. */
9855 if (OSPF_IF_PARAM_CONFIGURED(params, v_wait)
996c9314
LB
9856 && params->v_wait
9857 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT) {
545f0503 9858 vty_out(vty, " ip ospf dead-interval ");
d62a17ae 9859
545f0503
CS
9860 /* fast hello ? */
9861 if (OSPF_IF_PARAM_CONFIGURED(params,
996c9314 9862 fast_hello))
545f0503
CS
9863 vty_out(vty,
9864 "minimal hello-multiplier %d",
9865 params->fast_hello);
9866 else
996c9314 9867 vty_out(vty, "%u", params->v_wait);
d62a17ae 9868
e425c019 9869 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9870 vty_out(vty, " %s",
43b8d1d8 9871 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9872 vty_out(vty, "\n");
9873 }
d62a17ae 9874
545f0503
CS
9875 /* Router Priority print. */
9876 if (OSPF_IF_PARAM_CONFIGURED(params, priority)
996c9314
LB
9877 && params->priority
9878 != OSPF_ROUTER_PRIORITY_DEFAULT) {
545f0503
CS
9879 vty_out(vty, " ip ospf priority %u",
9880 params->priority);
e425c019 9881 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9882 vty_out(vty, " %s",
43b8d1d8 9883 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9884 vty_out(vty, "\n");
9885 }
d62a17ae 9886
545f0503
CS
9887 /* Retransmit Interval print. */
9888 if (OSPF_IF_PARAM_CONFIGURED(params,
996c9314
LB
9889 retransmit_interval)
9890 && params->retransmit_interval
9891 != OSPF_RETRANSMIT_INTERVAL_DEFAULT) {
545f0503
CS
9892 vty_out(vty, " ip ospf retransmit-interval %u",
9893 params->retransmit_interval);
e425c019 9894 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9895 vty_out(vty, " %s",
43b8d1d8 9896 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9897 vty_out(vty, "\n");
9898 }
d62a17ae 9899
545f0503 9900 /* Transmit Delay print. */
996c9314
LB
9901 if (OSPF_IF_PARAM_CONFIGURED(params, transmit_delay)
9902 && params->transmit_delay
9903 != OSPF_TRANSMIT_DELAY_DEFAULT) {
545f0503
CS
9904 vty_out(vty, " ip ospf transmit-delay %u",
9905 params->transmit_delay);
e425c019 9906 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9907 vty_out(vty, " %s",
996c9314 9908 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9909 vty_out(vty, "\n");
9910 }
d62a17ae 9911
545f0503
CS
9912 /* Area print. */
9913 if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
9914 if (ospf && ospf->instance)
9915 vty_out(vty, " ip ospf %d",
9916 ospf->instance);
9917 else
9918 vty_out(vty, " ip ospf");
d62a17ae 9919
1f9d4e3d 9920 char buf[INET_ADDRSTRLEN];
d62a17ae 9921
996c9314
LB
9922 area_id2str(buf, sizeof(buf), &params->if_area,
9923 params->if_area_id_fmt);
545f0503 9924 vty_out(vty, " area %s", buf);
e425c019 9925 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9926 vty_out(vty, " %s",
996c9314 9927 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9928 vty_out(vty, "\n");
9929 }
d62a17ae 9930
545f0503 9931 /* bfd print. */
e89ffeee 9932 if (params && params->bfd_info)
545f0503 9933 ospf_bfd_write_config(vty, params);
d62a17ae 9934
545f0503
CS
9935 /* MTU ignore print. */
9936 if (OSPF_IF_PARAM_CONFIGURED(params, mtu_ignore)
996c9314 9937 && params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT) {
545f0503
CS
9938 if (params->mtu_ignore == 0)
9939 vty_out(vty, " no ip ospf mtu-ignore");
9940 else
9941 vty_out(vty, " ip ospf mtu-ignore");
e425c019 9942 if (params != IF_DEF_PARAMS(ifp) && rn)
545f0503 9943 vty_out(vty, " %s",
996c9314 9944 inet_ntoa(rn->p.u.prefix4));
545f0503
CS
9945 vty_out(vty, "\n");
9946 }
a8b828f3 9947
d62a17ae 9948
545f0503
CS
9949 while (1) {
9950 if (rn == NULL)
996c9314 9951 rn = route_top(IF_OIFS_PARAMS(ifp));
545f0503
CS
9952 else
9953 rn = route_next(rn);
43b8d1d8 9954
545f0503
CS
9955 if (rn == NULL)
9956 break;
9957 params = rn->info;
9958 if (params != NULL)
9959 break;
9960 }
9961 } while (rn);
43b8d1d8 9962
545f0503
CS
9963 ospf_opaque_config_write_if(vty, ifp);
9964
9965 vty_endframe(vty, NULL);
b5a8894d 9966 }
545f0503 9967
d62a17ae 9968 return write;
718e3744 9969}
9970
43b8d1d8
CS
9971/* Configuration write function for ospfd. */
9972static int config_write_interface(struct vty *vty)
9973{
9974 int write = 0;
545f0503 9975 struct vrf *vrf = NULL;
43b8d1d8 9976
545f0503
CS
9977 /* Display all VRF aware OSPF interface configuration */
9978 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
9979 write += config_write_interface_one(vty, vrf);
9980 }
43b8d1d8
CS
9981
9982 return write;
9983}
9984
d62a17ae 9985static int config_write_network_area(struct vty *vty, struct ospf *ospf)
718e3744 9986{
d62a17ae 9987 struct route_node *rn;
d7c0a89a 9988 uint8_t buf[INET_ADDRSTRLEN];
718e3744 9989
d62a17ae 9990 /* `network area' print. */
9991 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
9992 if (rn->info) {
9993 struct ospf_network *n = rn->info;
718e3744 9994
d62a17ae 9995 /* Create Area ID string by specified Area ID format. */
9996 if (n->area_id_fmt == OSPF_AREA_ID_FMT_DOTTEDQUAD)
1f9d4e3d 9997 inet_ntop(AF_INET, &n->area_id, (char *)buf,
9998 sizeof(buf));
d62a17ae 9999 else
10000 sprintf((char *)buf, "%lu",
10001 (unsigned long int)ntohl(
10002 n->area_id.s_addr));
718e3744 10003
d62a17ae 10004 /* Network print. */
10005 vty_out(vty, " network %s/%d area %s\n",
10006 inet_ntoa(rn->p.u.prefix4), rn->p.prefixlen,
10007 buf);
10008 }
718e3744 10009
d62a17ae 10010 return 0;
718e3744 10011}
10012
d62a17ae 10013static int config_write_ospf_area(struct vty *vty, struct ospf *ospf)
718e3744 10014{
d62a17ae 10015 struct listnode *node;
10016 struct ospf_area *area;
d7c0a89a 10017 uint8_t buf[INET_ADDRSTRLEN];
718e3744 10018
d62a17ae 10019 /* Area configuration print. */
10020 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
10021 struct route_node *rn1;
718e3744 10022
1f9d4e3d 10023 area_id2str((char *)buf, sizeof(buf), &area->area_id,
d62a17ae 10024 area->area_id_fmt);
718e3744 10025
d62a17ae 10026 if (area->auth_type != OSPF_AUTH_NULL) {
10027 if (area->auth_type == OSPF_AUTH_SIMPLE)
10028 vty_out(vty, " area %s authentication\n", buf);
10029 else
10030 vty_out(vty,
10031 " area %s authentication message-digest\n",
10032 buf);
10033 }
718e3744 10034
d62a17ae 10035 if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
10036 vty_out(vty, " area %s shortcut %s\n", buf,
10037 ospf_shortcut_mode_str
10038 [area->shortcut_configured]);
10039
10040 if ((area->external_routing == OSPF_AREA_STUB)
10041 || (area->external_routing == OSPF_AREA_NSSA)) {
7ef56a73 10042 if (area->external_routing == OSPF_AREA_STUB) {
d62a17ae 10043 vty_out(vty, " area %s stub", buf);
7ef56a73
CS
10044 if (area->no_summary)
10045 vty_out(vty, " no-summary\n");
10046 vty_out(vty, "\n");
10047 } else if (area->external_routing == OSPF_AREA_NSSA) {
d62a17ae 10048 switch (area->NSSATranslatorRole) {
10049 case OSPF_NSSA_ROLE_NEVER:
7ef56a73
CS
10050 vty_out(vty,
10051 " area %s nssa translate-never\n",
10052 buf);
d62a17ae 10053 break;
10054 case OSPF_NSSA_ROLE_ALWAYS:
7ef56a73
CS
10055 vty_out(vty,
10056 " area %s nssa translate-always\n",
10057 buf);
d62a17ae 10058 break;
2643b2bc
CS
10059 case OSPF_NSSA_ROLE_CANDIDATE:
10060 vty_out(vty, " area %s nssa \n", buf);
10061 break;
d62a17ae 10062 }
7ef56a73
CS
10063 if (area->no_summary)
10064 vty_out(vty,
10065 " area %s nssa no-summary\n",
10066 buf);
d62a17ae 10067 }
718e3744 10068
d62a17ae 10069 if (area->default_cost != 1)
10070 vty_out(vty, " area %s default-cost %d\n", buf,
10071 area->default_cost);
10072 }
718e3744 10073
d62a17ae 10074 for (rn1 = route_top(area->ranges); rn1; rn1 = route_next(rn1))
10075 if (rn1->info) {
10076 struct ospf_area_range *range = rn1->info;
718e3744 10077
d62a17ae 10078 vty_out(vty, " area %s range %s/%d", buf,
10079 inet_ntoa(rn1->p.u.prefix4),
10080 rn1->p.prefixlen);
718e3744 10081
d62a17ae 10082 if (range->cost_config
10083 != OSPF_AREA_RANGE_COST_UNSPEC)
10084 vty_out(vty, " cost %d",
10085 range->cost_config);
718e3744 10086
d62a17ae 10087 if (!CHECK_FLAG(range->flags,
10088 OSPF_AREA_RANGE_ADVERTISE))
10089 vty_out(vty, " not-advertise");
718e3744 10090
d62a17ae 10091 if (CHECK_FLAG(range->flags,
10092 OSPF_AREA_RANGE_SUBSTITUTE))
10093 vty_out(vty, " substitute %s/%d",
10094 inet_ntoa(range->subst_addr),
10095 range->subst_masklen);
10096
10097 vty_out(vty, "\n");
10098 }
10099
10100 if (EXPORT_NAME(area))
10101 vty_out(vty, " area %s export-list %s\n", buf,
10102 EXPORT_NAME(area));
10103
10104 if (IMPORT_NAME(area))
10105 vty_out(vty, " area %s import-list %s\n", buf,
10106 IMPORT_NAME(area));
10107
10108 if (PREFIX_NAME_IN(area))
10109 vty_out(vty, " area %s filter-list prefix %s in\n", buf,
10110 PREFIX_NAME_IN(area));
10111
10112 if (PREFIX_NAME_OUT(area))
10113 vty_out(vty, " area %s filter-list prefix %s out\n",
10114 buf, PREFIX_NAME_OUT(area));
10115 }
10116
10117 return 0;
718e3744 10118}
10119
d62a17ae 10120static int config_write_ospf_nbr_nbma(struct vty *vty, struct ospf *ospf)
718e3744 10121{
d62a17ae 10122 struct ospf_nbr_nbma *nbr_nbma;
10123 struct route_node *rn;
718e3744 10124
d62a17ae 10125 /* Static Neighbor configuration print. */
10126 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
10127 if ((nbr_nbma = rn->info)) {
10128 vty_out(vty, " neighbor %s", inet_ntoa(nbr_nbma->addr));
718e3744 10129
d62a17ae 10130 if (nbr_nbma->priority
10131 != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
10132 vty_out(vty, " priority %d",
10133 nbr_nbma->priority);
718e3744 10134
d62a17ae 10135 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
10136 vty_out(vty, " poll-interval %d",
10137 nbr_nbma->v_poll);
10138
10139 vty_out(vty, "\n");
10140 }
10141
10142 return 0;
10143}
10144
10145static int config_write_virtual_link(struct vty *vty, struct ospf *ospf)
10146{
10147 struct listnode *node;
10148 struct ospf_vl_data *vl_data;
10149 char buf[INET_ADDRSTRLEN];
10150
10151 /* Virtual-Link print */
10152 for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl_data)) {
10153 struct listnode *n2;
10154 struct crypt_key *ck;
10155 struct ospf_interface *oi;
10156
10157 if (vl_data != NULL) {
d62a17ae 10158 area_id2str(buf, sizeof(buf), &vl_data->vl_area_id,
10159 vl_data->vl_area_id_fmt);
10160 oi = vl_data->vl_oi;
10161
10162 /* timers */
10163 if (OSPF_IF_PARAM(oi, v_hello)
10164 != OSPF_HELLO_INTERVAL_DEFAULT
10165 || OSPF_IF_PARAM(oi, v_wait)
10166 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10167 || OSPF_IF_PARAM(oi, retransmit_interval)
10168 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10169 || OSPF_IF_PARAM(oi, transmit_delay)
10170 != OSPF_TRANSMIT_DELAY_DEFAULT)
10171 vty_out(vty,
10172 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10173 buf, inet_ntoa(vl_data->vl_peer),
10174 OSPF_IF_PARAM(oi, v_hello),
10175 OSPF_IF_PARAM(oi, retransmit_interval),
10176 OSPF_IF_PARAM(oi, transmit_delay),
10177 OSPF_IF_PARAM(oi, v_wait));
10178 else
10179 vty_out(vty, " area %s virtual-link %s\n", buf,
10180 inet_ntoa(vl_data->vl_peer));
10181 /* Auth key */
10182 if (IF_DEF_PARAMS(vl_data->vl_oi->ifp)->auth_simple[0]
10183 != '\0')
10184 vty_out(vty,
10185 " area %s virtual-link %s authentication-key %s\n",
10186 buf, inet_ntoa(vl_data->vl_peer),
10187 IF_DEF_PARAMS(vl_data->vl_oi->ifp)
10188 ->auth_simple);
10189 /* md5 keys */
10190 for (ALL_LIST_ELEMENTS_RO(
10191 IF_DEF_PARAMS(vl_data->vl_oi->ifp)
10192 ->auth_crypt,
10193 n2, ck))
10194 vty_out(vty,
10195 " area %s virtual-link %s"
10196 " message-digest-key %d md5 %s\n",
10197 buf, inet_ntoa(vl_data->vl_peer),
10198 ck->key_id, ck->auth_key);
10199 }
10200 }
10201
10202 return 0;
718e3744 10203}
10204
6b0655a2 10205
d62a17ae 10206static int config_write_ospf_redistribute(struct vty *vty, struct ospf *ospf)
718e3744 10207{
d62a17ae 10208 int type;
718e3744 10209
d62a17ae 10210 /* redistribute print. */
10211 for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
10212 struct list *red_list;
10213 struct listnode *node;
10214 struct ospf_redist *red;
718e3744 10215
d62a17ae 10216 red_list = ospf->redist[type];
10217 if (!red_list)
10218 continue;
7c8ff89e 10219
d62a17ae 10220 for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) {
10221 vty_out(vty, " redistribute %s",
10222 zebra_route_string(type));
10223 if (red->instance)
10224 vty_out(vty, " %d", red->instance);
7c8ff89e 10225
d62a17ae 10226 if (red->dmetric.value >= 0)
10227 vty_out(vty, " metric %d", red->dmetric.value);
7c8ff89e 10228
d62a17ae 10229 if (red->dmetric.type == EXTERNAL_METRIC_TYPE_1)
10230 vty_out(vty, " metric-type 1");
7c8ff89e 10231
d62a17ae 10232 if (ROUTEMAP_NAME(red))
10233 vty_out(vty, " route-map %s",
10234 ROUTEMAP_NAME(red));
7c8ff89e 10235
d62a17ae 10236 vty_out(vty, "\n");
10237 }
10238 }
718e3744 10239
d62a17ae 10240 return 0;
718e3744 10241}
10242
d62a17ae 10243static int config_write_ospf_default_metric(struct vty *vty, struct ospf *ospf)
718e3744 10244{
d62a17ae 10245 if (ospf->default_metric != -1)
10246 vty_out(vty, " default-metric %d\n", ospf->default_metric);
10247 return 0;
718e3744 10248}
10249
d62a17ae 10250static int config_write_ospf_distribute(struct vty *vty, struct ospf *ospf)
10251{
10252 int type;
10253 struct ospf_redist *red;
718e3744 10254
d62a17ae 10255 if (ospf) {
10256 /* distribute-list print. */
10257 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
10258 if (DISTRIBUTE_NAME(ospf, type))
10259 vty_out(vty, " distribute-list %s out %s\n",
10260 DISTRIBUTE_NAME(ospf, type),
10261 zebra_route_string(type));
7c8ff89e 10262
d62a17ae 10263 /* default-information print. */
10264 if (ospf->default_originate != DEFAULT_ORIGINATE_NONE) {
10265 vty_out(vty, " default-information originate");
10266 if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
10267 vty_out(vty, " always");
718e3744 10268
d62a17ae 10269 red = ospf_redist_lookup(ospf, DEFAULT_ROUTE, 0);
10270 if (red) {
10271 if (red->dmetric.value >= 0)
10272 vty_out(vty, " metric %d",
10273 red->dmetric.value);
951da435 10274
d62a17ae 10275 if (red->dmetric.type == EXTERNAL_METRIC_TYPE_1)
10276 vty_out(vty, " metric-type 1");
718e3744 10277
d62a17ae 10278 if (ROUTEMAP_NAME(red))
10279 vty_out(vty, " route-map %s",
10280 ROUTEMAP_NAME(red));
10281 }
10282
10283 vty_out(vty, "\n");
10284 }
10285 }
10286
10287 return 0;
718e3744 10288}
10289
d62a17ae 10290static int config_write_ospf_distance(struct vty *vty, struct ospf *ospf)
10291{
10292 struct route_node *rn;
10293 struct ospf_distance *odistance;
10294
10295 if (ospf->distance_all)
10296 vty_out(vty, " distance %d\n", ospf->distance_all);
10297
10298 if (ospf->distance_intra || ospf->distance_inter
10299 || ospf->distance_external) {
10300 vty_out(vty, " distance ospf");
10301
10302 if (ospf->distance_intra)
10303 vty_out(vty, " intra-area %d", ospf->distance_intra);
10304 if (ospf->distance_inter)
10305 vty_out(vty, " inter-area %d", ospf->distance_inter);
10306 if (ospf->distance_external)
10307 vty_out(vty, " external %d", ospf->distance_external);
10308
10309 vty_out(vty, "\n");
10310 }
10311
10312 for (rn = route_top(ospf->distance_table); rn; rn = route_next(rn))
10313 if ((odistance = rn->info) != NULL) {
10314 vty_out(vty, " distance %d %s/%d %s\n",
10315 odistance->distance, inet_ntoa(rn->p.u.prefix4),
10316 rn->p.prefixlen,
10317 odistance->access_list ? odistance->access_list
10318 : "");
10319 }
10320 return 0;
718e3744 10321}
10322
43b8d1d8 10323static int ospf_config_write_one(struct vty *vty, struct ospf *ospf)
d62a17ae 10324{
f4e14fdb 10325 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
d62a17ae 10326 struct interface *ifp;
10327 struct ospf_interface *oi;
43b8d1d8 10328 struct listnode *node = NULL;
d62a17ae 10329 int write = 0;
10330
43b8d1d8
CS
10331 /* `router ospf' print. */
10332 if (ospf->instance && ospf->name) {
996c9314
LB
10333 vty_out(vty, "router ospf %d vrf %s\n", ospf->instance,
10334 ospf->name);
43b8d1d8 10335 } else if (ospf->instance) {
996c9314 10336 vty_out(vty, "router ospf %d\n", ospf->instance);
43b8d1d8 10337 } else if (ospf->name) {
996c9314 10338 vty_out(vty, "router ospf vrf %s\n", ospf->name);
43b8d1d8
CS
10339 } else
10340 vty_out(vty, "router ospf\n");
10341
10342 if (!ospf->networks) {
10343 write++;
b5a8894d 10344 return write;
43b8d1d8 10345 }
d62a17ae 10346
43b8d1d8
CS
10347 /* Router ID print. */
10348 if (ospf->router_id_static.s_addr != 0)
10349 vty_out(vty, " ospf router-id %s\n",
10350 inet_ntoa(ospf->router_id_static));
d62a17ae 10351
43b8d1d8
CS
10352 /* ABR type print. */
10353 if (ospf->abr_type != OSPF_ABR_DEFAULT)
10354 vty_out(vty, " ospf abr-type %s\n",
10355 ospf_abr_type_str[ospf->abr_type]);
b5a8894d 10356
43b8d1d8
CS
10357 /* log-adjacency-changes flag print. */
10358 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES)) {
10359 if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
10360 vty_out(vty, " log-adjacency-changes detail\n");
10361 else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES)
10362 vty_out(vty, " log-adjacency-changes\n");
10363 } else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES) {
10364 vty_out(vty, " no log-adjacency-changes\n");
10365 }
b5a8894d 10366
43b8d1d8
CS
10367 /* RFC1583 compatibility flag print -- Compatible with CISCO
10368 * 12.1. */
10369 if (CHECK_FLAG(ospf->config, OSPF_RFC1583_COMPATIBLE))
10370 vty_out(vty, " compatible rfc1583\n");
d62a17ae 10371
43b8d1d8
CS
10372 /* auto-cost reference-bandwidth configuration. */
10373 if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH) {
10374 vty_out(vty,
10375 "! Important: ensure reference bandwidth "
10376 "is consistent across all routers\n");
10377 vty_out(vty, " auto-cost reference-bandwidth %d\n",
10378 ospf->ref_bandwidth);
10379 }
d62a17ae 10380
43b8d1d8
CS
10381 /* SPF timers print. */
10382 if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT
10383 || ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT
10384 || ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
996c9314
LB
10385 vty_out(vty, " timers throttle spf %d %d %d\n", ospf->spf_delay,
10386 ospf->spf_holdtime, ospf->spf_max_holdtime);
43b8d1d8
CS
10387
10388 /* LSA timers print. */
10389 if (ospf->min_ls_interval != OSPF_MIN_LS_INTERVAL)
10390 vty_out(vty, " timers throttle lsa all %d\n",
10391 ospf->min_ls_interval);
10392 if (ospf->min_ls_arrival != OSPF_MIN_LS_ARRIVAL)
10393 vty_out(vty, " timers lsa min-arrival %d\n",
10394 ospf->min_ls_arrival);
10395
10396 /* Write multiplier print. */
10397 if (ospf->write_oi_count != OSPF_WRITE_INTERFACE_COUNT_DEFAULT)
10398 vty_out(vty, " ospf write-multiplier %d\n",
10399 ospf->write_oi_count);
d62a17ae 10400
43b8d1d8
CS
10401 /* Max-metric router-lsa print */
10402 config_write_stub_router(vty, ospf);
d62a17ae 10403
43b8d1d8 10404 /* SPF refresh parameters print. */
996c9314
LB
10405 if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
10406 vty_out(vty, " refresh timer %d\n", ospf->lsa_refresh_interval);
d62a17ae 10407
43b8d1d8
CS
10408 /* Redistribute information print. */
10409 config_write_ospf_redistribute(vty, ospf);
d62a17ae 10410
43b8d1d8
CS
10411 /* passive-interface print. */
10412 if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
10413 vty_out(vty, " passive-interface default\n");
d62a17ae 10414
451fda4f 10415 FOR_ALL_INTERFACES (vrf, ifp)
43b8d1d8
CS
10416 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp),
10417 passive_interface)
10418 && IF_DEF_PARAMS(ifp)->passive_interface
996c9314 10419 != ospf->passive_interface_default) {
43b8d1d8 10420 vty_out(vty, " %spassive-interface %s\n",
996c9314
LB
10421 IF_DEF_PARAMS(ifp)->passive_interface ? ""
10422 : "no ",
43b8d1d8
CS
10423 ifp->name);
10424 }
10425 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
996c9314 10426 if (!OSPF_IF_PARAM_CONFIGURED(oi->params, passive_interface))
43b8d1d8
CS
10427 continue;
10428 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi->ifp),
10429 passive_interface)) {
10430 if (oi->params->passive_interface
996c9314 10431 == IF_DEF_PARAMS(oi->ifp)->passive_interface)
43b8d1d8
CS
10432 continue;
10433 } else if (oi->params->passive_interface
10434 == ospf->passive_interface_default)
10435 continue;
d62a17ae 10436
43b8d1d8
CS
10437 vty_out(vty, " %spassive-interface %s %s\n",
10438 oi->params->passive_interface ? "" : "no ",
996c9314 10439 oi->ifp->name, inet_ntoa(oi->address->u.prefix4));
43b8d1d8 10440 }
d62a17ae 10441
43b8d1d8
CS
10442 /* Network area print. */
10443 config_write_network_area(vty, ospf);
d62a17ae 10444
43b8d1d8
CS
10445 /* Area config print. */
10446 config_write_ospf_area(vty, ospf);
d62a17ae 10447
43b8d1d8
CS
10448 /* static neighbor print. */
10449 config_write_ospf_nbr_nbma(vty, ospf);
10450
10451 /* Virtual-Link print. */
10452 config_write_virtual_link(vty, ospf);
10453
10454 /* Default metric configuration. */
10455 config_write_ospf_default_metric(vty, ospf);
10456
10457 /* Distribute-list and default-information print. */
10458 config_write_ospf_distribute(vty, ospf);
10459
10460 /* Distance configuration. */
10461 config_write_ospf_distance(vty, ospf);
10462
10463 ospf_opaque_config_write_router(vty, ospf);
10464
10465 write++;
10466 return write;
10467}
10468
10469/* OSPF configuration write function. */
10470static int ospf_config_write(struct vty *vty)
10471{
10472 struct ospf *ospf;
10473 struct listnode *ospf_node = NULL;
10474 int write = 0;
10475
10476 if (listcount(om->ospf) == 0)
10477 return write;
10478
10479 for (ALL_LIST_ELEMENTS_RO(om->ospf, ospf_node, ospf)) {
88d77109
CS
10480 /* VRF Default check if it is running.
10481 * Upon daemon start, there could be default instance
10482 * in absence of 'router ospf'/oi_running is disabled. */
10483 if (ospf->vrf_id == VRF_DEFAULT && ospf->oi_running)
10484 write += ospf_config_write_one(vty, ospf);
10485 /* For Non-Default VRF simply display the configuration,
10486 * even if it is not oi_running. */
10487 else if (ospf->vrf_id != VRF_DEFAULT)
43b8d1d8 10488 write += ospf_config_write_one(vty, ospf);
b5a8894d 10489 }
d62a17ae 10490 return write;
10491}
10492
10493void ospf_vty_show_init(void)
10494{
10495 /* "show ip ospf" commands. */
10496 install_element(VIEW_NODE, &show_ip_ospf_cmd);
10497
10498 install_element(VIEW_NODE, &show_ip_ospf_instance_cmd);
10499
10500 /* "show ip ospf database" commands. */
10501 install_element(VIEW_NODE, &show_ip_ospf_database_max_cmd);
10502
10503 install_element(VIEW_NODE,
10504 &show_ip_ospf_instance_database_type_adv_router_cmd);
10505 install_element(VIEW_NODE, &show_ip_ospf_instance_database_cmd);
10506 install_element(VIEW_NODE, &show_ip_ospf_instance_database_max_cmd);
10507
10508 /* "show ip ospf interface" commands. */
10509 install_element(VIEW_NODE, &show_ip_ospf_interface_cmd);
10510
10511 install_element(VIEW_NODE, &show_ip_ospf_instance_interface_cmd);
c9339663
CS
10512 /* "show ip ospf interface traffic */
10513 install_element(VIEW_NODE, &show_ip_ospf_interface_traffic_cmd);
d62a17ae 10514
10515 /* "show ip ospf neighbor" commands. */
10516 install_element(VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
10517 install_element(VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
10518 install_element(VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
10519 install_element(VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
10520 install_element(VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
10521 install_element(VIEW_NODE, &show_ip_ospf_neighbor_cmd);
10522 install_element(VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
10523
10524 install_element(VIEW_NODE,
10525 &show_ip_ospf_instance_neighbor_int_detail_cmd);
10526 install_element(VIEW_NODE, &show_ip_ospf_instance_neighbor_int_cmd);
10527 install_element(VIEW_NODE, &show_ip_ospf_instance_neighbor_id_cmd);
10528 install_element(VIEW_NODE,
10529 &show_ip_ospf_instance_neighbor_detail_all_cmd);
10530 install_element(VIEW_NODE, &show_ip_ospf_instance_neighbor_detail_cmd);
10531 install_element(VIEW_NODE, &show_ip_ospf_instance_neighbor_cmd);
10532 install_element(VIEW_NODE, &show_ip_ospf_instance_neighbor_all_cmd);
10533
10534 /* "show ip ospf route" commands. */
10535 install_element(VIEW_NODE, &show_ip_ospf_route_cmd);
10536 install_element(VIEW_NODE, &show_ip_ospf_border_routers_cmd);
10537
10538 install_element(VIEW_NODE, &show_ip_ospf_instance_route_cmd);
10539 install_element(VIEW_NODE, &show_ip_ospf_instance_border_routers_cmd);
b5a8894d
CS
10540
10541 /* "show ip ospf vrfs" commands. */
10542 install_element(VIEW_NODE, &show_ip_ospf_vrfs_cmd);
718e3744 10543}
10544
6b0655a2 10545
718e3744 10546/* ospfd's interface node. */
d62a17ae 10547static struct cmd_node interface_node = {INTERFACE_NODE, "%s(config-if)# ", 1};
718e3744 10548
10549/* Initialization of OSPF interface. */
d62a17ae 10550static void ospf_vty_if_init(void)
10551{
10552 /* Install interface node. */
10553 install_node(&interface_node, config_write_interface);
10554 if_cmd_init();
10555
10556 /* "ip ospf authentication" commands. */
10557 install_element(INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
10558 install_element(INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
10559 install_element(INTERFACE_NODE,
10560 &no_ip_ospf_authentication_args_addr_cmd);
10561 install_element(INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
10562 install_element(INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
10563 install_element(INTERFACE_NODE,
10564 &no_ip_ospf_authentication_key_authkey_addr_cmd);
10565 install_element(INTERFACE_NODE,
10566 &no_ospf_authentication_key_authkey_addr_cmd);
10567
10568 /* "ip ospf message-digest-key" commands. */
10569 install_element(INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
10570 install_element(INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
10571
10572 /* "ip ospf cost" commands. */
10573 install_element(INTERFACE_NODE, &ip_ospf_cost_cmd);
10574 install_element(INTERFACE_NODE, &no_ip_ospf_cost_cmd);
10575
10576 /* "ip ospf mtu-ignore" commands. */
10577 install_element(INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
10578 install_element(INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
10579
10580 /* "ip ospf dead-interval" commands. */
10581 install_element(INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
10582 install_element(INTERFACE_NODE,
10583 &ip_ospf_dead_interval_minimal_addr_cmd);
10584 install_element(INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
10585
10586 /* "ip ospf hello-interval" commands. */
10587 install_element(INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
10588 install_element(INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
10589
10590 /* "ip ospf network" commands. */
10591 install_element(INTERFACE_NODE, &ip_ospf_network_cmd);
10592 install_element(INTERFACE_NODE, &no_ip_ospf_network_cmd);
10593
10594 /* "ip ospf priority" commands. */
10595 install_element(INTERFACE_NODE, &ip_ospf_priority_cmd);
10596 install_element(INTERFACE_NODE, &no_ip_ospf_priority_cmd);
10597
10598 /* "ip ospf retransmit-interval" commands. */
10599 install_element(INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
10600 install_element(INTERFACE_NODE,
10601 &no_ip_ospf_retransmit_interval_addr_cmd);
10602
10603 /* "ip ospf transmit-delay" commands. */
10604 install_element(INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
10605 install_element(INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
10606
10607 /* "ip ospf area" commands. */
10608 install_element(INTERFACE_NODE, &ip_ospf_area_cmd);
10609 install_element(INTERFACE_NODE, &no_ip_ospf_area_cmd);
10610
10611 /* These commands are compatibitliy for previous version. */
10612 install_element(INTERFACE_NODE, &ospf_authentication_key_cmd);
10613 install_element(INTERFACE_NODE, &ospf_message_digest_key_cmd);
10614 install_element(INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
10615 install_element(INTERFACE_NODE, &ospf_dead_interval_cmd);
10616 install_element(INTERFACE_NODE, &no_ospf_dead_interval_cmd);
10617 install_element(INTERFACE_NODE, &ospf_hello_interval_cmd);
10618 install_element(INTERFACE_NODE, &no_ospf_hello_interval_cmd);
10619 install_element(INTERFACE_NODE, &ospf_cost_cmd);
10620 install_element(INTERFACE_NODE, &no_ospf_cost_cmd);
10621 install_element(INTERFACE_NODE, &ospf_network_cmd);
10622 install_element(INTERFACE_NODE, &no_ospf_network_cmd);
10623 install_element(INTERFACE_NODE, &ospf_priority_cmd);
10624 install_element(INTERFACE_NODE, &no_ospf_priority_cmd);
10625 install_element(INTERFACE_NODE, &ospf_retransmit_interval_cmd);
10626 install_element(INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
10627 install_element(INTERFACE_NODE, &ospf_transmit_delay_cmd);
10628 install_element(INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
10629}
10630
10631static void ospf_vty_zebra_init(void)
10632{
10633 install_element(OSPF_NODE, &ospf_redistribute_source_cmd);
10634 install_element(OSPF_NODE, &no_ospf_redistribute_source_cmd);
10635 install_element(OSPF_NODE, &ospf_redistribute_instance_source_cmd);
10636 install_element(OSPF_NODE, &no_ospf_redistribute_instance_source_cmd);
10637
10638 install_element(OSPF_NODE, &ospf_distribute_list_out_cmd);
10639 install_element(OSPF_NODE, &no_ospf_distribute_list_out_cmd);
10640
10641 install_element(OSPF_NODE, &ospf_default_information_originate_cmd);
10642 install_element(OSPF_NODE, &no_ospf_default_information_originate_cmd);
10643
10644 install_element(OSPF_NODE, &ospf_default_metric_cmd);
10645 install_element(OSPF_NODE, &no_ospf_default_metric_cmd);
10646
10647 install_element(OSPF_NODE, &ospf_distance_cmd);
10648 install_element(OSPF_NODE, &no_ospf_distance_cmd);
10649 install_element(OSPF_NODE, &no_ospf_distance_ospf_cmd);
10650 install_element(OSPF_NODE, &ospf_distance_ospf_cmd);
718e3744 10651#if 0
10652 install_element (OSPF_NODE, &ospf_distance_source_cmd);
10653 install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
10654 install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
10655 install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
10656#endif /* 0 */
10657}
10658
d62a17ae 10659static struct cmd_node ospf_node = {OSPF_NODE, "%s(config-router)# ", 1};
718e3744 10660
d62a17ae 10661static void ospf_interface_clear(struct interface *ifp)
09f35f8c 10662{
d62a17ae 10663 if (!if_is_operative(ifp))
10664 return;
09f35f8c 10665
d62a17ae 10666 if (IS_DEBUG_OSPF(ism, ISM_EVENTS))
10667 zlog_debug("ISM[%s]: clear by reset", ifp->name);
09f35f8c 10668
d62a17ae 10669 ospf_if_reset(ifp);
09f35f8c
DS
10670}
10671
10672DEFUN (clear_ip_ospf_interface,
10673 clear_ip_ospf_interface_cmd,
1e81afc3 10674 "clear ip ospf [vrf NAME] interface [IFNAME]",
09f35f8c
DS
10675 CLEAR_STR
10676 IP_STR
10677 "OSPF information\n"
03ed9f02 10678 VRF_CMD_HELP_STR
09f35f8c
DS
10679 "Interface information\n"
10680 "Interface name\n")
10681{
03ed9f02
PG
10682 int idx_ifname = 0;
10683 int idx_vrf = 0;
d62a17ae 10684 struct interface *ifp;
f4e14fdb 10685 struct listnode *node;
b5a8894d 10686 struct ospf *ospf = NULL;
03ed9f02
PG
10687 char *vrf_name = NULL;
10688 vrf_id_t vrf_id = VRF_DEFAULT;
10689 struct vrf *vrf = NULL;
09f35f8c 10690
03ed9f02
PG
10691 if (argv_find(argv, argc, "vrf", &idx_vrf))
10692 vrf_name = argv[idx_vrf + 1]->arg;
10693 if (vrf_name && strmatch(vrf_name, VRF_DEFAULT_NAME))
10694 vrf_name = NULL;
10695 if (vrf_name) {
10696 vrf = vrf_lookup_by_name(vrf_name);
10697 if (vrf)
10698 vrf_id = vrf->vrf_id;
10699 }
10700 if (!argv_find(argv, argc, "IFNAME", &idx_ifname)) {
10701 /* Clear all the ospfv2 interfaces. */
f4e14fdb 10702 for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
03ed9f02
PG
10703 if (vrf_id != ospf->vrf_id)
10704 continue;
10705 if (!vrf)
10706 vrf = vrf_lookup_by_id(ospf->vrf_id);
451fda4f 10707 FOR_ALL_INTERFACES (vrf, ifp)
b5a8894d
CS
10708 ospf_interface_clear(ifp);
10709 }
10710 } else {
10711 /* Interface name is specified. */
a36898e7 10712 ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf_id);
b5a8894d 10713 if (ifp == NULL)
d62a17ae 10714 vty_out(vty, "No such interface name\n");
10715 else
10716 ospf_interface_clear(ifp);
10717 }
10718
10719 return CMD_SUCCESS;
09f35f8c
DS
10720}
10721
d62a17ae 10722void ospf_vty_clear_init(void)
09f35f8c 10723{
d62a17ae 10724 install_element(ENABLE_NODE, &clear_ip_ospf_interface_cmd);
09f35f8c
DS
10725}
10726
6b0655a2 10727
718e3744 10728/* Install OSPF related vty commands. */
d62a17ae 10729void ospf_vty_init(void)
10730{
10731 /* Install ospf top node. */
10732 install_node(&ospf_node, ospf_config_write);
10733
10734 /* "router ospf" commands. */
10735 install_element(CONFIG_NODE, &router_ospf_cmd);
10736 install_element(CONFIG_NODE, &no_router_ospf_cmd);
10737
10738
10739 install_default(OSPF_NODE);
10740
10741 /* "ospf router-id" commands. */
10742 install_element(OSPF_NODE, &ospf_router_id_cmd);
10743 install_element(OSPF_NODE, &ospf_router_id_old_cmd);
10744 install_element(OSPF_NODE, &no_ospf_router_id_cmd);
10745
10746 /* "passive-interface" commands. */
10747 install_element(OSPF_NODE, &ospf_passive_interface_addr_cmd);
10748 install_element(OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
10749
10750 /* "ospf abr-type" commands. */
10751 install_element(OSPF_NODE, &ospf_abr_type_cmd);
10752 install_element(OSPF_NODE, &no_ospf_abr_type_cmd);
10753
10754 /* "ospf log-adjacency-changes" commands. */
10755 install_element(OSPF_NODE, &ospf_log_adjacency_changes_cmd);
10756 install_element(OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
10757 install_element(OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
10758 install_element(OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
10759
10760 /* "ospf rfc1583-compatible" commands. */
10761 install_element(OSPF_NODE, &ospf_compatible_rfc1583_cmd);
10762 install_element(OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
10763 install_element(OSPF_NODE, &ospf_rfc1583_flag_cmd);
10764 install_element(OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
10765
10766 /* "network area" commands. */
10767 install_element(OSPF_NODE, &ospf_network_area_cmd);
10768 install_element(OSPF_NODE, &no_ospf_network_area_cmd);
10769
10770 /* "area authentication" commands. */
10771 install_element(OSPF_NODE,
10772 &ospf_area_authentication_message_digest_cmd);
10773 install_element(OSPF_NODE, &ospf_area_authentication_cmd);
10774 install_element(OSPF_NODE, &no_ospf_area_authentication_cmd);
10775
10776 /* "area range" commands. */
10777 install_element(OSPF_NODE, &ospf_area_range_cmd);
10778 install_element(OSPF_NODE, &ospf_area_range_cost_cmd);
10779 install_element(OSPF_NODE, &ospf_area_range_not_advertise_cmd);
10780 install_element(OSPF_NODE, &no_ospf_area_range_cmd);
10781 install_element(OSPF_NODE, &ospf_area_range_substitute_cmd);
10782 install_element(OSPF_NODE, &no_ospf_area_range_substitute_cmd);
10783
10784 /* "area virtual-link" commands. */
10785 install_element(OSPF_NODE, &ospf_area_vlink_cmd);
10786 install_element(OSPF_NODE, &ospf_area_vlink_intervals_cmd);
10787 install_element(OSPF_NODE, &no_ospf_area_vlink_cmd);
10788 install_element(OSPF_NODE, &no_ospf_area_vlink_intervals_cmd);
10789
10790
10791 /* "area stub" commands. */
10792 install_element(OSPF_NODE, &ospf_area_stub_no_summary_cmd);
10793 install_element(OSPF_NODE, &ospf_area_stub_cmd);
10794 install_element(OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
10795 install_element(OSPF_NODE, &no_ospf_area_stub_cmd);
10796
10797 /* "area nssa" commands. */
10798 install_element(OSPF_NODE, &ospf_area_nssa_cmd);
d62a17ae 10799 install_element(OSPF_NODE, &ospf_area_nssa_translate_cmd);
10800 install_element(OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
7ef56a73 10801 install_element(OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
d62a17ae 10802 install_element(OSPF_NODE, &no_ospf_area_nssa_cmd);
10803
10804 install_element(OSPF_NODE, &ospf_area_default_cost_cmd);
10805 install_element(OSPF_NODE, &no_ospf_area_default_cost_cmd);
10806
10807 install_element(OSPF_NODE, &ospf_area_shortcut_cmd);
10808 install_element(OSPF_NODE, &no_ospf_area_shortcut_cmd);
10809
10810 install_element(OSPF_NODE, &ospf_area_export_list_cmd);
10811 install_element(OSPF_NODE, &no_ospf_area_export_list_cmd);
10812
10813 install_element(OSPF_NODE, &ospf_area_filter_list_cmd);
10814 install_element(OSPF_NODE, &no_ospf_area_filter_list_cmd);
10815
10816 install_element(OSPF_NODE, &ospf_area_import_list_cmd);
10817 install_element(OSPF_NODE, &no_ospf_area_import_list_cmd);
10818
10819 /* SPF timer commands */
10820 install_element(OSPF_NODE, &ospf_timers_throttle_spf_cmd);
10821 install_element(OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
10822
10823 /* LSA timers commands */
10824 install_element(OSPF_NODE, &ospf_timers_min_ls_interval_cmd);
10825 install_element(OSPF_NODE, &no_ospf_timers_min_ls_interval_cmd);
0e88de35
QY
10826 install_element(OSPF_NODE, &ospf_timers_lsa_min_arrival_cmd);
10827 install_element(OSPF_NODE, &no_ospf_timers_lsa_min_arrival_cmd);
d62a17ae 10828
10829 /* refresh timer commands */
10830 install_element(OSPF_NODE, &ospf_refresh_timer_cmd);
10831 install_element(OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
10832
10833 /* max-metric commands */
10834 install_element(OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
10835 install_element(OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
10836 install_element(OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
10837 install_element(OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
10838 install_element(OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
10839 install_element(OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
10840
10841 /* reference bandwidth commands */
10842 install_element(OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
10843 install_element(OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
10844
10845 /* "neighbor" commands. */
10846 install_element(OSPF_NODE, &ospf_neighbor_cmd);
10847 install_element(OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
10848 install_element(OSPF_NODE, &no_ospf_neighbor_cmd);
10849 install_element(OSPF_NODE, &no_ospf_neighbor_poll_cmd);
10850
10851 /* write multiplier commands */
10852 install_element(OSPF_NODE, &ospf_write_multiplier_cmd);
10853 install_element(OSPF_NODE, &write_multiplier_cmd);
10854 install_element(OSPF_NODE, &no_ospf_write_multiplier_cmd);
10855 install_element(OSPF_NODE, &no_write_multiplier_cmd);
10856
10857 /* Init interface related vty commands. */
10858 ospf_vty_if_init();
10859
10860 /* Init zebra related vty commands. */
10861 ospf_vty_zebra_init();
718e3744 10862}