2 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
3 * Copyright (C) 2000 Toshiaki Takada
5 * This file is part of GNU Zebra.
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
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.
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
38 #include "lib/printfrr.h"
40 #include "ospfd/ospfd.h"
41 #include "ospfd/ospf_asbr.h"
42 #include "ospfd/ospf_lsa.h"
43 #include "ospfd/ospf_lsdb.h"
44 #include "ospfd/ospf_ism.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_nsm.h"
47 #include "ospfd/ospf_neighbor.h"
48 #include "ospfd/ospf_flood.h"
49 #include "ospfd/ospf_abr.h"
50 #include "ospfd/ospf_spf.h"
51 #include "ospfd/ospf_route.h"
52 #include "ospfd/ospf_zebra.h"
53 /*#include "ospfd/ospf_routemap.h" */
54 #include "ospfd/ospf_vty.h"
55 #include "ospfd/ospf_dump.h"
56 #include "ospfd/ospf_bfd.h"
57 #include "ospfd/ospf_ldp_sync.h"
58 #include "ospfd/ospf_orr.h"
61 FRR_CFG_DEFAULT_BOOL(OSPF_LOG_ADJACENCY_CHANGES
,
62 { .val_bool
= true, .match_profile
= "datacenter", },
63 { .val_bool
= false },
66 static const char *const ospf_network_type_str
[] = {
67 "Null", "POINTOPOINT", "BROADCAST", "NBMA", "POINTOMULTIPOINT",
68 "VIRTUALLINK", "LOOPBACK"};
70 /* Utility functions. */
71 int str2area_id(const char *str
, struct in_addr
*area_id
, int *area_id_fmt
)
75 area_id
->s_addr
= htonl(strtoul(str
, &ep
, 10));
76 if (*ep
&& !inet_aton(str
, area_id
))
80 *ep
? OSPF_AREA_ID_FMT_DOTTEDQUAD
: OSPF_AREA_ID_FMT_DECIMAL
;
85 static void area_id2str(char *buf
, int length
, struct in_addr
*area_id
,
88 if (area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
89 inet_ntop(AF_INET
, area_id
, buf
, length
);
91 snprintf(buf
, length
, "%lu",
92 (unsigned long)ntohl(area_id
->s_addr
));
95 static int str2metric(const char *str
, int *metric
)
101 *metric
= strtol(str
, NULL
, 10);
102 if (*metric
< 0 || *metric
> 16777214) {
103 /* vty_out (vty, "OSPF metric value is invalid\n"); */
110 static int str2metric_type(const char *str
, int *metric_type
)
116 if (strncmp(str
, "1", 1) == 0)
117 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
118 else if (strncmp(str
, "2", 1) == 0)
119 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
126 int ospf_oi_count(struct interface
*ifp
)
128 struct route_node
*rn
;
131 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
138 #define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
139 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
140 vrf_name = argv[idx_vrf + 1]->arg; \
141 all_vrf = strmatch(vrf_name, "all"); \
144 static int ospf_router_cmd_parse(struct vty
*vty
, struct cmd_token
*argv
[],
145 const int argc
, unsigned short *instance
,
146 const char **vrf_name
)
148 int idx_vrf
= 0, idx_inst
= 0;
151 if (argv_find(argv
, argc
, "(1-65535)", &idx_inst
)) {
152 if (ospf_instance
== 0) {
154 "%% OSPF is not running in instance mode\n");
155 return CMD_WARNING_CONFIG_FAILED
;
158 *instance
= strtoul(argv
[idx_inst
]->arg
, NULL
, 10);
161 *vrf_name
= VRF_DEFAULT_NAME
;
162 if (argv_find(argv
, argc
, "vrf", &idx_vrf
)) {
163 if (ospf_instance
!= 0) {
165 "%% VRF is not supported in instance mode\n");
166 return CMD_WARNING_CONFIG_FAILED
;
169 *vrf_name
= argv
[idx_vrf
+ 1]->arg
;
175 static void ospf_show_vrf_name(struct ospf
*ospf
, struct vty
*vty
,
176 json_object
*json
, uint8_t use_vrf
)
180 json_object_string_add(json
, "vrfName",
181 ospf_get_name(ospf
));
182 json_object_int_add(json
, "vrfId", ospf
->vrf_id
);
184 vty_out(vty
, "VRF Name: %s\n", ospf_get_name(ospf
));
188 #include "ospfd/ospf_vty_clippy.c"
190 DEFUN_NOSH (router_ospf
,
192 "router ospf [{(1-65535)|vrf NAME}]",
193 "Enable a routing process\n"
194 "Start OSPF configuration\n"
198 unsigned short instance
;
199 const char *vrf_name
;
200 bool created
= false;
204 ret
= ospf_router_cmd_parse(vty
, argv
, argc
, &instance
, &vrf_name
);
205 if (ret
!= CMD_SUCCESS
)
208 if (instance
!= ospf_instance
) {
209 VTY_PUSH_CONTEXT_NULL(OSPF_NODE
);
210 return CMD_NOT_MY_INSTANCE
;
213 ospf
= ospf_get(instance
, vrf_name
, &created
);
216 if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
217 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
219 if (IS_DEBUG_OSPF_EVENT
)
221 "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
222 ospf
->instance
, ospf_get_name(ospf
), ospf
->vrf_id
,
225 VTY_PUSH_CONTEXT(OSPF_NODE
, ospf
);
230 DEFUN (no_router_ospf
,
232 "no router ospf [{(1-65535)|vrf NAME}]",
234 "Enable a routing process\n"
235 "Start OSPF configuration\n"
239 unsigned short instance
;
240 const char *vrf_name
;
244 ret
= ospf_router_cmd_parse(vty
, argv
, argc
, &instance
, &vrf_name
);
245 if (ret
!= CMD_SUCCESS
)
248 if (instance
!= ospf_instance
)
249 return CMD_NOT_MY_INSTANCE
;
251 ospf
= ospf_lookup(instance
, vrf_name
);
255 ret
= CMD_WARNING_CONFIG_FAILED
;
261 DEFPY (ospf_router_id
,
263 "ospf router-id A.B.C.D",
264 "OSPF specific commands\n"
265 "router-id for the OSPF process\n"
266 "OSPF router-id in IP address format\n")
268 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
270 struct listnode
*node
;
271 struct ospf_area
*area
;
273 ospf
->router_id_static
= router_id
;
275 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
276 if (area
->full_nbrs
) {
278 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
282 ospf_router_id_update(ospf
);
287 DEFUN_HIDDEN (ospf_router_id_old
,
288 ospf_router_id_old_cmd
,
290 "router-id for the OSPF process\n"
291 "OSPF router-id in IP address format\n")
293 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
295 struct listnode
*node
;
296 struct ospf_area
*area
;
297 struct in_addr router_id
;
300 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &router_id
);
302 vty_out(vty
, "Please specify Router ID by A.B.C.D\n");
303 return CMD_WARNING_CONFIG_FAILED
;
306 ospf
->router_id_static
= router_id
;
308 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
309 if (area
->full_nbrs
) {
311 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
315 ospf_router_id_update(ospf
);
320 DEFPY (no_ospf_router_id
,
321 no_ospf_router_id_cmd
,
322 "no ospf router-id [A.B.C.D]",
324 "OSPF specific commands\n"
325 "router-id for the OSPF process\n"
326 "OSPF router-id in IP address format\n")
328 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
329 struct listnode
*node
;
330 struct ospf_area
*area
;
333 if (!IPV4_ADDR_SAME(&ospf
->router_id_static
, &router_id
)) {
334 vty_out(vty
, "%% OSPF router-id doesn't match\n");
335 return CMD_WARNING_CONFIG_FAILED
;
339 ospf
->router_id_static
.s_addr
= 0;
341 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
342 if (area
->full_nbrs
) {
344 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
348 ospf_router_id_update(ospf
);
354 static void ospf_passive_interface_default_update(struct ospf
*ospf
,
358 struct ospf_interface
*oi
;
360 ospf
->passive_interface_default
= newval
;
362 /* update multicast memberships */
363 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, ln
, oi
))
364 ospf_if_set_multicast(oi
);
367 static void ospf_passive_interface_update(struct interface
*ifp
,
368 struct ospf_if_params
*params
,
369 struct in_addr addr
, uint8_t newval
)
371 struct route_node
*rn
;
373 if (OSPF_IF_PARAM_CONFIGURED(params
, passive_interface
)) {
374 if (params
->passive_interface
== newval
)
377 params
->passive_interface
= newval
;
378 UNSET_IF_PARAM(params
, passive_interface
);
379 if (params
!= IF_DEF_PARAMS(ifp
)) {
380 ospf_free_if_params(ifp
, addr
);
381 ospf_if_update_params(ifp
, addr
);
384 params
->passive_interface
= newval
;
385 SET_IF_PARAM(params
, passive_interface
);
389 * XXX We should call ospf_if_set_multicast on exactly those
390 * interfaces for which the passive property changed. It is too much
391 * work to determine this set, so we do this for every interface.
392 * This is safe and reasonable because ospf_if_set_multicast uses a
393 * record of joined groups to avoid systems calls if the desired
394 * memberships match the current memership.
397 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
398 struct ospf_interface
*oi
= rn
->info
;
401 ospf_if_set_multicast(oi
);
405 * XXX It is not clear what state transitions the interface needs to
406 * undergo when going from active to passive and vice versa. Fixing
407 * this will require precise identification of interfaces having such a
412 DEFUN (ospf_passive_interface_default
,
413 ospf_passive_interface_default_cmd
,
414 "passive-interface default",
415 "Suppress routing updates on an interface\n"
416 "Suppress routing updates on interfaces by default\n")
418 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
420 ospf_passive_interface_default_update(ospf
, OSPF_IF_PASSIVE
);
425 DEFUN_HIDDEN (ospf_passive_interface_addr
,
426 ospf_passive_interface_addr_cmd
,
427 "passive-interface IFNAME [A.B.C.D]",
428 "Suppress routing updates on an interface\n"
432 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
434 struct interface
*ifp
= NULL
;
435 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
436 struct ospf_if_params
*params
;
440 "This command is deprecated, because it is not VRF-aware.\n");
442 "Please, use \"ip ospf passive\" on an interface instead.\n");
444 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
445 ifp
= if_get_by_name(argv
[1]->arg
, ospf
->vrf_id
, ospf
->name
);
448 vty_out(vty
, "interface %s not found.\n", (char *)argv
[1]->arg
);
449 return CMD_WARNING_CONFIG_FAILED
;
453 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
456 "Please specify interface address by A.B.C.D\n");
457 return CMD_WARNING_CONFIG_FAILED
;
460 params
= ospf_get_if_params(ifp
, addr
);
461 ospf_if_update_params(ifp
, addr
);
463 params
= IF_DEF_PARAMS(ifp
);
466 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_PASSIVE
);
471 DEFUN (no_ospf_passive_interface_default
,
472 no_ospf_passive_interface_default_cmd
,
473 "no passive-interface default",
475 "Allow routing updates on an interface\n"
476 "Allow routing updates on interfaces by default\n")
478 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
480 ospf_passive_interface_default_update(ospf
, OSPF_IF_ACTIVE
);
485 DEFUN_HIDDEN (no_ospf_passive_interface
,
486 no_ospf_passive_interface_addr_cmd
,
487 "no passive-interface IFNAME [A.B.C.D]",
489 "Allow routing updates on an interface\n"
493 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
495 struct interface
*ifp
= NULL
;
496 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
497 struct ospf_if_params
*params
;
501 "This command is deprecated, because it is not VRF-aware.\n");
503 "Please, use \"no ip ospf passive\" on an interface instead.\n");
505 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
506 ifp
= if_get_by_name(argv
[2]->arg
, ospf
->vrf_id
, ospf
->name
);
509 vty_out(vty
, "interface %s not found.\n", (char *)argv
[2]->arg
);
510 return CMD_WARNING_CONFIG_FAILED
;
514 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
517 "Please specify interface address by A.B.C.D\n");
518 return CMD_WARNING_CONFIG_FAILED
;
520 params
= ospf_lookup_if_params(ifp
, addr
);
524 params
= IF_DEF_PARAMS(ifp
);
527 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_ACTIVE
);
533 DEFUN (ospf_network_area
,
534 ospf_network_area_cmd
,
535 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
536 "Enable routing on an IP network\n"
537 "OSPF network prefix\n"
538 "Set the OSPF area ID\n"
539 "OSPF area ID in IP address format\n"
540 "OSPF area ID as a decimal value\n")
542 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
543 int idx_ipv4_prefixlen
= 1;
544 int idx_ipv4_number
= 3;
545 struct prefix_ipv4 p
;
546 struct in_addr area_id
;
550 if (ospf
->instance
) {
552 "The network command is not supported in multi-instance ospf\n");
553 return CMD_WARNING_CONFIG_FAILED
;
556 count
= ospf_count_area_params(ospf
);
559 "Please remove all ip ospf area x.x.x.x commands first.\n");
560 if (IS_DEBUG_OSPF_EVENT
)
562 "%s ospf vrf %s num of %u ip ospf area x config",
563 __func__
, ospf_get_name(ospf
), count
);
564 return CMD_WARNING_CONFIG_FAILED
;
567 /* Get network prefix and Area ID. */
568 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
569 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
571 ret
= ospf_network_set(ospf
, &p
, area_id
, format
);
573 vty_out(vty
, "There is already same network statement.\n");
574 return CMD_WARNING_CONFIG_FAILED
;
580 DEFUN (no_ospf_network_area
,
581 no_ospf_network_area_cmd
,
582 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
584 "Enable routing on an IP network\n"
585 "OSPF network prefix\n"
586 "Set the OSPF area ID\n"
587 "OSPF area ID in IP address format\n"
588 "OSPF area ID as a decimal value\n")
590 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
591 int idx_ipv4_prefixlen
= 2;
592 int idx_ipv4_number
= 4;
593 struct prefix_ipv4 p
;
594 struct in_addr area_id
;
597 if (ospf
->instance
) {
599 "The network command is not supported in multi-instance ospf\n");
600 return CMD_WARNING_CONFIG_FAILED
;
603 /* Get network prefix and Area ID. */
604 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
605 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
607 ret
= ospf_network_unset(ospf
, &p
, area_id
);
610 "Can't find specified network area configuration.\n");
611 return CMD_WARNING_CONFIG_FAILED
;
617 DEFUN (ospf_area_range
,
619 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
620 "OSPF area parameters\n"
621 "OSPF area ID in IP address format\n"
622 "OSPF area ID as a decimal value\n"
623 "Summarize routes matching address/mask (border routers only)\n"
624 "Area range prefix\n"
625 "Advertise this range (default)\n"
626 "User specified metric for this range\n"
627 "Advertised metric for this range\n")
629 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
630 int idx_ipv4_number
= 1;
631 int idx_ipv4_prefixlen
= 3;
633 struct prefix_ipv4 p
;
634 struct in_addr area_id
;
638 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
639 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
641 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
642 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
645 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
646 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
652 DEFUN (ospf_area_range_cost
,
653 ospf_area_range_cost_cmd
,
654 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M {cost (0-16777215)|substitute A.B.C.D/M}",
655 "OSPF area parameters\n"
656 "OSPF area ID in IP address format\n"
657 "OSPF area ID as a decimal value\n"
658 "Summarize routes matching address/mask (border routers only)\n"
659 "Area range prefix\n"
660 "User specified metric for this range\n"
661 "Advertised metric for this range\n"
662 "Announce area range as another prefix\n"
663 "Network prefix to be announced instead of range\n")
665 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
666 int idx_ipv4_number
= 1;
667 int idx_ipv4_prefixlen
= 3;
669 struct prefix_ipv4 p
, s
;
670 struct in_addr area_id
;
674 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
675 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
677 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
678 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
681 if (argv_find(argv
, argc
, "cost", &idx
)) {
682 cost
= strtoul(argv
[idx
+ 1]->arg
, NULL
, 10);
683 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
687 if (argv_find(argv
, argc
, "substitute", &idx
)) {
688 str2prefix_ipv4(argv
[idx
+ 1]->arg
, &s
);
689 ospf_area_range_substitute_set(ospf
, area_id
, &p
, &s
);
695 DEFUN (ospf_area_range_not_advertise
,
696 ospf_area_range_not_advertise_cmd
,
697 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
698 "OSPF area parameters\n"
699 "OSPF area ID in IP address format\n"
700 "OSPF area ID as a decimal value\n"
701 "Summarize routes matching address/mask (border routers only)\n"
702 "Area range prefix\n"
703 "DoNotAdvertise this range\n")
705 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
706 int idx_ipv4_number
= 1;
707 int idx_ipv4_prefixlen
= 3;
708 struct prefix_ipv4 p
;
709 struct in_addr area_id
;
712 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
713 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
715 ospf_area_range_set(ospf
, area_id
, &p
, 0);
716 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
718 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
723 DEFUN (no_ospf_area_range
,
724 no_ospf_area_range_cmd
,
725 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
727 "OSPF area parameters\n"
728 "OSPF area ID in IP address format\n"
729 "OSPF area ID as a decimal value\n"
730 "Summarize routes matching address/mask (border routers only)\n"
731 "Area range prefix\n"
732 "User specified metric for this range\n"
733 "Advertised metric for this range\n"
734 "Advertise this range (default)\n"
735 "User specified metric for this range\n"
736 "Advertised metric for this range\n"
737 "DoNotAdvertise this range\n")
739 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
740 int idx_ipv4_number
= 2;
741 int idx_ipv4_prefixlen
= 4;
742 struct prefix_ipv4 p
;
743 struct in_addr area_id
;
746 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
747 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
749 ospf_area_range_unset(ospf
, area_id
, &p
);
754 DEFUN (no_ospf_area_range_substitute
,
755 no_ospf_area_range_substitute_cmd
,
756 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
758 "OSPF area parameters\n"
759 "OSPF area ID in IP address format\n"
760 "OSPF area ID as a decimal value\n"
761 "Summarize routes matching address/mask (border routers only)\n"
762 "Area range prefix\n"
763 "Announce area range as another prefix\n"
764 "Network prefix to be announced instead of range\n")
766 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
767 int idx_ipv4_number
= 2;
768 int idx_ipv4_prefixlen
= 4;
769 int idx_ipv4_prefixlen_2
= 6;
770 struct prefix_ipv4 p
, s
;
771 struct in_addr area_id
;
774 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
775 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
776 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
778 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
784 /* Command Handler Logic in VLink stuff is delicate!!
786 ALTER AT YOUR OWN RISK!!!!
788 Various dummy values are used to represent 'NoChange' state for
789 VLink configuration NOT being changed by a VLink command, and
790 special syntax is used within the command strings so that the
791 typed in command verbs can be seen in the configuration command
792 bacckend handler. This is to drastically reduce the verbeage
793 required to coe up with a reasonably compatible Cisco VLink command
795 - Matthew Grant <grantma@anathoth.gen.nz>
796 Wed, 21 Feb 2001 15:13:52 +1300
799 /* Configuration data for virtual links
801 struct ospf_vl_config_data
{
802 struct vty
*vty
; /* vty stuff */
803 struct in_addr area_id
; /* area ID from command line */
804 int area_id_fmt
; /* command line area ID format */
805 struct in_addr vl_peer
; /* command line vl_peer */
806 int auth_type
; /* Authehntication type, if given */
807 char *auth_key
; /* simple password if present */
808 int crypto_key_id
; /* Cryptographic key ID */
809 char *md5_key
; /* MD5 authentication key */
810 int hello_interval
; /* Obvious what these are... */
811 int retransmit_interval
;
816 static void ospf_vl_config_data_init(struct ospf_vl_config_data
*vl_config
,
819 memset(vl_config
, 0, sizeof(struct ospf_vl_config_data
));
820 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
821 vl_config
->vty
= vty
;
824 static struct ospf_vl_data
*
825 ospf_find_vl_data(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
827 struct ospf_area
*area
;
828 struct ospf_vl_data
*vl_data
;
830 struct in_addr area_id
;
832 vty
= vl_config
->vty
;
833 area_id
= vl_config
->area_id
;
835 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
) {
837 "Configuring VLs over the backbone is not allowed\n");
840 area
= ospf_area_get(ospf
, area_id
);
841 ospf_area_display_format_set(ospf
, area
, vl_config
->area_id_fmt
);
843 if (area
->external_routing
!= OSPF_AREA_DEFAULT
) {
844 if (vl_config
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
845 vty_out(vty
, "Area %pI4 is %s\n", &area_id
,
846 area
->external_routing
== OSPF_AREA_NSSA
850 vty_out(vty
, "Area %ld is %s\n",
851 (unsigned long)ntohl(area_id
.s_addr
),
852 area
->external_routing
== OSPF_AREA_NSSA
858 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
->vl_peer
))
860 vl_data
= ospf_vl_data_new(area
, vl_config
->vl_peer
);
861 if (vl_data
->vl_oi
== NULL
) {
862 vl_data
->vl_oi
= ospf_vl_new(ospf
, vl_data
);
863 ospf_vl_add(ospf
, vl_data
);
864 ospf_spf_calculate_schedule(ospf
,
865 SPF_FLAG_CONFIG_CHANGE
);
872 static int ospf_vl_set_security(struct ospf_vl_data
*vl_data
,
873 struct ospf_vl_config_data
*vl_config
)
875 struct crypt_key
*ck
;
877 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
879 vty
= vl_config
->vty
;
881 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
) {
882 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), auth_type
);
883 IF_DEF_PARAMS(ifp
)->auth_type
= vl_config
->auth_type
;
886 if (vl_config
->auth_key
) {
887 memset(IF_DEF_PARAMS(ifp
)->auth_simple
, 0,
888 OSPF_AUTH_SIMPLE_SIZE
+ 1);
889 strlcpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
891 sizeof(IF_DEF_PARAMS(ifp
)->auth_simple
));
892 } else if (vl_config
->md5_key
) {
893 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
894 vl_config
->crypto_key_id
)
896 vty_out(vty
, "OSPF: Key %d already exists\n",
897 vl_config
->crypto_key_id
);
900 ck
= ospf_crypt_key_new();
901 ck
->key_id
= vl_config
->crypto_key_id
;
902 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
903 strlcpy((char *)ck
->auth_key
, vl_config
->md5_key
,
904 sizeof(ck
->auth_key
));
906 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
907 } else if (vl_config
->crypto_key_id
!= 0) {
910 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
911 vl_config
->crypto_key_id
)
913 vty_out(vty
, "OSPF: Key %d does not exist\n",
914 vl_config
->crypto_key_id
);
915 return CMD_WARNING_CONFIG_FAILED
;
918 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
919 vl_config
->crypto_key_id
);
925 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
926 struct ospf_vl_config_data
*vl_config
)
928 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
929 /* Virtual Link data initialised to defaults, so only set
931 if (vl_config
->hello_interval
) {
932 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
933 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
936 if (vl_config
->dead_interval
) {
937 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
938 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
941 if (vl_config
->retransmit_interval
) {
942 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
943 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
944 vl_config
->retransmit_interval
;
947 if (vl_config
->transmit_delay
) {
948 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
949 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
956 /* The business end of all of the above */
957 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
959 struct ospf_vl_data
*vl_data
;
962 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
964 return CMD_WARNING_CONFIG_FAILED
;
966 /* Process this one first as it can have a fatal result, which can
967 only logically occur if the virtual link exists already
968 Thus a command error does not result in a change to the
969 running configuration such as unexpectedly altered timer
971 ret
= ospf_vl_set_security(vl_data
, vl_config
);
972 if (ret
!= CMD_SUCCESS
)
975 /* Set any time based parameters, these area already range checked */
977 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
978 if (ret
!= CMD_SUCCESS
)
984 /* This stuff exists to make specifying all the alias commands A LOT simpler
986 #define VLINK_HELPSTR_IPADDR \
987 "OSPF area parameters\n" \
988 "OSPF area ID in IP address format\n" \
989 "OSPF area ID as a decimal value\n" \
990 "Configure a virtual link\n" \
991 "Router ID of the remote ABR\n"
993 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
994 "Enable authentication on this virtual link\n" \
997 #define VLINK_HELPSTR_AUTHTYPE_ALL \
998 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
999 "Use null authentication\n" \
1000 "Use message-digest authentication\n"
1002 #define VLINK_HELPSTR_TIME_PARAM \
1003 "Time between HELLO packets\n" \
1005 "Time between retransmitting lost link state advertisements\n" \
1007 "Link state transmit delay\n" \
1009 "Interval time after which a neighbor is declared down\n" \
1012 #define VLINK_HELPSTR_AUTH_SIMPLE \
1013 "Authentication password (key)\n" \
1014 "The OSPF password (key)\n"
1016 #define VLINK_HELPSTR_AUTH_MD5 \
1017 "Message digest authentication password (key)\n" \
1019 "Use MD5 algorithm\n" \
1020 "The OSPF password (key)\n"
1022 DEFUN (ospf_area_vlink
,
1023 ospf_area_vlink_cmd
,
1024 "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>]",
1025 VLINK_HELPSTR_IPADDR
1026 "Enable authentication on this virtual link\n"
1027 "Use message-digest authentication\n"
1028 "Use null authentication\n"
1029 VLINK_HELPSTR_AUTH_MD5
1030 VLINK_HELPSTR_AUTH_SIMPLE
)
1032 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1033 int idx_ipv4_number
= 1;
1035 struct ospf_vl_config_data vl_config
;
1036 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1037 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1041 ospf_vl_config_data_init(&vl_config
, vty
);
1043 /* Read off first 2 parameters and check them */
1044 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1045 &vl_config
.area_id_fmt
);
1047 vty_out(vty
, "OSPF area ID is invalid\n");
1048 return CMD_WARNING_CONFIG_FAILED
;
1051 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1053 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1054 return CMD_WARNING_CONFIG_FAILED
;
1058 /* Thats all folks! - BUGS B. strikes again!!!*/
1060 return ospf_vl_set(ospf
, &vl_config
);
1063 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1064 /* authentication - this option can only occur
1065 at start of command line */
1066 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1069 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1070 /* authentication message-digest */
1071 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1072 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1073 /* "authentication null" */
1074 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1077 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1078 vl_config
.md5_key
= NULL
;
1079 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1080 if (vl_config
.crypto_key_id
< 0)
1081 return CMD_WARNING_CONFIG_FAILED
;
1083 strlcpy(md5_key
, argv
[idx
+ 3]->arg
, sizeof(md5_key
));
1084 vl_config
.md5_key
= md5_key
;
1087 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1088 strlcpy(auth_key
, argv
[idx
+ 1]->arg
, sizeof(auth_key
));
1089 vl_config
.auth_key
= auth_key
;
1092 /* Action configuration */
1094 return ospf_vl_set(ospf
, &vl_config
);
1097 DEFUN (no_ospf_area_vlink
,
1098 no_ospf_area_vlink_cmd
,
1099 "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>]",
1101 VLINK_HELPSTR_IPADDR
1102 "Enable authentication on this virtual link\n"
1103 "Use message-digest authentication\n"
1104 "Use null authentication\n"
1105 VLINK_HELPSTR_AUTH_MD5
1106 VLINK_HELPSTR_AUTH_SIMPLE
)
1108 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1109 int idx_ipv4_number
= 2;
1111 struct ospf_area
*area
;
1112 struct ospf_vl_config_data vl_config
;
1113 struct ospf_vl_data
*vl_data
= NULL
;
1114 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1118 ospf_vl_config_data_init(&vl_config
, vty
);
1120 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1123 vty_out(vty
, "OSPF area ID is invalid\n");
1124 return CMD_WARNING_CONFIG_FAILED
;
1127 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1129 vty_out(vty
, "Area does not exist\n");
1130 return CMD_WARNING_CONFIG_FAILED
;
1133 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1135 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1136 return CMD_WARNING_CONFIG_FAILED
;
1139 vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
);
1141 vty_out(vty
, "Virtual link does not exist\n");
1142 return CMD_WARNING_CONFIG_FAILED
;
1146 /* Basic VLink no command */
1147 /* Thats all folks! - BUGS B. strikes again!!!*/
1148 ospf_vl_delete(ospf
, vl_data
);
1149 ospf_area_check_free(ospf
, vl_config
.area_id
);
1153 /* If we are down here, we are reseting parameters */
1154 /* Deal with other parameters */
1156 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1157 /* authentication - this option can only occur
1158 at start of command line */
1159 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1162 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1163 vl_config
.md5_key
= NULL
;
1164 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1165 if (vl_config
.crypto_key_id
< 0)
1166 return CMD_WARNING_CONFIG_FAILED
;
1169 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1170 /* Reset authentication-key to 0 */
1171 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1172 vl_config
.auth_key
= auth_key
;
1175 /* Action configuration */
1177 return ospf_vl_set(ospf
, &vl_config
);
1180 DEFUN (ospf_area_vlink_intervals
,
1181 ospf_area_vlink_intervals_cmd
,
1182 "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)}",
1183 VLINK_HELPSTR_IPADDR
1184 VLINK_HELPSTR_TIME_PARAM
)
1186 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1187 struct ospf_vl_config_data vl_config
;
1190 ospf_vl_config_data_init(&vl_config
, vty
);
1192 char *area_id
= argv
[1]->arg
;
1193 char *router_id
= argv
[3]->arg
;
1195 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1197 vty_out(vty
, "OSPF area ID is invalid\n");
1198 return CMD_WARNING_CONFIG_FAILED
;
1201 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1203 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1204 return CMD_WARNING_CONFIG_FAILED
;
1207 for (int idx
= 4; idx
< argc
; idx
++) {
1208 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1209 vl_config
.hello_interval
=
1210 strtol(argv
[++idx
]->arg
, NULL
, 10);
1211 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1212 vl_config
.retransmit_interval
=
1213 strtol(argv
[++idx
]->arg
, NULL
, 10);
1214 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1215 vl_config
.transmit_delay
=
1216 strtol(argv
[++idx
]->arg
, NULL
, 10);
1217 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1218 vl_config
.dead_interval
=
1219 strtol(argv
[++idx
]->arg
, NULL
, 10);
1222 /* Action configuration */
1223 return ospf_vl_set(ospf
, &vl_config
);
1226 DEFUN (no_ospf_area_vlink_intervals
,
1227 no_ospf_area_vlink_intervals_cmd
,
1228 "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)}",
1230 VLINK_HELPSTR_IPADDR
1231 VLINK_HELPSTR_TIME_PARAM
)
1233 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1234 struct ospf_vl_config_data vl_config
;
1237 ospf_vl_config_data_init(&vl_config
, vty
);
1239 char *area_id
= argv
[2]->arg
;
1240 char *router_id
= argv
[4]->arg
;
1242 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1244 vty_out(vty
, "OSPF area ID is invalid\n");
1245 return CMD_WARNING_CONFIG_FAILED
;
1248 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1250 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1251 return CMD_WARNING_CONFIG_FAILED
;
1254 for (int idx
= 5; idx
< argc
; idx
++) {
1255 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1256 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1257 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1258 vl_config
.retransmit_interval
=
1259 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1260 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1261 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1262 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1263 vl_config
.dead_interval
=
1264 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1267 /* Action configuration */
1268 return ospf_vl_set(ospf
, &vl_config
);
1271 DEFUN (ospf_area_shortcut
,
1272 ospf_area_shortcut_cmd
,
1273 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1274 "OSPF area parameters\n"
1275 "OSPF area ID in IP address format\n"
1276 "OSPF area ID as a decimal value\n"
1277 "Configure the area's shortcutting mode\n"
1278 "Set default shortcutting behavior\n"
1279 "Enable shortcutting through the area\n"
1280 "Disable shortcutting through the area\n")
1282 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1283 int idx_ipv4_number
= 1;
1284 int idx_enable_disable
= 3;
1285 struct ospf_area
*area
;
1286 struct in_addr area_id
;
1290 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1291 argv
[idx_ipv4_number
]->arg
);
1293 area
= ospf_area_get(ospf
, area_id
);
1294 ospf_area_display_format_set(ospf
, area
, format
);
1296 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1297 mode
= OSPF_SHORTCUT_DEFAULT
;
1298 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1299 mode
= OSPF_SHORTCUT_DISABLE
;
1300 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1301 mode
= OSPF_SHORTCUT_ENABLE
;
1303 return CMD_WARNING_CONFIG_FAILED
;
1305 ospf_area_shortcut_set(ospf
, area
, mode
);
1307 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1309 "Shortcut area setting will take effect only when the router is configured as Shortcut ABR\n");
1314 DEFUN (no_ospf_area_shortcut
,
1315 no_ospf_area_shortcut_cmd
,
1316 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1318 "OSPF area parameters\n"
1319 "OSPF area ID in IP address format\n"
1320 "OSPF area ID as a decimal value\n"
1321 "Deconfigure the area's shortcutting mode\n"
1322 "Deconfigure enabled shortcutting through the area\n"
1323 "Deconfigure disabled shortcutting through the area\n")
1325 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1326 int idx_ipv4_number
= 2;
1327 struct ospf_area
*area
;
1328 struct in_addr area_id
;
1331 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1332 argv
[idx_ipv4_number
]->arg
);
1334 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1338 ospf_area_shortcut_unset(ospf
, area
);
1344 DEFUN (ospf_area_stub
,
1346 "area <A.B.C.D|(0-4294967295)> stub",
1347 "OSPF area parameters\n"
1348 "OSPF area ID in IP address format\n"
1349 "OSPF area ID as a decimal value\n"
1350 "Configure OSPF area as stub\n")
1352 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1353 int idx_ipv4_number
= 1;
1354 struct in_addr area_id
;
1357 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1358 argv
[idx_ipv4_number
]->arg
);
1360 ret
= ospf_area_stub_set(ospf
, area_id
);
1361 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1365 "First deconfigure all virtual link through this area\n");
1366 return CMD_WARNING_CONFIG_FAILED
;
1369 /* Flush the external LSAs from the specified area */
1370 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_EXTERNAL_LSA
);
1371 ospf_area_no_summary_unset(ospf
, area_id
);
1376 DEFUN (ospf_area_stub_no_summary
,
1377 ospf_area_stub_no_summary_cmd
,
1378 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1379 "OSPF stub parameters\n"
1380 "OSPF area ID in IP address format\n"
1381 "OSPF area ID as a decimal value\n"
1382 "Configure OSPF area as stub\n"
1383 "Do not inject inter-area routes into stub\n")
1385 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1386 int idx_ipv4_number
= 1;
1387 struct in_addr area_id
;
1390 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1391 argv
[idx_ipv4_number
]->arg
);
1393 ret
= ospf_area_stub_set(ospf
, area_id
);
1394 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1398 "%% Area cannot be stub as it contains a virtual link\n");
1399 return CMD_WARNING_CONFIG_FAILED
;
1402 ospf_area_no_summary_set(ospf
, area_id
);
1407 DEFUN (no_ospf_area_stub
,
1408 no_ospf_area_stub_cmd
,
1409 "no area <A.B.C.D|(0-4294967295)> stub",
1411 "OSPF area parameters\n"
1412 "OSPF area ID in IP address format\n"
1413 "OSPF area ID as a decimal value\n"
1414 "Configure OSPF area as stub\n")
1416 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1417 int idx_ipv4_number
= 2;
1418 struct in_addr area_id
;
1421 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1422 argv
[idx_ipv4_number
]->arg
);
1424 ospf_area_stub_unset(ospf
, area_id
);
1425 ospf_area_no_summary_unset(ospf
, area_id
);
1430 DEFUN (no_ospf_area_stub_no_summary
,
1431 no_ospf_area_stub_no_summary_cmd
,
1432 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1434 "OSPF area parameters\n"
1435 "OSPF area ID in IP address format\n"
1436 "OSPF area ID as a decimal value\n"
1437 "Configure OSPF area as stub\n"
1438 "Do not inject inter-area routes into area\n")
1440 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1441 int idx_ipv4_number
= 2;
1442 struct in_addr area_id
;
1445 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1446 argv
[idx_ipv4_number
]->arg
);
1447 ospf_area_no_summary_unset(ospf
, area_id
);
1452 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1453 struct cmd_token
**argv
, int cfg_nosum
,
1456 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1457 struct in_addr area_id
;
1460 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1462 ret
= ospf_area_nssa_set(ospf
, area_id
);
1463 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1467 "%% Area cannot be nssa as it contains a virtual link\n");
1468 return CMD_WARNING_CONFIG_FAILED
;
1472 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1473 ospf_area_nssa_translator_role_set(
1474 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1475 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1476 ospf_area_nssa_translator_role_set(
1477 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1478 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1479 ospf_area_nssa_translator_role_set(
1480 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1482 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1483 OSPF_NSSA_ROLE_CANDIDATE
);
1488 ospf_area_no_summary_set(ospf
, area_id
);
1490 ospf_area_no_summary_unset(ospf
, area_id
);
1493 /* Flush the external LSA for the specified area */
1494 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_EXTERNAL_LSA
);
1495 ospf_schedule_abr_task(ospf
);
1496 ospf_schedule_asbr_nssa_redist_update(ospf
);
1502 DEFUN (ospf_area_nssa_translate
,
1503 ospf_area_nssa_translate_cmd
,
1504 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1505 "OSPF area parameters\n"
1506 "OSPF area ID in IP address format\n"
1507 "OSPF area ID as a decimal value\n"
1508 "Configure OSPF area as nssa\n"
1509 "Configure NSSA-ABR for translate election (default)\n"
1510 "Configure NSSA-ABR to never translate\n"
1511 "Configure NSSA-ABR to always translate\n")
1513 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1516 DEFUN (ospf_area_nssa
,
1518 "area <A.B.C.D|(0-4294967295)> nssa",
1519 "OSPF area parameters\n"
1520 "OSPF area ID in IP address format\n"
1521 "OSPF area ID as a decimal value\n"
1522 "Configure OSPF area as nssa\n")
1524 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1527 DEFUN(ospf_area_nssa_suppress_fa
, ospf_area_nssa_suppress_fa_cmd
,
1528 "area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
1529 "OSPF area parameters\n"
1530 "OSPF area ID in IP address format\n"
1531 "OSPF area ID as a decimal value\n"
1532 "Configure OSPF area as nssa\n"
1533 "Suppress forwarding address\n")
1535 int idx_ipv4_number
= 1;
1536 struct in_addr area_id
;
1539 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1540 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1541 argv
[idx_ipv4_number
]->arg
);
1543 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1545 ospf_area_nssa_suppress_fa_set(ospf
, area_id
);
1547 ospf_schedule_abr_task(ospf
);
1552 DEFUN(no_ospf_area_nssa_suppress_fa
, no_ospf_area_nssa_suppress_fa_cmd
,
1553 "no area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
1555 "OSPF area parameters\n"
1556 "OSPF area ID in IP address format\n"
1557 "OSPF area ID as a decimal value\n"
1558 "Configure OSPF area as nssa\n"
1559 "Suppress forwarding address\n")
1561 int idx_ipv4_number
= 2;
1562 struct in_addr area_id
;
1565 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1567 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1568 argv
[idx_ipv4_number
]->arg
);
1570 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1572 ospf_area_nssa_suppress_fa_unset(ospf
, area_id
);
1574 ospf_schedule_abr_task(ospf
);
1579 DEFUN (ospf_area_nssa_no_summary
,
1580 ospf_area_nssa_no_summary_cmd
,
1581 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1582 "OSPF area parameters\n"
1583 "OSPF area ID in IP address format\n"
1584 "OSPF area ID as a decimal value\n"
1585 "Configure OSPF area as nssa\n"
1586 "Do not inject inter-area routes into nssa\n")
1588 int idx_ipv4_number
= 1;
1589 struct in_addr area_id
;
1592 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1593 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1594 argv
[idx_ipv4_number
]->arg
);
1596 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1598 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1600 ospf_schedule_abr_task(ospf
);
1605 DEFUN (no_ospf_area_nssa_no_summary
,
1606 no_ospf_area_nssa_no_summary_cmd
,
1607 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1609 "OSPF area parameters\n"
1610 "OSPF area ID in IP address format\n"
1611 "OSPF area ID as a decimal value\n"
1612 "Configure OSPF area as nssa\n"
1613 "Do not inject inter-area routes into nssa\n")
1615 int idx_ipv4_number
= 2;
1616 struct in_addr area_id
;
1619 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1621 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1622 argv
[idx_ipv4_number
]->arg
);
1624 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1626 ospf_area_no_summary_unset(ospf
, area_id
);
1628 ospf_schedule_abr_task(ospf
);
1633 DEFUN (no_ospf_area_nssa
,
1634 no_ospf_area_nssa_cmd
,
1635 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1637 "OSPF area parameters\n"
1638 "OSPF area ID in IP address format\n"
1639 "OSPF area ID as a decimal value\n"
1640 "Configure OSPF area as nssa\n"
1641 "Configure NSSA-ABR for translate election (default)\n"
1642 "Configure NSSA-ABR to never translate\n"
1643 "Configure NSSA-ABR to always translate\n")
1645 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1646 int idx_ipv4_number
= 2;
1647 struct in_addr area_id
;
1650 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1651 argv
[idx_ipv4_number
]->arg
);
1653 /* Flush the NSSA LSA for the specified area */
1654 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_NSSA_LSA
);
1655 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1657 ospf_schedule_abr_task(ospf
);
1663 DEFUN (ospf_area_default_cost
,
1664 ospf_area_default_cost_cmd
,
1665 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1666 "OSPF area parameters\n"
1667 "OSPF area ID in IP address format\n"
1668 "OSPF area ID as a decimal value\n"
1669 "Set the summary-default cost of a NSSA or stub area\n"
1670 "Stub's advertised default summary cost\n")
1672 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1673 int idx_ipv4_number
= 1;
1675 struct ospf_area
*area
;
1676 struct in_addr area_id
;
1679 struct prefix_ipv4 p
;
1681 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1682 argv
[idx_ipv4_number
]->arg
);
1683 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1685 area
= ospf_area_get(ospf
, area_id
);
1686 ospf_area_display_format_set(ospf
, area
, format
);
1688 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1689 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1690 return CMD_WARNING_CONFIG_FAILED
;
1693 area
->default_cost
= cost
;
1696 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1698 if (IS_DEBUG_OSPF_EVENT
)
1700 "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4",
1702 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1707 DEFUN (no_ospf_area_default_cost
,
1708 no_ospf_area_default_cost_cmd
,
1709 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1711 "OSPF area parameters\n"
1712 "OSPF area ID in IP address format\n"
1713 "OSPF area ID as a decimal value\n"
1714 "Set the summary-default cost of a NSSA or stub area\n"
1715 "Stub's advertised default summary cost\n")
1717 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1718 int idx_ipv4_number
= 2;
1719 struct ospf_area
*area
;
1720 struct in_addr area_id
;
1722 struct prefix_ipv4 p
;
1724 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1725 argv
[idx_ipv4_number
]->arg
);
1727 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1731 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1732 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1733 return CMD_WARNING_CONFIG_FAILED
;
1736 area
->default_cost
= 1;
1739 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1741 if (IS_DEBUG_OSPF_EVENT
)
1743 "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4",
1745 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1748 ospf_area_check_free(ospf
, area_id
);
1753 DEFUN (ospf_area_export_list
,
1754 ospf_area_export_list_cmd
,
1755 "area <A.B.C.D|(0-4294967295)> export-list ACCESSLIST4_NAME",
1756 "OSPF area parameters\n"
1757 "OSPF area ID in IP address format\n"
1758 "OSPF area ID as a decimal value\n"
1759 "Set the filter for networks announced to other areas\n"
1760 "Name of the access-list\n")
1762 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1763 int idx_ipv4_number
= 1;
1764 struct ospf_area
*area
;
1765 struct in_addr area_id
;
1768 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1770 area
= ospf_area_get(ospf
, area_id
);
1771 ospf_area_display_format_set(ospf
, area
, format
);
1772 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1777 DEFUN (no_ospf_area_export_list
,
1778 no_ospf_area_export_list_cmd
,
1779 "no area <A.B.C.D|(0-4294967295)> export-list ACCESSLIST4_NAME",
1781 "OSPF area parameters\n"
1782 "OSPF area ID in IP address format\n"
1783 "OSPF area ID as a decimal value\n"
1784 "Unset the filter for networks announced to other areas\n"
1785 "Name of the access-list\n")
1787 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1788 int idx_ipv4_number
= 2;
1789 struct ospf_area
*area
;
1790 struct in_addr area_id
;
1793 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1795 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1799 ospf_area_export_list_unset(ospf
, area
);
1805 DEFUN (ospf_area_import_list
,
1806 ospf_area_import_list_cmd
,
1807 "area <A.B.C.D|(0-4294967295)> import-list ACCESSLIST4_NAME",
1808 "OSPF area parameters\n"
1809 "OSPF area ID in IP address format\n"
1810 "OSPF area ID as a decimal value\n"
1811 "Set the filter for networks from other areas announced to the specified one\n"
1812 "Name of the access-list\n")
1814 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1815 int idx_ipv4_number
= 1;
1816 struct ospf_area
*area
;
1817 struct in_addr area_id
;
1820 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1822 area
= ospf_area_get(ospf
, area_id
);
1823 ospf_area_display_format_set(ospf
, area
, format
);
1824 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1829 DEFUN (no_ospf_area_import_list
,
1830 no_ospf_area_import_list_cmd
,
1831 "no area <A.B.C.D|(0-4294967295)> import-list ACCESSLIST4_NAME",
1833 "OSPF area parameters\n"
1834 "OSPF area ID in IP address format\n"
1835 "OSPF area ID as a decimal value\n"
1836 "Unset the filter for networks announced to other areas\n"
1837 "Name of the access-list\n")
1839 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1840 int idx_ipv4_number
= 2;
1841 struct ospf_area
*area
;
1842 struct in_addr area_id
;
1845 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1847 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1851 ospf_area_import_list_unset(ospf
, area
);
1856 DEFUN (ospf_area_filter_list
,
1857 ospf_area_filter_list_cmd
,
1858 "area <A.B.C.D|(0-4294967295)> filter-list prefix PREFIXLIST_NAME <in|out>",
1859 "OSPF area parameters\n"
1860 "OSPF area ID in IP address format\n"
1861 "OSPF area ID as a decimal value\n"
1862 "Filter networks between OSPF areas\n"
1863 "Filter prefixes between OSPF areas\n"
1864 "Name of an IP prefix-list\n"
1865 "Filter networks sent to this area\n"
1866 "Filter networks sent from this area\n")
1868 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1869 int idx_ipv4_number
= 1;
1872 struct ospf_area
*area
;
1873 struct in_addr area_id
;
1874 struct prefix_list
*plist
;
1877 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1879 area
= ospf_area_get(ospf
, area_id
);
1880 ospf_area_display_format_set(ospf
, area
, format
);
1881 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1882 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1883 PREFIX_LIST_IN(area
) = plist
;
1884 if (PREFIX_NAME_IN(area
))
1885 free(PREFIX_NAME_IN(area
));
1887 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1888 ospf_schedule_abr_task(ospf
);
1890 PREFIX_LIST_OUT(area
) = plist
;
1891 if (PREFIX_NAME_OUT(area
))
1892 free(PREFIX_NAME_OUT(area
));
1894 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1895 ospf_schedule_abr_task(ospf
);
1901 DEFUN (no_ospf_area_filter_list
,
1902 no_ospf_area_filter_list_cmd
,
1903 "no area <A.B.C.D|(0-4294967295)> filter-list prefix PREFIXLIST_NAME <in|out>",
1905 "OSPF area parameters\n"
1906 "OSPF area ID in IP address format\n"
1907 "OSPF area ID as a decimal value\n"
1908 "Filter networks between OSPF areas\n"
1909 "Filter prefixes between OSPF areas\n"
1910 "Name of an IP prefix-list\n"
1911 "Filter networks sent to this area\n"
1912 "Filter networks sent from this area\n")
1914 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1915 int idx_ipv4_number
= 2;
1918 struct ospf_area
*area
;
1919 struct in_addr area_id
;
1922 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1924 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1927 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1928 if (PREFIX_NAME_IN(area
))
1929 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1933 PREFIX_LIST_IN(area
) = NULL
;
1934 if (PREFIX_NAME_IN(area
))
1935 free(PREFIX_NAME_IN(area
));
1937 PREFIX_NAME_IN(area
) = NULL
;
1939 ospf_schedule_abr_task(ospf
);
1941 if (PREFIX_NAME_OUT(area
))
1942 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1946 PREFIX_LIST_OUT(area
) = NULL
;
1947 if (PREFIX_NAME_OUT(area
))
1948 free(PREFIX_NAME_OUT(area
));
1950 PREFIX_NAME_OUT(area
) = NULL
;
1952 ospf_schedule_abr_task(ospf
);
1959 DEFUN (ospf_area_authentication_message_digest
,
1960 ospf_area_authentication_message_digest_cmd
,
1961 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1963 "OSPF area parameters\n"
1964 "OSPF area ID in IP address format\n"
1965 "OSPF area ID as a decimal value\n"
1966 "Enable authentication\n"
1967 "Use message-digest authentication\n")
1969 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1971 struct ospf_area
*area
;
1972 struct in_addr area_id
;
1975 argv_find(argv
, argc
, "area", &idx
);
1976 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
1978 area
= ospf_area_get(ospf
, area_id
);
1979 ospf_area_display_format_set(ospf
, area
, format
);
1980 area
->auth_type
= strmatch(argv
[0]->text
, "no")
1982 : OSPF_AUTH_CRYPTOGRAPHIC
;
1987 DEFUN (ospf_area_authentication
,
1988 ospf_area_authentication_cmd
,
1989 "area <A.B.C.D|(0-4294967295)> authentication",
1990 "OSPF area parameters\n"
1991 "OSPF area ID in IP address format\n"
1992 "OSPF area ID as a decimal value\n"
1993 "Enable authentication\n")
1995 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1996 int idx_ipv4_number
= 1;
1997 struct ospf_area
*area
;
1998 struct in_addr area_id
;
2001 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2003 area
= ospf_area_get(ospf
, area_id
);
2004 ospf_area_display_format_set(ospf
, area
, format
);
2005 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2010 DEFUN (no_ospf_area_authentication
,
2011 no_ospf_area_authentication_cmd
,
2012 "no area <A.B.C.D|(0-4294967295)> authentication",
2014 "OSPF area parameters\n"
2015 "OSPF area ID in IP address format\n"
2016 "OSPF area ID as a decimal value\n"
2017 "Enable authentication\n")
2019 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2020 int idx_ipv4_number
= 2;
2021 struct ospf_area
*area
;
2022 struct in_addr area_id
;
2025 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2027 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2031 area
->auth_type
= OSPF_AUTH_NULL
;
2033 ospf_area_check_free(ospf
, area_id
);
2039 DEFUN (ospf_abr_type
,
2041 "ospf abr-type <cisco|ibm|shortcut|standard>",
2042 "OSPF specific commands\n"
2043 "Set OSPF ABR type\n"
2044 "Alternative ABR, cisco implementation\n"
2045 "Alternative ABR, IBM implementation\n"
2047 "Standard behavior (RFC2328)\n")
2049 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2051 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2053 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2054 abr_type
= OSPF_ABR_CISCO
;
2055 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2056 abr_type
= OSPF_ABR_IBM
;
2057 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2058 abr_type
= OSPF_ABR_SHORTCUT
;
2059 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2060 abr_type
= OSPF_ABR_STAND
;
2062 return CMD_WARNING_CONFIG_FAILED
;
2064 /* If ABR type value is changed, schedule ABR task. */
2065 if (ospf
->abr_type
!= abr_type
) {
2066 ospf
->abr_type
= abr_type
;
2067 ospf_schedule_abr_task(ospf
);
2073 DEFUN (no_ospf_abr_type
,
2074 no_ospf_abr_type_cmd
,
2075 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2077 "OSPF specific commands\n"
2078 "Set OSPF ABR type\n"
2079 "Alternative ABR, cisco implementation\n"
2080 "Alternative ABR, IBM implementation\n"
2084 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2086 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2088 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2089 abr_type
= OSPF_ABR_CISCO
;
2090 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2091 abr_type
= OSPF_ABR_IBM
;
2092 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2093 abr_type
= OSPF_ABR_SHORTCUT
;
2094 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2095 abr_type
= OSPF_ABR_STAND
;
2097 return CMD_WARNING_CONFIG_FAILED
;
2099 /* If ABR type value is changed, schedule ABR task. */
2100 if (ospf
->abr_type
== abr_type
) {
2101 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2102 ospf_schedule_abr_task(ospf
);
2108 DEFUN (ospf_log_adjacency_changes
,
2109 ospf_log_adjacency_changes_cmd
,
2110 "log-adjacency-changes",
2111 "Log changes in adjacency state\n")
2113 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2115 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2116 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2120 DEFUN (ospf_log_adjacency_changes_detail
,
2121 ospf_log_adjacency_changes_detail_cmd
,
2122 "log-adjacency-changes detail",
2123 "Log changes in adjacency state\n"
2124 "Log all state changes\n")
2126 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2128 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2129 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2133 DEFUN (no_ospf_log_adjacency_changes
,
2134 no_ospf_log_adjacency_changes_cmd
,
2135 "no log-adjacency-changes",
2137 "Log changes in adjacency state\n")
2139 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2141 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2142 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2146 DEFUN (no_ospf_log_adjacency_changes_detail
,
2147 no_ospf_log_adjacency_changes_detail_cmd
,
2148 "no log-adjacency-changes detail",
2150 "Log changes in adjacency state\n"
2151 "Log all state changes\n")
2153 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2155 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2159 DEFUN (ospf_compatible_rfc1583
,
2160 ospf_compatible_rfc1583_cmd
,
2161 "compatible rfc1583",
2162 "OSPF compatibility list\n"
2163 "compatible with RFC 1583\n")
2165 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2167 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2168 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2169 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2174 DEFUN (no_ospf_compatible_rfc1583
,
2175 no_ospf_compatible_rfc1583_cmd
,
2176 "no compatible rfc1583",
2178 "OSPF compatibility list\n"
2179 "compatible with RFC 1583\n")
2181 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2183 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2184 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2185 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2190 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2191 "ospf rfc1583compatibility",
2192 "OSPF specific commands\n"
2193 "Enable the RFC1583Compatibility flag\n")
2195 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2196 "no ospf rfc1583compatibility", NO_STR
2197 "OSPF specific commands\n"
2198 "Disable the RFC1583Compatibility flag\n")
2200 static void ospf_table_reinstall_routes(struct ospf
*ospf
,
2201 struct route_table
*rt
)
2203 struct route_node
*rn
;
2208 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
2209 struct ospf_route
*or;
2215 if (or->type
== OSPF_DESTINATION_NETWORK
)
2216 ospf_zebra_add(ospf
, (struct prefix_ipv4
*)&rn
->p
, or);
2217 else if (or->type
== OSPF_DESTINATION_DISCARD
)
2218 ospf_zebra_add_discard(ospf
,
2219 (struct prefix_ipv4
*)&rn
->p
);
2223 static void ospf_reinstall_routes(struct ospf
*ospf
)
2225 ospf_table_reinstall_routes(ospf
, ospf
->new_table
);
2226 ospf_table_reinstall_routes(ospf
, ospf
->new_external_route
);
2229 DEFPY (ospf_send_extra_data
,
2230 ospf_send_extra_data_cmd
,
2231 "[no] ospf send-extra-data zebra",
2234 "Extra data to Zebra for display/use\n"
2237 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2239 if (no
&& CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
)) {
2240 UNSET_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
);
2241 ospf_reinstall_routes(ospf
);
2242 } else if (!CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
)) {
2243 SET_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
);
2244 ospf_reinstall_routes(ospf
);
2250 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2251 unsigned int hold
, unsigned int max
)
2253 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2255 ospf
->spf_delay
= delay
;
2256 ospf
->spf_holdtime
= hold
;
2257 ospf
->spf_max_holdtime
= max
;
2262 DEFUN (ospf_timers_min_ls_interval
,
2263 ospf_timers_min_ls_interval_cmd
,
2264 "timers throttle lsa all (0-5000)",
2265 "Adjust routing timers\n"
2266 "Throttling adaptive timer\n"
2267 "LSA delay between transmissions\n"
2269 "Delay (msec) between sending LSAs\n")
2271 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2273 unsigned int interval
;
2276 vty_out(vty
, "Insufficient arguments\n");
2277 return CMD_WARNING_CONFIG_FAILED
;
2280 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2282 ospf
->min_ls_interval
= interval
;
2287 DEFUN (no_ospf_timers_min_ls_interval
,
2288 no_ospf_timers_min_ls_interval_cmd
,
2289 "no timers throttle lsa all [(0-5000)]",
2291 "Adjust routing timers\n"
2292 "Throttling adaptive timer\n"
2293 "LSA delay between transmissions\n"
2295 "Delay (msec) between sending LSAs\n")
2297 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2298 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2303 DEFUN (ospf_timers_throttle_spf
,
2304 ospf_timers_throttle_spf_cmd
,
2305 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2306 "Adjust routing timers\n"
2307 "Throttling adaptive timer\n"
2309 "Delay (msec) from first change received till SPF calculation\n"
2310 "Initial hold time (msec) between consecutive SPF calculations\n"
2311 "Maximum hold time (msec)\n")
2314 int idx_number_2
= 4;
2315 int idx_number_3
= 5;
2316 unsigned int delay
, hold
, max
;
2319 vty_out(vty
, "Insufficient arguments\n");
2320 return CMD_WARNING_CONFIG_FAILED
;
2323 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2324 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2325 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2327 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2330 DEFUN (no_ospf_timers_throttle_spf
,
2331 no_ospf_timers_throttle_spf_cmd
,
2332 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2334 "Adjust routing timers\n"
2335 "Throttling adaptive timer\n"
2337 "Delay (msec) from first change received till SPF calculation\n"
2338 "Initial hold time (msec) between consecutive SPF calculations\n"
2339 "Maximum hold time (msec)\n")
2341 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2342 OSPF_SPF_HOLDTIME_DEFAULT
,
2343 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2347 DEFUN (ospf_timers_lsa_min_arrival
,
2348 ospf_timers_lsa_min_arrival_cmd
,
2349 "timers lsa min-arrival (0-600000)",
2350 "Adjust routing timers\n"
2352 "Minimum delay in receiving new version of a LSA\n"
2353 "Delay in milliseconds\n")
2355 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2356 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2360 DEFUN (no_ospf_timers_lsa_min_arrival
,
2361 no_ospf_timers_lsa_min_arrival_cmd
,
2362 "no timers lsa min-arrival [(0-600000)]",
2364 "Adjust routing timers\n"
2366 "Minimum delay in receiving new version of a LSA\n"
2367 "Delay in milliseconds\n")
2369 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2370 unsigned int minarrival
;
2373 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2375 if (ospf
->min_ls_arrival
!= minarrival
2376 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2380 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2385 DEFUN (ospf_neighbor
,
2387 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2389 "Neighbor IP address\n"
2390 "Neighbor Priority\n"
2392 "Dead Neighbor Polling interval\n"
2395 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2399 struct in_addr nbr_addr
;
2400 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2401 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2403 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2404 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2405 return CMD_WARNING_CONFIG_FAILED
;
2409 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2412 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2414 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2417 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2420 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2425 DEFUN (ospf_neighbor_poll_interval
,
2426 ospf_neighbor_poll_interval_cmd
,
2427 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2429 "Neighbor IP address\n"
2430 "Dead Neighbor Polling interval\n"
2432 "OSPF priority of non-broadcast neighbor\n"
2435 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2439 struct in_addr nbr_addr
;
2440 unsigned int priority
;
2441 unsigned int interval
;
2443 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2444 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2445 return CMD_WARNING_CONFIG_FAILED
;
2448 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2450 priority
= argc
> 4 ? strtoul(argv
[idx_pri
]->arg
, NULL
, 10)
2451 : OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2453 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2454 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2457 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2462 DEFUN (no_ospf_neighbor
,
2463 no_ospf_neighbor_cmd
,
2464 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2467 "Neighbor IP address\n"
2468 "Neighbor Priority\n"
2470 "Dead Neighbor Polling interval\n"
2473 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2475 struct in_addr nbr_addr
;
2477 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2478 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2479 return CMD_WARNING_CONFIG_FAILED
;
2482 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2487 DEFUN (no_ospf_neighbor_poll
,
2488 no_ospf_neighbor_poll_cmd
,
2489 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2492 "Neighbor IP address\n"
2493 "Dead Neighbor Polling interval\n"
2495 "Neighbor Priority\n"
2498 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2500 struct in_addr nbr_addr
;
2502 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2503 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2504 return CMD_WARNING_CONFIG_FAILED
;
2507 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2512 DEFUN (ospf_refresh_timer
,
2513 ospf_refresh_timer_cmd
,
2514 "refresh timer (10-1800)",
2515 "Adjust refresh parameters\n"
2516 "Set refresh timer\n"
2517 "Timer value in seconds\n")
2519 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2521 unsigned int interval
;
2523 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2524 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2525 * OSPF_LSA_REFRESHER_GRANULARITY
;
2527 ospf_timers_refresh_set(ospf
, interval
);
2532 DEFUN (no_ospf_refresh_timer
,
2533 no_ospf_refresh_timer_val_cmd
,
2534 "no refresh timer [(10-1800)]",
2536 "Adjust refresh parameters\n"
2537 "Unset refresh timer\n"
2538 "Timer value in seconds\n")
2540 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2542 unsigned int interval
;
2545 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2547 if (ospf
->lsa_refresh_interval
!= interval
2548 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2552 ospf_timers_refresh_unset(ospf
);
2558 DEFUN (ospf_auto_cost_reference_bandwidth
,
2559 ospf_auto_cost_reference_bandwidth_cmd
,
2560 "auto-cost reference-bandwidth (1-4294967)",
2561 "Calculate OSPF interface cost according to bandwidth\n"
2562 "Use reference bandwidth method to assign OSPF cost\n"
2563 "The reference bandwidth in terms of Mbits per second\n")
2565 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2566 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2569 struct interface
*ifp
;
2571 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2572 if (refbw
< 1 || refbw
> 4294967) {
2573 vty_out(vty
, "reference-bandwidth value is invalid\n");
2574 return CMD_WARNING_CONFIG_FAILED
;
2577 /* If reference bandwidth is changed. */
2578 if ((refbw
) == ospf
->ref_bandwidth
)
2581 ospf
->ref_bandwidth
= refbw
;
2582 FOR_ALL_INTERFACES (vrf
, ifp
)
2583 ospf_if_recalculate_output_cost(ifp
);
2588 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2589 no_ospf_auto_cost_reference_bandwidth_cmd
,
2590 "no auto-cost reference-bandwidth [(1-4294967)]",
2592 "Calculate OSPF interface cost according to bandwidth\n"
2593 "Use reference bandwidth method to assign OSPF cost\n"
2594 "The reference bandwidth in terms of Mbits per second\n")
2596 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2597 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2598 struct interface
*ifp
;
2600 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2603 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2604 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2606 " Please ensure reference bandwidth is consistent across all routers\n");
2608 FOR_ALL_INTERFACES (vrf
, ifp
)
2609 ospf_if_recalculate_output_cost(ifp
);
2614 DEFUN (ospf_write_multiplier
,
2615 ospf_write_multiplier_cmd
,
2616 "ospf write-multiplier (1-100)",
2617 "OSPF specific commands\n"
2618 "Write multiplier\n"
2619 "Maximum number of interface serviced per write\n")
2621 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2623 uint32_t write_oi_count
;
2630 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2631 if (write_oi_count
< 1 || write_oi_count
> 100) {
2632 vty_out(vty
, "write-multiplier value is invalid\n");
2633 return CMD_WARNING_CONFIG_FAILED
;
2636 ospf
->write_oi_count
= write_oi_count
;
2640 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2641 "Write multiplier\n"
2642 "Maximum number of interface serviced per write\n")
2644 DEFUN (no_ospf_write_multiplier
,
2645 no_ospf_write_multiplier_cmd
,
2646 "no ospf write-multiplier (1-100)",
2648 "OSPF specific commands\n"
2649 "Write multiplier\n"
2650 "Maximum number of interface serviced per write\n")
2652 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2654 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2658 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2659 "no write-multiplier (1-100)", NO_STR
2660 "Write multiplier\n"
2661 "Maximum number of interface serviced per write\n")
2663 DEFUN(ospf_ti_lfa
, ospf_ti_lfa_cmd
, "fast-reroute ti-lfa [node-protection]",
2664 "Fast Reroute for MPLS and IP resilience\n"
2665 "Topology Independent LFA (Loop-Free Alternate)\n"
2666 "TI-LFA node protection (default is link protection)\n")
2668 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2670 ospf
->ti_lfa_enabled
= true;
2673 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_NODE_PROTECTION
;
2675 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_LINK_PROTECTION
;
2677 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2682 DEFUN(no_ospf_ti_lfa
, no_ospf_ti_lfa_cmd
,
2683 "no fast-reroute ti-lfa [node-protection]",
2685 "Fast Reroute for MPLS and IP resilience\n"
2686 "Topology Independent LFA (Loop-Free Alternate)\n"
2687 "TI-LFA node protection (default is link protection)\n")
2689 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2691 ospf
->ti_lfa_enabled
= false;
2693 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_UNDEFINED_PROTECTION
;
2695 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2700 static void ospf_maxpath_set(struct vty
*vty
, struct ospf
*ospf
, uint16_t paths
)
2702 if (ospf
->max_multipath
== paths
)
2705 ospf
->max_multipath
= paths
;
2707 /* Send deletion notification to zebra to delete all
2708 * ospf specific routes and reinitiat SPF to reflect
2709 * the new max multipath.
2711 ospf_restart_spf(ospf
);
2714 /* Ospf Maximum multiple paths config support */
2715 DEFUN (ospf_max_multipath
,
2716 ospf_max_multipath_cmd
,
2717 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2718 "Max no of multiple paths for ECMP support\n"
2719 "Number of paths\n")
2721 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2725 maxpaths
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2727 ospf_maxpath_set(vty
, ospf
, maxpaths
);
2731 DEFUN (no_ospf_max_multipath
,
2732 no_ospf_max_multipath_cmd
,
2735 "Max no of multiple paths for ECMP support\n")
2737 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2738 uint16_t maxpaths
= MULTIPATH_NUM
;
2740 ospf_maxpath_set(vty
, ospf
, maxpaths
);
2744 static const char *const ospf_abr_type_descr_str
[] = {
2745 "Unknown", "Standard (RFC2328)", "Alternative IBM",
2746 "Alternative Cisco", "Alternative Shortcut"
2749 static const char *const ospf_shortcut_mode_descr_str
[] = {
2750 "Default", "Enabled", "Disabled"
2753 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2754 json_object
*json_areas
, bool use_json
)
2756 json_object
*json_area
= NULL
;
2757 char buf
[PREFIX_STRLEN
];
2760 json_area
= json_object_new_object();
2764 vty_out(vty
, " Area ID: %pI4", &area
->area_id
);
2766 /* Show Area type/mode. */
2767 if (OSPF_IS_AREA_BACKBONE(area
)) {
2769 json_object_boolean_true_add(json_area
, "backbone");
2771 vty_out(vty
, " (Backbone)\n");
2774 if (area
->external_routing
== OSPF_AREA_STUB
) {
2775 if (area
->no_summary
)
2776 json_object_boolean_true_add(
2777 json_area
, "stubNoSummary");
2778 if (area
->shortcut_configured
)
2779 json_object_boolean_true_add(
2780 json_area
, "stubShortcut");
2781 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2782 if (area
->no_summary
)
2783 json_object_boolean_true_add(
2784 json_area
, "nssaNoSummary");
2785 if (area
->shortcut_configured
)
2786 json_object_boolean_true_add(
2787 json_area
, "nssaShortcut");
2790 json_object_string_add(
2791 json_area
, "shortcuttingMode",
2792 ospf_shortcut_mode_descr_str
2793 [area
->shortcut_configured
]);
2794 if (area
->shortcut_capability
)
2795 json_object_boolean_true_add(json_area
,
2798 if (area
->external_routing
== OSPF_AREA_STUB
)
2799 vty_out(vty
, " (Stub%s%s)",
2800 area
->no_summary
? ", no summary" : "",
2801 area
->shortcut_configured
? "; " : "");
2802 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2803 vty_out(vty
, " (NSSA%s%s)",
2804 area
->no_summary
? ", no summary" : "",
2805 area
->shortcut_configured
? "; " : "");
2808 vty_out(vty
, " Shortcutting mode: %s",
2809 ospf_shortcut_mode_descr_str
2810 [area
->shortcut_configured
]);
2811 vty_out(vty
, ", S-bit consensus: %s\n",
2812 area
->shortcut_capability
? "ok" : "no");
2816 /* Show number of interfaces */
2818 json_object_int_add(json_area
, "areaIfTotalCounter",
2819 listcount(area
->oiflist
));
2820 json_object_int_add(json_area
, "areaIfActiveCounter",
2824 " Number of interfaces in this area: Total: %d, Active: %d\n",
2825 listcount(area
->oiflist
), area
->act_ints
);
2827 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2829 json_object_boolean_true_add(json_area
, "nssa");
2830 if (!IS_OSPF_ABR(area
->ospf
))
2831 json_object_boolean_false_add(json_area
, "abr");
2832 else if (area
->NSSATranslatorState
) {
2833 json_object_boolean_true_add(json_area
, "abr");
2834 if (area
->NSSATranslatorRole
2835 == OSPF_NSSA_ROLE_CANDIDATE
)
2836 json_object_boolean_true_add(
2838 "nssaTranslatorElected");
2839 else if (area
->NSSATranslatorRole
2840 == OSPF_NSSA_ROLE_ALWAYS
)
2841 json_object_boolean_true_add(
2843 "nssaTranslatorAlways");
2845 json_object_boolean_true_add(
2847 "nssaTranslatorNever");
2849 json_object_boolean_true_add(json_area
, "abr");
2850 if (area
->NSSATranslatorRole
2851 == OSPF_NSSA_ROLE_CANDIDATE
)
2852 json_object_boolean_false_add(
2854 "nssaTranslatorElected");
2856 json_object_boolean_true_add(
2858 "nssaTranslatorNever");
2862 " It is an NSSA configuration.\n Elected NSSA/ABR performs type-7/type-5 LSA translation.\n");
2863 if (!IS_OSPF_ABR(area
->ospf
))
2865 " It is not ABR, therefore not Translator.\n");
2866 else if (area
->NSSATranslatorState
) {
2867 vty_out(vty
, " We are an ABR and ");
2868 if (area
->NSSATranslatorRole
2869 == OSPF_NSSA_ROLE_CANDIDATE
)
2871 "the NSSA Elected Translator.\n");
2872 else if (area
->NSSATranslatorRole
2873 == OSPF_NSSA_ROLE_ALWAYS
)
2875 "always an NSSA Translator.\n");
2878 "never an NSSA Translator.\n");
2880 vty_out(vty
, " We are an ABR, but ");
2881 if (area
->NSSATranslatorRole
2882 == OSPF_NSSA_ROLE_CANDIDATE
)
2884 "not the NSSA Elected Translator.\n");
2887 "never an NSSA Translator.\n");
2892 /* Stub-router state for this area */
2893 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2894 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2897 json_object_boolean_true_add(
2898 json_area
, "originStubMaxDistRouterLsa");
2899 if (CHECK_FLAG(area
->stub_router_state
,
2900 OSPF_AREA_ADMIN_STUB_ROUTED
))
2901 json_object_boolean_true_add(
2902 json_area
, "indefiniteActiveAdmin");
2903 if (area
->t_stub_router
) {
2907 &area
->t_stub_router
->u
.sands
,
2910 json_object_int_add(
2912 "activeStartupRemainderMsecs",
2917 " Originating stub / maximum-distance Router-LSA\n");
2918 if (CHECK_FLAG(area
->stub_router_state
,
2919 OSPF_AREA_ADMIN_STUB_ROUTED
))
2921 " Administratively activated (indefinitely)\n");
2922 if (area
->t_stub_router
)
2924 " Active from startup, %s remaining\n",
2925 ospf_timer_dump(area
->t_stub_router
,
2932 /* Show number of fully adjacent neighbors. */
2933 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2936 /* Show authentication type. */
2937 if (area
->auth_type
== OSPF_AUTH_NULL
)
2938 json_object_string_add(json_area
, "authentication",
2939 "authenticationNone");
2940 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2941 json_object_string_add(json_area
, "authentication",
2942 "authenticationSimplePassword");
2943 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2944 json_object_string_add(json_area
, "authentication",
2945 "authenticationMessageDigest");
2947 if (!OSPF_IS_AREA_BACKBONE(area
))
2948 json_object_int_add(json_area
,
2949 "virtualAdjacenciesPassingCounter",
2952 /* Show SPF calculation times. */
2953 json_object_int_add(json_area
, "spfExecutedCounter",
2954 area
->spf_calculation
);
2955 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2956 json_object_int_add(
2957 json_area
, "lsaRouterNumber",
2958 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2959 json_object_int_add(
2960 json_area
, "lsaRouterChecksum",
2961 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2962 json_object_int_add(
2963 json_area
, "lsaNetworkNumber",
2964 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2965 json_object_int_add(
2966 json_area
, "lsaNetworkChecksum",
2967 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2968 json_object_int_add(
2969 json_area
, "lsaSummaryNumber",
2970 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2971 json_object_int_add(
2972 json_area
, "lsaSummaryChecksum",
2973 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2974 json_object_int_add(
2975 json_area
, "lsaAsbrNumber",
2976 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2977 json_object_int_add(
2978 json_area
, "lsaAsbrChecksum",
2979 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2980 json_object_int_add(
2981 json_area
, "lsaNssaNumber",
2982 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2983 json_object_int_add(
2984 json_area
, "lsaNssaChecksum",
2985 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2987 /* Show number of fully adjacent neighbors. */
2989 " Number of fully adjacent neighbors in this area: %d\n",
2992 /* Show authentication type. */
2993 vty_out(vty
, " Area has ");
2994 if (area
->auth_type
== OSPF_AUTH_NULL
)
2995 vty_out(vty
, "no authentication\n");
2996 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2997 vty_out(vty
, "simple password authentication\n");
2998 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2999 vty_out(vty
, "message digest authentication\n");
3001 if (!OSPF_IS_AREA_BACKBONE(area
))
3003 " Number of full virtual adjacencies going through this area: %d\n",
3006 /* Show SPF calculation times. */
3007 vty_out(vty
, " SPF algorithm executed %d times\n",
3008 area
->spf_calculation
);
3010 /* Show number of LSA. */
3011 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
3013 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
3014 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
3015 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
3017 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
3018 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
3019 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
3021 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
3022 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
3023 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
3025 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
3026 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
3027 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
3028 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
3029 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
3030 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
3034 json_object_int_add(
3035 json_area
, "lsaOpaqueLinkNumber",
3036 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3037 json_object_int_add(
3038 json_area
, "lsaOpaqueLinkChecksum",
3039 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3040 json_object_int_add(
3041 json_area
, "lsaOpaqueAreaNumber",
3042 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3043 json_object_int_add(
3044 json_area
, "lsaOpaqueAreaChecksum",
3045 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3048 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
3049 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
3050 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3052 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
3053 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
3054 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3058 json_object_object_add(json_areas
,
3059 inet_ntop(AF_INET
, &area
->area_id
,
3066 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
3067 json_object
*json
, uint8_t use_vrf
)
3069 struct listnode
*node
, *nnode
;
3070 struct ospf_area
*area
;
3071 struct timeval result
;
3072 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3073 json_object
*json_vrf
= NULL
;
3074 json_object
*json_areas
= NULL
;
3078 json_vrf
= json_object_new_object();
3081 json_areas
= json_object_new_object();
3084 if (ospf
->instance
) {
3086 json_object_int_add(json
, "ospfInstance",
3089 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3093 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3095 /* Show Router ID. */
3097 json_object_string_addf(json_vrf
, "routerId", "%pI4",
3100 vty_out(vty
, " OSPF Routing Process, Router ID: %pI4\n",
3104 /* Graceful shutdown */
3105 if (ospf
->t_deferred_shutdown
) {
3110 &ospf
->t_deferred_shutdown
->u
.sands
,
3113 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
3117 " Deferred shutdown in progress, %s remaining\n",
3118 ospf_timer_dump(ospf
->t_deferred_shutdown
,
3119 timebuf
, sizeof(timebuf
)));
3123 /* Show capability. */
3125 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
3126 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
3127 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
3128 json_object_boolean_true_add(json_vrf
,
3129 "rfc1583Compatibility");
3132 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3133 vty_out(vty
, " This implementation conforms to RFC2328\n");
3134 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3135 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3141 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3142 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3145 vty_out(vty
, " OpaqueCapability flag is %s\n",
3146 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3151 /* Show stub-router configuration */
3152 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3153 || ospf
->stub_router_shutdown_time
3154 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3156 json_object_boolean_true_add(json_vrf
,
3157 "stubAdvertisement");
3158 if (ospf
->stub_router_startup_time
3159 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3160 json_object_int_add(
3161 json_vrf
, "postStartEnabledSecs",
3162 ospf
->stub_router_startup_time
);
3163 if (ospf
->stub_router_shutdown_time
3164 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3165 json_object_int_add(
3166 json_vrf
, "preShutdownEnabledSecs",
3167 ospf
->stub_router_shutdown_time
);
3170 " Stub router advertisement is configured\n");
3171 if (ospf
->stub_router_startup_time
3172 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3174 " Enabled for %us after start-up\n",
3175 ospf
->stub_router_startup_time
);
3176 if (ospf
->stub_router_shutdown_time
3177 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3179 " Enabled for %us prior to full shutdown\n",
3180 ospf
->stub_router_shutdown_time
);
3184 /* Show SPF timers. */
3186 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3188 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3189 ospf
->spf_holdtime
);
3190 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3191 ospf
->spf_max_holdtime
);
3192 json_object_int_add(json_vrf
, "holdtimeMultplier",
3193 ospf
->spf_hold_multiplier
);
3196 " Initial SPF scheduling delay %d millisec(s)\n"
3197 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3198 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3199 " Hold time multiplier is currently %d\n",
3200 ospf
->spf_delay
, ospf
->spf_holdtime
,
3201 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3205 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3206 long time_store
= 0;
3209 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3210 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3213 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3214 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3215 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3218 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3220 vty_out(vty
, " SPF algorithm ");
3221 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3222 monotime_since(&ospf
->ts_spf
, &result
);
3223 vty_out(vty
, "last executed %s ago\n",
3224 ospf_timeval_dump(&result
, timebuf
,
3226 vty_out(vty
, " Last SPF duration %s\n",
3227 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3228 timebuf
, sizeof(timebuf
)));
3230 vty_out(vty
, "has not been run\n");
3234 if (ospf
->t_spf_calc
) {
3237 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3239 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3243 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3244 ospf
->min_ls_interval
);
3245 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3246 ospf
->min_ls_arrival
);
3247 /* Show write multiplier values */
3248 json_object_int_add(json_vrf
, "writeMultiplier",
3249 ospf
->write_oi_count
);
3250 /* Show refresh parameters. */
3251 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3252 ospf
->lsa_refresh_interval
* 1000);
3254 /* show max multipath */
3255 json_object_int_add(json_vrf
, "maximumPaths",
3256 ospf
->max_multipath
);
3258 /* show administrative distance */
3259 json_object_int_add(json_vrf
, "preference",
3261 ? ospf
->distance_all
3262 : ZEBRA_OSPF_DISTANCE_DEFAULT
);
3264 vty_out(vty
, " SPF timer %s%s\n",
3265 (ospf
->t_spf_calc
? "due in " : "is "),
3266 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3269 vty_out(vty
, " LSA minimum interval %d msecs\n",
3270 ospf
->min_ls_interval
);
3271 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3272 ospf
->min_ls_arrival
);
3274 /* Show write multiplier values */
3275 vty_out(vty
, " Write Multiplier set to %d \n",
3276 ospf
->write_oi_count
);
3278 /* Show refresh parameters. */
3279 vty_out(vty
, " Refresh timer %d secs\n",
3280 ospf
->lsa_refresh_interval
);
3282 /* show max multipath */
3283 vty_out(vty
, " Maximum multiple paths(ECMP) supported %d\n",
3284 ospf
->max_multipath
);
3286 /* show administrative distance */
3287 vty_out(vty
, " Administrative distance %u\n",
3288 ospf
->distance_all
? ospf
->distance_all
3289 : ZEBRA_OSPF_DISTANCE_DEFAULT
);
3292 /* Show ABR/ASBR flags. */
3293 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3295 json_object_string_add(
3296 json_vrf
, "abrType",
3297 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3300 " This router is an ABR, ABR type is: %s\n",
3301 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3303 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3305 json_object_string_add(
3306 json_vrf
, "asbrRouter",
3307 "injectingExternalRoutingInformation");
3310 " This router is an ASBR (injecting external routing information)\n");
3313 /* Show Number of AS-external-LSAs. */
3315 json_object_int_add(
3316 json_vrf
, "lsaExternalCounter",
3317 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3318 json_object_int_add(
3319 json_vrf
, "lsaExternalChecksum",
3320 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3323 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3324 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3325 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3329 json_object_int_add(
3330 json_vrf
, "lsaAsopaqueCounter",
3331 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3332 json_object_int_add(
3333 json_vrf
, "lsaAsOpaqueChecksum",
3334 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3337 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3338 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3339 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3342 /* Show number of areas attached. */
3344 json_object_int_add(json_vrf
, "attachedAreaCounter",
3345 listcount(ospf
->areas
));
3347 vty_out(vty
, " Number of areas attached to this router: %d\n",
3348 listcount(ospf
->areas
));
3350 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3351 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3353 json_object_boolean_true_add(
3354 json_vrf
, "adjacencyChangesLoggedAll");
3357 " All adjacency changes are logged\n");
3360 json_object_boolean_true_add(
3361 json_vrf
, "adjacencyChangesLogged");
3363 vty_out(vty
, " Adjacency changes are logged\n");
3367 /* show LDP-Sync status */
3368 ospf_ldp_sync_show_info(vty
, ospf
, json_vrf
, json
? 1 : 0);
3370 /* Show each area status. */
3371 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3372 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3376 json_object_object_add(json_vrf
, "areas", json_areas
);
3377 json_object_object_add(json
, ospf_get_name(ospf
),
3380 json_object_object_add(json
, "areas", json_areas
);
3388 DEFUN (show_ip_ospf
,
3390 "show ip ospf [vrf <NAME|all>] [json]",
3393 "OSPF information\n"
3399 bool uj
= use_json(argc
, argv
);
3400 struct listnode
*node
= NULL
;
3401 char *vrf_name
= NULL
;
3402 bool all_vrf
= false;
3403 int ret
= CMD_SUCCESS
;
3406 json_object
*json
= NULL
;
3407 uint8_t use_vrf
= 0;
3409 if (listcount(om
->ospf
) == 0)
3412 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3415 json
= json_object_new_object();
3417 /* vrf input is provided could be all or specific vrf*/
3419 bool ospf_output
= false;
3424 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3425 if (!ospf
->oi_running
)
3428 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3432 vty_json(vty
, json
);
3433 else if (!ospf_output
)
3434 vty_out(vty
, "%% OSPF is not enabled\n");
3437 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3438 if ((ospf
== NULL
) || !ospf
->oi_running
) {
3440 vty_json(vty
, json
);
3443 "%% OSPF is not enabled in vrf %s\n",
3449 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3450 /* Display default ospf (instance 0) info */
3451 if (ospf
== NULL
|| !ospf
->oi_running
) {
3453 vty_json(vty
, json
);
3456 "%% OSPF is not enabled in vrf default\n");
3463 show_ip_ospf_common(vty
, ospf
, json
, use_vrf
);
3465 vty_out(vty
, "%s\n",
3466 json_object_to_json_string_ext(
3467 json
, JSON_C_TO_STRING_PRETTY
));
3471 json_object_free(json
);
3476 DEFUN (show_ip_ospf_instance
,
3477 show_ip_ospf_instance_cmd
,
3478 "show ip ospf (1-65535) [json]",
3481 "OSPF information\n"
3487 unsigned short instance
= 0;
3488 bool uj
= use_json(argc
, argv
);
3489 int ret
= CMD_SUCCESS
;
3490 json_object
*json
= NULL
;
3492 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3493 if (instance
!= ospf_instance
)
3494 return CMD_NOT_MY_INSTANCE
;
3496 ospf
= ospf_lookup_instance(instance
);
3497 if (!ospf
|| !ospf
->oi_running
)
3501 json
= json_object_new_object();
3503 ret
= show_ip_ospf_common(vty
, ospf
, json
, 0);
3506 vty_json(vty
, json
);
3511 static void ospf_interface_auth_show(struct vty
*vty
, struct ospf_interface
*oi
,
3512 json_object
*json
, bool use_json
)
3516 auth_type
= OSPF_IF_PARAM(oi
, auth_type
);
3518 switch (auth_type
) {
3519 case OSPF_AUTH_NULL
:
3521 json_object_string_add(json
, "authentication",
3522 "authenticationNone");
3524 vty_out(vty
, " Authentication NULL is enabled\n");
3526 case OSPF_AUTH_SIMPLE
: {
3528 json_object_string_add(json
, "authentication",
3529 "authenticationSimplePassword");
3532 " Simple password authentication enabled\n");
3535 case OSPF_AUTH_CRYPTOGRAPHIC
: {
3536 struct crypt_key
*ckey
;
3538 if (list_isempty(OSPF_IF_PARAM(oi
, auth_crypt
)))
3541 ckey
= listgetdata(listtail(OSPF_IF_PARAM(oi
, auth_crypt
)));
3544 json_object_string_add(json
, "authentication",
3545 "authenticationMessageDigest");
3548 " Cryptographic authentication enabled\n");
3549 vty_out(vty
, " Algorithm:MD5\n");
3559 static void show_ip_ospf_interface_sub(struct vty
*vty
, struct ospf
*ospf
,
3560 struct interface
*ifp
,
3561 json_object
*json_interface_sub
,
3565 struct ospf_neighbor
*nbr
;
3566 struct route_node
*rn
;
3567 uint32_t bandwidth
= ifp
->bandwidth
? ifp
->bandwidth
: ifp
->speed
;
3569 /* Is interface up? */
3571 is_up
= if_is_operative(ifp
);
3573 json_object_boolean_true_add(json_interface_sub
,
3576 json_object_boolean_false_add(json_interface_sub
,
3579 json_object_int_add(json_interface_sub
, "ifIndex",
3581 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3582 json_object_int_add(json_interface_sub
, "bandwidthMbit",
3584 json_object_string_add(json_interface_sub
, "ifFlags",
3585 if_flag_dump(ifp
->flags
));
3587 vty_out(vty
, "%s is %s\n", ifp
->name
,
3588 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"));
3589 vty_out(vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3590 ifp
->ifindex
, ifp
->mtu
, bandwidth
,
3591 if_flag_dump(ifp
->flags
));
3594 /* Is interface OSPF enabled? */
3596 if (ospf_oi_count(ifp
) == 0) {
3597 json_object_boolean_false_add(json_interface_sub
,
3600 } else if (!is_up
) {
3601 json_object_boolean_false_add(json_interface_sub
,
3605 json_object_boolean_true_add(json_interface_sub
,
3608 if (ospf_oi_count(ifp
) == 0) {
3609 vty_out(vty
, " OSPF not enabled on this interface\n");
3611 } else if (!is_up
) {
3613 " OSPF is enabled, but not running on this interface\n");
3618 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
3619 struct ospf_interface
*oi
= rn
->info
;
3624 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)) {
3626 json_object_boolean_true_add(json_interface_sub
,
3629 vty_out(vty
, " This interface is UNNUMBERED,");
3631 struct in_addr dest
;
3634 /* Show OSPF interface information. */
3636 json_object_string_addf(
3637 json_interface_sub
, "ipAddress", "%pI4",
3638 &oi
->address
->u
.prefix4
);
3639 json_object_int_add(json_interface_sub
,
3640 "ipAddressPrefixlen",
3641 oi
->address
->prefixlen
);
3643 vty_out(vty
, " Internet Address %pFX,",
3646 /* For Vlinks, showing the peer address is
3647 * probably more informative than the local
3648 * interface that is being used */
3649 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
) {
3651 dest
= oi
->vl_data
->peer_addr
;
3652 } else if (CONNECTED_PEER(oi
->connected
)
3653 && oi
->connected
->destination
) {
3655 dest
= oi
->connected
->destination
->u
.prefix4
;
3658 dest
.s_addr
= ipv4_broadcast_addr(
3659 oi
->connected
->address
->u
.prefix4
.s_addr
,
3660 oi
->connected
->address
->prefixlen
);
3664 json_object_string_add(
3666 "ospfIfType", dstr
);
3667 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3668 json_object_string_addf(
3669 json_interface_sub
, "vlinkPeer",
3672 json_object_string_addf(
3674 "localIfUsed", "%pI4", &dest
);
3676 vty_out(vty
, " %s %pI4,", dstr
,
3680 json_object_string_add(json_interface_sub
, "area",
3681 ospf_area_desc_string(oi
->area
));
3682 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3683 json_object_boolean_true_add(
3685 "mtuMismatchDetect");
3686 json_object_string_addf(json_interface_sub
, "routerId",
3687 "%pI4", &ospf
->router_id
);
3688 json_object_string_add(json_interface_sub
,
3690 ospf_network_type_str
[oi
->type
]);
3691 json_object_int_add(json_interface_sub
, "cost",
3693 json_object_int_add(
3694 json_interface_sub
, "transmitDelaySecs",
3695 OSPF_IF_PARAM(oi
, transmit_delay
));
3696 json_object_string_add(json_interface_sub
, "state",
3697 lookup_msg(ospf_ism_state_msg
,
3699 json_object_int_add(json_interface_sub
, "priority",
3702 vty_out(vty
, " Area %s\n",
3703 ospf_area_desc_string(oi
->area
));
3705 vty_out(vty
, " MTU mismatch detection: %s\n",
3706 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled"
3710 " Router ID %pI4, Network Type %s, Cost: %d\n",
3712 ospf_network_type_str
[oi
->type
],
3716 " Transmit Delay is %d sec, State %s, Priority %d\n",
3717 OSPF_IF_PARAM(oi
, transmit_delay
),
3718 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
3722 /* Show DR information. */
3723 if (DR(oi
).s_addr
== INADDR_ANY
) {
3726 " No backup designated router on this network\n");
3728 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &DR(oi
));
3731 json_object_string_addf(
3732 json_interface_sub
, "drId",
3733 "%pI4", &nbr
->router_id
);
3734 json_object_string_addf(
3735 json_interface_sub
, "drAddress",
3737 &nbr
->address
.u
.prefix4
);
3740 " Designated Router (ID) %pI4",
3743 " Interface Address %pFX\n",
3749 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &BDR(oi
));
3753 " No backup designated router on this network\n");
3756 json_object_string_addf(
3757 json_interface_sub
, "bdrId",
3758 "%pI4", &nbr
->router_id
);
3759 json_object_string_addf(
3761 "bdrAddress", "%pI4",
3762 &nbr
->address
.u
.prefix4
);
3765 " Backup Designated Router (ID) %pI4,",
3767 vty_out(vty
, " Interface Address %pI4\n",
3768 &nbr
->address
.u
.prefix4
);
3773 /* Next network-LSA sequence number we'll use, if we're elected
3776 && ntohl(oi
->params
->network_lsa_seqnum
)
3777 != OSPF_INITIAL_SEQUENCE_NUMBER
) {
3779 json_object_int_add(
3781 "networkLsaSequence",
3782 ntohl(oi
->params
->network_lsa_seqnum
));
3785 " Saved Network-LSA sequence number 0x%x\n",
3786 ntohl(oi
->params
->network_lsa_seqnum
));
3790 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3791 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3792 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3793 json_object_boolean_true_add(
3795 "mcastMemberOspfAllRouters");
3796 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3797 json_object_boolean_true_add(
3799 "mcastMemberOspfDesignatedRouters");
3802 vty_out(vty
, " Multicast group memberships:");
3803 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3804 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3805 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3806 vty_out(vty
, " OSPFAllRouters");
3807 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3808 vty_out(vty
, " OSPFDesignatedRouters");
3810 vty_out(vty
, " <None>");
3815 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3816 json_object_int_add(
3817 json_interface_sub
, "timerMsecs",
3818 OSPF_IF_PARAM(oi
, v_hello
) * 1000);
3820 json_object_int_add(
3821 json_interface_sub
, "timerMsecs",
3822 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3823 json_object_int_add(json_interface_sub
,
3825 OSPF_IF_PARAM(oi
, v_wait
));
3826 json_object_int_add(json_interface_sub
,
3828 OSPF_IF_PARAM(oi
, v_wait
));
3829 json_object_int_add(
3830 json_interface_sub
, "timerRetransmitSecs",
3831 OSPF_IF_PARAM(oi
, retransmit_interval
));
3833 vty_out(vty
, " Timer intervals configured,");
3834 vty_out(vty
, " Hello ");
3835 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3836 vty_out(vty
, "%ds,",
3837 OSPF_IF_PARAM(oi
, v_hello
));
3839 vty_out(vty
, "%dms,",
3840 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3841 vty_out(vty
, " Dead %ds, Wait %ds, Retransmit %d\n",
3842 OSPF_IF_PARAM(oi
, v_wait
),
3843 OSPF_IF_PARAM(oi
, v_wait
),
3844 OSPF_IF_PARAM(oi
, retransmit_interval
));
3847 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_ACTIVE
) {
3848 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3850 long time_store
= 0;
3854 &oi
->t_hello
->u
.sands
,
3857 json_object_int_add(json_interface_sub
,
3858 "timerHelloInMsecs",
3861 vty_out(vty
, " Hello due in %s\n",
3862 ospf_timer_dump(oi
->t_hello
, timebuf
,
3864 } else /* passive-interface is set */
3867 json_object_boolean_true_add(
3869 "timerPassiveIface");
3872 " No Hellos (Passive interface)\n");
3876 json_object_int_add(json_interface_sub
, "nbrCount",
3877 ospf_nbr_count(oi
, 0));
3878 json_object_int_add(json_interface_sub
,
3880 ospf_nbr_count(oi
, NSM_Full
));
3883 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3884 ospf_nbr_count(oi
, 0),
3885 ospf_nbr_count(oi
, NSM_Full
));
3887 ospf_interface_bfd_show(vty
, ifp
, json_interface_sub
);
3889 /* OSPF Authentication information */
3890 ospf_interface_auth_show(vty
, oi
, json_interface_sub
, use_json
);
3894 static int show_ip_ospf_interface_common(struct vty
*vty
, struct ospf
*ospf
,
3895 char *intf_name
, uint8_t use_vrf
,
3896 json_object
*json
, bool use_json
)
3898 struct interface
*ifp
;
3899 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3900 json_object
*json_vrf
= NULL
;
3901 json_object
*json_interface_sub
= NULL
, *json_interface
= NULL
;
3905 json_vrf
= json_object_new_object();
3908 json_interface
= json_object_new_object();
3911 if (ospf
->instance
) {
3913 json_object_int_add(json
, "ospfInstance",
3916 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3919 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3921 if (intf_name
== NULL
) {
3922 /* Show All Interfaces.*/
3923 FOR_ALL_INTERFACES (vrf
, ifp
) {
3924 if (ospf_oi_count(ifp
)) {
3926 json_interface_sub
=
3927 json_object_new_object();
3929 show_ip_ospf_interface_sub(vty
, ospf
, ifp
,
3934 json_object_object_add(
3935 json_interface
, ifp
->name
,
3936 json_interface_sub
);
3941 json_object_object_add(json_vrf
, "interfaces",
3944 /* Interface name is specified. */
3945 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3948 json_object_boolean_true_add(json_vrf
,
3951 vty_out(vty
, "No such interface name\n");
3954 json_interface_sub
= json_object_new_object();
3955 json_interface
= json_object_new_object();
3958 show_ip_ospf_interface_sub(
3959 vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3962 json_object_object_add(json_interface
,
3964 json_interface_sub
);
3965 json_object_object_add(json_vrf
, "interfaces",
3973 json_object_object_add(json
, ospf_get_name(ospf
),
3982 static void show_ip_ospf_interface_traffic_sub(struct vty
*vty
,
3983 struct ospf_interface
*oi
,
3984 json_object
*json_interface_sub
,
3988 json_object_int_add(json_interface_sub
, "ifIndex",
3990 json_object_int_add(json_interface_sub
, "helloIn",
3992 json_object_int_add(json_interface_sub
, "helloOut",
3994 json_object_int_add(json_interface_sub
, "dbDescIn",
3996 json_object_int_add(json_interface_sub
, "dbDescOut",
3998 json_object_int_add(json_interface_sub
, "lsReqIn",
4000 json_object_int_add(json_interface_sub
, "lsReqOut",
4002 json_object_int_add(json_interface_sub
, "lsUpdIn",
4004 json_object_int_add(json_interface_sub
, "lsUpdOut",
4006 json_object_int_add(json_interface_sub
, "lsAckIn",
4008 json_object_int_add(json_interface_sub
, "lsAckOut",
4010 json_object_int_add(json_interface_sub
, "packetsQueued",
4011 listcount(oi
->obuf
));
4014 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u %12lu\n",
4015 oi
->ifp
->name
, oi
->hello_in
, oi
->hello_out
,
4016 oi
->db_desc_in
, oi
->db_desc_out
, oi
->ls_req_in
,
4017 oi
->ls_req_out
, oi
->ls_upd_in
, oi
->ls_upd_out
,
4018 oi
->ls_ack_in
, oi
->ls_ack_out
, listcount(oi
->obuf
));
4022 /* OSPFv2 Packet Counters */
4023 static int show_ip_ospf_interface_traffic_common(
4024 struct vty
*vty
, struct ospf
*ospf
, char *intf_name
, json_object
*json
,
4025 int display_once
, uint8_t use_vrf
, bool use_json
)
4027 struct vrf
*vrf
= NULL
;
4028 struct interface
*ifp
= NULL
;
4029 json_object
*json_vrf
= NULL
;
4030 json_object
*json_interface_sub
= NULL
;
4032 if (!use_json
&& !display_once
) {
4034 vty_out(vty
, "%-12s%-17s%-17s%-17s%-17s%-17s%-17s\n",
4035 "Interface", " HELLO", " DB-Desc", " LS-Req",
4036 " LS-Update", " LS-Ack", " Packets");
4037 vty_out(vty
, "%-10s%-18s%-18s%-17s%-17s%-17s%-17s\n", "",
4038 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
4039 " Rx/Tx", " Queued");
4041 "-------------------------------------------------------------------------------------------------------------\n");
4042 } else if (use_json
) {
4044 json_vrf
= json_object_new_object();
4049 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4051 if (intf_name
== NULL
) {
4052 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
4053 FOR_ALL_INTERFACES (vrf
, ifp
) {
4054 struct route_node
*rn
;
4055 struct ospf_interface
*oi
;
4057 if (ospf_oi_count(ifp
) == 0)
4060 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
4061 rn
= route_next(rn
)) {
4068 json_interface_sub
=
4069 json_object_new_object();
4072 show_ip_ospf_interface_traffic_sub(
4073 vty
, oi
, json_interface_sub
, use_json
);
4075 json_object_object_add(
4076 json_vrf
, ifp
->name
,
4077 json_interface_sub
);
4082 /* Interface name is specified. */
4083 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
4085 struct route_node
*rn
;
4086 struct ospf_interface
*oi
;
4088 if (ospf_oi_count(ifp
) == 0) {
4090 " OSPF not enabled on this interface %s\n",
4095 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
4096 rn
= route_next(rn
)) {
4100 json_interface_sub
=
4101 json_object_new_object();
4104 show_ip_ospf_interface_traffic_sub(
4105 vty
, oi
, json_interface_sub
, use_json
);
4107 json_object_object_add(
4108 json_vrf
, ifp
->name
,
4109 json_interface_sub
);
4117 json_object_object_add(json
, ospf_get_name(ospf
),
4125 DEFUN (show_ip_ospf_interface
,
4126 show_ip_ospf_interface_cmd
,
4127 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
4130 "OSPF information\n"
4133 "Interface information\n"
4138 bool uj
= use_json(argc
, argv
);
4139 struct listnode
*node
= NULL
;
4140 char *vrf_name
= NULL
, *intf_name
= NULL
;
4141 bool all_vrf
= false;
4142 int ret
= CMD_SUCCESS
;
4144 int idx_vrf
= 0, idx_intf
= 0;
4145 uint8_t use_vrf
= 0;
4146 json_object
*json
= NULL
;
4148 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4150 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4151 intf_name
= argv
[idx_intf
]->arg
;
4154 json
= json_object_new_object();
4156 /* vrf input is provided could be all or specific vrf*/
4160 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4161 if (!ospf
->oi_running
)
4163 ret
= show_ip_ospf_interface_common(
4164 vty
, ospf
, intf_name
, use_vrf
, json
,
4169 vty_json(vty
, json
);
4171 vty_out(vty
, "%% OSPF is not enabled\n");
4175 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4176 if (ospf
== NULL
|| !ospf
->oi_running
) {
4178 vty_json(vty
, json
);
4181 "%% OSPF is not enabled in vrf %s\n",
4186 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4190 /* Display default ospf (instance 0) info */
4191 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4192 if (ospf
== NULL
|| !ospf
->oi_running
) {
4194 vty_json(vty
, json
);
4197 "%% OSPF is not enabled in vrf default\n");
4201 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4206 vty_json(vty
, json
);
4211 DEFUN (show_ip_ospf_instance_interface
,
4212 show_ip_ospf_instance_interface_cmd
,
4213 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4216 "OSPF information\n"
4218 "Interface information\n"
4225 unsigned short instance
= 0;
4226 bool uj
= use_json(argc
, argv
);
4227 char *intf_name
= NULL
;
4228 int ret
= CMD_SUCCESS
;
4229 json_object
*json
= NULL
;
4231 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4232 if (instance
!= ospf_instance
)
4233 return CMD_NOT_MY_INSTANCE
;
4235 ospf
= ospf_lookup_instance(instance
);
4236 if (!ospf
|| !ospf
->oi_running
)
4240 json
= json_object_new_object();
4242 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4243 intf_name
= argv
[idx_intf
]->arg
;
4245 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4248 vty_json(vty
, json
);
4253 DEFUN (show_ip_ospf_interface_traffic
,
4254 show_ip_ospf_interface_traffic_cmd
,
4255 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4258 "OSPF information\n"
4261 "Interface information\n"
4262 "Protocol Packet counters\n"
4266 struct ospf
*ospf
= NULL
;
4267 struct listnode
*node
= NULL
;
4268 char *vrf_name
= NULL
, *intf_name
= NULL
;
4269 bool all_vrf
= false;
4271 int idx_vrf
= 0, idx_intf
= 0;
4272 bool uj
= use_json(argc
, argv
);
4273 json_object
*json
= NULL
;
4274 int ret
= CMD_SUCCESS
;
4275 int display_once
= 0;
4276 uint8_t use_vrf
= 0;
4278 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4280 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4281 intf_name
= argv
[idx_intf
]->arg
;
4284 json
= json_object_new_object();
4289 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4290 if (!ospf
->oi_running
)
4293 ret
= show_ip_ospf_interface_traffic_common(
4294 vty
, ospf
, intf_name
, json
,
4295 display_once
, use_vrf
, uj
);
4300 vty_json(vty
, json
);
4304 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4305 if (ospf
== NULL
|| !ospf
->oi_running
) {
4307 json_object_free(json
);
4311 ret
= show_ip_ospf_interface_traffic_common(
4312 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4314 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4315 if (ospf
== NULL
|| !ospf
->oi_running
) {
4317 json_object_free(json
);
4321 ret
= show_ip_ospf_interface_traffic_common(
4322 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4326 vty_json(vty
, json
);
4332 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4334 vty_out(vty
, "\n%-15s %-3s %-15s %-15s %-9s %-15s %-32s %5s %5s %5s\n",
4335 "Neighbor ID", "Pri", "State", "Up Time", "Dead Time",
4336 "Address", "Interface", "RXmtL", "RqstL", "DBsmL");
4339 static void show_ip_ospf_neighbour_brief(struct vty
*vty
,
4340 struct ospf_neighbor
*nbr
,
4341 struct ospf_neighbor
*prev_nbr
,
4342 json_object
*json
, bool use_json
)
4345 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4346 json_object
*json_neighbor
= NULL
, *json_neigh_array
= NULL
;
4347 struct timeval res
= {.tv_sec
= 0, .tv_usec
= 0};
4349 char uptime
[OSPF_TIME_DUMP_SIZE
];
4351 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
)
4353 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4356 char neigh_str
[INET_ADDRSTRLEN
];
4358 if (prev_nbr
&& !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
4359 /* Start new neigh list */
4360 json_neigh_array
= NULL
;
4363 if (nbr
->state
== NSM_Attempt
&&
4364 nbr
->router_id
.s_addr
== INADDR_ANY
)
4365 strlcpy(neigh_str
, "neighbor", sizeof(neigh_str
));
4367 inet_ntop(AF_INET
, &nbr
->router_id
, neigh_str
,
4370 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
4372 if (!json_neigh_array
) {
4373 json_neigh_array
= json_object_new_array();
4374 json_object_object_add(json
, neigh_str
,
4378 json_neighbor
= json_object_new_object();
4380 ospf_nbr_ism_state_message(nbr
, msgbuf
, sizeof(msgbuf
));
4381 #if CONFDATE > 20230321
4383 "Remove show_ip_ospf_neighbor_sub() JSON keys: priority, state, deadTimeMsecs, address, retransmitCounter, requestCounter, dbSummaryCounter")
4385 json_object_int_add(json_neighbor
, "priority", nbr
->priority
);
4386 json_object_string_add(json_neighbor
, "state", msgbuf
);
4387 json_object_int_add(json_neighbor
, "nbrPriority",
4389 json_object_string_add(json_neighbor
, "nbrState", msgbuf
);
4391 json_object_string_add(
4392 json_neighbor
, "converged",
4393 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4394 json_object_string_add(json_neighbor
, "role",
4395 lookup_msg(ospf_ism_state_msg
,
4396 ospf_nbr_ism_state(nbr
),
4398 if (nbr
->t_inactivity
) {
4401 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
4404 json_object_int_add(json_neighbor
, "upTimeInMsec",
4406 json_object_int_add(json_neighbor
, "deadTimeMsecs",
4408 json_object_int_add(json_neighbor
,
4409 "routerDeadIntervalTimerDueMsec",
4411 json_object_string_add(
4412 json_neighbor
, "upTime",
4413 ospf_timeval_dump(&res
, uptime
,
4415 json_object_string_add(
4416 json_neighbor
, "deadTime",
4417 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
4420 json_object_string_add(json_neighbor
, "deadTimeMsecs",
4422 json_object_string_add(json_neighbor
,
4423 "routerDeadIntervalTimerDueMsec",
4426 json_object_string_addf(json_neighbor
, "address", "%pI4",
4428 json_object_string_addf(json_neighbor
, "ifaceAddress", "%pI4",
4430 json_object_string_add(json_neighbor
, "ifaceName",
4432 json_object_int_add(json_neighbor
, "retransmitCounter",
4433 ospf_ls_retransmit_count(nbr
));
4434 json_object_int_add(json_neighbor
,
4435 "linkStateRetransmissionListCounter",
4436 ospf_ls_retransmit_count(nbr
));
4437 json_object_int_add(json_neighbor
, "requestCounter",
4438 ospf_ls_request_count(nbr
));
4439 json_object_int_add(json_neighbor
,
4440 "linkStateRequestListCounter",
4441 ospf_ls_request_count(nbr
));
4442 json_object_int_add(json_neighbor
, "dbSummaryCounter",
4443 ospf_db_summary_count(nbr
));
4444 json_object_int_add(json_neighbor
, "databaseSummaryListCounter",
4445 ospf_db_summary_count(nbr
));
4447 json_object_array_add(json_neigh_array
, json_neighbor
);
4449 ospf_nbr_ism_state_message(nbr
, msgbuf
, sizeof(msgbuf
));
4451 if (nbr
->state
== NSM_Attempt
&&
4452 nbr
->router_id
.s_addr
== INADDR_ANY
)
4453 vty_out(vty
, "%-15s %3d %-15s ", "-", nbr
->priority
,
4456 vty_out(vty
, "%-15pI4 %3d %-15s ", &nbr
->router_id
,
4457 nbr
->priority
, msgbuf
);
4459 vty_out(vty
, "%-15s ",
4460 ospf_timeval_dump(&res
, uptime
, sizeof(uptime
)));
4462 vty_out(vty
, "%9s ",
4463 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
4465 vty_out(vty
, "%-15pI4 ", &nbr
->src
);
4466 vty_out(vty
, "%-32s %5ld %5ld %5d\n", IF_NAME(nbr
->oi
),
4467 ospf_ls_retransmit_count(nbr
),
4468 ospf_ls_request_count(nbr
), ospf_db_summary_count(nbr
));
4472 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4473 struct ospf_interface
*oi
,
4474 json_object
*json
, bool use_json
)
4476 struct route_node
*rn
;
4477 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
4479 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4485 /* Do not show myself. */
4486 if (nbr
== oi
->nbr_self
)
4488 /* Down state is not shown. */
4489 if (nbr
->state
== NSM_Down
)
4494 show_ip_ospf_neighbour_brief(vty
, nbr
, prev_nbr
, json
,
4499 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4500 json_object
*json
, bool use_json
,
4503 struct ospf_interface
*oi
;
4504 struct listnode
*node
;
4505 json_object
*json_vrf
= NULL
;
4506 json_object
*json_nbr_sub
= NULL
;
4510 json_vrf
= json_object_new_object();
4513 json_nbr_sub
= json_object_new_object();
4516 if (ospf
->instance
) {
4518 json_object_int_add(json
, "ospfInstance",
4521 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4524 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4526 show_ip_ospf_neighbour_header(vty
);
4528 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4529 if (ospf_interface_neighbor_count(oi
) == 0)
4531 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4535 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4537 json_object_object_add(json
, ospf_get_name(ospf
),
4545 DEFUN (show_ip_ospf_neighbor
,
4546 show_ip_ospf_neighbor_cmd
,
4547 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4550 "OSPF information\n"
4557 bool uj
= use_json(argc
, argv
);
4558 struct listnode
*node
= NULL
;
4559 char *vrf_name
= NULL
;
4560 bool all_vrf
= false;
4561 int ret
= CMD_SUCCESS
;
4564 uint8_t use_vrf
= 0;
4565 json_object
*json
= NULL
;
4567 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4570 json
= json_object_new_object();
4572 /* vrf input is provided could be all or specific vrf*/
4576 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4577 if (!ospf
->oi_running
)
4579 ret
= show_ip_ospf_neighbor_common(
4580 vty
, ospf
, json
, uj
, use_vrf
);
4584 vty_json(vty
, json
);
4586 vty_out(vty
, "OSPF is not enabled\n");
4591 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4592 if (ospf
== NULL
|| !ospf
->oi_running
) {
4594 vty_json(vty
, json
);
4597 "%% OSPF is not enabled in vrf %s\n",
4603 /* Display default ospf (instance 0) info */
4604 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4605 if (ospf
== NULL
|| !ospf
->oi_running
) {
4607 vty_json(vty
, json
);
4610 "%% OSPF is not enabled in vrf default\n");
4617 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4621 vty_out(vty
, "%s\n",
4622 json_object_to_json_string_ext(
4623 json
, JSON_C_TO_STRING_PRETTY
));
4628 json_object_free(json
);
4634 DEFUN (show_ip_ospf_instance_neighbor
,
4635 show_ip_ospf_instance_neighbor_cmd
,
4636 "show ip ospf (1-65535) neighbor [json]",
4639 "OSPF information\n"
4646 unsigned short instance
= 0;
4647 bool uj
= use_json(argc
, argv
);
4648 json_object
*json
= NULL
;
4649 int ret
= CMD_SUCCESS
;
4651 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4652 if (instance
!= ospf_instance
)
4653 return CMD_NOT_MY_INSTANCE
;
4655 ospf
= ospf_lookup_instance(instance
);
4656 if (!ospf
|| !ospf
->oi_running
)
4660 json
= json_object_new_object();
4662 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4665 vty_json(vty
, json
);
4670 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4671 json_object
*json
, bool use_json
,
4674 struct listnode
*node
;
4675 struct ospf_interface
*oi
;
4676 char buf
[PREFIX_STRLEN
];
4677 json_object
*json_vrf
= NULL
;
4678 json_object
*json_neighbor_sub
= NULL
;
4682 json_vrf
= json_object_new_object();
4687 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4689 show_ip_ospf_neighbour_header(vty
);
4691 if (ospf
->instance
) {
4693 json_object_int_add(json_vrf
, "ospfInstance",
4696 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4699 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4700 struct listnode
*nbr_node
;
4701 struct ospf_nbr_nbma
*nbr_nbma
;
4703 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4705 /* print Down neighbor status */
4706 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4707 if (nbr_nbma
->nbr
== NULL
4708 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4711 json_object_new_object();
4712 json_object_int_add(json_neighbor_sub
,
4714 nbr_nbma
->priority
);
4715 json_object_boolean_true_add(
4718 json_object_string_add(
4722 json_object_int_add(
4724 "nbrNbmaRetransmitCounter", 0);
4725 json_object_int_add(
4727 "nbrNbmaRequestCounter", 0);
4728 json_object_int_add(
4730 "nbrNbmaDbSummaryCounter", 0);
4731 json_object_object_add(
4734 &nbr_nbma
->addr
, buf
,
4738 vty_out(vty
, "%-15s %3d %-15s %9s ",
4739 "-", nbr_nbma
->priority
, "Down",
4742 "%-32pI4 %-20s %5d %5d %5d\n",
4744 IF_NAME(oi
), 0, 0, 0);
4752 json_object_object_add(json
, ospf_get_name(ospf
),
4760 DEFUN (show_ip_ospf_neighbor_all
,
4761 show_ip_ospf_neighbor_all_cmd
,
4762 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4765 "OSPF information\n"
4769 "include down status neighbor\n"
4773 bool uj
= use_json(argc
, argv
);
4774 struct listnode
*node
= NULL
;
4775 char *vrf_name
= NULL
;
4776 bool all_vrf
= false;
4777 int ret
= CMD_SUCCESS
;
4780 uint8_t use_vrf
= 0;
4781 json_object
*json
= NULL
;
4783 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4786 json
= json_object_new_object();
4788 /* vrf input is provided could be all or specific vrf*/
4792 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4793 if (!ospf
->oi_running
)
4795 ret
= show_ip_ospf_neighbor_all_common(
4796 vty
, ospf
, json
, uj
, use_vrf
);
4800 vty_json(vty
, json
);
4805 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4806 if (ospf
== NULL
|| !ospf
->oi_running
) {
4808 json_object_free(json
);
4812 /* Display default ospf (instance 0) info */
4813 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4814 if (ospf
== NULL
|| !ospf
->oi_running
) {
4816 json_object_free(json
);
4822 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4825 vty_out(vty
, "%s\n",
4826 json_object_to_json_string_ext(
4827 json
, JSON_C_TO_STRING_PRETTY
));
4832 json_object_free(json
);
4837 DEFUN (show_ip_ospf_instance_neighbor_all
,
4838 show_ip_ospf_instance_neighbor_all_cmd
,
4839 "show ip ospf (1-65535) neighbor all [json]",
4842 "OSPF information\n"
4845 "include down status neighbor\n"
4850 unsigned short instance
= 0;
4851 bool uj
= use_json(argc
, argv
);
4852 json_object
*json
= NULL
;
4853 int ret
= CMD_SUCCESS
;
4855 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4856 if (instance
!= ospf_instance
)
4857 return CMD_NOT_MY_INSTANCE
;
4859 ospf
= ospf_lookup_instance(instance
);
4860 if (!ospf
|| !ospf
->oi_running
)
4863 json
= json_object_new_object();
4865 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4868 vty_json(vty
, json
);
4873 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4875 struct cmd_token
**argv
,
4876 bool use_json
, uint8_t use_vrf
)
4878 struct interface
*ifp
;
4879 struct route_node
*rn
;
4880 json_object
*json
= NULL
;
4883 json
= json_object_new_object();
4885 if (ospf
->instance
) {
4887 json_object_int_add(json
, "ospfInstance",
4890 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4893 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4895 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4898 json_object_boolean_true_add(json
, "noSuchIface");
4900 vty_out(vty
, "No such interface.\n");
4904 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4905 struct ospf_interface
*oi
= rn
->info
;
4910 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4914 vty_json(vty
, json
);
4921 DEFUN (show_ip_ospf_neighbor_int
,
4922 show_ip_ospf_neighbor_int_cmd
,
4923 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4926 "OSPF information\n"
4935 bool uj
= use_json(argc
, argv
);
4936 int ret
= CMD_SUCCESS
;
4937 struct interface
*ifp
= NULL
;
4938 char *vrf_name
= NULL
;
4939 vrf_id_t vrf_id
= VRF_DEFAULT
;
4940 struct vrf
*vrf
= NULL
;
4942 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4943 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4944 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4947 vrf
= vrf_lookup_by_name(vrf_name
);
4949 vrf_id
= vrf
->vrf_id
;
4951 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4953 if (!ospf
|| !ospf
->oi_running
)
4957 show_ip_ospf_neighbour_header(vty
);
4959 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4961 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4965 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4970 DEFUN (show_ip_ospf_instance_neighbor_int
,
4971 show_ip_ospf_instance_neighbor_int_cmd
,
4972 "show ip ospf (1-65535) neighbor IFNAME [json]",
4975 "OSPF information\n"
4984 unsigned short instance
= 0;
4985 bool uj
= use_json(argc
, argv
);
4988 show_ip_ospf_neighbour_header(vty
);
4990 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4991 if (instance
!= ospf_instance
)
4992 return CMD_NOT_MY_INSTANCE
;
4994 ospf
= ospf_lookup_instance(instance
);
4995 if (!ospf
|| !ospf
->oi_running
)
4999 show_ip_ospf_neighbour_header(vty
);
5001 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
5005 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
5006 struct ospf_interface
*oi
,
5007 struct ospf_nbr_nbma
*nbr_nbma
,
5008 bool use_json
, json_object
*json
)
5010 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5011 json_object
*json_sub
= NULL
;
5014 json_sub
= json_object_new_object();
5015 else /* Show neighbor ID. */
5016 vty_out(vty
, " Neighbor %s,", "-");
5018 /* Show interface address. */
5020 json_object_string_addf(json_sub
, "ifaceAddress", "%pI4",
5023 vty_out(vty
, " interface address %pI4\n",
5028 json_object_string_add(json_sub
, "areaId",
5029 ospf_area_desc_string(oi
->area
));
5030 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
5032 vty_out(vty
, " In the area %s via interface %s\n",
5033 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
5035 /* Show neighbor priority and state. */
5037 json_object_int_add(json_sub
, "nbrPriority",
5038 nbr_nbma
->priority
);
5039 json_object_string_add(json_sub
, "nbrState", "down");
5041 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5042 nbr_nbma
->priority
, "Down");
5044 /* Show state changes. */
5046 json_object_int_add(json_sub
, "stateChangeCounter",
5047 nbr_nbma
->state_change
);
5049 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
5051 /* Show PollInterval */
5053 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
5055 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
5057 /* Show poll-interval timer. */
5058 if (nbr_nbma
->t_poll
) {
5061 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
5063 json_object_int_add(json_sub
,
5064 "pollIntervalTimerDueMsec",
5067 vty_out(vty
, " Poll timer due in %s\n",
5068 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
5072 /* Show poll-interval timer thread. */
5074 if (nbr_nbma
->t_poll
!= NULL
)
5075 json_object_string_add(json_sub
,
5076 "pollIntervalTimerThread", "on");
5078 vty_out(vty
, " Thread Poll Timer %s\n",
5079 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
5082 json_object_object_add(json
, "noNbrId", json_sub
);
5085 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
5086 struct ospf_interface
*oi
,
5087 struct ospf_neighbor
*nbr
,
5088 struct ospf_neighbor
*prev_nbr
,
5089 json_object
*json
, bool use_json
)
5091 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5092 json_object
*json_neigh
= NULL
, *json_neigh_array
= NULL
;
5093 char neigh_str
[INET_ADDRSTRLEN
] = {0};
5094 char neigh_state
[16] = {0};
5098 !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
5099 json_neigh_array
= NULL
;
5102 if (nbr
->state
== NSM_Attempt
5103 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5104 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
5106 inet_ntop(AF_INET
, &nbr
->router_id
,
5107 neigh_str
, sizeof(neigh_str
));
5109 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
5111 if (!json_neigh_array
) {
5112 json_neigh_array
= json_object_new_array();
5113 json_object_object_add(json
, neigh_str
,
5117 json_neigh
= json_object_new_object();
5120 /* Show neighbor ID. */
5121 if (nbr
->state
== NSM_Attempt
5122 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5123 vty_out(vty
, " Neighbor %s,", "-");
5125 vty_out(vty
, " Neighbor %pI4,",
5129 /* Show interface address. */
5131 json_object_string_addf(json_neigh
, "ifaceAddress", "%pI4",
5132 &nbr
->address
.u
.prefix4
);
5134 vty_out(vty
, " interface address %pI4\n",
5135 &nbr
->address
.u
.prefix4
);
5139 json_object_string_add(json_neigh
, "areaId",
5140 ospf_area_desc_string(oi
->area
));
5141 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
5143 vty_out(vty
, " In the area %s via interface %s\n",
5144 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
5146 /* Show neighbor priority and state. */
5147 ospf_nbr_ism_state_message(nbr
, neigh_state
, sizeof(neigh_state
));
5149 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
5150 json_object_string_add(json_neigh
, "nbrState", neigh_state
);
5152 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5153 nbr
->priority
, neigh_state
);
5155 /* Show state changes. */
5157 json_object_int_add(json_neigh
, "stateChangeCounter",
5160 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
5162 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
5167 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
5169 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
5173 " Most recent state change statistics:\n");
5174 vty_out(vty
, " Progressive change %s ago\n",
5175 ospf_timeval_dump(&res
, timebuf
,
5180 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
5185 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
5187 json_object_int_add(json_neigh
,
5188 "lastRegressiveChangeMsec",
5190 if (nbr
->last_regress_str
)
5191 json_object_string_add(
5193 "lastRegressiveChangeReason",
5194 nbr
->last_regress_str
);
5197 " Regressive change %s ago, due to %s\n",
5198 ospf_timeval_dump(&res
, timebuf
,
5200 (nbr
->last_regress_str
? nbr
->last_regress_str
5205 /* Show Designated Rotuer ID. */
5207 json_object_string_addf(json_neigh
, "routerDesignatedId",
5208 "%pI4", &nbr
->d_router
);
5210 vty_out(vty
, " DR is %pI4,", &nbr
->d_router
);
5212 /* Show Backup Designated Rotuer ID. */
5214 json_object_string_addf(json_neigh
, "routerDesignatedBackupId",
5215 "%pI4", &nbr
->bd_router
);
5217 vty_out(vty
, " BDR is %pI4\n", &nbr
->bd_router
);
5221 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5222 json_object_string_add(json_neigh
, "optionsList",
5223 ospf_options_dump(nbr
->options
));
5225 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5226 ospf_options_dump(nbr
->options
));
5228 /* Show Router Dead interval timer. */
5230 if (nbr
->t_inactivity
) {
5232 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5235 json_object_int_add(json_neigh
,
5236 "routerDeadIntervalTimerDueMsec",
5239 json_object_int_add(
5241 "routerDeadIntervalTimerDueMsec", -1);
5243 vty_out(vty
, " Dead timer due in %s\n",
5244 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5247 /* Show Database Summary list. */
5249 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5250 ospf_db_summary_count(nbr
));
5252 vty_out(vty
, " Database Summary List %d\n",
5253 ospf_db_summary_count(nbr
));
5255 /* Show Link State Request list. */
5257 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5258 ospf_ls_request_count(nbr
));
5260 vty_out(vty
, " Link State Request List %ld\n",
5261 ospf_ls_request_count(nbr
));
5263 /* Show Link State Retransmission list. */
5265 json_object_int_add(json_neigh
,
5266 "linkStateRetransmissionListCounter",
5267 ospf_ls_retransmit_count(nbr
));
5269 vty_out(vty
, " Link State Retransmission List %ld\n",
5270 ospf_ls_retransmit_count(nbr
));
5272 /* Show inactivity timer thread. */
5274 if (nbr
->t_inactivity
!= NULL
)
5275 json_object_string_add(json_neigh
,
5276 "threadInactivityTimer", "on");
5278 vty_out(vty
, " Thread Inactivity Timer %s\n",
5279 nbr
->t_inactivity
!= NULL
? "on" : "off");
5281 /* Show Database Description retransmission thread. */
5283 if (nbr
->t_db_desc
!= NULL
)
5284 json_object_string_add(
5286 "threadDatabaseDescriptionRetransmission",
5290 " Thread Database Description Retransmision %s\n",
5291 nbr
->t_db_desc
!= NULL
? "on" : "off");
5293 /* Show Link State Request Retransmission thread. */
5295 if (nbr
->t_ls_req
!= NULL
)
5296 json_object_string_add(
5298 "threadLinkStateRequestRetransmission", "on");
5301 " Thread Link State Request Retransmission %s\n",
5302 nbr
->t_ls_req
!= NULL
? "on" : "off");
5304 /* Show Link State Update Retransmission thread. */
5306 if (nbr
->t_ls_upd
!= NULL
)
5307 json_object_string_add(
5309 "threadLinkStateUpdateRetransmission",
5313 " Thread Link State Update Retransmission %s\n\n",
5314 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5317 vty_out(vty
, " Graceful restart Helper info:\n");
5319 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5321 " Graceful Restart HELPER Status : Inprogress.\n");
5324 " Graceful Restart grace period time: %d (seconds).\n",
5325 nbr
->gr_helper_info
.recvd_grace_period
);
5326 vty_out(vty
, " Graceful Restart reason: %s.\n",
5327 ospf_restart_reason2str(
5328 nbr
->gr_helper_info
.gr_restart_reason
));
5331 " Graceful Restart HELPER Status : None\n");
5334 if (nbr
->gr_helper_info
.rejected_reason
5335 != OSPF_HELPER_REJECTED_NONE
)
5336 vty_out(vty
, " Helper rejected reason: %s.\n",
5337 ospf_rejected_reason2str(
5338 nbr
->gr_helper_info
.rejected_reason
));
5340 if (nbr
->gr_helper_info
.helper_exit_reason
5341 != OSPF_GR_HELPER_EXIT_NONE
)
5342 vty_out(vty
, " Last helper exit reason: %s.\n\n",
5343 ospf_exit_reason2str(
5344 nbr
->gr_helper_info
.helper_exit_reason
));
5348 json_object_string_add(json_neigh
, "grHelperStatus",
5349 OSPF_GR_IS_ACTIVE_HELPER(nbr
) ?
5352 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5353 json_object_int_add(
5354 json_neigh
, "graceInterval",
5355 nbr
->gr_helper_info
.recvd_grace_period
);
5356 json_object_string_add(
5357 json_neigh
, "grRestartReason",
5358 ospf_restart_reason2str(
5359 nbr
->gr_helper_info
.gr_restart_reason
));
5362 if (nbr
->gr_helper_info
.rejected_reason
5363 != OSPF_HELPER_REJECTED_NONE
)
5364 json_object_string_add(
5365 json_neigh
, "helperRejectReason",
5366 ospf_rejected_reason2str(
5367 nbr
->gr_helper_info
.rejected_reason
));
5369 if (nbr
->gr_helper_info
.helper_exit_reason
5370 != OSPF_GR_HELPER_EXIT_NONE
)
5371 json_object_string_add(
5372 json_neigh
, "helperExitReason",
5373 ospf_exit_reason2str(
5375 .helper_exit_reason
));
5378 bfd_sess_show(vty
, json_neigh
, nbr
->bfd_session
);
5381 json_object_array_add(json_neigh_array
, json_neigh
);
5385 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5386 struct in_addr
*router_id
,
5387 bool use_json
, uint8_t use_vrf
,
5390 struct listnode
*node
;
5391 struct ospf_neighbor
*nbr
;
5392 struct ospf_interface
*oi
;
5393 json_object
*json
= NULL
;
5396 json
= json_object_new_object();
5398 if (ospf
->instance
) {
5400 json_object_int_add(json
, "ospfInstance",
5403 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5406 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5408 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5409 nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
);
5415 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5418 show_ip_ospf_neighbour_brief(vty
, nbr
, NULL
, json
,
5423 vty_json(vty
, json
);
5430 DEFPY(show_ip_ospf_neighbor_id
, show_ip_ospf_neighbor_id_cmd
,
5431 "show ip ospf neighbor A.B.C.D$router_id [detail$detail] [json$json]",
5433 "OSPF information\n"
5436 "Detailed output\n" JSON_STR
)
5439 struct listnode
*node
;
5440 int ret
= CMD_SUCCESS
;
5442 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5443 if (!ospf
->oi_running
)
5445 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5446 !!json
, 0, !!detail
);
5452 DEFPY(show_ip_ospf_instance_neighbor_id
, show_ip_ospf_instance_neighbor_id_cmd
,
5453 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [detail$detail] [json$json]",
5455 "OSPF information\n"
5459 "Detailed output\n" JSON_STR
)
5463 if (instance
!= ospf_instance
)
5464 return CMD_NOT_MY_INSTANCE
;
5466 ospf
= ospf_lookup_instance(instance
);
5467 if (!ospf
|| !ospf
->oi_running
)
5470 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
, 0,
5474 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5476 json_object
*json
, bool use_json
,
5479 struct ospf_interface
*oi
;
5480 struct listnode
*node
;
5481 json_object
*json_vrf
= NULL
;
5482 json_object
*json_nbr_sub
= NULL
;
5486 json_vrf
= json_object_new_object();
5490 json_nbr_sub
= json_object_new_object();
5493 if (ospf
->instance
) {
5495 json_object_int_add(json
, "ospfInstance",
5498 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5501 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5503 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5504 struct route_node
*rn
;
5505 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5507 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5513 if (nbr
!= oi
->nbr_self
) {
5514 if (nbr
->state
!= NSM_Down
) {
5515 show_ip_ospf_neighbor_detail_sub(
5516 vty
, oi
, nbr
, prev_nbr
,
5517 json_nbr_sub
, use_json
);
5525 json_object_object_add(json_vrf
, "neighbors",
5528 json_object_object_add(json
, ospf_get_name(ospf
),
5536 DEFUN (show_ip_ospf_neighbor_detail
,
5537 show_ip_ospf_neighbor_detail_cmd
,
5538 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5541 "OSPF information\n"
5545 "detail of all neighbors\n"
5549 bool uj
= use_json(argc
, argv
);
5550 struct listnode
*node
= NULL
;
5551 char *vrf_name
= NULL
;
5552 bool all_vrf
= false;
5553 int ret
= CMD_SUCCESS
;
5556 uint8_t use_vrf
= 0;
5557 json_object
*json
= NULL
;
5559 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5562 json
= json_object_new_object();
5564 /* vrf input is provided could be all or specific vrf*/
5568 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5569 if (!ospf
->oi_running
)
5571 ret
= show_ip_ospf_neighbor_detail_common(
5572 vty
, ospf
, json
, uj
, use_vrf
);
5575 vty_json(vty
, json
);
5579 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5580 if (ospf
== NULL
|| !ospf
->oi_running
) {
5582 json_object_free(json
);
5586 /* Display default ospf (instance 0) info */
5587 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5588 if (ospf
== NULL
|| !ospf
->oi_running
) {
5590 json_object_free(json
);
5596 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5599 vty_out(vty
, "%s\n",
5600 json_object_to_json_string_ext(
5601 json
, JSON_C_TO_STRING_PRETTY
));
5606 json_object_free(json
);
5611 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5612 show_ip_ospf_instance_neighbor_detail_cmd
,
5613 "show ip ospf (1-65535) neighbor detail [json]",
5616 "OSPF information\n"
5619 "detail of all neighbors\n"
5624 unsigned short instance
= 0;
5625 bool uj
= use_json(argc
, argv
);
5626 json_object
*json
= NULL
;
5627 int ret
= CMD_SUCCESS
;
5629 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5630 if (instance
!= ospf_instance
)
5631 return CMD_NOT_MY_INSTANCE
;
5633 ospf
= ospf_lookup_instance(instance
);
5634 if (!ospf
|| !ospf
->oi_running
)
5638 json
= json_object_new_object();
5640 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5643 vty_json(vty
, json
);
5648 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5654 struct listnode
*node
;
5655 struct ospf_interface
*oi
;
5656 json_object
*json_vrf
= NULL
;
5660 json_vrf
= json_object_new_object();
5665 if (ospf
->instance
) {
5667 json_object_int_add(json
, "ospfInstance",
5670 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5673 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5675 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5676 struct route_node
*rn
;
5677 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5678 struct ospf_nbr_nbma
*nbr_nbma
;
5680 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5686 if (nbr
!= oi
->nbr_self
)
5687 if (nbr
->state
!= NSM_Down
)
5688 show_ip_ospf_neighbor_detail_sub(
5689 vty
, oi
, rn
->info
, prev_nbr
,
5690 json_vrf
, use_json
);
5694 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
5697 struct listnode
*nd
;
5699 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5700 if (nbr_nbma
->nbr
== NULL
||
5701 nbr_nbma
->nbr
->state
== NSM_Down
)
5702 show_ip_ospf_nbr_nbma_detail_sub(
5703 vty
, oi
, nbr_nbma
, use_json
, json_vrf
);
5709 json_object_object_add(json
, ospf_get_name(ospf
),
5718 DEFUN (show_ip_ospf_neighbor_detail_all
,
5719 show_ip_ospf_neighbor_detail_all_cmd
,
5720 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5723 "OSPF information\n"
5727 "detail of all neighbors\n"
5728 "include down status neighbor\n"
5732 bool uj
= use_json(argc
, argv
);
5733 struct listnode
*node
= NULL
;
5734 char *vrf_name
= NULL
;
5735 bool all_vrf
= false;
5736 int ret
= CMD_SUCCESS
;
5739 uint8_t use_vrf
= 0;
5740 json_object
*json
= NULL
;
5742 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5745 json
= json_object_new_object();
5747 /* vrf input is provided could be all or specific vrf*/
5751 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5752 if (!ospf
->oi_running
)
5754 ret
= show_ip_ospf_neighbor_detail_all_common(
5755 vty
, ospf
, json
, uj
, use_vrf
);
5759 vty_json(vty
, json
);
5763 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5764 if (ospf
== NULL
|| !ospf
->oi_running
) {
5766 json_object_free(json
);
5770 /* Display default ospf (instance 0) info */
5771 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5772 if (ospf
== NULL
|| !ospf
->oi_running
) {
5774 json_object_free(json
);
5780 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5783 vty_out(vty
, "%s\n",
5784 json_object_to_json_string_ext(
5785 json
, JSON_C_TO_STRING_PRETTY
));
5790 json_object_free(json
);
5795 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5796 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5797 "show ip ospf (1-65535) neighbor detail all [json]",
5800 "OSPF information\n"
5803 "detail of all neighbors\n"
5804 "include down status neighbor\n"
5809 unsigned short instance
= 0;
5810 bool uj
= use_json(argc
, argv
);
5811 json_object
*json
= NULL
;
5812 int ret
= CMD_SUCCESS
;
5814 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5815 if (instance
!= ospf_instance
)
5816 return CMD_NOT_MY_INSTANCE
;
5818 ospf
= ospf_lookup_instance(instance
);
5819 if (!ospf
|| !ospf
->oi_running
)
5823 json
= json_object_new_object();
5825 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5828 vty_json(vty
, json
);
5833 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5836 struct cmd_token
**argv
,
5839 struct ospf_interface
*oi
;
5840 struct interface
*ifp
;
5841 struct route_node
*rn
, *nrn
;
5842 struct ospf_neighbor
*nbr
;
5843 json_object
*json
= NULL
;
5846 json
= json_object_new_object();
5848 if (ospf
->instance
) {
5850 json_object_int_add(json
, "ospfInstance",
5853 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5856 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5859 vty_out(vty
, "No such interface.\n");
5861 vty_out(vty
, "{}\n");
5862 json_object_free(json
);
5867 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5873 for (nrn
= route_top(oi
->nbrs
); nrn
; nrn
= route_next(nrn
)) {
5879 if (nbr
== oi
->nbr_self
)
5882 if (nbr
->state
== NSM_Down
)
5885 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5891 vty_json(vty
, json
);
5898 DEFUN (show_ip_ospf_neighbor_int_detail
,
5899 show_ip_ospf_neighbor_int_detail_cmd
,
5900 "show ip ospf neighbor IFNAME detail [json]",
5903 "OSPF information\n"
5906 "detail of all neighbors\n"
5910 bool uj
= use_json(argc
, argv
);
5911 struct listnode
*node
= NULL
;
5912 int ret
= CMD_SUCCESS
;
5913 bool ospf_output
= false;
5915 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5916 if (!ospf
->oi_running
)
5919 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5924 vty_out(vty
, "%% OSPF instance not found\n");
5929 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5930 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5931 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5934 "OSPF information\n"
5938 "detail of all neighbors\n"
5944 unsigned short instance
= 0;
5945 bool uj
= use_json(argc
, argv
);
5947 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5948 if (instance
!= ospf_instance
)
5949 return CMD_NOT_MY_INSTANCE
;
5951 ospf
= ospf_lookup_instance(instance
);
5952 if (!ospf
|| !ospf
->oi_running
)
5955 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5959 /* Show functions */
5960 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
,
5961 json_object
*json_lsa
)
5963 struct router_lsa
*rl
;
5964 struct summary_lsa
*sl
;
5965 struct as_external_lsa
*asel
;
5966 struct prefix_ipv4 p
;
5969 /* If self option is set, check LSA self flag. */
5970 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5973 /* LSA common part show. */
5974 vty_out(vty
, "%-15pI4",
5976 vty_out(vty
, "%-15pI4 %4d 0x%08lx 0x%04x",
5977 &lsa
->data
->adv_router
, LS_AGE(lsa
),
5978 (unsigned long)ntohl(
5979 lsa
->data
->ls_seqnum
),
5980 ntohs(lsa
->data
->checksum
));
5985 snprintf(seqnum
, sizeof(seqnum
), "%x",
5986 ntohl(lsa
->data
->ls_seqnum
));
5987 snprintf(checksum
, sizeof(checksum
), "%x",
5988 ntohs(lsa
->data
->checksum
));
5989 json_object_string_addf(json_lsa
, "lsId",
5990 "%pI4", &lsa
->data
->id
);
5991 json_object_string_addf(
5992 json_lsa
, "advertisedRouter", "%pI4",
5993 &lsa
->data
->adv_router
);
5994 json_object_int_add(json_lsa
, "lsaAge",
5996 json_object_string_add(
5997 json_lsa
, "sequenceNumber", seqnum
);
5998 json_object_string_add(json_lsa
, "checksum",
6002 /* LSA specific part show. */
6003 switch (lsa
->data
->type
) {
6004 case OSPF_ROUTER_LSA
:
6005 rl
= (struct router_lsa
*)lsa
->data
;
6008 vty_out(vty
, " %-d", ntohs(rl
->links
));
6010 json_object_int_add(json_lsa
,
6014 case OSPF_SUMMARY_LSA
:
6015 sl
= (struct summary_lsa
*)lsa
->data
;
6018 p
.prefix
= sl
->header
.id
;
6019 p
.prefixlen
= ip_masklen(sl
->mask
);
6020 apply_mask_ipv4(&p
);
6023 vty_out(vty
, " %pFX", &p
);
6025 json_object_string_addf(
6026 json_lsa
, "summaryAddress",
6030 case OSPF_AS_EXTERNAL_LSA
:
6031 case OSPF_AS_NSSA_LSA
:
6032 asel
= (struct as_external_lsa
*)lsa
->data
;
6035 p
.prefix
= asel
->header
.id
;
6036 p
.prefixlen
= ip_masklen(asel
->mask
);
6037 apply_mask_ipv4(&p
);
6040 vty_out(vty
, " %s %pFX [0x%lx]",
6046 (unsigned long)ntohl(
6047 asel
->e
[0].route_tag
));
6049 json_object_string_add(
6050 json_lsa
, "metricType",
6055 json_object_string_addf(
6056 json_lsa
, "route", "%pFX", &p
);
6057 json_object_int_add(
6059 (unsigned long)ntohl(
6060 asel
->e
[0].route_tag
));
6063 case OSPF_NETWORK_LSA
:
6064 case OSPF_ASBR_SUMMARY_LSA
:
6065 case OSPF_OPAQUE_LINK_LSA
:
6066 case OSPF_OPAQUE_AREA_LSA
:
6067 case OSPF_OPAQUE_AS_LSA
:
6082 static const char *const show_database_desc
[] = {
6084 "Router Link States",
6086 "Summary Link States",
6087 "ASBR-Summary Link States",
6088 "AS External Link States",
6089 "Group Membership LSA",
6090 "NSSA-external Link States",
6092 "Link-Local Opaque-LSA",
6093 "Area-Local Opaque-LSA",
6094 "AS-external Opaque-LSA",
6097 static const char * const show_database_desc_json
[] = {
6100 "networkLinkStates",
6101 "summaryLinkStates",
6102 "asbrSummaryLinkStates",
6103 "asExternalLinkStates",
6104 "groupMembershipLsa",
6105 "nssaExternalLinkStates",
6107 "linkLocalOpaqueLsa",
6108 "areaLocalOpaqueLsa",
6109 "asExternalOpaqueLsa",
6112 static const char *const show_database_desc_count_json
[] = {
6114 "routerLinkStatesCount",
6115 "networkLinkStatesCount",
6116 "summaryLinkStatesCount",
6117 "asbrSummaryLinkStatesCount",
6118 "asExternalLinkStatesCount",
6119 "groupMembershipLsaCount",
6120 "nssaExternalLinkStatesCount",
6122 "linkLocalOpaqueLsaCount",
6123 "areaLocalOpaqueLsaCount",
6124 "asExternalOpaqueLsaCount",
6127 static const char *const show_database_header
[] = {
6129 "Link ID ADV Router Age Seq# CkSum Link count",
6130 "Link ID ADV Router Age Seq# CkSum",
6131 "Link ID ADV Router Age Seq# CkSum Route",
6132 "Link ID ADV Router Age Seq# CkSum",
6133 "Link ID ADV Router Age Seq# CkSum Route",
6134 " --- header for Group Member ----",
6135 "Link ID ADV Router Age Seq# CkSum Route",
6137 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6138 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6139 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6142 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
,
6145 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
6148 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
6149 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
6150 ospf_options_dump(lsa
->data
->options
));
6151 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
6152 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6153 ? "(Translated from Type-7)"
6156 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6157 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
6160 vty_out(vty
, " :%s%s%s%s",
6161 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR"
6163 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR"
6165 IS_ROUTER_LSA_VIRTUAL(rlsa
)
6168 IS_ROUTER_LSA_SHORTCUT(rlsa
)
6174 vty_out(vty
, " LS Type: %s\n",
6175 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6176 vty_out(vty
, " Link State ID: %pI4 %s\n",
6178 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
,
6180 vty_out(vty
, " Advertising Router: %pI4\n",
6181 &lsa
->data
->adv_router
);
6182 vty_out(vty
, " LS Seq Number: %08lx\n",
6183 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
6184 vty_out(vty
, " Checksum: 0x%04x\n",
6185 ntohs(lsa
->data
->checksum
));
6186 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
6191 snprintf(seqnum
, 10, "%x", ntohl(lsa
->data
->ls_seqnum
));
6192 snprintf(checksum
, 10, "%x", ntohs(lsa
->data
->checksum
));
6194 json_object_int_add(json
, "lsaAge", LS_AGE(lsa
));
6195 json_object_string_add(json
, "options",
6196 ospf_options_dump(lsa
->data
->options
));
6197 json_object_int_add(json
, "lsaFlags", lsa
->flags
);
6199 if (lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6200 json_object_boolean_true_add(json
,
6201 "translatedFromType7");
6203 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6204 json_object_int_add(json
, "flags", rlsa
->flags
);
6207 if (IS_ROUTER_LSA_BORDER(rlsa
))
6208 json_object_boolean_true_add(json
,
6210 if (IS_ROUTER_LSA_EXTERNAL(rlsa
))
6211 json_object_boolean_true_add(json
,
6213 if (IS_ROUTER_LSA_VIRTUAL(rlsa
))
6214 json_object_boolean_true_add(
6215 json
, "vlEndpoint");
6216 if (IS_ROUTER_LSA_SHORTCUT(rlsa
))
6217 json_object_boolean_true_add(
6222 json_object_string_add(
6224 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6225 json_object_string_addf(json
, "linkStateId", "%pI4",
6227 json_object_string_addf(json
, "advertisingRouter", "%pI4",
6228 &lsa
->data
->adv_router
);
6229 json_object_string_add(json
, "lsaSeqNumber", seqnum
);
6230 json_object_string_add(json
, "checksum", checksum
);
6231 json_object_int_add(json
, "length", ntohs(lsa
->data
->length
));
6235 static const char *const link_type_desc
[] = {
6237 "another Router (point-to-point)",
6238 "a Transit Network",
6243 static const char *const link_id_desc
[] = {
6244 "(null)", "Neighboring Router ID", "Designated Router address",
6245 "Net", "Neighboring Router ID",
6248 static const char *const link_data_desc
[] = {
6249 "(null)", "Router Interface address", "Router Interface address",
6250 "Network Mask", "Router Interface address",
6253 static const char *const link_id_desc_json
[] = {
6254 "null", "neighborRouterId", "designatedRouterAddress",
6255 "networkAddress", "neighborRouterId",
6258 static const char *const link_data_desc_json
[] = {
6259 "null", "routerInterfaceAddress", "routerInterfaceAddress",
6260 "networkMask", "routerInterfaceAddress",
6263 /* Show router-LSA each Link information. */
6264 static void show_ip_ospf_database_router_links(struct vty
*vty
,
6265 struct router_lsa
*rl
,
6270 json_object
*json_links
= NULL
;
6271 json_object
*json_link
= NULL
;
6273 char buf
[PREFIX_STRLEN
];
6276 json_links
= json_object_new_object();
6278 len
= ntohs(rl
->header
.length
) - 4;
6279 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
6280 type
= rl
->link
[i
].type
;
6285 snprintf(link
, sizeof(link
), "link%u", i
);
6286 json_link
= json_object_new_object();
6287 json_object_string_add(json_link
, "linkType",
6288 link_type_desc
[type
]);
6289 json_object_string_add(json_link
,
6290 link_id_desc_json
[type
],
6292 &rl
->link
[i
].link_id
,
6294 json_object_string_add(
6295 json_link
, link_data_desc_json
[type
],
6296 inet_ntop(AF_INET
, &rl
->link
[i
].link_data
,
6298 json_object_int_add(json_link
, "numOfTosMetrics",
6300 json_object_int_add(json_link
, "tos0Metric",
6301 ntohs(rl
->link
[i
].metric
));
6302 json_object_object_add(json_links
, link
, json_link
);
6304 vty_out(vty
, " Link connected to: %s\n",
6305 link_type_desc
[type
]);
6306 vty_out(vty
, " (Link ID) %s: %pI4\n",
6308 &rl
->link
[i
].link_id
);
6309 vty_out(vty
, " (Link Data) %s: %pI4\n",
6310 link_data_desc
[type
],
6311 &rl
->link
[i
].link_data
);
6312 vty_out(vty
, " Number of TOS metrics: 0\n");
6313 vty_out(vty
, " TOS 0 Metric: %d\n",
6314 ntohs(rl
->link
[i
].metric
));
6319 json_object_object_add(json
, "routerLinks", json_links
);
6322 /* Show router-LSA detail information. */
6323 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6327 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
6329 show_ip_ospf_database_header(vty
, lsa
, json
);
6332 vty_out(vty
, " Number of Links: %d\n\n",
6335 json_object_int_add(json
, "numOfLinks",
6338 show_ip_ospf_database_router_links(vty
, rl
, json
);
6347 /* Show network-LSA detail information. */
6348 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6352 char buf
[PREFIX_STRLEN
];
6353 json_object
*json_attached_rt
= NULL
;
6354 json_object
*json_router
= NULL
;
6357 json_attached_rt
= json_object_new_object();
6360 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
6361 struct in_addr
*addr
;
6363 show_ip_ospf_database_header(vty
, lsa
, json
);
6366 vty_out(vty
, " Network Mask: /%d\n",
6367 ip_masklen(nl
->mask
));
6369 json_object_int_add(json
, "networkMask",
6370 ip_masklen(nl
->mask
));
6372 length
= lsa
->size
- OSPF_LSA_HEADER_SIZE
- 4;
6373 addr
= &nl
->routers
[0];
6374 for (i
= 0; length
> 0 && addr
;
6375 length
-= 4, addr
= &nl
->routers
[++i
])
6377 vty_out(vty
, " Attached Router: %pI4\n",
6381 json_router
= json_object_new_object();
6382 json_object_string_add(
6383 json_router
, "attachedRouterId",
6384 inet_ntop(AF_INET
, addr
, buf
,
6386 json_object_object_add(json_attached_rt
,
6387 inet_ntop(AF_INET
, addr
,
6395 json_object_object_add(json
, "attchedRouters",
6401 /* Show summary-LSA detail information. */
6402 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6406 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6408 show_ip_ospf_database_header(vty
, lsa
, json
);
6411 vty_out(vty
, " Network Mask: /%d\n",
6412 ip_masklen(sl
->mask
));
6413 vty_out(vty
, " TOS: 0 Metric: %d\n",
6414 GET_METRIC(sl
->metric
));
6417 json_object_int_add(json
, "networkMask",
6418 ip_masklen(sl
->mask
));
6419 json_object_int_add(json
, "tos0Metric",
6420 GET_METRIC(sl
->metric
));
6427 /* Show summary-ASBR-LSA detail information. */
6428 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6432 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6434 show_ip_ospf_database_header(vty
, lsa
, json
);
6437 vty_out(vty
, " Network Mask: /%d\n",
6438 ip_masklen(sl
->mask
));
6439 vty_out(vty
, " TOS: 0 Metric: %d\n",
6440 GET_METRIC(sl
->metric
));
6443 json_object_int_add(json
, "networkMask",
6444 ip_masklen(sl
->mask
));
6445 json_object_int_add(json
, "tos0Metric",
6446 GET_METRIC(sl
->metric
));
6453 /* Show AS-external-LSA detail information. */
6454 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6460 struct as_external_lsa
*al
=
6461 (struct as_external_lsa
*)lsa
->data
;
6463 show_ip_ospf_database_header(vty
, lsa
, json
);
6466 vty_out(vty
, " Network Mask: /%d\n",
6467 ip_masklen(al
->mask
));
6468 vty_out(vty
, " Metric Type: %s\n",
6469 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6470 ? "2 (Larger than any link state path)"
6472 vty_out(vty
, " TOS: 0\n");
6473 vty_out(vty
, " Metric: %d\n",
6474 GET_METRIC(al
->e
[0].metric
));
6475 vty_out(vty
, " Forward Address: %pI4\n",
6476 &al
->e
[0].fwd_addr
);
6478 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6479 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6481 json_object_int_add(json
, "networkMask",
6482 ip_masklen(al
->mask
));
6483 json_object_string_add(
6485 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6486 ? "E2 (Larger than any link state path)"
6488 json_object_int_add(json
, "tos", tos
);
6489 json_object_int_add(json
, "metric",
6490 GET_METRIC(al
->e
[0].metric
));
6491 json_object_string_addf(json
, "forwardAddress", "%pI4",
6492 &(al
->e
[0].fwd_addr
));
6493 json_object_int_add(
6494 json
, "externalRouteTag",
6495 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6502 /* Show AS-NSSA-LSA detail information. */
6503 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6509 struct as_external_lsa
*al
=
6510 (struct as_external_lsa
*)lsa
->data
;
6512 show_ip_ospf_database_header(vty
, lsa
, json
);
6515 vty_out(vty
, " Network Mask: /%d\n",
6516 ip_masklen(al
->mask
));
6517 vty_out(vty
, " Metric Type: %s\n",
6518 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6519 ? "2 (Larger than any link state path)"
6521 vty_out(vty
, " TOS: 0\n");
6522 vty_out(vty
, " Metric: %d\n",
6523 GET_METRIC(al
->e
[0].metric
));
6524 vty_out(vty
, " NSSA: Forward Address: %pI4\n",
6525 &al
->e
[0].fwd_addr
);
6527 " External Route Tag: %" ROUTE_TAG_PRI
6529 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6531 json_object_int_add(json
, "networkMask",
6532 ip_masklen(al
->mask
));
6533 json_object_string_add(
6535 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6536 ? "E2 (Larger than any link state path)"
6538 json_object_int_add(json
, "tos", tos
);
6539 json_object_int_add(json
, "metric",
6540 GET_METRIC(al
->e
[0].metric
));
6541 json_object_string_addf(json
, "nssaForwardAddress",
6542 "%pI4", &al
->e
[0].fwd_addr
);
6543 json_object_int_add(
6544 json
, "externalRouteTag",
6545 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6552 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
,
6558 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6562 show_ip_ospf_database_header(vty
, lsa
, json
);
6563 show_opaque_info_detail(vty
, lsa
, json
);
6570 int (*show_function
[])(struct vty
*, struct ospf_lsa
*, json_object
*) = {
6572 show_router_lsa_detail
,
6573 show_network_lsa_detail
,
6574 show_summary_lsa_detail
,
6575 show_summary_asbr_lsa_detail
,
6576 show_as_external_lsa_detail
,
6578 show_as_nssa_lsa_detail
, /* almost same as external */
6580 show_opaque_lsa_detail
,
6581 show_opaque_lsa_detail
,
6582 show_opaque_lsa_detail
,
6585 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6586 struct in_addr
*id
, struct in_addr
*adv_router
)
6588 memset(lp
, 0, sizeof(struct prefix_ls
));
6589 lp
->family
= AF_UNSPEC
;
6592 else if (adv_router
== NULL
) {
6593 lp
->prefixlen
= IPV4_MAX_BITLEN
;
6598 lp
->adv_router
= *adv_router
;
6602 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6603 struct in_addr
*id
, struct in_addr
*adv_router
,
6606 struct prefix_ls lp
;
6607 struct route_node
*rn
, *start
;
6608 struct ospf_lsa
*lsa
;
6609 json_object
*json_lsa
= NULL
;
6611 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6612 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6614 route_lock_node(start
);
6615 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6616 if ((lsa
= rn
->info
)) {
6618 json_lsa
= json_object_new_object();
6619 json_object_array_add(json
, json_lsa
);
6622 if (show_function
[lsa
->data
->type
] != NULL
)
6623 show_function
[lsa
->data
->type
](
6624 vty
, lsa
, json_lsa
);
6626 route_unlock_node(start
);
6630 /* Show detail LSA information
6631 -- if id is NULL then show all LSAs. */
6632 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6633 struct in_addr
*id
, struct in_addr
*adv_router
,
6636 struct listnode
*node
;
6637 struct ospf_area
*area
;
6638 char buf
[PREFIX_STRLEN
];
6639 json_object
*json_lsa_type
= NULL
;
6640 json_object
*json_areas
= NULL
;
6641 json_object
*json_lsa_array
= NULL
;
6644 json_lsa_type
= json_object_new_object();
6647 case OSPF_AS_EXTERNAL_LSA
:
6648 case OSPF_OPAQUE_AS_LSA
:
6650 vty_out(vty
, " %s \n\n",
6651 show_database_desc
[type
]);
6653 json_lsa_array
= json_object_new_array();
6655 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
,
6658 json_object_object_add(json
,
6659 show_database_desc_json
[type
],
6665 json_areas
= json_object_new_object();
6667 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6670 "\n %s (Area %s)\n\n",
6671 show_database_desc
[type
],
6672 ospf_area_desc_string(area
));
6674 json_lsa_array
= json_object_new_array();
6675 json_object_object_add(json_areas
,
6683 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6684 adv_router
, json_lsa_array
);
6688 json_object_object_add(json_lsa_type
, "areas",
6690 json_object_object_add(json
,
6691 show_database_desc_json
[type
],
6698 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6699 struct route_table
*rt
,
6700 struct in_addr
*adv_router
,
6703 char buf
[PREFIX_STRLEN
];
6704 struct route_node
*rn
;
6705 struct ospf_lsa
*lsa
;
6707 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6708 if ((lsa
= rn
->info
)) {
6709 json_object
*json_lsa
= NULL
;
6711 if (IPV4_ADDR_SAME(adv_router
,
6712 &lsa
->data
->adv_router
)) {
6713 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6716 json_lsa
= json_object_new_object();
6718 if (show_function
[lsa
->data
->type
] != NULL
)
6719 show_function
[lsa
->data
->type
](
6720 vty
, lsa
, json_lsa
);
6722 json_object_object_add(
6732 /* Show detail LSA information. */
6733 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6734 int type
, struct in_addr
*adv_router
,
6737 struct listnode
*node
;
6738 struct ospf_area
*area
;
6739 char buf
[PREFIX_STRLEN
];
6740 json_object
*json_lstype
= NULL
;
6741 json_object
*json_area
= NULL
;
6744 json_lstype
= json_object_new_object();
6747 case OSPF_AS_EXTERNAL_LSA
:
6748 case OSPF_OPAQUE_AS_LSA
:
6750 vty_out(vty
, " %s \n\n",
6751 show_database_desc
[type
]);
6753 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6754 adv_router
, json_lstype
);
6758 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6760 json_area
= json_object_new_object();
6763 "\n %s (Area %s)\n\n",
6764 show_database_desc
[type
],
6765 ospf_area_desc_string(area
));
6766 show_lsa_detail_adv_router_proc(vty
,
6767 AREA_LSDB(area
, type
),
6768 adv_router
, json_area
);
6771 json_object_object_add(json_lstype
,
6782 json_object_object_add(json
, show_database_desc
[type
],
6786 void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
, int self
,
6789 struct ospf_lsa
*lsa
;
6790 struct route_node
*rn
;
6791 struct ospf_area
*area
;
6792 struct listnode
*node
;
6793 char buf
[PREFIX_STRLEN
];
6794 json_object
*json_areas
= NULL
;
6795 json_object
*json_area
= NULL
;
6796 json_object
*json_lsa
= NULL
;
6798 json_object
*json_lsa_array
= NULL
;
6802 json_areas
= json_object_new_object();
6804 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6806 json_area
= json_object_new_object();
6808 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6811 case OSPF_AS_EXTERNAL_LSA
:
6812 case OSPF_OPAQUE_AS_LSA
:
6817 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6819 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6823 " %s (Area %s)\n\n",
6824 show_database_desc
[type
],
6825 ospf_area_desc_string(area
));
6826 vty_out(vty
, "%s\n",
6827 show_database_header
[type
]);
6830 json_object_new_array();
6831 json_object_object_add(
6833 show_database_desc_json
[type
],
6837 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
) {
6840 json_object_new_object();
6841 json_object_array_add(
6846 count
+= show_lsa_summary(
6847 vty
, lsa
, self
, json_lsa
);
6853 json_object_int_add(
6856 show_database_desc_count_json
6862 json_object_object_add(json_areas
,
6870 json_object_object_add(json
, "areas", json_areas
);
6872 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6875 case OSPF_AS_EXTERNAL_LSA
:
6876 case OSPF_OPAQUE_AS_LSA
:
6881 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6882 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6884 vty_out(vty
, " %s\n\n",
6885 show_database_desc
[type
]);
6886 vty_out(vty
, "%s\n",
6887 show_database_header
[type
]);
6889 json_lsa_array
= json_object_new_array();
6890 json_object_object_add(
6891 json
, show_database_desc_json
[type
],
6895 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
) {
6897 json_lsa
= json_object_new_object();
6898 json_object_array_add(json_lsa_array
,
6902 count
+= show_lsa_summary(vty
, lsa
, self
,
6909 json_object_int_add(
6911 show_database_desc_count_json
[type
],
6920 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
,
6923 struct route_node
*rn
;
6924 char buf
[PREFIX_STRLEN
];
6925 json_object
*json_maxage
= NULL
;
6928 vty_out(vty
, "\n MaxAge Link States:\n\n");
6930 json_maxage
= json_object_new_object();
6932 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6933 struct ospf_lsa
*lsa
;
6934 json_object
*json_lsa
= NULL
;
6936 if ((lsa
= rn
->info
) != NULL
) {
6938 vty_out(vty
, "Link type: %d\n",
6940 vty_out(vty
, "Link State ID: %pI4\n",
6942 vty_out(vty
, "Advertising Router: %pI4\n",
6943 &lsa
->data
->adv_router
);
6944 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6947 json_lsa
= json_object_new_object();
6948 json_object_int_add(json_lsa
, "linkType",
6950 json_object_string_addf(json_lsa
, "linkStateId",
6951 "%pI4", &lsa
->data
->id
);
6952 json_object_string_addf(
6953 json_lsa
, "advertisingRouter", "%pI4",
6954 &lsa
->data
->adv_router
);
6955 json_object_int_add(json_lsa
, "lsaLockCount",
6957 json_object_object_add(
6967 json_object_object_add(json
, "maxAgeLinkStates", json_maxage
);
6970 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6971 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6973 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6974 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6975 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6976 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6978 #define OSPF_LSA_TYPES_DESC \
6979 "ASBR summary link states\n" \
6980 "External link states\n" \
6981 "Network link states\n" \
6982 "Router link states\n" \
6983 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6984 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6985 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6987 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6988 int arg_base
, int argc
,
6989 struct cmd_token
**argv
,
6990 uint8_t use_vrf
, json_object
*json
,
6995 struct in_addr id
, adv_router
;
6996 json_object
*json_vrf
= NULL
;
7000 json_vrf
= json_object_new_object();
7005 if (ospf
->instance
) {
7007 json_object_int_add(json_vrf
, "ospfInstance",
7010 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7013 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7015 /* Show Router ID. */
7017 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7020 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7025 if ((argc
== arg_base
+ 4) || (uj
&& (argc
== arg_base
+ 5))) {
7026 show_ip_ospf_database_summary(vty
, ospf
, 0, json_vrf
);
7029 json_object_object_add(
7030 json
, ospf_get_name(ospf
), json_vrf
);
7035 /* Set database type to show. */
7036 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7037 type
= OSPF_ROUTER_LSA
;
7038 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7039 type
= OSPF_NETWORK_LSA
;
7040 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7041 type
= OSPF_AS_NSSA_LSA
;
7042 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
7043 type
= OSPF_SUMMARY_LSA
;
7044 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7045 type
= OSPF_ASBR_SUMMARY_LSA
;
7046 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7047 type
= OSPF_AS_EXTERNAL_LSA
;
7048 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
7049 show_ip_ospf_database_summary(vty
, ospf
, 1, json_vrf
);
7052 json_object_object_add(
7053 json
, ospf_get_name(ospf
), json_vrf
);
7056 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
7057 show_ip_ospf_database_maxage(vty
, ospf
, json_vrf
);
7060 json_object_object_add(
7061 json
, ospf_get_name(ospf
), json_vrf
);
7064 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7065 type
= OSPF_OPAQUE_LINK_LSA
;
7066 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7067 type
= OSPF_OPAQUE_AREA_LSA
;
7068 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7069 type
= OSPF_OPAQUE_AS_LSA
;
7073 /* `show ip ospf database LSA'. */
7074 if ((argc
== arg_base
+ 5) || (uj
&& (argc
== arg_base
+ 6)))
7075 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
, json_vrf
);
7076 else if (argc
>= arg_base
+ 6) {
7077 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
7081 /* `show ip ospf database LSA ID'. */
7082 if ((argc
== arg_base
+ 6) || (uj
&& (argc
== arg_base
+ 7)))
7083 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
, json_vrf
);
7084 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
7085 else if ((argc
== arg_base
+ 7)
7086 || (uj
&& (argc
== arg_base
+ 8))) {
7087 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
7088 adv_router
= ospf
->router_id
;
7090 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
7095 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
,
7102 json_object_object_add(json
, ospf_get_name(ospf
),
7109 DEFUN (show_ip_ospf_database_max
,
7110 show_ip_ospf_database_max_cmd
,
7111 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate> [json]",
7114 "OSPF information\n"
7117 "Database summary\n"
7118 "LSAs in MaxAge list\n"
7119 "Self-originated link states\n"
7122 struct ospf
*ospf
= NULL
;
7123 struct listnode
*node
= NULL
;
7124 char *vrf_name
= NULL
;
7125 bool all_vrf
= false;
7126 int ret
= CMD_SUCCESS
;
7129 uint8_t use_vrf
= 0;
7130 bool uj
= use_json(argc
, argv
);
7131 json_object
*json
= NULL
;
7134 json
= json_object_new_object();
7136 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7139 bool ospf_output
= false;
7144 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7145 if (!ospf
->oi_running
)
7148 ret
= show_ip_ospf_database_common(
7149 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
7154 vty_out(vty
, "%% OSPF is not enabled\n");
7156 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7157 if (ospf
== NULL
|| !ospf
->oi_running
) {
7159 "%% OSPF is not enabled in vrf %s\n",
7163 ret
= (show_ip_ospf_database_common(
7164 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
, use_vrf
,
7168 /* Display default ospf (instance 0) info */
7169 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7170 if (ospf
== NULL
|| !ospf
->oi_running
) {
7171 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
7175 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
7180 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7181 json_object_free(json
);
7187 ALIAS (show_ip_ospf_database_max
,
7188 show_ip_ospf_database_cmd
,
7189 "show ip ospf [vrf <NAME|all>] 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>]]] [json]",
7192 "OSPF information\n"
7195 "Database summary\n"
7197 "Link State ID (as an IP address)\n"
7198 "Self-originated link states\n"
7199 "Advertising Router link states\n"
7200 "Advertising Router (as an IP address)\n"
7203 DEFUN (show_ip_ospf_instance_database_max
,
7204 show_ip_ospf_instance_database_max_cmd
,
7205 "show ip ospf (1-65535) database <max-age|self-originate> [json]",
7208 "OSPF information\n"
7210 "Database summary\n"
7211 "LSAs in MaxAge list\n"
7212 "Self-originated link states\n"
7217 unsigned short instance
= 0;
7218 bool uj
= use_json(argc
, argv
);
7219 json_object
*json
= NULL
;
7222 json
= json_object_new_object();
7224 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7225 if (instance
!= ospf_instance
)
7226 return CMD_NOT_MY_INSTANCE
;
7228 ospf
= ospf_lookup_instance(instance
);
7229 if (!ospf
|| !ospf
->oi_running
)
7232 show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0, json
, uj
);
7235 vty_json(vty
, json
);
7240 ALIAS (show_ip_ospf_instance_database_max
,
7241 show_ip_ospf_instance_database_cmd
,
7242 "show ip ospf (1-65535) 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>]]] [json]",
7245 "OSPF information\n"
7247 "Database summary\n"
7249 "Link State ID (as an IP address)\n"
7250 "Self-originated link states\n"
7251 "Advertising Router link states\n"
7252 "Advertising Router (as an IP address)\n"
7255 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
7257 int arg_base
, int argc
,
7258 struct cmd_token
**argv
,
7265 struct in_addr adv_router
;
7266 json_object
*json_vrf
= NULL
;
7270 json_vrf
= json_object_new_object();
7275 if (ospf
->instance
) {
7277 json_object_int_add(json
, "ospfInstance",
7280 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7283 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7285 /* Show Router ID. */
7287 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7290 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7294 /* Set database type to show. */
7295 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7296 type
= OSPF_ROUTER_LSA
;
7297 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7298 type
= OSPF_NETWORK_LSA
;
7299 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7300 type
= OSPF_AS_NSSA_LSA
;
7301 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
7302 type
= OSPF_SUMMARY_LSA
;
7303 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7304 type
= OSPF_ASBR_SUMMARY_LSA
;
7305 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7306 type
= OSPF_AS_EXTERNAL_LSA
;
7307 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7308 type
= OSPF_OPAQUE_LINK_LSA
;
7309 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7310 type
= OSPF_OPAQUE_AREA_LSA
;
7311 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7312 type
= OSPF_OPAQUE_AS_LSA
;
7316 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
7317 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
7318 adv_router
= ospf
->router_id
;
7320 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
7325 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
, json_vrf
);
7329 json_object_object_add(json
, ospf_get_name(ospf
),
7336 DEFUN (show_ip_ospf_database_type_adv_router
,
7337 show_ip_ospf_database_type_adv_router_cmd
,
7338 "show ip ospf [vrf <NAME|all>] database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate> [json]",
7341 "OSPF information\n"
7344 "Database summary\n"
7346 "Advertising Router link states\n"
7347 "Advertising Router (as an IP address)\n"
7348 "Self-originated link states\n"
7351 struct ospf
*ospf
= NULL
;
7352 struct listnode
*node
= NULL
;
7353 char *vrf_name
= NULL
;
7354 bool all_vrf
= false;
7355 int ret
= CMD_SUCCESS
;
7358 uint8_t use_vrf
= 0;
7359 bool uj
= use_json(argc
, argv
);
7360 json_object
*json
= NULL
;
7363 json
= json_object_new_object();
7365 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7368 bool ospf_output
= false;
7373 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7374 if (!ospf
->oi_running
)
7377 ret
= show_ip_ospf_database_type_adv_router_common(
7378 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
,
7382 vty_out(vty
, "%% OSPF is not enabled\n");
7384 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7385 if ((ospf
== NULL
) || !ospf
->oi_running
) {
7387 "%% OSPF is not enabled in vrf %s\n",
7392 ret
= show_ip_ospf_database_type_adv_router_common(
7393 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
, uj
);
7396 /* Display default ospf (instance 0) info */
7397 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7398 if (ospf
== NULL
|| !ospf
->oi_running
) {
7399 vty_out(vty
, "%% OSPF is not enabled on vrf default\n");
7403 ret
= show_ip_ospf_database_type_adv_router_common(
7404 vty
, ospf
, 0, argc
, argv
, use_vrf
, json
, uj
);
7408 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7409 json_object_free(json
);
7415 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
7416 show_ip_ospf_instance_database_type_adv_router_cmd
,
7417 "show ip ospf (1-65535) database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate> [json]",
7420 "OSPF information\n"
7422 "Database summary\n"
7424 "Advertising Router link states\n"
7425 "Advertising Router (as an IP address)\n"
7426 "Self-originated link states\n"
7431 unsigned short instance
= 0;
7432 bool uj
= use_json(argc
, argv
);
7433 json_object
*json
= NULL
;
7436 json
= json_object_new_object();
7438 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7439 if (instance
!= ospf_instance
)
7440 return CMD_NOT_MY_INSTANCE
;
7442 ospf
= ospf_lookup_instance(instance
);
7443 if (!ospf
|| !ospf
->oi_running
)
7446 show_ip_ospf_database_type_adv_router_common(vty
, ospf
, 1, argc
, argv
,
7450 vty_json(vty
, json
);
7455 DEFUN (ip_ospf_authentication_args
,
7456 ip_ospf_authentication_args_addr_cmd
,
7457 "ip ospf authentication <null|message-digest> [A.B.C.D]",
7459 "OSPF interface commands\n"
7460 "Enable authentication on this interface\n"
7461 "Use null authentication\n"
7462 "Use message-digest authentication\n"
7463 "Address of interface\n")
7465 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7466 int idx_encryption
= 3;
7468 struct in_addr addr
;
7470 struct ospf_if_params
*params
;
7472 params
= IF_DEF_PARAMS(ifp
);
7475 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7478 "Please specify interface address by A.B.C.D\n");
7479 return CMD_WARNING_CONFIG_FAILED
;
7482 params
= ospf_get_if_params(ifp
, addr
);
7483 ospf_if_update_params(ifp
, addr
);
7486 /* Handle null authentication */
7487 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7488 SET_IF_PARAM(params
, auth_type
);
7489 params
->auth_type
= OSPF_AUTH_NULL
;
7493 /* Handle message-digest authentication */
7494 if (argv
[idx_encryption
]->arg
[0] == 'm') {
7495 SET_IF_PARAM(params
, auth_type
);
7496 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7500 vty_out(vty
, "You shouldn't get here!\n");
7501 return CMD_WARNING_CONFIG_FAILED
;
7504 DEFUN (ip_ospf_authentication
,
7505 ip_ospf_authentication_addr_cmd
,
7506 "ip ospf authentication [A.B.C.D]",
7508 "OSPF interface commands\n"
7509 "Enable authentication on this interface\n"
7510 "Address of interface\n")
7512 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7514 struct in_addr addr
;
7516 struct ospf_if_params
*params
;
7518 params
= IF_DEF_PARAMS(ifp
);
7521 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7524 "Please specify interface address by A.B.C.D\n");
7525 return CMD_WARNING_CONFIG_FAILED
;
7528 params
= ospf_get_if_params(ifp
, addr
);
7529 ospf_if_update_params(ifp
, addr
);
7532 SET_IF_PARAM(params
, auth_type
);
7533 params
->auth_type
= OSPF_AUTH_SIMPLE
;
7538 DEFUN (no_ip_ospf_authentication_args
,
7539 no_ip_ospf_authentication_args_addr_cmd
,
7540 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
7543 "OSPF interface commands\n"
7544 "Enable authentication on this interface\n"
7545 "Use null authentication\n"
7546 "Use message-digest authentication\n"
7547 "Address of interface\n")
7549 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7550 int idx_encryption
= 4;
7552 struct in_addr addr
;
7554 struct ospf_if_params
*params
;
7555 struct route_node
*rn
;
7558 params
= IF_DEF_PARAMS(ifp
);
7561 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7564 "Please specify interface address by A.B.C.D\n");
7565 return CMD_WARNING_CONFIG_FAILED
;
7568 params
= ospf_lookup_if_params(ifp
, addr
);
7569 if (params
== NULL
) {
7570 vty_out(vty
, "Ip Address specified is unknown\n");
7571 return CMD_WARNING_CONFIG_FAILED
;
7573 params
->auth_type
= OSPF_AUTH_NOTSET
;
7574 UNSET_IF_PARAM(params
, auth_type
);
7575 if (params
!= IF_DEF_PARAMS(ifp
)) {
7576 ospf_free_if_params(ifp
, addr
);
7577 ospf_if_update_params(ifp
, addr
);
7580 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7581 auth_type
= OSPF_AUTH_NULL
;
7582 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
7583 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7585 vty_out(vty
, "Unexpected input encountered\n");
7586 return CMD_WARNING_CONFIG_FAILED
;
7589 * Here we have a case where the user has entered
7590 * 'no ip ospf authentication (null | message_digest )'
7591 * we need to find if we have any ip addresses underneath it
7593 * correspond to the associated type.
7595 if (params
->auth_type
== auth_type
) {
7596 params
->auth_type
= OSPF_AUTH_NOTSET
;
7597 UNSET_IF_PARAM(params
, auth_type
);
7600 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7601 rn
= route_next(rn
)) {
7602 if ((params
= rn
->info
)) {
7603 if (params
->auth_type
== auth_type
) {
7604 params
->auth_type
= OSPF_AUTH_NOTSET
;
7605 UNSET_IF_PARAM(params
, auth_type
);
7606 if (params
!= IF_DEF_PARAMS(ifp
)) {
7607 ospf_free_if_params(
7608 ifp
, rn
->p
.u
.prefix4
);
7609 ospf_if_update_params(
7610 ifp
, rn
->p
.u
.prefix4
);
7620 DEFUN (no_ip_ospf_authentication
,
7621 no_ip_ospf_authentication_addr_cmd
,
7622 "no ip ospf authentication [A.B.C.D]",
7625 "OSPF interface commands\n"
7626 "Enable authentication on this interface\n"
7627 "Address of interface\n")
7629 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7631 struct in_addr addr
;
7633 struct ospf_if_params
*params
;
7634 struct route_node
*rn
;
7636 params
= IF_DEF_PARAMS(ifp
);
7639 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7642 "Please specify interface address by A.B.C.D\n");
7643 return CMD_WARNING_CONFIG_FAILED
;
7646 params
= ospf_lookup_if_params(ifp
, addr
);
7647 if (params
== NULL
) {
7648 vty_out(vty
, "Ip Address specified is unknown\n");
7649 return CMD_WARNING_CONFIG_FAILED
;
7652 params
->auth_type
= OSPF_AUTH_NOTSET
;
7653 UNSET_IF_PARAM(params
, auth_type
);
7654 if (params
!= IF_DEF_PARAMS(ifp
)) {
7655 ospf_free_if_params(ifp
, addr
);
7656 ospf_if_update_params(ifp
, addr
);
7660 * When a user enters 'no ip ospf authentication'
7661 * We should remove all authentication types from
7664 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7665 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
7666 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
7667 params
->auth_type
= OSPF_AUTH_NOTSET
;
7668 UNSET_IF_PARAM(params
, auth_type
);
7671 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7672 rn
= route_next(rn
)) {
7673 if ((params
= rn
->info
)) {
7675 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7676 || (params
->auth_type
7677 == OSPF_AUTH_CRYPTOGRAPHIC
)
7678 || (params
->auth_type
7679 == OSPF_AUTH_SIMPLE
)) {
7680 params
->auth_type
= OSPF_AUTH_NOTSET
;
7681 UNSET_IF_PARAM(params
, auth_type
);
7682 if (params
!= IF_DEF_PARAMS(ifp
)) {
7683 ospf_free_if_params(
7684 ifp
, rn
->p
.u
.prefix4
);
7685 ospf_if_update_params(
7686 ifp
, rn
->p
.u
.prefix4
);
7697 DEFUN (ip_ospf_authentication_key
,
7698 ip_ospf_authentication_key_addr_cmd
,
7699 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
7701 "OSPF interface commands\n"
7702 "Authentication password (key)\n"
7703 "The OSPF password (key)\n"
7704 "Address of interface\n")
7706 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7708 struct in_addr addr
;
7709 struct ospf_if_params
*params
;
7711 params
= IF_DEF_PARAMS(ifp
);
7713 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7714 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7716 "Please specify interface address by A.B.C.D\n");
7717 return CMD_WARNING_CONFIG_FAILED
;
7720 params
= ospf_get_if_params(ifp
, addr
);
7721 ospf_if_update_params(ifp
, addr
);
7724 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
7725 sizeof(params
->auth_simple
));
7726 SET_IF_PARAM(params
, auth_simple
);
7731 DEFUN_HIDDEN (ospf_authentication_key
,
7732 ospf_authentication_key_cmd
,
7733 "ospf authentication-key AUTH_KEY [A.B.C.D]",
7734 "OSPF interface commands\n"
7735 VLINK_HELPSTR_AUTH_SIMPLE
7736 "Address of interface\n")
7738 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7741 DEFUN (no_ip_ospf_authentication_key
,
7742 no_ip_ospf_authentication_key_authkey_addr_cmd
,
7743 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7746 "OSPF interface commands\n"
7747 VLINK_HELPSTR_AUTH_SIMPLE
7748 "Address of interface\n")
7750 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7752 struct in_addr addr
;
7753 struct ospf_if_params
*params
;
7754 params
= IF_DEF_PARAMS(ifp
);
7756 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7757 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7759 "Please specify interface address by A.B.C.D\n");
7760 return CMD_WARNING_CONFIG_FAILED
;
7763 params
= ospf_lookup_if_params(ifp
, addr
);
7768 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
7769 UNSET_IF_PARAM(params
, auth_simple
);
7771 if (params
!= IF_DEF_PARAMS(ifp
)) {
7772 ospf_free_if_params(ifp
, addr
);
7773 ospf_if_update_params(ifp
, addr
);
7779 DEFUN_HIDDEN (no_ospf_authentication_key
,
7780 no_ospf_authentication_key_authkey_addr_cmd
,
7781 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7783 "OSPF interface commands\n"
7784 VLINK_HELPSTR_AUTH_SIMPLE
7785 "Address of interface\n")
7787 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7790 DEFUN (ip_ospf_message_digest_key
,
7791 ip_ospf_message_digest_key_cmd
,
7792 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7794 "OSPF interface commands\n"
7795 "Message digest authentication password (key)\n"
7797 "Use MD5 algorithm\n"
7798 "The OSPF password (key)\n"
7799 "Address of interface\n")
7801 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7802 struct crypt_key
*ck
;
7804 struct in_addr addr
;
7805 struct ospf_if_params
*params
;
7807 params
= IF_DEF_PARAMS(ifp
);
7810 argv_find(argv
, argc
, "(1-255)", &idx
);
7811 char *keyid
= argv
[idx
]->arg
;
7812 argv_find(argv
, argc
, "KEY", &idx
);
7813 char *cryptkey
= argv
[idx
]->arg
;
7815 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7816 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7818 "Please specify interface address by A.B.C.D\n");
7819 return CMD_WARNING_CONFIG_FAILED
;
7822 params
= ospf_get_if_params(ifp
, addr
);
7823 ospf_if_update_params(ifp
, addr
);
7826 key_id
= strtol(keyid
, NULL
, 10);
7828 /* Remove existing key, if any */
7829 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7831 ck
= ospf_crypt_key_new();
7832 ck
->key_id
= (uint8_t)key_id
;
7833 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7835 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7836 SET_IF_PARAM(params
, auth_crypt
);
7841 DEFUN_HIDDEN (ospf_message_digest_key
,
7842 ospf_message_digest_key_cmd
,
7843 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7844 "OSPF interface commands\n"
7845 "Message digest authentication password (key)\n"
7847 "Use MD5 algorithm\n"
7848 "The OSPF password (key)\n"
7849 "Address of interface\n")
7851 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7854 DEFUN (no_ip_ospf_message_digest_key
,
7855 no_ip_ospf_message_digest_key_cmd
,
7856 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7859 "OSPF interface commands\n"
7860 "Message digest authentication password (key)\n"
7862 "Use MD5 algorithm\n"
7863 "The OSPF password (key)\n"
7864 "Address of interface\n")
7866 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7868 struct crypt_key
*ck
;
7870 struct in_addr addr
;
7871 struct ospf_if_params
*params
;
7872 params
= IF_DEF_PARAMS(ifp
);
7874 argv_find(argv
, argc
, "(1-255)", &idx
);
7875 char *keyid
= argv
[idx
]->arg
;
7877 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7878 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7880 "Please specify interface address by A.B.C.D\n");
7881 return CMD_WARNING_CONFIG_FAILED
;
7884 params
= ospf_lookup_if_params(ifp
, addr
);
7889 key_id
= strtol(keyid
, NULL
, 10);
7890 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7892 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7893 return CMD_WARNING_CONFIG_FAILED
;
7896 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7898 if (params
!= IF_DEF_PARAMS(ifp
)) {
7899 ospf_free_if_params(ifp
, addr
);
7900 ospf_if_update_params(ifp
, addr
);
7906 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7907 no_ospf_message_digest_key_cmd
,
7908 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7910 "OSPF interface commands\n"
7911 "Message digest authentication password (key)\n"
7913 "Use MD5 algorithm\n"
7914 "The OSPF password (key)\n"
7915 "Address of interface\n")
7917 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7920 DEFUN (ip_ospf_cost
,
7922 "ip ospf cost (1-65535) [A.B.C.D]",
7924 "OSPF interface commands\n"
7927 "Address of interface\n")
7929 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7931 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7932 struct in_addr addr
;
7933 struct ospf_if_params
*params
;
7934 params
= IF_DEF_PARAMS(ifp
);
7937 char *coststr
= NULL
, *ifaddr
= NULL
;
7939 argv_find(argv
, argc
, "(1-65535)", &idx
);
7940 coststr
= argv
[idx
]->arg
;
7941 cost
= strtol(coststr
, NULL
, 10);
7943 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7945 if (!inet_aton(ifaddr
, &addr
)) {
7947 "Please specify interface address by A.B.C.D\n");
7948 return CMD_WARNING_CONFIG_FAILED
;
7951 params
= ospf_get_if_params(ifp
, addr
);
7952 ospf_if_update_params(ifp
, addr
);
7955 SET_IF_PARAM(params
, output_cost_cmd
);
7956 params
->output_cost_cmd
= cost
;
7958 ospf_if_recalculate_output_cost(ifp
);
7963 DEFUN_HIDDEN (ospf_cost
,
7965 "ospf cost (1-65535) [A.B.C.D]",
7966 "OSPF interface commands\n"
7969 "Address of interface\n")
7971 return ip_ospf_cost(self
, vty
, argc
, argv
);
7974 DEFUN (no_ip_ospf_cost
,
7975 no_ip_ospf_cost_cmd
,
7976 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7979 "OSPF interface commands\n"
7982 "Address of interface\n")
7984 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7986 struct in_addr addr
;
7987 struct ospf_if_params
*params
;
7989 params
= IF_DEF_PARAMS(ifp
);
7992 char *ifaddr
= NULL
;
7993 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7995 /* According to the semantics we are mimicking "no ip ospf cost N" is
7996 * always treated as "no ip ospf cost" regardless of the actual value
7997 * of N already configured for the interface. Thus ignore cost. */
8000 if (!inet_aton(ifaddr
, &addr
)) {
8002 "Please specify interface address by A.B.C.D\n");
8003 return CMD_WARNING_CONFIG_FAILED
;
8006 params
= ospf_lookup_if_params(ifp
, addr
);
8011 UNSET_IF_PARAM(params
, output_cost_cmd
);
8013 if (params
!= IF_DEF_PARAMS(ifp
)) {
8014 ospf_free_if_params(ifp
, addr
);
8015 ospf_if_update_params(ifp
, addr
);
8018 ospf_if_recalculate_output_cost(ifp
);
8023 DEFUN_HIDDEN (no_ospf_cost
,
8025 "no ospf cost [(1-65535)] [A.B.C.D]",
8027 "OSPF interface commands\n"
8030 "Address of interface\n")
8032 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
8035 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
8037 struct route_node
*rn
;
8038 struct ospf_neighbor
*nbr
;
8040 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
8046 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
8047 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8048 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8049 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8053 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
8054 const char *nbr_str
,
8055 const char *fast_hello_str
)
8057 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8060 struct in_addr addr
;
8062 struct ospf_if_params
*params
;
8063 struct ospf_interface
*oi
;
8064 struct route_node
*rn
;
8066 params
= IF_DEF_PARAMS(ifp
);
8069 ret
= inet_aton(nbr_str
, &addr
);
8072 "Please specify interface address by A.B.C.D\n");
8073 return CMD_WARNING_CONFIG_FAILED
;
8076 params
= ospf_get_if_params(ifp
, addr
);
8077 ospf_if_update_params(ifp
, addr
);
8081 seconds
= strtoul(interval_str
, NULL
, 10);
8083 /* reset fast_hello too, just to be sure */
8084 UNSET_IF_PARAM(params
, fast_hello
);
8085 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8086 } else if (fast_hello_str
) {
8087 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
8088 /* 1s dead-interval with sub-second hellos desired */
8089 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
8090 SET_IF_PARAM(params
, fast_hello
);
8091 params
->fast_hello
= hellomult
;
8094 "Please specify dead-interval or hello-multiplier\n");
8095 return CMD_WARNING_CONFIG_FAILED
;
8098 SET_IF_PARAM(params
, v_wait
);
8099 params
->v_wait
= seconds
;
8100 params
->is_v_wait_set
= true;
8102 /* Update timer values in neighbor structure. */
8104 struct ospf
*ospf
= NULL
;
8106 ospf
= ifp
->vrf
->info
;
8108 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8110 ospf_nbr_timer_update(oi
);
8113 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8114 if ((oi
= rn
->info
))
8115 ospf_nbr_timer_update(oi
);
8121 DEFUN (ip_ospf_dead_interval
,
8122 ip_ospf_dead_interval_cmd
,
8123 "ip ospf dead-interval (1-65535) [A.B.C.D]",
8125 "OSPF interface commands\n"
8126 "Interval time after which a neighbor is declared down\n"
8128 "Address of interface\n")
8131 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
8135 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
8136 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
8140 DEFUN_HIDDEN (ospf_dead_interval
,
8141 ospf_dead_interval_cmd
,
8142 "ospf dead-interval (1-65535) [A.B.C.D]",
8143 "OSPF interface commands\n"
8144 "Interval time after which a neighbor is declared down\n"
8146 "Address of interface\n")
8148 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8151 DEFUN (ip_ospf_dead_interval_minimal
,
8152 ip_ospf_dead_interval_minimal_addr_cmd
,
8153 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
8155 "OSPF interface commands\n"
8156 "Interval time after which a neighbor is declared down\n"
8157 "Minimal 1s dead-interval with fast sub-second hellos\n"
8158 "Hello multiplier factor\n"
8159 "Number of Hellos to send each second\n"
8160 "Address of interface\n")
8165 return ospf_vty_dead_interval_set(
8166 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
8168 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
8169 argv
[idx_number
]->arg
);
8172 DEFUN (no_ip_ospf_dead_interval
,
8173 no_ip_ospf_dead_interval_cmd
,
8174 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8177 "OSPF interface commands\n"
8178 "Interval time after which a neighbor is declared down\n"
8180 "Minimal 1s dead-interval with fast sub-second hellos\n"
8181 "Hello multiplier factor\n"
8182 "Number of Hellos to send each second\n"
8183 "Address of interface\n")
8185 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8186 int idx_ipv4
= argc
- 1;
8187 struct in_addr addr
= {.s_addr
= 0L};
8189 struct ospf_if_params
*params
;
8190 struct ospf_interface
*oi
;
8191 struct route_node
*rn
;
8193 params
= IF_DEF_PARAMS(ifp
);
8195 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
8196 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8199 "Please specify interface address by A.B.C.D\n");
8200 return CMD_WARNING_CONFIG_FAILED
;
8203 params
= ospf_lookup_if_params(ifp
, addr
);
8208 UNSET_IF_PARAM(params
, v_wait
);
8209 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8210 params
->is_v_wait_set
= false;
8212 UNSET_IF_PARAM(params
, fast_hello
);
8213 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8215 if (params
!= IF_DEF_PARAMS(ifp
)) {
8216 ospf_free_if_params(ifp
, addr
);
8217 ospf_if_update_params(ifp
, addr
);
8220 /* Update timer values in neighbor structure. */
8222 struct ospf
*ospf
= NULL
;
8224 ospf
= ifp
->vrf
->info
;
8226 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8228 ospf_nbr_timer_update(oi
);
8231 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8232 if ((oi
= rn
->info
))
8233 ospf_nbr_timer_update(oi
);
8239 DEFUN_HIDDEN (no_ospf_dead_interval
,
8240 no_ospf_dead_interval_cmd
,
8241 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8243 "OSPF interface commands\n"
8244 "Interval time after which a neighbor is declared down\n"
8246 "Minimal 1s dead-interval with fast sub-second hellos\n"
8247 "Hello multiplier factor\n"
8248 "Number of Hellos to send each second\n"
8249 "Address of interface\n")
8251 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8254 DEFUN (ip_ospf_hello_interval
,
8255 ip_ospf_hello_interval_cmd
,
8256 "ip ospf hello-interval (1-65535) [A.B.C.D]",
8258 "OSPF interface commands\n"
8259 "Time between HELLO packets\n"
8261 "Address of interface\n")
8263 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8265 struct in_addr addr
= {.s_addr
= 0L};
8266 struct ospf_if_params
*params
;
8267 params
= IF_DEF_PARAMS(ifp
);
8268 uint32_t seconds
= 0;
8269 bool is_addr
= false;
8270 uint32_t old_interval
= 0;
8272 argv_find(argv
, argc
, "(1-65535)", &idx
);
8273 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8275 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8276 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8278 "Please specify interface address by A.B.C.D\n");
8279 return CMD_WARNING_CONFIG_FAILED
;
8282 params
= ospf_get_if_params(ifp
, addr
);
8283 ospf_if_update_params(ifp
, addr
);
8287 old_interval
= params
->v_hello
;
8289 /* Return, if same interval is configured. */
8290 if (old_interval
== seconds
)
8293 SET_IF_PARAM(params
, v_hello
);
8294 params
->v_hello
= seconds
;
8296 if (!params
->is_v_wait_set
) {
8297 SET_IF_PARAM(params
, v_wait
);
8299 * The router dead interval should
8300 * be some multiple of the HelloInterval (perhaps 4 times the
8301 * hello interval) and must be the same for all routers
8302 * attached to a common network.
8304 params
->v_wait
= 4 * seconds
;
8307 ospf_reset_hello_timer(ifp
, addr
, is_addr
);
8312 DEFUN_HIDDEN (ospf_hello_interval
,
8313 ospf_hello_interval_cmd
,
8314 "ospf hello-interval (1-65535) [A.B.C.D]",
8315 "OSPF interface commands\n"
8316 "Time between HELLO packets\n"
8318 "Address of interface\n")
8320 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8323 DEFUN (no_ip_ospf_hello_interval
,
8324 no_ip_ospf_hello_interval_cmd
,
8325 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
8328 "OSPF interface commands\n"
8329 "Time between HELLO packets\n" // ignored
8331 "Address of interface\n")
8333 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8335 struct in_addr addr
= {.s_addr
= 0L};
8336 struct ospf_if_params
*params
;
8337 struct route_node
*rn
;
8339 params
= IF_DEF_PARAMS(ifp
);
8341 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8342 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8344 "Please specify interface address by A.B.C.D\n");
8345 return CMD_WARNING_CONFIG_FAILED
;
8348 params
= ospf_lookup_if_params(ifp
, addr
);
8353 UNSET_IF_PARAM(params
, v_hello
);
8354 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
8356 if (!params
->is_v_wait_set
) {
8357 UNSET_IF_PARAM(params
, v_wait
);
8358 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8361 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8362 struct ospf_interface
*oi
= rn
->info
;
8367 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8368 oi
->ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8370 if (oi
->state
> ISM_Down
) {
8371 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8372 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8376 if (params
!= IF_DEF_PARAMS(ifp
)) {
8377 ospf_free_if_params(ifp
, addr
);
8378 ospf_if_update_params(ifp
, addr
);
8384 DEFUN_HIDDEN (no_ospf_hello_interval
,
8385 no_ospf_hello_interval_cmd
,
8386 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
8388 "OSPF interface commands\n"
8389 "Time between HELLO packets\n" // ignored
8391 "Address of interface\n")
8393 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8396 DEFUN(ip_ospf_network
, ip_ospf_network_cmd
,
8397 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point [dmvpn]>",
8399 "OSPF interface commands\n"
8401 "Specify OSPF broadcast multi-access network\n"
8402 "Specify OSPF NBMA network\n"
8403 "Specify OSPF point-to-multipoint network\n"
8404 "Specify OSPF point-to-point network\n"
8405 "Specify OSPF point-to-point DMVPN network\n")
8407 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8409 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8410 uint8_t old_ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8411 struct route_node
*rn
;
8413 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
8415 "This is a loopback interface. Can't set network type.\n");
8416 return CMD_WARNING_CONFIG_FAILED
;
8419 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8421 if (argv_find(argv
, argc
, "broadcast", &idx
))
8422 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
8423 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
8424 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
8425 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
8426 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
8427 else if (argv_find(argv
, argc
, "point-to-point", &idx
)) {
8428 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
8429 if (argv_find(argv
, argc
, "dmvpn", &idx
))
8430 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 1;
8433 if (IF_DEF_PARAMS(ifp
)->type
== old_type
8434 && IF_DEF_PARAMS(ifp
)->ptp_dmvpn
== old_ptp_dmvpn
)
8437 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
8439 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8440 struct ospf_interface
*oi
= rn
->info
;
8445 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8447 if (oi
->state
> ISM_Down
) {
8448 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8449 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8456 DEFUN_HIDDEN (ospf_network
,
8458 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
8459 "OSPF interface commands\n"
8461 "Specify OSPF broadcast multi-access network\n"
8462 "Specify OSPF NBMA network\n"
8463 "Specify OSPF point-to-multipoint network\n"
8464 "Specify OSPF point-to-point network\n")
8466 return ip_ospf_network(self
, vty
, argc
, argv
);
8469 DEFUN (no_ip_ospf_network
,
8470 no_ip_ospf_network_cmd
,
8471 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8474 "OSPF interface commands\n"
8476 "Specify OSPF broadcast multi-access network\n"
8477 "Specify OSPF NBMA network\n"
8478 "Specify OSPF point-to-multipoint network\n"
8479 "Specify OSPF point-to-point network\n")
8481 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8482 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8483 struct route_node
*rn
;
8485 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
8486 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8488 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
8491 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8492 struct ospf_interface
*oi
= rn
->info
;
8497 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8499 if (oi
->state
> ISM_Down
) {
8500 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8501 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8508 DEFUN_HIDDEN (no_ospf_network
,
8509 no_ospf_network_cmd
,
8510 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8512 "OSPF interface commands\n"
8514 "Specify OSPF broadcast multi-access network\n"
8515 "Specify OSPF NBMA network\n"
8516 "Specify OSPF point-to-multipoint network\n"
8517 "Specify OSPF point-to-point network\n")
8519 return no_ip_ospf_network(self
, vty
, argc
, argv
);
8522 DEFUN (ip_ospf_priority
,
8523 ip_ospf_priority_cmd
,
8524 "ip ospf priority (0-255) [A.B.C.D]",
8526 "OSPF interface commands\n"
8529 "Address of interface\n")
8531 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8534 struct route_node
*rn
;
8535 struct in_addr addr
;
8536 struct ospf_if_params
*params
;
8537 params
= IF_DEF_PARAMS(ifp
);
8539 argv_find(argv
, argc
, "(0-255)", &idx
);
8540 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
8542 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8543 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8545 "Please specify interface address by A.B.C.D\n");
8546 return CMD_WARNING_CONFIG_FAILED
;
8549 params
= ospf_get_if_params(ifp
, addr
);
8550 ospf_if_update_params(ifp
, addr
);
8553 SET_IF_PARAM(params
, priority
);
8554 params
->priority
= priority
;
8556 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8557 struct ospf_interface
*oi
= rn
->info
;
8562 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8563 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8564 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8571 DEFUN_HIDDEN (ospf_priority
,
8573 "ospf priority (0-255) [A.B.C.D]",
8574 "OSPF interface commands\n"
8577 "Address of interface\n")
8579 return ip_ospf_priority(self
, vty
, argc
, argv
);
8582 DEFUN (no_ip_ospf_priority
,
8583 no_ip_ospf_priority_cmd
,
8584 "no ip ospf priority [(0-255) [A.B.C.D]]",
8587 "OSPF interface commands\n"
8588 "Router priority\n" // ignored
8590 "Address of interface\n")
8592 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8594 struct route_node
*rn
;
8595 struct in_addr addr
;
8596 struct ospf_if_params
*params
;
8598 params
= IF_DEF_PARAMS(ifp
);
8600 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8601 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8603 "Please specify interface address by A.B.C.D\n");
8604 return CMD_WARNING_CONFIG_FAILED
;
8607 params
= ospf_lookup_if_params(ifp
, addr
);
8612 UNSET_IF_PARAM(params
, priority
);
8613 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
8615 if (params
!= IF_DEF_PARAMS(ifp
)) {
8616 ospf_free_if_params(ifp
, addr
);
8617 ospf_if_update_params(ifp
, addr
);
8620 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8621 struct ospf_interface
*oi
= rn
->info
;
8626 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8627 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8628 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8635 DEFUN_HIDDEN (no_ospf_priority
,
8636 no_ospf_priority_cmd
,
8637 "no ospf priority [(0-255) [A.B.C.D]]",
8639 "OSPF interface commands\n"
8642 "Address of interface\n")
8644 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
8647 DEFUN (ip_ospf_retransmit_interval
,
8648 ip_ospf_retransmit_interval_addr_cmd
,
8649 "ip ospf retransmit-interval (1-65535) [A.B.C.D]",
8651 "OSPF interface commands\n"
8652 "Time between retransmitting lost link state advertisements\n"
8654 "Address of interface\n")
8656 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8659 struct in_addr addr
;
8660 struct ospf_if_params
*params
;
8661 params
= IF_DEF_PARAMS(ifp
);
8663 argv_find(argv
, argc
, "(1-65535)", &idx
);
8664 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8666 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8667 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8669 "Please specify interface address by A.B.C.D\n");
8670 return CMD_WARNING_CONFIG_FAILED
;
8673 params
= ospf_get_if_params(ifp
, addr
);
8674 ospf_if_update_params(ifp
, addr
);
8677 SET_IF_PARAM(params
, retransmit_interval
);
8678 params
->retransmit_interval
= seconds
;
8683 DEFUN_HIDDEN (ospf_retransmit_interval
,
8684 ospf_retransmit_interval_cmd
,
8685 "ospf retransmit-interval (1-65535) [A.B.C.D]",
8686 "OSPF interface commands\n"
8687 "Time between retransmitting lost link state advertisements\n"
8689 "Address of interface\n")
8691 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8694 DEFUN (no_ip_ospf_retransmit_interval
,
8695 no_ip_ospf_retransmit_interval_addr_cmd
,
8696 "no ip ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8699 "OSPF interface commands\n"
8700 "Time between retransmitting lost link state advertisements\n"
8702 "Address of interface\n")
8704 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8706 struct in_addr addr
;
8707 struct ospf_if_params
*params
;
8709 params
= IF_DEF_PARAMS(ifp
);
8711 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8712 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8714 "Please specify interface address by A.B.C.D\n");
8715 return CMD_WARNING_CONFIG_FAILED
;
8718 params
= ospf_lookup_if_params(ifp
, addr
);
8723 UNSET_IF_PARAM(params
, retransmit_interval
);
8724 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
8726 if (params
!= IF_DEF_PARAMS(ifp
)) {
8727 ospf_free_if_params(ifp
, addr
);
8728 ospf_if_update_params(ifp
, addr
);
8734 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
8735 no_ospf_retransmit_interval_cmd
,
8736 "no ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8738 "OSPF interface commands\n"
8739 "Time between retransmitting lost link state advertisements\n"
8741 "Address of interface\n")
8743 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8746 DEFUN (ip_ospf_transmit_delay
,
8747 ip_ospf_transmit_delay_addr_cmd
,
8748 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
8750 "OSPF interface commands\n"
8751 "Link state transmit delay\n"
8753 "Address of interface\n")
8755 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8758 struct in_addr addr
;
8759 struct ospf_if_params
*params
;
8761 params
= IF_DEF_PARAMS(ifp
);
8762 argv_find(argv
, argc
, "(1-65535)", &idx
);
8763 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8765 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8766 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8768 "Please specify interface address by A.B.C.D\n");
8769 return CMD_WARNING_CONFIG_FAILED
;
8772 params
= ospf_get_if_params(ifp
, addr
);
8773 ospf_if_update_params(ifp
, addr
);
8776 SET_IF_PARAM(params
, transmit_delay
);
8777 params
->transmit_delay
= seconds
;
8782 DEFUN_HIDDEN (ospf_transmit_delay
,
8783 ospf_transmit_delay_cmd
,
8784 "ospf transmit-delay (1-65535) [A.B.C.D]",
8785 "OSPF interface commands\n"
8786 "Link state transmit delay\n"
8788 "Address of interface\n")
8790 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8793 DEFUN (no_ip_ospf_transmit_delay
,
8794 no_ip_ospf_transmit_delay_addr_cmd
,
8795 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
8798 "OSPF interface commands\n"
8799 "Link state transmit delay\n"
8801 "Address of interface\n")
8803 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8805 struct in_addr addr
;
8806 struct ospf_if_params
*params
;
8808 params
= IF_DEF_PARAMS(ifp
);
8810 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8811 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8813 "Please specify interface address by A.B.C.D\n");
8814 return CMD_WARNING_CONFIG_FAILED
;
8817 params
= ospf_lookup_if_params(ifp
, addr
);
8822 UNSET_IF_PARAM(params
, transmit_delay
);
8823 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
8825 if (params
!= IF_DEF_PARAMS(ifp
)) {
8826 ospf_free_if_params(ifp
, addr
);
8827 ospf_if_update_params(ifp
, addr
);
8834 DEFUN_HIDDEN (no_ospf_transmit_delay
,
8835 no_ospf_transmit_delay_cmd
,
8836 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
8838 "OSPF interface commands\n"
8839 "Link state transmit delay\n"
8841 "Address of interface\n")
8843 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8846 DEFUN (ip_ospf_area
,
8848 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8850 "OSPF interface commands\n"
8852 "Enable OSPF on this interface\n"
8853 "OSPF area ID in IP address format\n"
8854 "OSPF area ID as a decimal value\n"
8855 "Address of interface\n")
8857 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8860 struct in_addr area_id
;
8861 struct in_addr addr
;
8862 struct ospf_if_params
*params
= NULL
;
8863 struct route_node
*rn
;
8864 struct ospf
*ospf
= NULL
;
8865 unsigned short instance
= 0;
8869 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8870 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8872 argv_find(argv
, argc
, "area", &idx
);
8873 areaid
= argv
[idx
+ 1]->arg
;
8876 ospf
= ifp
->vrf
->info
;
8878 ospf
= ospf_lookup_instance(instance
);
8880 if (instance
&& instance
!= ospf_instance
) {
8882 * At this point we know we have received
8883 * an instance and there is no ospf instance
8884 * associated with it. This means we are
8885 * in a situation where we have an
8886 * ospf command that is setup for a different
8887 * process(instance). We need to safely
8888 * remove the command from ourselves and
8889 * allow the other instance(process) handle
8890 * the configuration command.
8894 params
= IF_DEF_PARAMS(ifp
);
8895 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8896 UNSET_IF_PARAM(params
, if_area
);
8900 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
; rn
= route_next(rn
))
8901 if ((params
= rn
->info
) && OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8902 UNSET_IF_PARAM(params
, if_area
);
8907 ospf
= ifp
->vrf
->info
;
8909 ospf_interface_area_unset(ospf
, ifp
);
8912 return CMD_NOT_MY_INSTANCE
;
8915 ret
= str2area_id(areaid
, &area_id
, &format
);
8917 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8918 return CMD_WARNING_CONFIG_FAILED
;
8920 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8921 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8922 return CMD_WARNING_CONFIG_FAILED
;
8926 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8927 if (rn
->info
!= NULL
) {
8929 "Please remove all network commands first.\n");
8930 return CMD_WARNING_CONFIG_FAILED
;
8935 params
= IF_DEF_PARAMS(ifp
);
8936 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8937 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8939 "Must remove previous area config before changing ospf area \n");
8940 return CMD_WARNING_CONFIG_FAILED
;
8943 // Check if we have an address arg and proccess it
8944 if (argc
== idx
+ 3) {
8945 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8947 "Please specify Intf Address by A.B.C.D\n");
8948 return CMD_WARNING_CONFIG_FAILED
;
8950 // update/create address-level params
8951 params
= ospf_get_if_params((ifp
), (addr
));
8952 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8953 if (!IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8955 "Must remove previous area/address config before changing ospf area\n");
8956 return CMD_WARNING_CONFIG_FAILED
;
8960 ospf_if_update_params((ifp
), (addr
));
8963 /* enable ospf on this interface with area_id */
8965 SET_IF_PARAM(params
, if_area
);
8966 params
->if_area
= area_id
;
8967 params
->if_area_id_fmt
= format
;
8971 ospf_interface_area_set(ospf
, ifp
);
8976 DEFUN (no_ip_ospf_area
,
8977 no_ip_ospf_area_cmd
,
8978 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8981 "OSPF interface commands\n"
8983 "Disable OSPF on this interface\n"
8984 "OSPF area ID in IP address format\n"
8985 "OSPF area ID as a decimal value\n"
8986 "Address of interface\n")
8988 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8991 struct ospf_if_params
*params
;
8992 unsigned short instance
= 0;
8993 struct in_addr addr
;
8994 struct in_addr area_id
;
8996 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8997 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
9000 ospf
= ifp
->vrf
->info
;
9002 ospf
= ospf_lookup_instance(instance
);
9004 if (instance
&& instance
!= ospf_instance
)
9005 return CMD_NOT_MY_INSTANCE
;
9007 argv_find(argv
, argc
, "area", &idx
);
9009 // Check if we have an address arg and proccess it
9010 if (argc
== idx
+ 3) {
9011 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
9013 "Please specify Intf Address by A.B.C.D\n");
9014 return CMD_WARNING_CONFIG_FAILED
;
9016 params
= ospf_lookup_if_params(ifp
, addr
);
9017 if ((params
) == NULL
)
9020 params
= IF_DEF_PARAMS(ifp
);
9022 area_id
= params
->if_area
;
9023 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9025 "Can't find specified interface area configuration.\n");
9026 return CMD_WARNING_CONFIG_FAILED
;
9029 UNSET_IF_PARAM(params
, if_area
);
9030 if (params
!= IF_DEF_PARAMS((ifp
))) {
9031 ospf_free_if_params((ifp
), (addr
));
9032 ospf_if_update_params((ifp
), (addr
));
9036 ospf_interface_area_unset(ospf
, ifp
);
9037 ospf_area_check_free(ospf
, area_id
);
9043 DEFUN (ip_ospf_passive
,
9044 ip_ospf_passive_cmd
,
9045 "ip ospf passive [A.B.C.D]",
9047 "OSPF interface commands\n"
9048 "Suppress routing updates on an interface\n"
9049 "Address of interface\n")
9051 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9053 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9054 struct ospf_if_params
*params
;
9058 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9061 "Please specify interface address by A.B.C.D\n");
9062 return CMD_WARNING_CONFIG_FAILED
;
9064 params
= ospf_get_if_params(ifp
, addr
);
9065 ospf_if_update_params(ifp
, addr
);
9067 params
= IF_DEF_PARAMS(ifp
);
9070 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_PASSIVE
);
9075 DEFUN (no_ip_ospf_passive
,
9076 no_ip_ospf_passive_cmd
,
9077 "no ip ospf passive [A.B.C.D]",
9080 "OSPF interface commands\n"
9081 "Enable routing updates on an interface\n"
9082 "Address of interface\n")
9084 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9086 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9087 struct ospf_if_params
*params
;
9091 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9094 "Please specify interface address by A.B.C.D\n");
9095 return CMD_WARNING_CONFIG_FAILED
;
9097 params
= ospf_lookup_if_params(ifp
, addr
);
9101 params
= IF_DEF_PARAMS(ifp
);
9104 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_ACTIVE
);
9109 DEFUN (ospf_redistribute_source
,
9110 ospf_redistribute_source_cmd
,
9111 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9113 FRR_REDIST_HELP_STR_OSPFD
9114 "Metric for redistributed routes\n"
9115 "OSPF default metric\n"
9116 "OSPF exterior metric type for redistributed routes\n"
9117 "Set OSPF External Type 1/2 metrics\n"
9118 "Route map reference\n"
9119 "Pointer to route-map entries\n")
9121 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9122 int idx_protocol
= 1;
9126 struct ospf_redist
*red
;
9128 bool update
= false;
9130 /* Get distribute source. */
9131 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9133 return CMD_WARNING_CONFIG_FAILED
;
9135 /* Get metric value. */
9136 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9137 if (!str2metric(argv
[idx
]->arg
, &metric
))
9138 return CMD_WARNING_CONFIG_FAILED
;
9141 /* Get metric type. */
9142 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9143 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9144 return CMD_WARNING_CONFIG_FAILED
;
9148 red
= ospf_redist_lookup(ospf
, source
, 0);
9150 red
= ospf_redist_add(ospf
, source
, 0);
9155 if (argv_find(argv
, argc
, "route-map", &idx
)) {
9156 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
9158 ospf_routemap_unset(red
);
9161 return ospf_redistribute_update(ospf
, red
, source
, 0, type
,
9164 return ospf_redistribute_set(ospf
, red
, source
, 0, type
,
9168 DEFUN (no_ospf_redistribute_source
,
9169 no_ospf_redistribute_source_cmd
,
9170 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9173 FRR_REDIST_HELP_STR_OSPFD
9174 "Metric for redistributed routes\n"
9175 "OSPF default metric\n"
9176 "OSPF exterior metric type for redistributed routes\n"
9177 "Set OSPF External Type 1/2 metrics\n"
9178 "Route map reference\n"
9179 "Pointer to route-map entries\n")
9181 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9182 int idx_protocol
= 2;
9184 struct ospf_redist
*red
;
9186 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9188 return CMD_WARNING_CONFIG_FAILED
;
9190 red
= ospf_redist_lookup(ospf
, source
, 0);
9194 ospf_routemap_unset(red
);
9195 ospf_redist_del(ospf
, source
, 0);
9197 return ospf_redistribute_unset(ospf
, source
, 0);
9200 DEFUN (ospf_redistribute_instance_source
,
9201 ospf_redistribute_instance_source_cmd
,
9202 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9204 "Open Shortest Path First\n"
9205 "Non-main Kernel Routing Table\n"
9206 "Instance ID/Table ID\n"
9207 "Metric for redistributed routes\n"
9208 "OSPF default metric\n"
9209 "OSPF exterior metric type for redistributed routes\n"
9210 "Set OSPF External Type 1/2 metrics\n"
9211 "Route map reference\n"
9212 "Pointer to route-map entries\n")
9214 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9215 int idx_ospf_table
= 1;
9221 unsigned short instance
;
9222 struct ospf_redist
*red
;
9223 bool update
= false;
9225 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
9228 vty_out(vty
, "Unknown instance redistribution\n");
9229 return CMD_WARNING_CONFIG_FAILED
;
9232 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9234 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9236 "Instance redistribution in non-instanced OSPF not allowed\n");
9237 return CMD_WARNING_CONFIG_FAILED
;
9240 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9241 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9242 return CMD_WARNING_CONFIG_FAILED
;
9245 /* Get metric value. */
9246 if (argv_find(argv
, argc
, "metric", &idx
))
9247 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
9248 return CMD_WARNING_CONFIG_FAILED
;
9251 /* Get metric type. */
9252 if (argv_find(argv
, argc
, "metric-type", &idx
))
9253 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
9254 return CMD_WARNING_CONFIG_FAILED
;
9256 red
= ospf_redist_lookup(ospf
, source
, instance
);
9258 red
= ospf_redist_add(ospf
, source
, instance
);
9263 if (argv_find(argv
, argc
, "route-map", &idx
))
9264 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
9266 ospf_routemap_unset(red
);
9269 return ospf_redistribute_update(ospf
, red
, source
, instance
,
9272 return ospf_redistribute_set(ospf
, red
, source
, instance
, type
,
9276 DEFUN (no_ospf_redistribute_instance_source
,
9277 no_ospf_redistribute_instance_source_cmd
,
9278 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9281 "Open Shortest Path First\n"
9282 "Non-main Kernel Routing Table\n"
9283 "Instance ID/Table Id\n"
9284 "Metric for redistributed routes\n"
9285 "OSPF default metric\n"
9286 "OSPF exterior metric type for redistributed routes\n"
9287 "Set OSPF External Type 1/2 metrics\n"
9288 "Route map reference\n"
9289 "Pointer to route-map entries\n")
9291 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9292 int idx_ospf_table
= 2;
9294 unsigned int instance
;
9295 struct ospf_redist
*red
;
9298 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9299 source
= ZEBRA_ROUTE_OSPF
;
9301 source
= ZEBRA_ROUTE_TABLE
;
9303 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9305 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9307 "Instance redistribution in non-instanced OSPF not allowed\n");
9308 return CMD_WARNING_CONFIG_FAILED
;
9311 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9312 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9313 return CMD_WARNING_CONFIG_FAILED
;
9316 red
= ospf_redist_lookup(ospf
, source
, instance
);
9320 ospf_routemap_unset(red
);
9321 ospf_redist_del(ospf
, source
, instance
);
9323 return ospf_redistribute_unset(ospf
, source
, instance
);
9326 DEFUN (ospf_distribute_list_out
,
9327 ospf_distribute_list_out_cmd
,
9328 "distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9329 "Filter networks in routing updates\n"
9330 "Access-list name\n"
9332 FRR_REDIST_HELP_STR_OSPFD
)
9334 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9338 char *proto
= argv
[argc
- 1]->text
;
9340 /* Get distribute source. */
9341 source
= proto_redistnum(AFI_IP
, proto
);
9343 return CMD_WARNING_CONFIG_FAILED
;
9345 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
9348 DEFUN (no_ospf_distribute_list_out
,
9349 no_ospf_distribute_list_out_cmd
,
9350 "no distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9352 "Filter networks in routing updates\n"
9353 "Access-list name\n"
9355 FRR_REDIST_HELP_STR_OSPFD
)
9357 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9361 char *proto
= argv
[argc
- 1]->text
;
9362 source
= proto_redistnum(AFI_IP
, proto
);
9364 return CMD_WARNING_CONFIG_FAILED
;
9366 return ospf_distribute_list_out_unset(ospf
, source
,
9367 argv
[idx_word
]->arg
);
9370 /* Default information originate. */
9371 DEFUN (ospf_default_information_originate
,
9372 ospf_default_information_originate_cmd
,
9373 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9374 "Control distribution of default information\n"
9375 "Distribute a default route\n"
9376 "Always advertise default route\n"
9377 "OSPF default metric\n"
9379 "OSPF metric type for default routes\n"
9380 "Set OSPF External Type 1/2 metrics\n"
9381 "Route map reference\n"
9382 "Pointer to route-map entries\n")
9384 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9385 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
9388 struct ospf_redist
*red
;
9390 int cur_originate
= ospf
->default_originate
;
9391 bool sameRtmap
= false;
9394 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
9396 /* Check whether "always" was specified */
9397 if (argv_find(argv
, argc
, "always", &idx
))
9398 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
9400 /* Get metric value */
9401 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9402 if (!str2metric(argv
[idx
]->arg
, &metric
))
9403 return CMD_WARNING_CONFIG_FAILED
;
9406 /* Get metric type. */
9407 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9408 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9409 return CMD_WARNING_CONFIG_FAILED
;
9413 if (argv_find(argv
, argc
, "route-map", &idx
))
9414 rtmap
= argv
[idx
+ 1]->arg
;
9416 /* To check if user is providing same route map */
9417 if ((!rtmap
&& !ROUTEMAP_NAME(red
)) ||
9418 (rtmap
&& ROUTEMAP_NAME(red
) &&
9419 (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
9422 /* Don't allow if the same lsa is already originated. */
9424 && (red
->dmetric
.type
== type
)
9425 && (red
->dmetric
.value
== metric
)
9426 && (cur_originate
== default_originate
))
9429 /* Updating Metric details */
9430 red
->dmetric
.type
= type
;
9431 red
->dmetric
.value
= metric
;
9433 /* updating route map details */
9435 ospf_routemap_set(red
, rtmap
);
9437 ospf_routemap_unset(red
);
9439 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
9443 DEFUN (no_ospf_default_information_originate
,
9444 no_ospf_default_information_originate_cmd
,
9445 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map RMAP_NAME}]",
9447 "Control distribution of default information\n"
9448 "Distribute a default route\n"
9449 "Always advertise default route\n"
9450 "OSPF default metric\n"
9452 "OSPF metric type for default routes\n"
9453 "Set OSPF External Type 1/2 metrics\n"
9454 "Route map reference\n"
9455 "Pointer to route-map entries\n")
9457 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9458 struct ospf_redist
*red
;
9460 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
9464 ospf_routemap_unset(red
);
9465 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
9467 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
9471 DEFUN (ospf_default_metric
,
9472 ospf_default_metric_cmd
,
9473 "default-metric (0-16777214)",
9474 "Set metric of redistributed routes\n"
9477 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9481 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
9482 return CMD_WARNING_CONFIG_FAILED
;
9484 ospf
->default_metric
= metric
;
9489 DEFUN (no_ospf_default_metric
,
9490 no_ospf_default_metric_cmd
,
9491 "no default-metric [(0-16777214)]",
9493 "Set metric of redistributed routes\n"
9496 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9498 ospf
->default_metric
= -1;
9504 DEFUN (ospf_distance
,
9507 "Administrative distance\n"
9508 "OSPF Administrative distance\n")
9510 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9514 distance
= atoi(argv
[idx_number
]->arg
);
9515 if (ospf
->distance_all
!= distance
) {
9516 ospf
->distance_all
= distance
;
9517 ospf_restart_spf(ospf
);
9523 DEFUN (no_ospf_distance
,
9524 no_ospf_distance_cmd
,
9525 "no distance (1-255)",
9527 "Administrative distance\n"
9528 "OSPF Administrative distance\n")
9530 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9532 if (ospf
->distance_all
) {
9533 ospf
->distance_all
= 0;
9534 ospf_restart_spf(ospf
);
9540 DEFUN (no_ospf_distance_ospf
,
9541 no_ospf_distance_ospf_cmd
,
9542 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
9544 "Administrative distance\n"
9545 "OSPF administrative distance\n"
9546 "Intra-area routes\n"
9547 "Distance for intra-area routes\n"
9548 "Inter-area routes\n"
9549 "Distance for inter-area routes\n"
9551 "Distance for external routes\n")
9553 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9556 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
9557 idx
= ospf
->distance_intra
= 0;
9558 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
9559 idx
= ospf
->distance_inter
= 0;
9560 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
9561 ospf
->distance_external
= 0;
9566 DEFUN (ospf_distance_ospf
,
9567 ospf_distance_ospf_cmd
,
9568 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
9569 "Administrative distance\n"
9570 "OSPF administrative distance\n"
9571 "Intra-area routes\n"
9572 "Distance for intra-area routes\n"
9573 "Inter-area routes\n"
9574 "Distance for inter-area routes\n"
9576 "Distance for external routes\n")
9578 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9581 ospf
->distance_intra
= 0;
9582 ospf
->distance_inter
= 0;
9583 ospf
->distance_external
= 0;
9585 if (argv_find(argv
, argc
, "intra-area", &idx
))
9586 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
9588 if (argv_find(argv
, argc
, "inter-area", &idx
))
9589 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
9591 if (argv_find(argv
, argc
, "external", &idx
))
9592 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
9597 DEFUN (ip_ospf_mtu_ignore
,
9598 ip_ospf_mtu_ignore_addr_cmd
,
9599 "ip ospf mtu-ignore [A.B.C.D]",
9601 "OSPF interface commands\n"
9602 "Disable MTU mismatch detection on this interface\n"
9603 "Address of interface\n")
9605 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9607 struct in_addr addr
;
9610 struct ospf_if_params
*params
;
9611 params
= IF_DEF_PARAMS(ifp
);
9614 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9617 "Please specify interface address by A.B.C.D\n");
9618 return CMD_WARNING_CONFIG_FAILED
;
9620 params
= ospf_get_if_params(ifp
, addr
);
9621 ospf_if_update_params(ifp
, addr
);
9623 params
->mtu_ignore
= 1;
9624 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9625 SET_IF_PARAM(params
, mtu_ignore
);
9627 UNSET_IF_PARAM(params
, mtu_ignore
);
9628 if (params
!= IF_DEF_PARAMS(ifp
)) {
9629 ospf_free_if_params(ifp
, addr
);
9630 ospf_if_update_params(ifp
, addr
);
9636 DEFUN (no_ip_ospf_mtu_ignore
,
9637 no_ip_ospf_mtu_ignore_addr_cmd
,
9638 "no ip ospf mtu-ignore [A.B.C.D]",
9641 "OSPF interface commands\n"
9642 "Disable MTU mismatch detection on this interface\n"
9643 "Address of interface\n")
9645 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9647 struct in_addr addr
;
9650 struct ospf_if_params
*params
;
9651 params
= IF_DEF_PARAMS(ifp
);
9654 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9657 "Please specify interface address by A.B.C.D\n");
9658 return CMD_WARNING_CONFIG_FAILED
;
9660 params
= ospf_get_if_params(ifp
, addr
);
9661 ospf_if_update_params(ifp
, addr
);
9663 params
->mtu_ignore
= 0;
9664 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9665 SET_IF_PARAM(params
, mtu_ignore
);
9667 UNSET_IF_PARAM(params
, mtu_ignore
);
9668 if (params
!= IF_DEF_PARAMS(ifp
)) {
9669 ospf_free_if_params(ifp
, addr
);
9670 ospf_if_update_params(ifp
, addr
);
9677 DEFUN (ospf_max_metric_router_lsa_admin
,
9678 ospf_max_metric_router_lsa_admin_cmd
,
9679 "max-metric router-lsa administrative",
9680 "OSPF maximum / infinite-distance metric\n"
9681 "Advertise own Router-LSA with infinite distance (stub router)\n"
9682 "Administratively applied, for an indefinite period\n")
9684 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9685 struct listnode
*ln
;
9686 struct ospf_area
*area
;
9688 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9689 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
9691 if (!CHECK_FLAG(area
->stub_router_state
,
9692 OSPF_AREA_IS_STUB_ROUTED
))
9693 ospf_router_lsa_update_area(area
);
9696 /* Allows for areas configured later to get the property */
9697 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
9702 DEFUN (no_ospf_max_metric_router_lsa_admin
,
9703 no_ospf_max_metric_router_lsa_admin_cmd
,
9704 "no max-metric router-lsa administrative",
9706 "OSPF maximum / infinite-distance metric\n"
9707 "Advertise own Router-LSA with infinite distance (stub router)\n"
9708 "Administratively applied, for an indefinite period\n")
9710 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9711 struct listnode
*ln
;
9712 struct ospf_area
*area
;
9714 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9715 UNSET_FLAG(area
->stub_router_state
,
9716 OSPF_AREA_ADMIN_STUB_ROUTED
);
9718 /* Don't trample on the start-up stub timer */
9719 if (CHECK_FLAG(area
->stub_router_state
,
9720 OSPF_AREA_IS_STUB_ROUTED
)
9721 && !area
->t_stub_router
) {
9722 UNSET_FLAG(area
->stub_router_state
,
9723 OSPF_AREA_IS_STUB_ROUTED
);
9724 ospf_router_lsa_update_area(area
);
9727 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
9731 DEFUN (ospf_max_metric_router_lsa_startup
,
9732 ospf_max_metric_router_lsa_startup_cmd
,
9733 "max-metric router-lsa on-startup (5-86400)",
9734 "OSPF maximum / infinite-distance metric\n"
9735 "Advertise own Router-LSA with infinite distance (stub router)\n"
9736 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9737 "Time (seconds) to advertise self as stub-router\n")
9739 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9741 unsigned int seconds
;
9744 vty_out(vty
, "%% Must supply stub-router period\n");
9745 return CMD_WARNING_CONFIG_FAILED
;
9748 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9750 ospf
->stub_router_startup_time
= seconds
;
9755 DEFUN (no_ospf_max_metric_router_lsa_startup
,
9756 no_ospf_max_metric_router_lsa_startup_cmd
,
9757 "no max-metric router-lsa on-startup [(5-86400)]",
9759 "OSPF maximum / infinite-distance metric\n"
9760 "Advertise own Router-LSA with infinite distance (stub router)\n"
9761 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9762 "Time (seconds) to advertise self as stub-router\n")
9764 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9765 struct listnode
*ln
;
9766 struct ospf_area
*area
;
9768 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9770 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9771 SET_FLAG(area
->stub_router_state
,
9772 OSPF_AREA_WAS_START_STUB_ROUTED
);
9773 THREAD_OFF(area
->t_stub_router
);
9775 /* Don't trample on admin stub routed */
9776 if (!CHECK_FLAG(area
->stub_router_state
,
9777 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
9778 UNSET_FLAG(area
->stub_router_state
,
9779 OSPF_AREA_IS_STUB_ROUTED
);
9780 ospf_router_lsa_update_area(area
);
9787 DEFUN (ospf_max_metric_router_lsa_shutdown
,
9788 ospf_max_metric_router_lsa_shutdown_cmd
,
9789 "max-metric router-lsa on-shutdown (5-100)",
9790 "OSPF maximum / infinite-distance metric\n"
9791 "Advertise own Router-LSA with infinite distance (stub router)\n"
9792 "Advertise stub-router prior to full shutdown of OSPF\n"
9793 "Time (seconds) to wait till full shutdown\n")
9795 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9797 unsigned int seconds
;
9800 vty_out(vty
, "%% Must supply stub-router shutdown period\n");
9801 return CMD_WARNING_CONFIG_FAILED
;
9804 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9806 ospf
->stub_router_shutdown_time
= seconds
;
9811 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
9812 no_ospf_max_metric_router_lsa_shutdown_cmd
,
9813 "no max-metric router-lsa on-shutdown [(5-100)]",
9815 "OSPF maximum / infinite-distance metric\n"
9816 "Advertise own Router-LSA with infinite distance (stub router)\n"
9817 "Advertise stub-router prior to full shutdown of OSPF\n"
9818 "Time (seconds) to wait till full shutdown\n")
9820 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9822 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9827 DEFUN (ospf_proactive_arp
,
9828 ospf_proactive_arp_cmd
,
9830 "Allow sending ARP requests proactively\n")
9832 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9834 ospf
->proactive_arp
= true;
9839 DEFUN (no_ospf_proactive_arp
,
9840 no_ospf_proactive_arp_cmd
,
9843 "Disallow sending ARP requests proactively\n")
9845 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9847 ospf
->proactive_arp
= false;
9852 /* Graceful Restart HELPER Commands */
9853 DEFPY(ospf_gr_helper_enable
, ospf_gr_helper_enable_cmd
,
9854 "graceful-restart helper enable [A.B.C.D$address]",
9855 "OSPF Graceful Restart\n"
9857 "Enable Helper support\n"
9858 "Advertising Router-ID\n")
9860 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9863 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9868 ospf_gr_helper_support_set(ospf
, OSPF_GR_TRUE
);
9873 DEFPY(no_ospf_gr_helper_enable
,
9874 no_ospf_gr_helper_enable_cmd
,
9875 "no graceful-restart helper enable [A.B.C.D$address]",
9877 "OSPF Graceful Restart\n"
9879 "Enable Helper support\n"
9880 "Advertising Router-ID\n")
9882 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9885 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9890 ospf_gr_helper_support_set(ospf
, OSPF_GR_FALSE
);
9894 DEFPY(ospf_gr_helper_enable_lsacheck
,
9895 ospf_gr_helper_enable_lsacheck_cmd
,
9896 "graceful-restart helper strict-lsa-checking",
9897 "OSPF Graceful Restart\n"
9899 "Enable strict LSA check\n")
9901 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9903 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_TRUE
);
9907 DEFPY(no_ospf_gr_helper_enable_lsacheck
,
9908 no_ospf_gr_helper_enable_lsacheck_cmd
,
9909 "no graceful-restart helper strict-lsa-checking",
9911 "OSPF Graceful Restart\n"
9913 "Disable strict LSA check\n")
9915 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9917 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_FALSE
);
9921 DEFPY(ospf_gr_helper_supported_grace_time
,
9922 ospf_gr_helper_supported_grace_time_cmd
,
9923 "graceful-restart helper supported-grace-time (10-1800)$interval",
9924 "OSPF Graceful Restart\n"
9926 "Supported grace timer\n"
9927 "Grace interval(in seconds)\n")
9929 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9931 ospf_gr_helper_supported_gracetime_set(ospf
, interval
);
9935 DEFPY(no_ospf_gr_helper_supported_grace_time
,
9936 no_ospf_gr_helper_supported_grace_time_cmd
,
9937 "no graceful-restart helper supported-grace-time (10-1800)$interval",
9939 "OSPF Graceful Restart\n"
9941 "Supported grace timer\n"
9942 "Grace interval(in seconds)\n")
9944 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9946 ospf_gr_helper_supported_gracetime_set(ospf
, OSPF_MAX_GRACE_INTERVAL
);
9950 DEFPY(ospf_gr_helper_planned_only
,
9951 ospf_gr_helper_planned_only_cmd
,
9952 "graceful-restart helper planned-only",
9953 "OSPF Graceful Restart\n"
9955 "Supported only planned restart\n")
9957 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9959 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_TRUE
);
9964 /* External Route Aggregation */
9965 DEFUN (ospf_external_route_aggregation
,
9966 ospf_external_route_aggregation_cmd
,
9967 "summary-address A.B.C.D/M [tag (1-4294967295)]",
9968 "External summary address\n"
9969 "Summary address prefix\n"
9971 "Router tag value\n")
9973 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9974 struct prefix_ipv4 p
;
9976 route_tag_t tag
= 0;
9977 int ret
= OSPF_SUCCESS
;
9979 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
9981 if (is_default_prefix4(&p
)) {
9983 "Default address shouldn't be configured as summary address.\n");
9987 /* Apply mask for given prefix. */
9990 if (!is_valid_summary_addr(&p
)) {
9991 vty_out(vty
, "Not a valid summary address.\n");
9992 return CMD_WARNING_CONFIG_FAILED
;
9996 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
9998 ret
= ospf_asbr_external_aggregator_set(ospf
, &p
, tag
);
9999 if (ret
== OSPF_INVALID
)
10000 vty_out(vty
, "Invalid configuration!!\n");
10002 return CMD_SUCCESS
;
10005 DEFUN (no_ospf_external_route_aggregation
,
10006 no_ospf_external_route_aggregation_cmd
,
10007 "no summary-address A.B.C.D/M [tag (1-4294967295)]",
10009 "External summary address\n"
10010 "Summary address prefix\n"
10012 "Router tag value\n")
10014 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10015 struct prefix_ipv4 p
;
10017 route_tag_t tag
= 0;
10018 int ret
= OSPF_SUCCESS
;
10020 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10022 if (is_default_prefix4(&p
)) {
10024 "Default address shouldn't be configured as summary address.\n");
10025 return CMD_SUCCESS
;
10028 /* Apply mask for given prefix. */
10031 if (!is_valid_summary_addr(&p
)) {
10032 vty_out(vty
, "Not a valid summary address.\n");
10033 return CMD_WARNING_CONFIG_FAILED
;
10037 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
10039 ret
= ospf_asbr_external_aggregator_unset(ospf
, &p
, tag
);
10040 if (ret
== OSPF_INVALID
)
10041 vty_out(vty
, "Invalid configuration!!\n");
10043 return CMD_SUCCESS
;
10046 DEFPY(no_ospf_gr_helper_planned_only
,
10047 no_ospf_gr_helper_planned_only_cmd
,
10048 "no graceful-restart helper planned-only",
10050 "OSPF Graceful Restart\n"
10052 "Supported only for planned restart\n")
10054 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10056 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_FALSE
);
10058 return CMD_SUCCESS
;
10061 static int ospf_print_vty_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
10064 struct advRtr
*rtr
= bucket
->data
;
10065 struct vty
*vty
= (struct vty
*)arg
;
10066 static unsigned int count
;
10068 vty_out(vty
, "%-6pI4,", &rtr
->advRtrAddr
);
10071 if (count
% 5 == 0)
10072 vty_out(vty
, "\n");
10074 return HASHWALK_CONTINUE
;
10077 static int ospf_print_json_helper_enabled_rtr_walkcb(struct hash_bucket
*bucket
,
10080 struct advRtr
*rtr
= bucket
->data
;
10081 struct json_object
*json_rid_array
= arg
;
10082 struct json_object
*json_rid
;
10084 json_rid
= json_object_new_object();
10086 json_object_string_addf(json_rid
, "routerId", "%pI4", &rtr
->advRtrAddr
);
10087 json_object_array_add(json_rid_array
, json_rid
);
10089 return HASHWALK_CONTINUE
;
10092 static int ospf_show_gr_helper_details(struct vty
*vty
, struct ospf
*ospf
,
10093 uint8_t use_vrf
, json_object
*json
,
10094 bool uj
, bool detail
)
10096 struct listnode
*node
;
10097 struct ospf_interface
*oi
;
10098 char buf
[PREFIX_STRLEN
];
10099 json_object
*json_vrf
= NULL
;
10103 json_vrf
= json_object_new_object();
10108 if (ospf
->instance
) {
10110 json_object_int_add(json
, "ospfInstance",
10113 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
10116 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
10120 json_object_object_add(json
, ospf_get_name(ospf
),
10123 vty_out(vty
, "\n");
10125 /* Show Router ID. */
10127 json_object_string_add(json_vrf
, "routerId",
10128 inet_ntop(AF_INET
, &ospf
->router_id
,
10129 buf
, sizeof(buf
)));
10131 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
10137 if (ospf
->is_helper_supported
)
10139 " Graceful restart helper support enabled.\n");
10142 " Graceful restart helper support disabled.\n");
10144 if (ospf
->strict_lsa_check
)
10145 vty_out(vty
, " Strict LSA check is enabled.\n");
10147 vty_out(vty
, " Strict LSA check is disabled.\n");
10149 if (ospf
->only_planned_restart
)
10151 " Helper supported for planned restarts only.\n");
10154 " Helper supported for Planned and Unplanned Restarts.\n");
10157 " Supported Graceful restart interval: %d(in seconds).\n",
10158 ospf
->supported_grace_time
);
10160 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
10161 vty_out(vty
, " Enable Router list:\n");
10163 hash_walk(ospf
->enable_rtr_list
,
10164 ospf_print_vty_helper_dis_rtr_walkcb
, vty
);
10165 vty_out(vty
, "\n\n");
10168 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10169 vty_out(vty
, " Last Helper exit Reason :%s\n",
10170 ospf_exit_reason2str(ospf
->last_exit_reason
));
10173 if (ospf
->active_restarter_cnt
)
10175 " Number of Active neighbours in graceful restart: %d\n",
10176 ospf
->active_restarter_cnt
);
10178 vty_out(vty
, "\n");
10181 json_object_string_add(
10182 json_vrf
, "helperSupport",
10183 (ospf
->is_helper_supported
) ? "Enabled" : "Disabled");
10184 json_object_string_add(json_vrf
, "strictLsaCheck",
10185 (ospf
->strict_lsa_check
) ? "Enabled"
10187 json_object_string_add(
10188 json_vrf
, "restartSupoort",
10189 (ospf
->only_planned_restart
)
10190 ? "Planned Restart only"
10191 : "Planned and Unplanned Restarts");
10193 json_object_int_add(json_vrf
, "supportedGracePeriod",
10194 ospf
->supported_grace_time
);
10196 #if CONFDATE > 20230131
10197 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
10199 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10200 json_object_string_add(
10201 json_vrf
, "LastExitReason",
10202 ospf_exit_reason2str(ospf
->last_exit_reason
));
10203 json_object_string_add(
10204 json_vrf
, "lastExitReason",
10205 ospf_exit_reason2str(ospf
->last_exit_reason
));
10208 if (ospf
->active_restarter_cnt
)
10209 json_object_int_add(json_vrf
, "activeRestarterCnt",
10210 ospf
->active_restarter_cnt
);
10212 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
10213 struct json_object
*json_rid_array
=
10214 json_object_new_array();
10216 json_object_object_add(json_vrf
, "enabledRouterIds",
10219 hash_walk(ospf
->enable_rtr_list
,
10220 ospf_print_json_helper_enabled_rtr_walkcb
,
10228 json_object
*json_neighbors
= NULL
;
10230 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10231 struct route_node
*rn
;
10232 struct ospf_neighbor
*nbr
;
10233 json_object
*json_neigh
;
10235 if (ospf_interface_neighbor_count(oi
) == 0)
10239 json_object_object_get_ex(json_vrf
, "Neighbors",
10241 json_object_object_get_ex(json_vrf
, "neighbors",
10243 if (!json_neighbors
) {
10245 json_object_new_object();
10246 json_object_object_add(json_vrf
,
10249 json_object_object_add(json_vrf
,
10255 for (rn
= route_top(oi
->nbrs
); rn
;
10256 rn
= route_next(rn
)) {
10263 if (!OSPF_GR_IS_ACTIVE_HELPER(nbr
))
10267 vty_out(vty
, " Neighbour %d :\n", cnt
);
10268 vty_out(vty
, " Address : %pI4\n",
10269 &nbr
->address
.u
.prefix4
);
10270 vty_out(vty
, " Routerid : %pI4\n",
10273 " Received Grace period : %d(in seconds).\n",
10274 nbr
->gr_helper_info
10275 .recvd_grace_period
);
10277 " Actual Grace period : %d(in seconds)\n",
10278 nbr
->gr_helper_info
10279 .actual_grace_period
);
10281 " Remaining GraceTime:%ld(in seconds).\n",
10282 thread_timer_remain_second(
10283 nbr
->gr_helper_info
10286 " Graceful Restart reason: %s.\n\n",
10287 ospf_restart_reason2str(
10288 nbr
->gr_helper_info
10289 .gr_restart_reason
));
10292 json_neigh
= json_object_new_object();
10293 json_object_string_add(
10294 json_neigh
, "srcAddr",
10295 inet_ntop(AF_INET
, &nbr
->src
,
10296 buf
, sizeof(buf
)));
10298 json_object_string_add(
10299 json_neigh
, "routerid",
10302 buf
, sizeof(buf
)));
10303 json_object_int_add(
10305 "recvdGraceInterval",
10306 nbr
->gr_helper_info
10307 .recvd_grace_period
);
10308 json_object_int_add(
10310 "actualGraceInterval",
10311 nbr
->gr_helper_info
10312 .actual_grace_period
);
10313 json_object_int_add(
10314 json_neigh
, "remainGracetime",
10315 thread_timer_remain_second(
10316 nbr
->gr_helper_info
10318 json_object_string_add(
10319 json_neigh
, "restartReason",
10320 ospf_restart_reason2str(
10321 nbr
->gr_helper_info
10322 .gr_restart_reason
));
10323 json_object_object_add(
10325 inet_ntop(AF_INET
, &nbr
->src
,
10332 return CMD_SUCCESS
;
10335 DEFUN (ospf_external_route_aggregation_no_adrvertise
,
10336 ospf_external_route_aggregation_no_adrvertise_cmd
,
10337 "summary-address A.B.C.D/M no-advertise",
10338 "External summary address\n"
10339 "Summary address prefix\n"
10340 "Don't advertise summary route \n")
10342 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10343 struct prefix_ipv4 p
;
10345 int ret
= OSPF_SUCCESS
;
10347 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10349 if (is_default_prefix4(&p
)) {
10351 "Default address shouldn't be configured as summary address.\n");
10352 return CMD_SUCCESS
;
10355 /* Apply mask for given prefix. */
10358 if (!is_valid_summary_addr(&p
)) {
10359 vty_out(vty
, "Not a valid summary address.\n");
10360 return CMD_WARNING_CONFIG_FAILED
;
10363 ret
= ospf_asbr_external_rt_no_advertise(ospf
, &p
);
10364 if (ret
== OSPF_INVALID
)
10365 vty_out(vty
, "Invalid configuration!!\n");
10367 return CMD_SUCCESS
;
10370 DEFUN (no_ospf_external_route_aggregation_no_adrvertise
,
10371 no_ospf_external_route_aggregation_no_adrvertise_cmd
,
10372 "no summary-address A.B.C.D/M no-advertise",
10374 "External summary address\n"
10375 "Summary address prefix\n"
10376 "Advertise summary route to the AS \n")
10378 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10379 struct prefix_ipv4 p
;
10381 int ret
= OSPF_SUCCESS
;
10383 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10385 if (is_default_prefix4(&p
)) {
10387 "Default address shouldn't be configured as summary address.\n");
10388 return CMD_SUCCESS
;
10391 /* Apply mask for given prefix. */
10394 if (!is_valid_summary_addr(&p
)) {
10395 vty_out(vty
, "Not a valid summary address.\n");
10396 return CMD_WARNING_CONFIG_FAILED
;
10399 ret
= ospf_asbr_external_rt_advertise(ospf
, &p
);
10400 if (ret
== OSPF_INVALID
)
10401 vty_out(vty
, "Invalid configuration!!\n");
10403 return CMD_SUCCESS
;
10406 DEFUN (ospf_route_aggregation_timer
,
10407 ospf_route_aggregation_timer_cmd
,
10408 "aggregation timer (5-1800)",
10409 "External route aggregation\n"
10410 "Delay timer (in seconds)\n"
10411 "Timer interval(in seconds)\n")
10413 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10414 uint16_t interval
= 0;
10416 interval
= strtoul(argv
[2]->arg
, NULL
, 10);
10418 ospf_external_aggregator_timer_set(ospf
, interval
);
10420 return CMD_SUCCESS
;
10423 DEFPY (show_ip_ospf_gr_helper
,
10424 show_ip_ospf_gr_helper_cmd
,
10425 "show ip ospf [vrf <NAME|all>] graceful-restart helper [detail] [json]",
10428 "OSPF information\n"
10431 "OSPF Graceful Restart\n"
10432 "Helper details in the router\n"
10433 "Detailed information\n"
10436 char *vrf_name
= NULL
;
10437 bool all_vrf
= false;
10438 int ret
= CMD_SUCCESS
;
10441 uint8_t use_vrf
= 0;
10442 bool uj
= use_json(argc
, argv
);
10443 struct ospf
*ospf
= NULL
;
10444 json_object
*json
= NULL
;
10445 struct listnode
*node
= NULL
;
10447 bool detail
= false;
10449 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
10451 if (argv_find(argv
, argc
, "detail", &idx
))
10455 json
= json_object_new_object();
10457 /* vrf input is provided */
10462 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10463 if (!ospf
->oi_running
)
10466 ret
= ospf_show_gr_helper_details(
10467 vty
, ospf
, use_vrf
, json
, uj
, detail
);
10471 vty_json(vty
, json
);
10476 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
10478 if (ospf
== NULL
|| !ospf
->oi_running
) {
10481 vty_json(vty
, json
);
10484 "%% OSPF is not enabled in vrf %s\n",
10487 return CMD_SUCCESS
;
10492 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
10494 if (ospf
== NULL
|| !ospf
->oi_running
) {
10497 vty_json(vty
, json
);
10500 "%% OSPF is not enabled in vrf default\n");
10502 return CMD_SUCCESS
;
10505 ospf_show_gr_helper_details(vty
, ospf
, use_vrf
, json
, uj
,
10510 vty_json(vty
, json
);
10512 return CMD_SUCCESS
;
10514 /* Graceful Restart HELPER commands end */
10515 DEFUN (no_ospf_route_aggregation_timer
,
10516 no_ospf_route_aggregation_timer_cmd
,
10517 "no aggregation timer",
10519 "External route aggregation\n"
10522 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10524 ospf_external_aggregator_timer_set(ospf
, OSPF_EXTL_AGGR_DEFAULT_DELAY
);
10526 return CMD_SUCCESS
;
10529 /* External Route Aggregation End */
10531 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
10533 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10534 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
10535 ospf
->stub_router_startup_time
);
10536 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10537 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
10538 ospf
->stub_router_shutdown_time
);
10539 if (ospf
->stub_router_admin_set
== OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
)
10540 vty_out(vty
, " max-metric router-lsa administrative\n");
10545 #if CONFDATE > 20230131
10546 CPP_NOTICE("Remove JSON object commands with keys containing whitespaces")
10548 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
10549 struct route_table
*rt
,
10552 struct route_node
*rn
;
10553 struct ospf_route
* or ;
10554 struct listnode
*pnode
, *pnnode
;
10555 struct ospf_path
*path
;
10556 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10557 *json_nexthop
= NULL
;
10561 "============ OSPF network routing table ============\n");
10563 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10564 char buf1
[PREFIX2STR_BUFFER
];
10566 if ((or = rn
->info
) == NULL
)
10569 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
10572 json_route
= json_object_new_object();
10573 json_object_object_add(json
, buf1
, json_route
);
10576 switch (or->path_type
) {
10577 case OSPF_PATH_INTER_AREA
:
10578 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10580 json_object_string_add(json_route
,
10583 json_object_int_add(json_route
, "cost",
10585 json_object_string_addf(
10586 json_route
, "area", "%pI4",
10587 &or->u
.std
.area_id
);
10590 "N IA %-18s [%d] area: %pI4\n",
10592 &or->u
.std
.area_id
);
10594 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
10596 json_object_string_add(json_route
,
10601 "D IA %-18s Discard entry\n",
10606 case OSPF_PATH_INTRA_AREA
:
10608 json_object_string_add(json_route
, "routeType",
10610 json_object_int_add(json_route
, "cost",
10612 json_object_string_addf(json_route
, "area",
10614 &or->u
.std
.area_id
);
10616 vty_out(vty
, "N %-18s [%d] area: %pI4\n",
10618 &or->u
.std
.area_id
);
10625 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10627 json_nexthop_array
= json_object_new_array();
10628 json_object_object_add(json_route
, "nexthops",
10629 json_nexthop_array
);
10632 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
10635 json_nexthop
= json_object_new_object();
10636 json_object_array_add(
10637 json_nexthop_array
,
10640 if (if_lookup_by_index(path
->ifindex
,
10643 if (path
->nexthop
.s_addr
10646 json_object_string_add(
10649 json_object_string_add(
10651 "directly attached to",
10655 json_object_string_add(
10657 "directlyAttachedTo",
10663 "%24s directly attached to %s\n",
10671 json_object_string_addf(
10675 json_object_string_add(
10683 "%24s via %pI4, %s\n",
10696 vty_out(vty
, "\n");
10699 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
10700 struct route_table
*rtrs
,
10703 struct route_node
*rn
;
10704 struct ospf_route
* or ;
10705 struct listnode
*pnode
;
10706 struct listnode
*node
;
10707 struct ospf_path
*path
;
10708 char buf
[PREFIX_STRLEN
];
10709 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10710 *json_nexthop
= NULL
;
10713 vty_out(vty
, "============ OSPF %s table =============\n",
10714 ospf
->all_rtrs
== rtrs
? "reachable routers"
10715 : "router routing");
10717 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
10718 if (rn
->info
== NULL
)
10723 json_route
= json_object_new_object();
10724 json_object_object_add(
10725 json
, inet_ntop(AF_INET
, &rn
->p
.u
.prefix4
,
10728 json_object_string_add(json_route
, "routeType", "R ");
10730 vty_out(vty
, "R %-15pI4 ",
10734 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
10737 vty_out(vty
, "%24s", "");
10742 json_object_int_add(json_route
, "cost",
10744 json_object_string_addf(json_route
, "area",
10746 &or->u
.std
.area_id
);
10747 if (or->path_type
== OSPF_PATH_INTER_AREA
) {
10748 json_object_boolean_true_add(json_route
,
10750 json_object_boolean_true_add(json_route
,
10753 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
10754 json_object_string_add(json_route
,
10757 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
10758 json_object_string_add(json_route
,
10762 vty_out(vty
, "%s [%d] area: %pI4",
10763 (or->path_type
== OSPF_PATH_INTER_AREA
10766 or->cost
, &or->u
.std
.area_id
);
10768 vty_out(vty
, "%s%s\n",
10769 (or->u
.std
.flags
& ROUTER_LSA_BORDER
10772 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
10778 json_nexthop_array
= json_object_new_array();
10779 json_object_object_add(json_route
, "nexthops",
10780 json_nexthop_array
);
10783 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
10785 json_nexthop
= json_object_new_object();
10786 json_object_array_add(
10787 json_nexthop_array
,
10790 if (if_lookup_by_index(path
->ifindex
,
10792 if (path
->nexthop
.s_addr
10795 json_object_string_add(
10798 json_object_string_add(
10800 "directly attached to",
10804 json_object_string_add(
10806 "directlyAttachedTo",
10812 "%24s directly attached to %s\n",
10820 json_object_string_addf(
10824 json_object_string_add(
10832 "%24s via %pI4, %s\n",
10845 vty_out(vty
, "\n");
10848 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
10849 struct route_table
*rt
,
10852 struct route_node
*rn
;
10853 struct ospf_route
*er
;
10854 struct listnode
*pnode
, *pnnode
;
10855 struct ospf_path
*path
;
10856 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10857 *json_nexthop
= NULL
;
10861 "============ OSPF external routing table ===========\n");
10863 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10864 if ((er
= rn
->info
) == NULL
)
10869 snprintfrr(buf1
, sizeof(buf1
), "%pFX", &rn
->p
);
10871 json_route
= json_object_new_object();
10872 json_object_object_add(json
, buf1
, json_route
);
10875 switch (er
->path_type
) {
10876 case OSPF_PATH_TYPE1_EXTERNAL
:
10878 json_object_string_add(json_route
, "routeType",
10880 json_object_int_add(json_route
, "cost",
10882 json_object_int_add(json_route
, "tag",
10886 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
10888 buf1
, er
->cost
, er
->u
.ext
.tag
);
10891 case OSPF_PATH_TYPE2_EXTERNAL
:
10893 json_object_string_add(json_route
, "routeType",
10895 json_object_int_add(json_route
, "cost",
10897 json_object_int_add(json_route
, "type2cost",
10898 er
->u
.ext
.type2_cost
);
10899 json_object_int_add(json_route
, "tag",
10903 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
10905 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
10912 json_nexthop_array
= json_object_new_array();
10913 json_object_object_add(json_route
, "nexthops",
10914 json_nexthop_array
);
10917 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
10919 json_nexthop
= json_object_new_object();
10920 json_object_array_add(json_nexthop_array
,
10924 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
10925 if (path
->nexthop
.s_addr
== INADDR_ANY
) {
10927 json_object_string_add(
10928 json_nexthop
, "ip",
10930 json_object_string_add(
10932 "directly attached to",
10936 json_object_string_add(
10938 "directlyAttachedTo",
10944 "%24s directly attached to %s\n",
10952 json_object_string_addf(
10953 json_nexthop
, "ip",
10954 "%pI4", &path
->nexthop
);
10955 json_object_string_add(
10956 json_nexthop
, "via",
10962 "%24s via %pI4, %s\n",
10974 vty_out(vty
, "\n");
10977 static void show_ip_ospf_route_orr_root(struct vty
*vty
, struct ospf
*ospf
,
10978 struct orr_root
*root
, bool use_vrf
)
10980 if (ospf
->instance
)
10981 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
10983 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
10985 vty_out(vty
, "ORR Group: %s\n", root
->group_name
);
10986 vty_out(vty
, "Active Root: %pI4\n\n", &root
->router_id
);
10987 vty_out(vty
, "SPF calculated from %pI4\n\n", &root
->router_id
);
10989 if (root
->new_table
)
10990 show_ip_ospf_route_network(vty
, ospf
, root
->new_table
, NULL
);
10992 if (root
->new_rtrs
)
10993 show_ip_ospf_route_router(vty
, ospf
, root
->new_rtrs
, NULL
);
10995 vty_out(vty
, "\n");
10998 static void show_ip_ospf_route_orr_common(struct vty
*vty
, struct ospf
*ospf
,
10999 const char *orr_group
, bool use_vrf
)
11003 struct orr_root
*root
= NULL
;
11004 struct listnode
*node
= NULL
;
11005 struct list
*orr_root_list
= NULL
;
11007 if (!ospf
->orr_spf_request
)
11010 FOREACH_AFI_SAFI (afi
, safi
) {
11011 orr_root_list
= ospf
->orr_root
[afi
][safi
];
11012 if (!orr_root_list
)
11014 for (ALL_LIST_ELEMENTS_RO(orr_root_list
, node
, root
)) {
11016 if (!strmatch(root
->group_name
, orr_group
))
11018 show_ip_ospf_route_orr_root(vty
, ospf
, root
,
11021 show_ip_ospf_route_orr_root(vty
, ospf
, root
,
11027 DEFPY (show_ip_ospf_instance_route_orr
,
11028 show_ip_ospf_instance_route_orr_cmd
,
11029 "show ip ospf (1-65535)$instance route orr [WORD$orr_group]",
11034 "OSPF routing table\n"
11035 "Optimal Route Reflection\n"
11036 "ORR Group name\n")
11040 if (instance
!= ospf_instance
)
11041 return CMD_NOT_MY_INSTANCE
;
11043 ospf
= ospf_lookup_instance(instance
);
11044 if (!ospf
|| !ospf
->oi_running
)
11045 return CMD_SUCCESS
;
11047 show_ip_ospf_route_orr_common(vty
, ospf
, orr_group
, false);
11049 return CMD_SUCCESS
;
11052 DEFPY (show_ip_ospf_route_orr
,
11053 show_ip_ospf_route_orr_cmd
,
11054 "show ip ospf [vrf <NAME$vrf_name|all$all_vrf>] route orr [WORD$orr_group]",
11060 "OSPF routing table\n"
11061 "Optimal Route Reflection\n"
11062 "ORR Group name\n")
11064 struct ospf
*ospf
= NULL
;
11065 struct listnode
*node
= NULL
;
11066 int ret
= CMD_SUCCESS
;
11068 bool use_vrf
= vrf_name
|| all_vrf
;
11071 bool ospf_output
= false;
11073 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11074 if (!ospf
->oi_running
)
11076 ospf_output
= true;
11078 show_ip_ospf_route_orr_common(vty
, ospf
, orr_group
,
11082 vty_out(vty
, "%% OSPF is not enabled\n");
11087 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11089 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11091 if (!ospf
|| !ospf
->oi_running
) {
11092 vty_out(vty
, "%% OSPF is not enabled in vrf %s\n",
11093 vrf_name
? vrf_name
: "default");
11094 return CMD_SUCCESS
;
11097 show_ip_ospf_route_orr_common(vty
, ospf
, orr_group
, use_vrf
);
11102 static int show_ip_ospf_reachable_routers_common(struct vty
*vty
,
11106 if (ospf
->instance
)
11107 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11109 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
11111 if (ospf
->all_rtrs
== NULL
) {
11112 vty_out(vty
, "No OSPF reachable router information exist\n");
11113 return CMD_SUCCESS
;
11116 /* Show Router routes. */
11117 show_ip_ospf_route_router(vty
, ospf
, ospf
->all_rtrs
, NULL
);
11119 vty_out(vty
, "\n");
11121 return CMD_SUCCESS
;
11124 DEFUN (show_ip_ospf_reachable_routers
,
11125 show_ip_ospf_reachable_routers_cmd
,
11126 "show ip ospf [vrf <NAME|all>] reachable-routers",
11129 "OSPF information\n"
11132 "Show all the reachable OSPF routers\n")
11134 struct ospf
*ospf
= NULL
;
11135 struct listnode
*node
= NULL
;
11136 char *vrf_name
= NULL
;
11137 bool all_vrf
= false;
11138 int ret
= CMD_SUCCESS
;
11141 uint8_t use_vrf
= 0;
11143 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11146 bool ospf_output
= false;
11151 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11152 if (!ospf
->oi_running
)
11155 ospf_output
= true;
11156 ret
= show_ip_ospf_reachable_routers_common(
11157 vty
, ospf
, use_vrf
);
11161 vty_out(vty
, "%% OSPF instance not found\n");
11163 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11164 if (ospf
== NULL
|| !ospf
->oi_running
) {
11165 vty_out(vty
, "%% OSPF instance not found\n");
11166 return CMD_SUCCESS
;
11169 ret
= show_ip_ospf_reachable_routers_common(vty
, ospf
,
11173 /* Display default ospf (instance 0) info */
11174 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11175 if (ospf
== NULL
|| !ospf
->oi_running
) {
11176 vty_out(vty
, "%% OSPF instance not found\n");
11177 return CMD_SUCCESS
;
11180 ret
= show_ip_ospf_reachable_routers_common(vty
, ospf
, use_vrf
);
11186 DEFUN (show_ip_ospf_instance_reachable_routers
,
11187 show_ip_ospf_instance_reachable_routers_cmd
,
11188 "show ip ospf (1-65535) reachable-routers",
11191 "OSPF information\n"
11193 "Show all the reachable OSPF routers\n")
11195 int idx_number
= 3;
11197 unsigned short instance
= 0;
11199 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11200 if (instance
!= ospf_instance
)
11201 return CMD_NOT_MY_INSTANCE
;
11203 ospf
= ospf_lookup_instance(instance
);
11204 if (!ospf
|| !ospf
->oi_running
)
11205 return CMD_SUCCESS
;
11207 return show_ip_ospf_reachable_routers_common(vty
, ospf
, 0);
11210 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
11214 if (ospf
->instance
)
11215 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11217 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
11219 if (ospf
->new_table
== NULL
) {
11220 vty_out(vty
, "No OSPF routing information exist\n");
11221 return CMD_SUCCESS
;
11224 /* Show Network routes.
11225 show_ip_ospf_route_network (vty, ospf->new_table); */
11227 /* Show Router routes. */
11228 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
11230 vty_out(vty
, "\n");
11232 return CMD_SUCCESS
;
11235 DEFUN (show_ip_ospf_border_routers
,
11236 show_ip_ospf_border_routers_cmd
,
11237 "show ip ospf [vrf <NAME|all>] border-routers",
11240 "OSPF information\n"
11243 "Show all the ABR's and ASBR's\n")
11245 struct ospf
*ospf
= NULL
;
11246 struct listnode
*node
= NULL
;
11247 char *vrf_name
= NULL
;
11248 bool all_vrf
= false;
11249 int ret
= CMD_SUCCESS
;
11252 uint8_t use_vrf
= 0;
11254 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11257 bool ospf_output
= false;
11262 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11263 if (!ospf
->oi_running
)
11266 ospf_output
= true;
11267 ret
= show_ip_ospf_border_routers_common(
11268 vty
, ospf
, use_vrf
);
11272 vty_out(vty
, "%% OSPF is not enabled\n");
11274 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11275 if (ospf
== NULL
|| !ospf
->oi_running
) {
11277 "%% OSPF is not enabled in vrf %s\n",
11279 return CMD_SUCCESS
;
11282 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
11286 /* Display default ospf (instance 0) info */
11287 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11288 if (ospf
== NULL
|| !ospf
->oi_running
) {
11289 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
11290 return CMD_SUCCESS
;
11293 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
11299 DEFUN (show_ip_ospf_instance_border_routers
,
11300 show_ip_ospf_instance_border_routers_cmd
,
11301 "show ip ospf (1-65535) border-routers",
11304 "OSPF information\n"
11306 "Show all the ABR's and ASBR's\n")
11308 int idx_number
= 3;
11310 unsigned short instance
= 0;
11312 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11313 if (instance
!= ospf_instance
)
11314 return CMD_NOT_MY_INSTANCE
;
11316 ospf
= ospf_lookup_instance(instance
);
11317 if (!ospf
|| !ospf
->oi_running
)
11318 return CMD_SUCCESS
;
11320 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
11323 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
11324 json_object
*json
, uint8_t use_vrf
)
11326 json_object
*json_vrf
= NULL
;
11328 if (ospf
->instance
)
11329 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11334 json_vrf
= json_object_new_object();
11339 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11341 if (ospf
->new_table
== NULL
) {
11342 vty_out(vty
, "No OSPF routing information exist\n");
11343 return CMD_SUCCESS
;
11346 /* Show Network routes. */
11347 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
11349 /* Show Router routes. */
11350 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
11352 /* Show Router routes. */
11353 if (ospf
->all_rtrs
)
11354 show_ip_ospf_route_router(vty
, ospf
, ospf
->all_rtrs
, json_vrf
);
11356 /* Show AS External routes. */
11357 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
11362 // json_object_object_add(json_vrf, "areas",
11364 json_object_object_add(json
, ospf_get_name(ospf
),
11368 vty_out(vty
, "\n");
11371 return CMD_SUCCESS
;
11374 DEFUN (show_ip_ospf_route
,
11375 show_ip_ospf_route_cmd
,
11376 "show ip ospf [vrf <NAME|all>] route [json]",
11379 "OSPF information\n"
11382 "OSPF routing table\n"
11385 struct ospf
*ospf
= NULL
;
11386 struct listnode
*node
= NULL
;
11387 char *vrf_name
= NULL
;
11388 bool all_vrf
= false;
11389 int ret
= CMD_SUCCESS
;
11392 uint8_t use_vrf
= 0;
11393 bool uj
= use_json(argc
, argv
);
11394 json_object
*json
= NULL
;
11397 json
= json_object_new_object();
11399 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11401 /* vrf input is provided could be all or specific vrf*/
11403 bool ospf_output
= false;
11408 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11409 if (!ospf
->oi_running
)
11411 ospf_output
= true;
11412 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
11417 /* Keep Non-pretty format */
11418 vty_json(vty
, json
);
11419 } else if (!ospf_output
)
11420 vty_out(vty
, "%% OSPF is not enabled\n");
11424 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11425 if (ospf
== NULL
|| !ospf
->oi_running
) {
11427 vty_json(vty
, json
);
11430 "%% OSPF is not enabled in vrf %s\n",
11433 return CMD_SUCCESS
;
11436 /* Display default ospf (instance 0) info */
11437 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11438 if (ospf
== NULL
|| !ospf
->oi_running
) {
11440 vty_json(vty
, json
);
11443 "%% OSPF is not enabled in vrf default\n");
11445 return CMD_SUCCESS
;
11450 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
11451 /* Keep Non-pretty format */
11453 vty_out(vty
, "%s\n",
11454 json_object_to_json_string_ext(
11455 json
, JSON_C_TO_STRING_NOSLASHESCAPE
));
11459 json_object_free(json
);
11464 DEFUN (show_ip_ospf_instance_route
,
11465 show_ip_ospf_instance_route_cmd
,
11466 "show ip ospf (1-65535) route",
11469 "OSPF information\n"
11471 "OSPF routing table\n")
11473 int idx_number
= 3;
11475 unsigned short instance
= 0;
11477 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11478 if (instance
!= ospf_instance
)
11479 return CMD_NOT_MY_INSTANCE
;
11481 ospf
= ospf_lookup_instance(instance
);
11482 if (!ospf
|| !ospf
->oi_running
)
11483 return CMD_SUCCESS
;
11485 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
11489 DEFUN (show_ip_ospf_vrfs
,
11490 show_ip_ospf_vrfs_cmd
,
11491 "show ip ospf vrfs [json]",
11494 "OSPF information\n"
11495 "Show OSPF VRFs \n"
11498 bool uj
= use_json(argc
, argv
);
11499 json_object
*json
= NULL
;
11500 json_object
*json_vrfs
= NULL
;
11501 struct ospf
*ospf
= NULL
;
11502 struct listnode
*node
= NULL
;
11504 static const char header
[] = "Name Id RouterId ";
11507 json
= json_object_new_object();
11508 json_vrfs
= json_object_new_object();
11511 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11512 json_object
*json_vrf
= NULL
;
11513 const char *name
= NULL
;
11514 int64_t vrf_id_ui
= 0;
11518 if (!uj
&& count
== 1)
11519 vty_out(vty
, "%s\n", header
);
11521 json_vrf
= json_object_new_object();
11523 name
= ospf_get_name(ospf
);
11525 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
11527 : (int64_t)ospf
->vrf_id
;
11530 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
11531 json_object_string_addf(json_vrf
, "routerId", "%pI4",
11534 json_object_object_add(json_vrfs
, name
, json_vrf
);
11537 vty_out(vty
, "%-25s %-5d %-16pI4 \n", name
,
11538 ospf
->vrf_id
, &ospf
->router_id
);
11543 json_object_object_add(json
, "vrfs", json_vrfs
);
11544 json_object_int_add(json
, "totalVrfs", count
);
11546 vty_json(vty
, json
);
11549 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
11553 return CMD_SUCCESS
;
11555 DEFPY (clear_ip_ospf_neighbor
,
11556 clear_ip_ospf_neighbor_cmd
,
11557 "clear ip ospf [(1-65535)]$instance neighbor [A.B.C.D$nbr_id]",
11560 "OSPF information\n"
11562 "Reset OSPF Neighbor\n"
11565 struct listnode
*node
;
11566 struct ospf
*ospf
= NULL
;
11568 /* If user does not specify the arguments,
11569 * instance = 0 and nbr_id = 0.0.0.0
11571 if (instance
!= 0) {
11572 /* This means clear only the particular ospf process */
11573 if (instance
!= ospf_instance
)
11574 return CMD_NOT_MY_INSTANCE
;
11577 /* Clear all the ospf processes */
11578 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11579 if (!ospf
->oi_running
)
11582 if (nbr_id_str
&& IPV4_ADDR_SAME(&ospf
->router_id
, &nbr_id
)) {
11583 vty_out(vty
, "Self router-id is not allowed.\r\n ");
11584 return CMD_SUCCESS
;
11587 ospf_neighbor_reset(ospf
, nbr_id
, nbr_id_str
);
11590 return CMD_SUCCESS
;
11593 DEFPY (clear_ip_ospf_process
,
11594 clear_ip_ospf_process_cmd
,
11595 "clear ip ospf [(1-65535)]$instance process",
11598 "OSPF information\n"
11600 "Reset OSPF Process\n")
11602 struct listnode
*node
;
11603 struct ospf
*ospf
= NULL
;
11605 /* Check if instance is not passed as an argument */
11606 if (instance
!= 0) {
11607 /* This means clear only the particular ospf process */
11608 if (instance
!= ospf_instance
)
11609 return CMD_NOT_MY_INSTANCE
;
11612 /* Clear all the ospf processes */
11613 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11614 if (!ospf
->oi_running
)
11617 ospf_process_reset(ospf
);
11620 return CMD_SUCCESS
;
11623 static const char *const ospf_abr_type_str
[] = {
11624 "unknown", "standard", "ibm", "cisco", "shortcut"
11627 static const char *const ospf_shortcut_mode_str
[] = {
11628 "default", "enable", "disable"
11630 static int ospf_vty_external_rt_walkcb(struct hash_bucket
*bucket
,
11633 struct external_info
*ei
= bucket
->data
;
11634 struct vty
*vty
= (struct vty
*)arg
;
11635 static unsigned int count
;
11637 vty_out(vty
, "%-4pI4/%d, ", &ei
->p
.prefix
, ei
->p
.prefixlen
);
11640 if (count
% 5 == 0)
11641 vty_out(vty
, "\n");
11643 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11646 return HASHWALK_CONTINUE
;
11649 static int ospf_json_external_rt_walkcb(struct hash_bucket
*bucket
,
11652 struct external_info
*ei
= bucket
->data
;
11653 struct json_object
*json
= (struct json_object
*)arg
;
11654 char buf
[PREFIX2STR_BUFFER
];
11656 static unsigned int count
;
11658 prefix2str(&ei
->p
, buf
, sizeof(buf
));
11660 snprintf(exnalbuf
, 20, "Exnl Addr-%d", count
);
11662 json_object_string_add(json
, exnalbuf
, buf
);
11666 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11669 return HASHWALK_CONTINUE
;
11672 static int ospf_show_summary_address(struct vty
*vty
, struct ospf
*ospf
,
11673 uint8_t use_vrf
, json_object
*json
,
11674 bool uj
, bool detail
)
11676 struct route_node
*rn
;
11677 json_object
*json_vrf
= NULL
;
11680 static char header
[] =
11681 "Summary-address Metric-type Metric Tag External_Rt_count\n";
11683 mtype
= metric_type(ospf
, 0, ospf
->instance
);
11684 mval
= metric_value(ospf
, 0, ospf
->instance
);
11687 vty_out(vty
, "%s\n", header
);
11691 json_vrf
= json_object_new_object();
11696 if (ospf
->instance
) {
11698 json_object_int_add(json
, "ospfInstance",
11701 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11704 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11707 vty_out(vty
, "aggregation delay interval :%u(in seconds)\n\n",
11708 ospf
->aggr_delay_interval
);
11710 json_object_int_add(json_vrf
, "aggregation delay interval",
11711 ospf
->aggr_delay_interval
);
11712 json_object_int_add(json_vrf
, "aggregationDelayInterval",
11713 ospf
->aggr_delay_interval
);
11716 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
11718 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
11719 json_object
*json_aggr
= NULL
;
11720 char buf
[PREFIX2STR_BUFFER
];
11722 prefix2str(&aggr
->p
, buf
, sizeof(buf
));
11726 json_aggr
= json_object_new_object();
11728 json_object_object_add(json_vrf
, buf
,
11731 json_object_string_add(json_aggr
,
11732 "Summary address", buf
);
11733 json_object_string_add(json_aggr
,
11734 "summaryAddress", buf
);
11736 json_object_string_add(
11737 json_aggr
, "Metric-type",
11738 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11741 json_object_string_add(
11742 json_aggr
, "metricType",
11743 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11747 #if CONFDATE > 20230131
11748 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
11750 json_object_int_add(json_aggr
, "Metric", mval
);
11751 json_object_int_add(json_aggr
, "metric", mval
);
11753 json_object_int_add(json_aggr
, "Tag",
11755 json_object_int_add(json_aggr
, "tag",
11758 json_object_int_add(
11759 json_aggr
, "External route count",
11760 OSPF_EXTERNAL_RT_COUNT(aggr
));
11761 json_object_int_add(
11762 json_aggr
, "externalRouteCount",
11763 OSPF_EXTERNAL_RT_COUNT(aggr
));
11765 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11767 aggr
->match_extnl_hash
,
11768 ospf_json_external_rt_walkcb
,
11773 vty_out(vty
, "%-20s", buf
);
11775 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11776 ? vty_out(vty
, "%-16s", "E1")
11777 : vty_out(vty
, "%-16s", "E2");
11778 vty_out(vty
, "%-11d", mval
);
11780 vty_out(vty
, "%-12u", aggr
->tag
);
11782 vty_out(vty
, "%-5ld\n",
11783 OSPF_EXTERNAL_RT_COUNT(aggr
));
11785 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11787 "Matched External routes:\n");
11789 aggr
->match_extnl_hash
,
11790 ospf_vty_external_rt_walkcb
,
11792 vty_out(vty
, "\n");
11795 vty_out(vty
, "\n");
11801 json_object_object_add(json
, ospf_get_name(ospf
),
11804 vty_out(vty
, "\n");
11806 return CMD_SUCCESS
;
11809 DEFUN (show_ip_ospf_external_aggregator
,
11810 show_ip_ospf_external_aggregator_cmd
,
11811 "show ip ospf [vrf <NAME|all>] summary-address [detail] [json]",
11813 "OSPF information\n"
11816 "Show external summary addresses\n"
11817 "Detailed information\n"
11820 char *vrf_name
= NULL
;
11821 bool all_vrf
= false;
11822 int ret
= CMD_SUCCESS
;
11825 uint8_t use_vrf
= 0;
11826 bool uj
= use_json(argc
, argv
);
11827 struct ospf
*ospf
= NULL
;
11828 json_object
*json
= NULL
;
11829 struct listnode
*node
= NULL
;
11831 bool detail
= false;
11833 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11835 if (argv_find(argv
, argc
, "detail", &idx
))
11839 json
= json_object_new_object();
11841 /* vrf input is provided */
11845 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11846 if (!ospf
->oi_running
)
11848 ret
= ospf_show_summary_address(
11849 vty
, ospf
, use_vrf
, json
, uj
, detail
);
11853 vty_json(vty
, json
);
11858 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11860 if (ospf
== NULL
|| !ospf
->oi_running
) {
11862 vty_json(vty
, json
);
11865 "%% OSPF is not enabled in vrf %s\n",
11868 return CMD_SUCCESS
;
11870 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11874 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11875 if (ospf
== NULL
|| !ospf
->oi_running
) {
11877 vty_json(vty
, json
);
11880 "%% OSPF is not enabled in vrf default\n");
11882 return CMD_SUCCESS
;
11885 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11889 vty_json(vty
, json
);
11890 return CMD_SUCCESS
;
11893 static const char *const ospf_int_type_str
[] = {
11894 "unknown", /* should never be used. */
11898 "point-to-multipoint",
11899 "virtual-link", /* should never be used. */
11903 static const char *interface_config_auth_str(struct ospf_if_params
*params
)
11905 if (!OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
11906 || params
->auth_type
== OSPF_AUTH_NOTSET
)
11909 /* Translation tables are not that much help
11910 * here due to syntax
11911 * of the simple option */
11912 switch (params
->auth_type
) {
11914 case OSPF_AUTH_NULL
:
11917 case OSPF_AUTH_SIMPLE
:
11920 case OSPF_AUTH_CRYPTOGRAPHIC
:
11921 return " message-digest";
11927 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
11929 struct listnode
*node
;
11930 struct interface
*ifp
;
11931 struct crypt_key
*ck
;
11932 struct route_node
*rn
= NULL
;
11933 struct ospf_if_params
*params
;
11934 const char *auth_str
;
11937 FOR_ALL_INTERFACES (vrf
, ifp
) {
11939 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
11942 if_vty_config_start(vty
, ifp
);
11945 vty_out(vty
, " description %s\n", ifp
->desc
);
11949 params
= IF_DEF_PARAMS(ifp
);
11952 /* Interface Network print. */
11953 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
11954 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
11955 if (params
->type
!= ospf_default_iftype(ifp
)) {
11956 vty_out(vty
, " ip ospf network %s",
11960 == OSPF_IFTYPE_POINTOPOINT
11961 && params
->ptp_dmvpn
)
11962 vty_out(vty
, " dmvpn");
11963 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11964 vty_out(vty
, " %pI4",
11966 vty_out(vty
, "\n");
11970 /* OSPF interface authentication print */
11971 auth_str
= interface_config_auth_str(params
);
11973 vty_out(vty
, " ip ospf authentication%s",
11975 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11976 vty_out(vty
, " %pI4",
11978 vty_out(vty
, "\n");
11981 /* Simple Authentication Password print. */
11982 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
11983 && params
->auth_simple
[0] != '\0') {
11984 vty_out(vty
, " ip ospf authentication-key %s",
11985 params
->auth_simple
);
11986 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11987 vty_out(vty
, " %pI4",
11989 vty_out(vty
, "\n");
11992 /* Cryptographic Authentication Key print. */
11993 if (params
&& params
->auth_crypt
) {
11994 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
11997 " ip ospf message-digest-key %d md5 %s",
11998 ck
->key_id
, ck
->auth_key
);
11999 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12000 vty_out(vty
, " %pI4",
12002 vty_out(vty
, "\n");
12006 /* Interface Output Cost print. */
12007 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
12008 vty_out(vty
, " ip ospf cost %u",
12009 params
->output_cost_cmd
);
12010 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12011 vty_out(vty
, " %pI4",
12013 vty_out(vty
, "\n");
12016 /* Hello Interval print. */
12017 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
12018 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
12019 vty_out(vty
, " ip ospf hello-interval %u",
12021 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12022 vty_out(vty
, " %pI4",
12024 vty_out(vty
, "\n");
12028 /* Router Dead Interval print. */
12029 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
12030 && params
->is_v_wait_set
) {
12031 vty_out(vty
, " ip ospf dead-interval ");
12034 if (OSPF_IF_PARAM_CONFIGURED(params
,
12037 "minimal hello-multiplier %d",
12038 params
->fast_hello
);
12040 vty_out(vty
, "%u", params
->v_wait
);
12042 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12043 vty_out(vty
, " %pI4",
12045 vty_out(vty
, "\n");
12048 /* Router Priority print. */
12049 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
12050 && params
->priority
12051 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
12052 vty_out(vty
, " ip ospf priority %u",
12054 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12055 vty_out(vty
, " %pI4",
12057 vty_out(vty
, "\n");
12060 /* Retransmit Interval print. */
12061 if (OSPF_IF_PARAM_CONFIGURED(params
,
12062 retransmit_interval
)
12063 && params
->retransmit_interval
12064 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
12065 vty_out(vty
, " ip ospf retransmit-interval %u",
12066 params
->retransmit_interval
);
12067 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12068 vty_out(vty
, " %pI4",
12070 vty_out(vty
, "\n");
12073 /* Transmit Delay print. */
12074 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
12075 && params
->transmit_delay
12076 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
12077 vty_out(vty
, " ip ospf transmit-delay %u",
12078 params
->transmit_delay
);
12079 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12080 vty_out(vty
, " %pI4",
12082 vty_out(vty
, "\n");
12086 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
12088 vty_out(vty
, " ip ospf %d",
12091 vty_out(vty
, " ip ospf");
12093 char buf
[INET_ADDRSTRLEN
];
12095 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
12096 params
->if_area_id_fmt
);
12097 vty_out(vty
, " area %s", buf
);
12098 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12099 vty_out(vty
, " %pI4",
12101 vty_out(vty
, "\n");
12105 if (params
&& params
->bfd_config
)
12106 ospf_bfd_write_config(vty
, params
);
12108 /* MTU ignore print. */
12109 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
12110 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
12111 if (params
->mtu_ignore
== 0)
12112 vty_out(vty
, " no ip ospf mtu-ignore");
12114 vty_out(vty
, " ip ospf mtu-ignore");
12115 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12116 vty_out(vty
, " %pI4",
12118 vty_out(vty
, "\n");
12121 if (OSPF_IF_PARAM_CONFIGURED(params
,
12122 passive_interface
)) {
12123 vty_out(vty
, " %sip ospf passive",
12124 params
->passive_interface
12128 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
12129 vty_out(vty
, " %pI4", &rn
->p
.u
.prefix4
);
12130 vty_out(vty
, "\n");
12133 /* LDP-Sync print */
12134 if (params
&& params
->ldp_sync_info
)
12135 ospf_ldp_sync_if_write_config(vty
, params
);
12139 rn
= route_top(IF_OIFS_PARAMS(ifp
));
12141 rn
= route_next(rn
);
12146 if (params
!= NULL
)
12151 ospf_opaque_config_write_if(vty
, ifp
);
12153 if_vty_config_end(vty
);
12159 /* Configuration write function for ospfd. */
12160 static int config_write_interface(struct vty
*vty
)
12163 struct vrf
*vrf
= NULL
;
12165 /* Display all VRF aware OSPF interface configuration */
12166 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
12167 write
+= config_write_interface_one(vty
, vrf
);
12173 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
12175 struct route_node
*rn
;
12176 char buf
[INET_ADDRSTRLEN
];
12178 /* `network area' print. */
12179 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
12181 struct ospf_network
*n
= rn
->info
;
12183 /* Create Area ID string by specified Area ID format. */
12184 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
12185 inet_ntop(AF_INET
, &n
->area_id
, buf
,
12188 snprintf(buf
, sizeof(buf
), "%lu",
12189 (unsigned long int)ntohl(
12190 n
->area_id
.s_addr
));
12192 /* Network print. */
12193 vty_out(vty
, " network %pFX area %s\n", &rn
->p
, buf
);
12199 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
12201 struct listnode
*node
;
12202 struct ospf_area
*area
;
12203 char buf
[INET_ADDRSTRLEN
];
12205 /* Area configuration print. */
12206 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
12207 struct route_node
*rn1
;
12209 area_id2str(buf
, sizeof(buf
), &area
->area_id
,
12210 area
->area_id_fmt
);
12212 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
12213 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
12214 vty_out(vty
, " area %s authentication\n", buf
);
12217 " area %s authentication message-digest\n",
12221 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
12222 vty_out(vty
, " area %s shortcut %s\n", buf
,
12223 ospf_shortcut_mode_str
12224 [area
->shortcut_configured
]);
12226 if ((area
->external_routing
== OSPF_AREA_STUB
)
12227 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
12228 if (area
->external_routing
== OSPF_AREA_STUB
) {
12229 vty_out(vty
, " area %s stub", buf
);
12230 if (area
->no_summary
)
12231 vty_out(vty
, " no-summary\n");
12232 vty_out(vty
, "\n");
12233 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
12234 switch (area
->NSSATranslatorRole
) {
12235 case OSPF_NSSA_ROLE_NEVER
:
12237 " area %s nssa translate-never\n",
12240 case OSPF_NSSA_ROLE_ALWAYS
:
12242 " area %s nssa translate-always\n",
12245 case OSPF_NSSA_ROLE_CANDIDATE
:
12246 vty_out(vty
, " area %s nssa \n", buf
);
12249 if (area
->no_summary
)
12251 " area %s nssa no-summary\n",
12253 if (area
->suppress_fa
)
12255 " area %s nssa suppress-fa\n",
12259 if (area
->default_cost
!= 1)
12260 vty_out(vty
, " area %s default-cost %d\n", buf
,
12261 area
->default_cost
);
12264 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
12266 struct ospf_area_range
*range
= rn1
->info
;
12268 vty_out(vty
, " area %s range %pFX", buf
,
12271 if (range
->cost_config
12272 != OSPF_AREA_RANGE_COST_UNSPEC
)
12273 vty_out(vty
, " cost %d",
12274 range
->cost_config
);
12276 if (!CHECK_FLAG(range
->flags
,
12277 OSPF_AREA_RANGE_ADVERTISE
))
12278 vty_out(vty
, " not-advertise");
12280 if (CHECK_FLAG(range
->flags
,
12281 OSPF_AREA_RANGE_SUBSTITUTE
))
12282 vty_out(vty
, " substitute %pI4/%d",
12283 &range
->subst_addr
,
12284 range
->subst_masklen
);
12286 vty_out(vty
, "\n");
12289 if (EXPORT_NAME(area
))
12290 vty_out(vty
, " area %s export-list %s\n", buf
,
12291 EXPORT_NAME(area
));
12293 if (IMPORT_NAME(area
))
12294 vty_out(vty
, " area %s import-list %s\n", buf
,
12295 IMPORT_NAME(area
));
12297 if (PREFIX_NAME_IN(area
))
12298 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
12299 PREFIX_NAME_IN(area
));
12301 if (PREFIX_NAME_OUT(area
))
12302 vty_out(vty
, " area %s filter-list prefix %s out\n",
12303 buf
, PREFIX_NAME_OUT(area
));
12309 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
12311 struct ospf_nbr_nbma
*nbr_nbma
;
12312 struct route_node
*rn
;
12314 /* Static Neighbor configuration print. */
12315 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
12316 if ((nbr_nbma
= rn
->info
)) {
12317 vty_out(vty
, " neighbor %pI4", &nbr_nbma
->addr
);
12319 if (nbr_nbma
->priority
12320 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
12321 vty_out(vty
, " priority %d",
12322 nbr_nbma
->priority
);
12324 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
12325 vty_out(vty
, " poll-interval %d",
12328 vty_out(vty
, "\n");
12334 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
12336 struct listnode
*node
;
12337 struct ospf_vl_data
*vl_data
;
12338 const char *auth_str
;
12339 char buf
[INET_ADDRSTRLEN
];
12341 /* Virtual-Link print */
12342 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
12343 struct listnode
*n2
;
12344 struct crypt_key
*ck
;
12345 struct ospf_interface
*oi
;
12347 if (vl_data
!= NULL
) {
12348 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
12349 vl_data
->vl_area_id_fmt
);
12350 oi
= vl_data
->vl_oi
;
12353 if (OSPF_IF_PARAM(oi
, v_hello
)
12354 != OSPF_HELLO_INTERVAL_DEFAULT
12355 || OSPF_IF_PARAM(oi
, v_wait
)
12356 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
12357 || OSPF_IF_PARAM(oi
, retransmit_interval
)
12358 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
12359 || OSPF_IF_PARAM(oi
, transmit_delay
)
12360 != OSPF_TRANSMIT_DELAY_DEFAULT
)
12362 " area %s virtual-link %pI4 hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
12363 buf
, &vl_data
->vl_peer
,
12364 OSPF_IF_PARAM(oi
, v_hello
),
12365 OSPF_IF_PARAM(oi
, retransmit_interval
),
12366 OSPF_IF_PARAM(oi
, transmit_delay
),
12367 OSPF_IF_PARAM(oi
, v_wait
));
12369 vty_out(vty
, " area %s virtual-link %pI4\n", buf
,
12370 &vl_data
->vl_peer
);
12372 auth_str
= interface_config_auth_str(
12373 IF_DEF_PARAMS(oi
->ifp
));
12376 " area %s virtual-link %pI4 authentication%s\n",
12377 buf
, &vl_data
->vl_peer
, auth_str
);
12379 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
12382 " area %s virtual-link %pI4 authentication-key %s\n",
12383 buf
, &vl_data
->vl_peer
,
12384 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12387 for (ALL_LIST_ELEMENTS_RO(
12388 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12392 " area %s virtual-link %pI4 message-digest-key %d md5 %s\n",
12393 buf
, &vl_data
->vl_peer
,
12394 ck
->key_id
, ck
->auth_key
);
12402 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
12406 /* redistribute print. */
12407 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
12408 struct list
*red_list
;
12409 struct listnode
*node
;
12410 struct ospf_redist
*red
;
12412 red_list
= ospf
->redist
[type
];
12416 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12417 vty_out(vty
, " redistribute %s",
12418 zebra_route_string(type
));
12420 vty_out(vty
, " %d", red
->instance
);
12422 if (red
->dmetric
.value
>= 0)
12423 vty_out(vty
, " metric %d", red
->dmetric
.value
);
12425 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12426 vty_out(vty
, " metric-type 1");
12428 if (ROUTEMAP_NAME(red
))
12429 vty_out(vty
, " route-map %s",
12430 ROUTEMAP_NAME(red
));
12432 vty_out(vty
, "\n");
12439 static int ospf_cfg_write_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
12442 struct advRtr
*rtr
= bucket
->data
;
12443 struct vty
*vty
= (struct vty
*)arg
;
12445 vty_out(vty
, " graceful-restart helper enable %pI4\n",
12447 return HASHWALK_CONTINUE
;
12450 static void config_write_ospf_gr(struct vty
*vty
, struct ospf
*ospf
)
12452 if (!ospf
->gr_info
.restart_support
)
12455 if (ospf
->gr_info
.grace_period
== OSPF_DFLT_GRACE_INTERVAL
)
12456 vty_out(vty
, " graceful-restart\n");
12458 vty_out(vty
, " graceful-restart grace-period %u\n",
12459 ospf
->gr_info
.grace_period
);
12462 static int config_write_ospf_gr_helper(struct vty
*vty
, struct ospf
*ospf
)
12464 if (ospf
->is_helper_supported
)
12465 vty_out(vty
, " graceful-restart helper enable\n");
12467 if (!ospf
->strict_lsa_check
)
12469 " no graceful-restart helper strict-lsa-checking\n");
12471 if (ospf
->only_planned_restart
)
12472 vty_out(vty
, " graceful-restart helper planned-only\n");
12474 if (ospf
->supported_grace_time
!= OSPF_MAX_GRACE_INTERVAL
)
12476 " graceful-restart helper supported-grace-time %d\n",
12477 ospf
->supported_grace_time
);
12479 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
12480 hash_walk(ospf
->enable_rtr_list
,
12481 ospf_cfg_write_helper_dis_rtr_walkcb
, vty
);
12486 static int config_write_ospf_external_aggregator(struct vty
*vty
,
12489 struct route_node
*rn
;
12491 if (ospf
->aggr_delay_interval
!= OSPF_EXTL_AGGR_DEFAULT_DELAY
)
12492 vty_out(vty
, " aggregation timer %u\n",
12493 ospf
->aggr_delay_interval
);
12495 /* print 'summary-address A.B.C.D/M' */
12496 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
12498 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
12500 vty_out(vty
, " summary-address %pI4/%d",
12501 &aggr
->p
.prefix
, aggr
->p
.prefixlen
);
12503 vty_out(vty
, " tag %u", aggr
->tag
);
12505 if (CHECK_FLAG(aggr
->flags
,
12506 OSPF_EXTERNAL_AGGRT_NO_ADVERTISE
))
12507 vty_out(vty
, " no-advertise");
12509 vty_out(vty
, "\n");
12515 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
12517 if (ospf
->default_metric
!= -1)
12518 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
12522 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
12525 struct ospf_redist
*red
;
12528 /* distribute-list print. */
12529 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
12530 if (DISTRIBUTE_NAME(ospf
, type
))
12531 vty_out(vty
, " distribute-list %s out %s\n",
12532 DISTRIBUTE_NAME(ospf
, type
),
12533 zebra_route_string(type
));
12535 /* default-information print. */
12536 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
12537 vty_out(vty
, " default-information originate");
12538 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
12539 vty_out(vty
, " always");
12541 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
12543 if (red
->dmetric
.value
>= 0)
12544 vty_out(vty
, " metric %d",
12545 red
->dmetric
.value
);
12547 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12548 vty_out(vty
, " metric-type 1");
12550 if (ROUTEMAP_NAME(red
))
12551 vty_out(vty
, " route-map %s",
12552 ROUTEMAP_NAME(red
));
12555 vty_out(vty
, "\n");
12562 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
12564 struct route_node
*rn
;
12565 struct ospf_distance
*odistance
;
12567 if (ospf
->distance_all
)
12568 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
12570 if (ospf
->distance_intra
|| ospf
->distance_inter
12571 || ospf
->distance_external
) {
12572 vty_out(vty
, " distance ospf");
12574 if (ospf
->distance_intra
)
12575 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
12576 if (ospf
->distance_inter
)
12577 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
12578 if (ospf
->distance_external
)
12579 vty_out(vty
, " external %d", ospf
->distance_external
);
12581 vty_out(vty
, "\n");
12584 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
12585 if ((odistance
= rn
->info
) != NULL
) {
12586 vty_out(vty
, " distance %d %pFX %s\n",
12587 odistance
->distance
, &rn
->p
,
12588 odistance
->access_list
? odistance
->access_list
12594 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
12598 /* `router ospf' print. */
12599 if (ospf
->instance
&& strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12600 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
12602 } else if (ospf
->instance
) {
12603 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
12604 } else if (strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12605 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
12607 vty_out(vty
, "router ospf\n");
12609 if (!ospf
->networks
) {
12614 /* Router ID print. */
12615 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
12616 vty_out(vty
, " ospf router-id %pI4\n",
12617 &ospf
->router_id_static
);
12619 /* zebra opaque attributes configuration. */
12620 if (CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
))
12621 vty_out(vty
, " ospf send-extra-data zebra\n");
12623 /* ABR type print. */
12624 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
12625 vty_out(vty
, " ospf abr-type %s\n",
12626 ospf_abr_type_str
[ospf
->abr_type
]);
12628 /* log-adjacency-changes flag print. */
12629 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
12630 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
12631 vty_out(vty
, " log-adjacency-changes detail\n");
12632 else if (!SAVE_OSPF_LOG_ADJACENCY_CHANGES
)
12633 vty_out(vty
, " log-adjacency-changes\n");
12634 } else if (SAVE_OSPF_LOG_ADJACENCY_CHANGES
) {
12635 vty_out(vty
, " no log-adjacency-changes\n");
12638 /* RFC1583 compatibility flag print -- Compatible with CISCO
12640 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
12641 vty_out(vty
, " compatible rfc1583\n");
12643 /* auto-cost reference-bandwidth configuration. */
12644 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
12646 "! Important: ensure reference bandwidth is consistent across all routers\n");
12647 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
12648 ospf
->ref_bandwidth
);
12651 /* SPF timers print. */
12652 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
12653 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
12654 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
12655 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
12656 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
12658 /* LSA timers print. */
12659 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
12660 vty_out(vty
, " timers throttle lsa all %d\n",
12661 ospf
->min_ls_interval
);
12662 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
12663 vty_out(vty
, " timers lsa min-arrival %d\n",
12664 ospf
->min_ls_arrival
);
12666 /* Write multiplier print. */
12667 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
12668 vty_out(vty
, " ospf write-multiplier %d\n",
12669 ospf
->write_oi_count
);
12671 if (ospf
->max_multipath
!= MULTIPATH_NUM
)
12672 vty_out(vty
, " maximum-paths %d\n", ospf
->max_multipath
);
12674 /* Max-metric router-lsa print */
12675 config_write_stub_router(vty
, ospf
);
12677 /* SPF refresh parameters print. */
12678 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
12679 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
12681 /* Redistribute information print. */
12682 config_write_ospf_redistribute(vty
, ospf
);
12684 /* Graceful Restart print */
12685 config_write_ospf_gr(vty
, ospf
);
12686 config_write_ospf_gr_helper(vty
, ospf
);
12688 /* Print external route aggregation. */
12689 config_write_ospf_external_aggregator(vty
, ospf
);
12691 /* passive-interface print. */
12692 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
12693 vty_out(vty
, " passive-interface default\n");
12695 /* proactive-arp print. */
12696 if (ospf
->proactive_arp
!= OSPF_PROACTIVE_ARP_DEFAULT
) {
12697 if (ospf
->proactive_arp
)
12698 vty_out(vty
, " proactive-arp\n");
12700 vty_out(vty
, " no proactive-arp\n");
12703 /* TI-LFA print. */
12704 if (ospf
->ti_lfa_enabled
) {
12705 if (ospf
->ti_lfa_protection_type
== OSPF_TI_LFA_NODE_PROTECTION
)
12706 vty_out(vty
, " fast-reroute ti-lfa node-protection\n");
12708 vty_out(vty
, " fast-reroute ti-lfa\n");
12711 /* Network area print. */
12712 config_write_network_area(vty
, ospf
);
12714 /* Area config print. */
12715 config_write_ospf_area(vty
, ospf
);
12717 /* static neighbor print. */
12718 config_write_ospf_nbr_nbma(vty
, ospf
);
12720 /* Virtual-Link print. */
12721 config_write_virtual_link(vty
, ospf
);
12723 /* Default metric configuration. */
12724 config_write_ospf_default_metric(vty
, ospf
);
12726 /* Distribute-list and default-information print. */
12727 config_write_ospf_distribute(vty
, ospf
);
12729 /* Distance configuration. */
12730 config_write_ospf_distance(vty
, ospf
);
12732 ospf_opaque_config_write_router(vty
, ospf
);
12734 /* LDP-Sync print */
12735 ospf_ldp_sync_write_config(vty
, ospf
);
12737 vty_out(vty
, "exit\n");
12743 /* OSPF configuration write function. */
12744 static int ospf_config_write(struct vty
*vty
)
12747 struct listnode
*ospf_node
= NULL
;
12750 if (listcount(om
->ospf
) == 0)
12753 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
12754 /* VRF Default check if it is running.
12755 * Upon daemon start, there could be default instance
12756 * in absence of 'router ospf'/oi_running is disabled. */
12757 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
12758 write
+= ospf_config_write_one(vty
, ospf
);
12759 /* For Non-Default VRF simply display the configuration,
12760 * even if it is not oi_running. */
12761 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
12762 write
+= ospf_config_write_one(vty
, ospf
);
12767 void ospf_vty_show_init(void)
12769 /* "show ip ospf" commands. */
12770 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
12772 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
12774 /* "show ip ospf database" commands. */
12775 install_element(VIEW_NODE
, &show_ip_ospf_database_cmd
);
12776 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
12777 install_element(VIEW_NODE
,
12778 &show_ip_ospf_database_type_adv_router_cmd
);
12779 install_element(VIEW_NODE
,
12780 &show_ip_ospf_instance_database_type_adv_router_cmd
);
12781 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
12782 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
12784 /* "show ip ospf interface" commands. */
12785 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
12787 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
12788 /* "show ip ospf interface traffic */
12789 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
12791 /* "show ip ospf neighbor" commands. */
12792 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
12793 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
12794 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
12795 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
12796 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
12797 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
12798 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
12800 install_element(VIEW_NODE
,
12801 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
12802 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
12803 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
12804 install_element(VIEW_NODE
,
12805 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
12806 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
12807 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
12808 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
12810 /* "show ip ospf route" commands. */
12811 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
12812 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
12813 install_element(VIEW_NODE
, &show_ip_ospf_reachable_routers_cmd
);
12814 install_element(VIEW_NODE
, &show_ip_ospf_route_orr_cmd
);
12816 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
12817 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
12818 install_element(VIEW_NODE
,
12819 &show_ip_ospf_instance_reachable_routers_cmd
);
12820 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_orr_cmd
);
12822 /* "show ip ospf vrfs" commands. */
12823 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
12825 /* "show ip ospf gr-helper details" command */
12826 install_element(VIEW_NODE
, &show_ip_ospf_gr_helper_cmd
);
12828 /* "show ip ospf summary-address" command */
12829 install_element(VIEW_NODE
, &show_ip_ospf_external_aggregator_cmd
);
12832 /* Initialization of OSPF interface. */
12833 static void ospf_vty_if_init(void)
12835 /* Install interface node. */
12836 if_cmd_init(config_write_interface
);
12838 /* "ip ospf authentication" commands. */
12839 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
12840 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
12841 install_element(INTERFACE_NODE
,
12842 &no_ip_ospf_authentication_args_addr_cmd
);
12843 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
12844 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
12845 install_element(INTERFACE_NODE
,
12846 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
12847 install_element(INTERFACE_NODE
,
12848 &no_ospf_authentication_key_authkey_addr_cmd
);
12850 /* "ip ospf message-digest-key" commands. */
12851 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
12852 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
12854 /* "ip ospf cost" commands. */
12855 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
12856 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
12858 /* "ip ospf mtu-ignore" commands. */
12859 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
12860 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
12862 /* "ip ospf dead-interval" commands. */
12863 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
12864 install_element(INTERFACE_NODE
,
12865 &ip_ospf_dead_interval_minimal_addr_cmd
);
12866 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
12868 /* "ip ospf hello-interval" commands. */
12869 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
12870 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
12872 /* "ip ospf network" commands. */
12873 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
12874 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
12876 /* "ip ospf priority" commands. */
12877 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
12878 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
12880 /* "ip ospf retransmit-interval" commands. */
12881 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
12882 install_element(INTERFACE_NODE
,
12883 &no_ip_ospf_retransmit_interval_addr_cmd
);
12885 /* "ip ospf transmit-delay" commands. */
12886 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
12887 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
12889 /* "ip ospf area" commands. */
12890 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
12891 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
12893 /* "ip ospf passive" commands. */
12894 install_element(INTERFACE_NODE
, &ip_ospf_passive_cmd
);
12895 install_element(INTERFACE_NODE
, &no_ip_ospf_passive_cmd
);
12897 /* These commands are compatibitliy for previous version. */
12898 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
12899 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
12900 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
12901 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
12902 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
12903 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
12904 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
12905 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
12906 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
12907 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
12908 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
12909 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
12910 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
12911 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
12912 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
12913 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
12914 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
12917 static void ospf_vty_zebra_init(void)
12919 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
12920 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
12921 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
12922 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
12924 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
12925 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
12927 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
12928 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
12930 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
12931 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
12933 install_element(OSPF_NODE
, &ospf_distance_cmd
);
12934 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
12935 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
12936 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
12938 /*Ospf garcefull restart helper configurations */
12939 install_element(OSPF_NODE
, &ospf_gr_helper_enable_cmd
);
12940 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_cmd
);
12941 install_element(OSPF_NODE
, &ospf_gr_helper_enable_lsacheck_cmd
);
12942 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_lsacheck_cmd
);
12943 install_element(OSPF_NODE
, &ospf_gr_helper_supported_grace_time_cmd
);
12944 install_element(OSPF_NODE
, &no_ospf_gr_helper_supported_grace_time_cmd
);
12945 install_element(OSPF_NODE
, &ospf_gr_helper_planned_only_cmd
);
12946 install_element(OSPF_NODE
, &no_ospf_gr_helper_planned_only_cmd
);
12948 /* External LSA summarisation config commands.*/
12949 install_element(OSPF_NODE
, &ospf_external_route_aggregation_cmd
);
12950 install_element(OSPF_NODE
, &no_ospf_external_route_aggregation_cmd
);
12951 install_element(OSPF_NODE
,
12952 &ospf_external_route_aggregation_no_adrvertise_cmd
);
12953 install_element(OSPF_NODE
,
12954 &no_ospf_external_route_aggregation_no_adrvertise_cmd
);
12955 install_element(OSPF_NODE
, &ospf_route_aggregation_timer_cmd
);
12956 install_element(OSPF_NODE
, &no_ospf_route_aggregation_timer_cmd
);
12959 static int ospf_config_write(struct vty
*vty
);
12960 static struct cmd_node ospf_node
= {
12963 .parent_node
= CONFIG_NODE
,
12964 .prompt
= "%s(config-router)# ",
12965 .config_write
= ospf_config_write
,
12968 static void ospf_interface_clear(struct interface
*ifp
)
12970 if (!if_is_operative(ifp
))
12973 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
12974 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
12976 ospf_if_reset(ifp
);
12979 DEFUN (clear_ip_ospf_interface
,
12980 clear_ip_ospf_interface_cmd
,
12981 "clear ip ospf [vrf NAME] interface [IFNAME]",
12984 "OSPF information\n"
12986 "Interface information\n"
12987 "Interface name\n")
12989 int idx_ifname
= 0;
12991 struct interface
*ifp
;
12992 struct listnode
*node
;
12993 struct ospf
*ospf
= NULL
;
12994 char *vrf_name
= NULL
;
12995 vrf_id_t vrf_id
= VRF_DEFAULT
;
12996 struct vrf
*vrf
= NULL
;
12998 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
12999 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
13000 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
13003 vrf
= vrf_lookup_by_name(vrf_name
);
13005 vrf_id
= vrf
->vrf_id
;
13007 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
13008 /* Clear all the ospfv2 interfaces. */
13009 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
13010 if (vrf_id
!= ospf
->vrf_id
)
13013 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
13014 FOR_ALL_INTERFACES (vrf
, ifp
)
13015 ospf_interface_clear(ifp
);
13018 /* Interface name is specified. */
13019 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
13021 vty_out(vty
, "No such interface name\n");
13023 ospf_interface_clear(ifp
);
13026 return CMD_SUCCESS
;
13029 DEFPY_HIDDEN(ospf_lsa_refresh_timer
, ospf_lsa_refresh_timer_cmd
,
13030 "[no$no] ospf lsa-refresh [(120-1800)]$value",
13032 "OSPF lsa refresh timer\n"
13033 "timer value in seconds\n")
13035 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
)
13038 ospf
->lsa_refresh_timer
= OSPF_LS_REFRESH_TIME
;
13040 ospf
->lsa_refresh_timer
= value
;
13042 return CMD_SUCCESS
;
13045 DEFPY_HIDDEN(ospf_maxage_delay_timer
, ospf_maxage_delay_timer_cmd
,
13046 "[no$no] ospf maxage-delay [(0-60)]$value",
13048 "OSPF lsa maxage delay timer\n"
13049 "timer value in seconds\n")
13051 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
)
13054 ospf
->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
13056 ospf
->maxage_delay
= value
;
13058 THREAD_OFF(ospf
->t_maxage
);
13059 OSPF_TIMER_ON(ospf
->t_maxage
, ospf_maxage_lsa_remover
,
13060 ospf
->maxage_delay
);
13062 return CMD_SUCCESS
;
13065 void ospf_vty_clear_init(void)
13067 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
13068 install_element(ENABLE_NODE
, &clear_ip_ospf_process_cmd
);
13069 install_element(ENABLE_NODE
, &clear_ip_ospf_neighbor_cmd
);
13073 /* Install OSPF related vty commands. */
13074 void ospf_vty_init(void)
13076 /* Install ospf top node. */
13077 install_node(&ospf_node
);
13079 /* "router ospf" commands. */
13080 install_element(CONFIG_NODE
, &router_ospf_cmd
);
13081 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
13084 install_default(OSPF_NODE
);
13086 /* "ospf router-id" commands. */
13087 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
13088 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
13089 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
13091 /* "passive-interface" commands. */
13092 install_element(OSPF_NODE
, &ospf_passive_interface_default_cmd
);
13093 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
13094 install_element(OSPF_NODE
, &no_ospf_passive_interface_default_cmd
);
13095 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
13097 /* "ospf abr-type" commands. */
13098 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
13099 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
13101 /* "ospf log-adjacency-changes" commands. */
13102 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
13103 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
13104 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
13105 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
13107 /* "ospf rfc1583-compatible" commands. */
13108 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
13109 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
13110 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
13111 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
13113 /* "ospf send-extra-data zebra" commands. */
13114 install_element(OSPF_NODE
, &ospf_send_extra_data_cmd
);
13116 /* "network area" commands. */
13117 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
13118 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
13120 /* "area authentication" commands. */
13121 install_element(OSPF_NODE
,
13122 &ospf_area_authentication_message_digest_cmd
);
13123 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
13124 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
13126 /* "area range" commands. */
13127 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
13128 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
13129 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
13130 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
13131 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
13133 /* "area virtual-link" commands. */
13134 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
13135 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
13136 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
13137 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
13140 /* "area stub" commands. */
13141 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
13142 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
13143 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
13144 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
13146 /* "area nssa" commands. */
13147 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
13148 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
13149 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
13150 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
13151 install_element(OSPF_NODE
, &ospf_area_nssa_suppress_fa_cmd
);
13152 install_element(OSPF_NODE
, &no_ospf_area_nssa_suppress_fa_cmd
);
13153 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
13155 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
13156 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
13158 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
13159 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
13161 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
13162 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
13164 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
13165 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
13167 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
13168 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
13170 /* SPF timer commands */
13171 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
13172 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
13174 /* LSA timers commands */
13175 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
13176 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
13177 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
13178 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
13180 /* refresh timer commands */
13181 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
13182 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
13184 /* max-metric commands */
13185 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
13186 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
13187 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
13188 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
13189 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
13190 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
13192 /* reference bandwidth commands */
13193 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
13194 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
13196 /* "neighbor" commands. */
13197 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
13198 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
13199 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
13200 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
13202 /* write multiplier commands */
13203 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
13204 install_element(OSPF_NODE
, &write_multiplier_cmd
);
13205 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
13206 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
13208 /* "proactive-arp" commands. */
13209 install_element(OSPF_NODE
, &ospf_proactive_arp_cmd
);
13210 install_element(OSPF_NODE
, &no_ospf_proactive_arp_cmd
);
13212 /* TI-LFA commands */
13213 install_element(OSPF_NODE
, &ospf_ti_lfa_cmd
);
13214 install_element(OSPF_NODE
, &no_ospf_ti_lfa_cmd
);
13216 /* Max path configurations */
13217 install_element(OSPF_NODE
, &ospf_max_multipath_cmd
);
13218 install_element(OSPF_NODE
, &no_ospf_max_multipath_cmd
);
13220 vrf_cmd_init(NULL
);
13222 install_element(OSPF_NODE
, &ospf_lsa_refresh_timer_cmd
);
13223 install_element(OSPF_NODE
, &ospf_maxage_delay_timer_cmd
);
13225 /* Init interface related vty commands. */
13226 ospf_vty_if_init();
13228 /* Init zebra related vty commands. */
13229 ospf_vty_zebra_init();