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"
60 FRR_CFG_DEFAULT_BOOL(OSPF_LOG_ADJACENCY_CHANGES
,
61 { .val_bool
= true, .match_profile
= "datacenter", },
62 { .val_bool
= false },
65 static const char *const ospf_network_type_str
[] = {
66 "Null", "POINTOPOINT", "BROADCAST", "NBMA", "POINTOMULTIPOINT",
67 "VIRTUALLINK", "LOOPBACK"};
69 /* Utility functions. */
70 int str2area_id(const char *str
, struct in_addr
*area_id
, int *area_id_fmt
)
74 area_id
->s_addr
= htonl(strtoul(str
, &ep
, 10));
75 if (*ep
&& !inet_aton(str
, area_id
))
79 *ep
? OSPF_AREA_ID_FMT_DOTTEDQUAD
: OSPF_AREA_ID_FMT_DECIMAL
;
84 static void area_id2str(char *buf
, int length
, struct in_addr
*area_id
,
87 if (area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
88 inet_ntop(AF_INET
, area_id
, buf
, length
);
90 snprintf(buf
, length
, "%lu",
91 (unsigned long)ntohl(area_id
->s_addr
));
94 static int str2metric(const char *str
, int *metric
)
100 *metric
= strtol(str
, NULL
, 10);
101 if (*metric
< 0 || *metric
> 16777214) {
102 /* vty_out (vty, "OSPF metric value is invalid\n"); */
109 static int str2metric_type(const char *str
, int *metric_type
)
115 if (strncmp(str
, "1", 1) == 0)
116 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
117 else if (strncmp(str
, "2", 1) == 0)
118 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
125 int ospf_oi_count(struct interface
*ifp
)
127 struct route_node
*rn
;
130 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
137 #define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
138 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
139 vrf_name = argv[idx_vrf + 1]->arg; \
140 all_vrf = strmatch(vrf_name, "all"); \
143 static int ospf_router_cmd_parse(struct vty
*vty
, struct cmd_token
*argv
[],
144 const int argc
, unsigned short *instance
,
145 const char **vrf_name
)
147 int idx_vrf
= 0, idx_inst
= 0;
150 if (argv_find(argv
, argc
, "(1-65535)", &idx_inst
)) {
151 if (ospf_instance
== 0) {
153 "%% OSPF is not running in instance mode\n");
154 return CMD_WARNING_CONFIG_FAILED
;
157 *instance
= strtoul(argv
[idx_inst
]->arg
, NULL
, 10);
160 *vrf_name
= VRF_DEFAULT_NAME
;
161 if (argv_find(argv
, argc
, "vrf", &idx_vrf
)) {
162 if (ospf_instance
!= 0) {
164 "%% VRF is not supported in instance mode\n");
165 return CMD_WARNING_CONFIG_FAILED
;
168 *vrf_name
= argv
[idx_vrf
+ 1]->arg
;
174 static void ospf_show_vrf_name(struct ospf
*ospf
, struct vty
*vty
,
175 json_object
*json
, uint8_t use_vrf
)
179 json_object_string_add(json
, "vrfName",
180 ospf_get_name(ospf
));
181 json_object_int_add(json
, "vrfId", ospf
->vrf_id
);
183 vty_out(vty
, "VRF Name: %s\n", ospf_get_name(ospf
));
187 #ifndef VTYSH_EXTRACT_PL
188 #include "ospfd/ospf_vty_clippy.c"
191 DEFUN_NOSH (router_ospf
,
193 "router ospf [{(1-65535)|vrf NAME}]",
194 "Enable a routing process\n"
195 "Start OSPF configuration\n"
199 unsigned short instance
;
200 const char *vrf_name
;
201 bool created
= false;
205 ret
= ospf_router_cmd_parse(vty
, argv
, argc
, &instance
, &vrf_name
);
206 if (ret
!= CMD_SUCCESS
)
209 if (instance
!= ospf_instance
) {
210 VTY_PUSH_CONTEXT_NULL(OSPF_NODE
);
211 return CMD_NOT_MY_INSTANCE
;
214 ospf
= ospf_get(instance
, vrf_name
, &created
);
217 if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
218 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
220 if (IS_DEBUG_OSPF_EVENT
)
222 "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
223 ospf
->instance
, ospf_get_name(ospf
), ospf
->vrf_id
,
226 VTY_PUSH_CONTEXT(OSPF_NODE
, ospf
);
231 DEFUN (no_router_ospf
,
233 "no router ospf [{(1-65535)|vrf NAME}]",
235 "Enable a routing process\n"
236 "Start OSPF configuration\n"
240 unsigned short instance
;
241 const char *vrf_name
;
245 ret
= ospf_router_cmd_parse(vty
, argv
, argc
, &instance
, &vrf_name
);
246 if (ret
!= CMD_SUCCESS
)
249 if (instance
!= ospf_instance
)
250 return CMD_NOT_MY_INSTANCE
;
252 ospf
= ospf_lookup(instance
, vrf_name
);
256 ret
= CMD_WARNING_CONFIG_FAILED
;
262 DEFPY (ospf_router_id
,
264 "ospf router-id A.B.C.D",
265 "OSPF specific commands\n"
266 "router-id for the OSPF process\n"
267 "OSPF router-id in IP address format\n")
269 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
271 struct listnode
*node
;
272 struct ospf_area
*area
;
274 ospf
->router_id_static
= router_id
;
276 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
277 if (area
->full_nbrs
) {
279 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
283 ospf_router_id_update(ospf
);
288 DEFUN_HIDDEN (ospf_router_id_old
,
289 ospf_router_id_old_cmd
,
291 "router-id for the OSPF process\n"
292 "OSPF router-id in IP address format\n")
294 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
296 struct listnode
*node
;
297 struct ospf_area
*area
;
298 struct in_addr router_id
;
301 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &router_id
);
303 vty_out(vty
, "Please specify Router ID by A.B.C.D\n");
304 return CMD_WARNING_CONFIG_FAILED
;
307 ospf
->router_id_static
= router_id
;
309 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
310 if (area
->full_nbrs
) {
312 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
316 ospf_router_id_update(ospf
);
321 DEFPY (no_ospf_router_id
,
322 no_ospf_router_id_cmd
,
323 "no ospf router-id [A.B.C.D]",
325 "OSPF specific commands\n"
326 "router-id for the OSPF process\n"
327 "OSPF router-id in IP address format\n")
329 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
330 struct listnode
*node
;
331 struct ospf_area
*area
;
334 if (!IPV4_ADDR_SAME(&ospf
->router_id_static
, &router_id
)) {
335 vty_out(vty
, "%% OSPF router-id doesn't match\n");
336 return CMD_WARNING_CONFIG_FAILED
;
340 ospf
->router_id_static
.s_addr
= 0;
342 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
343 if (area
->full_nbrs
) {
345 "For this router-id change to take effect, use \"clear ip ospf process\" command\n");
349 ospf_router_id_update(ospf
);
355 static void ospf_passive_interface_default_update(struct ospf
*ospf
,
359 struct ospf_interface
*oi
;
361 ospf
->passive_interface_default
= newval
;
363 /* update multicast memberships */
364 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, ln
, oi
))
365 ospf_if_set_multicast(oi
);
368 static void ospf_passive_interface_update(struct interface
*ifp
,
369 struct ospf_if_params
*params
,
370 struct in_addr addr
, uint8_t newval
)
372 struct route_node
*rn
;
374 if (OSPF_IF_PARAM_CONFIGURED(params
, passive_interface
)) {
375 if (params
->passive_interface
== newval
)
378 params
->passive_interface
= newval
;
379 UNSET_IF_PARAM(params
, passive_interface
);
380 if (params
!= IF_DEF_PARAMS(ifp
)) {
381 ospf_free_if_params(ifp
, addr
);
382 ospf_if_update_params(ifp
, addr
);
385 params
->passive_interface
= newval
;
386 SET_IF_PARAM(params
, passive_interface
);
390 * XXX We should call ospf_if_set_multicast on exactly those
391 * interfaces for which the passive property changed. It is too much
392 * work to determine this set, so we do this for every interface.
393 * This is safe and reasonable because ospf_if_set_multicast uses a
394 * record of joined groups to avoid systems calls if the desired
395 * memberships match the current memership.
398 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
399 struct ospf_interface
*oi
= rn
->info
;
402 ospf_if_set_multicast(oi
);
406 * XXX It is not clear what state transitions the interface needs to
407 * undergo when going from active to passive and vice versa. Fixing
408 * this will require precise identification of interfaces having such a
413 DEFUN (ospf_passive_interface_default
,
414 ospf_passive_interface_default_cmd
,
415 "passive-interface default",
416 "Suppress routing updates on an interface\n"
417 "Suppress routing updates on interfaces by default\n")
419 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
421 ospf_passive_interface_default_update(ospf
, OSPF_IF_PASSIVE
);
426 DEFUN_HIDDEN (ospf_passive_interface_addr
,
427 ospf_passive_interface_addr_cmd
,
428 "passive-interface IFNAME [A.B.C.D]",
429 "Suppress routing updates on an interface\n"
433 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
435 struct interface
*ifp
= NULL
;
436 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
437 struct ospf_if_params
*params
;
441 "This command is deprecated, because it is not VRF-aware.\n");
443 "Please, use \"ip ospf passive\" on an interface instead.\n");
445 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
446 ifp
= if_get_by_name(argv
[1]->arg
, ospf
->vrf_id
, ospf
->name
);
449 vty_out(vty
, "interface %s not found.\n", (char *)argv
[1]->arg
);
450 return CMD_WARNING_CONFIG_FAILED
;
454 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
457 "Please specify interface address by A.B.C.D\n");
458 return CMD_WARNING_CONFIG_FAILED
;
461 params
= ospf_get_if_params(ifp
, addr
);
462 ospf_if_update_params(ifp
, addr
);
464 params
= IF_DEF_PARAMS(ifp
);
467 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_PASSIVE
);
472 DEFUN (no_ospf_passive_interface_default
,
473 no_ospf_passive_interface_default_cmd
,
474 "no passive-interface default",
476 "Allow routing updates on an interface\n"
477 "Allow routing updates on interfaces by default\n")
479 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
481 ospf_passive_interface_default_update(ospf
, OSPF_IF_ACTIVE
);
486 DEFUN_HIDDEN (no_ospf_passive_interface
,
487 no_ospf_passive_interface_addr_cmd
,
488 "no passive-interface IFNAME [A.B.C.D]",
490 "Allow routing updates on an interface\n"
494 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
496 struct interface
*ifp
= NULL
;
497 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
498 struct ospf_if_params
*params
;
502 "This command is deprecated, because it is not VRF-aware.\n");
504 "Please, use \"no ip ospf passive\" on an interface instead.\n");
506 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
507 ifp
= if_get_by_name(argv
[2]->arg
, ospf
->vrf_id
, ospf
->name
);
510 vty_out(vty
, "interface %s not found.\n", (char *)argv
[2]->arg
);
511 return CMD_WARNING_CONFIG_FAILED
;
515 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
518 "Please specify interface address by A.B.C.D\n");
519 return CMD_WARNING_CONFIG_FAILED
;
521 params
= ospf_lookup_if_params(ifp
, addr
);
525 params
= IF_DEF_PARAMS(ifp
);
528 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_ACTIVE
);
534 DEFUN (ospf_network_area
,
535 ospf_network_area_cmd
,
536 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
537 "Enable routing on an IP network\n"
538 "OSPF network prefix\n"
539 "Set the OSPF area ID\n"
540 "OSPF area ID in IP address format\n"
541 "OSPF area ID as a decimal value\n")
543 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
544 int idx_ipv4_prefixlen
= 1;
545 int idx_ipv4_number
= 3;
546 struct prefix_ipv4 p
;
547 struct in_addr area_id
;
551 if (ospf
->instance
) {
553 "The network command is not supported in multi-instance ospf\n");
554 return CMD_WARNING_CONFIG_FAILED
;
557 count
= ospf_count_area_params(ospf
);
560 "Please remove all ip ospf area x.x.x.x commands first.\n");
561 if (IS_DEBUG_OSPF_EVENT
)
563 "%s ospf vrf %s num of %u ip ospf area x config",
564 __func__
, ospf_get_name(ospf
), count
);
565 return CMD_WARNING_CONFIG_FAILED
;
568 /* Get network prefix and Area ID. */
569 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
570 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
572 ret
= ospf_network_set(ospf
, &p
, area_id
, format
);
574 vty_out(vty
, "There is already same network statement.\n");
575 return CMD_WARNING_CONFIG_FAILED
;
581 DEFUN (no_ospf_network_area
,
582 no_ospf_network_area_cmd
,
583 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
585 "Enable routing on an IP network\n"
586 "OSPF network prefix\n"
587 "Set the OSPF area ID\n"
588 "OSPF area ID in IP address format\n"
589 "OSPF area ID as a decimal value\n")
591 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
592 int idx_ipv4_prefixlen
= 2;
593 int idx_ipv4_number
= 4;
594 struct prefix_ipv4 p
;
595 struct in_addr area_id
;
598 if (ospf
->instance
) {
600 "The network command is not supported in multi-instance ospf\n");
601 return CMD_WARNING_CONFIG_FAILED
;
604 /* Get network prefix and Area ID. */
605 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
606 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
608 ret
= ospf_network_unset(ospf
, &p
, area_id
);
611 "Can't find specified network area configuration.\n");
612 return CMD_WARNING_CONFIG_FAILED
;
618 DEFUN (ospf_area_range
,
620 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
621 "OSPF area parameters\n"
622 "OSPF area ID in IP address format\n"
623 "OSPF area ID as a decimal value\n"
624 "Summarize routes matching address/mask (border routers only)\n"
625 "Area range prefix\n"
626 "Advertise this range (default)\n"
627 "User specified metric for this range\n"
628 "Advertised metric for this range\n")
630 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
631 int idx_ipv4_number
= 1;
632 int idx_ipv4_prefixlen
= 3;
634 struct prefix_ipv4 p
;
635 struct in_addr area_id
;
639 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
640 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
642 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
643 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
646 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
647 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
653 DEFUN (ospf_area_range_cost
,
654 ospf_area_range_cost_cmd
,
655 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M {cost (0-16777215)|substitute A.B.C.D/M}",
656 "OSPF area parameters\n"
657 "OSPF area ID in IP address format\n"
658 "OSPF area ID as a decimal value\n"
659 "Summarize routes matching address/mask (border routers only)\n"
660 "Area range prefix\n"
661 "User specified metric for this range\n"
662 "Advertised metric for this range\n"
663 "Announce area range as another prefix\n"
664 "Network prefix to be announced instead of range\n")
666 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
667 int idx_ipv4_number
= 1;
668 int idx_ipv4_prefixlen
= 3;
670 struct prefix_ipv4 p
, s
;
671 struct in_addr area_id
;
675 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
676 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
678 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
679 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
682 if (argv_find(argv
, argc
, "cost", &idx
)) {
683 cost
= strtoul(argv
[idx
+ 1]->arg
, NULL
, 10);
684 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
688 if (argv_find(argv
, argc
, "substitute", &idx
)) {
689 str2prefix_ipv4(argv
[idx
+ 1]->arg
, &s
);
690 ospf_area_range_substitute_set(ospf
, area_id
, &p
, &s
);
696 DEFUN (ospf_area_range_not_advertise
,
697 ospf_area_range_not_advertise_cmd
,
698 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
699 "OSPF area parameters\n"
700 "OSPF area ID in IP address format\n"
701 "OSPF area ID as a decimal value\n"
702 "Summarize routes matching address/mask (border routers only)\n"
703 "Area range prefix\n"
704 "DoNotAdvertise this range\n")
706 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
707 int idx_ipv4_number
= 1;
708 int idx_ipv4_prefixlen
= 3;
709 struct prefix_ipv4 p
;
710 struct in_addr area_id
;
713 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
714 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
716 ospf_area_range_set(ospf
, area_id
, &p
, 0);
717 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
719 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
724 DEFUN (no_ospf_area_range
,
725 no_ospf_area_range_cmd
,
726 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
728 "OSPF area parameters\n"
729 "OSPF area ID in IP address format\n"
730 "OSPF area ID as a decimal value\n"
731 "Summarize routes matching address/mask (border routers only)\n"
732 "Area range prefix\n"
733 "User specified metric for this range\n"
734 "Advertised metric for this range\n"
735 "Advertise this range (default)\n"
736 "User specified metric for this range\n"
737 "Advertised metric for this range\n"
738 "DoNotAdvertise this range\n")
740 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
741 int idx_ipv4_number
= 2;
742 int idx_ipv4_prefixlen
= 4;
743 struct prefix_ipv4 p
;
744 struct in_addr area_id
;
747 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
748 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
750 ospf_area_range_unset(ospf
, area_id
, &p
);
755 DEFUN (no_ospf_area_range_substitute
,
756 no_ospf_area_range_substitute_cmd
,
757 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
759 "OSPF area parameters\n"
760 "OSPF area ID in IP address format\n"
761 "OSPF area ID as a decimal value\n"
762 "Summarize routes matching address/mask (border routers only)\n"
763 "Area range prefix\n"
764 "Announce area range as another prefix\n"
765 "Network prefix to be announced instead of range\n")
767 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
768 int idx_ipv4_number
= 2;
769 int idx_ipv4_prefixlen
= 4;
770 int idx_ipv4_prefixlen_2
= 6;
771 struct prefix_ipv4 p
, s
;
772 struct in_addr area_id
;
775 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
776 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
777 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
779 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
785 /* Command Handler Logic in VLink stuff is delicate!!
787 ALTER AT YOUR OWN RISK!!!!
789 Various dummy values are used to represent 'NoChange' state for
790 VLink configuration NOT being changed by a VLink command, and
791 special syntax is used within the command strings so that the
792 typed in command verbs can be seen in the configuration command
793 bacckend handler. This is to drastically reduce the verbeage
794 required to coe up with a reasonably compatible Cisco VLink command
796 - Matthew Grant <grantma@anathoth.gen.nz>
797 Wed, 21 Feb 2001 15:13:52 +1300
800 /* Configuration data for virtual links
802 struct ospf_vl_config_data
{
803 struct vty
*vty
; /* vty stuff */
804 struct in_addr area_id
; /* area ID from command line */
805 int area_id_fmt
; /* command line area ID format */
806 struct in_addr vl_peer
; /* command line vl_peer */
807 int auth_type
; /* Authehntication type, if given */
808 char *auth_key
; /* simple password if present */
809 int crypto_key_id
; /* Cryptographic key ID */
810 char *md5_key
; /* MD5 authentication key */
811 int hello_interval
; /* Obvious what these are... */
812 int retransmit_interval
;
817 static void ospf_vl_config_data_init(struct ospf_vl_config_data
*vl_config
,
820 memset(vl_config
, 0, sizeof(struct ospf_vl_config_data
));
821 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
822 vl_config
->vty
= vty
;
825 static struct ospf_vl_data
*
826 ospf_find_vl_data(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
828 struct ospf_area
*area
;
829 struct ospf_vl_data
*vl_data
;
831 struct in_addr area_id
;
833 vty
= vl_config
->vty
;
834 area_id
= vl_config
->area_id
;
836 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
) {
838 "Configuring VLs over the backbone is not allowed\n");
841 area
= ospf_area_get(ospf
, area_id
);
842 ospf_area_display_format_set(ospf
, area
, vl_config
->area_id_fmt
);
844 if (area
->external_routing
!= OSPF_AREA_DEFAULT
) {
845 if (vl_config
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
846 vty_out(vty
, "Area %pI4 is %s\n", &area_id
,
847 area
->external_routing
== OSPF_AREA_NSSA
851 vty_out(vty
, "Area %ld is %s\n",
852 (unsigned long)ntohl(area_id
.s_addr
),
853 area
->external_routing
== OSPF_AREA_NSSA
859 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
->vl_peer
))
861 vl_data
= ospf_vl_data_new(area
, vl_config
->vl_peer
);
862 if (vl_data
->vl_oi
== NULL
) {
863 vl_data
->vl_oi
= ospf_vl_new(ospf
, vl_data
);
864 ospf_vl_add(ospf
, vl_data
);
865 ospf_spf_calculate_schedule(ospf
,
866 SPF_FLAG_CONFIG_CHANGE
);
873 static int ospf_vl_set_security(struct ospf_vl_data
*vl_data
,
874 struct ospf_vl_config_data
*vl_config
)
876 struct crypt_key
*ck
;
878 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
880 vty
= vl_config
->vty
;
882 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
) {
883 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), auth_type
);
884 IF_DEF_PARAMS(ifp
)->auth_type
= vl_config
->auth_type
;
887 if (vl_config
->auth_key
) {
888 memset(IF_DEF_PARAMS(ifp
)->auth_simple
, 0,
889 OSPF_AUTH_SIMPLE_SIZE
+ 1);
890 strlcpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
892 sizeof(IF_DEF_PARAMS(ifp
)->auth_simple
));
893 } else if (vl_config
->md5_key
) {
894 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
895 vl_config
->crypto_key_id
)
897 vty_out(vty
, "OSPF: Key %d already exists\n",
898 vl_config
->crypto_key_id
);
901 ck
= ospf_crypt_key_new();
902 ck
->key_id
= vl_config
->crypto_key_id
;
903 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
904 strlcpy((char *)ck
->auth_key
, vl_config
->md5_key
,
905 sizeof(ck
->auth_key
));
907 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
908 } else if (vl_config
->crypto_key_id
!= 0) {
911 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
912 vl_config
->crypto_key_id
)
914 vty_out(vty
, "OSPF: Key %d does not exist\n",
915 vl_config
->crypto_key_id
);
916 return CMD_WARNING_CONFIG_FAILED
;
919 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
920 vl_config
->crypto_key_id
);
926 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
927 struct ospf_vl_config_data
*vl_config
)
929 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
930 /* Virtual Link data initialised to defaults, so only set
932 if (vl_config
->hello_interval
) {
933 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
934 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
937 if (vl_config
->dead_interval
) {
938 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
939 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
942 if (vl_config
->retransmit_interval
) {
943 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
944 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
945 vl_config
->retransmit_interval
;
948 if (vl_config
->transmit_delay
) {
949 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
950 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
957 /* The business end of all of the above */
958 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
960 struct ospf_vl_data
*vl_data
;
963 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
965 return CMD_WARNING_CONFIG_FAILED
;
967 /* Process this one first as it can have a fatal result, which can
968 only logically occur if the virtual link exists already
969 Thus a command error does not result in a change to the
970 running configuration such as unexpectedly altered timer
972 ret
= ospf_vl_set_security(vl_data
, vl_config
);
973 if (ret
!= CMD_SUCCESS
)
976 /* Set any time based parameters, these area already range checked */
978 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
979 if (ret
!= CMD_SUCCESS
)
985 /* This stuff exists to make specifying all the alias commands A LOT simpler
987 #define VLINK_HELPSTR_IPADDR \
988 "OSPF area parameters\n" \
989 "OSPF area ID in IP address format\n" \
990 "OSPF area ID as a decimal value\n" \
991 "Configure a virtual link\n" \
992 "Router ID of the remote ABR\n"
994 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
995 "Enable authentication on this virtual link\n" \
998 #define VLINK_HELPSTR_AUTHTYPE_ALL \
999 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1000 "Use null authentication\n" \
1001 "Use message-digest authentication\n"
1003 #define VLINK_HELPSTR_TIME_PARAM \
1004 "Time between HELLO packets\n" \
1006 "Time between retransmitting lost link state advertisements\n" \
1008 "Link state transmit delay\n" \
1010 "Interval time after which a neighbor is declared down\n" \
1013 #define VLINK_HELPSTR_AUTH_SIMPLE \
1014 "Authentication password (key)\n" \
1015 "The OSPF password (key)\n"
1017 #define VLINK_HELPSTR_AUTH_MD5 \
1018 "Message digest authentication password (key)\n" \
1020 "Use MD5 algorithm\n" \
1021 "The OSPF password (key)\n"
1023 DEFUN (ospf_area_vlink
,
1024 ospf_area_vlink_cmd
,
1025 "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>]",
1026 VLINK_HELPSTR_IPADDR
1027 "Enable authentication on this virtual link\n"
1028 "Use message-digest authentication\n"
1029 "Use null authentication\n"
1030 VLINK_HELPSTR_AUTH_MD5
1031 VLINK_HELPSTR_AUTH_SIMPLE
)
1033 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1034 int idx_ipv4_number
= 1;
1036 struct ospf_vl_config_data vl_config
;
1037 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1038 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1042 ospf_vl_config_data_init(&vl_config
, vty
);
1044 /* Read off first 2 parameters and check them */
1045 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1046 &vl_config
.area_id_fmt
);
1048 vty_out(vty
, "OSPF area ID is invalid\n");
1049 return CMD_WARNING_CONFIG_FAILED
;
1052 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1054 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1055 return CMD_WARNING_CONFIG_FAILED
;
1059 /* Thats all folks! - BUGS B. strikes again!!!*/
1061 return ospf_vl_set(ospf
, &vl_config
);
1064 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1065 /* authentication - this option can only occur
1066 at start of command line */
1067 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1070 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1071 /* authentication message-digest */
1072 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1073 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1074 /* "authentication null" */
1075 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1078 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1079 vl_config
.md5_key
= NULL
;
1080 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1081 if (vl_config
.crypto_key_id
< 0)
1082 return CMD_WARNING_CONFIG_FAILED
;
1084 strlcpy(md5_key
, argv
[idx
+ 3]->arg
, sizeof(md5_key
));
1085 vl_config
.md5_key
= md5_key
;
1088 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1089 strlcpy(auth_key
, argv
[idx
+ 1]->arg
, sizeof(auth_key
));
1090 vl_config
.auth_key
= auth_key
;
1093 /* Action configuration */
1095 return ospf_vl_set(ospf
, &vl_config
);
1098 DEFUN (no_ospf_area_vlink
,
1099 no_ospf_area_vlink_cmd
,
1100 "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>]",
1102 VLINK_HELPSTR_IPADDR
1103 "Enable authentication on this virtual link\n"
1104 "Use message-digest authentication\n"
1105 "Use null authentication\n"
1106 VLINK_HELPSTR_AUTH_MD5
1107 VLINK_HELPSTR_AUTH_SIMPLE
)
1109 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1110 int idx_ipv4_number
= 2;
1112 struct ospf_area
*area
;
1113 struct ospf_vl_config_data vl_config
;
1114 struct ospf_vl_data
*vl_data
= NULL
;
1115 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1119 ospf_vl_config_data_init(&vl_config
, vty
);
1121 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1124 vty_out(vty
, "OSPF area ID is invalid\n");
1125 return CMD_WARNING_CONFIG_FAILED
;
1128 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1130 vty_out(vty
, "Area does not exist\n");
1131 return CMD_WARNING_CONFIG_FAILED
;
1134 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1136 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1137 return CMD_WARNING_CONFIG_FAILED
;
1140 vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
);
1142 vty_out(vty
, "Virtual link does not exist\n");
1143 return CMD_WARNING_CONFIG_FAILED
;
1147 /* Basic VLink no command */
1148 /* Thats all folks! - BUGS B. strikes again!!!*/
1149 ospf_vl_delete(ospf
, vl_data
);
1150 ospf_area_check_free(ospf
, vl_config
.area_id
);
1154 /* If we are down here, we are reseting parameters */
1155 /* Deal with other parameters */
1157 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1158 /* authentication - this option can only occur
1159 at start of command line */
1160 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1163 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1164 vl_config
.md5_key
= NULL
;
1165 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1166 if (vl_config
.crypto_key_id
< 0)
1167 return CMD_WARNING_CONFIG_FAILED
;
1170 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1171 /* Reset authentication-key to 0 */
1172 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1173 vl_config
.auth_key
= auth_key
;
1176 /* Action configuration */
1178 return ospf_vl_set(ospf
, &vl_config
);
1181 DEFUN (ospf_area_vlink_intervals
,
1182 ospf_area_vlink_intervals_cmd
,
1183 "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)}",
1184 VLINK_HELPSTR_IPADDR
1185 VLINK_HELPSTR_TIME_PARAM
)
1187 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1188 struct ospf_vl_config_data vl_config
;
1191 ospf_vl_config_data_init(&vl_config
, vty
);
1193 char *area_id
= argv
[1]->arg
;
1194 char *router_id
= argv
[3]->arg
;
1196 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1198 vty_out(vty
, "OSPF area ID is invalid\n");
1199 return CMD_WARNING_CONFIG_FAILED
;
1202 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1204 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1205 return CMD_WARNING_CONFIG_FAILED
;
1208 for (int idx
= 4; idx
< argc
; idx
++) {
1209 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1210 vl_config
.hello_interval
=
1211 strtol(argv
[++idx
]->arg
, NULL
, 10);
1212 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1213 vl_config
.retransmit_interval
=
1214 strtol(argv
[++idx
]->arg
, NULL
, 10);
1215 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1216 vl_config
.transmit_delay
=
1217 strtol(argv
[++idx
]->arg
, NULL
, 10);
1218 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1219 vl_config
.dead_interval
=
1220 strtol(argv
[++idx
]->arg
, NULL
, 10);
1223 /* Action configuration */
1224 return ospf_vl_set(ospf
, &vl_config
);
1227 DEFUN (no_ospf_area_vlink_intervals
,
1228 no_ospf_area_vlink_intervals_cmd
,
1229 "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)}",
1231 VLINK_HELPSTR_IPADDR
1232 VLINK_HELPSTR_TIME_PARAM
)
1234 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1235 struct ospf_vl_config_data vl_config
;
1238 ospf_vl_config_data_init(&vl_config
, vty
);
1240 char *area_id
= argv
[2]->arg
;
1241 char *router_id
= argv
[4]->arg
;
1243 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1245 vty_out(vty
, "OSPF area ID is invalid\n");
1246 return CMD_WARNING_CONFIG_FAILED
;
1249 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1251 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1252 return CMD_WARNING_CONFIG_FAILED
;
1255 for (int idx
= 5; idx
< argc
; idx
++) {
1256 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1257 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1258 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1259 vl_config
.retransmit_interval
=
1260 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1261 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1262 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1263 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1264 vl_config
.dead_interval
=
1265 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1268 /* Action configuration */
1269 return ospf_vl_set(ospf
, &vl_config
);
1272 DEFUN (ospf_area_shortcut
,
1273 ospf_area_shortcut_cmd
,
1274 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1275 "OSPF area parameters\n"
1276 "OSPF area ID in IP address format\n"
1277 "OSPF area ID as a decimal value\n"
1278 "Configure the area's shortcutting mode\n"
1279 "Set default shortcutting behavior\n"
1280 "Enable shortcutting through the area\n"
1281 "Disable shortcutting through the area\n")
1283 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1284 int idx_ipv4_number
= 1;
1285 int idx_enable_disable
= 3;
1286 struct ospf_area
*area
;
1287 struct in_addr area_id
;
1291 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1292 argv
[idx_ipv4_number
]->arg
);
1294 area
= ospf_area_get(ospf
, area_id
);
1295 ospf_area_display_format_set(ospf
, area
, format
);
1297 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1298 mode
= OSPF_SHORTCUT_DEFAULT
;
1299 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1300 mode
= OSPF_SHORTCUT_DISABLE
;
1301 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1302 mode
= OSPF_SHORTCUT_ENABLE
;
1304 return CMD_WARNING_CONFIG_FAILED
;
1306 ospf_area_shortcut_set(ospf
, area
, mode
);
1308 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1310 "Shortcut area setting will take effect only when the router is configured as Shortcut ABR\n");
1315 DEFUN (no_ospf_area_shortcut
,
1316 no_ospf_area_shortcut_cmd
,
1317 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1319 "OSPF area parameters\n"
1320 "OSPF area ID in IP address format\n"
1321 "OSPF area ID as a decimal value\n"
1322 "Deconfigure the area's shortcutting mode\n"
1323 "Deconfigure enabled shortcutting through the area\n"
1324 "Deconfigure disabled shortcutting through the area\n")
1326 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1327 int idx_ipv4_number
= 2;
1328 struct ospf_area
*area
;
1329 struct in_addr area_id
;
1332 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1333 argv
[idx_ipv4_number
]->arg
);
1335 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1339 ospf_area_shortcut_unset(ospf
, area
);
1345 DEFUN (ospf_area_stub
,
1347 "area <A.B.C.D|(0-4294967295)> stub",
1348 "OSPF area parameters\n"
1349 "OSPF area ID in IP address format\n"
1350 "OSPF area ID as a decimal value\n"
1351 "Configure OSPF area as stub\n")
1353 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1354 int idx_ipv4_number
= 1;
1355 struct in_addr area_id
;
1358 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1359 argv
[idx_ipv4_number
]->arg
);
1361 ret
= ospf_area_stub_set(ospf
, area_id
);
1362 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1366 "First deconfigure all virtual link through this area\n");
1367 return CMD_WARNING_CONFIG_FAILED
;
1370 /* Flush the external LSAs from the specified area */
1371 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_EXTERNAL_LSA
);
1372 ospf_area_no_summary_unset(ospf
, area_id
);
1377 DEFUN (ospf_area_stub_no_summary
,
1378 ospf_area_stub_no_summary_cmd
,
1379 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1380 "OSPF stub parameters\n"
1381 "OSPF area ID in IP address format\n"
1382 "OSPF area ID as a decimal value\n"
1383 "Configure OSPF area as stub\n"
1384 "Do not inject inter-area routes into stub\n")
1386 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1387 int idx_ipv4_number
= 1;
1388 struct in_addr area_id
;
1391 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1392 argv
[idx_ipv4_number
]->arg
);
1394 ret
= ospf_area_stub_set(ospf
, area_id
);
1395 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1399 "%% Area cannot be stub as it contains a virtual link\n");
1400 return CMD_WARNING_CONFIG_FAILED
;
1403 ospf_area_no_summary_set(ospf
, area_id
);
1408 DEFUN (no_ospf_area_stub
,
1409 no_ospf_area_stub_cmd
,
1410 "no area <A.B.C.D|(0-4294967295)> stub",
1412 "OSPF area parameters\n"
1413 "OSPF area ID in IP address format\n"
1414 "OSPF area ID as a decimal value\n"
1415 "Configure OSPF area as stub\n")
1417 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1418 int idx_ipv4_number
= 2;
1419 struct in_addr area_id
;
1422 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1423 argv
[idx_ipv4_number
]->arg
);
1425 ospf_area_stub_unset(ospf
, area_id
);
1426 ospf_area_no_summary_unset(ospf
, area_id
);
1431 DEFUN (no_ospf_area_stub_no_summary
,
1432 no_ospf_area_stub_no_summary_cmd
,
1433 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1435 "OSPF area parameters\n"
1436 "OSPF area ID in IP address format\n"
1437 "OSPF area ID as a decimal value\n"
1438 "Configure OSPF area as stub\n"
1439 "Do not inject inter-area routes into area\n")
1441 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1442 int idx_ipv4_number
= 2;
1443 struct in_addr area_id
;
1446 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1447 argv
[idx_ipv4_number
]->arg
);
1448 ospf_area_no_summary_unset(ospf
, area_id
);
1453 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1454 struct cmd_token
**argv
, int cfg_nosum
,
1457 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1458 struct in_addr area_id
;
1461 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1463 ret
= ospf_area_nssa_set(ospf
, area_id
);
1464 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1468 "%% Area cannot be nssa as it contains a virtual link\n");
1469 return CMD_WARNING_CONFIG_FAILED
;
1473 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1474 ospf_area_nssa_translator_role_set(
1475 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1476 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1477 ospf_area_nssa_translator_role_set(
1478 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1479 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1480 ospf_area_nssa_translator_role_set(
1481 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1483 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1484 OSPF_NSSA_ROLE_CANDIDATE
);
1489 ospf_area_no_summary_set(ospf
, area_id
);
1491 ospf_area_no_summary_unset(ospf
, area_id
);
1494 /* Flush the external LSA for the specified area */
1495 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_EXTERNAL_LSA
);
1496 ospf_schedule_abr_task(ospf
);
1497 ospf_schedule_asbr_nssa_redist_update(ospf
);
1503 DEFUN (ospf_area_nssa_translate
,
1504 ospf_area_nssa_translate_cmd
,
1505 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1506 "OSPF area parameters\n"
1507 "OSPF area ID in IP address format\n"
1508 "OSPF area ID as a decimal value\n"
1509 "Configure OSPF area as nssa\n"
1510 "Configure NSSA-ABR for translate election (default)\n"
1511 "Configure NSSA-ABR to never translate\n"
1512 "Configure NSSA-ABR to always translate\n")
1514 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1517 DEFUN (ospf_area_nssa
,
1519 "area <A.B.C.D|(0-4294967295)> nssa",
1520 "OSPF area parameters\n"
1521 "OSPF area ID in IP address format\n"
1522 "OSPF area ID as a decimal value\n"
1523 "Configure OSPF area as nssa\n")
1525 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1528 DEFUN(ospf_area_nssa_suppress_fa
, ospf_area_nssa_suppress_fa_cmd
,
1529 "area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
1530 "OSPF area parameters\n"
1531 "OSPF area ID in IP address format\n"
1532 "OSPF area ID as a decimal value\n"
1533 "Configure OSPF area as nssa\n"
1534 "Suppress forwarding address\n")
1536 int idx_ipv4_number
= 1;
1537 struct in_addr area_id
;
1540 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1541 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1542 argv
[idx_ipv4_number
]->arg
);
1544 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1546 ospf_area_nssa_suppress_fa_set(ospf
, area_id
);
1548 ospf_schedule_abr_task(ospf
);
1553 DEFUN(no_ospf_area_nssa_suppress_fa
, no_ospf_area_nssa_suppress_fa_cmd
,
1554 "no area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
1556 "OSPF area parameters\n"
1557 "OSPF area ID in IP address format\n"
1558 "OSPF area ID as a decimal value\n"
1559 "Configure OSPF area as nssa\n"
1560 "Suppress forwarding address\n")
1562 int idx_ipv4_number
= 2;
1563 struct in_addr area_id
;
1566 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1568 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1569 argv
[idx_ipv4_number
]->arg
);
1571 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1573 ospf_area_nssa_suppress_fa_unset(ospf
, area_id
);
1575 ospf_schedule_abr_task(ospf
);
1580 DEFUN (ospf_area_nssa_no_summary
,
1581 ospf_area_nssa_no_summary_cmd
,
1582 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1583 "OSPF area parameters\n"
1584 "OSPF area ID in IP address format\n"
1585 "OSPF area ID as a decimal value\n"
1586 "Configure OSPF area as nssa\n"
1587 "Do not inject inter-area routes into nssa\n")
1589 int idx_ipv4_number
= 1;
1590 struct in_addr area_id
;
1593 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1594 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1595 argv
[idx_ipv4_number
]->arg
);
1597 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1599 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1601 ospf_schedule_abr_task(ospf
);
1606 DEFUN (no_ospf_area_nssa_no_summary
,
1607 no_ospf_area_nssa_no_summary_cmd
,
1608 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1610 "OSPF area parameters\n"
1611 "OSPF area ID in IP address format\n"
1612 "OSPF area ID as a decimal value\n"
1613 "Configure OSPF area as nssa\n"
1614 "Do not inject inter-area routes into nssa\n")
1616 int idx_ipv4_number
= 2;
1617 struct in_addr area_id
;
1620 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1622 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1623 argv
[idx_ipv4_number
]->arg
);
1625 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1627 ospf_area_no_summary_unset(ospf
, area_id
);
1629 ospf_schedule_abr_task(ospf
);
1634 DEFUN (no_ospf_area_nssa
,
1635 no_ospf_area_nssa_cmd
,
1636 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1638 "OSPF area parameters\n"
1639 "OSPF area ID in IP address format\n"
1640 "OSPF area ID as a decimal value\n"
1641 "Configure OSPF area as nssa\n"
1642 "Configure NSSA-ABR for translate election (default)\n"
1643 "Configure NSSA-ABR to never translate\n"
1644 "Configure NSSA-ABR to always translate\n")
1646 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1647 int idx_ipv4_number
= 2;
1648 struct in_addr area_id
;
1651 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1652 argv
[idx_ipv4_number
]->arg
);
1654 /* Flush the NSSA LSA for the specified area */
1655 ospf_flush_lsa_from_area(ospf
, area_id
, OSPF_AS_NSSA_LSA
);
1656 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1658 ospf_schedule_abr_task(ospf
);
1664 DEFUN (ospf_area_default_cost
,
1665 ospf_area_default_cost_cmd
,
1666 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1667 "OSPF area parameters\n"
1668 "OSPF area ID in IP address format\n"
1669 "OSPF area ID as a decimal value\n"
1670 "Set the summary-default cost of a NSSA or stub area\n"
1671 "Stub's advertised default summary cost\n")
1673 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1674 int idx_ipv4_number
= 1;
1676 struct ospf_area
*area
;
1677 struct in_addr area_id
;
1680 struct prefix_ipv4 p
;
1682 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1683 argv
[idx_ipv4_number
]->arg
);
1684 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1686 area
= ospf_area_get(ospf
, area_id
);
1687 ospf_area_display_format_set(ospf
, area
, format
);
1689 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1690 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1691 return CMD_WARNING_CONFIG_FAILED
;
1694 area
->default_cost
= cost
;
1697 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1699 if (IS_DEBUG_OSPF_EVENT
)
1701 "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4",
1703 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1708 DEFUN (no_ospf_area_default_cost
,
1709 no_ospf_area_default_cost_cmd
,
1710 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1712 "OSPF area parameters\n"
1713 "OSPF area ID in IP address format\n"
1714 "OSPF area ID as a decimal value\n"
1715 "Set the summary-default cost of a NSSA or stub area\n"
1716 "Stub's advertised default summary cost\n")
1718 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1719 int idx_ipv4_number
= 2;
1720 struct ospf_area
*area
;
1721 struct in_addr area_id
;
1723 struct prefix_ipv4 p
;
1725 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1726 argv
[idx_ipv4_number
]->arg
);
1728 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1732 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1733 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1734 return CMD_WARNING_CONFIG_FAILED
;
1737 area
->default_cost
= 1;
1740 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1742 if (IS_DEBUG_OSPF_EVENT
)
1744 "ospf_abr_announce_stub_defaults(): announcing 0.0.0.0/0 to area %pI4",
1746 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1749 ospf_area_check_free(ospf
, area_id
);
1754 DEFUN (ospf_area_export_list
,
1755 ospf_area_export_list_cmd
,
1756 "area <A.B.C.D|(0-4294967295)> export-list ACCESSLIST4_NAME",
1757 "OSPF area parameters\n"
1758 "OSPF area ID in IP address format\n"
1759 "OSPF area ID as a decimal value\n"
1760 "Set the filter for networks announced to other areas\n"
1761 "Name of the access-list\n")
1763 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1764 int idx_ipv4_number
= 1;
1765 struct ospf_area
*area
;
1766 struct in_addr area_id
;
1769 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1771 area
= ospf_area_get(ospf
, area_id
);
1772 ospf_area_display_format_set(ospf
, area
, format
);
1773 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1778 DEFUN (no_ospf_area_export_list
,
1779 no_ospf_area_export_list_cmd
,
1780 "no area <A.B.C.D|(0-4294967295)> export-list ACCESSLIST4_NAME",
1782 "OSPF area parameters\n"
1783 "OSPF area ID in IP address format\n"
1784 "OSPF area ID as a decimal value\n"
1785 "Unset the filter for networks announced to other areas\n"
1786 "Name of the access-list\n")
1788 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1789 int idx_ipv4_number
= 2;
1790 struct ospf_area
*area
;
1791 struct in_addr area_id
;
1794 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1796 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1800 ospf_area_export_list_unset(ospf
, area
);
1806 DEFUN (ospf_area_import_list
,
1807 ospf_area_import_list_cmd
,
1808 "area <A.B.C.D|(0-4294967295)> import-list ACCESSLIST4_NAME",
1809 "OSPF area parameters\n"
1810 "OSPF area ID in IP address format\n"
1811 "OSPF area ID as a decimal value\n"
1812 "Set the filter for networks from other areas announced to the specified one\n"
1813 "Name of the access-list\n")
1815 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1816 int idx_ipv4_number
= 1;
1817 struct ospf_area
*area
;
1818 struct in_addr area_id
;
1821 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1823 area
= ospf_area_get(ospf
, area_id
);
1824 ospf_area_display_format_set(ospf
, area
, format
);
1825 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1830 DEFUN (no_ospf_area_import_list
,
1831 no_ospf_area_import_list_cmd
,
1832 "no area <A.B.C.D|(0-4294967295)> import-list ACCESSLIST4_NAME",
1834 "OSPF area parameters\n"
1835 "OSPF area ID in IP address format\n"
1836 "OSPF area ID as a decimal value\n"
1837 "Unset the filter for networks announced to other areas\n"
1838 "Name of the access-list\n")
1840 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1841 int idx_ipv4_number
= 2;
1842 struct ospf_area
*area
;
1843 struct in_addr area_id
;
1846 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1848 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1852 ospf_area_import_list_unset(ospf
, area
);
1857 DEFUN (ospf_area_filter_list
,
1858 ospf_area_filter_list_cmd
,
1859 "area <A.B.C.D|(0-4294967295)> filter-list prefix PREFIXLIST_NAME <in|out>",
1860 "OSPF area parameters\n"
1861 "OSPF area ID in IP address format\n"
1862 "OSPF area ID as a decimal value\n"
1863 "Filter networks between OSPF areas\n"
1864 "Filter prefixes between OSPF areas\n"
1865 "Name of an IP prefix-list\n"
1866 "Filter networks sent to this area\n"
1867 "Filter networks sent from this area\n")
1869 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1870 int idx_ipv4_number
= 1;
1873 struct ospf_area
*area
;
1874 struct in_addr area_id
;
1875 struct prefix_list
*plist
;
1878 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1880 area
= ospf_area_get(ospf
, area_id
);
1881 ospf_area_display_format_set(ospf
, area
, format
);
1882 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1883 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1884 PREFIX_LIST_IN(area
) = plist
;
1885 if (PREFIX_NAME_IN(area
))
1886 free(PREFIX_NAME_IN(area
));
1888 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1889 ospf_schedule_abr_task(ospf
);
1891 PREFIX_LIST_OUT(area
) = plist
;
1892 if (PREFIX_NAME_OUT(area
))
1893 free(PREFIX_NAME_OUT(area
));
1895 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1896 ospf_schedule_abr_task(ospf
);
1902 DEFUN (no_ospf_area_filter_list
,
1903 no_ospf_area_filter_list_cmd
,
1904 "no area <A.B.C.D|(0-4294967295)> filter-list prefix PREFIXLIST_NAME <in|out>",
1906 "OSPF area parameters\n"
1907 "OSPF area ID in IP address format\n"
1908 "OSPF area ID as a decimal value\n"
1909 "Filter networks between OSPF areas\n"
1910 "Filter prefixes between OSPF areas\n"
1911 "Name of an IP prefix-list\n"
1912 "Filter networks sent to this area\n"
1913 "Filter networks sent from this area\n")
1915 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1916 int idx_ipv4_number
= 2;
1919 struct ospf_area
*area
;
1920 struct in_addr area_id
;
1923 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1925 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1928 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1929 if (PREFIX_NAME_IN(area
))
1930 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1934 PREFIX_LIST_IN(area
) = NULL
;
1935 if (PREFIX_NAME_IN(area
))
1936 free(PREFIX_NAME_IN(area
));
1938 PREFIX_NAME_IN(area
) = NULL
;
1940 ospf_schedule_abr_task(ospf
);
1942 if (PREFIX_NAME_OUT(area
))
1943 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1947 PREFIX_LIST_OUT(area
) = NULL
;
1948 if (PREFIX_NAME_OUT(area
))
1949 free(PREFIX_NAME_OUT(area
));
1951 PREFIX_NAME_OUT(area
) = NULL
;
1953 ospf_schedule_abr_task(ospf
);
1960 DEFUN (ospf_area_authentication_message_digest
,
1961 ospf_area_authentication_message_digest_cmd
,
1962 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1964 "OSPF area parameters\n"
1965 "OSPF area ID in IP address format\n"
1966 "OSPF area ID as a decimal value\n"
1967 "Enable authentication\n"
1968 "Use message-digest authentication\n")
1970 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1972 struct ospf_area
*area
;
1973 struct in_addr area_id
;
1976 argv_find(argv
, argc
, "area", &idx
);
1977 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
1979 area
= ospf_area_get(ospf
, area_id
);
1980 ospf_area_display_format_set(ospf
, area
, format
);
1981 area
->auth_type
= strmatch(argv
[0]->text
, "no")
1983 : OSPF_AUTH_CRYPTOGRAPHIC
;
1988 DEFUN (ospf_area_authentication
,
1989 ospf_area_authentication_cmd
,
1990 "area <A.B.C.D|(0-4294967295)> authentication",
1991 "OSPF area parameters\n"
1992 "OSPF area ID in IP address format\n"
1993 "OSPF area ID as a decimal value\n"
1994 "Enable authentication\n")
1996 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1997 int idx_ipv4_number
= 1;
1998 struct ospf_area
*area
;
1999 struct in_addr area_id
;
2002 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2004 area
= ospf_area_get(ospf
, area_id
);
2005 ospf_area_display_format_set(ospf
, area
, format
);
2006 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2011 DEFUN (no_ospf_area_authentication
,
2012 no_ospf_area_authentication_cmd
,
2013 "no area <A.B.C.D|(0-4294967295)> authentication",
2015 "OSPF area parameters\n"
2016 "OSPF area ID in IP address format\n"
2017 "OSPF area ID as a decimal value\n"
2018 "Enable authentication\n")
2020 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2021 int idx_ipv4_number
= 2;
2022 struct ospf_area
*area
;
2023 struct in_addr area_id
;
2026 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2028 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2032 area
->auth_type
= OSPF_AUTH_NULL
;
2034 ospf_area_check_free(ospf
, area_id
);
2040 DEFUN (ospf_abr_type
,
2042 "ospf abr-type <cisco|ibm|shortcut|standard>",
2043 "OSPF specific commands\n"
2044 "Set OSPF ABR type\n"
2045 "Alternative ABR, cisco implementation\n"
2046 "Alternative ABR, IBM implementation\n"
2048 "Standard behavior (RFC2328)\n")
2050 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2052 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2054 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2055 abr_type
= OSPF_ABR_CISCO
;
2056 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2057 abr_type
= OSPF_ABR_IBM
;
2058 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2059 abr_type
= OSPF_ABR_SHORTCUT
;
2060 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2061 abr_type
= OSPF_ABR_STAND
;
2063 return CMD_WARNING_CONFIG_FAILED
;
2065 /* If ABR type value is changed, schedule ABR task. */
2066 if (ospf
->abr_type
!= abr_type
) {
2067 ospf
->abr_type
= abr_type
;
2068 ospf_schedule_abr_task(ospf
);
2074 DEFUN (no_ospf_abr_type
,
2075 no_ospf_abr_type_cmd
,
2076 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2078 "OSPF specific commands\n"
2079 "Set OSPF ABR type\n"
2080 "Alternative ABR, cisco implementation\n"
2081 "Alternative ABR, IBM implementation\n"
2085 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2087 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2089 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2090 abr_type
= OSPF_ABR_CISCO
;
2091 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2092 abr_type
= OSPF_ABR_IBM
;
2093 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2094 abr_type
= OSPF_ABR_SHORTCUT
;
2095 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2096 abr_type
= OSPF_ABR_STAND
;
2098 return CMD_WARNING_CONFIG_FAILED
;
2100 /* If ABR type value is changed, schedule ABR task. */
2101 if (ospf
->abr_type
== abr_type
) {
2102 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2103 ospf_schedule_abr_task(ospf
);
2109 DEFUN (ospf_log_adjacency_changes
,
2110 ospf_log_adjacency_changes_cmd
,
2111 "log-adjacency-changes",
2112 "Log changes in adjacency state\n")
2114 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2116 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2117 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2121 DEFUN (ospf_log_adjacency_changes_detail
,
2122 ospf_log_adjacency_changes_detail_cmd
,
2123 "log-adjacency-changes detail",
2124 "Log changes in adjacency state\n"
2125 "Log all state changes\n")
2127 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2129 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2130 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2134 DEFUN (no_ospf_log_adjacency_changes
,
2135 no_ospf_log_adjacency_changes_cmd
,
2136 "no log-adjacency-changes",
2138 "Log changes in adjacency state\n")
2140 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2142 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2143 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2147 DEFUN (no_ospf_log_adjacency_changes_detail
,
2148 no_ospf_log_adjacency_changes_detail_cmd
,
2149 "no log-adjacency-changes detail",
2151 "Log changes in adjacency state\n"
2152 "Log all state changes\n")
2154 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2156 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2160 DEFUN (ospf_compatible_rfc1583
,
2161 ospf_compatible_rfc1583_cmd
,
2162 "compatible rfc1583",
2163 "OSPF compatibility list\n"
2164 "compatible with RFC 1583\n")
2166 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2168 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2169 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2170 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2175 DEFUN (no_ospf_compatible_rfc1583
,
2176 no_ospf_compatible_rfc1583_cmd
,
2177 "no compatible rfc1583",
2179 "OSPF compatibility list\n"
2180 "compatible with RFC 1583\n")
2182 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2184 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2185 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2186 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2191 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2192 "ospf rfc1583compatibility",
2193 "OSPF specific commands\n"
2194 "Enable the RFC1583Compatibility flag\n")
2196 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2197 "no ospf rfc1583compatibility", NO_STR
2198 "OSPF specific commands\n"
2199 "Disable the RFC1583Compatibility flag\n")
2201 static void ospf_table_reinstall_routes(struct ospf
*ospf
,
2202 struct route_table
*rt
)
2204 struct route_node
*rn
;
2209 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
2210 struct ospf_route
*or;
2216 if (or->type
== OSPF_DESTINATION_NETWORK
)
2217 ospf_zebra_add(ospf
, (struct prefix_ipv4
*)&rn
->p
, or);
2218 else if (or->type
== OSPF_DESTINATION_DISCARD
)
2219 ospf_zebra_add_discard(ospf
,
2220 (struct prefix_ipv4
*)&rn
->p
);
2224 static void ospf_reinstall_routes(struct ospf
*ospf
)
2226 ospf_table_reinstall_routes(ospf
, ospf
->new_table
);
2227 ospf_table_reinstall_routes(ospf
, ospf
->new_external_route
);
2230 DEFPY (ospf_send_extra_data
,
2231 ospf_send_extra_data_cmd
,
2232 "[no] ospf send-extra-data zebra",
2235 "Extra data to Zebra for display/use\n"
2238 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2240 if (no
&& CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
)) {
2241 UNSET_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
);
2242 ospf_reinstall_routes(ospf
);
2243 } else if (!CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
)) {
2244 SET_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
);
2245 ospf_reinstall_routes(ospf
);
2251 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2252 unsigned int hold
, unsigned int max
)
2254 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2256 ospf
->spf_delay
= delay
;
2257 ospf
->spf_holdtime
= hold
;
2258 ospf
->spf_max_holdtime
= max
;
2263 DEFUN (ospf_timers_min_ls_interval
,
2264 ospf_timers_min_ls_interval_cmd
,
2265 "timers throttle lsa all (0-5000)",
2266 "Adjust routing timers\n"
2267 "Throttling adaptive timer\n"
2268 "LSA delay between transmissions\n"
2270 "Delay (msec) between sending LSAs\n")
2272 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2274 unsigned int interval
;
2277 vty_out(vty
, "Insufficient arguments\n");
2278 return CMD_WARNING_CONFIG_FAILED
;
2281 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2283 ospf
->min_ls_interval
= interval
;
2288 DEFUN (no_ospf_timers_min_ls_interval
,
2289 no_ospf_timers_min_ls_interval_cmd
,
2290 "no timers throttle lsa all [(0-5000)]",
2292 "Adjust routing timers\n"
2293 "Throttling adaptive timer\n"
2294 "LSA delay between transmissions\n"
2296 "Delay (msec) between sending LSAs\n")
2298 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2299 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2304 DEFUN (ospf_timers_throttle_spf
,
2305 ospf_timers_throttle_spf_cmd
,
2306 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2307 "Adjust routing timers\n"
2308 "Throttling adaptive timer\n"
2310 "Delay (msec) from first change received till SPF calculation\n"
2311 "Initial hold time (msec) between consecutive SPF calculations\n"
2312 "Maximum hold time (msec)\n")
2315 int idx_number_2
= 4;
2316 int idx_number_3
= 5;
2317 unsigned int delay
, hold
, max
;
2320 vty_out(vty
, "Insufficient arguments\n");
2321 return CMD_WARNING_CONFIG_FAILED
;
2324 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2325 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2326 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2328 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2331 DEFUN (no_ospf_timers_throttle_spf
,
2332 no_ospf_timers_throttle_spf_cmd
,
2333 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2335 "Adjust routing timers\n"
2336 "Throttling adaptive timer\n"
2338 "Delay (msec) from first change received till SPF calculation\n"
2339 "Initial hold time (msec) between consecutive SPF calculations\n"
2340 "Maximum hold time (msec)\n")
2342 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2343 OSPF_SPF_HOLDTIME_DEFAULT
,
2344 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2348 DEFUN (ospf_timers_lsa_min_arrival
,
2349 ospf_timers_lsa_min_arrival_cmd
,
2350 "timers lsa min-arrival (0-600000)",
2351 "Adjust routing timers\n"
2353 "Minimum delay in receiving new version of a LSA\n"
2354 "Delay in milliseconds\n")
2356 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2357 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2361 DEFUN (no_ospf_timers_lsa_min_arrival
,
2362 no_ospf_timers_lsa_min_arrival_cmd
,
2363 "no timers lsa min-arrival [(0-600000)]",
2365 "Adjust routing timers\n"
2367 "Minimum delay in receiving new version of a LSA\n"
2368 "Delay in milliseconds\n")
2370 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2371 unsigned int minarrival
;
2374 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2376 if (ospf
->min_ls_arrival
!= minarrival
2377 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2381 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2386 DEFUN (ospf_neighbor
,
2388 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2390 "Neighbor IP address\n"
2391 "Neighbor Priority\n"
2393 "Dead Neighbor Polling interval\n"
2396 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2400 struct in_addr nbr_addr
;
2401 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2402 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2404 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2405 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2406 return CMD_WARNING_CONFIG_FAILED
;
2410 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2413 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2415 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2418 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2421 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2426 DEFUN (ospf_neighbor_poll_interval
,
2427 ospf_neighbor_poll_interval_cmd
,
2428 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2430 "Neighbor IP address\n"
2431 "Dead Neighbor Polling interval\n"
2433 "OSPF priority of non-broadcast neighbor\n"
2436 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2440 struct in_addr nbr_addr
;
2441 unsigned int priority
;
2442 unsigned int interval
;
2444 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2445 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2446 return CMD_WARNING_CONFIG_FAILED
;
2449 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2451 priority
= argc
> 4 ? strtoul(argv
[idx_pri
]->arg
, NULL
, 10)
2452 : OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2454 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2455 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2458 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2463 DEFUN (no_ospf_neighbor
,
2464 no_ospf_neighbor_cmd
,
2465 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2468 "Neighbor IP address\n"
2469 "Neighbor Priority\n"
2471 "Dead Neighbor Polling interval\n"
2474 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2476 struct in_addr nbr_addr
;
2478 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2479 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2480 return CMD_WARNING_CONFIG_FAILED
;
2483 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2488 DEFUN (no_ospf_neighbor_poll
,
2489 no_ospf_neighbor_poll_cmd
,
2490 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2493 "Neighbor IP address\n"
2494 "Dead Neighbor Polling interval\n"
2496 "Neighbor Priority\n"
2499 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2501 struct in_addr nbr_addr
;
2503 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2504 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2505 return CMD_WARNING_CONFIG_FAILED
;
2508 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2513 DEFUN (ospf_refresh_timer
,
2514 ospf_refresh_timer_cmd
,
2515 "refresh timer (10-1800)",
2516 "Adjust refresh parameters\n"
2517 "Set refresh timer\n"
2518 "Timer value in seconds\n")
2520 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2522 unsigned int interval
;
2524 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2525 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2526 * OSPF_LSA_REFRESHER_GRANULARITY
;
2528 ospf_timers_refresh_set(ospf
, interval
);
2533 DEFUN (no_ospf_refresh_timer
,
2534 no_ospf_refresh_timer_val_cmd
,
2535 "no refresh timer [(10-1800)]",
2537 "Adjust refresh parameters\n"
2538 "Unset refresh timer\n"
2539 "Timer value in seconds\n")
2541 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2543 unsigned int interval
;
2546 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2548 if (ospf
->lsa_refresh_interval
!= interval
2549 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2553 ospf_timers_refresh_unset(ospf
);
2559 DEFUN (ospf_auto_cost_reference_bandwidth
,
2560 ospf_auto_cost_reference_bandwidth_cmd
,
2561 "auto-cost reference-bandwidth (1-4294967)",
2562 "Calculate OSPF interface cost according to bandwidth\n"
2563 "Use reference bandwidth method to assign OSPF cost\n"
2564 "The reference bandwidth in terms of Mbits per second\n")
2566 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2567 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2570 struct interface
*ifp
;
2572 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2573 if (refbw
< 1 || refbw
> 4294967) {
2574 vty_out(vty
, "reference-bandwidth value is invalid\n");
2575 return CMD_WARNING_CONFIG_FAILED
;
2578 /* If reference bandwidth is changed. */
2579 if ((refbw
) == ospf
->ref_bandwidth
)
2582 ospf
->ref_bandwidth
= refbw
;
2583 FOR_ALL_INTERFACES (vrf
, ifp
)
2584 ospf_if_recalculate_output_cost(ifp
);
2589 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2590 no_ospf_auto_cost_reference_bandwidth_cmd
,
2591 "no auto-cost reference-bandwidth [(1-4294967)]",
2593 "Calculate OSPF interface cost according to bandwidth\n"
2594 "Use reference bandwidth method to assign OSPF cost\n"
2595 "The reference bandwidth in terms of Mbits per second\n")
2597 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2598 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2599 struct interface
*ifp
;
2601 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2604 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2605 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2607 " Please ensure reference bandwidth is consistent across all routers\n");
2609 FOR_ALL_INTERFACES (vrf
, ifp
)
2610 ospf_if_recalculate_output_cost(ifp
);
2615 DEFUN (ospf_write_multiplier
,
2616 ospf_write_multiplier_cmd
,
2617 "ospf write-multiplier (1-100)",
2618 "OSPF specific commands\n"
2619 "Write multiplier\n"
2620 "Maximum number of interface serviced per write\n")
2622 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2624 uint32_t write_oi_count
;
2631 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2632 if (write_oi_count
< 1 || write_oi_count
> 100) {
2633 vty_out(vty
, "write-multiplier value is invalid\n");
2634 return CMD_WARNING_CONFIG_FAILED
;
2637 ospf
->write_oi_count
= write_oi_count
;
2641 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2642 "Write multiplier\n"
2643 "Maximum number of interface serviced per write\n")
2645 DEFUN (no_ospf_write_multiplier
,
2646 no_ospf_write_multiplier_cmd
,
2647 "no ospf write-multiplier (1-100)",
2649 "OSPF specific commands\n"
2650 "Write multiplier\n"
2651 "Maximum number of interface serviced per write\n")
2653 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2655 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2659 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2660 "no write-multiplier (1-100)", NO_STR
2661 "Write multiplier\n"
2662 "Maximum number of interface serviced per write\n")
2664 DEFUN(ospf_ti_lfa
, ospf_ti_lfa_cmd
, "fast-reroute ti-lfa [node-protection]",
2665 "Fast Reroute for MPLS and IP resilience\n"
2666 "Topology Independent LFA (Loop-Free Alternate)\n"
2667 "TI-LFA node protection (default is link protection)\n")
2669 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2671 ospf
->ti_lfa_enabled
= true;
2674 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_NODE_PROTECTION
;
2676 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_LINK_PROTECTION
;
2678 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2683 DEFUN(no_ospf_ti_lfa
, no_ospf_ti_lfa_cmd
,
2684 "no fast-reroute ti-lfa [node-protection]",
2686 "Fast Reroute for MPLS and IP resilience\n"
2687 "Topology Independent LFA (Loop-Free Alternate)\n"
2688 "TI-LFA node protection (default is link protection)\n")
2690 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2692 ospf
->ti_lfa_enabled
= false;
2694 ospf
->ti_lfa_protection_type
= OSPF_TI_LFA_UNDEFINED_PROTECTION
;
2696 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2701 static void ospf_maxpath_set(struct vty
*vty
, struct ospf
*ospf
, uint16_t paths
)
2703 if (ospf
->max_multipath
== paths
)
2706 ospf
->max_multipath
= paths
;
2708 /* Send deletion notification to zebra to delete all
2709 * ospf specific routes and reinitiat SPF to reflect
2710 * the new max multipath.
2712 ospf_restart_spf(ospf
);
2715 /* Ospf Maximum multiple paths config support */
2716 DEFUN (ospf_max_multipath
,
2717 ospf_max_multipath_cmd
,
2718 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2719 "Max no of multiple paths for ECMP support\n"
2720 "Number of paths\n")
2722 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2726 maxpaths
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2728 ospf_maxpath_set(vty
, ospf
, maxpaths
);
2732 DEFUN (no_ospf_max_multipath
,
2733 no_ospf_max_multipath_cmd
,
2736 "Max no of multiple paths for ECMP support\n")
2738 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2739 uint16_t maxpaths
= MULTIPATH_NUM
;
2741 ospf_maxpath_set(vty
, ospf
, maxpaths
);
2745 static const char *const ospf_abr_type_descr_str
[] = {
2746 "Unknown", "Standard (RFC2328)", "Alternative IBM",
2747 "Alternative Cisco", "Alternative Shortcut"
2750 static const char *const ospf_shortcut_mode_descr_str
[] = {
2751 "Default", "Enabled", "Disabled"
2754 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2755 json_object
*json_areas
, bool use_json
)
2757 json_object
*json_area
= NULL
;
2758 char buf
[PREFIX_STRLEN
];
2761 json_area
= json_object_new_object();
2765 vty_out(vty
, " Area ID: %pI4", &area
->area_id
);
2767 /* Show Area type/mode. */
2768 if (OSPF_IS_AREA_BACKBONE(area
)) {
2770 json_object_boolean_true_add(json_area
, "backbone");
2772 vty_out(vty
, " (Backbone)\n");
2775 if (area
->external_routing
== OSPF_AREA_STUB
) {
2776 if (area
->no_summary
)
2777 json_object_boolean_true_add(
2778 json_area
, "stubNoSummary");
2779 if (area
->shortcut_configured
)
2780 json_object_boolean_true_add(
2781 json_area
, "stubShortcut");
2782 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2783 if (area
->no_summary
)
2784 json_object_boolean_true_add(
2785 json_area
, "nssaNoSummary");
2786 if (area
->shortcut_configured
)
2787 json_object_boolean_true_add(
2788 json_area
, "nssaShortcut");
2791 json_object_string_add(
2792 json_area
, "shortcuttingMode",
2793 ospf_shortcut_mode_descr_str
2794 [area
->shortcut_configured
]);
2795 if (area
->shortcut_capability
)
2796 json_object_boolean_true_add(json_area
,
2799 if (area
->external_routing
== OSPF_AREA_STUB
)
2800 vty_out(vty
, " (Stub%s%s)",
2801 area
->no_summary
? ", no summary" : "",
2802 area
->shortcut_configured
? "; " : "");
2803 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2804 vty_out(vty
, " (NSSA%s%s)",
2805 area
->no_summary
? ", no summary" : "",
2806 area
->shortcut_configured
? "; " : "");
2809 vty_out(vty
, " Shortcutting mode: %s",
2810 ospf_shortcut_mode_descr_str
2811 [area
->shortcut_configured
]);
2812 vty_out(vty
, ", S-bit consensus: %s\n",
2813 area
->shortcut_capability
? "ok" : "no");
2817 /* Show number of interfaces */
2819 json_object_int_add(json_area
, "areaIfTotalCounter",
2820 listcount(area
->oiflist
));
2821 json_object_int_add(json_area
, "areaIfActiveCounter",
2825 " Number of interfaces in this area: Total: %d, Active: %d\n",
2826 listcount(area
->oiflist
), area
->act_ints
);
2828 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2830 json_object_boolean_true_add(json_area
, "nssa");
2831 if (!IS_OSPF_ABR(area
->ospf
))
2832 json_object_boolean_false_add(json_area
, "abr");
2833 else if (area
->NSSATranslatorState
) {
2834 json_object_boolean_true_add(json_area
, "abr");
2835 if (area
->NSSATranslatorRole
2836 == OSPF_NSSA_ROLE_CANDIDATE
)
2837 json_object_boolean_true_add(
2839 "nssaTranslatorElected");
2840 else if (area
->NSSATranslatorRole
2841 == OSPF_NSSA_ROLE_ALWAYS
)
2842 json_object_boolean_true_add(
2844 "nssaTranslatorAlways");
2846 json_object_boolean_true_add(
2848 "nssaTranslatorNever");
2850 json_object_boolean_true_add(json_area
, "abr");
2851 if (area
->NSSATranslatorRole
2852 == OSPF_NSSA_ROLE_CANDIDATE
)
2853 json_object_boolean_false_add(
2855 "nssaTranslatorElected");
2857 json_object_boolean_true_add(
2859 "nssaTranslatorNever");
2863 " It is an NSSA configuration.\n Elected NSSA/ABR performs type-7/type-5 LSA translation.\n");
2864 if (!IS_OSPF_ABR(area
->ospf
))
2866 " It is not ABR, therefore not Translator.\n");
2867 else if (area
->NSSATranslatorState
) {
2868 vty_out(vty
, " We are an ABR and ");
2869 if (area
->NSSATranslatorRole
2870 == OSPF_NSSA_ROLE_CANDIDATE
)
2872 "the NSSA Elected Translator.\n");
2873 else if (area
->NSSATranslatorRole
2874 == OSPF_NSSA_ROLE_ALWAYS
)
2876 "always an NSSA Translator.\n");
2879 "never an NSSA Translator.\n");
2881 vty_out(vty
, " We are an ABR, but ");
2882 if (area
->NSSATranslatorRole
2883 == OSPF_NSSA_ROLE_CANDIDATE
)
2885 "not the NSSA Elected Translator.\n");
2888 "never an NSSA Translator.\n");
2893 /* Stub-router state for this area */
2894 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2895 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2898 json_object_boolean_true_add(
2899 json_area
, "originStubMaxDistRouterLsa");
2900 if (CHECK_FLAG(area
->stub_router_state
,
2901 OSPF_AREA_ADMIN_STUB_ROUTED
))
2902 json_object_boolean_true_add(
2903 json_area
, "indefiniteActiveAdmin");
2904 if (area
->t_stub_router
) {
2908 &area
->t_stub_router
->u
.sands
,
2911 json_object_int_add(
2913 "activeStartupRemainderMsecs",
2918 " Originating stub / maximum-distance Router-LSA\n");
2919 if (CHECK_FLAG(area
->stub_router_state
,
2920 OSPF_AREA_ADMIN_STUB_ROUTED
))
2922 " Administratively activated (indefinitely)\n");
2923 if (area
->t_stub_router
)
2925 " Active from startup, %s remaining\n",
2926 ospf_timer_dump(area
->t_stub_router
,
2933 /* Show number of fully adjacent neighbors. */
2934 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2937 /* Show authentication type. */
2938 if (area
->auth_type
== OSPF_AUTH_NULL
)
2939 json_object_string_add(json_area
, "authentication",
2940 "authenticationNone");
2941 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2942 json_object_string_add(json_area
, "authentication",
2943 "authenticationSimplePassword");
2944 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2945 json_object_string_add(json_area
, "authentication",
2946 "authenticationMessageDigest");
2948 if (!OSPF_IS_AREA_BACKBONE(area
))
2949 json_object_int_add(json_area
,
2950 "virtualAdjacenciesPassingCounter",
2953 /* Show SPF calculation times. */
2954 json_object_int_add(json_area
, "spfExecutedCounter",
2955 area
->spf_calculation
);
2956 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2957 json_object_int_add(
2958 json_area
, "lsaRouterNumber",
2959 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2960 json_object_int_add(
2961 json_area
, "lsaRouterChecksum",
2962 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2963 json_object_int_add(
2964 json_area
, "lsaNetworkNumber",
2965 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2966 json_object_int_add(
2967 json_area
, "lsaNetworkChecksum",
2968 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2969 json_object_int_add(
2970 json_area
, "lsaSummaryNumber",
2971 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2972 json_object_int_add(
2973 json_area
, "lsaSummaryChecksum",
2974 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2975 json_object_int_add(
2976 json_area
, "lsaAsbrNumber",
2977 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2978 json_object_int_add(
2979 json_area
, "lsaAsbrChecksum",
2980 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2981 json_object_int_add(
2982 json_area
, "lsaNssaNumber",
2983 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2984 json_object_int_add(
2985 json_area
, "lsaNssaChecksum",
2986 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2988 /* Show number of fully adjacent neighbors. */
2990 " Number of fully adjacent neighbors in this area: %d\n",
2993 /* Show authentication type. */
2994 vty_out(vty
, " Area has ");
2995 if (area
->auth_type
== OSPF_AUTH_NULL
)
2996 vty_out(vty
, "no authentication\n");
2997 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2998 vty_out(vty
, "simple password authentication\n");
2999 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
3000 vty_out(vty
, "message digest authentication\n");
3002 if (!OSPF_IS_AREA_BACKBONE(area
))
3004 " Number of full virtual adjacencies going through this area: %d\n",
3007 /* Show SPF calculation times. */
3008 vty_out(vty
, " SPF algorithm executed %d times\n",
3009 area
->spf_calculation
);
3011 /* Show number of LSA. */
3012 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
3014 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
3015 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
3016 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
3018 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
3019 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
3020 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
3022 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
3023 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
3024 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
3026 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
3027 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
3028 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
3029 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
3030 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
3031 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
3035 json_object_int_add(
3036 json_area
, "lsaOpaqueLinkNumber",
3037 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3038 json_object_int_add(
3039 json_area
, "lsaOpaqueLinkChecksum",
3040 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3041 json_object_int_add(
3042 json_area
, "lsaOpaqueAreaNumber",
3043 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3044 json_object_int_add(
3045 json_area
, "lsaOpaqueAreaChecksum",
3046 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3049 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
3050 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
3051 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
3053 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
3054 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
3055 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
3059 json_object_object_add(json_areas
,
3060 inet_ntop(AF_INET
, &area
->area_id
,
3067 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
3068 json_object
*json
, uint8_t use_vrf
)
3070 struct listnode
*node
, *nnode
;
3071 struct ospf_area
*area
;
3072 struct timeval result
;
3073 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3074 json_object
*json_vrf
= NULL
;
3075 json_object
*json_areas
= NULL
;
3079 json_vrf
= json_object_new_object();
3082 json_areas
= json_object_new_object();
3085 if (ospf
->instance
) {
3087 json_object_int_add(json
, "ospfInstance",
3090 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3094 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3096 /* Show Router ID. */
3098 json_object_string_addf(json_vrf
, "routerId", "%pI4",
3101 vty_out(vty
, " OSPF Routing Process, Router ID: %pI4\n",
3105 /* Graceful shutdown */
3106 if (ospf
->t_deferred_shutdown
) {
3111 &ospf
->t_deferred_shutdown
->u
.sands
,
3114 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
3118 " Deferred shutdown in progress, %s remaining\n",
3119 ospf_timer_dump(ospf
->t_deferred_shutdown
,
3120 timebuf
, sizeof(timebuf
)));
3124 /* Show capability. */
3126 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
3127 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
3128 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
3129 json_object_boolean_true_add(json_vrf
,
3130 "rfc1583Compatibility");
3133 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3134 vty_out(vty
, " This implementation conforms to RFC2328\n");
3135 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3136 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3142 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3143 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3146 vty_out(vty
, " OpaqueCapability flag is %s\n",
3147 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3152 /* Show stub-router configuration */
3153 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3154 || ospf
->stub_router_shutdown_time
3155 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3157 json_object_boolean_true_add(json_vrf
,
3158 "stubAdvertisement");
3159 if (ospf
->stub_router_startup_time
3160 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3161 json_object_int_add(
3162 json_vrf
, "postStartEnabledSecs",
3163 ospf
->stub_router_startup_time
);
3164 if (ospf
->stub_router_shutdown_time
3165 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3166 json_object_int_add(
3167 json_vrf
, "preShutdownEnabledSecs",
3168 ospf
->stub_router_shutdown_time
);
3171 " Stub router advertisement is configured\n");
3172 if (ospf
->stub_router_startup_time
3173 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3175 " Enabled for %us after start-up\n",
3176 ospf
->stub_router_startup_time
);
3177 if (ospf
->stub_router_shutdown_time
3178 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3180 " Enabled for %us prior to full shutdown\n",
3181 ospf
->stub_router_shutdown_time
);
3185 /* Show SPF timers. */
3187 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3189 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3190 ospf
->spf_holdtime
);
3191 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3192 ospf
->spf_max_holdtime
);
3193 json_object_int_add(json_vrf
, "holdtimeMultplier",
3194 ospf
->spf_hold_multiplier
);
3197 " Initial SPF scheduling delay %d millisec(s)\n"
3198 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3199 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3200 " Hold time multiplier is currently %d\n",
3201 ospf
->spf_delay
, ospf
->spf_holdtime
,
3202 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3206 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3207 long time_store
= 0;
3210 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3211 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3214 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3215 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3216 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3219 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3221 vty_out(vty
, " SPF algorithm ");
3222 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3223 monotime_since(&ospf
->ts_spf
, &result
);
3224 vty_out(vty
, "last executed %s ago\n",
3225 ospf_timeval_dump(&result
, timebuf
,
3227 vty_out(vty
, " Last SPF duration %s\n",
3228 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3229 timebuf
, sizeof(timebuf
)));
3231 vty_out(vty
, "has not been run\n");
3235 if (ospf
->t_spf_calc
) {
3238 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3240 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3244 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3245 ospf
->min_ls_interval
);
3246 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3247 ospf
->min_ls_arrival
);
3248 /* Show write multiplier values */
3249 json_object_int_add(json_vrf
, "writeMultiplier",
3250 ospf
->write_oi_count
);
3251 /* Show refresh parameters. */
3252 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3253 ospf
->lsa_refresh_interval
* 1000);
3255 /* show max multipath */
3256 json_object_int_add(json_vrf
, "maximumPaths",
3257 ospf
->max_multipath
);
3259 /* show administrative distance */
3260 json_object_int_add(json_vrf
, "preference",
3262 ? ospf
->distance_all
3263 : ZEBRA_OSPF_DISTANCE_DEFAULT
);
3265 vty_out(vty
, " SPF timer %s%s\n",
3266 (ospf
->t_spf_calc
? "due in " : "is "),
3267 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3270 vty_out(vty
, " LSA minimum interval %d msecs\n",
3271 ospf
->min_ls_interval
);
3272 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3273 ospf
->min_ls_arrival
);
3275 /* Show write multiplier values */
3276 vty_out(vty
, " Write Multiplier set to %d \n",
3277 ospf
->write_oi_count
);
3279 /* Show refresh parameters. */
3280 vty_out(vty
, " Refresh timer %d secs\n",
3281 ospf
->lsa_refresh_interval
);
3283 /* show max multipath */
3284 vty_out(vty
, " Maximum multiple paths(ECMP) supported %d\n",
3285 ospf
->max_multipath
);
3287 /* show administrative distance */
3288 vty_out(vty
, " Administrative distance %u\n",
3289 ospf
->distance_all
? ospf
->distance_all
3290 : ZEBRA_OSPF_DISTANCE_DEFAULT
);
3293 /* Show ABR/ASBR flags. */
3294 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3296 json_object_string_add(
3297 json_vrf
, "abrType",
3298 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3301 " This router is an ABR, ABR type is: %s\n",
3302 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3304 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3306 json_object_string_add(
3307 json_vrf
, "asbrRouter",
3308 "injectingExternalRoutingInformation");
3311 " This router is an ASBR (injecting external routing information)\n");
3314 /* Show Number of AS-external-LSAs. */
3316 json_object_int_add(
3317 json_vrf
, "lsaExternalCounter",
3318 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3319 json_object_int_add(
3320 json_vrf
, "lsaExternalChecksum",
3321 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3324 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3325 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3326 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3330 json_object_int_add(
3331 json_vrf
, "lsaAsopaqueCounter",
3332 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3333 json_object_int_add(
3334 json_vrf
, "lsaAsOpaqueChecksum",
3335 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3338 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3339 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3340 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3343 /* Show number of areas attached. */
3345 json_object_int_add(json_vrf
, "attachedAreaCounter",
3346 listcount(ospf
->areas
));
3348 vty_out(vty
, " Number of areas attached to this router: %d\n",
3349 listcount(ospf
->areas
));
3351 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3352 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3354 json_object_boolean_true_add(
3355 json_vrf
, "adjacencyChangesLoggedAll");
3358 " All adjacency changes are logged\n");
3361 json_object_boolean_true_add(
3362 json_vrf
, "adjacencyChangesLogged");
3364 vty_out(vty
, " Adjacency changes are logged\n");
3368 /* show LDP-Sync status */
3369 ospf_ldp_sync_show_info(vty
, ospf
, json_vrf
, json
? 1 : 0);
3371 /* Show each area status. */
3372 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3373 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3377 json_object_object_add(json_vrf
, "areas", json_areas
);
3378 json_object_object_add(json
, ospf_get_name(ospf
),
3381 json_object_object_add(json
, "areas", json_areas
);
3389 DEFUN (show_ip_ospf
,
3391 "show ip ospf [vrf <NAME|all>] [json]",
3394 "OSPF information\n"
3400 bool uj
= use_json(argc
, argv
);
3401 struct listnode
*node
= NULL
;
3402 char *vrf_name
= NULL
;
3403 bool all_vrf
= false;
3404 int ret
= CMD_SUCCESS
;
3407 json_object
*json
= NULL
;
3408 uint8_t use_vrf
= 0;
3410 if (listcount(om
->ospf
) == 0)
3413 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3416 json
= json_object_new_object();
3418 /* vrf input is provided could be all or specific vrf*/
3420 bool ospf_output
= false;
3425 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3426 if (!ospf
->oi_running
)
3429 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3433 vty_json(vty
, json
);
3434 else if (!ospf_output
)
3435 vty_out(vty
, "%% OSPF is not enabled\n");
3438 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3439 if ((ospf
== NULL
) || !ospf
->oi_running
) {
3441 vty_json(vty
, json
);
3444 "%% OSPF is not enabled in vrf %s\n",
3450 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3451 /* Display default ospf (instance 0) info */
3452 if (ospf
== NULL
|| !ospf
->oi_running
) {
3454 vty_json(vty
, json
);
3457 "%% OSPF is not enabled in vrf default\n");
3464 show_ip_ospf_common(vty
, ospf
, json
, use_vrf
);
3466 vty_out(vty
, "%s\n",
3467 json_object_to_json_string_ext(
3468 json
, JSON_C_TO_STRING_PRETTY
));
3472 json_object_free(json
);
3477 DEFUN (show_ip_ospf_instance
,
3478 show_ip_ospf_instance_cmd
,
3479 "show ip ospf (1-65535) [json]",
3482 "OSPF information\n"
3488 unsigned short instance
= 0;
3489 bool uj
= use_json(argc
, argv
);
3490 int ret
= CMD_SUCCESS
;
3491 json_object
*json
= NULL
;
3493 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3494 if (instance
!= ospf_instance
)
3495 return CMD_NOT_MY_INSTANCE
;
3497 ospf
= ospf_lookup_instance(instance
);
3498 if (!ospf
|| !ospf
->oi_running
)
3502 json
= json_object_new_object();
3504 ret
= show_ip_ospf_common(vty
, ospf
, json
, 0);
3507 vty_json(vty
, json
);
3512 static void ospf_interface_auth_show(struct vty
*vty
, struct ospf_interface
*oi
,
3513 json_object
*json
, bool use_json
)
3517 auth_type
= OSPF_IF_PARAM(oi
, auth_type
);
3519 switch (auth_type
) {
3520 case OSPF_AUTH_NULL
:
3522 json_object_string_add(json
, "authentication",
3523 "authenticationNone");
3525 vty_out(vty
, " Authentication NULL is enabled\n");
3527 case OSPF_AUTH_SIMPLE
: {
3529 json_object_string_add(json
, "authentication",
3530 "authenticationSimplePassword");
3533 " Simple password authentication enabled\n");
3536 case OSPF_AUTH_CRYPTOGRAPHIC
: {
3537 struct crypt_key
*ckey
;
3539 if (list_isempty(OSPF_IF_PARAM(oi
, auth_crypt
)))
3542 ckey
= listgetdata(listtail(OSPF_IF_PARAM(oi
, auth_crypt
)));
3545 json_object_string_add(json
, "authentication",
3546 "authenticationMessageDigest");
3549 " Cryptographic authentication enabled\n");
3550 vty_out(vty
, " Algorithm:MD5\n");
3560 static void show_ip_ospf_interface_sub(struct vty
*vty
, struct ospf
*ospf
,
3561 struct interface
*ifp
,
3562 json_object
*json_interface_sub
,
3566 struct ospf_neighbor
*nbr
;
3567 struct route_node
*rn
;
3568 uint32_t bandwidth
= ifp
->bandwidth
? ifp
->bandwidth
: ifp
->speed
;
3570 /* Is interface up? */
3572 is_up
= if_is_operative(ifp
);
3574 json_object_boolean_true_add(json_interface_sub
,
3577 json_object_boolean_false_add(json_interface_sub
,
3580 json_object_int_add(json_interface_sub
, "ifIndex",
3582 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3583 json_object_int_add(json_interface_sub
, "bandwidthMbit",
3585 json_object_string_add(json_interface_sub
, "ifFlags",
3586 if_flag_dump(ifp
->flags
));
3588 vty_out(vty
, "%s is %s\n", ifp
->name
,
3589 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"));
3590 vty_out(vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3591 ifp
->ifindex
, ifp
->mtu
, bandwidth
,
3592 if_flag_dump(ifp
->flags
));
3595 /* Is interface OSPF enabled? */
3597 if (ospf_oi_count(ifp
) == 0) {
3598 json_object_boolean_false_add(json_interface_sub
,
3601 } else if (!is_up
) {
3602 json_object_boolean_false_add(json_interface_sub
,
3606 json_object_boolean_true_add(json_interface_sub
,
3609 if (ospf_oi_count(ifp
) == 0) {
3610 vty_out(vty
, " OSPF not enabled on this interface\n");
3612 } else if (!is_up
) {
3614 " OSPF is enabled, but not running on this interface\n");
3619 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
3620 struct ospf_interface
*oi
= rn
->info
;
3625 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)) {
3627 json_object_boolean_true_add(json_interface_sub
,
3630 vty_out(vty
, " This interface is UNNUMBERED,");
3632 struct in_addr dest
;
3635 /* Show OSPF interface information. */
3637 json_object_string_addf(
3638 json_interface_sub
, "ipAddress", "%pI4",
3639 &oi
->address
->u
.prefix4
);
3640 json_object_int_add(json_interface_sub
,
3641 "ipAddressPrefixlen",
3642 oi
->address
->prefixlen
);
3644 vty_out(vty
, " Internet Address %pFX,",
3647 /* For Vlinks, showing the peer address is
3648 * probably more informative than the local
3649 * interface that is being used */
3650 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
) {
3652 dest
= oi
->vl_data
->peer_addr
;
3653 } else if (CONNECTED_PEER(oi
->connected
)
3654 && oi
->connected
->destination
) {
3656 dest
= oi
->connected
->destination
->u
.prefix4
;
3659 dest
.s_addr
= ipv4_broadcast_addr(
3660 oi
->connected
->address
->u
.prefix4
.s_addr
,
3661 oi
->connected
->address
->prefixlen
);
3665 json_object_string_add(
3667 "ospfIfType", dstr
);
3668 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3669 json_object_string_addf(
3670 json_interface_sub
, "vlinkPeer",
3673 json_object_string_addf(
3675 "localIfUsed", "%pI4", &dest
);
3677 vty_out(vty
, " %s %pI4,", dstr
,
3681 json_object_string_add(json_interface_sub
, "area",
3682 ospf_area_desc_string(oi
->area
));
3683 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3684 json_object_boolean_true_add(
3686 "mtuMismatchDetect");
3687 json_object_string_addf(json_interface_sub
, "routerId",
3688 "%pI4", &ospf
->router_id
);
3689 json_object_string_add(json_interface_sub
,
3691 ospf_network_type_str
[oi
->type
]);
3692 json_object_int_add(json_interface_sub
, "cost",
3694 json_object_int_add(
3695 json_interface_sub
, "transmitDelaySecs",
3696 OSPF_IF_PARAM(oi
, transmit_delay
));
3697 json_object_string_add(json_interface_sub
, "state",
3698 lookup_msg(ospf_ism_state_msg
,
3700 json_object_int_add(json_interface_sub
, "priority",
3703 vty_out(vty
, " Area %s\n",
3704 ospf_area_desc_string(oi
->area
));
3706 vty_out(vty
, " MTU mismatch detection: %s\n",
3707 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled"
3711 " Router ID %pI4, Network Type %s, Cost: %d\n",
3713 ospf_network_type_str
[oi
->type
],
3717 " Transmit Delay is %d sec, State %s, Priority %d\n",
3718 OSPF_IF_PARAM(oi
, transmit_delay
),
3719 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
3723 /* Show DR information. */
3724 if (DR(oi
).s_addr
== INADDR_ANY
) {
3727 " No backup designated router on this network\n");
3729 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &DR(oi
));
3732 json_object_string_addf(
3733 json_interface_sub
, "drId",
3734 "%pI4", &nbr
->router_id
);
3735 json_object_string_addf(
3736 json_interface_sub
, "drAddress",
3738 &nbr
->address
.u
.prefix4
);
3741 " Designated Router (ID) %pI4",
3744 " Interface Address %pFX\n",
3750 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &BDR(oi
));
3754 " No backup designated router on this network\n");
3757 json_object_string_addf(
3758 json_interface_sub
, "bdrId",
3759 "%pI4", &nbr
->router_id
);
3760 json_object_string_addf(
3762 "bdrAddress", "%pI4",
3763 &nbr
->address
.u
.prefix4
);
3766 " Backup Designated Router (ID) %pI4,",
3768 vty_out(vty
, " Interface Address %pI4\n",
3769 &nbr
->address
.u
.prefix4
);
3774 /* Next network-LSA sequence number we'll use, if we're elected
3777 && ntohl(oi
->params
->network_lsa_seqnum
)
3778 != OSPF_INITIAL_SEQUENCE_NUMBER
) {
3780 json_object_int_add(
3782 "networkLsaSequence",
3783 ntohl(oi
->params
->network_lsa_seqnum
));
3786 " Saved Network-LSA sequence number 0x%x\n",
3787 ntohl(oi
->params
->network_lsa_seqnum
));
3791 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3792 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3793 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3794 json_object_boolean_true_add(
3796 "mcastMemberOspfAllRouters");
3797 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3798 json_object_boolean_true_add(
3800 "mcastMemberOspfDesignatedRouters");
3803 vty_out(vty
, " Multicast group memberships:");
3804 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3805 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3806 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3807 vty_out(vty
, " OSPFAllRouters");
3808 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3809 vty_out(vty
, " OSPFDesignatedRouters");
3811 vty_out(vty
, " <None>");
3816 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3817 json_object_int_add(
3818 json_interface_sub
, "timerMsecs",
3819 OSPF_IF_PARAM(oi
, v_hello
) * 1000);
3821 json_object_int_add(
3822 json_interface_sub
, "timerMsecs",
3823 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3824 json_object_int_add(json_interface_sub
,
3826 OSPF_IF_PARAM(oi
, v_wait
));
3827 json_object_int_add(json_interface_sub
,
3829 OSPF_IF_PARAM(oi
, v_wait
));
3830 json_object_int_add(
3831 json_interface_sub
, "timerRetransmitSecs",
3832 OSPF_IF_PARAM(oi
, retransmit_interval
));
3834 vty_out(vty
, " Timer intervals configured,");
3835 vty_out(vty
, " Hello ");
3836 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3837 vty_out(vty
, "%ds,",
3838 OSPF_IF_PARAM(oi
, v_hello
));
3840 vty_out(vty
, "%dms,",
3841 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3842 vty_out(vty
, " Dead %ds, Wait %ds, Retransmit %d\n",
3843 OSPF_IF_PARAM(oi
, v_wait
),
3844 OSPF_IF_PARAM(oi
, v_wait
),
3845 OSPF_IF_PARAM(oi
, retransmit_interval
));
3848 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_ACTIVE
) {
3849 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3851 long time_store
= 0;
3855 &oi
->t_hello
->u
.sands
,
3858 json_object_int_add(json_interface_sub
,
3859 "timerHelloInMsecs",
3862 vty_out(vty
, " Hello due in %s\n",
3863 ospf_timer_dump(oi
->t_hello
, timebuf
,
3865 } else /* passive-interface is set */
3868 json_object_boolean_true_add(
3870 "timerPassiveIface");
3873 " No Hellos (Passive interface)\n");
3877 json_object_int_add(json_interface_sub
, "nbrCount",
3878 ospf_nbr_count(oi
, 0));
3879 json_object_int_add(json_interface_sub
,
3881 ospf_nbr_count(oi
, NSM_Full
));
3884 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3885 ospf_nbr_count(oi
, 0),
3886 ospf_nbr_count(oi
, NSM_Full
));
3888 ospf_interface_bfd_show(vty
, ifp
, json_interface_sub
);
3890 /* OSPF Authentication information */
3891 ospf_interface_auth_show(vty
, oi
, json_interface_sub
, use_json
);
3895 static int show_ip_ospf_interface_common(struct vty
*vty
, struct ospf
*ospf
,
3896 char *intf_name
, uint8_t use_vrf
,
3897 json_object
*json
, bool use_json
)
3899 struct interface
*ifp
;
3900 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3901 json_object
*json_vrf
= NULL
;
3902 json_object
*json_interface_sub
= NULL
, *json_interface
= NULL
;
3906 json_vrf
= json_object_new_object();
3909 json_interface
= json_object_new_object();
3912 if (ospf
->instance
) {
3914 json_object_int_add(json
, "ospfInstance",
3917 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3920 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3922 if (intf_name
== NULL
) {
3923 /* Show All Interfaces.*/
3924 FOR_ALL_INTERFACES (vrf
, ifp
) {
3925 if (ospf_oi_count(ifp
)) {
3927 json_interface_sub
=
3928 json_object_new_object();
3930 show_ip_ospf_interface_sub(vty
, ospf
, ifp
,
3935 json_object_object_add(
3936 json_interface
, ifp
->name
,
3937 json_interface_sub
);
3942 json_object_object_add(json_vrf
, "interfaces",
3945 /* Interface name is specified. */
3946 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3949 json_object_boolean_true_add(json_vrf
,
3952 vty_out(vty
, "No such interface name\n");
3955 json_interface_sub
= json_object_new_object();
3956 json_interface
= json_object_new_object();
3959 show_ip_ospf_interface_sub(
3960 vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3963 json_object_object_add(json_interface
,
3965 json_interface_sub
);
3966 json_object_object_add(json_vrf
, "interfaces",
3974 json_object_object_add(json
, ospf_get_name(ospf
),
3983 static void show_ip_ospf_interface_traffic_sub(struct vty
*vty
,
3984 struct ospf_interface
*oi
,
3985 json_object
*json_interface_sub
,
3989 json_object_int_add(json_interface_sub
, "ifIndex",
3991 json_object_int_add(json_interface_sub
, "helloIn",
3993 json_object_int_add(json_interface_sub
, "helloOut",
3995 json_object_int_add(json_interface_sub
, "dbDescIn",
3997 json_object_int_add(json_interface_sub
, "dbDescOut",
3999 json_object_int_add(json_interface_sub
, "lsReqIn",
4001 json_object_int_add(json_interface_sub
, "lsReqOut",
4003 json_object_int_add(json_interface_sub
, "lsUpdIn",
4005 json_object_int_add(json_interface_sub
, "lsUpdOut",
4007 json_object_int_add(json_interface_sub
, "lsAckIn",
4009 json_object_int_add(json_interface_sub
, "lsAckOut",
4013 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
4014 oi
->ifp
->name
, oi
->hello_in
, oi
->hello_out
,
4015 oi
->db_desc_in
, oi
->db_desc_out
, oi
->ls_req_in
,
4016 oi
->ls_req_out
, oi
->ls_upd_in
, oi
->ls_upd_out
,
4017 oi
->ls_ack_in
, oi
->ls_ack_out
);
4021 /* OSPFv2 Packet Counters */
4022 static int show_ip_ospf_interface_traffic_common(
4023 struct vty
*vty
, struct ospf
*ospf
, char *intf_name
, json_object
*json
,
4024 int display_once
, uint8_t use_vrf
, bool use_json
)
4026 struct vrf
*vrf
= NULL
;
4027 struct interface
*ifp
= NULL
;
4028 json_object
*json_vrf
= NULL
;
4029 json_object
*json_interface_sub
= NULL
;
4031 if (!use_json
&& !display_once
) {
4033 vty_out(vty
, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface",
4034 " HELLO", " DB-Desc", " LS-Req", " LS-Update",
4036 vty_out(vty
, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
4037 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
4040 "--------------------------------------------------------------------------------------------\n");
4041 } else if (use_json
) {
4043 json_vrf
= json_object_new_object();
4048 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4050 if (intf_name
== NULL
) {
4051 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
4052 FOR_ALL_INTERFACES (vrf
, ifp
) {
4053 struct route_node
*rn
;
4054 struct ospf_interface
*oi
;
4056 if (ospf_oi_count(ifp
) == 0)
4059 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
4060 rn
= route_next(rn
)) {
4067 json_interface_sub
=
4068 json_object_new_object();
4071 show_ip_ospf_interface_traffic_sub(
4072 vty
, oi
, json_interface_sub
, use_json
);
4074 json_object_object_add(
4075 json_vrf
, ifp
->name
,
4076 json_interface_sub
);
4081 /* Interface name is specified. */
4082 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
4084 struct route_node
*rn
;
4085 struct ospf_interface
*oi
;
4087 if (ospf_oi_count(ifp
) == 0) {
4089 " OSPF not enabled on this interface %s\n",
4094 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
4095 rn
= route_next(rn
)) {
4099 json_interface_sub
=
4100 json_object_new_object();
4103 show_ip_ospf_interface_traffic_sub(
4104 vty
, oi
, json_interface_sub
, use_json
);
4106 json_object_object_add(
4107 json_vrf
, ifp
->name
,
4108 json_interface_sub
);
4116 json_object_object_add(json
, ospf_get_name(ospf
),
4124 DEFUN (show_ip_ospf_interface
,
4125 show_ip_ospf_interface_cmd
,
4126 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
4129 "OSPF information\n"
4132 "Interface information\n"
4137 bool uj
= use_json(argc
, argv
);
4138 struct listnode
*node
= NULL
;
4139 char *vrf_name
= NULL
, *intf_name
= NULL
;
4140 bool all_vrf
= false;
4141 int ret
= CMD_SUCCESS
;
4143 int idx_vrf
= 0, idx_intf
= 0;
4144 uint8_t use_vrf
= 0;
4145 json_object
*json
= NULL
;
4147 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4149 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4150 intf_name
= argv
[idx_intf
]->arg
;
4153 json
= json_object_new_object();
4155 /* vrf input is provided could be all or specific vrf*/
4159 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4160 if (!ospf
->oi_running
)
4162 ret
= show_ip_ospf_interface_common(
4163 vty
, ospf
, intf_name
, use_vrf
, json
,
4168 vty_json(vty
, json
);
4170 vty_out(vty
, "%% OSPF is not enabled\n");
4174 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4175 if (ospf
== NULL
|| !ospf
->oi_running
) {
4177 vty_json(vty
, json
);
4180 "%% OSPF is not enabled in vrf %s\n",
4185 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4189 /* Display default ospf (instance 0) info */
4190 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4191 if (ospf
== NULL
|| !ospf
->oi_running
) {
4193 vty_json(vty
, json
);
4196 "%% OSPF is not enabled in vrf default\n");
4200 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4205 vty_json(vty
, json
);
4210 DEFUN (show_ip_ospf_instance_interface
,
4211 show_ip_ospf_instance_interface_cmd
,
4212 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4215 "OSPF information\n"
4217 "Interface information\n"
4224 unsigned short instance
= 0;
4225 bool uj
= use_json(argc
, argv
);
4226 char *intf_name
= NULL
;
4227 int ret
= CMD_SUCCESS
;
4228 json_object
*json
= NULL
;
4230 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4231 if (instance
!= ospf_instance
)
4232 return CMD_NOT_MY_INSTANCE
;
4234 ospf
= ospf_lookup_instance(instance
);
4235 if (!ospf
|| !ospf
->oi_running
)
4239 json
= json_object_new_object();
4241 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4242 intf_name
= argv
[idx_intf
]->arg
;
4244 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4247 vty_json(vty
, json
);
4252 DEFUN (show_ip_ospf_interface_traffic
,
4253 show_ip_ospf_interface_traffic_cmd
,
4254 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4257 "OSPF information\n"
4260 "Interface information\n"
4261 "Protocol Packet counters\n"
4265 struct ospf
*ospf
= NULL
;
4266 struct listnode
*node
= NULL
;
4267 char *vrf_name
= NULL
, *intf_name
= NULL
;
4268 bool all_vrf
= false;
4270 int idx_vrf
= 0, idx_intf
= 0;
4271 bool uj
= use_json(argc
, argv
);
4272 json_object
*json
= NULL
;
4273 int ret
= CMD_SUCCESS
;
4274 int display_once
= 0;
4275 uint8_t use_vrf
= 0;
4277 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4279 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4280 intf_name
= argv
[idx_intf
]->arg
;
4283 json
= json_object_new_object();
4288 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4289 if (!ospf
->oi_running
)
4292 ret
= show_ip_ospf_interface_traffic_common(
4293 vty
, ospf
, intf_name
, json
,
4294 display_once
, use_vrf
, uj
);
4299 vty_json(vty
, json
);
4303 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4304 if (ospf
== NULL
|| !ospf
->oi_running
) {
4306 json_object_free(json
);
4310 ret
= show_ip_ospf_interface_traffic_common(
4311 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4313 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4314 if (ospf
== NULL
|| !ospf
->oi_running
) {
4316 json_object_free(json
);
4320 ret
= show_ip_ospf_interface_traffic_common(
4321 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4325 vty_json(vty
, json
);
4331 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4333 vty_out(vty
, "\n%-15s %-3s %-15s %-15s %-9s %-15s %-32s %5s %5s %5s\n",
4334 "Neighbor ID", "Pri", "State", "Up Time", "Dead Time",
4335 "Address", "Interface", "RXmtL", "RqstL", "DBsmL");
4338 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4339 struct ospf_interface
*oi
,
4340 json_object
*json
, bool use_json
)
4342 struct route_node
*rn
;
4343 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
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 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4352 if ((nbr
= rn
->info
)) {
4353 /* Do not show myself. */
4354 if (nbr
== oi
->nbr_self
)
4356 /* Down state is not shown. */
4357 if (nbr
->state
== NSM_Down
)
4360 if (nbr
->ts_last_progress
.tv_sec
4361 || nbr
->ts_last_progress
.tv_usec
)
4362 time_val
= monotime_since(
4363 &nbr
->ts_last_progress
, &res
)
4367 char neigh_str
[INET_ADDRSTRLEN
];
4370 && !IPV4_ADDR_SAME(&prev_nbr
->src
,
4372 /* Start new neigh list */
4373 json_neigh_array
= NULL
;
4376 if (nbr
->state
== NSM_Attempt
4377 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4378 strlcpy(neigh_str
, "neighbor",
4381 inet_ntop(AF_INET
, &nbr
->router_id
,
4382 neigh_str
, sizeof(neigh_str
));
4384 json_object_object_get_ex(json
, neigh_str
,
4387 if (!json_neigh_array
) {
4389 json_object_new_array();
4390 json_object_object_add(
4395 json_neighbor
= json_object_new_object();
4397 ospf_nbr_ism_state_message(nbr
, msgbuf
,
4399 #if CONFDATE > 20230321
4400 CPP_NOTICE("Remove show_ip_ospf_neighbor_sub() JSON keys: priority, state, deadTimeMsecs, address, retransmitCounter, requestCounter, dbSummaryCounter")
4402 json_object_int_add(json_neighbor
, "priority",
4404 json_object_string_add(json_neighbor
, "state",
4406 json_object_int_add(json_neighbor
,
4409 json_object_string_add(json_neighbor
,
4410 "nbrState", msgbuf
);
4412 json_object_string_add(
4413 json_neighbor
, "converged",
4414 lookup_msg(ospf_nsm_state_msg
,
4416 json_object_string_add(
4417 json_neighbor
, "role",
4418 lookup_msg(ospf_ism_state_msg
,
4419 ospf_nbr_ism_state(nbr
),
4422 if (nbr
->t_inactivity
) {
4425 time_store
= monotime_until(
4430 json_object_int_add(json_neighbor
,
4433 json_object_int_add(json_neighbor
,
4436 json_object_int_add(
4438 "routerDeadIntervalTimerDueMsec",
4440 json_object_string_add(
4441 json_neighbor
, "upTime",
4445 json_object_string_add(
4446 json_neighbor
, "deadTime",
4452 json_object_string_add(json_neighbor
,
4455 json_object_string_add(
4457 "routerDeadIntervalTimerDueMsec",
4460 json_object_string_addf(json_neighbor
,
4463 json_object_string_addf(json_neighbor
,
4464 "ifaceAddress", "%pI4",
4466 json_object_string_add(json_neighbor
,
4469 json_object_int_add(
4470 json_neighbor
, "retransmitCounter",
4471 ospf_ls_retransmit_count(nbr
));
4472 json_object_int_add(
4474 "linkStateRetransmissionListCounter",
4475 ospf_ls_retransmit_count(nbr
));
4476 json_object_int_add(json_neighbor
,
4478 ospf_ls_request_count(nbr
));
4479 json_object_int_add(
4481 "linkStateRequestListCounter",
4482 ospf_ls_request_count(nbr
));
4483 json_object_int_add(json_neighbor
,
4485 ospf_db_summary_count(nbr
));
4486 json_object_int_add(
4488 "databaseSummaryListCounter",
4489 ospf_db_summary_count(nbr
));
4491 json_object_array_add(json_neigh_array
,
4494 ospf_nbr_ism_state_message(nbr
, msgbuf
,
4497 if (nbr
->state
== NSM_Attempt
4498 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4499 vty_out(vty
, "%-15s %3d %-15s ", "-",
4500 nbr
->priority
, msgbuf
);
4502 vty_out(vty
, "%-15pI4 %3d %-15s ",
4503 &nbr
->router_id
, nbr
->priority
,
4506 vty_out(vty
, "%-15s ",
4507 ospf_timeval_dump(&res
, uptime
,
4510 vty_out(vty
, "%9s ",
4511 ospf_timer_dump(nbr
->t_inactivity
,
4514 vty_out(vty
, "%-15pI4 ", &nbr
->src
);
4515 vty_out(vty
, "%-32s %5ld %5ld %5d\n",
4517 ospf_ls_retransmit_count(nbr
),
4518 ospf_ls_request_count(nbr
),
4519 ospf_db_summary_count(nbr
));
4526 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4527 json_object
*json
, bool use_json
,
4530 struct ospf_interface
*oi
;
4531 struct listnode
*node
;
4532 json_object
*json_vrf
= NULL
;
4533 json_object
*json_nbr_sub
= NULL
;
4537 json_vrf
= json_object_new_object();
4540 json_nbr_sub
= json_object_new_object();
4543 if (ospf
->instance
) {
4545 json_object_int_add(json
, "ospfInstance",
4548 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4551 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4553 show_ip_ospf_neighbour_header(vty
);
4555 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4556 if (ospf_interface_neighbor_count(oi
) == 0)
4558 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4562 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4564 json_object_object_add(json
, ospf_get_name(ospf
),
4572 DEFUN (show_ip_ospf_neighbor
,
4573 show_ip_ospf_neighbor_cmd
,
4574 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4577 "OSPF information\n"
4584 bool uj
= use_json(argc
, argv
);
4585 struct listnode
*node
= NULL
;
4586 char *vrf_name
= NULL
;
4587 bool all_vrf
= false;
4588 int ret
= CMD_SUCCESS
;
4591 uint8_t use_vrf
= 0;
4592 json_object
*json
= NULL
;
4594 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4597 json
= json_object_new_object();
4599 /* vrf input is provided could be all or specific vrf*/
4603 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4604 if (!ospf
->oi_running
)
4606 ret
= show_ip_ospf_neighbor_common(
4607 vty
, ospf
, json
, uj
, use_vrf
);
4611 vty_json(vty
, json
);
4613 vty_out(vty
, "OSPF is not enabled\n");
4618 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4619 if (ospf
== NULL
|| !ospf
->oi_running
) {
4621 vty_json(vty
, json
);
4624 "%% OSPF is not enabled in vrf %s\n",
4630 /* Display default ospf (instance 0) info */
4631 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4632 if (ospf
== NULL
|| !ospf
->oi_running
) {
4634 vty_json(vty
, json
);
4637 "%% OSPF is not enabled in vrf default\n");
4644 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4648 vty_out(vty
, "%s\n",
4649 json_object_to_json_string_ext(
4650 json
, JSON_C_TO_STRING_PRETTY
));
4655 json_object_free(json
);
4661 DEFUN (show_ip_ospf_instance_neighbor
,
4662 show_ip_ospf_instance_neighbor_cmd
,
4663 "show ip ospf (1-65535) neighbor [json]",
4666 "OSPF information\n"
4673 unsigned short instance
= 0;
4674 bool uj
= use_json(argc
, argv
);
4675 json_object
*json
= NULL
;
4676 int ret
= CMD_SUCCESS
;
4678 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4679 if (instance
!= ospf_instance
)
4680 return CMD_NOT_MY_INSTANCE
;
4682 ospf
= ospf_lookup_instance(instance
);
4683 if (!ospf
|| !ospf
->oi_running
)
4687 json
= json_object_new_object();
4689 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4692 vty_json(vty
, json
);
4697 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4698 json_object
*json
, bool use_json
,
4701 struct listnode
*node
;
4702 struct ospf_interface
*oi
;
4703 char buf
[PREFIX_STRLEN
];
4704 json_object
*json_vrf
= NULL
;
4705 json_object
*json_neighbor_sub
= NULL
;
4709 json_vrf
= json_object_new_object();
4714 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4716 show_ip_ospf_neighbour_header(vty
);
4718 if (ospf
->instance
) {
4720 json_object_int_add(json_vrf
, "ospfInstance",
4723 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4726 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4727 struct listnode
*nbr_node
;
4728 struct ospf_nbr_nbma
*nbr_nbma
;
4730 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4732 /* print Down neighbor status */
4733 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4734 if (nbr_nbma
->nbr
== NULL
4735 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4738 json_object_new_object();
4739 json_object_int_add(json_neighbor_sub
,
4741 nbr_nbma
->priority
);
4742 json_object_boolean_true_add(
4745 json_object_string_add(
4749 json_object_int_add(
4751 "nbrNbmaRetransmitCounter", 0);
4752 json_object_int_add(
4754 "nbrNbmaRequestCounter", 0);
4755 json_object_int_add(
4757 "nbrNbmaDbSummaryCounter", 0);
4758 json_object_object_add(
4761 &nbr_nbma
->addr
, buf
,
4765 vty_out(vty
, "%-15s %3d %-15s %9s ",
4766 "-", nbr_nbma
->priority
, "Down",
4769 "%-32pI4 %-20s %5d %5d %5d\n",
4771 IF_NAME(oi
), 0, 0, 0);
4779 json_object_object_add(json
, ospf_get_name(ospf
),
4787 DEFUN (show_ip_ospf_neighbor_all
,
4788 show_ip_ospf_neighbor_all_cmd
,
4789 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4792 "OSPF information\n"
4796 "include down status neighbor\n"
4800 bool uj
= use_json(argc
, argv
);
4801 struct listnode
*node
= NULL
;
4802 char *vrf_name
= NULL
;
4803 bool all_vrf
= false;
4804 int ret
= CMD_SUCCESS
;
4807 uint8_t use_vrf
= 0;
4808 json_object
*json
= NULL
;
4810 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4813 json
= json_object_new_object();
4815 /* vrf input is provided could be all or specific vrf*/
4819 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4820 if (!ospf
->oi_running
)
4822 ret
= show_ip_ospf_neighbor_all_common(
4823 vty
, ospf
, json
, uj
, use_vrf
);
4827 vty_json(vty
, json
);
4832 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4833 if (ospf
== NULL
|| !ospf
->oi_running
) {
4835 json_object_free(json
);
4839 /* Display default ospf (instance 0) info */
4840 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4841 if (ospf
== NULL
|| !ospf
->oi_running
) {
4843 json_object_free(json
);
4849 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4852 vty_out(vty
, "%s\n",
4853 json_object_to_json_string_ext(
4854 json
, JSON_C_TO_STRING_PRETTY
));
4859 json_object_free(json
);
4864 DEFUN (show_ip_ospf_instance_neighbor_all
,
4865 show_ip_ospf_instance_neighbor_all_cmd
,
4866 "show ip ospf (1-65535) neighbor all [json]",
4869 "OSPF information\n"
4872 "include down status neighbor\n"
4877 unsigned short instance
= 0;
4878 bool uj
= use_json(argc
, argv
);
4879 json_object
*json
= NULL
;
4880 int ret
= CMD_SUCCESS
;
4882 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4883 if (instance
!= ospf_instance
)
4884 return CMD_NOT_MY_INSTANCE
;
4886 ospf
= ospf_lookup_instance(instance
);
4887 if (!ospf
|| !ospf
->oi_running
)
4890 json
= json_object_new_object();
4892 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4895 vty_json(vty
, json
);
4900 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4902 struct cmd_token
**argv
,
4903 bool use_json
, uint8_t use_vrf
)
4905 struct interface
*ifp
;
4906 struct route_node
*rn
;
4907 json_object
*json
= NULL
;
4910 json
= json_object_new_object();
4912 if (ospf
->instance
) {
4914 json_object_int_add(json
, "ospfInstance",
4917 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4920 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4922 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4925 json_object_boolean_true_add(json
, "noSuchIface");
4927 vty_out(vty
, "No such interface.\n");
4931 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4932 struct ospf_interface
*oi
= rn
->info
;
4937 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4941 vty_json(vty
, json
);
4948 DEFUN (show_ip_ospf_neighbor_int
,
4949 show_ip_ospf_neighbor_int_cmd
,
4950 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4953 "OSPF information\n"
4962 bool uj
= use_json(argc
, argv
);
4963 int ret
= CMD_SUCCESS
;
4964 struct interface
*ifp
= NULL
;
4965 char *vrf_name
= NULL
;
4966 vrf_id_t vrf_id
= VRF_DEFAULT
;
4967 struct vrf
*vrf
= NULL
;
4969 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4970 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4971 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4974 vrf
= vrf_lookup_by_name(vrf_name
);
4976 vrf_id
= vrf
->vrf_id
;
4978 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4980 if (!ospf
|| !ospf
->oi_running
)
4984 show_ip_ospf_neighbour_header(vty
);
4986 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4988 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4992 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4997 DEFUN (show_ip_ospf_instance_neighbor_int
,
4998 show_ip_ospf_instance_neighbor_int_cmd
,
4999 "show ip ospf (1-65535) neighbor IFNAME [json]",
5002 "OSPF information\n"
5011 unsigned short instance
= 0;
5012 bool uj
= use_json(argc
, argv
);
5015 show_ip_ospf_neighbour_header(vty
);
5017 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5018 if (instance
!= ospf_instance
)
5019 return CMD_NOT_MY_INSTANCE
;
5021 ospf
= ospf_lookup_instance(instance
);
5022 if (!ospf
|| !ospf
->oi_running
)
5026 show_ip_ospf_neighbour_header(vty
);
5028 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
5032 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
5033 struct ospf_interface
*oi
,
5034 struct ospf_nbr_nbma
*nbr_nbma
,
5035 bool use_json
, json_object
*json
)
5037 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5038 json_object
*json_sub
= NULL
;
5041 json_sub
= json_object_new_object();
5042 else /* Show neighbor ID. */
5043 vty_out(vty
, " Neighbor %s,", "-");
5045 /* Show interface address. */
5047 json_object_string_addf(json_sub
, "ifaceAddress", "%pI4",
5050 vty_out(vty
, " interface address %pI4\n",
5055 json_object_string_add(json_sub
, "areaId",
5056 ospf_area_desc_string(oi
->area
));
5057 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
5059 vty_out(vty
, " In the area %s via interface %s\n",
5060 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
5062 /* Show neighbor priority and state. */
5064 json_object_int_add(json_sub
, "nbrPriority",
5065 nbr_nbma
->priority
);
5066 json_object_string_add(json_sub
, "nbrState", "down");
5068 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5069 nbr_nbma
->priority
, "Down");
5071 /* Show state changes. */
5073 json_object_int_add(json_sub
, "stateChangeCounter",
5074 nbr_nbma
->state_change
);
5076 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
5078 /* Show PollInterval */
5080 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
5082 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
5084 /* Show poll-interval timer. */
5085 if (nbr_nbma
->t_poll
) {
5088 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
5090 json_object_int_add(json_sub
,
5091 "pollIntervalTimerDueMsec",
5094 vty_out(vty
, " Poll timer due in %s\n",
5095 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
5099 /* Show poll-interval timer thread. */
5101 if (nbr_nbma
->t_poll
!= NULL
)
5102 json_object_string_add(json_sub
,
5103 "pollIntervalTimerThread", "on");
5105 vty_out(vty
, " Thread Poll Timer %s\n",
5106 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
5109 json_object_object_add(json
, "noNbrId", json_sub
);
5112 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
5113 struct ospf_interface
*oi
,
5114 struct ospf_neighbor
*nbr
,
5115 struct ospf_neighbor
*prev_nbr
,
5116 json_object
*json
, bool use_json
)
5118 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5119 json_object
*json_neigh
= NULL
, *json_neigh_array
= NULL
;
5120 char neigh_str
[INET_ADDRSTRLEN
] = {0};
5121 char neigh_state
[16] = {0};
5125 !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
5126 json_neigh_array
= NULL
;
5129 if (nbr
->state
== NSM_Attempt
5130 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5131 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
5133 inet_ntop(AF_INET
, &nbr
->router_id
,
5134 neigh_str
, sizeof(neigh_str
));
5136 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
5138 if (!json_neigh_array
) {
5139 json_neigh_array
= json_object_new_array();
5140 json_object_object_add(json
, neigh_str
,
5144 json_neigh
= json_object_new_object();
5147 /* Show neighbor ID. */
5148 if (nbr
->state
== NSM_Attempt
5149 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5150 vty_out(vty
, " Neighbor %s,", "-");
5152 vty_out(vty
, " Neighbor %pI4,",
5156 /* Show interface address. */
5158 json_object_string_addf(json_neigh
, "ifaceAddress", "%pI4",
5159 &nbr
->address
.u
.prefix4
);
5161 vty_out(vty
, " interface address %pI4\n",
5162 &nbr
->address
.u
.prefix4
);
5166 json_object_string_add(json_neigh
, "areaId",
5167 ospf_area_desc_string(oi
->area
));
5168 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
5170 vty_out(vty
, " In the area %s via interface %s\n",
5171 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
5173 /* Show neighbor priority and state. */
5174 ospf_nbr_ism_state_message(nbr
, neigh_state
, sizeof(neigh_state
));
5176 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
5177 json_object_string_add(json_neigh
, "nbrState", neigh_state
);
5179 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5180 nbr
->priority
, neigh_state
);
5182 /* Show state changes. */
5184 json_object_int_add(json_neigh
, "stateChangeCounter",
5187 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
5189 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
5194 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
5196 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
5200 " Most recent state change statistics:\n");
5201 vty_out(vty
, " Progressive change %s ago\n",
5202 ospf_timeval_dump(&res
, timebuf
,
5207 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
5212 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
5214 json_object_int_add(json_neigh
,
5215 "lastRegressiveChangeMsec",
5217 if (nbr
->last_regress_str
)
5218 json_object_string_add(
5220 "lastRegressiveChangeReason",
5221 nbr
->last_regress_str
);
5224 " Regressive change %s ago, due to %s\n",
5225 ospf_timeval_dump(&res
, timebuf
,
5227 (nbr
->last_regress_str
? nbr
->last_regress_str
5232 /* Show Designated Rotuer ID. */
5234 json_object_string_addf(json_neigh
, "routerDesignatedId",
5235 "%pI4", &nbr
->d_router
);
5237 vty_out(vty
, " DR is %pI4,", &nbr
->d_router
);
5239 /* Show Backup Designated Rotuer ID. */
5241 json_object_string_addf(json_neigh
, "routerDesignatedBackupId",
5242 "%pI4", &nbr
->bd_router
);
5244 vty_out(vty
, " BDR is %pI4\n", &nbr
->bd_router
);
5248 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5249 json_object_string_add(json_neigh
, "optionsList",
5250 ospf_options_dump(nbr
->options
));
5252 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5253 ospf_options_dump(nbr
->options
));
5255 /* Show Router Dead interval timer. */
5257 if (nbr
->t_inactivity
) {
5259 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5262 json_object_int_add(json_neigh
,
5263 "routerDeadIntervalTimerDueMsec",
5266 json_object_int_add(
5268 "routerDeadIntervalTimerDueMsec", -1);
5270 vty_out(vty
, " Dead timer due in %s\n",
5271 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5274 /* Show Database Summary list. */
5276 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5277 ospf_db_summary_count(nbr
));
5279 vty_out(vty
, " Database Summary List %d\n",
5280 ospf_db_summary_count(nbr
));
5282 /* Show Link State Request list. */
5284 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5285 ospf_ls_request_count(nbr
));
5287 vty_out(vty
, " Link State Request List %ld\n",
5288 ospf_ls_request_count(nbr
));
5290 /* Show Link State Retransmission list. */
5292 json_object_int_add(json_neigh
,
5293 "linkStateRetransmissionListCounter",
5294 ospf_ls_retransmit_count(nbr
));
5296 vty_out(vty
, " Link State Retransmission List %ld\n",
5297 ospf_ls_retransmit_count(nbr
));
5299 /* Show inactivity timer thread. */
5301 if (nbr
->t_inactivity
!= NULL
)
5302 json_object_string_add(json_neigh
,
5303 "threadInactivityTimer", "on");
5305 vty_out(vty
, " Thread Inactivity Timer %s\n",
5306 nbr
->t_inactivity
!= NULL
? "on" : "off");
5308 /* Show Database Description retransmission thread. */
5310 if (nbr
->t_db_desc
!= NULL
)
5311 json_object_string_add(
5313 "threadDatabaseDescriptionRetransmission",
5317 " Thread Database Description Retransmision %s\n",
5318 nbr
->t_db_desc
!= NULL
? "on" : "off");
5320 /* Show Link State Request Retransmission thread. */
5322 if (nbr
->t_ls_req
!= NULL
)
5323 json_object_string_add(
5325 "threadLinkStateRequestRetransmission", "on");
5328 " Thread Link State Request Retransmission %s\n",
5329 nbr
->t_ls_req
!= NULL
? "on" : "off");
5331 /* Show Link State Update Retransmission thread. */
5333 if (nbr
->t_ls_upd
!= NULL
)
5334 json_object_string_add(
5336 "threadLinkStateUpdateRetransmission",
5340 " Thread Link State Update Retransmission %s\n\n",
5341 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5344 vty_out(vty
, " Graceful restart Helper info:\n");
5346 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5348 " Graceful Restart HELPER Status : Inprogress.\n");
5351 " Graceful Restart grace period time: %d (seconds).\n",
5352 nbr
->gr_helper_info
.recvd_grace_period
);
5353 vty_out(vty
, " Graceful Restart reason: %s.\n",
5354 ospf_restart_reason2str(
5355 nbr
->gr_helper_info
.gr_restart_reason
));
5358 " Graceful Restart HELPER Status : None\n");
5361 if (nbr
->gr_helper_info
.rejected_reason
5362 != OSPF_HELPER_REJECTED_NONE
)
5363 vty_out(vty
, " Helper rejected reason: %s.\n",
5364 ospf_rejected_reason2str(
5365 nbr
->gr_helper_info
.rejected_reason
));
5367 if (nbr
->gr_helper_info
.helper_exit_reason
5368 != OSPF_GR_HELPER_EXIT_NONE
)
5369 vty_out(vty
, " Last helper exit reason: %s.\n\n",
5370 ospf_exit_reason2str(
5371 nbr
->gr_helper_info
.helper_exit_reason
));
5375 json_object_string_add(json_neigh
, "grHelperStatus",
5376 OSPF_GR_IS_ACTIVE_HELPER(nbr
) ?
5379 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5380 json_object_int_add(
5381 json_neigh
, "graceInterval",
5382 nbr
->gr_helper_info
.recvd_grace_period
);
5383 json_object_string_add(
5384 json_neigh
, "grRestartReason",
5385 ospf_restart_reason2str(
5386 nbr
->gr_helper_info
.gr_restart_reason
));
5389 if (nbr
->gr_helper_info
.rejected_reason
5390 != OSPF_HELPER_REJECTED_NONE
)
5391 json_object_string_add(
5392 json_neigh
, "helperRejectReason",
5393 ospf_rejected_reason2str(
5394 nbr
->gr_helper_info
.rejected_reason
));
5396 if (nbr
->gr_helper_info
.helper_exit_reason
5397 != OSPF_GR_HELPER_EXIT_NONE
)
5398 json_object_string_add(
5399 json_neigh
, "helperExitReason",
5400 ospf_exit_reason2str(
5402 .helper_exit_reason
));
5405 bfd_sess_show(vty
, json_neigh
, nbr
->bfd_session
);
5408 json_object_array_add(json_neigh_array
, json_neigh
);
5412 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5413 struct in_addr
*router_id
,
5414 bool use_json
, uint8_t use_vrf
)
5416 struct listnode
*node
;
5417 struct ospf_neighbor
*nbr
;
5418 struct ospf_interface
*oi
;
5419 json_object
*json
= NULL
;
5422 json
= json_object_new_object();
5424 if (ospf
->instance
) {
5426 json_object_int_add(json
, "ospfInstance",
5429 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5432 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5434 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5435 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
))) {
5436 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5442 vty_json(vty
, json
);
5449 DEFPY (show_ip_ospf_neighbor_id
,
5450 show_ip_ospf_neighbor_id_cmd
,
5451 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
5454 "OSPF information\n"
5460 struct listnode
*node
;
5461 int ret
= CMD_SUCCESS
;
5463 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5464 if (!ospf
->oi_running
)
5466 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5473 DEFPY (show_ip_ospf_instance_neighbor_id
,
5474 show_ip_ospf_instance_neighbor_id_cmd
,
5475 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
5478 "OSPF information\n"
5486 if (instance
!= ospf_instance
)
5487 return CMD_NOT_MY_INSTANCE
;
5489 ospf
= ospf_lookup_instance(instance
);
5490 if (!ospf
|| !ospf
->oi_running
)
5493 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
,
5497 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5499 json_object
*json
, bool use_json
,
5502 struct ospf_interface
*oi
;
5503 struct listnode
*node
;
5504 json_object
*json_vrf
= NULL
;
5505 json_object
*json_nbr_sub
= NULL
;
5509 json_vrf
= json_object_new_object();
5513 json_nbr_sub
= json_object_new_object();
5516 if (ospf
->instance
) {
5518 json_object_int_add(json
, "ospfInstance",
5521 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5524 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5526 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5527 struct route_node
*rn
;
5528 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5530 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5531 if ((nbr
= rn
->info
)) {
5532 if (nbr
!= oi
->nbr_self
) {
5533 if (nbr
->state
!= NSM_Down
) {
5534 show_ip_ospf_neighbor_detail_sub(
5535 vty
, oi
, nbr
, prev_nbr
,
5536 json_nbr_sub
, use_json
);
5545 json_object_object_add(json_vrf
, "neighbors",
5548 json_object_object_add(json
, ospf_get_name(ospf
),
5556 DEFUN (show_ip_ospf_neighbor_detail
,
5557 show_ip_ospf_neighbor_detail_cmd
,
5558 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5561 "OSPF information\n"
5565 "detail of all neighbors\n"
5569 bool uj
= use_json(argc
, argv
);
5570 struct listnode
*node
= NULL
;
5571 char *vrf_name
= NULL
;
5572 bool all_vrf
= false;
5573 int ret
= CMD_SUCCESS
;
5576 uint8_t use_vrf
= 0;
5577 json_object
*json
= NULL
;
5579 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5582 json
= json_object_new_object();
5584 /* vrf input is provided could be all or specific vrf*/
5588 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5589 if (!ospf
->oi_running
)
5591 ret
= show_ip_ospf_neighbor_detail_common(
5592 vty
, ospf
, json
, uj
, use_vrf
);
5595 vty_json(vty
, json
);
5599 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5600 if (ospf
== NULL
|| !ospf
->oi_running
) {
5602 json_object_free(json
);
5606 /* Display default ospf (instance 0) info */
5607 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5608 if (ospf
== NULL
|| !ospf
->oi_running
) {
5610 json_object_free(json
);
5616 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5619 vty_out(vty
, "%s\n",
5620 json_object_to_json_string_ext(
5621 json
, JSON_C_TO_STRING_PRETTY
));
5626 json_object_free(json
);
5631 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5632 show_ip_ospf_instance_neighbor_detail_cmd
,
5633 "show ip ospf (1-65535) neighbor detail [json]",
5636 "OSPF information\n"
5639 "detail of all neighbors\n"
5644 unsigned short instance
= 0;
5645 bool uj
= use_json(argc
, argv
);
5646 json_object
*json
= NULL
;
5647 int ret
= CMD_SUCCESS
;
5649 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5650 if (instance
!= ospf_instance
)
5651 return CMD_NOT_MY_INSTANCE
;
5653 ospf
= ospf_lookup_instance(instance
);
5654 if (!ospf
|| !ospf
->oi_running
)
5658 json
= json_object_new_object();
5660 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5663 vty_json(vty
, json
);
5668 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5674 struct listnode
*node
;
5675 struct ospf_interface
*oi
;
5676 json_object
*json_vrf
= NULL
;
5680 json_vrf
= json_object_new_object();
5685 if (ospf
->instance
) {
5687 json_object_int_add(json
, "ospfInstance",
5690 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5693 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5695 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5696 struct route_node
*rn
;
5697 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5698 struct ospf_nbr_nbma
*nbr_nbma
;
5700 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5701 if ((nbr
= rn
->info
)) {
5702 if (nbr
!= oi
->nbr_self
)
5703 if (nbr
->state
!= NSM_Down
)
5704 show_ip_ospf_neighbor_detail_sub(
5707 json_vrf
, use_json
);
5712 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5713 struct listnode
*nd
;
5715 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5716 if (nbr_nbma
->nbr
== NULL
5717 || nbr_nbma
->nbr
->state
== NSM_Down
)
5718 show_ip_ospf_nbr_nbma_detail_sub(
5719 vty
, oi
, nbr_nbma
, use_json
,
5727 json_object_object_add(json
, ospf_get_name(ospf
),
5736 DEFUN (show_ip_ospf_neighbor_detail_all
,
5737 show_ip_ospf_neighbor_detail_all_cmd
,
5738 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5741 "OSPF information\n"
5745 "detail of all neighbors\n"
5746 "include down status neighbor\n"
5750 bool uj
= use_json(argc
, argv
);
5751 struct listnode
*node
= NULL
;
5752 char *vrf_name
= NULL
;
5753 bool all_vrf
= false;
5754 int ret
= CMD_SUCCESS
;
5757 uint8_t use_vrf
= 0;
5758 json_object
*json
= NULL
;
5760 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5763 json
= json_object_new_object();
5765 /* vrf input is provided could be all or specific vrf*/
5769 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5770 if (!ospf
->oi_running
)
5772 ret
= show_ip_ospf_neighbor_detail_all_common(
5773 vty
, ospf
, json
, uj
, use_vrf
);
5777 vty_json(vty
, json
);
5781 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5782 if (ospf
== NULL
|| !ospf
->oi_running
) {
5784 json_object_free(json
);
5788 /* Display default ospf (instance 0) info */
5789 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5790 if (ospf
== NULL
|| !ospf
->oi_running
) {
5792 json_object_free(json
);
5798 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5801 vty_out(vty
, "%s\n",
5802 json_object_to_json_string_ext(
5803 json
, JSON_C_TO_STRING_PRETTY
));
5808 json_object_free(json
);
5813 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5814 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5815 "show ip ospf (1-65535) neighbor detail all [json]",
5818 "OSPF information\n"
5821 "detail of all neighbors\n"
5822 "include down status neighbor\n"
5827 unsigned short instance
= 0;
5828 bool uj
= use_json(argc
, argv
);
5829 json_object
*json
= NULL
;
5830 int ret
= CMD_SUCCESS
;
5832 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5833 if (instance
!= ospf_instance
)
5834 return CMD_NOT_MY_INSTANCE
;
5836 ospf
= ospf_lookup_instance(instance
);
5837 if (!ospf
|| !ospf
->oi_running
)
5841 json
= json_object_new_object();
5843 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5846 vty_json(vty
, json
);
5851 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5854 struct cmd_token
**argv
,
5857 struct ospf_interface
*oi
;
5858 struct interface
*ifp
;
5859 struct route_node
*rn
, *nrn
;
5860 struct ospf_neighbor
*nbr
;
5861 json_object
*json
= NULL
;
5864 json
= json_object_new_object();
5866 if (ospf
->instance
) {
5868 json_object_int_add(json
, "ospfInstance",
5871 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5874 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5877 vty_out(vty
, "No such interface.\n");
5879 vty_out(vty
, "{}\n");
5880 json_object_free(json
);
5885 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5886 if ((oi
= rn
->info
)) {
5887 for (nrn
= route_top(oi
->nbrs
); nrn
;
5888 nrn
= route_next(nrn
)) {
5889 if ((nbr
= nrn
->info
)) {
5890 if (nbr
!= oi
->nbr_self
) {
5891 if (nbr
->state
!= NSM_Down
)
5892 show_ip_ospf_neighbor_detail_sub(
5903 vty_json(vty
, json
);
5910 DEFUN (show_ip_ospf_neighbor_int_detail
,
5911 show_ip_ospf_neighbor_int_detail_cmd
,
5912 "show ip ospf neighbor IFNAME detail [json]",
5915 "OSPF information\n"
5918 "detail of all neighbors\n"
5922 bool uj
= use_json(argc
, argv
);
5923 struct listnode
*node
= NULL
;
5924 int ret
= CMD_SUCCESS
;
5925 bool ospf_output
= false;
5927 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5928 if (!ospf
->oi_running
)
5931 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5936 vty_out(vty
, "%% OSPF instance not found\n");
5941 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5942 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5943 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5946 "OSPF information\n"
5950 "detail of all neighbors\n"
5956 unsigned short instance
= 0;
5957 bool uj
= use_json(argc
, argv
);
5959 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5960 if (instance
!= ospf_instance
)
5961 return CMD_NOT_MY_INSTANCE
;
5963 ospf
= ospf_lookup_instance(instance
);
5964 if (!ospf
|| !ospf
->oi_running
)
5967 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5971 /* Show functions */
5972 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
,
5973 json_object
*json_lsa
)
5975 struct router_lsa
*rl
;
5976 struct summary_lsa
*sl
;
5977 struct as_external_lsa
*asel
;
5978 struct prefix_ipv4 p
;
5981 /* If self option is set, check LSA self flag. */
5982 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5985 /* LSA common part show. */
5986 vty_out(vty
, "%-15pI4",
5988 vty_out(vty
, "%-15pI4 %4d 0x%08lx 0x%04x",
5989 &lsa
->data
->adv_router
, LS_AGE(lsa
),
5990 (unsigned long)ntohl(
5991 lsa
->data
->ls_seqnum
),
5992 ntohs(lsa
->data
->checksum
));
5997 snprintf(seqnum
, sizeof(seqnum
), "%x",
5998 ntohl(lsa
->data
->ls_seqnum
));
5999 snprintf(checksum
, sizeof(checksum
), "%x",
6000 ntohs(lsa
->data
->checksum
));
6001 json_object_string_addf(json_lsa
, "lsId",
6002 "%pI4", &lsa
->data
->id
);
6003 json_object_string_addf(
6004 json_lsa
, "advertisedRouter", "%pI4",
6005 &lsa
->data
->adv_router
);
6006 json_object_int_add(json_lsa
, "lsaAge",
6008 json_object_string_add(
6009 json_lsa
, "sequenceNumber", seqnum
);
6010 json_object_string_add(json_lsa
, "checksum",
6014 /* LSA specific part show. */
6015 switch (lsa
->data
->type
) {
6016 case OSPF_ROUTER_LSA
:
6017 rl
= (struct router_lsa
*)lsa
->data
;
6020 vty_out(vty
, " %-d", ntohs(rl
->links
));
6022 json_object_int_add(json_lsa
,
6026 case OSPF_SUMMARY_LSA
:
6027 sl
= (struct summary_lsa
*)lsa
->data
;
6030 p
.prefix
= sl
->header
.id
;
6031 p
.prefixlen
= ip_masklen(sl
->mask
);
6032 apply_mask_ipv4(&p
);
6035 vty_out(vty
, " %pFX", &p
);
6037 json_object_string_addf(
6038 json_lsa
, "summaryAddress",
6042 case OSPF_AS_EXTERNAL_LSA
:
6043 case OSPF_AS_NSSA_LSA
:
6044 asel
= (struct as_external_lsa
*)lsa
->data
;
6047 p
.prefix
= asel
->header
.id
;
6048 p
.prefixlen
= ip_masklen(asel
->mask
);
6049 apply_mask_ipv4(&p
);
6052 vty_out(vty
, " %s %pFX [0x%lx]",
6058 (unsigned long)ntohl(
6059 asel
->e
[0].route_tag
));
6061 json_object_string_add(
6062 json_lsa
, "metricType",
6067 json_object_string_addf(
6068 json_lsa
, "route", "%pFX", &p
);
6069 json_object_int_add(
6071 (unsigned long)ntohl(
6072 asel
->e
[0].route_tag
));
6075 case OSPF_NETWORK_LSA
:
6076 case OSPF_ASBR_SUMMARY_LSA
:
6077 case OSPF_OPAQUE_LINK_LSA
:
6078 case OSPF_OPAQUE_AREA_LSA
:
6079 case OSPF_OPAQUE_AS_LSA
:
6094 static const char *const show_database_desc
[] = {
6096 "Router Link States",
6098 "Summary Link States",
6099 "ASBR-Summary Link States",
6100 "AS External Link States",
6101 "Group Membership LSA",
6102 "NSSA-external Link States",
6104 "Link-Local Opaque-LSA",
6105 "Area-Local Opaque-LSA",
6106 "AS-external Opaque-LSA",
6109 static const char * const show_database_desc_json
[] = {
6112 "networkLinkStates",
6113 "summaryLinkStates",
6114 "asbrSummaryLinkStates",
6115 "asExternalLinkStates",
6116 "groupMembershipLsa",
6117 "nssaExternalLinkStates",
6119 "linkLocalOpaqueLsa",
6120 "areaLocalOpaqueLsa",
6121 "asExternalOpaqueLsa",
6124 static const char *const show_database_desc_count_json
[] = {
6126 "routerLinkStatesCount",
6127 "networkLinkStatesCount",
6128 "summaryLinkStatesCount",
6129 "asbrSummaryLinkStatesCount",
6130 "asExternalLinkStatesCount",
6131 "groupMembershipLsaCount",
6132 "nssaExternalLinkStatesCount",
6134 "linkLocalOpaqueLsaCount",
6135 "areaLocalOpaqueLsaCount",
6136 "asExternalOpaqueLsaCount",
6139 static const char *const show_database_header
[] = {
6141 "Link ID ADV Router Age Seq# CkSum Link count",
6142 "Link ID ADV Router Age Seq# CkSum",
6143 "Link ID ADV Router Age Seq# CkSum Route",
6144 "Link ID ADV Router Age Seq# CkSum",
6145 "Link ID ADV Router Age Seq# CkSum Route",
6146 " --- header for Group Member ----",
6147 "Link ID ADV Router Age Seq# CkSum Route",
6149 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6150 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6151 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6154 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
,
6157 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
6160 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
6161 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
6162 ospf_options_dump(lsa
->data
->options
));
6163 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
6164 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6165 ? "(Translated from Type-7)"
6168 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6169 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
6172 vty_out(vty
, " :%s%s%s%s",
6173 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR"
6175 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR"
6177 IS_ROUTER_LSA_VIRTUAL(rlsa
)
6180 IS_ROUTER_LSA_SHORTCUT(rlsa
)
6186 vty_out(vty
, " LS Type: %s\n",
6187 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6188 vty_out(vty
, " Link State ID: %pI4 %s\n",
6190 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
,
6192 vty_out(vty
, " Advertising Router: %pI4\n",
6193 &lsa
->data
->adv_router
);
6194 vty_out(vty
, " LS Seq Number: %08lx\n",
6195 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
6196 vty_out(vty
, " Checksum: 0x%04x\n",
6197 ntohs(lsa
->data
->checksum
));
6198 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
6203 snprintf(seqnum
, 10, "%x", ntohl(lsa
->data
->ls_seqnum
));
6204 snprintf(checksum
, 10, "%x", ntohs(lsa
->data
->checksum
));
6206 json_object_int_add(json
, "lsaAge", LS_AGE(lsa
));
6207 json_object_string_add(json
, "options",
6208 ospf_options_dump(lsa
->data
->options
));
6209 json_object_int_add(json
, "lsaFlags", lsa
->flags
);
6211 if (lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6212 json_object_boolean_true_add(json
,
6213 "translatedFromType7");
6215 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6216 json_object_int_add(json
, "flags", rlsa
->flags
);
6219 if (IS_ROUTER_LSA_BORDER(rlsa
))
6220 json_object_boolean_true_add(json
,
6222 if (IS_ROUTER_LSA_EXTERNAL(rlsa
))
6223 json_object_boolean_true_add(json
,
6225 if (IS_ROUTER_LSA_VIRTUAL(rlsa
))
6226 json_object_boolean_true_add(
6227 json
, "vlEndpoint");
6228 if (IS_ROUTER_LSA_SHORTCUT(rlsa
))
6229 json_object_boolean_true_add(
6234 json_object_string_add(
6236 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6237 json_object_string_addf(json
, "linkStateId", "%pI4",
6239 json_object_string_addf(json
, "advertisingRouter", "%pI4",
6240 &lsa
->data
->adv_router
);
6241 json_object_string_add(json
, "lsaSeqNumber", seqnum
);
6242 json_object_string_add(json
, "checksum", checksum
);
6243 json_object_int_add(json
, "length", ntohs(lsa
->data
->length
));
6247 static const char *const link_type_desc
[] = {
6249 "another Router (point-to-point)",
6250 "a Transit Network",
6255 static const char *const link_id_desc
[] = {
6256 "(null)", "Neighboring Router ID", "Designated Router address",
6257 "Net", "Neighboring Router ID",
6260 static const char *const link_data_desc
[] = {
6261 "(null)", "Router Interface address", "Router Interface address",
6262 "Network Mask", "Router Interface address",
6265 static const char *const link_id_desc_json
[] = {
6266 "null", "neighborRouterId", "designatedRouterAddress",
6267 "networkAddress", "neighborRouterId",
6270 static const char *const link_data_desc_json
[] = {
6271 "null", "routerInterfaceAddress", "routerInterfaceAddress",
6272 "networkMask", "routerInterfaceAddress",
6275 /* Show router-LSA each Link information. */
6276 static void show_ip_ospf_database_router_links(struct vty
*vty
,
6277 struct router_lsa
*rl
,
6282 json_object
*json_links
= NULL
;
6283 json_object
*json_link
= NULL
;
6285 char buf
[PREFIX_STRLEN
];
6288 json_links
= json_object_new_object();
6290 len
= ntohs(rl
->header
.length
) - 4;
6291 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
6292 type
= rl
->link
[i
].type
;
6297 snprintf(link
, sizeof(link
), "link%u", i
);
6298 json_link
= json_object_new_object();
6299 json_object_string_add(json_link
, "linkType",
6300 link_type_desc
[type
]);
6301 json_object_string_add(json_link
,
6302 link_id_desc_json
[type
],
6304 &rl
->link
[i
].link_id
,
6306 json_object_string_add(
6307 json_link
, link_data_desc_json
[type
],
6308 inet_ntop(AF_INET
, &rl
->link
[i
].link_data
,
6310 json_object_int_add(json_link
, "numOfTosMetrics",
6312 json_object_int_add(json_link
, "tos0Metric",
6313 ntohs(rl
->link
[i
].metric
));
6314 json_object_object_add(json_links
, link
, json_link
);
6316 vty_out(vty
, " Link connected to: %s\n",
6317 link_type_desc
[type
]);
6318 vty_out(vty
, " (Link ID) %s: %pI4\n",
6320 &rl
->link
[i
].link_id
);
6321 vty_out(vty
, " (Link Data) %s: %pI4\n",
6322 link_data_desc
[type
],
6323 &rl
->link
[i
].link_data
);
6324 vty_out(vty
, " Number of TOS metrics: 0\n");
6325 vty_out(vty
, " TOS 0 Metric: %d\n",
6326 ntohs(rl
->link
[i
].metric
));
6331 json_object_object_add(json
, "routerLinks", json_links
);
6334 /* Show router-LSA detail information. */
6335 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6339 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
6341 show_ip_ospf_database_header(vty
, lsa
, json
);
6344 vty_out(vty
, " Number of Links: %d\n\n",
6347 json_object_int_add(json
, "numOfLinks",
6350 show_ip_ospf_database_router_links(vty
, rl
, json
);
6359 /* Show network-LSA detail information. */
6360 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6364 char buf
[PREFIX_STRLEN
];
6365 json_object
*json_attached_rt
= NULL
;
6366 json_object
*json_router
= NULL
;
6369 json_attached_rt
= json_object_new_object();
6372 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
6373 struct in_addr
*addr
;
6375 show_ip_ospf_database_header(vty
, lsa
, json
);
6378 vty_out(vty
, " Network Mask: /%d\n",
6379 ip_masklen(nl
->mask
));
6381 json_object_int_add(json
, "networkMask",
6382 ip_masklen(nl
->mask
));
6384 length
= lsa
->size
- OSPF_LSA_HEADER_SIZE
- 4;
6385 addr
= &nl
->routers
[0];
6386 for (i
= 0; length
> 0 && addr
;
6387 length
-= 4, addr
= &nl
->routers
[++i
])
6389 vty_out(vty
, " Attached Router: %pI4\n",
6393 json_router
= json_object_new_object();
6394 json_object_string_add(
6395 json_router
, "attachedRouterId",
6396 inet_ntop(AF_INET
, addr
, buf
,
6398 json_object_object_add(json_attached_rt
,
6399 inet_ntop(AF_INET
, addr
,
6407 json_object_object_add(json
, "attchedRouters",
6413 /* Show summary-LSA detail information. */
6414 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6418 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6420 show_ip_ospf_database_header(vty
, lsa
, json
);
6423 vty_out(vty
, " Network Mask: /%d\n",
6424 ip_masklen(sl
->mask
));
6425 vty_out(vty
, " TOS: 0 Metric: %d\n",
6426 GET_METRIC(sl
->metric
));
6429 json_object_int_add(json
, "networkMask",
6430 ip_masklen(sl
->mask
));
6431 json_object_int_add(json
, "tos0Metric",
6432 GET_METRIC(sl
->metric
));
6439 /* Show summary-ASBR-LSA detail information. */
6440 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6444 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6446 show_ip_ospf_database_header(vty
, lsa
, json
);
6449 vty_out(vty
, " Network Mask: /%d\n",
6450 ip_masklen(sl
->mask
));
6451 vty_out(vty
, " TOS: 0 Metric: %d\n",
6452 GET_METRIC(sl
->metric
));
6455 json_object_int_add(json
, "networkMask",
6456 ip_masklen(sl
->mask
));
6457 json_object_int_add(json
, "tos0Metric",
6458 GET_METRIC(sl
->metric
));
6465 /* Show AS-external-LSA detail information. */
6466 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6472 struct as_external_lsa
*al
=
6473 (struct as_external_lsa
*)lsa
->data
;
6475 show_ip_ospf_database_header(vty
, lsa
, json
);
6478 vty_out(vty
, " Network Mask: /%d\n",
6479 ip_masklen(al
->mask
));
6480 vty_out(vty
, " Metric Type: %s\n",
6481 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6482 ? "2 (Larger than any link state path)"
6484 vty_out(vty
, " TOS: 0\n");
6485 vty_out(vty
, " Metric: %d\n",
6486 GET_METRIC(al
->e
[0].metric
));
6487 vty_out(vty
, " Forward Address: %pI4\n",
6488 &al
->e
[0].fwd_addr
);
6490 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6491 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6493 json_object_int_add(json
, "networkMask",
6494 ip_masklen(al
->mask
));
6495 json_object_string_add(
6497 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6498 ? "E2 (Larger than any link state path)"
6500 json_object_int_add(json
, "tos", tos
);
6501 json_object_int_add(json
, "metric",
6502 GET_METRIC(al
->e
[0].metric
));
6503 json_object_string_addf(json
, "forwardAddress", "%pI4",
6504 &(al
->e
[0].fwd_addr
));
6505 json_object_int_add(
6506 json
, "externalRouteTag",
6507 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6514 /* Show AS-NSSA-LSA detail information. */
6515 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6521 struct as_external_lsa
*al
=
6522 (struct as_external_lsa
*)lsa
->data
;
6524 show_ip_ospf_database_header(vty
, lsa
, json
);
6527 vty_out(vty
, " Network Mask: /%d\n",
6528 ip_masklen(al
->mask
));
6529 vty_out(vty
, " Metric Type: %s\n",
6530 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6531 ? "2 (Larger than any link state path)"
6533 vty_out(vty
, " TOS: 0\n");
6534 vty_out(vty
, " Metric: %d\n",
6535 GET_METRIC(al
->e
[0].metric
));
6536 vty_out(vty
, " NSSA: Forward Address: %pI4\n",
6537 &al
->e
[0].fwd_addr
);
6539 " External Route Tag: %" ROUTE_TAG_PRI
6541 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6543 json_object_int_add(json
, "networkMask",
6544 ip_masklen(al
->mask
));
6545 json_object_string_add(
6547 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6548 ? "E2 (Larger than any link state path)"
6550 json_object_int_add(json
, "tos", tos
);
6551 json_object_int_add(json
, "metric",
6552 GET_METRIC(al
->e
[0].metric
));
6553 json_object_string_addf(json
, "nssaForwardAddress",
6554 "%pI4", &al
->e
[0].fwd_addr
);
6555 json_object_int_add(
6556 json
, "externalRouteTag",
6557 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6564 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
,
6570 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6574 show_ip_ospf_database_header(vty
, lsa
, json
);
6575 show_opaque_info_detail(vty
, lsa
, json
);
6582 int (*show_function
[])(struct vty
*, struct ospf_lsa
*, json_object
*) = {
6584 show_router_lsa_detail
,
6585 show_network_lsa_detail
,
6586 show_summary_lsa_detail
,
6587 show_summary_asbr_lsa_detail
,
6588 show_as_external_lsa_detail
,
6590 show_as_nssa_lsa_detail
, /* almost same as external */
6592 show_opaque_lsa_detail
,
6593 show_opaque_lsa_detail
,
6594 show_opaque_lsa_detail
,
6597 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6598 struct in_addr
*id
, struct in_addr
*adv_router
)
6600 memset(lp
, 0, sizeof(struct prefix_ls
));
6601 lp
->family
= AF_UNSPEC
;
6604 else if (adv_router
== NULL
) {
6605 lp
->prefixlen
= IPV4_MAX_BITLEN
;
6610 lp
->adv_router
= *adv_router
;
6614 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6615 struct in_addr
*id
, struct in_addr
*adv_router
,
6618 struct prefix_ls lp
;
6619 struct route_node
*rn
, *start
;
6620 struct ospf_lsa
*lsa
;
6621 json_object
*json_lsa
= NULL
;
6623 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6624 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6626 route_lock_node(start
);
6627 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6628 if ((lsa
= rn
->info
)) {
6630 json_lsa
= json_object_new_object();
6631 json_object_array_add(json
, json_lsa
);
6634 if (show_function
[lsa
->data
->type
] != NULL
)
6635 show_function
[lsa
->data
->type
](
6636 vty
, lsa
, json_lsa
);
6638 route_unlock_node(start
);
6642 /* Show detail LSA information
6643 -- if id is NULL then show all LSAs. */
6644 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6645 struct in_addr
*id
, struct in_addr
*adv_router
,
6648 struct listnode
*node
;
6649 struct ospf_area
*area
;
6650 char buf
[PREFIX_STRLEN
];
6651 json_object
*json_lsa_type
= NULL
;
6652 json_object
*json_areas
= NULL
;
6653 json_object
*json_lsa_array
= NULL
;
6656 json_lsa_type
= json_object_new_object();
6659 case OSPF_AS_EXTERNAL_LSA
:
6660 case OSPF_OPAQUE_AS_LSA
:
6662 vty_out(vty
, " %s \n\n",
6663 show_database_desc
[type
]);
6665 json_lsa_array
= json_object_new_array();
6667 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
,
6670 json_object_object_add(json
,
6671 show_database_desc_json
[type
],
6677 json_areas
= json_object_new_object();
6679 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6682 "\n %s (Area %s)\n\n",
6683 show_database_desc
[type
],
6684 ospf_area_desc_string(area
));
6686 json_lsa_array
= json_object_new_array();
6687 json_object_object_add(json_areas
,
6695 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6696 adv_router
, json_lsa_array
);
6700 json_object_object_add(json_lsa_type
, "areas",
6702 json_object_object_add(json
,
6703 show_database_desc_json
[type
],
6710 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6711 struct route_table
*rt
,
6712 struct in_addr
*adv_router
,
6715 char buf
[PREFIX_STRLEN
];
6716 struct route_node
*rn
;
6717 struct ospf_lsa
*lsa
;
6719 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6720 if ((lsa
= rn
->info
)) {
6721 json_object
*json_lsa
= NULL
;
6723 if (IPV4_ADDR_SAME(adv_router
,
6724 &lsa
->data
->adv_router
)) {
6725 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6728 json_lsa
= json_object_new_object();
6730 if (show_function
[lsa
->data
->type
] != NULL
)
6731 show_function
[lsa
->data
->type
](
6732 vty
, lsa
, json_lsa
);
6734 json_object_object_add(
6744 /* Show detail LSA information. */
6745 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6746 int type
, struct in_addr
*adv_router
,
6749 struct listnode
*node
;
6750 struct ospf_area
*area
;
6751 char buf
[PREFIX_STRLEN
];
6752 json_object
*json_lstype
= NULL
;
6753 json_object
*json_area
= NULL
;
6756 json_lstype
= json_object_new_object();
6759 case OSPF_AS_EXTERNAL_LSA
:
6760 case OSPF_OPAQUE_AS_LSA
:
6762 vty_out(vty
, " %s \n\n",
6763 show_database_desc
[type
]);
6765 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6766 adv_router
, json_lstype
);
6770 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6772 json_area
= json_object_new_object();
6775 "\n %s (Area %s)\n\n",
6776 show_database_desc
[type
],
6777 ospf_area_desc_string(area
));
6778 show_lsa_detail_adv_router_proc(vty
,
6779 AREA_LSDB(area
, type
),
6780 adv_router
, json_area
);
6783 json_object_object_add(json_lstype
,
6794 json_object_object_add(json
, show_database_desc
[type
],
6798 void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
, int self
,
6801 struct ospf_lsa
*lsa
;
6802 struct route_node
*rn
;
6803 struct ospf_area
*area
;
6804 struct listnode
*node
;
6805 char buf
[PREFIX_STRLEN
];
6806 json_object
*json_areas
= NULL
;
6807 json_object
*json_area
= NULL
;
6808 json_object
*json_lsa
= NULL
;
6810 json_object
*json_lsa_array
= NULL
;
6814 json_areas
= json_object_new_object();
6816 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6818 json_area
= json_object_new_object();
6820 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6823 case OSPF_AS_EXTERNAL_LSA
:
6824 case OSPF_OPAQUE_AS_LSA
:
6829 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6831 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6835 " %s (Area %s)\n\n",
6836 show_database_desc
[type
],
6837 ospf_area_desc_string(area
));
6838 vty_out(vty
, "%s\n",
6839 show_database_header
[type
]);
6842 json_object_new_array();
6843 json_object_object_add(
6845 show_database_desc_json
[type
],
6849 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
) {
6852 json_object_new_object();
6853 json_object_array_add(
6858 count
+= show_lsa_summary(
6859 vty
, lsa
, self
, json_lsa
);
6865 json_object_int_add(
6868 show_database_desc_count_json
6874 json_object_object_add(json_areas
,
6882 json_object_object_add(json
, "areas", json_areas
);
6884 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6887 case OSPF_AS_EXTERNAL_LSA
:
6888 case OSPF_OPAQUE_AS_LSA
:
6893 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6894 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6896 vty_out(vty
, " %s\n\n",
6897 show_database_desc
[type
]);
6898 vty_out(vty
, "%s\n",
6899 show_database_header
[type
]);
6901 json_lsa_array
= json_object_new_array();
6902 json_object_object_add(
6903 json
, show_database_desc_json
[type
],
6907 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
) {
6909 json_lsa
= json_object_new_object();
6910 json_object_array_add(json_lsa_array
,
6914 count
+= show_lsa_summary(vty
, lsa
, self
,
6921 json_object_int_add(
6923 show_database_desc_count_json
[type
],
6932 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
,
6935 struct route_node
*rn
;
6936 char buf
[PREFIX_STRLEN
];
6937 json_object
*json_maxage
= NULL
;
6940 vty_out(vty
, "\n MaxAge Link States:\n\n");
6942 json_maxage
= json_object_new_object();
6944 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6945 struct ospf_lsa
*lsa
;
6946 json_object
*json_lsa
= NULL
;
6948 if ((lsa
= rn
->info
) != NULL
) {
6950 vty_out(vty
, "Link type: %d\n",
6952 vty_out(vty
, "Link State ID: %pI4\n",
6954 vty_out(vty
, "Advertising Router: %pI4\n",
6955 &lsa
->data
->adv_router
);
6956 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6959 json_lsa
= json_object_new_object();
6960 json_object_int_add(json_lsa
, "linkType",
6962 json_object_string_addf(json_lsa
, "linkStateId",
6963 "%pI4", &lsa
->data
->id
);
6964 json_object_string_addf(
6965 json_lsa
, "advertisingRouter", "%pI4",
6966 &lsa
->data
->adv_router
);
6967 json_object_int_add(json_lsa
, "lsaLockCount",
6969 json_object_object_add(
6979 json_object_object_add(json
, "maxAgeLinkStates", json_maxage
);
6982 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6983 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6985 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6986 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6987 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6988 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6990 #define OSPF_LSA_TYPES_DESC \
6991 "ASBR summary link states\n" \
6992 "External link states\n" \
6993 "Network link states\n" \
6994 "Router link states\n" \
6995 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6996 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6997 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6999 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
7000 int arg_base
, int argc
,
7001 struct cmd_token
**argv
,
7002 uint8_t use_vrf
, json_object
*json
,
7007 struct in_addr id
, adv_router
;
7008 json_object
*json_vrf
= NULL
;
7012 json_vrf
= json_object_new_object();
7017 if (ospf
->instance
) {
7019 json_object_int_add(json_vrf
, "ospfInstance",
7022 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7025 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7027 /* Show Router ID. */
7029 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7032 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7037 if ((argc
== arg_base
+ 4) || (uj
&& (argc
== arg_base
+ 5))) {
7038 show_ip_ospf_database_summary(vty
, ospf
, 0, json_vrf
);
7041 json_object_object_add(
7042 json
, ospf_get_name(ospf
), json_vrf
);
7047 /* Set database type to show. */
7048 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7049 type
= OSPF_ROUTER_LSA
;
7050 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7051 type
= OSPF_NETWORK_LSA
;
7052 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7053 type
= OSPF_AS_NSSA_LSA
;
7054 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
7055 type
= OSPF_SUMMARY_LSA
;
7056 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7057 type
= OSPF_ASBR_SUMMARY_LSA
;
7058 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7059 type
= OSPF_AS_EXTERNAL_LSA
;
7060 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
7061 show_ip_ospf_database_summary(vty
, ospf
, 1, json_vrf
);
7064 json_object_object_add(
7065 json
, ospf_get_name(ospf
), json_vrf
);
7068 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
7069 show_ip_ospf_database_maxage(vty
, ospf
, json_vrf
);
7072 json_object_object_add(
7073 json
, ospf_get_name(ospf
), json_vrf
);
7076 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7077 type
= OSPF_OPAQUE_LINK_LSA
;
7078 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7079 type
= OSPF_OPAQUE_AREA_LSA
;
7080 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7081 type
= OSPF_OPAQUE_AS_LSA
;
7085 /* `show ip ospf database LSA'. */
7086 if ((argc
== arg_base
+ 5) || (uj
&& (argc
== arg_base
+ 6)))
7087 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
, json_vrf
);
7088 else if (argc
>= arg_base
+ 6) {
7089 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
7093 /* `show ip ospf database LSA ID'. */
7094 if ((argc
== arg_base
+ 6) || (uj
&& (argc
== arg_base
+ 7)))
7095 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
, json_vrf
);
7096 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
7097 else if ((argc
== arg_base
+ 7)
7098 || (uj
&& (argc
== arg_base
+ 8))) {
7099 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
7100 adv_router
= ospf
->router_id
;
7102 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
7107 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
,
7114 json_object_object_add(json
, ospf_get_name(ospf
),
7121 DEFUN (show_ip_ospf_database_max
,
7122 show_ip_ospf_database_max_cmd
,
7123 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate> [json]",
7126 "OSPF information\n"
7129 "Database summary\n"
7130 "LSAs in MaxAge list\n"
7131 "Self-originated link states\n"
7134 struct ospf
*ospf
= NULL
;
7135 struct listnode
*node
= NULL
;
7136 char *vrf_name
= NULL
;
7137 bool all_vrf
= false;
7138 int ret
= CMD_SUCCESS
;
7141 uint8_t use_vrf
= 0;
7142 bool uj
= use_json(argc
, argv
);
7143 json_object
*json
= NULL
;
7146 json
= json_object_new_object();
7148 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7151 bool ospf_output
= false;
7156 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7157 if (!ospf
->oi_running
)
7160 ret
= show_ip_ospf_database_common(
7161 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
7166 vty_out(vty
, "%% OSPF is not enabled\n");
7168 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7169 if (ospf
== NULL
|| !ospf
->oi_running
) {
7171 "%% OSPF is not enabled in vrf %s\n",
7175 ret
= (show_ip_ospf_database_common(
7176 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
, use_vrf
,
7180 /* Display default ospf (instance 0) info */
7181 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7182 if (ospf
== NULL
|| !ospf
->oi_running
) {
7183 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
7187 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
7192 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7193 json_object_free(json
);
7199 ALIAS (show_ip_ospf_database_max
,
7200 show_ip_ospf_database_cmd
,
7201 "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]",
7204 "OSPF information\n"
7207 "Database summary\n"
7209 "Link State ID (as an IP address)\n"
7210 "Self-originated link states\n"
7211 "Advertising Router link states\n"
7212 "Advertising Router (as an IP address)\n"
7215 DEFUN (show_ip_ospf_instance_database_max
,
7216 show_ip_ospf_instance_database_max_cmd
,
7217 "show ip ospf (1-65535) database <max-age|self-originate> [json]",
7220 "OSPF information\n"
7222 "Database summary\n"
7223 "LSAs in MaxAge list\n"
7224 "Self-originated link states\n"
7229 unsigned short instance
= 0;
7230 bool uj
= use_json(argc
, argv
);
7231 json_object
*json
= NULL
;
7234 json
= json_object_new_object();
7236 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7237 if (instance
!= ospf_instance
)
7238 return CMD_NOT_MY_INSTANCE
;
7240 ospf
= ospf_lookup_instance(instance
);
7241 if (!ospf
|| !ospf
->oi_running
)
7244 show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0, json
, uj
);
7247 vty_json(vty
, json
);
7252 ALIAS (show_ip_ospf_instance_database_max
,
7253 show_ip_ospf_instance_database_cmd
,
7254 "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]",
7257 "OSPF information\n"
7259 "Database summary\n"
7261 "Link State ID (as an IP address)\n"
7262 "Self-originated link states\n"
7263 "Advertising Router link states\n"
7264 "Advertising Router (as an IP address)\n"
7267 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
7269 int arg_base
, int argc
,
7270 struct cmd_token
**argv
,
7277 struct in_addr adv_router
;
7278 json_object
*json_vrf
= NULL
;
7282 json_vrf
= json_object_new_object();
7287 if (ospf
->instance
) {
7289 json_object_int_add(json
, "ospfInstance",
7292 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7295 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7297 /* Show Router ID. */
7299 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7302 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7306 /* Set database type to show. */
7307 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7308 type
= OSPF_ROUTER_LSA
;
7309 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7310 type
= OSPF_NETWORK_LSA
;
7311 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7312 type
= OSPF_AS_NSSA_LSA
;
7313 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
7314 type
= OSPF_SUMMARY_LSA
;
7315 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7316 type
= OSPF_ASBR_SUMMARY_LSA
;
7317 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7318 type
= OSPF_AS_EXTERNAL_LSA
;
7319 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7320 type
= OSPF_OPAQUE_LINK_LSA
;
7321 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7322 type
= OSPF_OPAQUE_AREA_LSA
;
7323 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7324 type
= OSPF_OPAQUE_AS_LSA
;
7328 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
7329 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
7330 adv_router
= ospf
->router_id
;
7332 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
7337 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
, json_vrf
);
7341 json_object_object_add(json
, ospf_get_name(ospf
),
7348 DEFUN (show_ip_ospf_database_type_adv_router
,
7349 show_ip_ospf_database_type_adv_router_cmd
,
7350 "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]",
7353 "OSPF information\n"
7356 "Database summary\n"
7358 "Advertising Router link states\n"
7359 "Advertising Router (as an IP address)\n"
7360 "Self-originated link states\n"
7363 struct ospf
*ospf
= NULL
;
7364 struct listnode
*node
= NULL
;
7365 char *vrf_name
= NULL
;
7366 bool all_vrf
= false;
7367 int ret
= CMD_SUCCESS
;
7370 uint8_t use_vrf
= 0;
7371 bool uj
= use_json(argc
, argv
);
7372 json_object
*json
= NULL
;
7375 json
= json_object_new_object();
7377 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7380 bool ospf_output
= false;
7385 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7386 if (!ospf
->oi_running
)
7389 ret
= show_ip_ospf_database_type_adv_router_common(
7390 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
,
7394 vty_out(vty
, "%% OSPF is not enabled\n");
7396 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7397 if ((ospf
== NULL
) || !ospf
->oi_running
) {
7399 "%% OSPF is not enabled in vrf %s\n",
7404 ret
= show_ip_ospf_database_type_adv_router_common(
7405 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
, uj
);
7408 /* Display default ospf (instance 0) info */
7409 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7410 if (ospf
== NULL
|| !ospf
->oi_running
) {
7411 vty_out(vty
, "%% OSPF is not enabled on vrf default\n");
7415 ret
= show_ip_ospf_database_type_adv_router_common(
7416 vty
, ospf
, 0, argc
, argv
, use_vrf
, json
, uj
);
7420 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7421 json_object_free(json
);
7427 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
7428 show_ip_ospf_instance_database_type_adv_router_cmd
,
7429 "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]",
7432 "OSPF information\n"
7434 "Database summary\n"
7436 "Advertising Router link states\n"
7437 "Advertising Router (as an IP address)\n"
7438 "Self-originated link states\n"
7443 unsigned short instance
= 0;
7444 bool uj
= use_json(argc
, argv
);
7445 json_object
*json
= NULL
;
7448 json
= json_object_new_object();
7450 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7451 if (instance
!= ospf_instance
)
7452 return CMD_NOT_MY_INSTANCE
;
7454 ospf
= ospf_lookup_instance(instance
);
7455 if (!ospf
|| !ospf
->oi_running
)
7458 show_ip_ospf_database_type_adv_router_common(vty
, ospf
, 1, argc
, argv
,
7462 vty_json(vty
, json
);
7467 DEFUN (ip_ospf_authentication_args
,
7468 ip_ospf_authentication_args_addr_cmd
,
7469 "ip ospf authentication <null|message-digest> [A.B.C.D]",
7471 "OSPF interface commands\n"
7472 "Enable authentication on this interface\n"
7473 "Use null authentication\n"
7474 "Use message-digest authentication\n"
7475 "Address of interface\n")
7477 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7478 int idx_encryption
= 3;
7480 struct in_addr addr
;
7482 struct ospf_if_params
*params
;
7484 params
= IF_DEF_PARAMS(ifp
);
7487 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7490 "Please specify interface address by A.B.C.D\n");
7491 return CMD_WARNING_CONFIG_FAILED
;
7494 params
= ospf_get_if_params(ifp
, addr
);
7495 ospf_if_update_params(ifp
, addr
);
7498 /* Handle null authentication */
7499 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7500 SET_IF_PARAM(params
, auth_type
);
7501 params
->auth_type
= OSPF_AUTH_NULL
;
7505 /* Handle message-digest authentication */
7506 if (argv
[idx_encryption
]->arg
[0] == 'm') {
7507 SET_IF_PARAM(params
, auth_type
);
7508 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7512 vty_out(vty
, "You shouldn't get here!\n");
7513 return CMD_WARNING_CONFIG_FAILED
;
7516 DEFUN (ip_ospf_authentication
,
7517 ip_ospf_authentication_addr_cmd
,
7518 "ip ospf authentication [A.B.C.D]",
7520 "OSPF interface commands\n"
7521 "Enable authentication on this interface\n"
7522 "Address of interface\n")
7524 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7526 struct in_addr addr
;
7528 struct ospf_if_params
*params
;
7530 params
= IF_DEF_PARAMS(ifp
);
7533 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7536 "Please specify interface address by A.B.C.D\n");
7537 return CMD_WARNING_CONFIG_FAILED
;
7540 params
= ospf_get_if_params(ifp
, addr
);
7541 ospf_if_update_params(ifp
, addr
);
7544 SET_IF_PARAM(params
, auth_type
);
7545 params
->auth_type
= OSPF_AUTH_SIMPLE
;
7550 DEFUN (no_ip_ospf_authentication_args
,
7551 no_ip_ospf_authentication_args_addr_cmd
,
7552 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
7555 "OSPF interface commands\n"
7556 "Enable authentication on this interface\n"
7557 "Use null authentication\n"
7558 "Use message-digest authentication\n"
7559 "Address of interface\n")
7561 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7562 int idx_encryption
= 4;
7564 struct in_addr addr
;
7566 struct ospf_if_params
*params
;
7567 struct route_node
*rn
;
7570 params
= IF_DEF_PARAMS(ifp
);
7573 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7576 "Please specify interface address by A.B.C.D\n");
7577 return CMD_WARNING_CONFIG_FAILED
;
7580 params
= ospf_lookup_if_params(ifp
, addr
);
7581 if (params
== NULL
) {
7582 vty_out(vty
, "Ip Address specified is unknown\n");
7583 return CMD_WARNING_CONFIG_FAILED
;
7585 params
->auth_type
= OSPF_AUTH_NOTSET
;
7586 UNSET_IF_PARAM(params
, auth_type
);
7587 if (params
!= IF_DEF_PARAMS(ifp
)) {
7588 ospf_free_if_params(ifp
, addr
);
7589 ospf_if_update_params(ifp
, addr
);
7592 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7593 auth_type
= OSPF_AUTH_NULL
;
7594 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
7595 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7597 vty_out(vty
, "Unexpected input encountered\n");
7598 return CMD_WARNING_CONFIG_FAILED
;
7601 * Here we have a case where the user has entered
7602 * 'no ip ospf authentication (null | message_digest )'
7603 * we need to find if we have any ip addresses underneath it
7605 * correspond to the associated type.
7607 if (params
->auth_type
== auth_type
) {
7608 params
->auth_type
= OSPF_AUTH_NOTSET
;
7609 UNSET_IF_PARAM(params
, auth_type
);
7612 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7613 rn
= route_next(rn
)) {
7614 if ((params
= rn
->info
)) {
7615 if (params
->auth_type
== auth_type
) {
7616 params
->auth_type
= OSPF_AUTH_NOTSET
;
7617 UNSET_IF_PARAM(params
, auth_type
);
7618 if (params
!= IF_DEF_PARAMS(ifp
)) {
7619 ospf_free_if_params(
7620 ifp
, rn
->p
.u
.prefix4
);
7621 ospf_if_update_params(
7622 ifp
, rn
->p
.u
.prefix4
);
7632 DEFUN (no_ip_ospf_authentication
,
7633 no_ip_ospf_authentication_addr_cmd
,
7634 "no ip ospf authentication [A.B.C.D]",
7637 "OSPF interface commands\n"
7638 "Enable authentication on this interface\n"
7639 "Address of interface\n")
7641 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7643 struct in_addr addr
;
7645 struct ospf_if_params
*params
;
7646 struct route_node
*rn
;
7648 params
= IF_DEF_PARAMS(ifp
);
7651 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7654 "Please specify interface address by A.B.C.D\n");
7655 return CMD_WARNING_CONFIG_FAILED
;
7658 params
= ospf_lookup_if_params(ifp
, addr
);
7659 if (params
== NULL
) {
7660 vty_out(vty
, "Ip Address specified is unknown\n");
7661 return CMD_WARNING_CONFIG_FAILED
;
7664 params
->auth_type
= OSPF_AUTH_NOTSET
;
7665 UNSET_IF_PARAM(params
, auth_type
);
7666 if (params
!= IF_DEF_PARAMS(ifp
)) {
7667 ospf_free_if_params(ifp
, addr
);
7668 ospf_if_update_params(ifp
, addr
);
7672 * When a user enters 'no ip ospf authentication'
7673 * We should remove all authentication types from
7676 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7677 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
7678 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
7679 params
->auth_type
= OSPF_AUTH_NOTSET
;
7680 UNSET_IF_PARAM(params
, auth_type
);
7683 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7684 rn
= route_next(rn
)) {
7685 if ((params
= rn
->info
)) {
7687 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7688 || (params
->auth_type
7689 == OSPF_AUTH_CRYPTOGRAPHIC
)
7690 || (params
->auth_type
7691 == OSPF_AUTH_SIMPLE
)) {
7692 params
->auth_type
= OSPF_AUTH_NOTSET
;
7693 UNSET_IF_PARAM(params
, auth_type
);
7694 if (params
!= IF_DEF_PARAMS(ifp
)) {
7695 ospf_free_if_params(
7696 ifp
, rn
->p
.u
.prefix4
);
7697 ospf_if_update_params(
7698 ifp
, rn
->p
.u
.prefix4
);
7709 DEFUN (ip_ospf_authentication_key
,
7710 ip_ospf_authentication_key_addr_cmd
,
7711 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
7713 "OSPF interface commands\n"
7714 "Authentication password (key)\n"
7715 "The OSPF password (key)\n"
7716 "Address of interface\n")
7718 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7720 struct in_addr addr
;
7721 struct ospf_if_params
*params
;
7723 params
= IF_DEF_PARAMS(ifp
);
7725 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7726 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7728 "Please specify interface address by A.B.C.D\n");
7729 return CMD_WARNING_CONFIG_FAILED
;
7732 params
= ospf_get_if_params(ifp
, addr
);
7733 ospf_if_update_params(ifp
, addr
);
7736 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
7737 sizeof(params
->auth_simple
));
7738 SET_IF_PARAM(params
, auth_simple
);
7743 DEFUN_HIDDEN (ospf_authentication_key
,
7744 ospf_authentication_key_cmd
,
7745 "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 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7753 DEFUN (no_ip_ospf_authentication_key
,
7754 no_ip_ospf_authentication_key_authkey_addr_cmd
,
7755 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7758 "OSPF interface commands\n"
7759 VLINK_HELPSTR_AUTH_SIMPLE
7760 "Address of interface\n")
7762 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7764 struct in_addr addr
;
7765 struct ospf_if_params
*params
;
7766 params
= IF_DEF_PARAMS(ifp
);
7768 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7769 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7771 "Please specify interface address by A.B.C.D\n");
7772 return CMD_WARNING_CONFIG_FAILED
;
7775 params
= ospf_lookup_if_params(ifp
, addr
);
7780 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
7781 UNSET_IF_PARAM(params
, auth_simple
);
7783 if (params
!= IF_DEF_PARAMS(ifp
)) {
7784 ospf_free_if_params(ifp
, addr
);
7785 ospf_if_update_params(ifp
, addr
);
7791 DEFUN_HIDDEN (no_ospf_authentication_key
,
7792 no_ospf_authentication_key_authkey_addr_cmd
,
7793 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7795 "OSPF interface commands\n"
7796 VLINK_HELPSTR_AUTH_SIMPLE
7797 "Address of interface\n")
7799 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7802 DEFUN (ip_ospf_message_digest_key
,
7803 ip_ospf_message_digest_key_cmd
,
7804 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7806 "OSPF interface commands\n"
7807 "Message digest authentication password (key)\n"
7809 "Use MD5 algorithm\n"
7810 "The OSPF password (key)\n"
7811 "Address of interface\n")
7813 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7814 struct crypt_key
*ck
;
7816 struct in_addr addr
;
7817 struct ospf_if_params
*params
;
7819 params
= IF_DEF_PARAMS(ifp
);
7822 argv_find(argv
, argc
, "(1-255)", &idx
);
7823 char *keyid
= argv
[idx
]->arg
;
7824 argv_find(argv
, argc
, "KEY", &idx
);
7825 char *cryptkey
= argv
[idx
]->arg
;
7827 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7828 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7830 "Please specify interface address by A.B.C.D\n");
7831 return CMD_WARNING_CONFIG_FAILED
;
7834 params
= ospf_get_if_params(ifp
, addr
);
7835 ospf_if_update_params(ifp
, addr
);
7838 key_id
= strtol(keyid
, NULL
, 10);
7840 /* Remove existing key, if any */
7841 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7843 ck
= ospf_crypt_key_new();
7844 ck
->key_id
= (uint8_t)key_id
;
7845 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7847 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7848 SET_IF_PARAM(params
, auth_crypt
);
7853 DEFUN_HIDDEN (ospf_message_digest_key
,
7854 ospf_message_digest_key_cmd
,
7855 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7856 "OSPF interface commands\n"
7857 "Message digest authentication password (key)\n"
7859 "Use MD5 algorithm\n"
7860 "The OSPF password (key)\n"
7861 "Address of interface\n")
7863 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7866 DEFUN (no_ip_ospf_message_digest_key
,
7867 no_ip_ospf_message_digest_key_cmd
,
7868 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7871 "OSPF interface commands\n"
7872 "Message digest authentication password (key)\n"
7874 "Use MD5 algorithm\n"
7875 "The OSPF password (key)\n"
7876 "Address of interface\n")
7878 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7880 struct crypt_key
*ck
;
7882 struct in_addr addr
;
7883 struct ospf_if_params
*params
;
7884 params
= IF_DEF_PARAMS(ifp
);
7886 argv_find(argv
, argc
, "(1-255)", &idx
);
7887 char *keyid
= argv
[idx
]->arg
;
7889 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7890 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7892 "Please specify interface address by A.B.C.D\n");
7893 return CMD_WARNING_CONFIG_FAILED
;
7896 params
= ospf_lookup_if_params(ifp
, addr
);
7901 key_id
= strtol(keyid
, NULL
, 10);
7902 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7904 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7905 return CMD_WARNING_CONFIG_FAILED
;
7908 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7910 if (params
!= IF_DEF_PARAMS(ifp
)) {
7911 ospf_free_if_params(ifp
, addr
);
7912 ospf_if_update_params(ifp
, addr
);
7918 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7919 no_ospf_message_digest_key_cmd
,
7920 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7922 "OSPF interface commands\n"
7923 "Message digest authentication password (key)\n"
7925 "Use MD5 algorithm\n"
7926 "The OSPF password (key)\n"
7927 "Address of interface\n")
7929 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7932 DEFUN (ip_ospf_cost
,
7934 "ip ospf cost (1-65535) [A.B.C.D]",
7936 "OSPF interface commands\n"
7939 "Address of interface\n")
7941 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7943 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7944 struct in_addr addr
;
7945 struct ospf_if_params
*params
;
7946 params
= IF_DEF_PARAMS(ifp
);
7949 char *coststr
= NULL
, *ifaddr
= NULL
;
7951 argv_find(argv
, argc
, "(1-65535)", &idx
);
7952 coststr
= argv
[idx
]->arg
;
7953 cost
= strtol(coststr
, NULL
, 10);
7955 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7957 if (!inet_aton(ifaddr
, &addr
)) {
7959 "Please specify interface address by A.B.C.D\n");
7960 return CMD_WARNING_CONFIG_FAILED
;
7963 params
= ospf_get_if_params(ifp
, addr
);
7964 ospf_if_update_params(ifp
, addr
);
7967 SET_IF_PARAM(params
, output_cost_cmd
);
7968 params
->output_cost_cmd
= cost
;
7970 ospf_if_recalculate_output_cost(ifp
);
7975 DEFUN_HIDDEN (ospf_cost
,
7977 "ospf cost (1-65535) [A.B.C.D]",
7978 "OSPF interface commands\n"
7981 "Address of interface\n")
7983 return ip_ospf_cost(self
, vty
, argc
, argv
);
7986 DEFUN (no_ip_ospf_cost
,
7987 no_ip_ospf_cost_cmd
,
7988 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7991 "OSPF interface commands\n"
7994 "Address of interface\n")
7996 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7998 struct in_addr addr
;
7999 struct ospf_if_params
*params
;
8001 params
= IF_DEF_PARAMS(ifp
);
8004 char *ifaddr
= NULL
;
8005 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
8007 /* According to the semantics we are mimicking "no ip ospf cost N" is
8008 * always treated as "no ip ospf cost" regardless of the actual value
8009 * of N already configured for the interface. Thus ignore cost. */
8012 if (!inet_aton(ifaddr
, &addr
)) {
8014 "Please specify interface address by A.B.C.D\n");
8015 return CMD_WARNING_CONFIG_FAILED
;
8018 params
= ospf_lookup_if_params(ifp
, addr
);
8023 UNSET_IF_PARAM(params
, output_cost_cmd
);
8025 if (params
!= IF_DEF_PARAMS(ifp
)) {
8026 ospf_free_if_params(ifp
, addr
);
8027 ospf_if_update_params(ifp
, addr
);
8030 ospf_if_recalculate_output_cost(ifp
);
8035 DEFUN_HIDDEN (no_ospf_cost
,
8037 "no ospf cost [(1-65535)] [A.B.C.D]",
8039 "OSPF interface commands\n"
8042 "Address of interface\n")
8044 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
8047 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
8049 struct route_node
*rn
;
8050 struct ospf_neighbor
*nbr
;
8052 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
8053 if ((nbr
= rn
->info
)) {
8054 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
8055 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8056 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8057 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8061 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
8062 const char *nbr_str
,
8063 const char *fast_hello_str
)
8065 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8068 struct in_addr addr
;
8070 struct ospf_if_params
*params
;
8071 struct ospf_interface
*oi
;
8072 struct route_node
*rn
;
8074 params
= IF_DEF_PARAMS(ifp
);
8077 ret
= inet_aton(nbr_str
, &addr
);
8080 "Please specify interface address by A.B.C.D\n");
8081 return CMD_WARNING_CONFIG_FAILED
;
8084 params
= ospf_get_if_params(ifp
, addr
);
8085 ospf_if_update_params(ifp
, addr
);
8089 seconds
= strtoul(interval_str
, NULL
, 10);
8091 /* reset fast_hello too, just to be sure */
8092 UNSET_IF_PARAM(params
, fast_hello
);
8093 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8094 } else if (fast_hello_str
) {
8095 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
8096 /* 1s dead-interval with sub-second hellos desired */
8097 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
8098 SET_IF_PARAM(params
, fast_hello
);
8099 params
->fast_hello
= hellomult
;
8102 "Please specify dead-interval or hello-multiplier\n");
8103 return CMD_WARNING_CONFIG_FAILED
;
8106 SET_IF_PARAM(params
, v_wait
);
8107 params
->v_wait
= seconds
;
8108 params
->is_v_wait_set
= true;
8110 /* Update timer values in neighbor structure. */
8112 struct ospf
*ospf
= NULL
;
8114 ospf
= ifp
->vrf
->info
;
8116 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8118 ospf_nbr_timer_update(oi
);
8121 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8122 if ((oi
= rn
->info
))
8123 ospf_nbr_timer_update(oi
);
8129 DEFUN (ip_ospf_dead_interval
,
8130 ip_ospf_dead_interval_cmd
,
8131 "ip ospf dead-interval (1-65535) [A.B.C.D]",
8133 "OSPF interface commands\n"
8134 "Interval time after which a neighbor is declared down\n"
8136 "Address of interface\n")
8139 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
8143 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
8144 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
8148 DEFUN_HIDDEN (ospf_dead_interval
,
8149 ospf_dead_interval_cmd
,
8150 "ospf dead-interval (1-65535) [A.B.C.D]",
8151 "OSPF interface commands\n"
8152 "Interval time after which a neighbor is declared down\n"
8154 "Address of interface\n")
8156 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8159 DEFUN (ip_ospf_dead_interval_minimal
,
8160 ip_ospf_dead_interval_minimal_addr_cmd
,
8161 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
8163 "OSPF interface commands\n"
8164 "Interval time after which a neighbor is declared down\n"
8165 "Minimal 1s dead-interval with fast sub-second hellos\n"
8166 "Hello multiplier factor\n"
8167 "Number of Hellos to send each second\n"
8168 "Address of interface\n")
8173 return ospf_vty_dead_interval_set(
8174 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
8176 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
8177 argv
[idx_number
]->arg
);
8180 DEFUN (no_ip_ospf_dead_interval
,
8181 no_ip_ospf_dead_interval_cmd
,
8182 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8185 "OSPF interface commands\n"
8186 "Interval time after which a neighbor is declared down\n"
8188 "Minimal 1s dead-interval with fast sub-second hellos\n"
8189 "Hello multiplier factor\n"
8190 "Number of Hellos to send each second\n"
8191 "Address of interface\n")
8193 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8194 int idx_ipv4
= argc
- 1;
8195 struct in_addr addr
= {.s_addr
= 0L};
8197 struct ospf_if_params
*params
;
8198 struct ospf_interface
*oi
;
8199 struct route_node
*rn
;
8201 params
= IF_DEF_PARAMS(ifp
);
8203 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
8204 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8207 "Please specify interface address by A.B.C.D\n");
8208 return CMD_WARNING_CONFIG_FAILED
;
8211 params
= ospf_lookup_if_params(ifp
, addr
);
8216 UNSET_IF_PARAM(params
, v_wait
);
8217 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8218 params
->is_v_wait_set
= false;
8220 UNSET_IF_PARAM(params
, fast_hello
);
8221 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8223 if (params
!= IF_DEF_PARAMS(ifp
)) {
8224 ospf_free_if_params(ifp
, addr
);
8225 ospf_if_update_params(ifp
, addr
);
8228 /* Update timer values in neighbor structure. */
8230 struct ospf
*ospf
= NULL
;
8232 ospf
= ifp
->vrf
->info
;
8234 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8236 ospf_nbr_timer_update(oi
);
8239 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8240 if ((oi
= rn
->info
))
8241 ospf_nbr_timer_update(oi
);
8247 DEFUN_HIDDEN (no_ospf_dead_interval
,
8248 no_ospf_dead_interval_cmd
,
8249 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8251 "OSPF interface commands\n"
8252 "Interval time after which a neighbor is declared down\n"
8254 "Minimal 1s dead-interval with fast sub-second hellos\n"
8255 "Hello multiplier factor\n"
8256 "Number of Hellos to send each second\n"
8257 "Address of interface\n")
8259 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8262 DEFUN (ip_ospf_hello_interval
,
8263 ip_ospf_hello_interval_cmd
,
8264 "ip ospf hello-interval (1-65535) [A.B.C.D]",
8266 "OSPF interface commands\n"
8267 "Time between HELLO packets\n"
8269 "Address of interface\n")
8271 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8273 struct in_addr addr
= {.s_addr
= 0L};
8274 struct ospf_if_params
*params
;
8275 params
= IF_DEF_PARAMS(ifp
);
8276 uint32_t seconds
= 0;
8277 bool is_addr
= false;
8278 uint32_t old_interval
= 0;
8280 argv_find(argv
, argc
, "(1-65535)", &idx
);
8281 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8283 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8284 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8286 "Please specify interface address by A.B.C.D\n");
8287 return CMD_WARNING_CONFIG_FAILED
;
8290 params
= ospf_get_if_params(ifp
, addr
);
8291 ospf_if_update_params(ifp
, addr
);
8295 old_interval
= params
->v_hello
;
8297 /* Return, if same interval is configured. */
8298 if (old_interval
== seconds
)
8301 SET_IF_PARAM(params
, v_hello
);
8302 params
->v_hello
= seconds
;
8304 if (!params
->is_v_wait_set
) {
8305 SET_IF_PARAM(params
, v_wait
);
8307 * The router dead interval should
8308 * be some multiple of the HelloInterval (perhaps 4 times the
8309 * hello interval) and must be the same for all routers
8310 * attached to a common network.
8312 params
->v_wait
= 4 * seconds
;
8315 ospf_reset_hello_timer(ifp
, addr
, is_addr
);
8320 DEFUN_HIDDEN (ospf_hello_interval
,
8321 ospf_hello_interval_cmd
,
8322 "ospf hello-interval (1-65535) [A.B.C.D]",
8323 "OSPF interface commands\n"
8324 "Time between HELLO packets\n"
8326 "Address of interface\n")
8328 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8331 DEFUN (no_ip_ospf_hello_interval
,
8332 no_ip_ospf_hello_interval_cmd
,
8333 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
8336 "OSPF interface commands\n"
8337 "Time between HELLO packets\n" // ignored
8339 "Address of interface\n")
8341 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8343 struct in_addr addr
= {.s_addr
= 0L};
8344 struct ospf_if_params
*params
;
8345 struct route_node
*rn
;
8347 params
= IF_DEF_PARAMS(ifp
);
8349 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8350 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8352 "Please specify interface address by A.B.C.D\n");
8353 return CMD_WARNING_CONFIG_FAILED
;
8356 params
= ospf_lookup_if_params(ifp
, addr
);
8361 UNSET_IF_PARAM(params
, v_hello
);
8362 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
8364 if (!params
->is_v_wait_set
) {
8365 UNSET_IF_PARAM(params
, v_wait
);
8366 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8369 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8370 struct ospf_interface
*oi
= rn
->info
;
8375 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8376 oi
->ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8378 if (oi
->state
> ISM_Down
) {
8379 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8380 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8384 if (params
!= IF_DEF_PARAMS(ifp
)) {
8385 ospf_free_if_params(ifp
, addr
);
8386 ospf_if_update_params(ifp
, addr
);
8392 DEFUN_HIDDEN (no_ospf_hello_interval
,
8393 no_ospf_hello_interval_cmd
,
8394 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
8396 "OSPF interface commands\n"
8397 "Time between HELLO packets\n" // ignored
8399 "Address of interface\n")
8401 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8404 DEFUN(ip_ospf_network
, ip_ospf_network_cmd
,
8405 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point [dmvpn]>",
8407 "OSPF interface commands\n"
8409 "Specify OSPF broadcast multi-access network\n"
8410 "Specify OSPF NBMA network\n"
8411 "Specify OSPF point-to-multipoint network\n"
8412 "Specify OSPF point-to-point network\n"
8413 "Specify OSPF point-to-point DMVPN network\n")
8415 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8417 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8418 uint8_t old_ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8419 struct route_node
*rn
;
8421 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
8423 "This is a loopback interface. Can't set network type.\n");
8424 return CMD_WARNING_CONFIG_FAILED
;
8427 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8429 if (argv_find(argv
, argc
, "broadcast", &idx
))
8430 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
8431 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
8432 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
8433 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
8434 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
8435 else if (argv_find(argv
, argc
, "point-to-point", &idx
)) {
8436 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
8437 if (argv_find(argv
, argc
, "dmvpn", &idx
))
8438 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 1;
8441 if (IF_DEF_PARAMS(ifp
)->type
== old_type
8442 && IF_DEF_PARAMS(ifp
)->ptp_dmvpn
== old_ptp_dmvpn
)
8445 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
8447 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8448 struct ospf_interface
*oi
= rn
->info
;
8453 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8455 if (oi
->state
> ISM_Down
) {
8456 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8457 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8464 DEFUN_HIDDEN (ospf_network
,
8466 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
8467 "OSPF interface commands\n"
8469 "Specify OSPF broadcast multi-access network\n"
8470 "Specify OSPF NBMA network\n"
8471 "Specify OSPF point-to-multipoint network\n"
8472 "Specify OSPF point-to-point network\n")
8474 return ip_ospf_network(self
, vty
, argc
, argv
);
8477 DEFUN (no_ip_ospf_network
,
8478 no_ip_ospf_network_cmd
,
8479 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8482 "OSPF interface commands\n"
8484 "Specify OSPF broadcast multi-access network\n"
8485 "Specify OSPF NBMA network\n"
8486 "Specify OSPF point-to-multipoint network\n"
8487 "Specify OSPF point-to-point network\n")
8489 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8490 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8491 struct route_node
*rn
;
8493 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
8494 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8496 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
8499 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8500 struct ospf_interface
*oi
= rn
->info
;
8505 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8507 if (oi
->state
> ISM_Down
) {
8508 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8509 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8516 DEFUN_HIDDEN (no_ospf_network
,
8517 no_ospf_network_cmd
,
8518 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8520 "OSPF interface commands\n"
8522 "Specify OSPF broadcast multi-access network\n"
8523 "Specify OSPF NBMA network\n"
8524 "Specify OSPF point-to-multipoint network\n"
8525 "Specify OSPF point-to-point network\n")
8527 return no_ip_ospf_network(self
, vty
, argc
, argv
);
8530 DEFUN (ip_ospf_priority
,
8531 ip_ospf_priority_cmd
,
8532 "ip ospf priority (0-255) [A.B.C.D]",
8534 "OSPF interface commands\n"
8537 "Address of interface\n")
8539 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8542 struct route_node
*rn
;
8543 struct in_addr addr
;
8544 struct ospf_if_params
*params
;
8545 params
= IF_DEF_PARAMS(ifp
);
8547 argv_find(argv
, argc
, "(0-255)", &idx
);
8548 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
8550 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8551 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8553 "Please specify interface address by A.B.C.D\n");
8554 return CMD_WARNING_CONFIG_FAILED
;
8557 params
= ospf_get_if_params(ifp
, addr
);
8558 ospf_if_update_params(ifp
, addr
);
8561 SET_IF_PARAM(params
, priority
);
8562 params
->priority
= priority
;
8564 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8565 struct ospf_interface
*oi
= rn
->info
;
8570 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8571 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8572 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8579 DEFUN_HIDDEN (ospf_priority
,
8581 "ospf priority (0-255) [A.B.C.D]",
8582 "OSPF interface commands\n"
8585 "Address of interface\n")
8587 return ip_ospf_priority(self
, vty
, argc
, argv
);
8590 DEFUN (no_ip_ospf_priority
,
8591 no_ip_ospf_priority_cmd
,
8592 "no ip ospf priority [(0-255) [A.B.C.D]]",
8595 "OSPF interface commands\n"
8596 "Router priority\n" // ignored
8598 "Address of interface\n")
8600 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8602 struct route_node
*rn
;
8603 struct in_addr addr
;
8604 struct ospf_if_params
*params
;
8606 params
= IF_DEF_PARAMS(ifp
);
8608 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8609 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8611 "Please specify interface address by A.B.C.D\n");
8612 return CMD_WARNING_CONFIG_FAILED
;
8615 params
= ospf_lookup_if_params(ifp
, addr
);
8620 UNSET_IF_PARAM(params
, priority
);
8621 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
8623 if (params
!= IF_DEF_PARAMS(ifp
)) {
8624 ospf_free_if_params(ifp
, addr
);
8625 ospf_if_update_params(ifp
, addr
);
8628 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8629 struct ospf_interface
*oi
= rn
->info
;
8634 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8635 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8636 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8643 DEFUN_HIDDEN (no_ospf_priority
,
8644 no_ospf_priority_cmd
,
8645 "no ospf priority [(0-255) [A.B.C.D]]",
8647 "OSPF interface commands\n"
8650 "Address of interface\n")
8652 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
8655 DEFUN (ip_ospf_retransmit_interval
,
8656 ip_ospf_retransmit_interval_addr_cmd
,
8657 "ip ospf retransmit-interval (1-65535) [A.B.C.D]",
8659 "OSPF interface commands\n"
8660 "Time between retransmitting lost link state advertisements\n"
8662 "Address of interface\n")
8664 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8667 struct in_addr addr
;
8668 struct ospf_if_params
*params
;
8669 params
= IF_DEF_PARAMS(ifp
);
8671 argv_find(argv
, argc
, "(1-65535)", &idx
);
8672 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8674 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8675 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8677 "Please specify interface address by A.B.C.D\n");
8678 return CMD_WARNING_CONFIG_FAILED
;
8681 params
= ospf_get_if_params(ifp
, addr
);
8682 ospf_if_update_params(ifp
, addr
);
8685 SET_IF_PARAM(params
, retransmit_interval
);
8686 params
->retransmit_interval
= seconds
;
8691 DEFUN_HIDDEN (ospf_retransmit_interval
,
8692 ospf_retransmit_interval_cmd
,
8693 "ospf retransmit-interval (1-65535) [A.B.C.D]",
8694 "OSPF interface commands\n"
8695 "Time between retransmitting lost link state advertisements\n"
8697 "Address of interface\n")
8699 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8702 DEFUN (no_ip_ospf_retransmit_interval
,
8703 no_ip_ospf_retransmit_interval_addr_cmd
,
8704 "no ip ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8707 "OSPF interface commands\n"
8708 "Time between retransmitting lost link state advertisements\n"
8710 "Address of interface\n")
8712 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8714 struct in_addr addr
;
8715 struct ospf_if_params
*params
;
8717 params
= IF_DEF_PARAMS(ifp
);
8719 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8720 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8722 "Please specify interface address by A.B.C.D\n");
8723 return CMD_WARNING_CONFIG_FAILED
;
8726 params
= ospf_lookup_if_params(ifp
, addr
);
8731 UNSET_IF_PARAM(params
, retransmit_interval
);
8732 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
8734 if (params
!= IF_DEF_PARAMS(ifp
)) {
8735 ospf_free_if_params(ifp
, addr
);
8736 ospf_if_update_params(ifp
, addr
);
8742 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
8743 no_ospf_retransmit_interval_cmd
,
8744 "no ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8746 "OSPF interface commands\n"
8747 "Time between retransmitting lost link state advertisements\n"
8749 "Address of interface\n")
8751 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8754 DEFUN (ip_ospf_transmit_delay
,
8755 ip_ospf_transmit_delay_addr_cmd
,
8756 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
8758 "OSPF interface commands\n"
8759 "Link state transmit delay\n"
8761 "Address of interface\n")
8763 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8766 struct in_addr addr
;
8767 struct ospf_if_params
*params
;
8769 params
= IF_DEF_PARAMS(ifp
);
8770 argv_find(argv
, argc
, "(1-65535)", &idx
);
8771 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8773 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8774 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8776 "Please specify interface address by A.B.C.D\n");
8777 return CMD_WARNING_CONFIG_FAILED
;
8780 params
= ospf_get_if_params(ifp
, addr
);
8781 ospf_if_update_params(ifp
, addr
);
8784 SET_IF_PARAM(params
, transmit_delay
);
8785 params
->transmit_delay
= seconds
;
8790 DEFUN_HIDDEN (ospf_transmit_delay
,
8791 ospf_transmit_delay_cmd
,
8792 "ospf transmit-delay (1-65535) [A.B.C.D]",
8793 "OSPF interface commands\n"
8794 "Link state transmit delay\n"
8796 "Address of interface\n")
8798 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8801 DEFUN (no_ip_ospf_transmit_delay
,
8802 no_ip_ospf_transmit_delay_addr_cmd
,
8803 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
8806 "OSPF interface commands\n"
8807 "Link state transmit delay\n"
8809 "Address of interface\n")
8811 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8813 struct in_addr addr
;
8814 struct ospf_if_params
*params
;
8816 params
= IF_DEF_PARAMS(ifp
);
8818 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8819 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8821 "Please specify interface address by A.B.C.D\n");
8822 return CMD_WARNING_CONFIG_FAILED
;
8825 params
= ospf_lookup_if_params(ifp
, addr
);
8830 UNSET_IF_PARAM(params
, transmit_delay
);
8831 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
8833 if (params
!= IF_DEF_PARAMS(ifp
)) {
8834 ospf_free_if_params(ifp
, addr
);
8835 ospf_if_update_params(ifp
, addr
);
8842 DEFUN_HIDDEN (no_ospf_transmit_delay
,
8843 no_ospf_transmit_delay_cmd
,
8844 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
8846 "OSPF interface commands\n"
8847 "Link state transmit delay\n"
8849 "Address of interface\n")
8851 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8854 DEFUN (ip_ospf_area
,
8856 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8858 "OSPF interface commands\n"
8860 "Enable OSPF on this interface\n"
8861 "OSPF area ID in IP address format\n"
8862 "OSPF area ID as a decimal value\n"
8863 "Address of interface\n")
8865 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8868 struct in_addr area_id
;
8869 struct in_addr addr
;
8870 struct ospf_if_params
*params
= NULL
;
8871 struct route_node
*rn
;
8872 struct ospf
*ospf
= NULL
;
8873 unsigned short instance
= 0;
8877 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8878 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8880 argv_find(argv
, argc
, "area", &idx
);
8881 areaid
= argv
[idx
+ 1]->arg
;
8884 ospf
= ifp
->vrf
->info
;
8886 ospf
= ospf_lookup_instance(instance
);
8888 if (instance
&& instance
!= ospf_instance
) {
8890 * At this point we know we have received
8891 * an instance and there is no ospf instance
8892 * associated with it. This means we are
8893 * in a situation where we have an
8894 * ospf command that is setup for a different
8895 * process(instance). We need to safely
8896 * remove the command from ourselves and
8897 * allow the other instance(process) handle
8898 * the configuration command.
8902 params
= IF_DEF_PARAMS(ifp
);
8903 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8904 UNSET_IF_PARAM(params
, if_area
);
8908 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
; rn
= route_next(rn
))
8909 if ((params
= rn
->info
) && OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8910 UNSET_IF_PARAM(params
, if_area
);
8915 ospf
= ifp
->vrf
->info
;
8917 ospf_interface_area_unset(ospf
, ifp
);
8920 return CMD_NOT_MY_INSTANCE
;
8923 ret
= str2area_id(areaid
, &area_id
, &format
);
8925 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8926 return CMD_WARNING_CONFIG_FAILED
;
8928 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8929 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8930 return CMD_WARNING_CONFIG_FAILED
;
8934 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8935 if (rn
->info
!= NULL
) {
8937 "Please remove all network commands first.\n");
8938 return CMD_WARNING_CONFIG_FAILED
;
8943 params
= IF_DEF_PARAMS(ifp
);
8944 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8945 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8947 "Must remove previous area config before changing ospf area \n");
8948 return CMD_WARNING_CONFIG_FAILED
;
8951 // Check if we have an address arg and proccess it
8952 if (argc
== idx
+ 3) {
8953 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8955 "Please specify Intf Address by A.B.C.D\n");
8956 return CMD_WARNING_CONFIG_FAILED
;
8958 // update/create address-level params
8959 params
= ospf_get_if_params((ifp
), (addr
));
8960 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8961 if (!IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8963 "Must remove previous area/address config before changing ospf area\n");
8964 return CMD_WARNING_CONFIG_FAILED
;
8968 ospf_if_update_params((ifp
), (addr
));
8971 /* enable ospf on this interface with area_id */
8973 SET_IF_PARAM(params
, if_area
);
8974 params
->if_area
= area_id
;
8975 params
->if_area_id_fmt
= format
;
8979 ospf_interface_area_set(ospf
, ifp
);
8984 DEFUN (no_ip_ospf_area
,
8985 no_ip_ospf_area_cmd
,
8986 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8989 "OSPF interface commands\n"
8991 "Disable OSPF on this interface\n"
8992 "OSPF area ID in IP address format\n"
8993 "OSPF area ID as a decimal value\n"
8994 "Address of interface\n")
8996 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8999 struct ospf_if_params
*params
;
9000 unsigned short instance
= 0;
9001 struct in_addr addr
;
9002 struct in_addr area_id
;
9004 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
9005 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
9008 ospf
= ifp
->vrf
->info
;
9010 ospf
= ospf_lookup_instance(instance
);
9012 if (instance
&& instance
!= ospf_instance
)
9013 return CMD_NOT_MY_INSTANCE
;
9015 argv_find(argv
, argc
, "area", &idx
);
9017 // Check if we have an address arg and proccess it
9018 if (argc
== idx
+ 3) {
9019 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
9021 "Please specify Intf Address by A.B.C.D\n");
9022 return CMD_WARNING_CONFIG_FAILED
;
9024 params
= ospf_lookup_if_params(ifp
, addr
);
9025 if ((params
) == NULL
)
9028 params
= IF_DEF_PARAMS(ifp
);
9030 area_id
= params
->if_area
;
9031 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9033 "Can't find specified interface area configuration.\n");
9034 return CMD_WARNING_CONFIG_FAILED
;
9037 UNSET_IF_PARAM(params
, if_area
);
9038 if (params
!= IF_DEF_PARAMS((ifp
))) {
9039 ospf_free_if_params((ifp
), (addr
));
9040 ospf_if_update_params((ifp
), (addr
));
9044 ospf_interface_area_unset(ospf
, ifp
);
9045 ospf_area_check_free(ospf
, area_id
);
9051 DEFUN (ip_ospf_passive
,
9052 ip_ospf_passive_cmd
,
9053 "ip ospf passive [A.B.C.D]",
9055 "OSPF interface commands\n"
9056 "Suppress routing updates on an interface\n"
9057 "Address of interface\n")
9059 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9061 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9062 struct ospf_if_params
*params
;
9066 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9069 "Please specify interface address by A.B.C.D\n");
9070 return CMD_WARNING_CONFIG_FAILED
;
9072 params
= ospf_get_if_params(ifp
, addr
);
9073 ospf_if_update_params(ifp
, addr
);
9075 params
= IF_DEF_PARAMS(ifp
);
9078 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_PASSIVE
);
9083 DEFUN (no_ip_ospf_passive
,
9084 no_ip_ospf_passive_cmd
,
9085 "no ip ospf passive [A.B.C.D]",
9088 "OSPF interface commands\n"
9089 "Enable routing updates on an interface\n"
9090 "Address of interface\n")
9092 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9094 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9095 struct ospf_if_params
*params
;
9099 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9102 "Please specify interface address by A.B.C.D\n");
9103 return CMD_WARNING_CONFIG_FAILED
;
9105 params
= ospf_lookup_if_params(ifp
, addr
);
9109 params
= IF_DEF_PARAMS(ifp
);
9112 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_ACTIVE
);
9117 DEFUN (ospf_redistribute_source
,
9118 ospf_redistribute_source_cmd
,
9119 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9121 FRR_REDIST_HELP_STR_OSPFD
9122 "Metric for redistributed routes\n"
9123 "OSPF default metric\n"
9124 "OSPF exterior metric type for redistributed routes\n"
9125 "Set OSPF External Type 1/2 metrics\n"
9126 "Route map reference\n"
9127 "Pointer to route-map entries\n")
9129 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9130 int idx_protocol
= 1;
9134 struct ospf_redist
*red
;
9136 bool update
= false;
9138 /* Get distribute source. */
9139 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9141 return CMD_WARNING_CONFIG_FAILED
;
9143 /* Get metric value. */
9144 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9145 if (!str2metric(argv
[idx
]->arg
, &metric
))
9146 return CMD_WARNING_CONFIG_FAILED
;
9149 /* Get metric type. */
9150 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9151 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9152 return CMD_WARNING_CONFIG_FAILED
;
9156 red
= ospf_redist_lookup(ospf
, source
, 0);
9158 red
= ospf_redist_add(ospf
, source
, 0);
9163 if (argv_find(argv
, argc
, "WORD", &idx
)) {
9164 ospf_routemap_set(red
, argv
[idx
]->arg
);
9166 ospf_routemap_unset(red
);
9169 return ospf_redistribute_update(ospf
, red
, source
, 0, type
,
9172 return ospf_redistribute_set(ospf
, red
, source
, 0, type
,
9176 DEFUN (no_ospf_redistribute_source
,
9177 no_ospf_redistribute_source_cmd
,
9178 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9181 FRR_REDIST_HELP_STR_OSPFD
9182 "Metric for redistributed routes\n"
9183 "OSPF default metric\n"
9184 "OSPF exterior metric type for redistributed routes\n"
9185 "Set OSPF External Type 1/2 metrics\n"
9186 "Route map reference\n"
9187 "Pointer to route-map entries\n")
9189 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9190 int idx_protocol
= 2;
9192 struct ospf_redist
*red
;
9194 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9196 return CMD_WARNING_CONFIG_FAILED
;
9198 red
= ospf_redist_lookup(ospf
, source
, 0);
9202 ospf_routemap_unset(red
);
9203 ospf_redist_del(ospf
, source
, 0);
9205 return ospf_redistribute_unset(ospf
, source
, 0);
9208 DEFUN (ospf_redistribute_instance_source
,
9209 ospf_redistribute_instance_source_cmd
,
9210 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9212 "Open Shortest Path First\n"
9213 "Non-main Kernel Routing Table\n"
9214 "Instance ID/Table ID\n"
9215 "Metric for redistributed routes\n"
9216 "OSPF default metric\n"
9217 "OSPF exterior metric type for redistributed routes\n"
9218 "Set OSPF External Type 1/2 metrics\n"
9219 "Route map reference\n"
9220 "Pointer to route-map entries\n")
9222 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9223 int idx_ospf_table
= 1;
9229 unsigned short instance
;
9230 struct ospf_redist
*red
;
9231 bool update
= false;
9233 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
9236 vty_out(vty
, "Unknown instance redistribution\n");
9237 return CMD_WARNING_CONFIG_FAILED
;
9240 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9242 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9244 "Instance redistribution in non-instanced OSPF not allowed\n");
9245 return CMD_WARNING_CONFIG_FAILED
;
9248 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9249 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9250 return CMD_WARNING_CONFIG_FAILED
;
9253 /* Get metric value. */
9254 if (argv_find(argv
, argc
, "metric", &idx
))
9255 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
9256 return CMD_WARNING_CONFIG_FAILED
;
9259 /* Get metric type. */
9260 if (argv_find(argv
, argc
, "metric-type", &idx
))
9261 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
9262 return CMD_WARNING_CONFIG_FAILED
;
9264 red
= ospf_redist_lookup(ospf
, source
, instance
);
9266 red
= ospf_redist_add(ospf
, source
, instance
);
9271 if (argv_find(argv
, argc
, "route-map", &idx
))
9272 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
9274 ospf_routemap_unset(red
);
9277 return ospf_redistribute_update(ospf
, red
, source
, instance
,
9280 return ospf_redistribute_set(ospf
, red
, source
, instance
, type
,
9284 DEFUN (no_ospf_redistribute_instance_source
,
9285 no_ospf_redistribute_instance_source_cmd
,
9286 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9289 "Open Shortest Path First\n"
9290 "Non-main Kernel Routing Table\n"
9291 "Instance ID/Table Id\n"
9292 "Metric for redistributed routes\n"
9293 "OSPF default metric\n"
9294 "OSPF exterior metric type for redistributed routes\n"
9295 "Set OSPF External Type 1/2 metrics\n"
9296 "Route map reference\n"
9297 "Pointer to route-map entries\n")
9299 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9300 int idx_ospf_table
= 2;
9302 unsigned int instance
;
9303 struct ospf_redist
*red
;
9306 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9307 source
= ZEBRA_ROUTE_OSPF
;
9309 source
= ZEBRA_ROUTE_TABLE
;
9311 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9313 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9315 "Instance redistribution in non-instanced OSPF not allowed\n");
9316 return CMD_WARNING_CONFIG_FAILED
;
9319 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9320 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9321 return CMD_WARNING_CONFIG_FAILED
;
9324 red
= ospf_redist_lookup(ospf
, source
, instance
);
9328 ospf_routemap_unset(red
);
9329 ospf_redist_del(ospf
, source
, instance
);
9331 return ospf_redistribute_unset(ospf
, source
, instance
);
9334 DEFUN (ospf_distribute_list_out
,
9335 ospf_distribute_list_out_cmd
,
9336 "distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9337 "Filter networks in routing updates\n"
9338 "Access-list name\n"
9340 FRR_REDIST_HELP_STR_OSPFD
)
9342 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9346 char *proto
= argv
[argc
- 1]->text
;
9348 /* Get distribute source. */
9349 source
= proto_redistnum(AFI_IP
, proto
);
9351 return CMD_WARNING_CONFIG_FAILED
;
9353 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
9356 DEFUN (no_ospf_distribute_list_out
,
9357 no_ospf_distribute_list_out_cmd
,
9358 "no distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9360 "Filter networks in routing updates\n"
9361 "Access-list name\n"
9363 FRR_REDIST_HELP_STR_OSPFD
)
9365 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9369 char *proto
= argv
[argc
- 1]->text
;
9370 source
= proto_redistnum(AFI_IP
, proto
);
9372 return CMD_WARNING_CONFIG_FAILED
;
9374 return ospf_distribute_list_out_unset(ospf
, source
,
9375 argv
[idx_word
]->arg
);
9378 /* Default information originate. */
9379 DEFUN (ospf_default_information_originate
,
9380 ospf_default_information_originate_cmd
,
9381 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9382 "Control distribution of default information\n"
9383 "Distribute a default route\n"
9384 "Always advertise default route\n"
9385 "OSPF default metric\n"
9387 "OSPF metric type for default routes\n"
9388 "Set OSPF External Type 1/2 metrics\n"
9389 "Route map reference\n"
9390 "Pointer to route-map entries\n")
9392 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9393 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
9396 struct ospf_redist
*red
;
9398 int cur_originate
= ospf
->default_originate
;
9399 bool sameRtmap
= false;
9402 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
9404 /* Check whether "always" was specified */
9405 if (argv_find(argv
, argc
, "always", &idx
))
9406 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
9408 /* Get metric value */
9409 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9410 if (!str2metric(argv
[idx
]->arg
, &metric
))
9411 return CMD_WARNING_CONFIG_FAILED
;
9414 /* Get metric type. */
9415 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9416 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9417 return CMD_WARNING_CONFIG_FAILED
;
9421 if (argv_find(argv
, argc
, "WORD", &idx
))
9422 rtmap
= argv
[idx
]->arg
;
9424 /* To check if user is providing same route map */
9425 if ((!rtmap
&& !ROUTEMAP_NAME(red
)) ||
9426 (rtmap
&& ROUTEMAP_NAME(red
) &&
9427 (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
9430 /* Don't allow if the same lsa is already originated. */
9432 && (red
->dmetric
.type
== type
)
9433 && (red
->dmetric
.value
== metric
)
9434 && (cur_originate
== default_originate
))
9437 /* Updating Metric details */
9438 red
->dmetric
.type
= type
;
9439 red
->dmetric
.value
= metric
;
9441 /* updating route map details */
9443 ospf_routemap_set(red
, rtmap
);
9445 ospf_routemap_unset(red
);
9447 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
9451 DEFUN (no_ospf_default_information_originate
,
9452 no_ospf_default_information_originate_cmd
,
9453 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9455 "Control distribution of default information\n"
9456 "Distribute a default route\n"
9457 "Always advertise default route\n"
9458 "OSPF default metric\n"
9460 "OSPF metric type for default routes\n"
9461 "Set OSPF External Type 1/2 metrics\n"
9462 "Route map reference\n"
9463 "Pointer to route-map entries\n")
9465 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9466 struct ospf_redist
*red
;
9468 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
9472 ospf_routemap_unset(red
);
9473 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
9475 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
9479 DEFUN (ospf_default_metric
,
9480 ospf_default_metric_cmd
,
9481 "default-metric (0-16777214)",
9482 "Set metric of redistributed routes\n"
9485 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9489 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
9490 return CMD_WARNING_CONFIG_FAILED
;
9492 ospf
->default_metric
= metric
;
9497 DEFUN (no_ospf_default_metric
,
9498 no_ospf_default_metric_cmd
,
9499 "no default-metric [(0-16777214)]",
9501 "Set metric of redistributed routes\n"
9504 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9506 ospf
->default_metric
= -1;
9512 DEFUN (ospf_distance
,
9515 "Administrative distance\n"
9516 "OSPF Administrative distance\n")
9518 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9522 distance
= atoi(argv
[idx_number
]->arg
);
9523 if (ospf
->distance_all
!= distance
) {
9524 ospf
->distance_all
= distance
;
9525 ospf_restart_spf(ospf
);
9531 DEFUN (no_ospf_distance
,
9532 no_ospf_distance_cmd
,
9533 "no distance (1-255)",
9535 "Administrative distance\n"
9536 "OSPF Administrative distance\n")
9538 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9540 if (ospf
->distance_all
) {
9541 ospf
->distance_all
= 0;
9542 ospf_restart_spf(ospf
);
9548 DEFUN (no_ospf_distance_ospf
,
9549 no_ospf_distance_ospf_cmd
,
9550 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
9552 "Administrative distance\n"
9553 "OSPF administrative distance\n"
9554 "Intra-area routes\n"
9555 "Distance for intra-area routes\n"
9556 "Inter-area routes\n"
9557 "Distance for inter-area routes\n"
9559 "Distance for external routes\n")
9561 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9564 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
9565 idx
= ospf
->distance_intra
= 0;
9566 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
9567 idx
= ospf
->distance_inter
= 0;
9568 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
9569 ospf
->distance_external
= 0;
9574 DEFUN (ospf_distance_ospf
,
9575 ospf_distance_ospf_cmd
,
9576 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
9577 "Administrative distance\n"
9578 "OSPF administrative distance\n"
9579 "Intra-area routes\n"
9580 "Distance for intra-area routes\n"
9581 "Inter-area routes\n"
9582 "Distance for inter-area routes\n"
9584 "Distance for external routes\n")
9586 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9589 ospf
->distance_intra
= 0;
9590 ospf
->distance_inter
= 0;
9591 ospf
->distance_external
= 0;
9593 if (argv_find(argv
, argc
, "intra-area", &idx
))
9594 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
9596 if (argv_find(argv
, argc
, "inter-area", &idx
))
9597 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
9599 if (argv_find(argv
, argc
, "external", &idx
))
9600 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
9605 DEFUN (ip_ospf_mtu_ignore
,
9606 ip_ospf_mtu_ignore_addr_cmd
,
9607 "ip ospf mtu-ignore [A.B.C.D]",
9609 "OSPF interface commands\n"
9610 "Disable MTU mismatch detection on this interface\n"
9611 "Address of interface\n")
9613 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9615 struct in_addr addr
;
9618 struct ospf_if_params
*params
;
9619 params
= IF_DEF_PARAMS(ifp
);
9622 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9625 "Please specify interface address by A.B.C.D\n");
9626 return CMD_WARNING_CONFIG_FAILED
;
9628 params
= ospf_get_if_params(ifp
, addr
);
9629 ospf_if_update_params(ifp
, addr
);
9631 params
->mtu_ignore
= 1;
9632 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9633 SET_IF_PARAM(params
, mtu_ignore
);
9635 UNSET_IF_PARAM(params
, mtu_ignore
);
9636 if (params
!= IF_DEF_PARAMS(ifp
)) {
9637 ospf_free_if_params(ifp
, addr
);
9638 ospf_if_update_params(ifp
, addr
);
9644 DEFUN (no_ip_ospf_mtu_ignore
,
9645 no_ip_ospf_mtu_ignore_addr_cmd
,
9646 "no ip ospf mtu-ignore [A.B.C.D]",
9649 "OSPF interface commands\n"
9650 "Disable MTU mismatch detection on this interface\n"
9651 "Address of interface\n")
9653 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9655 struct in_addr addr
;
9658 struct ospf_if_params
*params
;
9659 params
= IF_DEF_PARAMS(ifp
);
9662 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9665 "Please specify interface address by A.B.C.D\n");
9666 return CMD_WARNING_CONFIG_FAILED
;
9668 params
= ospf_get_if_params(ifp
, addr
);
9669 ospf_if_update_params(ifp
, addr
);
9671 params
->mtu_ignore
= 0;
9672 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9673 SET_IF_PARAM(params
, mtu_ignore
);
9675 UNSET_IF_PARAM(params
, mtu_ignore
);
9676 if (params
!= IF_DEF_PARAMS(ifp
)) {
9677 ospf_free_if_params(ifp
, addr
);
9678 ospf_if_update_params(ifp
, addr
);
9685 DEFUN (ospf_max_metric_router_lsa_admin
,
9686 ospf_max_metric_router_lsa_admin_cmd
,
9687 "max-metric router-lsa administrative",
9688 "OSPF maximum / infinite-distance metric\n"
9689 "Advertise own Router-LSA with infinite distance (stub router)\n"
9690 "Administratively applied, for an indefinite period\n")
9692 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9693 struct listnode
*ln
;
9694 struct ospf_area
*area
;
9696 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9697 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
9699 if (!CHECK_FLAG(area
->stub_router_state
,
9700 OSPF_AREA_IS_STUB_ROUTED
))
9701 ospf_router_lsa_update_area(area
);
9704 /* Allows for areas configured later to get the property */
9705 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
9710 DEFUN (no_ospf_max_metric_router_lsa_admin
,
9711 no_ospf_max_metric_router_lsa_admin_cmd
,
9712 "no max-metric router-lsa administrative",
9714 "OSPF maximum / infinite-distance metric\n"
9715 "Advertise own Router-LSA with infinite distance (stub router)\n"
9716 "Administratively applied, for an indefinite period\n")
9718 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9719 struct listnode
*ln
;
9720 struct ospf_area
*area
;
9722 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9723 UNSET_FLAG(area
->stub_router_state
,
9724 OSPF_AREA_ADMIN_STUB_ROUTED
);
9726 /* Don't trample on the start-up stub timer */
9727 if (CHECK_FLAG(area
->stub_router_state
,
9728 OSPF_AREA_IS_STUB_ROUTED
)
9729 && !area
->t_stub_router
) {
9730 UNSET_FLAG(area
->stub_router_state
,
9731 OSPF_AREA_IS_STUB_ROUTED
);
9732 ospf_router_lsa_update_area(area
);
9735 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
9739 DEFUN (ospf_max_metric_router_lsa_startup
,
9740 ospf_max_metric_router_lsa_startup_cmd
,
9741 "max-metric router-lsa on-startup (5-86400)",
9742 "OSPF maximum / infinite-distance metric\n"
9743 "Advertise own Router-LSA with infinite distance (stub router)\n"
9744 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9745 "Time (seconds) to advertise self as stub-router\n")
9747 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9749 unsigned int seconds
;
9752 vty_out(vty
, "%% Must supply stub-router period\n");
9753 return CMD_WARNING_CONFIG_FAILED
;
9756 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9758 ospf
->stub_router_startup_time
= seconds
;
9763 DEFUN (no_ospf_max_metric_router_lsa_startup
,
9764 no_ospf_max_metric_router_lsa_startup_cmd
,
9765 "no max-metric router-lsa on-startup [(5-86400)]",
9767 "OSPF maximum / infinite-distance metric\n"
9768 "Advertise own Router-LSA with infinite distance (stub router)\n"
9769 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9770 "Time (seconds) to advertise self as stub-router\n")
9772 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9773 struct listnode
*ln
;
9774 struct ospf_area
*area
;
9776 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9778 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9779 SET_FLAG(area
->stub_router_state
,
9780 OSPF_AREA_WAS_START_STUB_ROUTED
);
9781 OSPF_TIMER_OFF(area
->t_stub_router
);
9783 /* Don't trample on admin stub routed */
9784 if (!CHECK_FLAG(area
->stub_router_state
,
9785 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
9786 UNSET_FLAG(area
->stub_router_state
,
9787 OSPF_AREA_IS_STUB_ROUTED
);
9788 ospf_router_lsa_update_area(area
);
9795 DEFUN (ospf_max_metric_router_lsa_shutdown
,
9796 ospf_max_metric_router_lsa_shutdown_cmd
,
9797 "max-metric router-lsa on-shutdown (5-100)",
9798 "OSPF maximum / infinite-distance metric\n"
9799 "Advertise own Router-LSA with infinite distance (stub router)\n"
9800 "Advertise stub-router prior to full shutdown of OSPF\n"
9801 "Time (seconds) to wait till full shutdown\n")
9803 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9805 unsigned int seconds
;
9808 vty_out(vty
, "%% Must supply stub-router shutdown period\n");
9809 return CMD_WARNING_CONFIG_FAILED
;
9812 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9814 ospf
->stub_router_shutdown_time
= seconds
;
9819 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
9820 no_ospf_max_metric_router_lsa_shutdown_cmd
,
9821 "no max-metric router-lsa on-shutdown [(5-100)]",
9823 "OSPF maximum / infinite-distance metric\n"
9824 "Advertise own Router-LSA with infinite distance (stub router)\n"
9825 "Advertise stub-router prior to full shutdown of OSPF\n"
9826 "Time (seconds) to wait till full shutdown\n")
9828 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9830 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9835 DEFUN (ospf_proactive_arp
,
9836 ospf_proactive_arp_cmd
,
9838 "Allow sending ARP requests proactively\n")
9840 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9842 ospf
->proactive_arp
= true;
9847 DEFUN (no_ospf_proactive_arp
,
9848 no_ospf_proactive_arp_cmd
,
9851 "Disallow sending ARP requests proactively\n")
9853 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9855 ospf
->proactive_arp
= false;
9860 /* Graceful Restart HELPER Commands */
9861 DEFPY(ospf_gr_helper_enable
, ospf_gr_helper_enable_cmd
,
9862 "graceful-restart helper enable [A.B.C.D$address]",
9863 "OSPF Graceful Restart\n"
9865 "Enable Helper support\n"
9866 "Advertising Router-ID\n")
9868 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9871 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9876 ospf_gr_helper_support_set(ospf
, OSPF_GR_TRUE
);
9881 DEFPY(no_ospf_gr_helper_enable
,
9882 no_ospf_gr_helper_enable_cmd
,
9883 "no graceful-restart helper enable [A.B.C.D$address]",
9885 "OSPF Graceful Restart\n"
9887 "Enable Helper support\n"
9888 "Advertising Router-ID\n")
9890 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9893 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9898 ospf_gr_helper_support_set(ospf
, OSPF_GR_FALSE
);
9902 #if CONFDATE > 20220921
9904 "Time to remove the deprecated \"[no] graceful-restart helper-only\" commands")
9907 DEFPY_HIDDEN(ospf_gr_helper_only
, ospf_gr_helper_only_cmd
,
9908 "graceful-restart helper-only [A.B.C.D]",
9909 "OSPF Graceful Restart\n"
9910 "Enable Helper support\n"
9911 "Advertising router id\n")
9913 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9914 struct in_addr addr
;
9918 "%% This command is deprecated. Please, use `graceful-restart helper enable` instead.\n");
9921 ret
= inet_aton(argv
[2]->arg
, &addr
);
9924 "Please specify the valid routerid address.\n");
9925 return CMD_WARNING_CONFIG_FAILED
;
9928 ospf_gr_helper_support_set_per_routerid(ospf
, &addr
, OSPF_GR_TRUE
);
9932 ospf_gr_helper_support_set(ospf
, OSPF_GR_TRUE
);
9937 ALIAS_HIDDEN(no_ospf_gr_helper_enable
,
9938 no_ospf_gr_helper_only_cmd
,
9939 "no graceful-restart helper-only [A.B.C.D]",
9941 "OSPF Graceful Restart\n"
9942 "Disable Helper support\n"
9943 "Advertising router id\n")
9945 DEFPY(ospf_gr_helper_enable_lsacheck
,
9946 ospf_gr_helper_enable_lsacheck_cmd
,
9947 "graceful-restart helper strict-lsa-checking",
9948 "OSPF Graceful Restart\n"
9950 "Enable strict LSA check\n")
9952 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9954 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_TRUE
);
9958 DEFPY(no_ospf_gr_helper_enable_lsacheck
,
9959 no_ospf_gr_helper_enable_lsacheck_cmd
,
9960 "no graceful-restart helper strict-lsa-checking",
9962 "OSPF Graceful Restart\n"
9964 "Disable strict LSA check\n")
9966 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9968 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_FALSE
);
9972 DEFPY(ospf_gr_helper_supported_grace_time
,
9973 ospf_gr_helper_supported_grace_time_cmd
,
9974 "graceful-restart helper supported-grace-time (10-1800)$interval",
9975 "OSPF Graceful Restart\n"
9977 "Supported grace timer\n"
9978 "Grace interval(in seconds)\n")
9980 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9982 ospf_gr_helper_supported_gracetime_set(ospf
, interval
);
9986 DEFPY(no_ospf_gr_helper_supported_grace_time
,
9987 no_ospf_gr_helper_supported_grace_time_cmd
,
9988 "no graceful-restart helper supported-grace-time (10-1800)$interval",
9990 "OSPF Graceful Restart\n"
9992 "Supported grace timer\n"
9993 "Grace interval(in seconds)\n")
9995 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9997 ospf_gr_helper_supported_gracetime_set(ospf
, OSPF_MAX_GRACE_INTERVAL
);
10001 DEFPY(ospf_gr_helper_planned_only
,
10002 ospf_gr_helper_planned_only_cmd
,
10003 "graceful-restart helper planned-only",
10004 "OSPF Graceful Restart\n"
10006 "Supported only planned restart\n")
10008 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10010 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_TRUE
);
10012 return CMD_SUCCESS
;
10015 /* External Route Aggregation */
10016 DEFUN (ospf_external_route_aggregation
,
10017 ospf_external_route_aggregation_cmd
,
10018 "summary-address A.B.C.D/M [tag (1-4294967295)]",
10019 "External summary address\n"
10020 "Summary address prefix\n"
10022 "Router tag value\n")
10024 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10025 struct prefix_ipv4 p
;
10027 route_tag_t tag
= 0;
10028 int ret
= OSPF_SUCCESS
;
10030 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10032 if (is_default_prefix4(&p
)) {
10034 "Default address shouldn't be configured as summary address.\n");
10035 return CMD_SUCCESS
;
10038 /* Apply mask for given prefix. */
10039 apply_mask((struct prefix
*)&p
);
10041 if (!is_valid_summary_addr(&p
)) {
10042 vty_out(vty
, "Not a valid summary address.\n");
10043 return CMD_WARNING_CONFIG_FAILED
;
10047 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
10049 ret
= ospf_asbr_external_aggregator_set(ospf
, &p
, tag
);
10050 if (ret
== OSPF_INVALID
)
10051 vty_out(vty
, "Invalid configuration!!\n");
10053 return CMD_SUCCESS
;
10056 DEFUN (no_ospf_external_route_aggregation
,
10057 no_ospf_external_route_aggregation_cmd
,
10058 "no summary-address A.B.C.D/M [tag (1-4294967295)]",
10060 "External summary address\n"
10061 "Summary address prefix\n"
10063 "Router tag value\n")
10065 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10066 struct prefix_ipv4 p
;
10068 route_tag_t tag
= 0;
10069 int ret
= OSPF_SUCCESS
;
10071 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10073 if (is_default_prefix4(&p
)) {
10075 "Default address shouldn't be configured as summary address.\n");
10076 return CMD_SUCCESS
;
10079 /* Apply mask for given prefix. */
10080 apply_mask((struct prefix
*)&p
);
10082 if (!is_valid_summary_addr(&p
)) {
10083 vty_out(vty
, "Not a valid summary address.\n");
10084 return CMD_WARNING_CONFIG_FAILED
;
10088 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
10090 ret
= ospf_asbr_external_aggregator_unset(ospf
, &p
, tag
);
10091 if (ret
== OSPF_INVALID
)
10092 vty_out(vty
, "Invalid configuration!!\n");
10094 return CMD_SUCCESS
;
10097 DEFPY(no_ospf_gr_helper_planned_only
,
10098 no_ospf_gr_helper_planned_only_cmd
,
10099 "no graceful-restart helper planned-only",
10101 "OSPF Graceful Restart\n"
10103 "Supported only for planned restart\n")
10105 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10107 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_FALSE
);
10109 return CMD_SUCCESS
;
10112 static int ospf_print_vty_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
10115 struct advRtr
*rtr
= bucket
->data
;
10116 struct vty
*vty
= (struct vty
*)arg
;
10117 static unsigned int count
;
10119 vty_out(vty
, "%-6pI4,", &rtr
->advRtrAddr
);
10122 if (count
% 5 == 0)
10123 vty_out(vty
, "\n");
10125 return HASHWALK_CONTINUE
;
10128 static int ospf_show_gr_helper_details(struct vty
*vty
, struct ospf
*ospf
,
10129 uint8_t use_vrf
, json_object
*json
,
10130 bool uj
, bool detail
)
10132 struct listnode
*node
;
10133 struct ospf_interface
*oi
;
10134 char buf
[PREFIX_STRLEN
];
10135 json_object
*json_vrf
= NULL
;
10139 json_vrf
= json_object_new_object();
10144 if (ospf
->instance
) {
10146 json_object_int_add(json
, "ospfInstance",
10149 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
10152 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
10156 json_object_object_add(json
, ospf_get_name(ospf
),
10159 vty_out(vty
, "\n");
10161 /* Show Router ID. */
10163 json_object_string_add(json_vrf
, "routerId",
10164 inet_ntop(AF_INET
, &ospf
->router_id
,
10165 buf
, sizeof(buf
)));
10167 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
10173 if (ospf
->is_helper_supported
)
10175 " Graceful restart helper support enabled.\n");
10178 " Graceful restart helper support disabled.\n");
10180 if (ospf
->strict_lsa_check
)
10181 vty_out(vty
, " Strict LSA check is enabled.\n");
10183 vty_out(vty
, " Strict LSA check is disabled.\n");
10185 if (ospf
->only_planned_restart
)
10187 " Helper supported for planned restarts only.\n");
10190 " Helper supported for Planned and Unplanned Restarts.\n");
10193 " Supported Graceful restart interval: %d(in seconds).\n",
10194 ospf
->supported_grace_time
);
10196 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
10197 vty_out(vty
, " Enable Router list:\n");
10199 hash_walk(ospf
->enable_rtr_list
,
10200 ospf_print_vty_helper_dis_rtr_walkcb
, vty
);
10201 vty_out(vty
, "\n\n");
10204 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10205 vty_out(vty
, " Last Helper exit Reason :%s\n",
10206 ospf_exit_reason2str(ospf
->last_exit_reason
));
10209 if (ospf
->active_restarter_cnt
)
10211 " Number of Active neighbours in graceful restart: %d\n",
10212 ospf
->active_restarter_cnt
);
10214 vty_out(vty
, "\n");
10217 json_object_string_add(
10218 json_vrf
, "helperSupport",
10219 (ospf
->is_helper_supported
) ? "Enabled" : "Disabled");
10220 json_object_string_add(json_vrf
, "strictLsaCheck",
10221 (ospf
->strict_lsa_check
) ? "Enabled"
10223 json_object_string_add(
10224 json_vrf
, "restartSupoort",
10225 (ospf
->only_planned_restart
)
10226 ? "Planned Restart only"
10227 : "Planned and Unplanned Restarts");
10229 json_object_int_add(json_vrf
, "supportedGracePeriod",
10230 ospf
->supported_grace_time
);
10232 #if CONFDATE > 20230131
10233 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
10235 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10236 json_object_string_add(
10237 json_vrf
, "LastExitReason",
10238 ospf_exit_reason2str(ospf
->last_exit_reason
));
10239 json_object_string_add(
10240 json_vrf
, "lastExitReason",
10241 ospf_exit_reason2str(ospf
->last_exit_reason
));
10244 if (ospf
->active_restarter_cnt
)
10245 json_object_int_add(json_vrf
, "activeRestarterCnt",
10246 ospf
->active_restarter_cnt
);
10252 json_object
*json_neighbors
= NULL
;
10254 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10255 struct route_node
*rn
;
10256 struct ospf_neighbor
*nbr
;
10257 json_object
*json_neigh
;
10259 if (ospf_interface_neighbor_count(oi
) == 0)
10263 json_object_object_get_ex(json_vrf
, "Neighbors",
10265 json_object_object_get_ex(json_vrf
, "neighbors",
10267 if (!json_neighbors
) {
10269 json_object_new_object();
10270 json_object_object_add(json_vrf
,
10273 json_object_object_add(json_vrf
,
10279 for (rn
= route_top(oi
->nbrs
); rn
;
10280 rn
= route_next(rn
)) {
10287 if (!OSPF_GR_IS_ACTIVE_HELPER(nbr
))
10291 vty_out(vty
, " Neighbour %d :\n", cnt
);
10292 vty_out(vty
, " Address : %pI4\n",
10293 &nbr
->address
.u
.prefix4
);
10294 vty_out(vty
, " Routerid : %pI4\n",
10297 " Received Grace period : %d(in seconds).\n",
10298 nbr
->gr_helper_info
10299 .recvd_grace_period
);
10301 " Actual Grace period : %d(in seconds)\n",
10302 nbr
->gr_helper_info
10303 .actual_grace_period
);
10305 " Remaining GraceTime:%ld(in seconds).\n",
10306 thread_timer_remain_second(
10307 nbr
->gr_helper_info
10310 " Graceful Restart reason: %s.\n\n",
10311 ospf_restart_reason2str(
10312 nbr
->gr_helper_info
10313 .gr_restart_reason
));
10316 json_neigh
= json_object_new_object();
10317 json_object_string_add(
10318 json_neigh
, "srcAddr",
10319 inet_ntop(AF_INET
, &nbr
->src
,
10320 buf
, sizeof(buf
)));
10322 json_object_string_add(
10323 json_neigh
, "routerid",
10326 buf
, sizeof(buf
)));
10327 json_object_int_add(
10329 "recvdGraceInterval",
10330 nbr
->gr_helper_info
10331 .recvd_grace_period
);
10332 json_object_int_add(
10334 "actualGraceInterval",
10335 nbr
->gr_helper_info
10336 .actual_grace_period
);
10337 json_object_int_add(
10338 json_neigh
, "remainGracetime",
10339 thread_timer_remain_second(
10340 nbr
->gr_helper_info
10342 json_object_string_add(
10343 json_neigh
, "restartReason",
10344 ospf_restart_reason2str(
10345 nbr
->gr_helper_info
10346 .gr_restart_reason
));
10347 json_object_object_add(
10349 inet_ntop(AF_INET
, &nbr
->src
,
10356 return CMD_SUCCESS
;
10359 DEFUN (ospf_external_route_aggregation_no_adrvertise
,
10360 ospf_external_route_aggregation_no_adrvertise_cmd
,
10361 "summary-address A.B.C.D/M no-advertise",
10362 "External summary address\n"
10363 "Summary address prefix\n"
10364 "Don't advertise summary route \n")
10366 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10367 struct prefix_ipv4 p
;
10369 int ret
= OSPF_SUCCESS
;
10371 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10373 if (is_default_prefix4(&p
)) {
10375 "Default address shouldn't be configured as summary address.\n");
10376 return CMD_SUCCESS
;
10379 /* Apply mask for given prefix. */
10380 apply_mask((struct prefix
*)&p
);
10382 if (!is_valid_summary_addr(&p
)) {
10383 vty_out(vty
, "Not a valid summary address.\n");
10384 return CMD_WARNING_CONFIG_FAILED
;
10387 ret
= ospf_asbr_external_rt_no_advertise(ospf
, &p
);
10388 if (ret
== OSPF_INVALID
)
10389 vty_out(vty
, "Invalid configuration!!\n");
10391 return CMD_SUCCESS
;
10394 DEFUN (no_ospf_external_route_aggregation_no_adrvertise
,
10395 no_ospf_external_route_aggregation_no_adrvertise_cmd
,
10396 "no summary-address A.B.C.D/M no-advertise",
10398 "External summary address\n"
10399 "Summary address prefix\n"
10400 "Advertise summary route to the AS \n")
10402 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10403 struct prefix_ipv4 p
;
10405 int ret
= OSPF_SUCCESS
;
10407 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10409 if (is_default_prefix4(&p
)) {
10411 "Default address shouldn't be configured as summary address.\n");
10412 return CMD_SUCCESS
;
10415 /* Apply mask for given prefix. */
10416 apply_mask((struct prefix
*)&p
);
10418 if (!is_valid_summary_addr(&p
)) {
10419 vty_out(vty
, "Not a valid summary address.\n");
10420 return CMD_WARNING_CONFIG_FAILED
;
10423 ret
= ospf_asbr_external_rt_advertise(ospf
, &p
);
10424 if (ret
== OSPF_INVALID
)
10425 vty_out(vty
, "Invalid configuration!!\n");
10427 return CMD_SUCCESS
;
10430 DEFUN (ospf_route_aggregation_timer
,
10431 ospf_route_aggregation_timer_cmd
,
10432 "aggregation timer (5-1800)",
10433 "External route aggregation\n"
10434 "Delay timer (in seconds)\n"
10435 "Timer interval(in seconds)\n")
10437 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10438 uint16_t interval
= 0;
10440 interval
= strtoul(argv
[2]->arg
, NULL
, 10);
10442 ospf_external_aggregator_timer_set(ospf
, interval
);
10444 return CMD_SUCCESS
;
10447 DEFPY (show_ip_ospf_gr_helper
,
10448 show_ip_ospf_gr_helper_cmd
,
10449 "show ip ospf [vrf <NAME|all>] graceful-restart helper [detail] [json]",
10452 "OSPF information\n"
10455 "OSPF Graceful Restart\n"
10456 "Helper details in the router\n"
10457 "Detailed information\n"
10460 char *vrf_name
= NULL
;
10461 bool all_vrf
= false;
10462 int ret
= CMD_SUCCESS
;
10465 uint8_t use_vrf
= 0;
10466 bool uj
= use_json(argc
, argv
);
10467 struct ospf
*ospf
= NULL
;
10468 json_object
*json
= NULL
;
10469 struct listnode
*node
= NULL
;
10471 bool detail
= false;
10473 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
10475 if (argv_find(argv
, argc
, "detail", &idx
))
10479 json
= json_object_new_object();
10481 /* vrf input is provided */
10486 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10487 if (!ospf
->oi_running
)
10490 ret
= ospf_show_gr_helper_details(
10491 vty
, ospf
, use_vrf
, json
, uj
, detail
);
10495 vty_json(vty
, json
);
10500 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
10502 if (ospf
== NULL
|| !ospf
->oi_running
) {
10505 vty_json(vty
, json
);
10508 "%% OSPF is not enabled in vrf %s\n",
10511 return CMD_SUCCESS
;
10516 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
10518 if (ospf
== NULL
|| !ospf
->oi_running
) {
10521 vty_json(vty
, json
);
10524 "%% OSPF is not enabled in vrf default\n");
10526 return CMD_SUCCESS
;
10529 ospf_show_gr_helper_details(vty
, ospf
, use_vrf
, json
, uj
,
10534 vty_json(vty
, json
);
10536 return CMD_SUCCESS
;
10538 /* Graceful Restart HELPER commands end */
10539 DEFUN (no_ospf_route_aggregation_timer
,
10540 no_ospf_route_aggregation_timer_cmd
,
10541 "no aggregation timer",
10543 "External route aggregation\n"
10546 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10548 ospf_external_aggregator_timer_set(ospf
, OSPF_EXTL_AGGR_DEFAULT_DELAY
);
10550 return CMD_SUCCESS
;
10553 /* External Route Aggregation End */
10555 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
10557 struct listnode
*ln
;
10558 struct ospf_area
*area
;
10560 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10561 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
10562 ospf
->stub_router_startup_time
);
10563 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10564 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
10565 ospf
->stub_router_shutdown_time
);
10566 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
10567 if (CHECK_FLAG(area
->stub_router_state
,
10568 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
10569 vty_out(vty
, " max-metric router-lsa administrative\n");
10576 #if CONFDATE > 20230131
10577 CPP_NOTICE("Remove JSON object commands with keys containing whitespaces")
10579 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
10580 struct route_table
*rt
,
10583 struct route_node
*rn
;
10584 struct ospf_route
* or ;
10585 struct listnode
*pnode
, *pnnode
;
10586 struct ospf_path
*path
;
10587 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10588 *json_nexthop
= NULL
;
10592 "============ OSPF network routing table ============\n");
10594 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10595 char buf1
[PREFIX2STR_BUFFER
];
10597 if ((or = rn
->info
) == NULL
)
10600 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
10603 json_route
= json_object_new_object();
10604 json_object_object_add(json
, buf1
, json_route
);
10607 switch (or->path_type
) {
10608 case OSPF_PATH_INTER_AREA
:
10609 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10611 json_object_string_add(json_route
,
10614 json_object_int_add(json_route
, "cost",
10616 json_object_string_addf(
10617 json_route
, "area", "%pI4",
10618 &or->u
.std
.area_id
);
10621 "N IA %-18s [%d] area: %pI4\n",
10623 &or->u
.std
.area_id
);
10625 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
10627 json_object_string_add(json_route
,
10632 "D IA %-18s Discard entry\n",
10637 case OSPF_PATH_INTRA_AREA
:
10639 json_object_string_add(json_route
, "routeType",
10641 json_object_int_add(json_route
, "cost",
10643 json_object_string_addf(json_route
, "area",
10645 &or->u
.std
.area_id
);
10647 vty_out(vty
, "N %-18s [%d] area: %pI4\n",
10649 &or->u
.std
.area_id
);
10656 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10658 json_nexthop_array
= json_object_new_array();
10659 json_object_object_add(json_route
, "nexthops",
10660 json_nexthop_array
);
10663 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
10666 json_nexthop
= json_object_new_object();
10667 json_object_array_add(
10668 json_nexthop_array
,
10671 if (if_lookup_by_index(path
->ifindex
,
10674 if (path
->nexthop
.s_addr
10677 json_object_string_add(
10680 json_object_string_add(
10682 "directly attached to",
10686 json_object_string_add(
10688 "directlyAttachedTo",
10694 "%24s directly attached to %s\n",
10702 json_object_string_addf(
10706 json_object_string_add(
10714 "%24s via %pI4, %s\n",
10727 vty_out(vty
, "\n");
10730 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
10731 struct route_table
*rtrs
,
10734 struct route_node
*rn
;
10735 struct ospf_route
* or ;
10736 struct listnode
*pnode
;
10737 struct listnode
*node
;
10738 struct ospf_path
*path
;
10739 char buf
[PREFIX_STRLEN
];
10740 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10741 *json_nexthop
= NULL
;
10745 "============ OSPF router routing table =============\n");
10747 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
10748 if (rn
->info
== NULL
)
10753 json_route
= json_object_new_object();
10754 json_object_object_add(
10755 json
, inet_ntop(AF_INET
, &rn
->p
.u
.prefix4
,
10758 json_object_string_add(json_route
, "routeType", "R ");
10760 vty_out(vty
, "R %-15pI4 ",
10764 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
10767 vty_out(vty
, "%24s", "");
10772 json_object_int_add(json_route
, "cost",
10774 json_object_string_addf(json_route
, "area",
10776 &or->u
.std
.area_id
);
10777 if (or->path_type
== OSPF_PATH_INTER_AREA
) {
10778 json_object_boolean_true_add(json_route
,
10780 json_object_boolean_true_add(json_route
,
10783 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
10784 json_object_string_add(json_route
,
10787 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
10788 json_object_string_add(json_route
,
10792 vty_out(vty
, "%s [%d] area: %pI4",
10793 (or->path_type
== OSPF_PATH_INTER_AREA
10796 or->cost
, &or->u
.std
.area_id
);
10798 vty_out(vty
, "%s%s\n",
10799 (or->u
.std
.flags
& ROUTER_LSA_BORDER
10802 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
10808 json_nexthop_array
= json_object_new_array();
10809 json_object_object_add(json_route
, "nexthops",
10810 json_nexthop_array
);
10813 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
10815 json_nexthop
= json_object_new_object();
10816 json_object_array_add(
10817 json_nexthop_array
,
10820 if (if_lookup_by_index(path
->ifindex
,
10822 if (path
->nexthop
.s_addr
10825 json_object_string_add(
10828 json_object_string_add(
10830 "directly attached to",
10834 json_object_string_add(
10836 "directlyAttachedTo",
10842 "%24s directly attached to %s\n",
10850 json_object_string_addf(
10854 json_object_string_add(
10862 "%24s via %pI4, %s\n",
10875 vty_out(vty
, "\n");
10878 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
10879 struct route_table
*rt
,
10882 struct route_node
*rn
;
10883 struct ospf_route
*er
;
10884 struct listnode
*pnode
, *pnnode
;
10885 struct ospf_path
*path
;
10886 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10887 *json_nexthop
= NULL
;
10891 "============ OSPF external routing table ===========\n");
10893 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10894 if ((er
= rn
->info
) == NULL
)
10899 snprintfrr(buf1
, sizeof(buf1
), "%pFX", &rn
->p
);
10901 json_route
= json_object_new_object();
10902 json_object_object_add(json
, buf1
, json_route
);
10905 switch (er
->path_type
) {
10906 case OSPF_PATH_TYPE1_EXTERNAL
:
10908 json_object_string_add(json_route
, "routeType",
10910 json_object_int_add(json_route
, "cost",
10912 json_object_int_add(json_route
, "tag",
10916 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
10918 buf1
, er
->cost
, er
->u
.ext
.tag
);
10921 case OSPF_PATH_TYPE2_EXTERNAL
:
10923 json_object_string_add(json_route
, "routeType",
10925 json_object_int_add(json_route
, "cost",
10927 json_object_int_add(json_route
, "type2cost",
10928 er
->u
.ext
.type2_cost
);
10929 json_object_int_add(json_route
, "tag",
10933 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
10935 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
10942 json_nexthop_array
= json_object_new_array();
10943 json_object_object_add(json_route
, "nexthops",
10944 json_nexthop_array
);
10947 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
10949 json_nexthop
= json_object_new_object();
10950 json_object_array_add(json_nexthop_array
,
10954 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
10955 if (path
->nexthop
.s_addr
== INADDR_ANY
) {
10957 json_object_string_add(
10958 json_nexthop
, "ip",
10960 json_object_string_add(
10962 "directly attached to",
10966 json_object_string_add(
10968 "directlyAttachedTo",
10974 "%24s directly attached to %s\n",
10982 json_object_string_addf(
10983 json_nexthop
, "ip",
10984 "%pI4", &path
->nexthop
);
10985 json_object_string_add(
10986 json_nexthop
, "via",
10992 "%24s via %pI4, %s\n",
11004 vty_out(vty
, "\n");
11007 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
11011 if (ospf
->instance
)
11012 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11014 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
11016 if (ospf
->new_table
== NULL
) {
11017 vty_out(vty
, "No OSPF routing information exist\n");
11018 return CMD_SUCCESS
;
11021 /* Show Network routes.
11022 show_ip_ospf_route_network (vty, ospf->new_table); */
11024 /* Show Router routes. */
11025 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
11027 vty_out(vty
, "\n");
11029 return CMD_SUCCESS
;
11032 DEFUN (show_ip_ospf_border_routers
,
11033 show_ip_ospf_border_routers_cmd
,
11034 "show ip ospf [vrf <NAME|all>] border-routers",
11037 "OSPF information\n"
11040 "Show all the ABR's and ASBR's\n")
11042 struct ospf
*ospf
= NULL
;
11043 struct listnode
*node
= NULL
;
11044 char *vrf_name
= NULL
;
11045 bool all_vrf
= false;
11046 int ret
= CMD_SUCCESS
;
11049 uint8_t use_vrf
= 0;
11051 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11054 bool ospf_output
= false;
11059 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11060 if (!ospf
->oi_running
)
11063 ospf_output
= true;
11064 ret
= show_ip_ospf_border_routers_common(
11065 vty
, ospf
, use_vrf
);
11069 vty_out(vty
, "%% OSPF is not enabled\n");
11071 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11072 if (ospf
== NULL
|| !ospf
->oi_running
) {
11074 "%% OSPF is not enabled in vrf %s\n",
11076 return CMD_SUCCESS
;
11079 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
11083 /* Display default ospf (instance 0) info */
11084 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11085 if (ospf
== NULL
|| !ospf
->oi_running
) {
11086 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
11087 return CMD_SUCCESS
;
11090 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
11096 DEFUN (show_ip_ospf_instance_border_routers
,
11097 show_ip_ospf_instance_border_routers_cmd
,
11098 "show ip ospf (1-65535) border-routers",
11101 "OSPF information\n"
11103 "Show all the ABR's and ASBR's\n")
11105 int idx_number
= 3;
11107 unsigned short instance
= 0;
11109 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11110 if (instance
!= ospf_instance
)
11111 return CMD_NOT_MY_INSTANCE
;
11113 ospf
= ospf_lookup_instance(instance
);
11114 if (!ospf
|| !ospf
->oi_running
)
11115 return CMD_SUCCESS
;
11117 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
11120 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
11121 json_object
*json
, uint8_t use_vrf
)
11123 json_object
*json_vrf
= NULL
;
11125 if (ospf
->instance
)
11126 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11131 json_vrf
= json_object_new_object();
11136 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11138 if (ospf
->new_table
== NULL
) {
11139 vty_out(vty
, "No OSPF routing information exist\n");
11140 return CMD_SUCCESS
;
11143 /* Show Network routes. */
11144 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
11146 /* Show Router routes. */
11147 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
11149 /* Show AS External routes. */
11150 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
11155 // json_object_object_add(json_vrf, "areas",
11157 json_object_object_add(json
, ospf_get_name(ospf
),
11161 vty_out(vty
, "\n");
11164 return CMD_SUCCESS
;
11167 DEFUN (show_ip_ospf_route
,
11168 show_ip_ospf_route_cmd
,
11169 "show ip ospf [vrf <NAME|all>] route [json]",
11172 "OSPF information\n"
11175 "OSPF routing table\n"
11178 struct ospf
*ospf
= NULL
;
11179 struct listnode
*node
= NULL
;
11180 char *vrf_name
= NULL
;
11181 bool all_vrf
= false;
11182 int ret
= CMD_SUCCESS
;
11185 uint8_t use_vrf
= 0;
11186 bool uj
= use_json(argc
, argv
);
11187 json_object
*json
= NULL
;
11190 json
= json_object_new_object();
11192 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11194 /* vrf input is provided could be all or specific vrf*/
11196 bool ospf_output
= false;
11201 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11202 if (!ospf
->oi_running
)
11204 ospf_output
= true;
11205 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
11210 /* Keep Non-pretty format */
11211 vty_json(vty
, json
);
11212 } else if (!ospf_output
)
11213 vty_out(vty
, "%% OSPF is not enabled\n");
11217 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11218 if (ospf
== NULL
|| !ospf
->oi_running
) {
11220 vty_json(vty
, json
);
11223 "%% OSPF is not enabled in vrf %s\n",
11226 return CMD_SUCCESS
;
11229 /* Display default ospf (instance 0) info */
11230 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11231 if (ospf
== NULL
|| !ospf
->oi_running
) {
11233 vty_json(vty
, json
);
11236 "%% OSPF is not enabled in vrf default\n");
11238 return CMD_SUCCESS
;
11243 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
11244 /* Keep Non-pretty format */
11246 vty_out(vty
, "%s\n",
11247 json_object_to_json_string_ext(
11248 json
, JSON_C_TO_STRING_NOSLASHESCAPE
));
11252 json_object_free(json
);
11257 DEFUN (show_ip_ospf_instance_route
,
11258 show_ip_ospf_instance_route_cmd
,
11259 "show ip ospf (1-65535) route",
11262 "OSPF information\n"
11264 "OSPF routing table\n")
11266 int idx_number
= 3;
11268 unsigned short instance
= 0;
11270 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11271 if (instance
!= ospf_instance
)
11272 return CMD_NOT_MY_INSTANCE
;
11274 ospf
= ospf_lookup_instance(instance
);
11275 if (!ospf
|| !ospf
->oi_running
)
11276 return CMD_SUCCESS
;
11278 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
11282 DEFUN (show_ip_ospf_vrfs
,
11283 show_ip_ospf_vrfs_cmd
,
11284 "show ip ospf vrfs [json]",
11287 "OSPF information\n"
11288 "Show OSPF VRFs \n"
11291 bool uj
= use_json(argc
, argv
);
11292 json_object
*json
= NULL
;
11293 json_object
*json_vrfs
= NULL
;
11294 struct ospf
*ospf
= NULL
;
11295 struct listnode
*node
= NULL
;
11297 static const char header
[] = "Name Id RouterId ";
11300 json
= json_object_new_object();
11301 json_vrfs
= json_object_new_object();
11304 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11305 json_object
*json_vrf
= NULL
;
11306 const char *name
= NULL
;
11307 int64_t vrf_id_ui
= 0;
11311 if (!uj
&& count
== 1)
11312 vty_out(vty
, "%s\n", header
);
11314 json_vrf
= json_object_new_object();
11316 name
= ospf_get_name(ospf
);
11318 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
11320 : (int64_t)ospf
->vrf_id
;
11323 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
11324 json_object_string_addf(json_vrf
, "routerId", "%pI4",
11327 json_object_object_add(json_vrfs
, name
, json_vrf
);
11330 vty_out(vty
, "%-25s %-5d %-16pI4 \n", name
,
11331 ospf
->vrf_id
, &ospf
->router_id
);
11336 json_object_object_add(json
, "vrfs", json_vrfs
);
11337 json_object_int_add(json
, "totalVrfs", count
);
11339 vty_json(vty
, json
);
11342 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
11346 return CMD_SUCCESS
;
11348 DEFPY (clear_ip_ospf_neighbor
,
11349 clear_ip_ospf_neighbor_cmd
,
11350 "clear ip ospf [(1-65535)]$instance neighbor [A.B.C.D$nbr_id]",
11353 "OSPF information\n"
11355 "Reset OSPF Neighbor\n"
11358 struct listnode
*node
;
11359 struct ospf
*ospf
= NULL
;
11361 /* If user does not specify the arguments,
11362 * instance = 0 and nbr_id = 0.0.0.0
11364 if (instance
!= 0) {
11365 /* This means clear only the particular ospf process */
11366 if (instance
!= ospf_instance
)
11367 return CMD_NOT_MY_INSTANCE
;
11370 /* Clear all the ospf processes */
11371 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11372 if (!ospf
->oi_running
)
11375 if (nbr_id_str
&& IPV4_ADDR_SAME(&ospf
->router_id
, &nbr_id
)) {
11376 vty_out(vty
, "Self router-id is not allowed.\r\n ");
11377 return CMD_SUCCESS
;
11380 ospf_neighbor_reset(ospf
, nbr_id
, nbr_id_str
);
11383 return CMD_SUCCESS
;
11386 DEFPY (clear_ip_ospf_process
,
11387 clear_ip_ospf_process_cmd
,
11388 "clear ip ospf [(1-65535)]$instance process",
11391 "OSPF information\n"
11393 "Reset OSPF Process\n")
11395 struct listnode
*node
;
11396 struct ospf
*ospf
= NULL
;
11398 /* Check if instance is not passed as an argument */
11399 if (instance
!= 0) {
11400 /* This means clear only the particular ospf process */
11401 if (instance
!= ospf_instance
)
11402 return CMD_NOT_MY_INSTANCE
;
11405 /* Clear all the ospf processes */
11406 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11407 if (!ospf
->oi_running
)
11410 ospf_process_reset(ospf
);
11413 return CMD_SUCCESS
;
11416 static const char *const ospf_abr_type_str
[] = {
11417 "unknown", "standard", "ibm", "cisco", "shortcut"
11420 static const char *const ospf_shortcut_mode_str
[] = {
11421 "default", "enable", "disable"
11423 static int ospf_vty_external_rt_walkcb(struct hash_bucket
*bucket
,
11426 struct external_info
*ei
= bucket
->data
;
11427 struct vty
*vty
= (struct vty
*)arg
;
11428 static unsigned int count
;
11430 vty_out(vty
, "%-4pI4/%d, ", &ei
->p
.prefix
, ei
->p
.prefixlen
);
11433 if (count
% 5 == 0)
11434 vty_out(vty
, "\n");
11436 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11439 return HASHWALK_CONTINUE
;
11442 static int ospf_json_external_rt_walkcb(struct hash_bucket
*bucket
,
11445 struct external_info
*ei
= bucket
->data
;
11446 struct json_object
*json
= (struct json_object
*)arg
;
11447 char buf
[PREFIX2STR_BUFFER
];
11449 static unsigned int count
;
11451 prefix2str(&ei
->p
, buf
, sizeof(buf
));
11453 snprintf(exnalbuf
, 20, "Exnl Addr-%d", count
);
11455 json_object_string_add(json
, exnalbuf
, buf
);
11459 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11462 return HASHWALK_CONTINUE
;
11465 static int ospf_show_summary_address(struct vty
*vty
, struct ospf
*ospf
,
11466 uint8_t use_vrf
, json_object
*json
,
11467 bool uj
, bool detail
)
11469 struct route_node
*rn
;
11470 json_object
*json_vrf
= NULL
;
11473 static char header
[] =
11474 "Summary-address Metric-type Metric Tag External_Rt_count\n";
11476 mtype
= metric_type(ospf
, 0, ospf
->instance
);
11477 mval
= metric_value(ospf
, 0, ospf
->instance
);
11480 vty_out(vty
, "%s\n", header
);
11484 json_vrf
= json_object_new_object();
11489 if (ospf
->instance
) {
11491 json_object_int_add(json
, "ospfInstance",
11494 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11497 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11500 vty_out(vty
, "aggregation delay interval :%u(in seconds)\n\n",
11501 ospf
->aggr_delay_interval
);
11503 json_object_int_add(json_vrf
, "aggregation delay interval",
11504 ospf
->aggr_delay_interval
);
11505 json_object_int_add(json_vrf
, "aggregationDelayInterval",
11506 ospf
->aggr_delay_interval
);
11509 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
11511 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
11512 json_object
*json_aggr
= NULL
;
11513 char buf
[PREFIX2STR_BUFFER
];
11515 prefix2str(&aggr
->p
, buf
, sizeof(buf
));
11519 json_aggr
= json_object_new_object();
11521 json_object_object_add(json_vrf
, buf
,
11524 json_object_string_add(json_aggr
,
11525 "Summary address", buf
);
11526 json_object_string_add(json_aggr
,
11527 "summaryAddress", buf
);
11529 json_object_string_add(
11530 json_aggr
, "Metric-type",
11531 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11534 json_object_string_add(
11535 json_aggr
, "metricType",
11536 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11540 #if CONFDATE > 20230131
11541 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
11543 json_object_int_add(json_aggr
, "Metric", mval
);
11544 json_object_int_add(json_aggr
, "metric", mval
);
11546 json_object_int_add(json_aggr
, "Tag",
11548 json_object_int_add(json_aggr
, "tag",
11551 json_object_int_add(
11552 json_aggr
, "External route count",
11553 OSPF_EXTERNAL_RT_COUNT(aggr
));
11554 json_object_int_add(
11555 json_aggr
, "externalRouteCount",
11556 OSPF_EXTERNAL_RT_COUNT(aggr
));
11558 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11560 aggr
->match_extnl_hash
,
11561 ospf_json_external_rt_walkcb
,
11566 vty_out(vty
, "%-20s", buf
);
11568 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11569 ? vty_out(vty
, "%-16s", "E1")
11570 : vty_out(vty
, "%-16s", "E2");
11571 vty_out(vty
, "%-11d", mval
);
11573 vty_out(vty
, "%-12u", aggr
->tag
);
11575 vty_out(vty
, "%-5ld\n",
11576 OSPF_EXTERNAL_RT_COUNT(aggr
));
11578 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11580 "Matched External routes:\n");
11582 aggr
->match_extnl_hash
,
11583 ospf_vty_external_rt_walkcb
,
11585 vty_out(vty
, "\n");
11588 vty_out(vty
, "\n");
11594 json_object_object_add(json
, ospf_get_name(ospf
),
11597 vty_out(vty
, "\n");
11599 return CMD_SUCCESS
;
11602 DEFUN (show_ip_ospf_external_aggregator
,
11603 show_ip_ospf_external_aggregator_cmd
,
11604 "show ip ospf [vrf <NAME|all>] summary-address [detail] [json]",
11606 "OSPF information\n"
11609 "Show external summary addresses\n"
11610 "Detailed information\n"
11613 char *vrf_name
= NULL
;
11614 bool all_vrf
= false;
11615 int ret
= CMD_SUCCESS
;
11618 uint8_t use_vrf
= 0;
11619 bool uj
= use_json(argc
, argv
);
11620 struct ospf
*ospf
= NULL
;
11621 json_object
*json
= NULL
;
11622 struct listnode
*node
= NULL
;
11624 bool detail
= false;
11626 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11628 if (argv_find(argv
, argc
, "detail", &idx
))
11632 json
= json_object_new_object();
11634 /* vrf input is provided */
11638 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11639 if (!ospf
->oi_running
)
11641 ret
= ospf_show_summary_address(
11642 vty
, ospf
, use_vrf
, json
, uj
, detail
);
11646 vty_json(vty
, json
);
11651 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11653 if (ospf
== NULL
|| !ospf
->oi_running
) {
11655 vty_json(vty
, json
);
11658 "%% OSPF is not enabled in vrf %s\n",
11661 return CMD_SUCCESS
;
11663 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11667 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11668 if (ospf
== NULL
|| !ospf
->oi_running
) {
11670 vty_json(vty
, json
);
11673 "%% OSPF is not enabled in vrf default\n");
11675 return CMD_SUCCESS
;
11678 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11682 vty_json(vty
, json
);
11683 return CMD_SUCCESS
;
11686 static const char *const ospf_int_type_str
[] = {
11687 "unknown", /* should never be used. */
11691 "point-to-multipoint",
11692 "virtual-link", /* should never be used. */
11696 static const char *interface_config_auth_str(struct ospf_if_params
*params
)
11698 if (!OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
11699 || params
->auth_type
== OSPF_AUTH_NOTSET
)
11702 /* Translation tables are not that much help
11703 * here due to syntax
11704 * of the simple option */
11705 switch (params
->auth_type
) {
11707 case OSPF_AUTH_NULL
:
11710 case OSPF_AUTH_SIMPLE
:
11713 case OSPF_AUTH_CRYPTOGRAPHIC
:
11714 return " message-digest";
11720 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
11722 struct listnode
*node
;
11723 struct interface
*ifp
;
11724 struct crypt_key
*ck
;
11725 struct route_node
*rn
= NULL
;
11726 struct ospf_if_params
*params
;
11727 const char *auth_str
;
11730 FOR_ALL_INTERFACES (vrf
, ifp
) {
11732 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
11735 if_vty_config_start(vty
, ifp
);
11738 vty_out(vty
, " description %s\n", ifp
->desc
);
11742 params
= IF_DEF_PARAMS(ifp
);
11745 /* Interface Network print. */
11746 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
11747 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
11748 if (params
->type
!= ospf_default_iftype(ifp
)) {
11749 vty_out(vty
, " ip ospf network %s",
11753 == OSPF_IFTYPE_POINTOPOINT
11754 && params
->ptp_dmvpn
)
11755 vty_out(vty
, " dmvpn");
11756 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11757 vty_out(vty
, " %pI4",
11759 vty_out(vty
, "\n");
11763 /* OSPF interface authentication print */
11764 auth_str
= interface_config_auth_str(params
);
11766 vty_out(vty
, " ip ospf authentication%s",
11768 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11769 vty_out(vty
, " %pI4",
11771 vty_out(vty
, "\n");
11774 /* Simple Authentication Password print. */
11775 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
11776 && params
->auth_simple
[0] != '\0') {
11777 vty_out(vty
, " ip ospf authentication-key %s",
11778 params
->auth_simple
);
11779 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11780 vty_out(vty
, " %pI4",
11782 vty_out(vty
, "\n");
11785 /* Cryptographic Authentication Key print. */
11786 if (params
&& params
->auth_crypt
) {
11787 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
11790 " ip ospf message-digest-key %d md5 %s",
11791 ck
->key_id
, ck
->auth_key
);
11792 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11793 vty_out(vty
, " %pI4",
11795 vty_out(vty
, "\n");
11799 /* Interface Output Cost print. */
11800 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
11801 vty_out(vty
, " ip ospf cost %u",
11802 params
->output_cost_cmd
);
11803 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11804 vty_out(vty
, " %pI4",
11806 vty_out(vty
, "\n");
11809 /* Hello Interval print. */
11810 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
11811 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
11812 vty_out(vty
, " ip ospf hello-interval %u",
11814 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11815 vty_out(vty
, " %pI4",
11817 vty_out(vty
, "\n");
11821 /* Router Dead Interval print. */
11822 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
11823 && params
->is_v_wait_set
) {
11824 vty_out(vty
, " ip ospf dead-interval ");
11827 if (OSPF_IF_PARAM_CONFIGURED(params
,
11830 "minimal hello-multiplier %d",
11831 params
->fast_hello
);
11833 vty_out(vty
, "%u", params
->v_wait
);
11835 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11836 vty_out(vty
, " %pI4",
11838 vty_out(vty
, "\n");
11841 /* Router Priority print. */
11842 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
11843 && params
->priority
11844 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
11845 vty_out(vty
, " ip ospf priority %u",
11847 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11848 vty_out(vty
, " %pI4",
11850 vty_out(vty
, "\n");
11853 /* Retransmit Interval print. */
11854 if (OSPF_IF_PARAM_CONFIGURED(params
,
11855 retransmit_interval
)
11856 && params
->retransmit_interval
11857 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
11858 vty_out(vty
, " ip ospf retransmit-interval %u",
11859 params
->retransmit_interval
);
11860 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11861 vty_out(vty
, " %pI4",
11863 vty_out(vty
, "\n");
11866 /* Transmit Delay print. */
11867 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
11868 && params
->transmit_delay
11869 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
11870 vty_out(vty
, " ip ospf transmit-delay %u",
11871 params
->transmit_delay
);
11872 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11873 vty_out(vty
, " %pI4",
11875 vty_out(vty
, "\n");
11879 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
11881 vty_out(vty
, " ip ospf %d",
11884 vty_out(vty
, " ip ospf");
11886 char buf
[INET_ADDRSTRLEN
];
11888 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
11889 params
->if_area_id_fmt
);
11890 vty_out(vty
, " area %s", buf
);
11891 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11892 vty_out(vty
, " %pI4",
11894 vty_out(vty
, "\n");
11898 if (params
&& params
->bfd_config
)
11899 ospf_bfd_write_config(vty
, params
);
11901 /* MTU ignore print. */
11902 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
11903 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
11904 if (params
->mtu_ignore
== 0)
11905 vty_out(vty
, " no ip ospf mtu-ignore");
11907 vty_out(vty
, " ip ospf mtu-ignore");
11908 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11909 vty_out(vty
, " %pI4",
11911 vty_out(vty
, "\n");
11914 if (OSPF_IF_PARAM_CONFIGURED(params
,
11915 passive_interface
)) {
11916 vty_out(vty
, " %sip ospf passive",
11917 params
->passive_interface
11921 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11922 vty_out(vty
, " %pI4", &rn
->p
.u
.prefix4
);
11923 vty_out(vty
, "\n");
11926 /* LDP-Sync print */
11927 if (params
&& params
->ldp_sync_info
)
11928 ospf_ldp_sync_if_write_config(vty
, params
);
11932 rn
= route_top(IF_OIFS_PARAMS(ifp
));
11934 rn
= route_next(rn
);
11939 if (params
!= NULL
)
11944 ospf_opaque_config_write_if(vty
, ifp
);
11946 if_vty_config_end(vty
);
11952 /* Configuration write function for ospfd. */
11953 static int config_write_interface(struct vty
*vty
)
11956 struct vrf
*vrf
= NULL
;
11958 /* Display all VRF aware OSPF interface configuration */
11959 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
11960 write
+= config_write_interface_one(vty
, vrf
);
11966 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
11968 struct route_node
*rn
;
11969 char buf
[INET_ADDRSTRLEN
];
11971 /* `network area' print. */
11972 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
11974 struct ospf_network
*n
= rn
->info
;
11976 /* Create Area ID string by specified Area ID format. */
11977 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
11978 inet_ntop(AF_INET
, &n
->area_id
, buf
,
11981 snprintf(buf
, sizeof(buf
), "%lu",
11982 (unsigned long int)ntohl(
11983 n
->area_id
.s_addr
));
11985 /* Network print. */
11986 vty_out(vty
, " network %pFX area %s\n", &rn
->p
, buf
);
11992 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
11994 struct listnode
*node
;
11995 struct ospf_area
*area
;
11996 char buf
[INET_ADDRSTRLEN
];
11998 /* Area configuration print. */
11999 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
12000 struct route_node
*rn1
;
12002 area_id2str(buf
, sizeof(buf
), &area
->area_id
,
12003 area
->area_id_fmt
);
12005 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
12006 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
12007 vty_out(vty
, " area %s authentication\n", buf
);
12010 " area %s authentication message-digest\n",
12014 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
12015 vty_out(vty
, " area %s shortcut %s\n", buf
,
12016 ospf_shortcut_mode_str
12017 [area
->shortcut_configured
]);
12019 if ((area
->external_routing
== OSPF_AREA_STUB
)
12020 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
12021 if (area
->external_routing
== OSPF_AREA_STUB
) {
12022 vty_out(vty
, " area %s stub", buf
);
12023 if (area
->no_summary
)
12024 vty_out(vty
, " no-summary\n");
12025 vty_out(vty
, "\n");
12026 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
12027 switch (area
->NSSATranslatorRole
) {
12028 case OSPF_NSSA_ROLE_NEVER
:
12030 " area %s nssa translate-never\n",
12033 case OSPF_NSSA_ROLE_ALWAYS
:
12035 " area %s nssa translate-always\n",
12038 case OSPF_NSSA_ROLE_CANDIDATE
:
12039 vty_out(vty
, " area %s nssa \n", buf
);
12042 if (area
->no_summary
)
12044 " area %s nssa no-summary\n",
12046 if (area
->suppress_fa
)
12048 " area %s nssa suppress-fa\n",
12052 if (area
->default_cost
!= 1)
12053 vty_out(vty
, " area %s default-cost %d\n", buf
,
12054 area
->default_cost
);
12057 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
12059 struct ospf_area_range
*range
= rn1
->info
;
12061 vty_out(vty
, " area %s range %pFX", buf
,
12064 if (range
->cost_config
12065 != OSPF_AREA_RANGE_COST_UNSPEC
)
12066 vty_out(vty
, " cost %d",
12067 range
->cost_config
);
12069 if (!CHECK_FLAG(range
->flags
,
12070 OSPF_AREA_RANGE_ADVERTISE
))
12071 vty_out(vty
, " not-advertise");
12073 if (CHECK_FLAG(range
->flags
,
12074 OSPF_AREA_RANGE_SUBSTITUTE
))
12075 vty_out(vty
, " substitute %pI4/%d",
12076 &range
->subst_addr
,
12077 range
->subst_masklen
);
12079 vty_out(vty
, "\n");
12082 if (EXPORT_NAME(area
))
12083 vty_out(vty
, " area %s export-list %s\n", buf
,
12084 EXPORT_NAME(area
));
12086 if (IMPORT_NAME(area
))
12087 vty_out(vty
, " area %s import-list %s\n", buf
,
12088 IMPORT_NAME(area
));
12090 if (PREFIX_NAME_IN(area
))
12091 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
12092 PREFIX_NAME_IN(area
));
12094 if (PREFIX_NAME_OUT(area
))
12095 vty_out(vty
, " area %s filter-list prefix %s out\n",
12096 buf
, PREFIX_NAME_OUT(area
));
12102 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
12104 struct ospf_nbr_nbma
*nbr_nbma
;
12105 struct route_node
*rn
;
12107 /* Static Neighbor configuration print. */
12108 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
12109 if ((nbr_nbma
= rn
->info
)) {
12110 vty_out(vty
, " neighbor %pI4", &nbr_nbma
->addr
);
12112 if (nbr_nbma
->priority
12113 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
12114 vty_out(vty
, " priority %d",
12115 nbr_nbma
->priority
);
12117 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
12118 vty_out(vty
, " poll-interval %d",
12121 vty_out(vty
, "\n");
12127 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
12129 struct listnode
*node
;
12130 struct ospf_vl_data
*vl_data
;
12131 const char *auth_str
;
12132 char buf
[INET_ADDRSTRLEN
];
12134 /* Virtual-Link print */
12135 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
12136 struct listnode
*n2
;
12137 struct crypt_key
*ck
;
12138 struct ospf_interface
*oi
;
12140 if (vl_data
!= NULL
) {
12141 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
12142 vl_data
->vl_area_id_fmt
);
12143 oi
= vl_data
->vl_oi
;
12146 if (OSPF_IF_PARAM(oi
, v_hello
)
12147 != OSPF_HELLO_INTERVAL_DEFAULT
12148 || OSPF_IF_PARAM(oi
, v_wait
)
12149 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
12150 || OSPF_IF_PARAM(oi
, retransmit_interval
)
12151 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
12152 || OSPF_IF_PARAM(oi
, transmit_delay
)
12153 != OSPF_TRANSMIT_DELAY_DEFAULT
)
12155 " area %s virtual-link %pI4 hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
12156 buf
, &vl_data
->vl_peer
,
12157 OSPF_IF_PARAM(oi
, v_hello
),
12158 OSPF_IF_PARAM(oi
, retransmit_interval
),
12159 OSPF_IF_PARAM(oi
, transmit_delay
),
12160 OSPF_IF_PARAM(oi
, v_wait
));
12162 vty_out(vty
, " area %s virtual-link %pI4\n", buf
,
12163 &vl_data
->vl_peer
);
12165 auth_str
= interface_config_auth_str(
12166 IF_DEF_PARAMS(oi
->ifp
));
12169 " area %s virtual-link %pI4 authentication%s\n",
12170 buf
, &vl_data
->vl_peer
, auth_str
);
12172 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
12175 " area %s virtual-link %pI4 authentication-key %s\n",
12176 buf
, &vl_data
->vl_peer
,
12177 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12180 for (ALL_LIST_ELEMENTS_RO(
12181 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12185 " area %s virtual-link %pI4 message-digest-key %d md5 %s\n",
12186 buf
, &vl_data
->vl_peer
,
12187 ck
->key_id
, ck
->auth_key
);
12195 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
12199 /* redistribute print. */
12200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
12201 struct list
*red_list
;
12202 struct listnode
*node
;
12203 struct ospf_redist
*red
;
12205 red_list
= ospf
->redist
[type
];
12209 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12210 vty_out(vty
, " redistribute %s",
12211 zebra_route_string(type
));
12213 vty_out(vty
, " %d", red
->instance
);
12215 if (red
->dmetric
.value
>= 0)
12216 vty_out(vty
, " metric %d", red
->dmetric
.value
);
12218 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12219 vty_out(vty
, " metric-type 1");
12221 if (ROUTEMAP_NAME(red
))
12222 vty_out(vty
, " route-map %s",
12223 ROUTEMAP_NAME(red
));
12225 vty_out(vty
, "\n");
12232 static int ospf_cfg_write_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
12235 struct advRtr
*rtr
= bucket
->data
;
12236 struct vty
*vty
= (struct vty
*)arg
;
12238 vty_out(vty
, " graceful-restart helper enable %pI4\n",
12240 return HASHWALK_CONTINUE
;
12243 static void config_write_ospf_gr(struct vty
*vty
, struct ospf
*ospf
)
12245 if (!ospf
->gr_info
.restart_support
)
12248 if (ospf
->gr_info
.grace_period
== OSPF_DFLT_GRACE_INTERVAL
)
12249 vty_out(vty
, " graceful-restart\n");
12251 vty_out(vty
, " graceful-restart grace-period %u\n",
12252 ospf
->gr_info
.grace_period
);
12255 static int config_write_ospf_gr_helper(struct vty
*vty
, struct ospf
*ospf
)
12257 if (ospf
->is_helper_supported
)
12258 vty_out(vty
, " graceful-restart helper enable\n");
12260 if (!ospf
->strict_lsa_check
)
12262 " no graceful-restart helper strict-lsa-checking\n");
12264 if (ospf
->only_planned_restart
)
12265 vty_out(vty
, " graceful-restart helper planned-only\n");
12267 if (ospf
->supported_grace_time
!= OSPF_MAX_GRACE_INTERVAL
)
12269 " graceful-restart helper supported-grace-time %d\n",
12270 ospf
->supported_grace_time
);
12272 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
12273 hash_walk(ospf
->enable_rtr_list
,
12274 ospf_cfg_write_helper_dis_rtr_walkcb
, vty
);
12279 static int config_write_ospf_external_aggregator(struct vty
*vty
,
12282 struct route_node
*rn
;
12284 if (ospf
->aggr_delay_interval
!= OSPF_EXTL_AGGR_DEFAULT_DELAY
)
12285 vty_out(vty
, " aggregation timer %u\n",
12286 ospf
->aggr_delay_interval
);
12288 /* print 'summary-address A.B.C.D/M' */
12289 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
12291 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
12293 vty_out(vty
, " summary-address %pI4/%d",
12294 &aggr
->p
.prefix
, aggr
->p
.prefixlen
);
12296 vty_out(vty
, " tag %u", aggr
->tag
);
12298 if (CHECK_FLAG(aggr
->flags
,
12299 OSPF_EXTERNAL_AGGRT_NO_ADVERTISE
))
12300 vty_out(vty
, " no-advertise");
12302 vty_out(vty
, "\n");
12308 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
12310 if (ospf
->default_metric
!= -1)
12311 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
12315 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
12318 struct ospf_redist
*red
;
12321 /* distribute-list print. */
12322 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
12323 if (DISTRIBUTE_NAME(ospf
, type
))
12324 vty_out(vty
, " distribute-list %s out %s\n",
12325 DISTRIBUTE_NAME(ospf
, type
),
12326 zebra_route_string(type
));
12328 /* default-information print. */
12329 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
12330 vty_out(vty
, " default-information originate");
12331 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
12332 vty_out(vty
, " always");
12334 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
12336 if (red
->dmetric
.value
>= 0)
12337 vty_out(vty
, " metric %d",
12338 red
->dmetric
.value
);
12340 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12341 vty_out(vty
, " metric-type 1");
12343 if (ROUTEMAP_NAME(red
))
12344 vty_out(vty
, " route-map %s",
12345 ROUTEMAP_NAME(red
));
12348 vty_out(vty
, "\n");
12355 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
12357 struct route_node
*rn
;
12358 struct ospf_distance
*odistance
;
12360 if (ospf
->distance_all
)
12361 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
12363 if (ospf
->distance_intra
|| ospf
->distance_inter
12364 || ospf
->distance_external
) {
12365 vty_out(vty
, " distance ospf");
12367 if (ospf
->distance_intra
)
12368 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
12369 if (ospf
->distance_inter
)
12370 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
12371 if (ospf
->distance_external
)
12372 vty_out(vty
, " external %d", ospf
->distance_external
);
12374 vty_out(vty
, "\n");
12377 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
12378 if ((odistance
= rn
->info
) != NULL
) {
12379 vty_out(vty
, " distance %d %pFX %s\n",
12380 odistance
->distance
, &rn
->p
,
12381 odistance
->access_list
? odistance
->access_list
12387 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
12391 /* `router ospf' print. */
12392 if (ospf
->instance
&& strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12393 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
12395 } else if (ospf
->instance
) {
12396 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
12397 } else if (strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12398 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
12400 vty_out(vty
, "router ospf\n");
12402 if (!ospf
->networks
) {
12407 /* Router ID print. */
12408 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
12409 vty_out(vty
, " ospf router-id %pI4\n",
12410 &ospf
->router_id_static
);
12412 /* zebra opaque attributes configuration. */
12413 if (CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
))
12414 vty_out(vty
, " ospf send-extra-data zebra\n");
12416 /* ABR type print. */
12417 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
12418 vty_out(vty
, " ospf abr-type %s\n",
12419 ospf_abr_type_str
[ospf
->abr_type
]);
12421 /* log-adjacency-changes flag print. */
12422 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
12423 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
12424 vty_out(vty
, " log-adjacency-changes detail\n");
12425 else if (!SAVE_OSPF_LOG_ADJACENCY_CHANGES
)
12426 vty_out(vty
, " log-adjacency-changes\n");
12427 } else if (SAVE_OSPF_LOG_ADJACENCY_CHANGES
) {
12428 vty_out(vty
, " no log-adjacency-changes\n");
12431 /* RFC1583 compatibility flag print -- Compatible with CISCO
12433 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
12434 vty_out(vty
, " compatible rfc1583\n");
12436 /* auto-cost reference-bandwidth configuration. */
12437 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
12439 "! Important: ensure reference bandwidth is consistent across all routers\n");
12440 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
12441 ospf
->ref_bandwidth
);
12444 /* SPF timers print. */
12445 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
12446 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
12447 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
12448 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
12449 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
12451 /* LSA timers print. */
12452 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
12453 vty_out(vty
, " timers throttle lsa all %d\n",
12454 ospf
->min_ls_interval
);
12455 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
12456 vty_out(vty
, " timers lsa min-arrival %d\n",
12457 ospf
->min_ls_arrival
);
12459 /* Write multiplier print. */
12460 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
12461 vty_out(vty
, " ospf write-multiplier %d\n",
12462 ospf
->write_oi_count
);
12464 if (ospf
->max_multipath
!= MULTIPATH_NUM
)
12465 vty_out(vty
, " maximum-paths %d\n", ospf
->max_multipath
);
12467 /* Max-metric router-lsa print */
12468 config_write_stub_router(vty
, ospf
);
12470 /* SPF refresh parameters print. */
12471 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
12472 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
12474 /* Redistribute information print. */
12475 config_write_ospf_redistribute(vty
, ospf
);
12477 /* Graceful Restart print */
12478 config_write_ospf_gr(vty
, ospf
);
12479 config_write_ospf_gr_helper(vty
, ospf
);
12481 /* Print external route aggregation. */
12482 config_write_ospf_external_aggregator(vty
, ospf
);
12484 /* passive-interface print. */
12485 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
12486 vty_out(vty
, " passive-interface default\n");
12488 /* proactive-arp print. */
12489 if (ospf
->proactive_arp
!= OSPF_PROACTIVE_ARP_DEFAULT
) {
12490 if (ospf
->proactive_arp
)
12491 vty_out(vty
, " proactive-arp\n");
12493 vty_out(vty
, " no proactive-arp\n");
12496 /* TI-LFA print. */
12497 if (ospf
->ti_lfa_enabled
) {
12498 if (ospf
->ti_lfa_protection_type
== OSPF_TI_LFA_NODE_PROTECTION
)
12499 vty_out(vty
, " fast-reroute ti-lfa node-protection\n");
12501 vty_out(vty
, " fast-reroute ti-lfa\n");
12504 /* Network area print. */
12505 config_write_network_area(vty
, ospf
);
12507 /* Area config print. */
12508 config_write_ospf_area(vty
, ospf
);
12510 /* static neighbor print. */
12511 config_write_ospf_nbr_nbma(vty
, ospf
);
12513 /* Virtual-Link print. */
12514 config_write_virtual_link(vty
, ospf
);
12516 /* Default metric configuration. */
12517 config_write_ospf_default_metric(vty
, ospf
);
12519 /* Distribute-list and default-information print. */
12520 config_write_ospf_distribute(vty
, ospf
);
12522 /* Distance configuration. */
12523 config_write_ospf_distance(vty
, ospf
);
12525 ospf_opaque_config_write_router(vty
, ospf
);
12527 /* LDP-Sync print */
12528 ospf_ldp_sync_write_config(vty
, ospf
);
12530 vty_out(vty
, "exit\n");
12536 /* OSPF configuration write function. */
12537 static int ospf_config_write(struct vty
*vty
)
12540 struct listnode
*ospf_node
= NULL
;
12543 if (listcount(om
->ospf
) == 0)
12546 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
12547 /* VRF Default check if it is running.
12548 * Upon daemon start, there could be default instance
12549 * in absence of 'router ospf'/oi_running is disabled. */
12550 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
12551 write
+= ospf_config_write_one(vty
, ospf
);
12552 /* For Non-Default VRF simply display the configuration,
12553 * even if it is not oi_running. */
12554 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
12555 write
+= ospf_config_write_one(vty
, ospf
);
12560 void ospf_vty_show_init(void)
12562 /* "show ip ospf" commands. */
12563 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
12565 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
12567 /* "show ip ospf database" commands. */
12568 install_element(VIEW_NODE
, &show_ip_ospf_database_cmd
);
12569 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
12570 install_element(VIEW_NODE
,
12571 &show_ip_ospf_database_type_adv_router_cmd
);
12572 install_element(VIEW_NODE
,
12573 &show_ip_ospf_instance_database_type_adv_router_cmd
);
12574 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
12575 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
12577 /* "show ip ospf interface" commands. */
12578 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
12580 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
12581 /* "show ip ospf interface traffic */
12582 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
12584 /* "show ip ospf neighbor" commands. */
12585 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
12586 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
12587 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
12588 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
12589 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
12590 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
12591 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
12593 install_element(VIEW_NODE
,
12594 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
12595 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
12596 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
12597 install_element(VIEW_NODE
,
12598 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
12599 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
12600 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
12601 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
12603 /* "show ip ospf route" commands. */
12604 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
12605 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
12607 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
12608 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
12610 /* "show ip ospf vrfs" commands. */
12611 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
12613 /* "show ip ospf gr-helper details" command */
12614 install_element(VIEW_NODE
, &show_ip_ospf_gr_helper_cmd
);
12616 /* "show ip ospf summary-address" command */
12617 install_element(VIEW_NODE
, &show_ip_ospf_external_aggregator_cmd
);
12620 /* Initialization of OSPF interface. */
12621 static void ospf_vty_if_init(void)
12623 /* Install interface node. */
12624 if_cmd_init(config_write_interface
);
12626 /* "ip ospf authentication" commands. */
12627 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
12628 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
12629 install_element(INTERFACE_NODE
,
12630 &no_ip_ospf_authentication_args_addr_cmd
);
12631 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
12632 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
12633 install_element(INTERFACE_NODE
,
12634 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
12635 install_element(INTERFACE_NODE
,
12636 &no_ospf_authentication_key_authkey_addr_cmd
);
12638 /* "ip ospf message-digest-key" commands. */
12639 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
12640 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
12642 /* "ip ospf cost" commands. */
12643 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
12644 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
12646 /* "ip ospf mtu-ignore" commands. */
12647 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
12648 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
12650 /* "ip ospf dead-interval" commands. */
12651 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
12652 install_element(INTERFACE_NODE
,
12653 &ip_ospf_dead_interval_minimal_addr_cmd
);
12654 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
12656 /* "ip ospf hello-interval" commands. */
12657 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
12658 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
12660 /* "ip ospf network" commands. */
12661 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
12662 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
12664 /* "ip ospf priority" commands. */
12665 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
12666 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
12668 /* "ip ospf retransmit-interval" commands. */
12669 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
12670 install_element(INTERFACE_NODE
,
12671 &no_ip_ospf_retransmit_interval_addr_cmd
);
12673 /* "ip ospf transmit-delay" commands. */
12674 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
12675 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
12677 /* "ip ospf area" commands. */
12678 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
12679 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
12681 /* "ip ospf passive" commands. */
12682 install_element(INTERFACE_NODE
, &ip_ospf_passive_cmd
);
12683 install_element(INTERFACE_NODE
, &no_ip_ospf_passive_cmd
);
12685 /* These commands are compatibitliy for previous version. */
12686 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
12687 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
12688 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
12689 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
12690 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
12691 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
12692 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
12693 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
12694 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
12695 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
12696 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
12697 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
12698 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
12699 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
12700 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
12701 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
12702 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
12705 static void ospf_vty_zebra_init(void)
12707 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
12708 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
12709 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
12710 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
12712 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
12713 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
12715 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
12716 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
12718 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
12719 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
12721 install_element(OSPF_NODE
, &ospf_distance_cmd
);
12722 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
12723 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
12724 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
12726 /*Ospf garcefull restart helper configurations */
12727 install_element(OSPF_NODE
, &ospf_gr_helper_enable_cmd
);
12728 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_cmd
);
12729 install_element(OSPF_NODE
, &ospf_gr_helper_only_cmd
);
12730 install_element(OSPF_NODE
, &no_ospf_gr_helper_only_cmd
);
12731 install_element(OSPF_NODE
, &ospf_gr_helper_enable_lsacheck_cmd
);
12732 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_lsacheck_cmd
);
12733 install_element(OSPF_NODE
, &ospf_gr_helper_supported_grace_time_cmd
);
12734 install_element(OSPF_NODE
, &no_ospf_gr_helper_supported_grace_time_cmd
);
12735 install_element(OSPF_NODE
, &ospf_gr_helper_planned_only_cmd
);
12736 install_element(OSPF_NODE
, &no_ospf_gr_helper_planned_only_cmd
);
12738 /* External LSA summarisation config commands.*/
12739 install_element(OSPF_NODE
, &ospf_external_route_aggregation_cmd
);
12740 install_element(OSPF_NODE
, &no_ospf_external_route_aggregation_cmd
);
12741 install_element(OSPF_NODE
,
12742 &ospf_external_route_aggregation_no_adrvertise_cmd
);
12743 install_element(OSPF_NODE
,
12744 &no_ospf_external_route_aggregation_no_adrvertise_cmd
);
12745 install_element(OSPF_NODE
, &ospf_route_aggregation_timer_cmd
);
12746 install_element(OSPF_NODE
, &no_ospf_route_aggregation_timer_cmd
);
12749 static int ospf_config_write(struct vty
*vty
);
12750 static struct cmd_node ospf_node
= {
12753 .parent_node
= CONFIG_NODE
,
12754 .prompt
= "%s(config-router)# ",
12755 .config_write
= ospf_config_write
,
12758 static void ospf_interface_clear(struct interface
*ifp
)
12760 if (!if_is_operative(ifp
))
12763 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
12764 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
12766 ospf_if_reset(ifp
);
12769 DEFUN (clear_ip_ospf_interface
,
12770 clear_ip_ospf_interface_cmd
,
12771 "clear ip ospf [vrf NAME] interface [IFNAME]",
12774 "OSPF information\n"
12776 "Interface information\n"
12777 "Interface name\n")
12779 int idx_ifname
= 0;
12781 struct interface
*ifp
;
12782 struct listnode
*node
;
12783 struct ospf
*ospf
= NULL
;
12784 char *vrf_name
= NULL
;
12785 vrf_id_t vrf_id
= VRF_DEFAULT
;
12786 struct vrf
*vrf
= NULL
;
12788 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
12789 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
12790 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
12793 vrf
= vrf_lookup_by_name(vrf_name
);
12795 vrf_id
= vrf
->vrf_id
;
12797 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
12798 /* Clear all the ospfv2 interfaces. */
12799 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
12800 if (vrf_id
!= ospf
->vrf_id
)
12803 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
12804 FOR_ALL_INTERFACES (vrf
, ifp
)
12805 ospf_interface_clear(ifp
);
12808 /* Interface name is specified. */
12809 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
12811 vty_out(vty
, "No such interface name\n");
12813 ospf_interface_clear(ifp
);
12816 return CMD_SUCCESS
;
12819 void ospf_vty_clear_init(void)
12821 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
12822 install_element(ENABLE_NODE
, &clear_ip_ospf_process_cmd
);
12823 install_element(ENABLE_NODE
, &clear_ip_ospf_neighbor_cmd
);
12827 /* Install OSPF related vty commands. */
12828 void ospf_vty_init(void)
12830 /* Install ospf top node. */
12831 install_node(&ospf_node
);
12833 /* "router ospf" commands. */
12834 install_element(CONFIG_NODE
, &router_ospf_cmd
);
12835 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
12838 install_default(OSPF_NODE
);
12840 /* "ospf router-id" commands. */
12841 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
12842 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
12843 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
12845 /* "passive-interface" commands. */
12846 install_element(OSPF_NODE
, &ospf_passive_interface_default_cmd
);
12847 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
12848 install_element(OSPF_NODE
, &no_ospf_passive_interface_default_cmd
);
12849 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
12851 /* "ospf abr-type" commands. */
12852 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
12853 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
12855 /* "ospf log-adjacency-changes" commands. */
12856 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
12857 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
12858 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
12859 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
12861 /* "ospf rfc1583-compatible" commands. */
12862 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
12863 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
12864 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
12865 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
12867 /* "ospf send-extra-data zebra" commands. */
12868 install_element(OSPF_NODE
, &ospf_send_extra_data_cmd
);
12870 /* "network area" commands. */
12871 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
12872 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
12874 /* "area authentication" commands. */
12875 install_element(OSPF_NODE
,
12876 &ospf_area_authentication_message_digest_cmd
);
12877 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
12878 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
12880 /* "area range" commands. */
12881 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
12882 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
12883 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
12884 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
12885 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
12887 /* "area virtual-link" commands. */
12888 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
12889 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
12890 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
12891 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
12894 /* "area stub" commands. */
12895 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
12896 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
12897 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
12898 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
12900 /* "area nssa" commands. */
12901 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
12902 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
12903 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
12904 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
12905 install_element(OSPF_NODE
, &ospf_area_nssa_suppress_fa_cmd
);
12906 install_element(OSPF_NODE
, &no_ospf_area_nssa_suppress_fa_cmd
);
12907 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
12909 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
12910 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
12912 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
12913 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
12915 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
12916 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
12918 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
12919 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
12921 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
12922 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
12924 /* SPF timer commands */
12925 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
12926 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
12928 /* LSA timers commands */
12929 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
12930 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
12931 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
12932 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
12934 /* refresh timer commands */
12935 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
12936 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
12938 /* max-metric commands */
12939 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
12940 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
12941 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
12942 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
12943 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
12944 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
12946 /* reference bandwidth commands */
12947 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
12948 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
12950 /* "neighbor" commands. */
12951 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
12952 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
12953 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
12954 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
12956 /* write multiplier commands */
12957 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
12958 install_element(OSPF_NODE
, &write_multiplier_cmd
);
12959 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
12960 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
12962 /* "proactive-arp" commands. */
12963 install_element(OSPF_NODE
, &ospf_proactive_arp_cmd
);
12964 install_element(OSPF_NODE
, &no_ospf_proactive_arp_cmd
);
12966 /* TI-LFA commands */
12967 install_element(OSPF_NODE
, &ospf_ti_lfa_cmd
);
12968 install_element(OSPF_NODE
, &no_ospf_ti_lfa_cmd
);
12970 /* Max path configurations */
12971 install_element(OSPF_NODE
, &ospf_max_multipath_cmd
);
12972 install_element(OSPF_NODE
, &no_ospf_max_multipath_cmd
);
12974 vrf_cmd_init(NULL
);
12976 /* Init interface related vty commands. */
12977 ospf_vty_if_init();
12979 /* Init zebra related vty commands. */
12980 ospf_vty_zebra_init();