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
, 16);
4398 #if CONFDATE > 20230321
4399 CPP_NOTICE("Remove show_ip_ospf_neighbor_sub() JSON keys: priority, state, deadTimeMsecs, address, retransmitCounter, requestCounter, dbSummaryCounter")
4401 json_object_int_add(json_neighbor
, "priority",
4403 json_object_string_add(json_neighbor
, "state",
4405 json_object_int_add(json_neighbor
,
4408 json_object_string_add(json_neighbor
,
4409 "nbrState", msgbuf
);
4411 json_object_string_add(
4412 json_neighbor
, "converged",
4413 lookup_msg(ospf_nsm_state_msg
,
4415 json_object_string_add(
4416 json_neighbor
, "role",
4417 lookup_msg(ospf_ism_state_msg
,
4418 ospf_nbr_ism_state(nbr
),
4421 if (nbr
->t_inactivity
) {
4424 time_store
= monotime_until(
4429 json_object_int_add(json_neighbor
,
4432 json_object_int_add(json_neighbor
,
4435 json_object_int_add(
4437 "routerDeadIntervalTimerDueMsec",
4439 json_object_string_add(
4440 json_neighbor
, "upTime",
4444 json_object_string_add(
4445 json_neighbor
, "deadTime",
4451 json_object_string_add(json_neighbor
,
4454 json_object_string_add(
4456 "routerDeadIntervalTimerDueMsec",
4459 json_object_string_addf(json_neighbor
,
4462 json_object_string_addf(json_neighbor
,
4463 "ifaceAddress", "%pI4",
4465 json_object_string_add(json_neighbor
,
4468 json_object_int_add(
4469 json_neighbor
, "retransmitCounter",
4470 ospf_ls_retransmit_count(nbr
));
4471 json_object_int_add(
4473 "linkStateRetransmissionListCounter",
4474 ospf_ls_retransmit_count(nbr
));
4475 json_object_int_add(json_neighbor
,
4477 ospf_ls_request_count(nbr
));
4478 json_object_int_add(
4480 "linkStateRequestListCounter",
4481 ospf_ls_request_count(nbr
));
4482 json_object_int_add(json_neighbor
,
4484 ospf_db_summary_count(nbr
));
4485 json_object_int_add(
4487 "databaseSummaryListCounter",
4488 ospf_db_summary_count(nbr
));
4490 json_object_array_add(json_neigh_array
,
4493 ospf_nbr_ism_state_message(nbr
, msgbuf
, 16);
4495 if (nbr
->state
== NSM_Attempt
4496 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4497 vty_out(vty
, "%-15s %3d %-15s ", "-",
4498 nbr
->priority
, msgbuf
);
4500 vty_out(vty
, "%-15pI4 %3d %-15s ",
4501 &nbr
->router_id
, nbr
->priority
,
4504 vty_out(vty
, "%-15s ",
4505 ospf_timeval_dump(&res
, uptime
,
4508 vty_out(vty
, "%9s ",
4509 ospf_timer_dump(nbr
->t_inactivity
,
4512 vty_out(vty
, "%-15pI4 ", &nbr
->src
);
4513 vty_out(vty
, "%-32s %5ld %5ld %5d\n",
4515 ospf_ls_retransmit_count(nbr
),
4516 ospf_ls_request_count(nbr
),
4517 ospf_db_summary_count(nbr
));
4524 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4525 json_object
*json
, bool use_json
,
4528 struct ospf_interface
*oi
;
4529 struct listnode
*node
;
4530 json_object
*json_vrf
= NULL
;
4531 json_object
*json_nbr_sub
= NULL
;
4535 json_vrf
= json_object_new_object();
4538 json_nbr_sub
= json_object_new_object();
4541 if (ospf
->instance
) {
4543 json_object_int_add(json
, "ospfInstance",
4546 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4549 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4551 show_ip_ospf_neighbour_header(vty
);
4553 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4554 if (ospf_interface_neighbor_count(oi
) == 0)
4556 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4560 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4562 json_object_object_add(json
, ospf_get_name(ospf
),
4570 DEFUN (show_ip_ospf_neighbor
,
4571 show_ip_ospf_neighbor_cmd
,
4572 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4575 "OSPF information\n"
4582 bool uj
= use_json(argc
, argv
);
4583 struct listnode
*node
= NULL
;
4584 char *vrf_name
= NULL
;
4585 bool all_vrf
= false;
4586 int ret
= CMD_SUCCESS
;
4589 uint8_t use_vrf
= 0;
4590 json_object
*json
= NULL
;
4592 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4595 json
= json_object_new_object();
4597 /* vrf input is provided could be all or specific vrf*/
4601 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4602 if (!ospf
->oi_running
)
4604 ret
= show_ip_ospf_neighbor_common(
4605 vty
, ospf
, json
, uj
, use_vrf
);
4609 vty_json(vty
, json
);
4611 vty_out(vty
, "OSPF is not enabled\n");
4616 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4617 if (ospf
== NULL
|| !ospf
->oi_running
) {
4619 vty_json(vty
, json
);
4622 "%% OSPF is not enabled in vrf %s\n",
4628 /* Display default ospf (instance 0) info */
4629 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4630 if (ospf
== NULL
|| !ospf
->oi_running
) {
4632 vty_json(vty
, json
);
4635 "%% OSPF is not enabled in vrf default\n");
4642 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4646 vty_out(vty
, "%s\n",
4647 json_object_to_json_string_ext(
4648 json
, JSON_C_TO_STRING_PRETTY
));
4653 json_object_free(json
);
4659 DEFUN (show_ip_ospf_instance_neighbor
,
4660 show_ip_ospf_instance_neighbor_cmd
,
4661 "show ip ospf (1-65535) neighbor [json]",
4664 "OSPF information\n"
4671 unsigned short instance
= 0;
4672 bool uj
= use_json(argc
, argv
);
4673 json_object
*json
= NULL
;
4674 int ret
= CMD_SUCCESS
;
4676 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4677 if (instance
!= ospf_instance
)
4678 return CMD_NOT_MY_INSTANCE
;
4680 ospf
= ospf_lookup_instance(instance
);
4681 if (!ospf
|| !ospf
->oi_running
)
4685 json
= json_object_new_object();
4687 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4690 vty_json(vty
, json
);
4695 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4696 json_object
*json
, bool use_json
,
4699 struct listnode
*node
;
4700 struct ospf_interface
*oi
;
4701 char buf
[PREFIX_STRLEN
];
4702 json_object
*json_vrf
= NULL
;
4703 json_object
*json_neighbor_sub
= NULL
;
4707 json_vrf
= json_object_new_object();
4712 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4714 show_ip_ospf_neighbour_header(vty
);
4716 if (ospf
->instance
) {
4718 json_object_int_add(json_vrf
, "ospfInstance",
4721 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4724 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4725 struct listnode
*nbr_node
;
4726 struct ospf_nbr_nbma
*nbr_nbma
;
4728 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4730 /* print Down neighbor status */
4731 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4732 if (nbr_nbma
->nbr
== NULL
4733 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4736 json_object_new_object();
4737 json_object_int_add(json_neighbor_sub
,
4739 nbr_nbma
->priority
);
4740 json_object_boolean_true_add(
4743 json_object_string_add(
4747 json_object_int_add(
4749 "nbrNbmaRetransmitCounter", 0);
4750 json_object_int_add(
4752 "nbrNbmaRequestCounter", 0);
4753 json_object_int_add(
4755 "nbrNbmaDbSummaryCounter", 0);
4756 json_object_object_add(
4759 &nbr_nbma
->addr
, buf
,
4763 vty_out(vty
, "%-15s %3d %-15s %9s ",
4764 "-", nbr_nbma
->priority
, "Down",
4767 "%-32pI4 %-20s %5d %5d %5d\n",
4769 IF_NAME(oi
), 0, 0, 0);
4777 json_object_object_add(json
, ospf_get_name(ospf
),
4785 DEFUN (show_ip_ospf_neighbor_all
,
4786 show_ip_ospf_neighbor_all_cmd
,
4787 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4790 "OSPF information\n"
4794 "include down status neighbor\n"
4798 bool uj
= use_json(argc
, argv
);
4799 struct listnode
*node
= NULL
;
4800 char *vrf_name
= NULL
;
4801 bool all_vrf
= false;
4802 int ret
= CMD_SUCCESS
;
4805 uint8_t use_vrf
= 0;
4806 json_object
*json
= NULL
;
4808 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4811 json
= json_object_new_object();
4813 /* vrf input is provided could be all or specific vrf*/
4817 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4818 if (!ospf
->oi_running
)
4820 ret
= show_ip_ospf_neighbor_all_common(
4821 vty
, ospf
, json
, uj
, use_vrf
);
4825 vty_json(vty
, json
);
4830 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4831 if (ospf
== NULL
|| !ospf
->oi_running
) {
4833 json_object_free(json
);
4837 /* Display default ospf (instance 0) info */
4838 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4839 if (ospf
== NULL
|| !ospf
->oi_running
) {
4841 json_object_free(json
);
4847 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4850 vty_out(vty
, "%s\n",
4851 json_object_to_json_string_ext(
4852 json
, JSON_C_TO_STRING_PRETTY
));
4857 json_object_free(json
);
4862 DEFUN (show_ip_ospf_instance_neighbor_all
,
4863 show_ip_ospf_instance_neighbor_all_cmd
,
4864 "show ip ospf (1-65535) neighbor all [json]",
4867 "OSPF information\n"
4870 "include down status neighbor\n"
4875 unsigned short instance
= 0;
4876 bool uj
= use_json(argc
, argv
);
4877 json_object
*json
= NULL
;
4878 int ret
= CMD_SUCCESS
;
4880 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4881 if (instance
!= ospf_instance
)
4882 return CMD_NOT_MY_INSTANCE
;
4884 ospf
= ospf_lookup_instance(instance
);
4885 if (!ospf
|| !ospf
->oi_running
)
4888 json
= json_object_new_object();
4890 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4893 vty_json(vty
, json
);
4898 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4900 struct cmd_token
**argv
,
4901 bool use_json
, uint8_t use_vrf
)
4903 struct interface
*ifp
;
4904 struct route_node
*rn
;
4905 json_object
*json
= NULL
;
4908 json
= json_object_new_object();
4910 if (ospf
->instance
) {
4912 json_object_int_add(json
, "ospfInstance",
4915 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4918 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4920 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4923 json_object_boolean_true_add(json
, "noSuchIface");
4925 vty_out(vty
, "No such interface.\n");
4929 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4930 struct ospf_interface
*oi
= rn
->info
;
4935 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4939 vty_json(vty
, json
);
4946 DEFUN (show_ip_ospf_neighbor_int
,
4947 show_ip_ospf_neighbor_int_cmd
,
4948 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4951 "OSPF information\n"
4960 bool uj
= use_json(argc
, argv
);
4961 int ret
= CMD_SUCCESS
;
4962 struct interface
*ifp
= NULL
;
4963 char *vrf_name
= NULL
;
4964 vrf_id_t vrf_id
= VRF_DEFAULT
;
4965 struct vrf
*vrf
= NULL
;
4967 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4968 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4969 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4972 vrf
= vrf_lookup_by_name(vrf_name
);
4974 vrf_id
= vrf
->vrf_id
;
4976 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4978 if (!ospf
|| !ospf
->oi_running
)
4982 show_ip_ospf_neighbour_header(vty
);
4984 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4986 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4990 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4995 DEFUN (show_ip_ospf_instance_neighbor_int
,
4996 show_ip_ospf_instance_neighbor_int_cmd
,
4997 "show ip ospf (1-65535) neighbor IFNAME [json]",
5000 "OSPF information\n"
5009 unsigned short instance
= 0;
5010 bool uj
= use_json(argc
, argv
);
5013 show_ip_ospf_neighbour_header(vty
);
5015 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5016 if (instance
!= ospf_instance
)
5017 return CMD_NOT_MY_INSTANCE
;
5019 ospf
= ospf_lookup_instance(instance
);
5020 if (!ospf
|| !ospf
->oi_running
)
5024 show_ip_ospf_neighbour_header(vty
);
5026 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
5030 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
5031 struct ospf_interface
*oi
,
5032 struct ospf_nbr_nbma
*nbr_nbma
,
5033 bool use_json
, json_object
*json
)
5035 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5036 json_object
*json_sub
= NULL
;
5039 json_sub
= json_object_new_object();
5040 else /* Show neighbor ID. */
5041 vty_out(vty
, " Neighbor %s,", "-");
5043 /* Show interface address. */
5045 json_object_string_addf(json_sub
, "ifaceAddress", "%pI4",
5048 vty_out(vty
, " interface address %pI4\n",
5053 json_object_string_add(json_sub
, "areaId",
5054 ospf_area_desc_string(oi
->area
));
5055 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
5057 vty_out(vty
, " In the area %s via interface %s\n",
5058 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
5060 /* Show neighbor priority and state. */
5062 json_object_int_add(json_sub
, "nbrPriority",
5063 nbr_nbma
->priority
);
5064 json_object_string_add(json_sub
, "nbrState", "down");
5066 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5067 nbr_nbma
->priority
, "Down");
5069 /* Show state changes. */
5071 json_object_int_add(json_sub
, "stateChangeCounter",
5072 nbr_nbma
->state_change
);
5074 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
5076 /* Show PollInterval */
5078 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
5080 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
5082 /* Show poll-interval timer. */
5083 if (nbr_nbma
->t_poll
) {
5086 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
5088 json_object_int_add(json_sub
,
5089 "pollIntervalTimerDueMsec",
5092 vty_out(vty
, " Poll timer due in %s\n",
5093 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
5097 /* Show poll-interval timer thread. */
5099 if (nbr_nbma
->t_poll
!= NULL
)
5100 json_object_string_add(json_sub
,
5101 "pollIntervalTimerThread", "on");
5103 vty_out(vty
, " Thread Poll Timer %s\n",
5104 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
5107 json_object_object_add(json
, "noNbrId", json_sub
);
5110 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
5111 struct ospf_interface
*oi
,
5112 struct ospf_neighbor
*nbr
,
5113 struct ospf_neighbor
*prev_nbr
,
5114 json_object
*json
, bool use_json
)
5116 char timebuf
[OSPF_TIME_DUMP_SIZE
];
5117 json_object
*json_neigh
= NULL
, *json_neigh_array
= NULL
;
5118 char neigh_str
[INET_ADDRSTRLEN
] = {0};
5122 !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
5123 json_neigh_array
= NULL
;
5126 if (nbr
->state
== NSM_Attempt
5127 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5128 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
5130 inet_ntop(AF_INET
, &nbr
->router_id
,
5131 neigh_str
, sizeof(neigh_str
));
5133 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
5135 if (!json_neigh_array
) {
5136 json_neigh_array
= json_object_new_array();
5137 json_object_object_add(json
, neigh_str
,
5141 json_neigh
= json_object_new_object();
5144 /* Show neighbor ID. */
5145 if (nbr
->state
== NSM_Attempt
5146 && nbr
->router_id
.s_addr
== INADDR_ANY
)
5147 vty_out(vty
, " Neighbor %s,", "-");
5149 vty_out(vty
, " Neighbor %pI4,",
5153 /* Show interface address. */
5155 json_object_string_addf(json_neigh
, "ifaceAddress", "%pI4",
5156 &nbr
->address
.u
.prefix4
);
5158 vty_out(vty
, " interface address %pI4\n",
5159 &nbr
->address
.u
.prefix4
);
5163 json_object_string_add(json_neigh
, "areaId",
5164 ospf_area_desc_string(oi
->area
));
5165 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
5167 vty_out(vty
, " In the area %s via interface %s\n",
5168 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
5170 /* Show neighbor priority and state. */
5172 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
5173 json_object_string_add(
5174 json_neigh
, "nbrState",
5175 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
5177 vty_out(vty
, " Neighbor priority is %d, State is %s,",
5179 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
5181 /* Show state changes. */
5183 json_object_int_add(json_neigh
, "stateChangeCounter",
5186 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
5188 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
5193 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
5195 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
5199 " Most recent state change statistics:\n");
5200 vty_out(vty
, " Progressive change %s ago\n",
5201 ospf_timeval_dump(&res
, timebuf
,
5206 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
5211 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
5213 json_object_int_add(json_neigh
,
5214 "lastRegressiveChangeMsec",
5216 if (nbr
->last_regress_str
)
5217 json_object_string_add(
5219 "lastRegressiveChangeReason",
5220 nbr
->last_regress_str
);
5223 " Regressive change %s ago, due to %s\n",
5224 ospf_timeval_dump(&res
, timebuf
,
5226 (nbr
->last_regress_str
? nbr
->last_regress_str
5231 /* Show Designated Rotuer ID. */
5233 json_object_string_addf(json_neigh
, "routerDesignatedId",
5234 "%pI4", &nbr
->d_router
);
5236 vty_out(vty
, " DR is %pI4,", &nbr
->d_router
);
5238 /* Show Backup Designated Rotuer ID. */
5240 json_object_string_addf(json_neigh
, "routerDesignatedBackupId",
5241 "%pI4", &nbr
->bd_router
);
5243 vty_out(vty
, " BDR is %pI4\n", &nbr
->bd_router
);
5247 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5248 json_object_string_add(json_neigh
, "optionsList",
5249 ospf_options_dump(nbr
->options
));
5251 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5252 ospf_options_dump(nbr
->options
));
5254 /* Show Router Dead interval timer. */
5256 if (nbr
->t_inactivity
) {
5258 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5261 json_object_int_add(json_neigh
,
5262 "routerDeadIntervalTimerDueMsec",
5265 json_object_int_add(
5267 "routerDeadIntervalTimerDueMsec", -1);
5269 vty_out(vty
, " Dead timer due in %s\n",
5270 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5273 /* Show Database Summary list. */
5275 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5276 ospf_db_summary_count(nbr
));
5278 vty_out(vty
, " Database Summary List %d\n",
5279 ospf_db_summary_count(nbr
));
5281 /* Show Link State Request list. */
5283 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5284 ospf_ls_request_count(nbr
));
5286 vty_out(vty
, " Link State Request List %ld\n",
5287 ospf_ls_request_count(nbr
));
5289 /* Show Link State Retransmission list. */
5291 json_object_int_add(json_neigh
,
5292 "linkStateRetransmissionListCounter",
5293 ospf_ls_retransmit_count(nbr
));
5295 vty_out(vty
, " Link State Retransmission List %ld\n",
5296 ospf_ls_retransmit_count(nbr
));
5298 /* Show inactivity timer thread. */
5300 if (nbr
->t_inactivity
!= NULL
)
5301 json_object_string_add(json_neigh
,
5302 "threadInactivityTimer", "on");
5304 vty_out(vty
, " Thread Inactivity Timer %s\n",
5305 nbr
->t_inactivity
!= NULL
? "on" : "off");
5307 /* Show Database Description retransmission thread. */
5309 if (nbr
->t_db_desc
!= NULL
)
5310 json_object_string_add(
5312 "threadDatabaseDescriptionRetransmission",
5316 " Thread Database Description Retransmision %s\n",
5317 nbr
->t_db_desc
!= NULL
? "on" : "off");
5319 /* Show Link State Request Retransmission thread. */
5321 if (nbr
->t_ls_req
!= NULL
)
5322 json_object_string_add(
5324 "threadLinkStateRequestRetransmission", "on");
5327 " Thread Link State Request Retransmission %s\n",
5328 nbr
->t_ls_req
!= NULL
? "on" : "off");
5330 /* Show Link State Update Retransmission thread. */
5332 if (nbr
->t_ls_upd
!= NULL
)
5333 json_object_string_add(
5335 "threadLinkStateUpdateRetransmission",
5339 " Thread Link State Update Retransmission %s\n\n",
5340 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5343 vty_out(vty
, " Graceful restart Helper info:\n");
5345 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5347 " Graceful Restart HELPER Status : Inprogress.\n");
5350 " Graceful Restart grace period time: %d (seconds).\n",
5351 nbr
->gr_helper_info
.recvd_grace_period
);
5352 vty_out(vty
, " Graceful Restart reason: %s.\n",
5353 ospf_restart_reason2str(
5354 nbr
->gr_helper_info
.gr_restart_reason
));
5357 " Graceful Restart HELPER Status : None\n");
5360 if (nbr
->gr_helper_info
.rejected_reason
5361 != OSPF_HELPER_REJECTED_NONE
)
5362 vty_out(vty
, " Helper rejected reason: %s.\n",
5363 ospf_rejected_reason2str(
5364 nbr
->gr_helper_info
.rejected_reason
));
5366 if (nbr
->gr_helper_info
.helper_exit_reason
5367 != OSPF_GR_HELPER_EXIT_NONE
)
5368 vty_out(vty
, " Last helper exit reason: %s.\n\n",
5369 ospf_exit_reason2str(
5370 nbr
->gr_helper_info
.helper_exit_reason
));
5374 json_object_string_add(json_neigh
, "grHelperStatus",
5375 OSPF_GR_IS_ACTIVE_HELPER(nbr
) ?
5378 if (OSPF_GR_IS_ACTIVE_HELPER(nbr
)) {
5379 json_object_int_add(
5380 json_neigh
, "graceInterval",
5381 nbr
->gr_helper_info
.recvd_grace_period
);
5382 json_object_string_add(
5383 json_neigh
, "grRestartReason",
5384 ospf_restart_reason2str(
5385 nbr
->gr_helper_info
.gr_restart_reason
));
5388 if (nbr
->gr_helper_info
.rejected_reason
5389 != OSPF_HELPER_REJECTED_NONE
)
5390 json_object_string_add(
5391 json_neigh
, "helperRejectReason",
5392 ospf_rejected_reason2str(
5393 nbr
->gr_helper_info
.rejected_reason
));
5395 if (nbr
->gr_helper_info
.helper_exit_reason
5396 != OSPF_GR_HELPER_EXIT_NONE
)
5397 json_object_string_add(
5398 json_neigh
, "helperExitReason",
5399 ospf_exit_reason2str(
5401 .helper_exit_reason
));
5404 bfd_sess_show(vty
, json_neigh
, nbr
->bfd_session
);
5407 json_object_array_add(json_neigh_array
, json_neigh
);
5411 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5412 struct in_addr
*router_id
,
5413 bool use_json
, uint8_t use_vrf
)
5415 struct listnode
*node
;
5416 struct ospf_neighbor
*nbr
;
5417 struct ospf_interface
*oi
;
5418 json_object
*json
= NULL
;
5421 json
= json_object_new_object();
5423 if (ospf
->instance
) {
5425 json_object_int_add(json
, "ospfInstance",
5428 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5431 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5433 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5434 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
))) {
5435 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5441 vty_json(vty
, json
);
5448 DEFPY (show_ip_ospf_neighbor_id
,
5449 show_ip_ospf_neighbor_id_cmd
,
5450 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
5453 "OSPF information\n"
5459 struct listnode
*node
;
5460 int ret
= CMD_SUCCESS
;
5462 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5463 if (!ospf
->oi_running
)
5465 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5472 DEFPY (show_ip_ospf_instance_neighbor_id
,
5473 show_ip_ospf_instance_neighbor_id_cmd
,
5474 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
5477 "OSPF information\n"
5485 if (instance
!= ospf_instance
)
5486 return CMD_NOT_MY_INSTANCE
;
5488 ospf
= ospf_lookup_instance(instance
);
5489 if (!ospf
|| !ospf
->oi_running
)
5492 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
,
5496 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5498 json_object
*json
, bool use_json
,
5501 struct ospf_interface
*oi
;
5502 struct listnode
*node
;
5503 json_object
*json_vrf
= NULL
;
5504 json_object
*json_nbr_sub
= NULL
;
5508 json_vrf
= json_object_new_object();
5512 json_nbr_sub
= json_object_new_object();
5515 if (ospf
->instance
) {
5517 json_object_int_add(json
, "ospfInstance",
5520 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5523 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5525 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5526 struct route_node
*rn
;
5527 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5529 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5530 if ((nbr
= rn
->info
)) {
5531 if (nbr
!= oi
->nbr_self
) {
5532 if (nbr
->state
!= NSM_Down
) {
5533 show_ip_ospf_neighbor_detail_sub(
5534 vty
, oi
, nbr
, prev_nbr
,
5535 json_nbr_sub
, use_json
);
5544 json_object_object_add(json_vrf
, "neighbors",
5547 json_object_object_add(json
, ospf_get_name(ospf
),
5555 DEFUN (show_ip_ospf_neighbor_detail
,
5556 show_ip_ospf_neighbor_detail_cmd
,
5557 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5560 "OSPF information\n"
5564 "detail of all neighbors\n"
5568 bool uj
= use_json(argc
, argv
);
5569 struct listnode
*node
= NULL
;
5570 char *vrf_name
= NULL
;
5571 bool all_vrf
= false;
5572 int ret
= CMD_SUCCESS
;
5575 uint8_t use_vrf
= 0;
5576 json_object
*json
= NULL
;
5578 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5581 json
= json_object_new_object();
5583 /* vrf input is provided could be all or specific vrf*/
5587 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5588 if (!ospf
->oi_running
)
5590 ret
= show_ip_ospf_neighbor_detail_common(
5591 vty
, ospf
, json
, uj
, use_vrf
);
5594 vty_json(vty
, json
);
5598 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5599 if (ospf
== NULL
|| !ospf
->oi_running
) {
5601 json_object_free(json
);
5605 /* Display default ospf (instance 0) info */
5606 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5607 if (ospf
== NULL
|| !ospf
->oi_running
) {
5609 json_object_free(json
);
5615 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5618 vty_out(vty
, "%s\n",
5619 json_object_to_json_string_ext(
5620 json
, JSON_C_TO_STRING_PRETTY
));
5625 json_object_free(json
);
5630 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5631 show_ip_ospf_instance_neighbor_detail_cmd
,
5632 "show ip ospf (1-65535) neighbor detail [json]",
5635 "OSPF information\n"
5638 "detail of all neighbors\n"
5643 unsigned short instance
= 0;
5644 bool uj
= use_json(argc
, argv
);
5645 json_object
*json
= NULL
;
5646 int ret
= CMD_SUCCESS
;
5648 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5649 if (instance
!= ospf_instance
)
5650 return CMD_NOT_MY_INSTANCE
;
5652 ospf
= ospf_lookup_instance(instance
);
5653 if (!ospf
|| !ospf
->oi_running
)
5657 json
= json_object_new_object();
5659 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5662 vty_json(vty
, json
);
5667 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5673 struct listnode
*node
;
5674 struct ospf_interface
*oi
;
5675 json_object
*json_vrf
= NULL
;
5679 json_vrf
= json_object_new_object();
5684 if (ospf
->instance
) {
5686 json_object_int_add(json
, "ospfInstance",
5689 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5692 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5694 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5695 struct route_node
*rn
;
5696 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5697 struct ospf_nbr_nbma
*nbr_nbma
;
5699 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5700 if ((nbr
= rn
->info
)) {
5701 if (nbr
!= oi
->nbr_self
)
5702 if (nbr
->state
!= NSM_Down
)
5703 show_ip_ospf_neighbor_detail_sub(
5706 json_vrf
, use_json
);
5711 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5712 struct listnode
*nd
;
5714 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5715 if (nbr_nbma
->nbr
== NULL
5716 || nbr_nbma
->nbr
->state
== NSM_Down
)
5717 show_ip_ospf_nbr_nbma_detail_sub(
5718 vty
, oi
, nbr_nbma
, use_json
,
5726 json_object_object_add(json
, ospf_get_name(ospf
),
5735 DEFUN (show_ip_ospf_neighbor_detail_all
,
5736 show_ip_ospf_neighbor_detail_all_cmd
,
5737 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5740 "OSPF information\n"
5744 "detail of all neighbors\n"
5745 "include down status neighbor\n"
5749 bool uj
= use_json(argc
, argv
);
5750 struct listnode
*node
= NULL
;
5751 char *vrf_name
= NULL
;
5752 bool all_vrf
= false;
5753 int ret
= CMD_SUCCESS
;
5756 uint8_t use_vrf
= 0;
5757 json_object
*json
= NULL
;
5759 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5762 json
= json_object_new_object();
5764 /* vrf input is provided could be all or specific vrf*/
5768 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5769 if (!ospf
->oi_running
)
5771 ret
= show_ip_ospf_neighbor_detail_all_common(
5772 vty
, ospf
, json
, uj
, use_vrf
);
5776 vty_json(vty
, json
);
5780 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5781 if (ospf
== NULL
|| !ospf
->oi_running
) {
5783 json_object_free(json
);
5787 /* Display default ospf (instance 0) info */
5788 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5789 if (ospf
== NULL
|| !ospf
->oi_running
) {
5791 json_object_free(json
);
5797 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5800 vty_out(vty
, "%s\n",
5801 json_object_to_json_string_ext(
5802 json
, JSON_C_TO_STRING_PRETTY
));
5807 json_object_free(json
);
5812 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5813 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5814 "show ip ospf (1-65535) neighbor detail all [json]",
5817 "OSPF information\n"
5820 "detail of all neighbors\n"
5821 "include down status neighbor\n"
5826 unsigned short instance
= 0;
5827 bool uj
= use_json(argc
, argv
);
5828 json_object
*json
= NULL
;
5829 int ret
= CMD_SUCCESS
;
5831 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5832 if (instance
!= ospf_instance
)
5833 return CMD_NOT_MY_INSTANCE
;
5835 ospf
= ospf_lookup_instance(instance
);
5836 if (!ospf
|| !ospf
->oi_running
)
5840 json
= json_object_new_object();
5842 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5845 vty_json(vty
, json
);
5850 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5853 struct cmd_token
**argv
,
5856 struct ospf_interface
*oi
;
5857 struct interface
*ifp
;
5858 struct route_node
*rn
, *nrn
;
5859 struct ospf_neighbor
*nbr
;
5860 json_object
*json
= NULL
;
5863 json
= json_object_new_object();
5865 if (ospf
->instance
) {
5867 json_object_int_add(json
, "ospfInstance",
5870 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5873 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5876 vty_out(vty
, "No such interface.\n");
5878 vty_out(vty
, "{}\n");
5879 json_object_free(json
);
5884 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5885 if ((oi
= rn
->info
)) {
5886 for (nrn
= route_top(oi
->nbrs
); nrn
;
5887 nrn
= route_next(nrn
)) {
5888 if ((nbr
= nrn
->info
)) {
5889 if (nbr
!= oi
->nbr_self
) {
5890 if (nbr
->state
!= NSM_Down
)
5891 show_ip_ospf_neighbor_detail_sub(
5902 vty_json(vty
, json
);
5909 DEFUN (show_ip_ospf_neighbor_int_detail
,
5910 show_ip_ospf_neighbor_int_detail_cmd
,
5911 "show ip ospf neighbor IFNAME detail [json]",
5914 "OSPF information\n"
5917 "detail of all neighbors\n"
5921 bool uj
= use_json(argc
, argv
);
5922 struct listnode
*node
= NULL
;
5923 int ret
= CMD_SUCCESS
;
5924 bool ospf_output
= false;
5926 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5927 if (!ospf
->oi_running
)
5930 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5935 vty_out(vty
, "%% OSPF instance not found\n");
5940 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5941 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5942 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5945 "OSPF information\n"
5949 "detail of all neighbors\n"
5955 unsigned short instance
= 0;
5956 bool uj
= use_json(argc
, argv
);
5958 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5959 if (instance
!= ospf_instance
)
5960 return CMD_NOT_MY_INSTANCE
;
5962 ospf
= ospf_lookup_instance(instance
);
5963 if (!ospf
|| !ospf
->oi_running
)
5966 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5970 /* Show functions */
5971 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
,
5972 json_object
*json_lsa
)
5974 struct router_lsa
*rl
;
5975 struct summary_lsa
*sl
;
5976 struct as_external_lsa
*asel
;
5977 struct prefix_ipv4 p
;
5980 /* If self option is set, check LSA self flag. */
5981 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5984 /* LSA common part show. */
5985 vty_out(vty
, "%-15pI4",
5987 vty_out(vty
, "%-15pI4 %4d 0x%08lx 0x%04x",
5988 &lsa
->data
->adv_router
, LS_AGE(lsa
),
5989 (unsigned long)ntohl(
5990 lsa
->data
->ls_seqnum
),
5991 ntohs(lsa
->data
->checksum
));
5996 snprintf(seqnum
, sizeof(seqnum
), "%x",
5997 ntohl(lsa
->data
->ls_seqnum
));
5998 snprintf(checksum
, sizeof(checksum
), "%x",
5999 ntohs(lsa
->data
->checksum
));
6000 json_object_string_addf(json_lsa
, "lsId",
6001 "%pI4", &lsa
->data
->id
);
6002 json_object_string_addf(
6003 json_lsa
, "advertisedRouter", "%pI4",
6004 &lsa
->data
->adv_router
);
6005 json_object_int_add(json_lsa
, "lsaAge",
6007 json_object_string_add(
6008 json_lsa
, "sequenceNumber", seqnum
);
6009 json_object_string_add(json_lsa
, "checksum",
6013 /* LSA specific part show. */
6014 switch (lsa
->data
->type
) {
6015 case OSPF_ROUTER_LSA
:
6016 rl
= (struct router_lsa
*)lsa
->data
;
6019 vty_out(vty
, " %-d", ntohs(rl
->links
));
6021 json_object_int_add(json_lsa
,
6025 case OSPF_SUMMARY_LSA
:
6026 sl
= (struct summary_lsa
*)lsa
->data
;
6029 p
.prefix
= sl
->header
.id
;
6030 p
.prefixlen
= ip_masklen(sl
->mask
);
6031 apply_mask_ipv4(&p
);
6034 vty_out(vty
, " %pFX", &p
);
6036 json_object_string_addf(
6037 json_lsa
, "summaryAddress",
6041 case OSPF_AS_EXTERNAL_LSA
:
6042 case OSPF_AS_NSSA_LSA
:
6043 asel
= (struct as_external_lsa
*)lsa
->data
;
6046 p
.prefix
= asel
->header
.id
;
6047 p
.prefixlen
= ip_masklen(asel
->mask
);
6048 apply_mask_ipv4(&p
);
6051 vty_out(vty
, " %s %pFX [0x%lx]",
6057 (unsigned long)ntohl(
6058 asel
->e
[0].route_tag
));
6060 json_object_string_add(
6061 json_lsa
, "metricType",
6066 json_object_string_addf(
6067 json_lsa
, "route", "%pFX", &p
);
6068 json_object_int_add(
6070 (unsigned long)ntohl(
6071 asel
->e
[0].route_tag
));
6074 case OSPF_NETWORK_LSA
:
6075 case OSPF_ASBR_SUMMARY_LSA
:
6076 case OSPF_OPAQUE_LINK_LSA
:
6077 case OSPF_OPAQUE_AREA_LSA
:
6078 case OSPF_OPAQUE_AS_LSA
:
6093 static const char *const show_database_desc
[] = {
6095 "Router Link States",
6097 "Summary Link States",
6098 "ASBR-Summary Link States",
6099 "AS External Link States",
6100 "Group Membership LSA",
6101 "NSSA-external Link States",
6103 "Link-Local Opaque-LSA",
6104 "Area-Local Opaque-LSA",
6105 "AS-external Opaque-LSA",
6108 static const char * const show_database_desc_json
[] = {
6111 "networkLinkStates",
6112 "summaryLinkStates",
6113 "asbrSummaryLinkStates",
6114 "asExternalLinkStates",
6115 "groupMembershipLsa",
6116 "nssaExternalLinkStates",
6118 "linkLocalOpaqueLsa",
6119 "areaLocalOpaqueLsa",
6120 "asExternalOpaqueLsa",
6123 static const char *const show_database_desc_count_json
[] = {
6125 "routerLinkStatesCount",
6126 "networkLinkStatesCount",
6127 "summaryLinkStatesCount",
6128 "asbrSummaryLinkStatesCount",
6129 "asExternalLinkStatesCount",
6130 "groupMembershipLsaCount",
6131 "nssaExternalLinkStatesCount",
6133 "linkLocalOpaqueLsaCount",
6134 "areaLocalOpaqueLsaCount",
6135 "asExternalOpaqueLsaCount",
6138 static const char *const show_database_header
[] = {
6140 "Link ID ADV Router Age Seq# CkSum Link count",
6141 "Link ID ADV Router Age Seq# CkSum",
6142 "Link ID ADV Router Age Seq# CkSum Route",
6143 "Link ID ADV Router Age Seq# CkSum",
6144 "Link ID ADV Router Age Seq# CkSum Route",
6145 " --- header for Group Member ----",
6146 "Link ID ADV Router Age Seq# CkSum Route",
6148 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6149 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6150 "Opaque-Type/Id ADV Router Age Seq# CkSum",
6153 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
,
6156 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
6159 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
6160 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
6161 ospf_options_dump(lsa
->data
->options
));
6162 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
6163 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6164 ? "(Translated from Type-7)"
6167 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6168 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
6171 vty_out(vty
, " :%s%s%s%s",
6172 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR"
6174 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR"
6176 IS_ROUTER_LSA_VIRTUAL(rlsa
)
6179 IS_ROUTER_LSA_SHORTCUT(rlsa
)
6185 vty_out(vty
, " LS Type: %s\n",
6186 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6187 vty_out(vty
, " Link State ID: %pI4 %s\n",
6189 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
,
6191 vty_out(vty
, " Advertising Router: %pI4\n",
6192 &lsa
->data
->adv_router
);
6193 vty_out(vty
, " LS Seq Number: %08lx\n",
6194 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
6195 vty_out(vty
, " Checksum: 0x%04x\n",
6196 ntohs(lsa
->data
->checksum
));
6197 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
6202 snprintf(seqnum
, 10, "%x", ntohl(lsa
->data
->ls_seqnum
));
6203 snprintf(checksum
, 10, "%x", ntohs(lsa
->data
->checksum
));
6205 json_object_int_add(json
, "lsaAge", LS_AGE(lsa
));
6206 json_object_string_add(json
, "options",
6207 ospf_options_dump(lsa
->data
->options
));
6208 json_object_int_add(json
, "lsaFlags", lsa
->flags
);
6210 if (lsa
->flags
& OSPF_LSA_LOCAL_XLT
)
6211 json_object_boolean_true_add(json
,
6212 "translatedFromType7");
6214 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
6215 json_object_int_add(json
, "flags", rlsa
->flags
);
6218 if (IS_ROUTER_LSA_BORDER(rlsa
))
6219 json_object_boolean_true_add(json
,
6221 if (IS_ROUTER_LSA_EXTERNAL(rlsa
))
6222 json_object_boolean_true_add(json
,
6224 if (IS_ROUTER_LSA_VIRTUAL(rlsa
))
6225 json_object_boolean_true_add(
6226 json
, "vlEndpoint");
6227 if (IS_ROUTER_LSA_SHORTCUT(rlsa
))
6228 json_object_boolean_true_add(
6233 json_object_string_add(
6235 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
6236 json_object_string_addf(json
, "linkStateId", "%pI4",
6238 json_object_string_addf(json
, "advertisingRouter", "%pI4",
6239 &lsa
->data
->adv_router
);
6240 json_object_string_add(json
, "lsaSeqNumber", seqnum
);
6241 json_object_string_add(json
, "checksum", checksum
);
6242 json_object_int_add(json
, "length", ntohs(lsa
->data
->length
));
6246 static const char *const link_type_desc
[] = {
6248 "another Router (point-to-point)",
6249 "a Transit Network",
6254 static const char *const link_id_desc
[] = {
6255 "(null)", "Neighboring Router ID", "Designated Router address",
6256 "Net", "Neighboring Router ID",
6259 static const char *const link_data_desc
[] = {
6260 "(null)", "Router Interface address", "Router Interface address",
6261 "Network Mask", "Router Interface address",
6264 static const char *const link_id_desc_json
[] = {
6265 "null", "neighborRouterId", "designatedRouterAddress",
6266 "networkAddress", "neighborRouterId",
6269 static const char *const link_data_desc_json
[] = {
6270 "null", "routerInterfaceAddress", "routerInterfaceAddress",
6271 "networkMask", "routerInterfaceAddress",
6274 /* Show router-LSA each Link information. */
6275 static void show_ip_ospf_database_router_links(struct vty
*vty
,
6276 struct router_lsa
*rl
,
6281 json_object
*json_links
= NULL
;
6282 json_object
*json_link
= NULL
;
6284 char buf
[PREFIX_STRLEN
];
6287 json_links
= json_object_new_object();
6289 len
= ntohs(rl
->header
.length
) - 4;
6290 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
6291 type
= rl
->link
[i
].type
;
6296 snprintf(link
, sizeof(link
), "link%u", i
);
6297 json_link
= json_object_new_object();
6298 json_object_string_add(json_link
, "linkType",
6299 link_type_desc
[type
]);
6300 json_object_string_add(json_link
,
6301 link_id_desc_json
[type
],
6303 &rl
->link
[i
].link_id
,
6305 json_object_string_add(
6306 json_link
, link_data_desc_json
[type
],
6307 inet_ntop(AF_INET
, &rl
->link
[i
].link_data
,
6309 json_object_int_add(json_link
, "numOfTosMetrics",
6311 json_object_int_add(json_link
, "tos0Metric",
6312 ntohs(rl
->link
[i
].metric
));
6313 json_object_object_add(json_links
, link
, json_link
);
6315 vty_out(vty
, " Link connected to: %s\n",
6316 link_type_desc
[type
]);
6317 vty_out(vty
, " (Link ID) %s: %pI4\n",
6319 &rl
->link
[i
].link_id
);
6320 vty_out(vty
, " (Link Data) %s: %pI4\n",
6321 link_data_desc
[type
],
6322 &rl
->link
[i
].link_data
);
6323 vty_out(vty
, " Number of TOS metrics: 0\n");
6324 vty_out(vty
, " TOS 0 Metric: %d\n",
6325 ntohs(rl
->link
[i
].metric
));
6330 json_object_object_add(json
, "routerLinks", json_links
);
6333 /* Show router-LSA detail information. */
6334 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6338 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
6340 show_ip_ospf_database_header(vty
, lsa
, json
);
6343 vty_out(vty
, " Number of Links: %d\n\n",
6346 json_object_int_add(json
, "numOfLinks",
6349 show_ip_ospf_database_router_links(vty
, rl
, json
);
6358 /* Show network-LSA detail information. */
6359 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6363 char buf
[PREFIX_STRLEN
];
6364 json_object
*json_attached_rt
= NULL
;
6365 json_object
*json_router
= NULL
;
6368 json_attached_rt
= json_object_new_object();
6371 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
6372 struct in_addr
*addr
;
6374 show_ip_ospf_database_header(vty
, lsa
, json
);
6377 vty_out(vty
, " Network Mask: /%d\n",
6378 ip_masklen(nl
->mask
));
6380 json_object_int_add(json
, "networkMask",
6381 ip_masklen(nl
->mask
));
6383 length
= lsa
->size
- OSPF_LSA_HEADER_SIZE
- 4;
6384 addr
= &nl
->routers
[0];
6385 for (i
= 0; length
> 0 && addr
;
6386 length
-= 4, addr
= &nl
->routers
[++i
])
6388 vty_out(vty
, " Attached Router: %pI4\n",
6392 json_router
= json_object_new_object();
6393 json_object_string_add(
6394 json_router
, "attachedRouterId",
6395 inet_ntop(AF_INET
, addr
, buf
,
6397 json_object_object_add(json_attached_rt
,
6398 inet_ntop(AF_INET
, addr
,
6406 json_object_object_add(json
, "attchedRouters",
6412 /* Show summary-LSA detail information. */
6413 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6417 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6419 show_ip_ospf_database_header(vty
, lsa
, json
);
6422 vty_out(vty
, " Network Mask: /%d\n",
6423 ip_masklen(sl
->mask
));
6424 vty_out(vty
, " TOS: 0 Metric: %d\n",
6425 GET_METRIC(sl
->metric
));
6428 json_object_int_add(json
, "networkMask",
6429 ip_masklen(sl
->mask
));
6430 json_object_int_add(json
, "tos0Metric",
6431 GET_METRIC(sl
->metric
));
6438 /* Show summary-ASBR-LSA detail information. */
6439 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6443 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
6445 show_ip_ospf_database_header(vty
, lsa
, json
);
6448 vty_out(vty
, " Network Mask: /%d\n",
6449 ip_masklen(sl
->mask
));
6450 vty_out(vty
, " TOS: 0 Metric: %d\n",
6451 GET_METRIC(sl
->metric
));
6454 json_object_int_add(json
, "networkMask",
6455 ip_masklen(sl
->mask
));
6456 json_object_int_add(json
, "tos0Metric",
6457 GET_METRIC(sl
->metric
));
6464 /* Show AS-external-LSA detail information. */
6465 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6471 struct as_external_lsa
*al
=
6472 (struct as_external_lsa
*)lsa
->data
;
6474 show_ip_ospf_database_header(vty
, lsa
, json
);
6477 vty_out(vty
, " Network Mask: /%d\n",
6478 ip_masklen(al
->mask
));
6479 vty_out(vty
, " Metric Type: %s\n",
6480 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6481 ? "2 (Larger than any link state path)"
6483 vty_out(vty
, " TOS: 0\n");
6484 vty_out(vty
, " Metric: %d\n",
6485 GET_METRIC(al
->e
[0].metric
));
6486 vty_out(vty
, " Forward Address: %pI4\n",
6487 &al
->e
[0].fwd_addr
);
6489 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6490 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6492 json_object_int_add(json
, "networkMask",
6493 ip_masklen(al
->mask
));
6494 json_object_string_add(
6496 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6497 ? "E2 (Larger than any link state path)"
6499 json_object_int_add(json
, "tos", tos
);
6500 json_object_int_add(json
, "metric",
6501 GET_METRIC(al
->e
[0].metric
));
6502 json_object_string_addf(json
, "forwardAddress", "%pI4",
6503 &(al
->e
[0].fwd_addr
));
6504 json_object_int_add(
6505 json
, "externalRouteTag",
6506 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6513 /* Show AS-NSSA-LSA detail information. */
6514 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6520 struct as_external_lsa
*al
=
6521 (struct as_external_lsa
*)lsa
->data
;
6523 show_ip_ospf_database_header(vty
, lsa
, json
);
6526 vty_out(vty
, " Network Mask: /%d\n",
6527 ip_masklen(al
->mask
));
6528 vty_out(vty
, " Metric Type: %s\n",
6529 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6530 ? "2 (Larger than any link state path)"
6532 vty_out(vty
, " TOS: 0\n");
6533 vty_out(vty
, " Metric: %d\n",
6534 GET_METRIC(al
->e
[0].metric
));
6535 vty_out(vty
, " NSSA: Forward Address: %pI4\n",
6536 &al
->e
[0].fwd_addr
);
6538 " External Route Tag: %" ROUTE_TAG_PRI
6540 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6542 json_object_int_add(json
, "networkMask",
6543 ip_masklen(al
->mask
));
6544 json_object_string_add(
6546 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6547 ? "E2 (Larger than any link state path)"
6549 json_object_int_add(json
, "tos", tos
);
6550 json_object_int_add(json
, "metric",
6551 GET_METRIC(al
->e
[0].metric
));
6552 json_object_string_addf(json
, "nssaForwardAddress",
6553 "%pI4", &al
->e
[0].fwd_addr
);
6554 json_object_int_add(
6555 json
, "externalRouteTag",
6556 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6563 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
,
6569 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
,
6573 show_ip_ospf_database_header(vty
, lsa
, json
);
6574 show_opaque_info_detail(vty
, lsa
, json
);
6581 int (*show_function
[])(struct vty
*, struct ospf_lsa
*, json_object
*) = {
6583 show_router_lsa_detail
,
6584 show_network_lsa_detail
,
6585 show_summary_lsa_detail
,
6586 show_summary_asbr_lsa_detail
,
6587 show_as_external_lsa_detail
,
6589 show_as_nssa_lsa_detail
, /* almost same as external */
6591 show_opaque_lsa_detail
,
6592 show_opaque_lsa_detail
,
6593 show_opaque_lsa_detail
,
6596 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6597 struct in_addr
*id
, struct in_addr
*adv_router
)
6599 memset(lp
, 0, sizeof(struct prefix_ls
));
6600 lp
->family
= AF_UNSPEC
;
6603 else if (adv_router
== NULL
) {
6604 lp
->prefixlen
= IPV4_MAX_BITLEN
;
6609 lp
->adv_router
= *adv_router
;
6613 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6614 struct in_addr
*id
, struct in_addr
*adv_router
,
6617 struct prefix_ls lp
;
6618 struct route_node
*rn
, *start
;
6619 struct ospf_lsa
*lsa
;
6620 json_object
*json_lsa
= NULL
;
6622 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6623 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6625 route_lock_node(start
);
6626 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6627 if ((lsa
= rn
->info
)) {
6629 json_lsa
= json_object_new_object();
6630 json_object_array_add(json
, json_lsa
);
6633 if (show_function
[lsa
->data
->type
] != NULL
)
6634 show_function
[lsa
->data
->type
](
6635 vty
, lsa
, json_lsa
);
6637 route_unlock_node(start
);
6641 /* Show detail LSA information
6642 -- if id is NULL then show all LSAs. */
6643 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6644 struct in_addr
*id
, struct in_addr
*adv_router
,
6647 struct listnode
*node
;
6648 struct ospf_area
*area
;
6649 char buf
[PREFIX_STRLEN
];
6650 json_object
*json_lsa_type
= NULL
;
6651 json_object
*json_areas
= NULL
;
6652 json_object
*json_lsa_array
= NULL
;
6655 json_lsa_type
= json_object_new_object();
6658 case OSPF_AS_EXTERNAL_LSA
:
6659 case OSPF_OPAQUE_AS_LSA
:
6661 vty_out(vty
, " %s \n\n",
6662 show_database_desc
[type
]);
6664 json_lsa_array
= json_object_new_array();
6666 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
,
6669 json_object_object_add(json
,
6670 show_database_desc_json
[type
],
6676 json_areas
= json_object_new_object();
6678 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6681 "\n %s (Area %s)\n\n",
6682 show_database_desc
[type
],
6683 ospf_area_desc_string(area
));
6685 json_lsa_array
= json_object_new_array();
6686 json_object_object_add(json_areas
,
6694 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6695 adv_router
, json_lsa_array
);
6699 json_object_object_add(json_lsa_type
, "areas",
6701 json_object_object_add(json
,
6702 show_database_desc_json
[type
],
6709 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6710 struct route_table
*rt
,
6711 struct in_addr
*adv_router
,
6714 char buf
[PREFIX_STRLEN
];
6715 struct route_node
*rn
;
6716 struct ospf_lsa
*lsa
;
6718 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6719 if ((lsa
= rn
->info
)) {
6720 json_object
*json_lsa
= NULL
;
6722 if (IPV4_ADDR_SAME(adv_router
,
6723 &lsa
->data
->adv_router
)) {
6724 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6727 json_lsa
= json_object_new_object();
6729 if (show_function
[lsa
->data
->type
] != NULL
)
6730 show_function
[lsa
->data
->type
](
6731 vty
, lsa
, json_lsa
);
6733 json_object_object_add(
6743 /* Show detail LSA information. */
6744 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6745 int type
, struct in_addr
*adv_router
,
6748 struct listnode
*node
;
6749 struct ospf_area
*area
;
6750 char buf
[PREFIX_STRLEN
];
6751 json_object
*json_lstype
= NULL
;
6752 json_object
*json_area
= NULL
;
6755 json_lstype
= json_object_new_object();
6758 case OSPF_AS_EXTERNAL_LSA
:
6759 case OSPF_OPAQUE_AS_LSA
:
6761 vty_out(vty
, " %s \n\n",
6762 show_database_desc
[type
]);
6764 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6765 adv_router
, json_lstype
);
6769 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6771 json_area
= json_object_new_object();
6774 "\n %s (Area %s)\n\n",
6775 show_database_desc
[type
],
6776 ospf_area_desc_string(area
));
6777 show_lsa_detail_adv_router_proc(vty
,
6778 AREA_LSDB(area
, type
),
6779 adv_router
, json_area
);
6782 json_object_object_add(json_lstype
,
6793 json_object_object_add(json
, show_database_desc
[type
],
6797 void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
, int self
,
6800 struct ospf_lsa
*lsa
;
6801 struct route_node
*rn
;
6802 struct ospf_area
*area
;
6803 struct listnode
*node
;
6804 char buf
[PREFIX_STRLEN
];
6805 json_object
*json_areas
= NULL
;
6806 json_object
*json_area
= NULL
;
6807 json_object
*json_lsa
= NULL
;
6809 json_object
*json_lsa_array
= NULL
;
6813 json_areas
= json_object_new_object();
6815 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6817 json_area
= json_object_new_object();
6819 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6822 case OSPF_AS_EXTERNAL_LSA
:
6823 case OSPF_OPAQUE_AS_LSA
:
6828 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6830 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6834 " %s (Area %s)\n\n",
6835 show_database_desc
[type
],
6836 ospf_area_desc_string(area
));
6837 vty_out(vty
, "%s\n",
6838 show_database_header
[type
]);
6841 json_object_new_array();
6842 json_object_object_add(
6844 show_database_desc_json
[type
],
6848 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
) {
6851 json_object_new_object();
6852 json_object_array_add(
6857 count
+= show_lsa_summary(
6858 vty
, lsa
, self
, json_lsa
);
6864 json_object_int_add(
6867 show_database_desc_count_json
6873 json_object_object_add(json_areas
,
6881 json_object_object_add(json
, "areas", json_areas
);
6883 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6886 case OSPF_AS_EXTERNAL_LSA
:
6887 case OSPF_OPAQUE_AS_LSA
:
6892 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6893 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6895 vty_out(vty
, " %s\n\n",
6896 show_database_desc
[type
]);
6897 vty_out(vty
, "%s\n",
6898 show_database_header
[type
]);
6900 json_lsa_array
= json_object_new_array();
6901 json_object_object_add(
6902 json
, show_database_desc_json
[type
],
6906 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
) {
6908 json_lsa
= json_object_new_object();
6909 json_object_array_add(json_lsa_array
,
6913 count
+= show_lsa_summary(vty
, lsa
, self
,
6920 json_object_int_add(
6922 show_database_desc_count_json
[type
],
6931 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
,
6934 struct route_node
*rn
;
6935 char buf
[PREFIX_STRLEN
];
6936 json_object
*json_maxage
= NULL
;
6939 vty_out(vty
, "\n MaxAge Link States:\n\n");
6941 json_maxage
= json_object_new_object();
6943 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6944 struct ospf_lsa
*lsa
;
6945 json_object
*json_lsa
= NULL
;
6947 if ((lsa
= rn
->info
) != NULL
) {
6949 vty_out(vty
, "Link type: %d\n",
6951 vty_out(vty
, "Link State ID: %pI4\n",
6953 vty_out(vty
, "Advertising Router: %pI4\n",
6954 &lsa
->data
->adv_router
);
6955 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6958 json_lsa
= json_object_new_object();
6959 json_object_int_add(json_lsa
, "linkType",
6961 json_object_string_addf(json_lsa
, "linkStateId",
6962 "%pI4", &lsa
->data
->id
);
6963 json_object_string_addf(
6964 json_lsa
, "advertisingRouter", "%pI4",
6965 &lsa
->data
->adv_router
);
6966 json_object_int_add(json_lsa
, "lsaLockCount",
6968 json_object_object_add(
6978 json_object_object_add(json
, "maxAgeLinkStates", json_maxage
);
6981 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6982 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6984 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6985 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6986 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6987 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6989 #define OSPF_LSA_TYPES_DESC \
6990 "ASBR summary link states\n" \
6991 "External link states\n" \
6992 "Network link states\n" \
6993 "Router link states\n" \
6994 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6995 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6996 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6998 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6999 int arg_base
, int argc
,
7000 struct cmd_token
**argv
,
7001 uint8_t use_vrf
, json_object
*json
,
7006 struct in_addr id
, adv_router
;
7007 json_object
*json_vrf
= NULL
;
7011 json_vrf
= json_object_new_object();
7016 if (ospf
->instance
) {
7018 json_object_int_add(json_vrf
, "ospfInstance",
7021 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7024 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7026 /* Show Router ID. */
7028 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7031 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7036 if ((argc
== arg_base
+ 4) || (uj
&& (argc
== arg_base
+ 5))) {
7037 show_ip_ospf_database_summary(vty
, ospf
, 0, json_vrf
);
7040 json_object_object_add(
7041 json
, ospf_get_name(ospf
), json_vrf
);
7046 /* Set database type to show. */
7047 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7048 type
= OSPF_ROUTER_LSA
;
7049 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7050 type
= OSPF_NETWORK_LSA
;
7051 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7052 type
= OSPF_AS_NSSA_LSA
;
7053 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
7054 type
= OSPF_SUMMARY_LSA
;
7055 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7056 type
= OSPF_ASBR_SUMMARY_LSA
;
7057 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7058 type
= OSPF_AS_EXTERNAL_LSA
;
7059 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
7060 show_ip_ospf_database_summary(vty
, ospf
, 1, json_vrf
);
7063 json_object_object_add(
7064 json
, ospf_get_name(ospf
), json_vrf
);
7067 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
7068 show_ip_ospf_database_maxage(vty
, ospf
, json_vrf
);
7071 json_object_object_add(
7072 json
, ospf_get_name(ospf
), json_vrf
);
7075 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7076 type
= OSPF_OPAQUE_LINK_LSA
;
7077 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7078 type
= OSPF_OPAQUE_AREA_LSA
;
7079 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7080 type
= OSPF_OPAQUE_AS_LSA
;
7084 /* `show ip ospf database LSA'. */
7085 if ((argc
== arg_base
+ 5) || (uj
&& (argc
== arg_base
+ 6)))
7086 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
, json_vrf
);
7087 else if (argc
>= arg_base
+ 6) {
7088 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
7092 /* `show ip ospf database LSA ID'. */
7093 if ((argc
== arg_base
+ 6) || (uj
&& (argc
== arg_base
+ 7)))
7094 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
, json_vrf
);
7095 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
7096 else if ((argc
== arg_base
+ 7)
7097 || (uj
&& (argc
== arg_base
+ 8))) {
7098 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
7099 adv_router
= ospf
->router_id
;
7101 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
7106 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
,
7113 json_object_object_add(json
, ospf_get_name(ospf
),
7120 DEFUN (show_ip_ospf_database_max
,
7121 show_ip_ospf_database_max_cmd
,
7122 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate> [json]",
7125 "OSPF information\n"
7128 "Database summary\n"
7129 "LSAs in MaxAge list\n"
7130 "Self-originated link states\n"
7133 struct ospf
*ospf
= NULL
;
7134 struct listnode
*node
= NULL
;
7135 char *vrf_name
= NULL
;
7136 bool all_vrf
= false;
7137 int ret
= CMD_SUCCESS
;
7140 uint8_t use_vrf
= 0;
7141 bool uj
= use_json(argc
, argv
);
7142 json_object
*json
= NULL
;
7145 json
= json_object_new_object();
7147 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7150 bool ospf_output
= false;
7155 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7156 if (!ospf
->oi_running
)
7159 ret
= show_ip_ospf_database_common(
7160 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
7165 vty_out(vty
, "%% OSPF is not enabled\n");
7167 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7168 if (ospf
== NULL
|| !ospf
->oi_running
) {
7170 "%% OSPF is not enabled in vrf %s\n",
7174 ret
= (show_ip_ospf_database_common(
7175 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
, use_vrf
,
7179 /* Display default ospf (instance 0) info */
7180 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7181 if (ospf
== NULL
|| !ospf
->oi_running
) {
7182 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
7186 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
7191 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7192 json_object_free(json
);
7198 ALIAS (show_ip_ospf_database_max
,
7199 show_ip_ospf_database_cmd
,
7200 "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]",
7203 "OSPF information\n"
7206 "Database summary\n"
7208 "Link State ID (as an IP address)\n"
7209 "Self-originated link states\n"
7210 "Advertising Router link states\n"
7211 "Advertising Router (as an IP address)\n"
7214 DEFUN (show_ip_ospf_instance_database_max
,
7215 show_ip_ospf_instance_database_max_cmd
,
7216 "show ip ospf (1-65535) database <max-age|self-originate> [json]",
7219 "OSPF information\n"
7221 "Database summary\n"
7222 "LSAs in MaxAge list\n"
7223 "Self-originated link states\n"
7228 unsigned short instance
= 0;
7229 bool uj
= use_json(argc
, argv
);
7230 json_object
*json
= NULL
;
7233 json
= json_object_new_object();
7235 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7236 if (instance
!= ospf_instance
)
7237 return CMD_NOT_MY_INSTANCE
;
7239 ospf
= ospf_lookup_instance(instance
);
7240 if (!ospf
|| !ospf
->oi_running
)
7243 show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0, json
, uj
);
7246 vty_json(vty
, json
);
7251 ALIAS (show_ip_ospf_instance_database_max
,
7252 show_ip_ospf_instance_database_cmd
,
7253 "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]",
7256 "OSPF information\n"
7258 "Database summary\n"
7260 "Link State ID (as an IP address)\n"
7261 "Self-originated link states\n"
7262 "Advertising Router link states\n"
7263 "Advertising Router (as an IP address)\n"
7266 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
7268 int arg_base
, int argc
,
7269 struct cmd_token
**argv
,
7276 struct in_addr adv_router
;
7277 json_object
*json_vrf
= NULL
;
7281 json_vrf
= json_object_new_object();
7286 if (ospf
->instance
) {
7288 json_object_int_add(json
, "ospfInstance",
7291 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
7294 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
7296 /* Show Router ID. */
7298 json_object_string_addf(json_vrf
, "routerId", "%pI4",
7301 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
7305 /* Set database type to show. */
7306 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
7307 type
= OSPF_ROUTER_LSA
;
7308 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
7309 type
= OSPF_NETWORK_LSA
;
7310 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
7311 type
= OSPF_AS_NSSA_LSA
;
7312 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
7313 type
= OSPF_SUMMARY_LSA
;
7314 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
7315 type
= OSPF_ASBR_SUMMARY_LSA
;
7316 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
7317 type
= OSPF_AS_EXTERNAL_LSA
;
7318 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
7319 type
= OSPF_OPAQUE_LINK_LSA
;
7320 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
7321 type
= OSPF_OPAQUE_AREA_LSA
;
7322 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
7323 type
= OSPF_OPAQUE_AS_LSA
;
7327 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
7328 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
7329 adv_router
= ospf
->router_id
;
7331 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
7336 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
, json_vrf
);
7340 json_object_object_add(json
, ospf_get_name(ospf
),
7347 DEFUN (show_ip_ospf_database_type_adv_router
,
7348 show_ip_ospf_database_type_adv_router_cmd
,
7349 "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]",
7352 "OSPF information\n"
7355 "Database summary\n"
7357 "Advertising Router link states\n"
7358 "Advertising Router (as an IP address)\n"
7359 "Self-originated link states\n"
7362 struct ospf
*ospf
= NULL
;
7363 struct listnode
*node
= NULL
;
7364 char *vrf_name
= NULL
;
7365 bool all_vrf
= false;
7366 int ret
= CMD_SUCCESS
;
7369 uint8_t use_vrf
= 0;
7370 bool uj
= use_json(argc
, argv
);
7371 json_object
*json
= NULL
;
7374 json
= json_object_new_object();
7376 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
7379 bool ospf_output
= false;
7384 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
7385 if (!ospf
->oi_running
)
7388 ret
= show_ip_ospf_database_type_adv_router_common(
7389 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
,
7393 vty_out(vty
, "%% OSPF is not enabled\n");
7395 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
7396 if ((ospf
== NULL
) || !ospf
->oi_running
) {
7398 "%% OSPF is not enabled in vrf %s\n",
7403 ret
= show_ip_ospf_database_type_adv_router_common(
7404 vty
, ospf
, 2, argc
, argv
, use_vrf
, json
, uj
);
7407 /* Display default ospf (instance 0) info */
7408 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
7409 if (ospf
== NULL
|| !ospf
->oi_running
) {
7410 vty_out(vty
, "%% OSPF is not enabled on vrf default\n");
7414 ret
= show_ip_ospf_database_type_adv_router_common(
7415 vty
, ospf
, 0, argc
, argv
, use_vrf
, json
, uj
);
7419 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
7420 json_object_free(json
);
7426 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
7427 show_ip_ospf_instance_database_type_adv_router_cmd
,
7428 "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]",
7431 "OSPF information\n"
7433 "Database summary\n"
7435 "Advertising Router link states\n"
7436 "Advertising Router (as an IP address)\n"
7437 "Self-originated link states\n"
7442 unsigned short instance
= 0;
7443 bool uj
= use_json(argc
, argv
);
7444 json_object
*json
= NULL
;
7447 json
= json_object_new_object();
7449 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7450 if (instance
!= ospf_instance
)
7451 return CMD_NOT_MY_INSTANCE
;
7453 ospf
= ospf_lookup_instance(instance
);
7454 if (!ospf
|| !ospf
->oi_running
)
7457 show_ip_ospf_database_type_adv_router_common(vty
, ospf
, 1, argc
, argv
,
7461 vty_json(vty
, json
);
7466 DEFUN (ip_ospf_authentication_args
,
7467 ip_ospf_authentication_args_addr_cmd
,
7468 "ip ospf authentication <null|message-digest> [A.B.C.D]",
7470 "OSPF interface commands\n"
7471 "Enable authentication on this interface\n"
7472 "Use null authentication\n"
7473 "Use message-digest authentication\n"
7474 "Address of interface\n")
7476 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7477 int idx_encryption
= 3;
7479 struct in_addr addr
;
7481 struct ospf_if_params
*params
;
7483 params
= IF_DEF_PARAMS(ifp
);
7486 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7489 "Please specify interface address by A.B.C.D\n");
7490 return CMD_WARNING_CONFIG_FAILED
;
7493 params
= ospf_get_if_params(ifp
, addr
);
7494 ospf_if_update_params(ifp
, addr
);
7497 /* Handle null authentication */
7498 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7499 SET_IF_PARAM(params
, auth_type
);
7500 params
->auth_type
= OSPF_AUTH_NULL
;
7504 /* Handle message-digest authentication */
7505 if (argv
[idx_encryption
]->arg
[0] == 'm') {
7506 SET_IF_PARAM(params
, auth_type
);
7507 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7511 vty_out(vty
, "You shouldn't get here!\n");
7512 return CMD_WARNING_CONFIG_FAILED
;
7515 DEFUN (ip_ospf_authentication
,
7516 ip_ospf_authentication_addr_cmd
,
7517 "ip ospf authentication [A.B.C.D]",
7519 "OSPF interface commands\n"
7520 "Enable authentication on this interface\n"
7521 "Address of interface\n")
7523 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7525 struct in_addr addr
;
7527 struct ospf_if_params
*params
;
7529 params
= IF_DEF_PARAMS(ifp
);
7532 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7535 "Please specify interface address by A.B.C.D\n");
7536 return CMD_WARNING_CONFIG_FAILED
;
7539 params
= ospf_get_if_params(ifp
, addr
);
7540 ospf_if_update_params(ifp
, addr
);
7543 SET_IF_PARAM(params
, auth_type
);
7544 params
->auth_type
= OSPF_AUTH_SIMPLE
;
7549 DEFUN (no_ip_ospf_authentication_args
,
7550 no_ip_ospf_authentication_args_addr_cmd
,
7551 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
7554 "OSPF interface commands\n"
7555 "Enable authentication on this interface\n"
7556 "Use null authentication\n"
7557 "Use message-digest authentication\n"
7558 "Address of interface\n")
7560 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7561 int idx_encryption
= 4;
7563 struct in_addr addr
;
7565 struct ospf_if_params
*params
;
7566 struct route_node
*rn
;
7569 params
= IF_DEF_PARAMS(ifp
);
7572 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7575 "Please specify interface address by A.B.C.D\n");
7576 return CMD_WARNING_CONFIG_FAILED
;
7579 params
= ospf_lookup_if_params(ifp
, addr
);
7580 if (params
== NULL
) {
7581 vty_out(vty
, "Ip Address specified is unknown\n");
7582 return CMD_WARNING_CONFIG_FAILED
;
7584 params
->auth_type
= OSPF_AUTH_NOTSET
;
7585 UNSET_IF_PARAM(params
, auth_type
);
7586 if (params
!= IF_DEF_PARAMS(ifp
)) {
7587 ospf_free_if_params(ifp
, addr
);
7588 ospf_if_update_params(ifp
, addr
);
7591 if (argv
[idx_encryption
]->arg
[0] == 'n') {
7592 auth_type
= OSPF_AUTH_NULL
;
7593 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
7594 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
7596 vty_out(vty
, "Unexpected input encountered\n");
7597 return CMD_WARNING_CONFIG_FAILED
;
7600 * Here we have a case where the user has entered
7601 * 'no ip ospf authentication (null | message_digest )'
7602 * we need to find if we have any ip addresses underneath it
7604 * correspond to the associated type.
7606 if (params
->auth_type
== auth_type
) {
7607 params
->auth_type
= OSPF_AUTH_NOTSET
;
7608 UNSET_IF_PARAM(params
, auth_type
);
7611 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7612 rn
= route_next(rn
)) {
7613 if ((params
= rn
->info
)) {
7614 if (params
->auth_type
== auth_type
) {
7615 params
->auth_type
= OSPF_AUTH_NOTSET
;
7616 UNSET_IF_PARAM(params
, auth_type
);
7617 if (params
!= IF_DEF_PARAMS(ifp
)) {
7618 ospf_free_if_params(
7619 ifp
, rn
->p
.u
.prefix4
);
7620 ospf_if_update_params(
7621 ifp
, rn
->p
.u
.prefix4
);
7631 DEFUN (no_ip_ospf_authentication
,
7632 no_ip_ospf_authentication_addr_cmd
,
7633 "no ip ospf authentication [A.B.C.D]",
7636 "OSPF interface commands\n"
7637 "Enable authentication on this interface\n"
7638 "Address of interface\n")
7640 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7642 struct in_addr addr
;
7644 struct ospf_if_params
*params
;
7645 struct route_node
*rn
;
7647 params
= IF_DEF_PARAMS(ifp
);
7650 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7653 "Please specify interface address by A.B.C.D\n");
7654 return CMD_WARNING_CONFIG_FAILED
;
7657 params
= ospf_lookup_if_params(ifp
, addr
);
7658 if (params
== NULL
) {
7659 vty_out(vty
, "Ip Address specified is unknown\n");
7660 return CMD_WARNING_CONFIG_FAILED
;
7663 params
->auth_type
= OSPF_AUTH_NOTSET
;
7664 UNSET_IF_PARAM(params
, auth_type
);
7665 if (params
!= IF_DEF_PARAMS(ifp
)) {
7666 ospf_free_if_params(ifp
, addr
);
7667 ospf_if_update_params(ifp
, addr
);
7671 * When a user enters 'no ip ospf authentication'
7672 * We should remove all authentication types from
7675 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7676 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
7677 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
7678 params
->auth_type
= OSPF_AUTH_NOTSET
;
7679 UNSET_IF_PARAM(params
, auth_type
);
7682 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
7683 rn
= route_next(rn
)) {
7684 if ((params
= rn
->info
)) {
7686 if ((params
->auth_type
== OSPF_AUTH_NULL
)
7687 || (params
->auth_type
7688 == OSPF_AUTH_CRYPTOGRAPHIC
)
7689 || (params
->auth_type
7690 == OSPF_AUTH_SIMPLE
)) {
7691 params
->auth_type
= OSPF_AUTH_NOTSET
;
7692 UNSET_IF_PARAM(params
, auth_type
);
7693 if (params
!= IF_DEF_PARAMS(ifp
)) {
7694 ospf_free_if_params(
7695 ifp
, rn
->p
.u
.prefix4
);
7696 ospf_if_update_params(
7697 ifp
, rn
->p
.u
.prefix4
);
7708 DEFUN (ip_ospf_authentication_key
,
7709 ip_ospf_authentication_key_addr_cmd
,
7710 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
7712 "OSPF interface commands\n"
7713 "Authentication password (key)\n"
7714 "The OSPF password (key)\n"
7715 "Address of interface\n")
7717 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7719 struct in_addr addr
;
7720 struct ospf_if_params
*params
;
7722 params
= IF_DEF_PARAMS(ifp
);
7724 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7725 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7727 "Please specify interface address by A.B.C.D\n");
7728 return CMD_WARNING_CONFIG_FAILED
;
7731 params
= ospf_get_if_params(ifp
, addr
);
7732 ospf_if_update_params(ifp
, addr
);
7735 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
7736 sizeof(params
->auth_simple
));
7737 SET_IF_PARAM(params
, auth_simple
);
7742 DEFUN_HIDDEN (ospf_authentication_key
,
7743 ospf_authentication_key_cmd
,
7744 "ospf authentication-key AUTH_KEY [A.B.C.D]",
7745 "OSPF interface commands\n"
7746 VLINK_HELPSTR_AUTH_SIMPLE
7747 "Address of interface\n")
7749 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7752 DEFUN (no_ip_ospf_authentication_key
,
7753 no_ip_ospf_authentication_key_authkey_addr_cmd
,
7754 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7757 "OSPF interface commands\n"
7758 VLINK_HELPSTR_AUTH_SIMPLE
7759 "Address of interface\n")
7761 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7763 struct in_addr addr
;
7764 struct ospf_if_params
*params
;
7765 params
= IF_DEF_PARAMS(ifp
);
7767 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7768 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7770 "Please specify interface address by A.B.C.D\n");
7771 return CMD_WARNING_CONFIG_FAILED
;
7774 params
= ospf_lookup_if_params(ifp
, addr
);
7779 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
7780 UNSET_IF_PARAM(params
, auth_simple
);
7782 if (params
!= IF_DEF_PARAMS(ifp
)) {
7783 ospf_free_if_params(ifp
, addr
);
7784 ospf_if_update_params(ifp
, addr
);
7790 DEFUN_HIDDEN (no_ospf_authentication_key
,
7791 no_ospf_authentication_key_authkey_addr_cmd
,
7792 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7794 "OSPF interface commands\n"
7795 VLINK_HELPSTR_AUTH_SIMPLE
7796 "Address of interface\n")
7798 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7801 DEFUN (ip_ospf_message_digest_key
,
7802 ip_ospf_message_digest_key_cmd
,
7803 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7805 "OSPF interface commands\n"
7806 "Message digest authentication password (key)\n"
7808 "Use MD5 algorithm\n"
7809 "The OSPF password (key)\n"
7810 "Address of interface\n")
7812 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7813 struct crypt_key
*ck
;
7815 struct in_addr addr
;
7816 struct ospf_if_params
*params
;
7818 params
= IF_DEF_PARAMS(ifp
);
7821 argv_find(argv
, argc
, "(1-255)", &idx
);
7822 char *keyid
= argv
[idx
]->arg
;
7823 argv_find(argv
, argc
, "KEY", &idx
);
7824 char *cryptkey
= argv
[idx
]->arg
;
7826 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7827 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7829 "Please specify interface address by A.B.C.D\n");
7830 return CMD_WARNING_CONFIG_FAILED
;
7833 params
= ospf_get_if_params(ifp
, addr
);
7834 ospf_if_update_params(ifp
, addr
);
7837 key_id
= strtol(keyid
, NULL
, 10);
7839 /* Remove existing key, if any */
7840 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7842 ck
= ospf_crypt_key_new();
7843 ck
->key_id
= (uint8_t)key_id
;
7844 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7846 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7847 SET_IF_PARAM(params
, auth_crypt
);
7852 DEFUN_HIDDEN (ospf_message_digest_key
,
7853 ospf_message_digest_key_cmd
,
7854 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7855 "OSPF interface commands\n"
7856 "Message digest authentication password (key)\n"
7858 "Use MD5 algorithm\n"
7859 "The OSPF password (key)\n"
7860 "Address of interface\n")
7862 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7865 DEFUN (no_ip_ospf_message_digest_key
,
7866 no_ip_ospf_message_digest_key_cmd
,
7867 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7870 "OSPF interface commands\n"
7871 "Message digest authentication password (key)\n"
7873 "Use MD5 algorithm\n"
7874 "The OSPF password (key)\n"
7875 "Address of interface\n")
7877 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7879 struct crypt_key
*ck
;
7881 struct in_addr addr
;
7882 struct ospf_if_params
*params
;
7883 params
= IF_DEF_PARAMS(ifp
);
7885 argv_find(argv
, argc
, "(1-255)", &idx
);
7886 char *keyid
= argv
[idx
]->arg
;
7888 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7889 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7891 "Please specify interface address by A.B.C.D\n");
7892 return CMD_WARNING_CONFIG_FAILED
;
7895 params
= ospf_lookup_if_params(ifp
, addr
);
7900 key_id
= strtol(keyid
, NULL
, 10);
7901 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7903 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7904 return CMD_WARNING_CONFIG_FAILED
;
7907 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7909 if (params
!= IF_DEF_PARAMS(ifp
)) {
7910 ospf_free_if_params(ifp
, addr
);
7911 ospf_if_update_params(ifp
, addr
);
7917 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7918 no_ospf_message_digest_key_cmd
,
7919 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7921 "OSPF interface commands\n"
7922 "Message digest authentication password (key)\n"
7924 "Use MD5 algorithm\n"
7925 "The OSPF password (key)\n"
7926 "Address of interface\n")
7928 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7931 DEFUN (ip_ospf_cost
,
7933 "ip ospf cost (1-65535) [A.B.C.D]",
7935 "OSPF interface commands\n"
7938 "Address of interface\n")
7940 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7942 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7943 struct in_addr addr
;
7944 struct ospf_if_params
*params
;
7945 params
= IF_DEF_PARAMS(ifp
);
7948 char *coststr
= NULL
, *ifaddr
= NULL
;
7950 argv_find(argv
, argc
, "(1-65535)", &idx
);
7951 coststr
= argv
[idx
]->arg
;
7952 cost
= strtol(coststr
, NULL
, 10);
7954 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7956 if (!inet_aton(ifaddr
, &addr
)) {
7958 "Please specify interface address by A.B.C.D\n");
7959 return CMD_WARNING_CONFIG_FAILED
;
7962 params
= ospf_get_if_params(ifp
, addr
);
7963 ospf_if_update_params(ifp
, addr
);
7966 SET_IF_PARAM(params
, output_cost_cmd
);
7967 params
->output_cost_cmd
= cost
;
7969 ospf_if_recalculate_output_cost(ifp
);
7974 DEFUN_HIDDEN (ospf_cost
,
7976 "ospf cost (1-65535) [A.B.C.D]",
7977 "OSPF interface commands\n"
7980 "Address of interface\n")
7982 return ip_ospf_cost(self
, vty
, argc
, argv
);
7985 DEFUN (no_ip_ospf_cost
,
7986 no_ip_ospf_cost_cmd
,
7987 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7990 "OSPF interface commands\n"
7993 "Address of interface\n")
7995 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7997 struct in_addr addr
;
7998 struct ospf_if_params
*params
;
8000 params
= IF_DEF_PARAMS(ifp
);
8003 char *ifaddr
= NULL
;
8004 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
8006 /* According to the semantics we are mimicking "no ip ospf cost N" is
8007 * always treated as "no ip ospf cost" regardless of the actual value
8008 * of N already configured for the interface. Thus ignore cost. */
8011 if (!inet_aton(ifaddr
, &addr
)) {
8013 "Please specify interface address by A.B.C.D\n");
8014 return CMD_WARNING_CONFIG_FAILED
;
8017 params
= ospf_lookup_if_params(ifp
, addr
);
8022 UNSET_IF_PARAM(params
, output_cost_cmd
);
8024 if (params
!= IF_DEF_PARAMS(ifp
)) {
8025 ospf_free_if_params(ifp
, addr
);
8026 ospf_if_update_params(ifp
, addr
);
8029 ospf_if_recalculate_output_cost(ifp
);
8034 DEFUN_HIDDEN (no_ospf_cost
,
8036 "no ospf cost [(1-65535)] [A.B.C.D]",
8038 "OSPF interface commands\n"
8041 "Address of interface\n")
8043 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
8046 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
8048 struct route_node
*rn
;
8049 struct ospf_neighbor
*nbr
;
8051 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
8052 if ((nbr
= rn
->info
)) {
8053 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
8054 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8055 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8056 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
8060 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
8061 const char *nbr_str
,
8062 const char *fast_hello_str
)
8064 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8067 struct in_addr addr
;
8069 struct ospf_if_params
*params
;
8070 struct ospf_interface
*oi
;
8071 struct route_node
*rn
;
8073 params
= IF_DEF_PARAMS(ifp
);
8076 ret
= inet_aton(nbr_str
, &addr
);
8079 "Please specify interface address by A.B.C.D\n");
8080 return CMD_WARNING_CONFIG_FAILED
;
8083 params
= ospf_get_if_params(ifp
, addr
);
8084 ospf_if_update_params(ifp
, addr
);
8088 seconds
= strtoul(interval_str
, NULL
, 10);
8090 /* reset fast_hello too, just to be sure */
8091 UNSET_IF_PARAM(params
, fast_hello
);
8092 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8093 } else if (fast_hello_str
) {
8094 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
8095 /* 1s dead-interval with sub-second hellos desired */
8096 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
8097 SET_IF_PARAM(params
, fast_hello
);
8098 params
->fast_hello
= hellomult
;
8101 "Please specify dead-interval or hello-multiplier\n");
8102 return CMD_WARNING_CONFIG_FAILED
;
8105 SET_IF_PARAM(params
, v_wait
);
8106 params
->v_wait
= seconds
;
8107 params
->is_v_wait_set
= true;
8109 /* Update timer values in neighbor structure. */
8111 struct ospf
*ospf
= NULL
;
8113 ospf
= ifp
->vrf
->info
;
8115 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8117 ospf_nbr_timer_update(oi
);
8120 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8121 if ((oi
= rn
->info
))
8122 ospf_nbr_timer_update(oi
);
8128 DEFUN (ip_ospf_dead_interval
,
8129 ip_ospf_dead_interval_cmd
,
8130 "ip ospf dead-interval (1-65535) [A.B.C.D]",
8132 "OSPF interface commands\n"
8133 "Interval time after which a neighbor is declared down\n"
8135 "Address of interface\n")
8138 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
8142 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
8143 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
8147 DEFUN_HIDDEN (ospf_dead_interval
,
8148 ospf_dead_interval_cmd
,
8149 "ospf dead-interval (1-65535) [A.B.C.D]",
8150 "OSPF interface commands\n"
8151 "Interval time after which a neighbor is declared down\n"
8153 "Address of interface\n")
8155 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8158 DEFUN (ip_ospf_dead_interval_minimal
,
8159 ip_ospf_dead_interval_minimal_addr_cmd
,
8160 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
8162 "OSPF interface commands\n"
8163 "Interval time after which a neighbor is declared down\n"
8164 "Minimal 1s dead-interval with fast sub-second hellos\n"
8165 "Hello multiplier factor\n"
8166 "Number of Hellos to send each second\n"
8167 "Address of interface\n")
8172 return ospf_vty_dead_interval_set(
8173 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
8175 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
8176 argv
[idx_number
]->arg
);
8179 DEFUN (no_ip_ospf_dead_interval
,
8180 no_ip_ospf_dead_interval_cmd
,
8181 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8184 "OSPF interface commands\n"
8185 "Interval time after which a neighbor is declared down\n"
8187 "Minimal 1s dead-interval with fast sub-second hellos\n"
8188 "Hello multiplier factor\n"
8189 "Number of Hellos to send each second\n"
8190 "Address of interface\n")
8192 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8193 int idx_ipv4
= argc
- 1;
8194 struct in_addr addr
= {.s_addr
= 0L};
8196 struct ospf_if_params
*params
;
8197 struct ospf_interface
*oi
;
8198 struct route_node
*rn
;
8200 params
= IF_DEF_PARAMS(ifp
);
8202 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
8203 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8206 "Please specify interface address by A.B.C.D\n");
8207 return CMD_WARNING_CONFIG_FAILED
;
8210 params
= ospf_lookup_if_params(ifp
, addr
);
8215 UNSET_IF_PARAM(params
, v_wait
);
8216 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8217 params
->is_v_wait_set
= false;
8219 UNSET_IF_PARAM(params
, fast_hello
);
8220 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
8222 if (params
!= IF_DEF_PARAMS(ifp
)) {
8223 ospf_free_if_params(ifp
, addr
);
8224 ospf_if_update_params(ifp
, addr
);
8227 /* Update timer values in neighbor structure. */
8229 struct ospf
*ospf
= NULL
;
8231 ospf
= ifp
->vrf
->info
;
8233 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
8235 ospf_nbr_timer_update(oi
);
8238 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
8239 if ((oi
= rn
->info
))
8240 ospf_nbr_timer_update(oi
);
8246 DEFUN_HIDDEN (no_ospf_dead_interval
,
8247 no_ospf_dead_interval_cmd
,
8248 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
8250 "OSPF interface commands\n"
8251 "Interval time after which a neighbor is declared down\n"
8253 "Minimal 1s dead-interval with fast sub-second hellos\n"
8254 "Hello multiplier factor\n"
8255 "Number of Hellos to send each second\n"
8256 "Address of interface\n")
8258 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
8261 DEFUN (ip_ospf_hello_interval
,
8262 ip_ospf_hello_interval_cmd
,
8263 "ip ospf hello-interval (1-65535) [A.B.C.D]",
8265 "OSPF interface commands\n"
8266 "Time between HELLO packets\n"
8268 "Address of interface\n")
8270 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8272 struct in_addr addr
= {.s_addr
= 0L};
8273 struct ospf_if_params
*params
;
8274 params
= IF_DEF_PARAMS(ifp
);
8275 uint32_t seconds
= 0;
8276 bool is_addr
= false;
8277 uint32_t old_interval
= 0;
8279 argv_find(argv
, argc
, "(1-65535)", &idx
);
8280 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8282 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8283 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8285 "Please specify interface address by A.B.C.D\n");
8286 return CMD_WARNING_CONFIG_FAILED
;
8289 params
= ospf_get_if_params(ifp
, addr
);
8290 ospf_if_update_params(ifp
, addr
);
8294 old_interval
= params
->v_hello
;
8296 /* Return, if same interval is configured. */
8297 if (old_interval
== seconds
)
8300 SET_IF_PARAM(params
, v_hello
);
8301 params
->v_hello
= seconds
;
8303 if (!params
->is_v_wait_set
) {
8304 SET_IF_PARAM(params
, v_wait
);
8306 * The router dead interval should
8307 * be some multiple of the HelloInterval (perhaps 4 times the
8308 * hello interval) and must be the same for all routers
8309 * attached to a common network.
8311 params
->v_wait
= 4 * seconds
;
8314 ospf_reset_hello_timer(ifp
, addr
, is_addr
);
8319 DEFUN_HIDDEN (ospf_hello_interval
,
8320 ospf_hello_interval_cmd
,
8321 "ospf hello-interval (1-65535) [A.B.C.D]",
8322 "OSPF interface commands\n"
8323 "Time between HELLO packets\n"
8325 "Address of interface\n")
8327 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8330 DEFUN (no_ip_ospf_hello_interval
,
8331 no_ip_ospf_hello_interval_cmd
,
8332 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
8335 "OSPF interface commands\n"
8336 "Time between HELLO packets\n" // ignored
8338 "Address of interface\n")
8340 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8342 struct in_addr addr
= {.s_addr
= 0L};
8343 struct ospf_if_params
*params
;
8344 struct route_node
*rn
;
8346 params
= IF_DEF_PARAMS(ifp
);
8348 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8349 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8351 "Please specify interface address by A.B.C.D\n");
8352 return CMD_WARNING_CONFIG_FAILED
;
8355 params
= ospf_lookup_if_params(ifp
, addr
);
8360 UNSET_IF_PARAM(params
, v_hello
);
8361 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
8363 if (!params
->is_v_wait_set
) {
8364 UNSET_IF_PARAM(params
, v_wait
);
8365 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
8368 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8369 struct ospf_interface
*oi
= rn
->info
;
8374 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8375 oi
->ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8377 if (oi
->state
> ISM_Down
) {
8378 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8379 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8383 if (params
!= IF_DEF_PARAMS(ifp
)) {
8384 ospf_free_if_params(ifp
, addr
);
8385 ospf_if_update_params(ifp
, addr
);
8391 DEFUN_HIDDEN (no_ospf_hello_interval
,
8392 no_ospf_hello_interval_cmd
,
8393 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
8395 "OSPF interface commands\n"
8396 "Time between HELLO packets\n" // ignored
8398 "Address of interface\n")
8400 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
8403 DEFUN(ip_ospf_network
, ip_ospf_network_cmd
,
8404 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point [dmvpn]>",
8406 "OSPF interface commands\n"
8408 "Specify OSPF broadcast multi-access network\n"
8409 "Specify OSPF NBMA network\n"
8410 "Specify OSPF point-to-multipoint network\n"
8411 "Specify OSPF point-to-point network\n"
8412 "Specify OSPF point-to-point DMVPN network\n")
8414 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8416 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8417 uint8_t old_ptp_dmvpn
= IF_DEF_PARAMS(ifp
)->ptp_dmvpn
;
8418 struct route_node
*rn
;
8420 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
8422 "This is a loopback interface. Can't set network type.\n");
8423 return CMD_WARNING_CONFIG_FAILED
;
8426 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8428 if (argv_find(argv
, argc
, "broadcast", &idx
))
8429 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
8430 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
8431 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
8432 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
8433 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
8434 else if (argv_find(argv
, argc
, "point-to-point", &idx
)) {
8435 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
8436 if (argv_find(argv
, argc
, "dmvpn", &idx
))
8437 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 1;
8440 if (IF_DEF_PARAMS(ifp
)->type
== old_type
8441 && IF_DEF_PARAMS(ifp
)->ptp_dmvpn
== old_ptp_dmvpn
)
8444 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
8446 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8447 struct ospf_interface
*oi
= rn
->info
;
8452 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8454 if (oi
->state
> ISM_Down
) {
8455 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8456 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8463 DEFUN_HIDDEN (ospf_network
,
8465 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
8466 "OSPF interface commands\n"
8468 "Specify OSPF broadcast multi-access network\n"
8469 "Specify OSPF NBMA network\n"
8470 "Specify OSPF point-to-multipoint network\n"
8471 "Specify OSPF point-to-point network\n")
8473 return ip_ospf_network(self
, vty
, argc
, argv
);
8476 DEFUN (no_ip_ospf_network
,
8477 no_ip_ospf_network_cmd
,
8478 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8481 "OSPF interface commands\n"
8483 "Specify OSPF broadcast multi-access network\n"
8484 "Specify OSPF NBMA network\n"
8485 "Specify OSPF point-to-multipoint network\n"
8486 "Specify OSPF point-to-point network\n")
8488 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8489 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
8490 struct route_node
*rn
;
8492 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
8493 IF_DEF_PARAMS(ifp
)->ptp_dmvpn
= 0;
8495 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
8498 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8499 struct ospf_interface
*oi
= rn
->info
;
8504 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
8506 if (oi
->state
> ISM_Down
) {
8507 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
8508 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
8515 DEFUN_HIDDEN (no_ospf_network
,
8516 no_ospf_network_cmd
,
8517 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
8519 "OSPF interface commands\n"
8521 "Specify OSPF broadcast multi-access network\n"
8522 "Specify OSPF NBMA network\n"
8523 "Specify OSPF point-to-multipoint network\n"
8524 "Specify OSPF point-to-point network\n")
8526 return no_ip_ospf_network(self
, vty
, argc
, argv
);
8529 DEFUN (ip_ospf_priority
,
8530 ip_ospf_priority_cmd
,
8531 "ip ospf priority (0-255) [A.B.C.D]",
8533 "OSPF interface commands\n"
8536 "Address of interface\n")
8538 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8541 struct route_node
*rn
;
8542 struct in_addr addr
;
8543 struct ospf_if_params
*params
;
8544 params
= IF_DEF_PARAMS(ifp
);
8546 argv_find(argv
, argc
, "(0-255)", &idx
);
8547 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
8549 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8550 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8552 "Please specify interface address by A.B.C.D\n");
8553 return CMD_WARNING_CONFIG_FAILED
;
8556 params
= ospf_get_if_params(ifp
, addr
);
8557 ospf_if_update_params(ifp
, addr
);
8560 SET_IF_PARAM(params
, priority
);
8561 params
->priority
= priority
;
8563 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8564 struct ospf_interface
*oi
= rn
->info
;
8569 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8570 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8571 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8578 DEFUN_HIDDEN (ospf_priority
,
8580 "ospf priority (0-255) [A.B.C.D]",
8581 "OSPF interface commands\n"
8584 "Address of interface\n")
8586 return ip_ospf_priority(self
, vty
, argc
, argv
);
8589 DEFUN (no_ip_ospf_priority
,
8590 no_ip_ospf_priority_cmd
,
8591 "no ip ospf priority [(0-255) [A.B.C.D]]",
8594 "OSPF interface commands\n"
8595 "Router priority\n" // ignored
8597 "Address of interface\n")
8599 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8601 struct route_node
*rn
;
8602 struct in_addr addr
;
8603 struct ospf_if_params
*params
;
8605 params
= IF_DEF_PARAMS(ifp
);
8607 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8608 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8610 "Please specify interface address by A.B.C.D\n");
8611 return CMD_WARNING_CONFIG_FAILED
;
8614 params
= ospf_lookup_if_params(ifp
, addr
);
8619 UNSET_IF_PARAM(params
, priority
);
8620 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
8622 if (params
!= IF_DEF_PARAMS(ifp
)) {
8623 ospf_free_if_params(ifp
, addr
);
8624 ospf_if_update_params(ifp
, addr
);
8627 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
8628 struct ospf_interface
*oi
= rn
->info
;
8633 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
8634 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
8635 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
8642 DEFUN_HIDDEN (no_ospf_priority
,
8643 no_ospf_priority_cmd
,
8644 "no ospf priority [(0-255) [A.B.C.D]]",
8646 "OSPF interface commands\n"
8649 "Address of interface\n")
8651 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
8654 DEFUN (ip_ospf_retransmit_interval
,
8655 ip_ospf_retransmit_interval_addr_cmd
,
8656 "ip ospf retransmit-interval (1-65535) [A.B.C.D]",
8658 "OSPF interface commands\n"
8659 "Time between retransmitting lost link state advertisements\n"
8661 "Address of interface\n")
8663 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8666 struct in_addr addr
;
8667 struct ospf_if_params
*params
;
8668 params
= IF_DEF_PARAMS(ifp
);
8670 argv_find(argv
, argc
, "(1-65535)", &idx
);
8671 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8673 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8674 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8676 "Please specify interface address by A.B.C.D\n");
8677 return CMD_WARNING_CONFIG_FAILED
;
8680 params
= ospf_get_if_params(ifp
, addr
);
8681 ospf_if_update_params(ifp
, addr
);
8684 SET_IF_PARAM(params
, retransmit_interval
);
8685 params
->retransmit_interval
= seconds
;
8690 DEFUN_HIDDEN (ospf_retransmit_interval
,
8691 ospf_retransmit_interval_cmd
,
8692 "ospf retransmit-interval (1-65535) [A.B.C.D]",
8693 "OSPF interface commands\n"
8694 "Time between retransmitting lost link state advertisements\n"
8696 "Address of interface\n")
8698 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8701 DEFUN (no_ip_ospf_retransmit_interval
,
8702 no_ip_ospf_retransmit_interval_addr_cmd
,
8703 "no ip ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8706 "OSPF interface commands\n"
8707 "Time between retransmitting lost link state advertisements\n"
8709 "Address of interface\n")
8711 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8713 struct in_addr addr
;
8714 struct ospf_if_params
*params
;
8716 params
= IF_DEF_PARAMS(ifp
);
8718 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8719 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8721 "Please specify interface address by A.B.C.D\n");
8722 return CMD_WARNING_CONFIG_FAILED
;
8725 params
= ospf_lookup_if_params(ifp
, addr
);
8730 UNSET_IF_PARAM(params
, retransmit_interval
);
8731 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
8733 if (params
!= IF_DEF_PARAMS(ifp
)) {
8734 ospf_free_if_params(ifp
, addr
);
8735 ospf_if_update_params(ifp
, addr
);
8741 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
8742 no_ospf_retransmit_interval_cmd
,
8743 "no ospf retransmit-interval [(1-65535)] [A.B.C.D]",
8745 "OSPF interface commands\n"
8746 "Time between retransmitting lost link state advertisements\n"
8748 "Address of interface\n")
8750 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
8753 DEFUN (ip_ospf_transmit_delay
,
8754 ip_ospf_transmit_delay_addr_cmd
,
8755 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
8757 "OSPF interface commands\n"
8758 "Link state transmit delay\n"
8760 "Address of interface\n")
8762 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8765 struct in_addr addr
;
8766 struct ospf_if_params
*params
;
8768 params
= IF_DEF_PARAMS(ifp
);
8769 argv_find(argv
, argc
, "(1-65535)", &idx
);
8770 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
8772 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8773 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8775 "Please specify interface address by A.B.C.D\n");
8776 return CMD_WARNING_CONFIG_FAILED
;
8779 params
= ospf_get_if_params(ifp
, addr
);
8780 ospf_if_update_params(ifp
, addr
);
8783 SET_IF_PARAM(params
, transmit_delay
);
8784 params
->transmit_delay
= seconds
;
8789 DEFUN_HIDDEN (ospf_transmit_delay
,
8790 ospf_transmit_delay_cmd
,
8791 "ospf transmit-delay (1-65535) [A.B.C.D]",
8792 "OSPF interface commands\n"
8793 "Link state transmit delay\n"
8795 "Address of interface\n")
8797 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8800 DEFUN (no_ip_ospf_transmit_delay
,
8801 no_ip_ospf_transmit_delay_addr_cmd
,
8802 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
8805 "OSPF interface commands\n"
8806 "Link state transmit delay\n"
8808 "Address of interface\n")
8810 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8812 struct in_addr addr
;
8813 struct ospf_if_params
*params
;
8815 params
= IF_DEF_PARAMS(ifp
);
8817 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
8818 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
8820 "Please specify interface address by A.B.C.D\n");
8821 return CMD_WARNING_CONFIG_FAILED
;
8824 params
= ospf_lookup_if_params(ifp
, addr
);
8829 UNSET_IF_PARAM(params
, transmit_delay
);
8830 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
8832 if (params
!= IF_DEF_PARAMS(ifp
)) {
8833 ospf_free_if_params(ifp
, addr
);
8834 ospf_if_update_params(ifp
, addr
);
8841 DEFUN_HIDDEN (no_ospf_transmit_delay
,
8842 no_ospf_transmit_delay_cmd
,
8843 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
8845 "OSPF interface commands\n"
8846 "Link state transmit delay\n"
8848 "Address of interface\n")
8850 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8853 DEFUN (ip_ospf_area
,
8855 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8857 "OSPF interface commands\n"
8859 "Enable OSPF on this interface\n"
8860 "OSPF area ID in IP address format\n"
8861 "OSPF area ID as a decimal value\n"
8862 "Address of interface\n")
8864 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8867 struct in_addr area_id
;
8868 struct in_addr addr
;
8869 struct ospf_if_params
*params
= NULL
;
8870 struct route_node
*rn
;
8871 struct ospf
*ospf
= NULL
;
8872 unsigned short instance
= 0;
8876 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8877 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8879 argv_find(argv
, argc
, "area", &idx
);
8880 areaid
= argv
[idx
+ 1]->arg
;
8883 ospf
= ifp
->vrf
->info
;
8885 ospf
= ospf_lookup_instance(instance
);
8887 if (instance
&& instance
!= ospf_instance
) {
8889 * At this point we know we have received
8890 * an instance and there is no ospf instance
8891 * associated with it. This means we are
8892 * in a situation where we have an
8893 * ospf command that is setup for a different
8894 * process(instance). We need to safely
8895 * remove the command from ourselves and
8896 * allow the other instance(process) handle
8897 * the configuration command.
8901 params
= IF_DEF_PARAMS(ifp
);
8902 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8903 UNSET_IF_PARAM(params
, if_area
);
8907 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
; rn
= route_next(rn
))
8908 if ((params
= rn
->info
) && OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8909 UNSET_IF_PARAM(params
, if_area
);
8914 ospf
= ifp
->vrf
->info
;
8916 ospf_interface_area_unset(ospf
, ifp
);
8919 return CMD_NOT_MY_INSTANCE
;
8922 ret
= str2area_id(areaid
, &area_id
, &format
);
8924 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8925 return CMD_WARNING_CONFIG_FAILED
;
8927 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8928 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8929 return CMD_WARNING_CONFIG_FAILED
;
8933 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8934 if (rn
->info
!= NULL
) {
8936 "Please remove all network commands first.\n");
8937 return CMD_WARNING_CONFIG_FAILED
;
8942 params
= IF_DEF_PARAMS(ifp
);
8943 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8944 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8946 "Must remove previous area config before changing ospf area \n");
8947 return CMD_WARNING_CONFIG_FAILED
;
8950 // Check if we have an address arg and proccess it
8951 if (argc
== idx
+ 3) {
8952 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8954 "Please specify Intf Address by A.B.C.D\n");
8955 return CMD_WARNING_CONFIG_FAILED
;
8957 // update/create address-level params
8958 params
= ospf_get_if_params((ifp
), (addr
));
8959 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8960 if (!IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8962 "Must remove previous area/address config before changing ospf area\n");
8963 return CMD_WARNING_CONFIG_FAILED
;
8967 ospf_if_update_params((ifp
), (addr
));
8970 /* enable ospf on this interface with area_id */
8972 SET_IF_PARAM(params
, if_area
);
8973 params
->if_area
= area_id
;
8974 params
->if_area_id_fmt
= format
;
8978 ospf_interface_area_set(ospf
, ifp
);
8983 DEFUN (no_ip_ospf_area
,
8984 no_ip_ospf_area_cmd
,
8985 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8988 "OSPF interface commands\n"
8990 "Disable OSPF on this interface\n"
8991 "OSPF area ID in IP address format\n"
8992 "OSPF area ID as a decimal value\n"
8993 "Address of interface\n")
8995 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8998 struct ospf_if_params
*params
;
8999 unsigned short instance
= 0;
9000 struct in_addr addr
;
9001 struct in_addr area_id
;
9003 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
9004 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
9007 ospf
= ifp
->vrf
->info
;
9009 ospf
= ospf_lookup_instance(instance
);
9011 if (instance
&& instance
!= ospf_instance
)
9012 return CMD_NOT_MY_INSTANCE
;
9014 argv_find(argv
, argc
, "area", &idx
);
9016 // Check if we have an address arg and proccess it
9017 if (argc
== idx
+ 3) {
9018 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
9020 "Please specify Intf Address by A.B.C.D\n");
9021 return CMD_WARNING_CONFIG_FAILED
;
9023 params
= ospf_lookup_if_params(ifp
, addr
);
9024 if ((params
) == NULL
)
9027 params
= IF_DEF_PARAMS(ifp
);
9029 area_id
= params
->if_area
;
9030 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9032 "Can't find specified interface area configuration.\n");
9033 return CMD_WARNING_CONFIG_FAILED
;
9036 UNSET_IF_PARAM(params
, if_area
);
9037 if (params
!= IF_DEF_PARAMS((ifp
))) {
9038 ospf_free_if_params((ifp
), (addr
));
9039 ospf_if_update_params((ifp
), (addr
));
9043 ospf_interface_area_unset(ospf
, ifp
);
9044 ospf_area_check_free(ospf
, area_id
);
9050 DEFUN (ip_ospf_passive
,
9051 ip_ospf_passive_cmd
,
9052 "ip ospf passive [A.B.C.D]",
9054 "OSPF interface commands\n"
9055 "Suppress routing updates on an interface\n"
9056 "Address of interface\n")
9058 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9060 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9061 struct ospf_if_params
*params
;
9065 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9068 "Please specify interface address by A.B.C.D\n");
9069 return CMD_WARNING_CONFIG_FAILED
;
9071 params
= ospf_get_if_params(ifp
, addr
);
9072 ospf_if_update_params(ifp
, addr
);
9074 params
= IF_DEF_PARAMS(ifp
);
9077 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_PASSIVE
);
9082 DEFUN (no_ip_ospf_passive
,
9083 no_ip_ospf_passive_cmd
,
9084 "no ip ospf passive [A.B.C.D]",
9087 "OSPF interface commands\n"
9088 "Enable routing updates on an interface\n"
9089 "Address of interface\n")
9091 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9093 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
9094 struct ospf_if_params
*params
;
9098 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9101 "Please specify interface address by A.B.C.D\n");
9102 return CMD_WARNING_CONFIG_FAILED
;
9104 params
= ospf_lookup_if_params(ifp
, addr
);
9108 params
= IF_DEF_PARAMS(ifp
);
9111 ospf_passive_interface_update(ifp
, params
, addr
, OSPF_IF_ACTIVE
);
9116 DEFUN (ospf_redistribute_source
,
9117 ospf_redistribute_source_cmd
,
9118 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9120 FRR_REDIST_HELP_STR_OSPFD
9121 "Metric for redistributed routes\n"
9122 "OSPF default metric\n"
9123 "OSPF exterior metric type for redistributed routes\n"
9124 "Set OSPF External Type 1/2 metrics\n"
9125 "Route map reference\n"
9126 "Pointer to route-map entries\n")
9128 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9129 int idx_protocol
= 1;
9133 struct ospf_redist
*red
;
9135 bool update
= false;
9137 /* Get distribute source. */
9138 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9140 return CMD_WARNING_CONFIG_FAILED
;
9142 /* Get metric value. */
9143 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9144 if (!str2metric(argv
[idx
]->arg
, &metric
))
9145 return CMD_WARNING_CONFIG_FAILED
;
9148 /* Get metric type. */
9149 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9150 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9151 return CMD_WARNING_CONFIG_FAILED
;
9155 red
= ospf_redist_lookup(ospf
, source
, 0);
9157 red
= ospf_redist_add(ospf
, source
, 0);
9162 if (argv_find(argv
, argc
, "WORD", &idx
)) {
9163 ospf_routemap_set(red
, argv
[idx
]->arg
);
9165 ospf_routemap_unset(red
);
9168 return ospf_redistribute_update(ospf
, red
, source
, 0, type
,
9171 return ospf_redistribute_set(ospf
, red
, source
, 0, type
,
9175 DEFUN (no_ospf_redistribute_source
,
9176 no_ospf_redistribute_source_cmd
,
9177 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9180 FRR_REDIST_HELP_STR_OSPFD
9181 "Metric for redistributed routes\n"
9182 "OSPF default metric\n"
9183 "OSPF exterior metric type for redistributed routes\n"
9184 "Set OSPF External Type 1/2 metrics\n"
9185 "Route map reference\n"
9186 "Pointer to route-map entries\n")
9188 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9189 int idx_protocol
= 2;
9191 struct ospf_redist
*red
;
9193 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
9195 return CMD_WARNING_CONFIG_FAILED
;
9197 red
= ospf_redist_lookup(ospf
, source
, 0);
9201 ospf_routemap_unset(red
);
9202 ospf_redist_del(ospf
, source
, 0);
9204 return ospf_redistribute_unset(ospf
, source
, 0);
9207 DEFUN (ospf_redistribute_instance_source
,
9208 ospf_redistribute_instance_source_cmd
,
9209 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9211 "Open Shortest Path First\n"
9212 "Non-main Kernel Routing Table\n"
9213 "Instance ID/Table ID\n"
9214 "Metric for redistributed routes\n"
9215 "OSPF default metric\n"
9216 "OSPF exterior metric type for redistributed routes\n"
9217 "Set OSPF External Type 1/2 metrics\n"
9218 "Route map reference\n"
9219 "Pointer to route-map entries\n")
9221 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9222 int idx_ospf_table
= 1;
9228 unsigned short instance
;
9229 struct ospf_redist
*red
;
9230 bool update
= false;
9232 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
9235 vty_out(vty
, "Unknown instance redistribution\n");
9236 return CMD_WARNING_CONFIG_FAILED
;
9239 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9241 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9243 "Instance redistribution in non-instanced OSPF not allowed\n");
9244 return CMD_WARNING_CONFIG_FAILED
;
9247 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9248 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9249 return CMD_WARNING_CONFIG_FAILED
;
9252 /* Get metric value. */
9253 if (argv_find(argv
, argc
, "metric", &idx
))
9254 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
9255 return CMD_WARNING_CONFIG_FAILED
;
9258 /* Get metric type. */
9259 if (argv_find(argv
, argc
, "metric-type", &idx
))
9260 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
9261 return CMD_WARNING_CONFIG_FAILED
;
9263 red
= ospf_redist_lookup(ospf
, source
, instance
);
9265 red
= ospf_redist_add(ospf
, source
, instance
);
9270 if (argv_find(argv
, argc
, "route-map", &idx
))
9271 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
9273 ospf_routemap_unset(red
);
9276 return ospf_redistribute_update(ospf
, red
, source
, instance
,
9279 return ospf_redistribute_set(ospf
, red
, source
, instance
, type
,
9283 DEFUN (no_ospf_redistribute_instance_source
,
9284 no_ospf_redistribute_instance_source_cmd
,
9285 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9288 "Open Shortest Path First\n"
9289 "Non-main Kernel Routing Table\n"
9290 "Instance ID/Table Id\n"
9291 "Metric for redistributed routes\n"
9292 "OSPF default metric\n"
9293 "OSPF exterior metric type for redistributed routes\n"
9294 "Set OSPF External Type 1/2 metrics\n"
9295 "Route map reference\n"
9296 "Pointer to route-map entries\n")
9298 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9299 int idx_ospf_table
= 2;
9301 unsigned int instance
;
9302 struct ospf_redist
*red
;
9305 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9306 source
= ZEBRA_ROUTE_OSPF
;
9308 source
= ZEBRA_ROUTE_TABLE
;
9310 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9312 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
9314 "Instance redistribution in non-instanced OSPF not allowed\n");
9315 return CMD_WARNING_CONFIG_FAILED
;
9318 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
9319 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
9320 return CMD_WARNING_CONFIG_FAILED
;
9323 red
= ospf_redist_lookup(ospf
, source
, instance
);
9327 ospf_routemap_unset(red
);
9328 ospf_redist_del(ospf
, source
, instance
);
9330 return ospf_redistribute_unset(ospf
, source
, instance
);
9333 DEFUN (ospf_distribute_list_out
,
9334 ospf_distribute_list_out_cmd
,
9335 "distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9336 "Filter networks in routing updates\n"
9337 "Access-list name\n"
9339 FRR_REDIST_HELP_STR_OSPFD
)
9341 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9345 char *proto
= argv
[argc
- 1]->text
;
9347 /* Get distribute source. */
9348 source
= proto_redistnum(AFI_IP
, proto
);
9350 return CMD_WARNING_CONFIG_FAILED
;
9352 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
9355 DEFUN (no_ospf_distribute_list_out
,
9356 no_ospf_distribute_list_out_cmd
,
9357 "no distribute-list ACCESSLIST4_NAME out " FRR_REDIST_STR_OSPFD
,
9359 "Filter networks in routing updates\n"
9360 "Access-list name\n"
9362 FRR_REDIST_HELP_STR_OSPFD
)
9364 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9368 char *proto
= argv
[argc
- 1]->text
;
9369 source
= proto_redistnum(AFI_IP
, proto
);
9371 return CMD_WARNING_CONFIG_FAILED
;
9373 return ospf_distribute_list_out_unset(ospf
, source
,
9374 argv
[idx_word
]->arg
);
9377 /* Default information originate. */
9378 DEFUN (ospf_default_information_originate
,
9379 ospf_default_information_originate_cmd
,
9380 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9381 "Control distribution of default information\n"
9382 "Distribute a default route\n"
9383 "Always advertise default route\n"
9384 "OSPF default metric\n"
9386 "OSPF metric type for default routes\n"
9387 "Set OSPF External Type 1/2 metrics\n"
9388 "Route map reference\n"
9389 "Pointer to route-map entries\n")
9391 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9392 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
9395 struct ospf_redist
*red
;
9397 int cur_originate
= ospf
->default_originate
;
9398 bool sameRtmap
= false;
9401 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
9403 /* Check whether "always" was specified */
9404 if (argv_find(argv
, argc
, "always", &idx
))
9405 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
9407 /* Get metric value */
9408 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
9409 if (!str2metric(argv
[idx
]->arg
, &metric
))
9410 return CMD_WARNING_CONFIG_FAILED
;
9413 /* Get metric type. */
9414 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
9415 if (!str2metric_type(argv
[idx
]->arg
, &type
))
9416 return CMD_WARNING_CONFIG_FAILED
;
9420 if (argv_find(argv
, argc
, "WORD", &idx
))
9421 rtmap
= argv
[idx
]->arg
;
9423 /* To check if user is providing same route map */
9424 if ((!rtmap
&& !ROUTEMAP_NAME(red
)) ||
9425 (rtmap
&& ROUTEMAP_NAME(red
) &&
9426 (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
9429 /* Don't allow if the same lsa is already originated. */
9431 && (red
->dmetric
.type
== type
)
9432 && (red
->dmetric
.value
== metric
)
9433 && (cur_originate
== default_originate
))
9436 /* Updating Metric details */
9437 red
->dmetric
.type
= type
;
9438 red
->dmetric
.value
= metric
;
9440 /* updating route map details */
9442 ospf_routemap_set(red
, rtmap
);
9444 ospf_routemap_unset(red
);
9446 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
9450 DEFUN (no_ospf_default_information_originate
,
9451 no_ospf_default_information_originate_cmd
,
9452 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
9454 "Control distribution of default information\n"
9455 "Distribute a default route\n"
9456 "Always advertise default route\n"
9457 "OSPF default metric\n"
9459 "OSPF metric type for default routes\n"
9460 "Set OSPF External Type 1/2 metrics\n"
9461 "Route map reference\n"
9462 "Pointer to route-map entries\n")
9464 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9465 struct ospf_redist
*red
;
9467 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
9471 ospf_routemap_unset(red
);
9472 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
9474 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
9478 DEFUN (ospf_default_metric
,
9479 ospf_default_metric_cmd
,
9480 "default-metric (0-16777214)",
9481 "Set metric of redistributed routes\n"
9484 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9488 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
9489 return CMD_WARNING_CONFIG_FAILED
;
9491 ospf
->default_metric
= metric
;
9496 DEFUN (no_ospf_default_metric
,
9497 no_ospf_default_metric_cmd
,
9498 "no default-metric [(0-16777214)]",
9500 "Set metric of redistributed routes\n"
9503 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9505 ospf
->default_metric
= -1;
9511 DEFUN (ospf_distance
,
9514 "Administrative distance\n"
9515 "OSPF Administrative distance\n")
9517 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9521 distance
= atoi(argv
[idx_number
]->arg
);
9522 if (ospf
->distance_all
!= distance
) {
9523 ospf
->distance_all
= distance
;
9524 ospf_restart_spf(ospf
);
9530 DEFUN (no_ospf_distance
,
9531 no_ospf_distance_cmd
,
9532 "no distance (1-255)",
9534 "Administrative distance\n"
9535 "OSPF Administrative distance\n")
9537 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9539 if (ospf
->distance_all
) {
9540 ospf
->distance_all
= 0;
9541 ospf_restart_spf(ospf
);
9547 DEFUN (no_ospf_distance_ospf
,
9548 no_ospf_distance_ospf_cmd
,
9549 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
9551 "Administrative distance\n"
9552 "OSPF administrative distance\n"
9553 "Intra-area routes\n"
9554 "Distance for intra-area routes\n"
9555 "Inter-area routes\n"
9556 "Distance for inter-area routes\n"
9558 "Distance for external routes\n")
9560 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9563 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
9564 idx
= ospf
->distance_intra
= 0;
9565 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
9566 idx
= ospf
->distance_inter
= 0;
9567 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
9568 ospf
->distance_external
= 0;
9573 DEFUN (ospf_distance_ospf
,
9574 ospf_distance_ospf_cmd
,
9575 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
9576 "Administrative distance\n"
9577 "OSPF administrative distance\n"
9578 "Intra-area routes\n"
9579 "Distance for intra-area routes\n"
9580 "Inter-area routes\n"
9581 "Distance for inter-area routes\n"
9583 "Distance for external routes\n")
9585 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9588 ospf
->distance_intra
= 0;
9589 ospf
->distance_inter
= 0;
9590 ospf
->distance_external
= 0;
9592 if (argv_find(argv
, argc
, "intra-area", &idx
))
9593 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
9595 if (argv_find(argv
, argc
, "inter-area", &idx
))
9596 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
9598 if (argv_find(argv
, argc
, "external", &idx
))
9599 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
9604 DEFUN (ip_ospf_mtu_ignore
,
9605 ip_ospf_mtu_ignore_addr_cmd
,
9606 "ip ospf mtu-ignore [A.B.C.D]",
9608 "OSPF interface commands\n"
9609 "Disable MTU mismatch detection on this interface\n"
9610 "Address of interface\n")
9612 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9614 struct in_addr addr
;
9617 struct ospf_if_params
*params
;
9618 params
= IF_DEF_PARAMS(ifp
);
9621 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9624 "Please specify interface address by A.B.C.D\n");
9625 return CMD_WARNING_CONFIG_FAILED
;
9627 params
= ospf_get_if_params(ifp
, addr
);
9628 ospf_if_update_params(ifp
, addr
);
9630 params
->mtu_ignore
= 1;
9631 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9632 SET_IF_PARAM(params
, mtu_ignore
);
9634 UNSET_IF_PARAM(params
, mtu_ignore
);
9635 if (params
!= IF_DEF_PARAMS(ifp
)) {
9636 ospf_free_if_params(ifp
, addr
);
9637 ospf_if_update_params(ifp
, addr
);
9643 DEFUN (no_ip_ospf_mtu_ignore
,
9644 no_ip_ospf_mtu_ignore_addr_cmd
,
9645 "no ip ospf mtu-ignore [A.B.C.D]",
9648 "OSPF interface commands\n"
9649 "Disable MTU mismatch detection on this interface\n"
9650 "Address of interface\n")
9652 VTY_DECLVAR_CONTEXT(interface
, ifp
);
9654 struct in_addr addr
;
9657 struct ospf_if_params
*params
;
9658 params
= IF_DEF_PARAMS(ifp
);
9661 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
9664 "Please specify interface address by A.B.C.D\n");
9665 return CMD_WARNING_CONFIG_FAILED
;
9667 params
= ospf_get_if_params(ifp
, addr
);
9668 ospf_if_update_params(ifp
, addr
);
9670 params
->mtu_ignore
= 0;
9671 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
9672 SET_IF_PARAM(params
, mtu_ignore
);
9674 UNSET_IF_PARAM(params
, mtu_ignore
);
9675 if (params
!= IF_DEF_PARAMS(ifp
)) {
9676 ospf_free_if_params(ifp
, addr
);
9677 ospf_if_update_params(ifp
, addr
);
9684 DEFUN (ospf_max_metric_router_lsa_admin
,
9685 ospf_max_metric_router_lsa_admin_cmd
,
9686 "max-metric router-lsa administrative",
9687 "OSPF maximum / infinite-distance metric\n"
9688 "Advertise own Router-LSA with infinite distance (stub router)\n"
9689 "Administratively applied, for an indefinite period\n")
9691 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9692 struct listnode
*ln
;
9693 struct ospf_area
*area
;
9695 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9696 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
9698 if (!CHECK_FLAG(area
->stub_router_state
,
9699 OSPF_AREA_IS_STUB_ROUTED
))
9700 ospf_router_lsa_update_area(area
);
9703 /* Allows for areas configured later to get the property */
9704 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
9709 DEFUN (no_ospf_max_metric_router_lsa_admin
,
9710 no_ospf_max_metric_router_lsa_admin_cmd
,
9711 "no max-metric router-lsa administrative",
9713 "OSPF maximum / infinite-distance metric\n"
9714 "Advertise own Router-LSA with infinite distance (stub router)\n"
9715 "Administratively applied, for an indefinite period\n")
9717 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9718 struct listnode
*ln
;
9719 struct ospf_area
*area
;
9721 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9722 UNSET_FLAG(area
->stub_router_state
,
9723 OSPF_AREA_ADMIN_STUB_ROUTED
);
9725 /* Don't trample on the start-up stub timer */
9726 if (CHECK_FLAG(area
->stub_router_state
,
9727 OSPF_AREA_IS_STUB_ROUTED
)
9728 && !area
->t_stub_router
) {
9729 UNSET_FLAG(area
->stub_router_state
,
9730 OSPF_AREA_IS_STUB_ROUTED
);
9731 ospf_router_lsa_update_area(area
);
9734 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
9738 DEFUN (ospf_max_metric_router_lsa_startup
,
9739 ospf_max_metric_router_lsa_startup_cmd
,
9740 "max-metric router-lsa on-startup (5-86400)",
9741 "OSPF maximum / infinite-distance metric\n"
9742 "Advertise own Router-LSA with infinite distance (stub router)\n"
9743 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9744 "Time (seconds) to advertise self as stub-router\n")
9746 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9748 unsigned int seconds
;
9751 vty_out(vty
, "%% Must supply stub-router period\n");
9752 return CMD_WARNING_CONFIG_FAILED
;
9755 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9757 ospf
->stub_router_startup_time
= seconds
;
9762 DEFUN (no_ospf_max_metric_router_lsa_startup
,
9763 no_ospf_max_metric_router_lsa_startup_cmd
,
9764 "no max-metric router-lsa on-startup [(5-86400)]",
9766 "OSPF maximum / infinite-distance metric\n"
9767 "Advertise own Router-LSA with infinite distance (stub router)\n"
9768 "Automatically advertise stub Router-LSA on startup of OSPF\n"
9769 "Time (seconds) to advertise self as stub-router\n")
9771 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9772 struct listnode
*ln
;
9773 struct ospf_area
*area
;
9775 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9777 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
9778 SET_FLAG(area
->stub_router_state
,
9779 OSPF_AREA_WAS_START_STUB_ROUTED
);
9780 OSPF_TIMER_OFF(area
->t_stub_router
);
9782 /* Don't trample on admin stub routed */
9783 if (!CHECK_FLAG(area
->stub_router_state
,
9784 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
9785 UNSET_FLAG(area
->stub_router_state
,
9786 OSPF_AREA_IS_STUB_ROUTED
);
9787 ospf_router_lsa_update_area(area
);
9794 DEFUN (ospf_max_metric_router_lsa_shutdown
,
9795 ospf_max_metric_router_lsa_shutdown_cmd
,
9796 "max-metric router-lsa on-shutdown (5-100)",
9797 "OSPF maximum / infinite-distance metric\n"
9798 "Advertise own Router-LSA with infinite distance (stub router)\n"
9799 "Advertise stub-router prior to full shutdown of OSPF\n"
9800 "Time (seconds) to wait till full shutdown\n")
9802 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9804 unsigned int seconds
;
9807 vty_out(vty
, "%% Must supply stub-router shutdown period\n");
9808 return CMD_WARNING_CONFIG_FAILED
;
9811 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9813 ospf
->stub_router_shutdown_time
= seconds
;
9818 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
9819 no_ospf_max_metric_router_lsa_shutdown_cmd
,
9820 "no max-metric router-lsa on-shutdown [(5-100)]",
9822 "OSPF maximum / infinite-distance metric\n"
9823 "Advertise own Router-LSA with infinite distance (stub router)\n"
9824 "Advertise stub-router prior to full shutdown of OSPF\n"
9825 "Time (seconds) to wait till full shutdown\n")
9827 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9829 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
9834 DEFUN (ospf_proactive_arp
,
9835 ospf_proactive_arp_cmd
,
9837 "Allow sending ARP requests proactively\n")
9839 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9841 ospf
->proactive_arp
= true;
9846 DEFUN (no_ospf_proactive_arp
,
9847 no_ospf_proactive_arp_cmd
,
9850 "Disallow sending ARP requests proactively\n")
9852 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9854 ospf
->proactive_arp
= false;
9859 /* Graceful Restart HELPER Commands */
9860 DEFPY(ospf_gr_helper_enable
, ospf_gr_helper_enable_cmd
,
9861 "graceful-restart helper enable [A.B.C.D$address]",
9862 "OSPF Graceful Restart\n"
9864 "Enable Helper support\n"
9865 "Advertising Router-ID\n")
9867 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9870 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9875 ospf_gr_helper_support_set(ospf
, OSPF_GR_TRUE
);
9880 DEFPY(no_ospf_gr_helper_enable
,
9881 no_ospf_gr_helper_enable_cmd
,
9882 "no graceful-restart helper enable [A.B.C.D$address]",
9884 "OSPF Graceful Restart\n"
9886 "Enable Helper support\n"
9887 "Advertising Router-ID\n")
9889 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9892 ospf_gr_helper_support_set_per_routerid(ospf
, &address
,
9897 ospf_gr_helper_support_set(ospf
, OSPF_GR_FALSE
);
9901 #if CONFDATE > 20220921
9903 "Time to remove the deprecated \"[no] graceful-restart helper-only\" commands")
9906 DEFPY_HIDDEN(ospf_gr_helper_only
, ospf_gr_helper_only_cmd
,
9907 "graceful-restart helper-only [A.B.C.D]",
9908 "OSPF Graceful Restart\n"
9909 "Enable Helper support\n"
9910 "Advertising router id\n")
9912 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9913 struct in_addr addr
;
9917 "%% This command is deprecated. Please, use `graceful-restart helper enable` instead.\n");
9920 ret
= inet_aton(argv
[2]->arg
, &addr
);
9923 "Please specify the valid routerid address.\n");
9924 return CMD_WARNING_CONFIG_FAILED
;
9927 ospf_gr_helper_support_set_per_routerid(ospf
, &addr
, OSPF_GR_TRUE
);
9931 ospf_gr_helper_support_set(ospf
, OSPF_GR_TRUE
);
9936 ALIAS_HIDDEN(no_ospf_gr_helper_enable
,
9937 no_ospf_gr_helper_only_cmd
,
9938 "no graceful-restart helper-only [A.B.C.D]",
9940 "OSPF Graceful Restart\n"
9941 "Disable Helper support\n"
9942 "Advertising router id\n")
9944 DEFPY(ospf_gr_helper_enable_lsacheck
,
9945 ospf_gr_helper_enable_lsacheck_cmd
,
9946 "graceful-restart helper strict-lsa-checking",
9947 "OSPF Graceful Restart\n"
9949 "Enable strict LSA check\n")
9951 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9953 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_TRUE
);
9957 DEFPY(no_ospf_gr_helper_enable_lsacheck
,
9958 no_ospf_gr_helper_enable_lsacheck_cmd
,
9959 "no graceful-restart helper strict-lsa-checking",
9961 "OSPF Graceful Restart\n"
9963 "Disable strict LSA check\n")
9965 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9967 ospf_gr_helper_lsa_check_set(ospf
, OSPF_GR_FALSE
);
9971 DEFPY(ospf_gr_helper_supported_grace_time
,
9972 ospf_gr_helper_supported_grace_time_cmd
,
9973 "graceful-restart helper supported-grace-time (10-1800)$interval",
9974 "OSPF Graceful Restart\n"
9976 "Supported grace timer\n"
9977 "Grace interval(in seconds)\n")
9979 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9981 ospf_gr_helper_supported_gracetime_set(ospf
, interval
);
9985 DEFPY(no_ospf_gr_helper_supported_grace_time
,
9986 no_ospf_gr_helper_supported_grace_time_cmd
,
9987 "no graceful-restart helper supported-grace-time (10-1800)$interval",
9989 "OSPF Graceful Restart\n"
9991 "Supported grace timer\n"
9992 "Grace interval(in seconds)\n")
9994 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
9996 ospf_gr_helper_supported_gracetime_set(ospf
, OSPF_MAX_GRACE_INTERVAL
);
10000 DEFPY(ospf_gr_helper_planned_only
,
10001 ospf_gr_helper_planned_only_cmd
,
10002 "graceful-restart helper planned-only",
10003 "OSPF Graceful Restart\n"
10005 "Supported only planned restart\n")
10007 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10009 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_TRUE
);
10011 return CMD_SUCCESS
;
10014 /* External Route Aggregation */
10015 DEFUN (ospf_external_route_aggregation
,
10016 ospf_external_route_aggregation_cmd
,
10017 "summary-address A.B.C.D/M [tag (1-4294967295)]",
10018 "External summary address\n"
10019 "Summary address prefix\n"
10021 "Router tag value\n")
10023 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10024 struct prefix_ipv4 p
;
10026 route_tag_t tag
= 0;
10027 int ret
= OSPF_SUCCESS
;
10029 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10031 if (is_default_prefix4(&p
)) {
10033 "Default address shouldn't be configured as summary address.\n");
10034 return CMD_SUCCESS
;
10037 /* Apply mask for given prefix. */
10038 apply_mask((struct prefix
*)&p
);
10040 if (!is_valid_summary_addr(&p
)) {
10041 vty_out(vty
, "Not a valid summary address.\n");
10042 return CMD_WARNING_CONFIG_FAILED
;
10046 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
10048 ret
= ospf_asbr_external_aggregator_set(ospf
, &p
, tag
);
10049 if (ret
== OSPF_INVALID
)
10050 vty_out(vty
, "Invalid configuration!!\n");
10052 return CMD_SUCCESS
;
10055 DEFUN (no_ospf_external_route_aggregation
,
10056 no_ospf_external_route_aggregation_cmd
,
10057 "no summary-address A.B.C.D/M [tag (1-4294967295)]",
10059 "External summary address\n"
10060 "Summary address prefix\n"
10062 "Router tag value\n")
10064 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10065 struct prefix_ipv4 p
;
10067 route_tag_t tag
= 0;
10068 int ret
= OSPF_SUCCESS
;
10070 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10072 if (is_default_prefix4(&p
)) {
10074 "Default address shouldn't be configured as summary address.\n");
10075 return CMD_SUCCESS
;
10078 /* Apply mask for given prefix. */
10079 apply_mask((struct prefix
*)&p
);
10081 if (!is_valid_summary_addr(&p
)) {
10082 vty_out(vty
, "Not a valid summary address.\n");
10083 return CMD_WARNING_CONFIG_FAILED
;
10087 tag
= strtoul(argv
[idx
+ 2]->arg
, NULL
, 10);
10089 ret
= ospf_asbr_external_aggregator_unset(ospf
, &p
, tag
);
10090 if (ret
== OSPF_INVALID
)
10091 vty_out(vty
, "Invalid configuration!!\n");
10093 return CMD_SUCCESS
;
10096 DEFPY(no_ospf_gr_helper_planned_only
,
10097 no_ospf_gr_helper_planned_only_cmd
,
10098 "no graceful-restart helper planned-only",
10100 "OSPF Graceful Restart\n"
10102 "Supported only for planned restart\n")
10104 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10106 ospf_gr_helper_set_supported_planned_only_restart(ospf
, OSPF_GR_FALSE
);
10108 return CMD_SUCCESS
;
10111 static int ospf_print_vty_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
10114 struct advRtr
*rtr
= bucket
->data
;
10115 struct vty
*vty
= (struct vty
*)arg
;
10116 static unsigned int count
;
10118 vty_out(vty
, "%-6pI4,", &rtr
->advRtrAddr
);
10121 if (count
% 5 == 0)
10122 vty_out(vty
, "\n");
10124 return HASHWALK_CONTINUE
;
10127 static int ospf_show_gr_helper_details(struct vty
*vty
, struct ospf
*ospf
,
10128 uint8_t use_vrf
, json_object
*json
,
10129 bool uj
, bool detail
)
10131 struct listnode
*node
;
10132 struct ospf_interface
*oi
;
10133 char buf
[PREFIX_STRLEN
];
10134 json_object
*json_vrf
= NULL
;
10138 json_vrf
= json_object_new_object();
10143 if (ospf
->instance
) {
10145 json_object_int_add(json
, "ospfInstance",
10148 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
10151 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
10155 json_object_object_add(json
, ospf_get_name(ospf
),
10158 vty_out(vty
, "\n");
10160 /* Show Router ID. */
10162 json_object_string_add(json_vrf
, "routerId",
10163 inet_ntop(AF_INET
, &ospf
->router_id
,
10164 buf
, sizeof(buf
)));
10166 vty_out(vty
, "\n OSPF Router with ID (%pI4)\n\n",
10172 if (ospf
->is_helper_supported
)
10174 " Graceful restart helper support enabled.\n");
10177 " Graceful restart helper support disabled.\n");
10179 if (ospf
->strict_lsa_check
)
10180 vty_out(vty
, " Strict LSA check is enabled.\n");
10182 vty_out(vty
, " Strict LSA check is disabled.\n");
10184 if (ospf
->only_planned_restart
)
10186 " Helper supported for planned restarts only.\n");
10189 " Helper supported for Planned and Unplanned Restarts.\n");
10192 " Supported Graceful restart interval: %d(in seconds).\n",
10193 ospf
->supported_grace_time
);
10195 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
10196 vty_out(vty
, " Enable Router list:\n");
10198 hash_walk(ospf
->enable_rtr_list
,
10199 ospf_print_vty_helper_dis_rtr_walkcb
, vty
);
10200 vty_out(vty
, "\n\n");
10203 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10204 vty_out(vty
, " Last Helper exit Reason :%s\n",
10205 ospf_exit_reason2str(ospf
->last_exit_reason
));
10208 if (ospf
->active_restarter_cnt
)
10210 " Number of Active neighbours in graceful restart: %d\n",
10211 ospf
->active_restarter_cnt
);
10213 vty_out(vty
, "\n");
10216 json_object_string_add(
10217 json_vrf
, "helperSupport",
10218 (ospf
->is_helper_supported
) ? "Enabled" : "Disabled");
10219 json_object_string_add(json_vrf
, "strictLsaCheck",
10220 (ospf
->strict_lsa_check
) ? "Enabled"
10222 json_object_string_add(
10223 json_vrf
, "restartSupoort",
10224 (ospf
->only_planned_restart
)
10225 ? "Planned Restart only"
10226 : "Planned and Unplanned Restarts");
10228 json_object_int_add(json_vrf
, "supportedGracePeriod",
10229 ospf
->supported_grace_time
);
10231 #if CONFDATE > 20230131
10232 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
10234 if (ospf
->last_exit_reason
!= OSPF_GR_HELPER_EXIT_NONE
) {
10235 json_object_string_add(
10236 json_vrf
, "LastExitReason",
10237 ospf_exit_reason2str(ospf
->last_exit_reason
));
10238 json_object_string_add(
10239 json_vrf
, "lastExitReason",
10240 ospf_exit_reason2str(ospf
->last_exit_reason
));
10243 if (ospf
->active_restarter_cnt
)
10244 json_object_int_add(json_vrf
, "activeRestarterCnt",
10245 ospf
->active_restarter_cnt
);
10251 json_object
*json_neighbors
= NULL
;
10253 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10254 struct route_node
*rn
;
10255 struct ospf_neighbor
*nbr
;
10256 json_object
*json_neigh
;
10258 if (ospf_interface_neighbor_count(oi
) == 0)
10262 json_object_object_get_ex(json_vrf
, "Neighbors",
10264 json_object_object_get_ex(json_vrf
, "neighbors",
10266 if (!json_neighbors
) {
10268 json_object_new_object();
10269 json_object_object_add(json_vrf
,
10272 json_object_object_add(json_vrf
,
10278 for (rn
= route_top(oi
->nbrs
); rn
;
10279 rn
= route_next(rn
)) {
10286 if (!OSPF_GR_IS_ACTIVE_HELPER(nbr
))
10290 vty_out(vty
, " Neighbour %d :\n", cnt
);
10291 vty_out(vty
, " Address : %pI4\n",
10292 &nbr
->address
.u
.prefix4
);
10293 vty_out(vty
, " Routerid : %pI4\n",
10296 " Received Grace period : %d(in seconds).\n",
10297 nbr
->gr_helper_info
10298 .recvd_grace_period
);
10300 " Actual Grace period : %d(in seconds)\n",
10301 nbr
->gr_helper_info
10302 .actual_grace_period
);
10304 " Remaining GraceTime:%ld(in seconds).\n",
10305 thread_timer_remain_second(
10306 nbr
->gr_helper_info
10309 " Graceful Restart reason: %s.\n\n",
10310 ospf_restart_reason2str(
10311 nbr
->gr_helper_info
10312 .gr_restart_reason
));
10315 json_neigh
= json_object_new_object();
10316 json_object_string_add(
10317 json_neigh
, "srcAddr",
10318 inet_ntop(AF_INET
, &nbr
->src
,
10319 buf
, sizeof(buf
)));
10321 json_object_string_add(
10322 json_neigh
, "routerid",
10325 buf
, sizeof(buf
)));
10326 json_object_int_add(
10328 "recvdGraceInterval",
10329 nbr
->gr_helper_info
10330 .recvd_grace_period
);
10331 json_object_int_add(
10333 "actualGraceInterval",
10334 nbr
->gr_helper_info
10335 .actual_grace_period
);
10336 json_object_int_add(
10337 json_neigh
, "remainGracetime",
10338 thread_timer_remain_second(
10339 nbr
->gr_helper_info
10341 json_object_string_add(
10342 json_neigh
, "restartReason",
10343 ospf_restart_reason2str(
10344 nbr
->gr_helper_info
10345 .gr_restart_reason
));
10346 json_object_object_add(
10348 inet_ntop(AF_INET
, &nbr
->src
,
10355 return CMD_SUCCESS
;
10358 DEFUN (ospf_external_route_aggregation_no_adrvertise
,
10359 ospf_external_route_aggregation_no_adrvertise_cmd
,
10360 "summary-address A.B.C.D/M no-advertise",
10361 "External summary address\n"
10362 "Summary address prefix\n"
10363 "Don't advertise summary route \n")
10365 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10366 struct prefix_ipv4 p
;
10368 int ret
= OSPF_SUCCESS
;
10370 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10372 if (is_default_prefix4(&p
)) {
10374 "Default address shouldn't be configured as summary address.\n");
10375 return CMD_SUCCESS
;
10378 /* Apply mask for given prefix. */
10379 apply_mask((struct prefix
*)&p
);
10381 if (!is_valid_summary_addr(&p
)) {
10382 vty_out(vty
, "Not a valid summary address.\n");
10383 return CMD_WARNING_CONFIG_FAILED
;
10386 ret
= ospf_asbr_external_rt_no_advertise(ospf
, &p
);
10387 if (ret
== OSPF_INVALID
)
10388 vty_out(vty
, "Invalid configuration!!\n");
10390 return CMD_SUCCESS
;
10393 DEFUN (no_ospf_external_route_aggregation_no_adrvertise
,
10394 no_ospf_external_route_aggregation_no_adrvertise_cmd
,
10395 "no summary-address A.B.C.D/M no-advertise",
10397 "External summary address\n"
10398 "Summary address prefix\n"
10399 "Advertise summary route to the AS \n")
10401 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10402 struct prefix_ipv4 p
;
10404 int ret
= OSPF_SUCCESS
;
10406 str2prefix_ipv4(argv
[idx
]->arg
, &p
);
10408 if (is_default_prefix4(&p
)) {
10410 "Default address shouldn't be configured as summary address.\n");
10411 return CMD_SUCCESS
;
10414 /* Apply mask for given prefix. */
10415 apply_mask((struct prefix
*)&p
);
10417 if (!is_valid_summary_addr(&p
)) {
10418 vty_out(vty
, "Not a valid summary address.\n");
10419 return CMD_WARNING_CONFIG_FAILED
;
10422 ret
= ospf_asbr_external_rt_advertise(ospf
, &p
);
10423 if (ret
== OSPF_INVALID
)
10424 vty_out(vty
, "Invalid configuration!!\n");
10426 return CMD_SUCCESS
;
10429 DEFUN (ospf_route_aggregation_timer
,
10430 ospf_route_aggregation_timer_cmd
,
10431 "aggregation timer (5-1800)",
10432 "External route aggregation\n"
10433 "Delay timer (in seconds)\n"
10434 "Timer interval(in seconds)\n")
10436 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10437 uint16_t interval
= 0;
10439 interval
= strtoul(argv
[2]->arg
, NULL
, 10);
10441 ospf_external_aggregator_timer_set(ospf
, interval
);
10443 return CMD_SUCCESS
;
10446 DEFPY (show_ip_ospf_gr_helper
,
10447 show_ip_ospf_gr_helper_cmd
,
10448 "show ip ospf [vrf <NAME|all>] graceful-restart helper [detail] [json]",
10451 "OSPF information\n"
10454 "OSPF Graceful Restart\n"
10455 "Helper details in the router\n"
10456 "Detailed information\n"
10459 char *vrf_name
= NULL
;
10460 bool all_vrf
= false;
10461 int ret
= CMD_SUCCESS
;
10464 uint8_t use_vrf
= 0;
10465 bool uj
= use_json(argc
, argv
);
10466 struct ospf
*ospf
= NULL
;
10467 json_object
*json
= NULL
;
10468 struct listnode
*node
= NULL
;
10470 bool detail
= false;
10472 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
10474 if (argv_find(argv
, argc
, "detail", &idx
))
10478 json
= json_object_new_object();
10480 /* vrf input is provided */
10485 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10486 if (!ospf
->oi_running
)
10489 ret
= ospf_show_gr_helper_details(
10490 vty
, ospf
, use_vrf
, json
, uj
, detail
);
10494 vty_json(vty
, json
);
10499 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
10501 if (ospf
== NULL
|| !ospf
->oi_running
) {
10504 vty_json(vty
, json
);
10507 "%% OSPF is not enabled in vrf %s\n",
10510 return CMD_SUCCESS
;
10515 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
10517 if (ospf
== NULL
|| !ospf
->oi_running
) {
10520 vty_json(vty
, json
);
10523 "%% OSPF is not enabled in vrf default\n");
10525 return CMD_SUCCESS
;
10528 ospf_show_gr_helper_details(vty
, ospf
, use_vrf
, json
, uj
,
10533 vty_json(vty
, json
);
10535 return CMD_SUCCESS
;
10537 /* Graceful Restart HELPER commands end */
10538 DEFUN (no_ospf_route_aggregation_timer
,
10539 no_ospf_route_aggregation_timer_cmd
,
10540 "no aggregation timer",
10542 "External route aggregation\n"
10545 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
10547 ospf_external_aggregator_timer_set(ospf
, OSPF_EXTL_AGGR_DEFAULT_DELAY
);
10549 return CMD_SUCCESS
;
10552 /* External Route Aggregation End */
10554 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
10556 struct listnode
*ln
;
10557 struct ospf_area
*area
;
10559 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10560 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
10561 ospf
->stub_router_startup_time
);
10562 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
10563 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
10564 ospf
->stub_router_shutdown_time
);
10565 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
10566 if (CHECK_FLAG(area
->stub_router_state
,
10567 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
10568 vty_out(vty
, " max-metric router-lsa administrative\n");
10575 #if CONFDATE > 20230131
10576 CPP_NOTICE("Remove JSON object commands with keys containing whitespaces")
10578 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
10579 struct route_table
*rt
,
10582 struct route_node
*rn
;
10583 struct ospf_route
* or ;
10584 struct listnode
*pnode
, *pnnode
;
10585 struct ospf_path
*path
;
10586 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10587 *json_nexthop
= NULL
;
10591 "============ OSPF network routing table ============\n");
10593 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10594 char buf1
[PREFIX2STR_BUFFER
];
10596 if ((or = rn
->info
) == NULL
)
10599 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
10602 json_route
= json_object_new_object();
10603 json_object_object_add(json
, buf1
, json_route
);
10606 switch (or->path_type
) {
10607 case OSPF_PATH_INTER_AREA
:
10608 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10610 json_object_string_add(json_route
,
10613 json_object_int_add(json_route
, "cost",
10615 json_object_string_addf(
10616 json_route
, "area", "%pI4",
10617 &or->u
.std
.area_id
);
10620 "N IA %-18s [%d] area: %pI4\n",
10622 &or->u
.std
.area_id
);
10624 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
10626 json_object_string_add(json_route
,
10631 "D IA %-18s Discard entry\n",
10636 case OSPF_PATH_INTRA_AREA
:
10638 json_object_string_add(json_route
, "routeType",
10640 json_object_int_add(json_route
, "cost",
10642 json_object_string_addf(json_route
, "area",
10644 &or->u
.std
.area_id
);
10646 vty_out(vty
, "N %-18s [%d] area: %pI4\n",
10648 &or->u
.std
.area_id
);
10655 if (or->type
== OSPF_DESTINATION_NETWORK
) {
10657 json_nexthop_array
= json_object_new_array();
10658 json_object_object_add(json_route
, "nexthops",
10659 json_nexthop_array
);
10662 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
10665 json_nexthop
= json_object_new_object();
10666 json_object_array_add(
10667 json_nexthop_array
,
10670 if (if_lookup_by_index(path
->ifindex
,
10673 if (path
->nexthop
.s_addr
10676 json_object_string_add(
10679 json_object_string_add(
10681 "directly attached to",
10685 json_object_string_add(
10687 "directlyAttachedTo",
10693 "%24s directly attached to %s\n",
10701 json_object_string_addf(
10705 json_object_string_add(
10713 "%24s via %pI4, %s\n",
10726 vty_out(vty
, "\n");
10729 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
10730 struct route_table
*rtrs
,
10733 struct route_node
*rn
;
10734 struct ospf_route
* or ;
10735 struct listnode
*pnode
;
10736 struct listnode
*node
;
10737 struct ospf_path
*path
;
10738 char buf
[PREFIX_STRLEN
];
10739 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10740 *json_nexthop
= NULL
;
10744 "============ OSPF router routing table =============\n");
10746 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
10747 if (rn
->info
== NULL
)
10752 json_route
= json_object_new_object();
10753 json_object_object_add(
10754 json
, inet_ntop(AF_INET
, &rn
->p
.u
.prefix4
,
10757 json_object_string_add(json_route
, "routeType", "R ");
10759 vty_out(vty
, "R %-15pI4 ",
10763 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
10766 vty_out(vty
, "%24s", "");
10771 json_object_int_add(json_route
, "cost",
10773 json_object_string_addf(json_route
, "area",
10775 &or->u
.std
.area_id
);
10776 if (or->path_type
== OSPF_PATH_INTER_AREA
) {
10777 json_object_boolean_true_add(json_route
,
10779 json_object_boolean_true_add(json_route
,
10782 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
10783 json_object_string_add(json_route
,
10786 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
10787 json_object_string_add(json_route
,
10791 vty_out(vty
, "%s [%d] area: %pI4",
10792 (or->path_type
== OSPF_PATH_INTER_AREA
10795 or->cost
, &or->u
.std
.area_id
);
10797 vty_out(vty
, "%s%s\n",
10798 (or->u
.std
.flags
& ROUTER_LSA_BORDER
10801 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
10807 json_nexthop_array
= json_object_new_array();
10808 json_object_object_add(json_route
, "nexthops",
10809 json_nexthop_array
);
10812 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
10814 json_nexthop
= json_object_new_object();
10815 json_object_array_add(
10816 json_nexthop_array
,
10819 if (if_lookup_by_index(path
->ifindex
,
10821 if (path
->nexthop
.s_addr
10824 json_object_string_add(
10827 json_object_string_add(
10829 "directly attached to",
10833 json_object_string_add(
10835 "directlyAttachedTo",
10841 "%24s directly attached to %s\n",
10849 json_object_string_addf(
10853 json_object_string_add(
10861 "%24s via %pI4, %s\n",
10874 vty_out(vty
, "\n");
10877 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
10878 struct route_table
*rt
,
10881 struct route_node
*rn
;
10882 struct ospf_route
*er
;
10883 struct listnode
*pnode
, *pnnode
;
10884 struct ospf_path
*path
;
10885 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
10886 *json_nexthop
= NULL
;
10890 "============ OSPF external routing table ===========\n");
10892 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
10893 if ((er
= rn
->info
) == NULL
)
10898 snprintfrr(buf1
, sizeof(buf1
), "%pFX", &rn
->p
);
10900 json_route
= json_object_new_object();
10901 json_object_object_add(json
, buf1
, json_route
);
10904 switch (er
->path_type
) {
10905 case OSPF_PATH_TYPE1_EXTERNAL
:
10907 json_object_string_add(json_route
, "routeType",
10909 json_object_int_add(json_route
, "cost",
10911 json_object_int_add(json_route
, "tag",
10915 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
10917 buf1
, er
->cost
, er
->u
.ext
.tag
);
10920 case OSPF_PATH_TYPE2_EXTERNAL
:
10922 json_object_string_add(json_route
, "routeType",
10924 json_object_int_add(json_route
, "cost",
10926 json_object_int_add(json_route
, "type2cost",
10927 er
->u
.ext
.type2_cost
);
10928 json_object_int_add(json_route
, "tag",
10932 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
10934 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
10941 json_nexthop_array
= json_object_new_array();
10942 json_object_object_add(json_route
, "nexthops",
10943 json_nexthop_array
);
10946 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
10948 json_nexthop
= json_object_new_object();
10949 json_object_array_add(json_nexthop_array
,
10953 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
10954 if (path
->nexthop
.s_addr
== INADDR_ANY
) {
10956 json_object_string_add(
10957 json_nexthop
, "ip",
10959 json_object_string_add(
10961 "directly attached to",
10965 json_object_string_add(
10967 "directlyAttachedTo",
10973 "%24s directly attached to %s\n",
10981 json_object_string_addf(
10982 json_nexthop
, "ip",
10983 "%pI4", &path
->nexthop
);
10984 json_object_string_add(
10985 json_nexthop
, "via",
10991 "%24s via %pI4, %s\n",
11003 vty_out(vty
, "\n");
11006 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
11010 if (ospf
->instance
)
11011 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11013 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
11015 if (ospf
->new_table
== NULL
) {
11016 vty_out(vty
, "No OSPF routing information exist\n");
11017 return CMD_SUCCESS
;
11020 /* Show Network routes.
11021 show_ip_ospf_route_network (vty, ospf->new_table); */
11023 /* Show Router routes. */
11024 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
11026 vty_out(vty
, "\n");
11028 return CMD_SUCCESS
;
11031 DEFUN (show_ip_ospf_border_routers
,
11032 show_ip_ospf_border_routers_cmd
,
11033 "show ip ospf [vrf <NAME|all>] border-routers",
11036 "OSPF information\n"
11039 "Show all the ABR's and ASBR's\n")
11041 struct ospf
*ospf
= NULL
;
11042 struct listnode
*node
= NULL
;
11043 char *vrf_name
= NULL
;
11044 bool all_vrf
= false;
11045 int ret
= CMD_SUCCESS
;
11048 uint8_t use_vrf
= 0;
11050 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11053 bool ospf_output
= false;
11058 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11059 if (!ospf
->oi_running
)
11062 ospf_output
= true;
11063 ret
= show_ip_ospf_border_routers_common(
11064 vty
, ospf
, use_vrf
);
11068 vty_out(vty
, "%% OSPF is not enabled\n");
11070 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11071 if (ospf
== NULL
|| !ospf
->oi_running
) {
11073 "%% OSPF is not enabled in vrf %s\n",
11075 return CMD_SUCCESS
;
11078 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
11082 /* Display default ospf (instance 0) info */
11083 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11084 if (ospf
== NULL
|| !ospf
->oi_running
) {
11085 vty_out(vty
, "%% OSPF is not enabled in vrf default\n");
11086 return CMD_SUCCESS
;
11089 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
11095 DEFUN (show_ip_ospf_instance_border_routers
,
11096 show_ip_ospf_instance_border_routers_cmd
,
11097 "show ip ospf (1-65535) border-routers",
11100 "OSPF information\n"
11102 "Show all the ABR's and ASBR's\n")
11104 int idx_number
= 3;
11106 unsigned short instance
= 0;
11108 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11109 if (instance
!= ospf_instance
)
11110 return CMD_NOT_MY_INSTANCE
;
11112 ospf
= ospf_lookup_instance(instance
);
11113 if (!ospf
|| !ospf
->oi_running
)
11114 return CMD_SUCCESS
;
11116 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
11119 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
11120 json_object
*json
, uint8_t use_vrf
)
11122 json_object
*json_vrf
= NULL
;
11124 if (ospf
->instance
)
11125 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11130 json_vrf
= json_object_new_object();
11135 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11137 if (ospf
->new_table
== NULL
) {
11138 vty_out(vty
, "No OSPF routing information exist\n");
11139 return CMD_SUCCESS
;
11142 /* Show Network routes. */
11143 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
11145 /* Show Router routes. */
11146 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
11148 /* Show AS External routes. */
11149 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
11154 // json_object_object_add(json_vrf, "areas",
11156 json_object_object_add(json
, ospf_get_name(ospf
),
11160 vty_out(vty
, "\n");
11163 return CMD_SUCCESS
;
11166 DEFUN (show_ip_ospf_route
,
11167 show_ip_ospf_route_cmd
,
11168 "show ip ospf [vrf <NAME|all>] route [json]",
11171 "OSPF information\n"
11174 "OSPF routing table\n"
11177 struct ospf
*ospf
= NULL
;
11178 struct listnode
*node
= NULL
;
11179 char *vrf_name
= NULL
;
11180 bool all_vrf
= false;
11181 int ret
= CMD_SUCCESS
;
11184 uint8_t use_vrf
= 0;
11185 bool uj
= use_json(argc
, argv
);
11186 json_object
*json
= NULL
;
11189 json
= json_object_new_object();
11191 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11193 /* vrf input is provided could be all or specific vrf*/
11195 bool ospf_output
= false;
11200 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11201 if (!ospf
->oi_running
)
11203 ospf_output
= true;
11204 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
11209 /* Keep Non-pretty format */
11210 vty_json(vty
, json
);
11211 } else if (!ospf_output
)
11212 vty_out(vty
, "%% OSPF is not enabled\n");
11216 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11217 if (ospf
== NULL
|| !ospf
->oi_running
) {
11219 vty_json(vty
, json
);
11222 "%% OSPF is not enabled in vrf %s\n",
11225 return CMD_SUCCESS
;
11228 /* Display default ospf (instance 0) info */
11229 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11230 if (ospf
== NULL
|| !ospf
->oi_running
) {
11232 vty_json(vty
, json
);
11235 "%% OSPF is not enabled in vrf default\n");
11237 return CMD_SUCCESS
;
11242 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
11243 /* Keep Non-pretty format */
11245 vty_out(vty
, "%s\n",
11246 json_object_to_json_string_ext(
11247 json
, JSON_C_TO_STRING_NOSLASHESCAPE
));
11251 json_object_free(json
);
11256 DEFUN (show_ip_ospf_instance_route
,
11257 show_ip_ospf_instance_route_cmd
,
11258 "show ip ospf (1-65535) route",
11261 "OSPF information\n"
11263 "OSPF routing table\n")
11265 int idx_number
= 3;
11267 unsigned short instance
= 0;
11269 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11270 if (instance
!= ospf_instance
)
11271 return CMD_NOT_MY_INSTANCE
;
11273 ospf
= ospf_lookup_instance(instance
);
11274 if (!ospf
|| !ospf
->oi_running
)
11275 return CMD_SUCCESS
;
11277 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
11281 DEFUN (show_ip_ospf_vrfs
,
11282 show_ip_ospf_vrfs_cmd
,
11283 "show ip ospf vrfs [json]",
11286 "OSPF information\n"
11287 "Show OSPF VRFs \n"
11290 bool uj
= use_json(argc
, argv
);
11291 json_object
*json
= NULL
;
11292 json_object
*json_vrfs
= NULL
;
11293 struct ospf
*ospf
= NULL
;
11294 struct listnode
*node
= NULL
;
11296 static const char header
[] = "Name Id RouterId ";
11299 json
= json_object_new_object();
11300 json_vrfs
= json_object_new_object();
11303 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11304 json_object
*json_vrf
= NULL
;
11305 const char *name
= NULL
;
11306 int64_t vrf_id_ui
= 0;
11310 if (!uj
&& count
== 1)
11311 vty_out(vty
, "%s\n", header
);
11313 json_vrf
= json_object_new_object();
11315 name
= ospf_get_name(ospf
);
11317 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
11319 : (int64_t)ospf
->vrf_id
;
11322 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
11323 json_object_string_addf(json_vrf
, "routerId", "%pI4",
11326 json_object_object_add(json_vrfs
, name
, json_vrf
);
11329 vty_out(vty
, "%-25s %-5d %-16pI4 \n", name
,
11330 ospf
->vrf_id
, &ospf
->router_id
);
11335 json_object_object_add(json
, "vrfs", json_vrfs
);
11336 json_object_int_add(json
, "totalVrfs", count
);
11338 vty_json(vty
, json
);
11341 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
11345 return CMD_SUCCESS
;
11347 DEFPY (clear_ip_ospf_neighbor
,
11348 clear_ip_ospf_neighbor_cmd
,
11349 "clear ip ospf [(1-65535)]$instance neighbor [A.B.C.D$nbr_id]",
11352 "OSPF information\n"
11354 "Reset OSPF Neighbor\n"
11357 struct listnode
*node
;
11358 struct ospf
*ospf
= NULL
;
11360 /* If user does not specify the arguments,
11361 * instance = 0 and nbr_id = 0.0.0.0
11363 if (instance
!= 0) {
11364 /* This means clear only the particular ospf process */
11365 if (instance
!= ospf_instance
)
11366 return CMD_NOT_MY_INSTANCE
;
11369 /* Clear all the ospf processes */
11370 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11371 if (!ospf
->oi_running
)
11374 if (nbr_id_str
&& IPV4_ADDR_SAME(&ospf
->router_id
, &nbr_id
)) {
11375 vty_out(vty
, "Self router-id is not allowed.\r\n ");
11376 return CMD_SUCCESS
;
11379 ospf_neighbor_reset(ospf
, nbr_id
, nbr_id_str
);
11382 return CMD_SUCCESS
;
11385 DEFPY (clear_ip_ospf_process
,
11386 clear_ip_ospf_process_cmd
,
11387 "clear ip ospf [(1-65535)]$instance process",
11390 "OSPF information\n"
11392 "Reset OSPF Process\n")
11394 struct listnode
*node
;
11395 struct ospf
*ospf
= NULL
;
11397 /* Check if instance is not passed as an argument */
11398 if (instance
!= 0) {
11399 /* This means clear only the particular ospf process */
11400 if (instance
!= ospf_instance
)
11401 return CMD_NOT_MY_INSTANCE
;
11404 /* Clear all the ospf processes */
11405 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11406 if (!ospf
->oi_running
)
11409 ospf_process_reset(ospf
);
11412 return CMD_SUCCESS
;
11415 static const char *const ospf_abr_type_str
[] = {
11416 "unknown", "standard", "ibm", "cisco", "shortcut"
11419 static const char *const ospf_shortcut_mode_str
[] = {
11420 "default", "enable", "disable"
11422 static int ospf_vty_external_rt_walkcb(struct hash_bucket
*bucket
,
11425 struct external_info
*ei
= bucket
->data
;
11426 struct vty
*vty
= (struct vty
*)arg
;
11427 static unsigned int count
;
11429 vty_out(vty
, "%-4pI4/%d, ", &ei
->p
.prefix
, ei
->p
.prefixlen
);
11432 if (count
% 5 == 0)
11433 vty_out(vty
, "\n");
11435 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11438 return HASHWALK_CONTINUE
;
11441 static int ospf_json_external_rt_walkcb(struct hash_bucket
*bucket
,
11444 struct external_info
*ei
= bucket
->data
;
11445 struct json_object
*json
= (struct json_object
*)arg
;
11446 char buf
[PREFIX2STR_BUFFER
];
11448 static unsigned int count
;
11450 prefix2str(&ei
->p
, buf
, sizeof(buf
));
11452 snprintf(exnalbuf
, 20, "Exnl Addr-%d", count
);
11454 json_object_string_add(json
, exnalbuf
, buf
);
11458 if (OSPF_EXTERNAL_RT_COUNT(ei
->aggr_route
) == count
)
11461 return HASHWALK_CONTINUE
;
11464 static int ospf_show_summary_address(struct vty
*vty
, struct ospf
*ospf
,
11465 uint8_t use_vrf
, json_object
*json
,
11466 bool uj
, bool detail
)
11468 struct route_node
*rn
;
11469 json_object
*json_vrf
= NULL
;
11472 static char header
[] =
11473 "Summary-address Metric-type Metric Tag External_Rt_count\n";
11475 mtype
= metric_type(ospf
, 0, ospf
->instance
);
11476 mval
= metric_value(ospf
, 0, ospf
->instance
);
11479 vty_out(vty
, "%s\n", header
);
11483 json_vrf
= json_object_new_object();
11488 if (ospf
->instance
) {
11490 json_object_int_add(json
, "ospfInstance",
11493 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
11496 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
11499 vty_out(vty
, "aggregation delay interval :%u(in seconds)\n\n",
11500 ospf
->aggr_delay_interval
);
11502 json_object_int_add(json_vrf
, "aggregation delay interval",
11503 ospf
->aggr_delay_interval
);
11504 json_object_int_add(json_vrf
, "aggregationDelayInterval",
11505 ospf
->aggr_delay_interval
);
11508 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
11510 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
11511 json_object
*json_aggr
= NULL
;
11512 char buf
[PREFIX2STR_BUFFER
];
11514 prefix2str(&aggr
->p
, buf
, sizeof(buf
));
11518 json_aggr
= json_object_new_object();
11520 json_object_object_add(json_vrf
, buf
,
11523 json_object_string_add(json_aggr
,
11524 "Summary address", buf
);
11525 json_object_string_add(json_aggr
,
11526 "summaryAddress", buf
);
11528 json_object_string_add(
11529 json_aggr
, "Metric-type",
11530 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11533 json_object_string_add(
11534 json_aggr
, "metricType",
11535 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11539 #if CONFDATE > 20230131
11540 CPP_NOTICE("Remove JSON object commands with keys starting with capital")
11542 json_object_int_add(json_aggr
, "Metric", mval
);
11543 json_object_int_add(json_aggr
, "metric", mval
);
11545 json_object_int_add(json_aggr
, "Tag",
11547 json_object_int_add(json_aggr
, "tag",
11550 json_object_int_add(
11551 json_aggr
, "External route count",
11552 OSPF_EXTERNAL_RT_COUNT(aggr
));
11553 json_object_int_add(
11554 json_aggr
, "externalRouteCount",
11555 OSPF_EXTERNAL_RT_COUNT(aggr
));
11557 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11559 aggr
->match_extnl_hash
,
11560 ospf_json_external_rt_walkcb
,
11565 vty_out(vty
, "%-20s", buf
);
11567 (mtype
== EXTERNAL_METRIC_TYPE_1
)
11568 ? vty_out(vty
, "%-16s", "E1")
11569 : vty_out(vty
, "%-16s", "E2");
11570 vty_out(vty
, "%-11d", mval
);
11572 vty_out(vty
, "%-12u", aggr
->tag
);
11574 vty_out(vty
, "%-5ld\n",
11575 OSPF_EXTERNAL_RT_COUNT(aggr
));
11577 if (OSPF_EXTERNAL_RT_COUNT(aggr
) && detail
) {
11579 "Matched External routes:\n");
11581 aggr
->match_extnl_hash
,
11582 ospf_vty_external_rt_walkcb
,
11584 vty_out(vty
, "\n");
11587 vty_out(vty
, "\n");
11593 json_object_object_add(json
, ospf_get_name(ospf
),
11596 vty_out(vty
, "\n");
11598 return CMD_SUCCESS
;
11601 DEFUN (show_ip_ospf_external_aggregator
,
11602 show_ip_ospf_external_aggregator_cmd
,
11603 "show ip ospf [vrf <NAME|all>] summary-address [detail] [json]",
11605 "OSPF information\n"
11608 "Show external summary addresses\n"
11609 "Detailed information\n"
11612 char *vrf_name
= NULL
;
11613 bool all_vrf
= false;
11614 int ret
= CMD_SUCCESS
;
11617 uint8_t use_vrf
= 0;
11618 bool uj
= use_json(argc
, argv
);
11619 struct ospf
*ospf
= NULL
;
11620 json_object
*json
= NULL
;
11621 struct listnode
*node
= NULL
;
11623 bool detail
= false;
11625 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
11627 if (argv_find(argv
, argc
, "detail", &idx
))
11631 json
= json_object_new_object();
11633 /* vrf input is provided */
11637 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
11638 if (!ospf
->oi_running
)
11640 ret
= ospf_show_summary_address(
11641 vty
, ospf
, use_vrf
, json
, uj
, detail
);
11645 vty_json(vty
, json
);
11650 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
11652 if (ospf
== NULL
|| !ospf
->oi_running
) {
11654 vty_json(vty
, json
);
11657 "%% OSPF is not enabled in vrf %s\n",
11660 return CMD_SUCCESS
;
11662 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11666 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
11667 if (ospf
== NULL
|| !ospf
->oi_running
) {
11669 vty_json(vty
, json
);
11672 "%% OSPF is not enabled in vrf default\n");
11674 return CMD_SUCCESS
;
11677 ospf_show_summary_address(vty
, ospf
, use_vrf
, json
, uj
, detail
);
11681 vty_json(vty
, json
);
11682 return CMD_SUCCESS
;
11685 static const char *const ospf_int_type_str
[] = {
11686 "unknown", /* should never be used. */
11690 "point-to-multipoint",
11691 "virtual-link", /* should never be used. */
11695 static const char *interface_config_auth_str(struct ospf_if_params
*params
)
11697 if (!OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
11698 || params
->auth_type
== OSPF_AUTH_NOTSET
)
11701 /* Translation tables are not that much help
11702 * here due to syntax
11703 * of the simple option */
11704 switch (params
->auth_type
) {
11706 case OSPF_AUTH_NULL
:
11709 case OSPF_AUTH_SIMPLE
:
11712 case OSPF_AUTH_CRYPTOGRAPHIC
:
11713 return " message-digest";
11719 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
11721 struct listnode
*node
;
11722 struct interface
*ifp
;
11723 struct crypt_key
*ck
;
11724 struct route_node
*rn
= NULL
;
11725 struct ospf_if_params
*params
;
11726 const char *auth_str
;
11729 FOR_ALL_INTERFACES (vrf
, ifp
) {
11731 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
11734 if_vty_config_start(vty
, ifp
);
11737 vty_out(vty
, " description %s\n", ifp
->desc
);
11741 params
= IF_DEF_PARAMS(ifp
);
11744 /* Interface Network print. */
11745 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
11746 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
11747 if (params
->type
!= ospf_default_iftype(ifp
)) {
11748 vty_out(vty
, " ip ospf network %s",
11752 == OSPF_IFTYPE_POINTOPOINT
11753 && params
->ptp_dmvpn
)
11754 vty_out(vty
, " dmvpn");
11755 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11756 vty_out(vty
, " %pI4",
11758 vty_out(vty
, "\n");
11762 /* OSPF interface authentication print */
11763 auth_str
= interface_config_auth_str(params
);
11765 vty_out(vty
, " ip ospf authentication%s",
11767 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11768 vty_out(vty
, " %pI4",
11770 vty_out(vty
, "\n");
11773 /* Simple Authentication Password print. */
11774 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
11775 && params
->auth_simple
[0] != '\0') {
11776 vty_out(vty
, " ip ospf authentication-key %s",
11777 params
->auth_simple
);
11778 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11779 vty_out(vty
, " %pI4",
11781 vty_out(vty
, "\n");
11784 /* Cryptographic Authentication Key print. */
11785 if (params
&& params
->auth_crypt
) {
11786 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
11789 " ip ospf message-digest-key %d md5 %s",
11790 ck
->key_id
, ck
->auth_key
);
11791 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11792 vty_out(vty
, " %pI4",
11794 vty_out(vty
, "\n");
11798 /* Interface Output Cost print. */
11799 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
11800 vty_out(vty
, " ip ospf cost %u",
11801 params
->output_cost_cmd
);
11802 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11803 vty_out(vty
, " %pI4",
11805 vty_out(vty
, "\n");
11808 /* Hello Interval print. */
11809 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
11810 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
11811 vty_out(vty
, " ip ospf hello-interval %u",
11813 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11814 vty_out(vty
, " %pI4",
11816 vty_out(vty
, "\n");
11820 /* Router Dead Interval print. */
11821 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
11822 && params
->is_v_wait_set
) {
11823 vty_out(vty
, " ip ospf dead-interval ");
11826 if (OSPF_IF_PARAM_CONFIGURED(params
,
11829 "minimal hello-multiplier %d",
11830 params
->fast_hello
);
11832 vty_out(vty
, "%u", params
->v_wait
);
11834 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11835 vty_out(vty
, " %pI4",
11837 vty_out(vty
, "\n");
11840 /* Router Priority print. */
11841 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
11842 && params
->priority
11843 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
11844 vty_out(vty
, " ip ospf priority %u",
11846 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11847 vty_out(vty
, " %pI4",
11849 vty_out(vty
, "\n");
11852 /* Retransmit Interval print. */
11853 if (OSPF_IF_PARAM_CONFIGURED(params
,
11854 retransmit_interval
)
11855 && params
->retransmit_interval
11856 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
11857 vty_out(vty
, " ip ospf retransmit-interval %u",
11858 params
->retransmit_interval
);
11859 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11860 vty_out(vty
, " %pI4",
11862 vty_out(vty
, "\n");
11865 /* Transmit Delay print. */
11866 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
11867 && params
->transmit_delay
11868 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
11869 vty_out(vty
, " ip ospf transmit-delay %u",
11870 params
->transmit_delay
);
11871 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11872 vty_out(vty
, " %pI4",
11874 vty_out(vty
, "\n");
11878 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
11880 vty_out(vty
, " ip ospf %d",
11883 vty_out(vty
, " ip ospf");
11885 char buf
[INET_ADDRSTRLEN
];
11887 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
11888 params
->if_area_id_fmt
);
11889 vty_out(vty
, " area %s", buf
);
11890 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11891 vty_out(vty
, " %pI4",
11893 vty_out(vty
, "\n");
11897 if (params
&& params
->bfd_config
)
11898 ospf_bfd_write_config(vty
, params
);
11900 /* MTU ignore print. */
11901 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
11902 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
11903 if (params
->mtu_ignore
== 0)
11904 vty_out(vty
, " no ip ospf mtu-ignore");
11906 vty_out(vty
, " ip ospf mtu-ignore");
11907 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11908 vty_out(vty
, " %pI4",
11910 vty_out(vty
, "\n");
11913 if (OSPF_IF_PARAM_CONFIGURED(params
,
11914 passive_interface
)) {
11915 vty_out(vty
, " %sip ospf passive",
11916 params
->passive_interface
11920 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
11921 vty_out(vty
, " %pI4", &rn
->p
.u
.prefix4
);
11922 vty_out(vty
, "\n");
11925 /* LDP-Sync print */
11926 if (params
&& params
->ldp_sync_info
)
11927 ospf_ldp_sync_if_write_config(vty
, params
);
11931 rn
= route_top(IF_OIFS_PARAMS(ifp
));
11933 rn
= route_next(rn
);
11938 if (params
!= NULL
)
11943 ospf_opaque_config_write_if(vty
, ifp
);
11945 if_vty_config_end(vty
);
11951 /* Configuration write function for ospfd. */
11952 static int config_write_interface(struct vty
*vty
)
11955 struct vrf
*vrf
= NULL
;
11957 /* Display all VRF aware OSPF interface configuration */
11958 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
11959 write
+= config_write_interface_one(vty
, vrf
);
11965 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
11967 struct route_node
*rn
;
11968 char buf
[INET_ADDRSTRLEN
];
11970 /* `network area' print. */
11971 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
11973 struct ospf_network
*n
= rn
->info
;
11975 /* Create Area ID string by specified Area ID format. */
11976 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
11977 inet_ntop(AF_INET
, &n
->area_id
, buf
,
11980 snprintf(buf
, sizeof(buf
), "%lu",
11981 (unsigned long int)ntohl(
11982 n
->area_id
.s_addr
));
11984 /* Network print. */
11985 vty_out(vty
, " network %pFX area %s\n", &rn
->p
, buf
);
11991 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
11993 struct listnode
*node
;
11994 struct ospf_area
*area
;
11995 char buf
[INET_ADDRSTRLEN
];
11997 /* Area configuration print. */
11998 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
11999 struct route_node
*rn1
;
12001 area_id2str(buf
, sizeof(buf
), &area
->area_id
,
12002 area
->area_id_fmt
);
12004 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
12005 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
12006 vty_out(vty
, " area %s authentication\n", buf
);
12009 " area %s authentication message-digest\n",
12013 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
12014 vty_out(vty
, " area %s shortcut %s\n", buf
,
12015 ospf_shortcut_mode_str
12016 [area
->shortcut_configured
]);
12018 if ((area
->external_routing
== OSPF_AREA_STUB
)
12019 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
12020 if (area
->external_routing
== OSPF_AREA_STUB
) {
12021 vty_out(vty
, " area %s stub", buf
);
12022 if (area
->no_summary
)
12023 vty_out(vty
, " no-summary\n");
12024 vty_out(vty
, "\n");
12025 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
12026 switch (area
->NSSATranslatorRole
) {
12027 case OSPF_NSSA_ROLE_NEVER
:
12029 " area %s nssa translate-never\n",
12032 case OSPF_NSSA_ROLE_ALWAYS
:
12034 " area %s nssa translate-always\n",
12037 case OSPF_NSSA_ROLE_CANDIDATE
:
12038 vty_out(vty
, " area %s nssa \n", buf
);
12041 if (area
->no_summary
)
12043 " area %s nssa no-summary\n",
12045 if (area
->suppress_fa
)
12047 " area %s nssa suppress-fa\n",
12051 if (area
->default_cost
!= 1)
12052 vty_out(vty
, " area %s default-cost %d\n", buf
,
12053 area
->default_cost
);
12056 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
12058 struct ospf_area_range
*range
= rn1
->info
;
12060 vty_out(vty
, " area %s range %pFX", buf
,
12063 if (range
->cost_config
12064 != OSPF_AREA_RANGE_COST_UNSPEC
)
12065 vty_out(vty
, " cost %d",
12066 range
->cost_config
);
12068 if (!CHECK_FLAG(range
->flags
,
12069 OSPF_AREA_RANGE_ADVERTISE
))
12070 vty_out(vty
, " not-advertise");
12072 if (CHECK_FLAG(range
->flags
,
12073 OSPF_AREA_RANGE_SUBSTITUTE
))
12074 vty_out(vty
, " substitute %pI4/%d",
12075 &range
->subst_addr
,
12076 range
->subst_masklen
);
12078 vty_out(vty
, "\n");
12081 if (EXPORT_NAME(area
))
12082 vty_out(vty
, " area %s export-list %s\n", buf
,
12083 EXPORT_NAME(area
));
12085 if (IMPORT_NAME(area
))
12086 vty_out(vty
, " area %s import-list %s\n", buf
,
12087 IMPORT_NAME(area
));
12089 if (PREFIX_NAME_IN(area
))
12090 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
12091 PREFIX_NAME_IN(area
));
12093 if (PREFIX_NAME_OUT(area
))
12094 vty_out(vty
, " area %s filter-list prefix %s out\n",
12095 buf
, PREFIX_NAME_OUT(area
));
12101 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
12103 struct ospf_nbr_nbma
*nbr_nbma
;
12104 struct route_node
*rn
;
12106 /* Static Neighbor configuration print. */
12107 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
12108 if ((nbr_nbma
= rn
->info
)) {
12109 vty_out(vty
, " neighbor %pI4", &nbr_nbma
->addr
);
12111 if (nbr_nbma
->priority
12112 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
12113 vty_out(vty
, " priority %d",
12114 nbr_nbma
->priority
);
12116 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
12117 vty_out(vty
, " poll-interval %d",
12120 vty_out(vty
, "\n");
12126 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
12128 struct listnode
*node
;
12129 struct ospf_vl_data
*vl_data
;
12130 const char *auth_str
;
12131 char buf
[INET_ADDRSTRLEN
];
12133 /* Virtual-Link print */
12134 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
12135 struct listnode
*n2
;
12136 struct crypt_key
*ck
;
12137 struct ospf_interface
*oi
;
12139 if (vl_data
!= NULL
) {
12140 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
12141 vl_data
->vl_area_id_fmt
);
12142 oi
= vl_data
->vl_oi
;
12145 if (OSPF_IF_PARAM(oi
, v_hello
)
12146 != OSPF_HELLO_INTERVAL_DEFAULT
12147 || OSPF_IF_PARAM(oi
, v_wait
)
12148 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
12149 || OSPF_IF_PARAM(oi
, retransmit_interval
)
12150 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
12151 || OSPF_IF_PARAM(oi
, transmit_delay
)
12152 != OSPF_TRANSMIT_DELAY_DEFAULT
)
12154 " area %s virtual-link %pI4 hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
12155 buf
, &vl_data
->vl_peer
,
12156 OSPF_IF_PARAM(oi
, v_hello
),
12157 OSPF_IF_PARAM(oi
, retransmit_interval
),
12158 OSPF_IF_PARAM(oi
, transmit_delay
),
12159 OSPF_IF_PARAM(oi
, v_wait
));
12161 vty_out(vty
, " area %s virtual-link %pI4\n", buf
,
12162 &vl_data
->vl_peer
);
12164 auth_str
= interface_config_auth_str(
12165 IF_DEF_PARAMS(oi
->ifp
));
12168 " area %s virtual-link %pI4 authentication%s\n",
12169 buf
, &vl_data
->vl_peer
, auth_str
);
12171 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
12174 " area %s virtual-link %pI4 authentication-key %s\n",
12175 buf
, &vl_data
->vl_peer
,
12176 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12179 for (ALL_LIST_ELEMENTS_RO(
12180 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
12184 " area %s virtual-link %pI4 message-digest-key %d md5 %s\n",
12185 buf
, &vl_data
->vl_peer
,
12186 ck
->key_id
, ck
->auth_key
);
12194 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
12198 /* redistribute print. */
12199 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
12200 struct list
*red_list
;
12201 struct listnode
*node
;
12202 struct ospf_redist
*red
;
12204 red_list
= ospf
->redist
[type
];
12208 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12209 vty_out(vty
, " redistribute %s",
12210 zebra_route_string(type
));
12212 vty_out(vty
, " %d", red
->instance
);
12214 if (red
->dmetric
.value
>= 0)
12215 vty_out(vty
, " metric %d", red
->dmetric
.value
);
12217 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12218 vty_out(vty
, " metric-type 1");
12220 if (ROUTEMAP_NAME(red
))
12221 vty_out(vty
, " route-map %s",
12222 ROUTEMAP_NAME(red
));
12224 vty_out(vty
, "\n");
12231 static int ospf_cfg_write_helper_dis_rtr_walkcb(struct hash_bucket
*bucket
,
12234 struct advRtr
*rtr
= bucket
->data
;
12235 struct vty
*vty
= (struct vty
*)arg
;
12237 vty_out(vty
, " graceful-restart helper enable %pI4\n",
12239 return HASHWALK_CONTINUE
;
12242 static void config_write_ospf_gr(struct vty
*vty
, struct ospf
*ospf
)
12244 if (!ospf
->gr_info
.restart_support
)
12247 if (ospf
->gr_info
.grace_period
== OSPF_DFLT_GRACE_INTERVAL
)
12248 vty_out(vty
, " graceful-restart\n");
12250 vty_out(vty
, " graceful-restart grace-period %u\n",
12251 ospf
->gr_info
.grace_period
);
12254 static int config_write_ospf_gr_helper(struct vty
*vty
, struct ospf
*ospf
)
12256 if (ospf
->is_helper_supported
)
12257 vty_out(vty
, " graceful-restart helper enable\n");
12259 if (!ospf
->strict_lsa_check
)
12261 " no graceful-restart helper strict-lsa-checking\n");
12263 if (ospf
->only_planned_restart
)
12264 vty_out(vty
, " graceful-restart helper planned-only\n");
12266 if (ospf
->supported_grace_time
!= OSPF_MAX_GRACE_INTERVAL
)
12268 " graceful-restart helper supported-grace-time %d\n",
12269 ospf
->supported_grace_time
);
12271 if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf
)) {
12272 hash_walk(ospf
->enable_rtr_list
,
12273 ospf_cfg_write_helper_dis_rtr_walkcb
, vty
);
12278 static int config_write_ospf_external_aggregator(struct vty
*vty
,
12281 struct route_node
*rn
;
12283 if (ospf
->aggr_delay_interval
!= OSPF_EXTL_AGGR_DEFAULT_DELAY
)
12284 vty_out(vty
, " aggregation timer %u\n",
12285 ospf
->aggr_delay_interval
);
12287 /* print 'summary-address A.B.C.D/M' */
12288 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
))
12290 struct ospf_external_aggr_rt
*aggr
= rn
->info
;
12292 vty_out(vty
, " summary-address %pI4/%d",
12293 &aggr
->p
.prefix
, aggr
->p
.prefixlen
);
12295 vty_out(vty
, " tag %u", aggr
->tag
);
12297 if (CHECK_FLAG(aggr
->flags
,
12298 OSPF_EXTERNAL_AGGRT_NO_ADVERTISE
))
12299 vty_out(vty
, " no-advertise");
12301 vty_out(vty
, "\n");
12307 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
12309 if (ospf
->default_metric
!= -1)
12310 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
12314 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
12317 struct ospf_redist
*red
;
12320 /* distribute-list print. */
12321 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
12322 if (DISTRIBUTE_NAME(ospf
, type
))
12323 vty_out(vty
, " distribute-list %s out %s\n",
12324 DISTRIBUTE_NAME(ospf
, type
),
12325 zebra_route_string(type
));
12327 /* default-information print. */
12328 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
12329 vty_out(vty
, " default-information originate");
12330 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
12331 vty_out(vty
, " always");
12333 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
12335 if (red
->dmetric
.value
>= 0)
12336 vty_out(vty
, " metric %d",
12337 red
->dmetric
.value
);
12339 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
12340 vty_out(vty
, " metric-type 1");
12342 if (ROUTEMAP_NAME(red
))
12343 vty_out(vty
, " route-map %s",
12344 ROUTEMAP_NAME(red
));
12347 vty_out(vty
, "\n");
12354 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
12356 struct route_node
*rn
;
12357 struct ospf_distance
*odistance
;
12359 if (ospf
->distance_all
)
12360 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
12362 if (ospf
->distance_intra
|| ospf
->distance_inter
12363 || ospf
->distance_external
) {
12364 vty_out(vty
, " distance ospf");
12366 if (ospf
->distance_intra
)
12367 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
12368 if (ospf
->distance_inter
)
12369 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
12370 if (ospf
->distance_external
)
12371 vty_out(vty
, " external %d", ospf
->distance_external
);
12373 vty_out(vty
, "\n");
12376 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
12377 if ((odistance
= rn
->info
) != NULL
) {
12378 vty_out(vty
, " distance %d %pFX %s\n",
12379 odistance
->distance
, &rn
->p
,
12380 odistance
->access_list
? odistance
->access_list
12386 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
12390 /* `router ospf' print. */
12391 if (ospf
->instance
&& strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12392 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
12394 } else if (ospf
->instance
) {
12395 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
12396 } else if (strcmp(ospf
->name
, VRF_DEFAULT_NAME
)) {
12397 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
12399 vty_out(vty
, "router ospf\n");
12401 if (!ospf
->networks
) {
12406 /* Router ID print. */
12407 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
12408 vty_out(vty
, " ospf router-id %pI4\n",
12409 &ospf
->router_id_static
);
12411 /* zebra opaque attributes configuration. */
12412 if (CHECK_FLAG(ospf
->config
, OSPF_SEND_EXTRA_DATA_TO_ZEBRA
))
12413 vty_out(vty
, " ospf send-extra-data zebra\n");
12415 /* ABR type print. */
12416 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
12417 vty_out(vty
, " ospf abr-type %s\n",
12418 ospf_abr_type_str
[ospf
->abr_type
]);
12420 /* log-adjacency-changes flag print. */
12421 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
12422 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
12423 vty_out(vty
, " log-adjacency-changes detail\n");
12424 else if (!SAVE_OSPF_LOG_ADJACENCY_CHANGES
)
12425 vty_out(vty
, " log-adjacency-changes\n");
12426 } else if (SAVE_OSPF_LOG_ADJACENCY_CHANGES
) {
12427 vty_out(vty
, " no log-adjacency-changes\n");
12430 /* RFC1583 compatibility flag print -- Compatible with CISCO
12432 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
12433 vty_out(vty
, " compatible rfc1583\n");
12435 /* auto-cost reference-bandwidth configuration. */
12436 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
12438 "! Important: ensure reference bandwidth is consistent across all routers\n");
12439 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
12440 ospf
->ref_bandwidth
);
12443 /* SPF timers print. */
12444 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
12445 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
12446 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
12447 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
12448 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
12450 /* LSA timers print. */
12451 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
12452 vty_out(vty
, " timers throttle lsa all %d\n",
12453 ospf
->min_ls_interval
);
12454 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
12455 vty_out(vty
, " timers lsa min-arrival %d\n",
12456 ospf
->min_ls_arrival
);
12458 /* Write multiplier print. */
12459 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
12460 vty_out(vty
, " ospf write-multiplier %d\n",
12461 ospf
->write_oi_count
);
12463 if (ospf
->max_multipath
!= MULTIPATH_NUM
)
12464 vty_out(vty
, " maximum-paths %d\n", ospf
->max_multipath
);
12466 /* Max-metric router-lsa print */
12467 config_write_stub_router(vty
, ospf
);
12469 /* SPF refresh parameters print. */
12470 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
12471 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
12473 /* Redistribute information print. */
12474 config_write_ospf_redistribute(vty
, ospf
);
12476 /* Graceful Restart print */
12477 config_write_ospf_gr(vty
, ospf
);
12478 config_write_ospf_gr_helper(vty
, ospf
);
12480 /* Print external route aggregation. */
12481 config_write_ospf_external_aggregator(vty
, ospf
);
12483 /* passive-interface print. */
12484 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
12485 vty_out(vty
, " passive-interface default\n");
12487 /* proactive-arp print. */
12488 if (ospf
->proactive_arp
!= OSPF_PROACTIVE_ARP_DEFAULT
) {
12489 if (ospf
->proactive_arp
)
12490 vty_out(vty
, " proactive-arp\n");
12492 vty_out(vty
, " no proactive-arp\n");
12495 /* TI-LFA print. */
12496 if (ospf
->ti_lfa_enabled
) {
12497 if (ospf
->ti_lfa_protection_type
== OSPF_TI_LFA_NODE_PROTECTION
)
12498 vty_out(vty
, " fast-reroute ti-lfa node-protection\n");
12500 vty_out(vty
, " fast-reroute ti-lfa\n");
12503 /* Network area print. */
12504 config_write_network_area(vty
, ospf
);
12506 /* Area config print. */
12507 config_write_ospf_area(vty
, ospf
);
12509 /* static neighbor print. */
12510 config_write_ospf_nbr_nbma(vty
, ospf
);
12512 /* Virtual-Link print. */
12513 config_write_virtual_link(vty
, ospf
);
12515 /* Default metric configuration. */
12516 config_write_ospf_default_metric(vty
, ospf
);
12518 /* Distribute-list and default-information print. */
12519 config_write_ospf_distribute(vty
, ospf
);
12521 /* Distance configuration. */
12522 config_write_ospf_distance(vty
, ospf
);
12524 ospf_opaque_config_write_router(vty
, ospf
);
12526 /* LDP-Sync print */
12527 ospf_ldp_sync_write_config(vty
, ospf
);
12529 vty_out(vty
, "exit\n");
12535 /* OSPF configuration write function. */
12536 static int ospf_config_write(struct vty
*vty
)
12539 struct listnode
*ospf_node
= NULL
;
12542 if (listcount(om
->ospf
) == 0)
12545 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
12546 /* VRF Default check if it is running.
12547 * Upon daemon start, there could be default instance
12548 * in absence of 'router ospf'/oi_running is disabled. */
12549 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
12550 write
+= ospf_config_write_one(vty
, ospf
);
12551 /* For Non-Default VRF simply display the configuration,
12552 * even if it is not oi_running. */
12553 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
12554 write
+= ospf_config_write_one(vty
, ospf
);
12559 void ospf_vty_show_init(void)
12561 /* "show ip ospf" commands. */
12562 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
12564 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
12566 /* "show ip ospf database" commands. */
12567 install_element(VIEW_NODE
, &show_ip_ospf_database_cmd
);
12568 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
12569 install_element(VIEW_NODE
,
12570 &show_ip_ospf_database_type_adv_router_cmd
);
12571 install_element(VIEW_NODE
,
12572 &show_ip_ospf_instance_database_type_adv_router_cmd
);
12573 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
12574 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
12576 /* "show ip ospf interface" commands. */
12577 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
12579 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
12580 /* "show ip ospf interface traffic */
12581 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
12583 /* "show ip ospf neighbor" commands. */
12584 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
12585 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
12586 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
12587 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
12588 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
12589 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
12590 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
12592 install_element(VIEW_NODE
,
12593 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
12594 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
12595 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
12596 install_element(VIEW_NODE
,
12597 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
12598 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
12599 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
12600 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
12602 /* "show ip ospf route" commands. */
12603 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
12604 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
12606 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
12607 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
12609 /* "show ip ospf vrfs" commands. */
12610 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
12612 /* "show ip ospf gr-helper details" command */
12613 install_element(VIEW_NODE
, &show_ip_ospf_gr_helper_cmd
);
12615 /* "show ip ospf summary-address" command */
12616 install_element(VIEW_NODE
, &show_ip_ospf_external_aggregator_cmd
);
12619 /* Initialization of OSPF interface. */
12620 static void ospf_vty_if_init(void)
12622 /* Install interface node. */
12623 if_cmd_init(config_write_interface
);
12625 /* "ip ospf authentication" commands. */
12626 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
12627 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
12628 install_element(INTERFACE_NODE
,
12629 &no_ip_ospf_authentication_args_addr_cmd
);
12630 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
12631 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
12632 install_element(INTERFACE_NODE
,
12633 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
12634 install_element(INTERFACE_NODE
,
12635 &no_ospf_authentication_key_authkey_addr_cmd
);
12637 /* "ip ospf message-digest-key" commands. */
12638 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
12639 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
12641 /* "ip ospf cost" commands. */
12642 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
12643 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
12645 /* "ip ospf mtu-ignore" commands. */
12646 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
12647 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
12649 /* "ip ospf dead-interval" commands. */
12650 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
12651 install_element(INTERFACE_NODE
,
12652 &ip_ospf_dead_interval_minimal_addr_cmd
);
12653 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
12655 /* "ip ospf hello-interval" commands. */
12656 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
12657 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
12659 /* "ip ospf network" commands. */
12660 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
12661 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
12663 /* "ip ospf priority" commands. */
12664 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
12665 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
12667 /* "ip ospf retransmit-interval" commands. */
12668 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
12669 install_element(INTERFACE_NODE
,
12670 &no_ip_ospf_retransmit_interval_addr_cmd
);
12672 /* "ip ospf transmit-delay" commands. */
12673 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
12674 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
12676 /* "ip ospf area" commands. */
12677 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
12678 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
12680 /* "ip ospf passive" commands. */
12681 install_element(INTERFACE_NODE
, &ip_ospf_passive_cmd
);
12682 install_element(INTERFACE_NODE
, &no_ip_ospf_passive_cmd
);
12684 /* These commands are compatibitliy for previous version. */
12685 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
12686 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
12687 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
12688 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
12689 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
12690 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
12691 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
12692 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
12693 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
12694 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
12695 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
12696 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
12697 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
12698 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
12699 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
12700 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
12701 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
12704 static void ospf_vty_zebra_init(void)
12706 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
12707 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
12708 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
12709 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
12711 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
12712 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
12714 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
12715 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
12717 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
12718 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
12720 install_element(OSPF_NODE
, &ospf_distance_cmd
);
12721 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
12722 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
12723 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
12725 /*Ospf garcefull restart helper configurations */
12726 install_element(OSPF_NODE
, &ospf_gr_helper_enable_cmd
);
12727 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_cmd
);
12728 install_element(OSPF_NODE
, &ospf_gr_helper_only_cmd
);
12729 install_element(OSPF_NODE
, &no_ospf_gr_helper_only_cmd
);
12730 install_element(OSPF_NODE
, &ospf_gr_helper_enable_lsacheck_cmd
);
12731 install_element(OSPF_NODE
, &no_ospf_gr_helper_enable_lsacheck_cmd
);
12732 install_element(OSPF_NODE
, &ospf_gr_helper_supported_grace_time_cmd
);
12733 install_element(OSPF_NODE
, &no_ospf_gr_helper_supported_grace_time_cmd
);
12734 install_element(OSPF_NODE
, &ospf_gr_helper_planned_only_cmd
);
12735 install_element(OSPF_NODE
, &no_ospf_gr_helper_planned_only_cmd
);
12737 /* External LSA summarisation config commands.*/
12738 install_element(OSPF_NODE
, &ospf_external_route_aggregation_cmd
);
12739 install_element(OSPF_NODE
, &no_ospf_external_route_aggregation_cmd
);
12740 install_element(OSPF_NODE
,
12741 &ospf_external_route_aggregation_no_adrvertise_cmd
);
12742 install_element(OSPF_NODE
,
12743 &no_ospf_external_route_aggregation_no_adrvertise_cmd
);
12744 install_element(OSPF_NODE
, &ospf_route_aggregation_timer_cmd
);
12745 install_element(OSPF_NODE
, &no_ospf_route_aggregation_timer_cmd
);
12748 static int ospf_config_write(struct vty
*vty
);
12749 static struct cmd_node ospf_node
= {
12752 .parent_node
= CONFIG_NODE
,
12753 .prompt
= "%s(config-router)# ",
12754 .config_write
= ospf_config_write
,
12757 static void ospf_interface_clear(struct interface
*ifp
)
12759 if (!if_is_operative(ifp
))
12762 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
12763 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
12765 ospf_if_reset(ifp
);
12768 DEFUN (clear_ip_ospf_interface
,
12769 clear_ip_ospf_interface_cmd
,
12770 "clear ip ospf [vrf NAME] interface [IFNAME]",
12773 "OSPF information\n"
12775 "Interface information\n"
12776 "Interface name\n")
12778 int idx_ifname
= 0;
12780 struct interface
*ifp
;
12781 struct listnode
*node
;
12782 struct ospf
*ospf
= NULL
;
12783 char *vrf_name
= NULL
;
12784 vrf_id_t vrf_id
= VRF_DEFAULT
;
12785 struct vrf
*vrf
= NULL
;
12787 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
12788 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
12789 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
12792 vrf
= vrf_lookup_by_name(vrf_name
);
12794 vrf_id
= vrf
->vrf_id
;
12796 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
12797 /* Clear all the ospfv2 interfaces. */
12798 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
12799 if (vrf_id
!= ospf
->vrf_id
)
12802 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
12803 FOR_ALL_INTERFACES (vrf
, ifp
)
12804 ospf_interface_clear(ifp
);
12807 /* Interface name is specified. */
12808 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
12810 vty_out(vty
, "No such interface name\n");
12812 ospf_interface_clear(ifp
);
12815 return CMD_SUCCESS
;
12818 void ospf_vty_clear_init(void)
12820 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
12821 install_element(ENABLE_NODE
, &clear_ip_ospf_process_cmd
);
12822 install_element(ENABLE_NODE
, &clear_ip_ospf_neighbor_cmd
);
12826 /* Install OSPF related vty commands. */
12827 void ospf_vty_init(void)
12829 /* Install ospf top node. */
12830 install_node(&ospf_node
);
12832 /* "router ospf" commands. */
12833 install_element(CONFIG_NODE
, &router_ospf_cmd
);
12834 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
12837 install_default(OSPF_NODE
);
12839 /* "ospf router-id" commands. */
12840 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
12841 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
12842 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
12844 /* "passive-interface" commands. */
12845 install_element(OSPF_NODE
, &ospf_passive_interface_default_cmd
);
12846 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
12847 install_element(OSPF_NODE
, &no_ospf_passive_interface_default_cmd
);
12848 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
12850 /* "ospf abr-type" commands. */
12851 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
12852 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
12854 /* "ospf log-adjacency-changes" commands. */
12855 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
12856 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
12857 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
12858 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
12860 /* "ospf rfc1583-compatible" commands. */
12861 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
12862 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
12863 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
12864 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
12866 /* "ospf send-extra-data zebra" commands. */
12867 install_element(OSPF_NODE
, &ospf_send_extra_data_cmd
);
12869 /* "network area" commands. */
12870 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
12871 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
12873 /* "area authentication" commands. */
12874 install_element(OSPF_NODE
,
12875 &ospf_area_authentication_message_digest_cmd
);
12876 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
12877 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
12879 /* "area range" commands. */
12880 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
12881 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
12882 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
12883 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
12884 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
12886 /* "area virtual-link" commands. */
12887 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
12888 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
12889 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
12890 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
12893 /* "area stub" commands. */
12894 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
12895 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
12896 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
12897 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
12899 /* "area nssa" commands. */
12900 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
12901 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
12902 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
12903 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
12904 install_element(OSPF_NODE
, &ospf_area_nssa_suppress_fa_cmd
);
12905 install_element(OSPF_NODE
, &no_ospf_area_nssa_suppress_fa_cmd
);
12906 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
12908 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
12909 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
12911 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
12912 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
12914 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
12915 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
12917 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
12918 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
12920 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
12921 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
12923 /* SPF timer commands */
12924 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
12925 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
12927 /* LSA timers commands */
12928 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
12929 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
12930 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
12931 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
12933 /* refresh timer commands */
12934 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
12935 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
12937 /* max-metric commands */
12938 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
12939 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
12940 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
12941 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
12942 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
12943 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
12945 /* reference bandwidth commands */
12946 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
12947 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
12949 /* "neighbor" commands. */
12950 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
12951 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
12952 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
12953 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
12955 /* write multiplier commands */
12956 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
12957 install_element(OSPF_NODE
, &write_multiplier_cmd
);
12958 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
12959 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
12961 /* "proactive-arp" commands. */
12962 install_element(OSPF_NODE
, &ospf_proactive_arp_cmd
);
12963 install_element(OSPF_NODE
, &no_ospf_proactive_arp_cmd
);
12965 /* TI-LFA commands */
12966 install_element(OSPF_NODE
, &ospf_ti_lfa_cmd
);
12967 install_element(OSPF_NODE
, &no_ospf_ti_lfa_cmd
);
12969 /* Max path configurations */
12970 install_element(OSPF_NODE
, &ospf_max_multipath_cmd
);
12971 install_element(OSPF_NODE
, &no_ospf_max_multipath_cmd
);
12973 vrf_cmd_init(NULL
);
12975 /* Init interface related vty commands. */
12976 ospf_vty_if_init();
12978 /* Init zebra related vty commands. */
12979 ospf_vty_zebra_init();