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 "ospfd/ospfd.h"
39 #include "ospfd/ospf_asbr.h"
40 #include "ospfd/ospf_lsa.h"
41 #include "ospfd/ospf_lsdb.h"
42 #include "ospfd/ospf_ism.h"
43 #include "ospfd/ospf_interface.h"
44 #include "ospfd/ospf_nsm.h"
45 #include "ospfd/ospf_neighbor.h"
46 #include "ospfd/ospf_flood.h"
47 #include "ospfd/ospf_abr.h"
48 #include "ospfd/ospf_spf.h"
49 #include "ospfd/ospf_route.h"
50 #include "ospfd/ospf_zebra.h"
51 /*#include "ospfd/ospf_routemap.h" */
52 #include "ospfd/ospf_vty.h"
53 #include "ospfd/ospf_dump.h"
54 #include "ospfd/ospf_bfd.h"
56 FRR_CFG_DEFAULT_BOOL(OSPF_LOG_ADJACENCY_CHANGES
,
57 { .val_long
= true, .match_profile
= "datacenter", },
58 { .val_long
= false },
61 static const char *const ospf_network_type_str
[] = {
62 "Null", "POINTOPOINT", "BROADCAST", "NBMA", "POINTOMULTIPOINT",
63 "VIRTUALLINK", "LOOPBACK"};
65 /* Utility functions. */
66 int str2area_id(const char *str
, struct in_addr
*area_id
, int *area_id_fmt
)
70 area_id
->s_addr
= htonl(strtoul(str
, &ep
, 10));
71 if (*ep
&& !inet_aton(str
, area_id
))
75 *ep
? OSPF_AREA_ID_FMT_DOTTEDQUAD
: OSPF_AREA_ID_FMT_DECIMAL
;
80 static void area_id2str(char *buf
, int length
, struct in_addr
*area_id
,
83 if (area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
84 inet_ntop(AF_INET
, area_id
, buf
, length
);
86 sprintf(buf
, "%lu", (unsigned long)ntohl(area_id
->s_addr
));
89 static int str2metric(const char *str
, int *metric
)
95 *metric
= strtol(str
, NULL
, 10);
96 if (*metric
< 0 && *metric
> 16777214) {
97 /* vty_out (vty, "OSPF metric value is invalid\n"); */
104 static int str2metric_type(const char *str
, int *metric_type
)
110 if (strncmp(str
, "1", 1) == 0)
111 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
112 else if (strncmp(str
, "2", 1) == 0)
113 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
120 int ospf_oi_count(struct interface
*ifp
)
122 struct route_node
*rn
;
125 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
132 #define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
133 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
134 vrf_name = argv[idx_vrf + 1]->arg; \
135 all_vrf = strmatch(vrf_name, "all"); \
138 static struct ospf
*ospf_cmd_lookup_ospf(struct vty
*vty
,
139 struct cmd_token
*argv
[],
140 const int argc
, uint32_t enable
,
141 unsigned short *instance
)
143 struct ospf
*ospf
= NULL
;
144 int idx_vrf
= 0, idx_inst
= 0;
145 const char *vrf_name
= NULL
;
146 bool created
= false;
149 if (argv_find(argv
, argc
, "(1-65535)", &idx_inst
))
150 *instance
= strtoul(argv
[idx_inst
]->arg
, NULL
, 10);
152 if (argv_find(argv
, argc
, "vrf", &idx_vrf
)) {
153 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
154 if (vrf_name
== NULL
|| strmatch(vrf_name
, VRF_DEFAULT_NAME
))
157 /* Allocate VRF aware instance */
158 ospf
= ospf_get(*instance
, vrf_name
, &created
);
160 ospf
= ospf_lookup_by_inst_name(*instance
, vrf_name
);
164 ospf
= ospf_get(*instance
, NULL
, &created
);
166 ospf
= ospf_lookup_instance(*instance
);
171 if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
172 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
178 static void ospf_show_vrf_name(struct ospf
*ospf
, struct vty
*vty
,
179 json_object
*json
, uint8_t use_vrf
)
183 if (ospf
->vrf_id
== VRF_DEFAULT
)
184 json_object_string_add(json
, "vrfName",
187 json_object_string_add(json
, "vrfName",
189 json_object_int_add(json
, "vrfId", ospf
->vrf_id
);
191 if (ospf
->vrf_id
== VRF_DEFAULT
)
192 vty_out(vty
, "VRF Name: %s\n", "default");
194 vty_out(vty
, "VRF Name: %s\n", ospf
->name
);
199 #ifndef VTYSH_EXTRACT_PL
200 #include "ospfd/ospf_vty_clippy.c"
203 DEFUN_NOSH (router_ospf
,
205 "router ospf [{(1-65535)|vrf NAME}]",
206 "Enable a routing process\n"
207 "Start OSPF configuration\n"
211 struct ospf
*ospf
= NULL
;
212 int ret
= CMD_SUCCESS
;
213 unsigned short instance
= 0;
214 struct vrf
*vrf
= NULL
;
215 struct route_node
*rn
;
216 struct interface
*ifp
;
218 ospf
= ospf_cmd_lookup_ospf(vty
, argv
, argc
, 1, &instance
);
220 return CMD_WARNING_CONFIG_FAILED
;
222 /* The following logic to set the vty qobj index is in place to be able
223 to ignore the commands which dont belong to this instance. */
224 if (ospf
->instance
!= instance
) {
225 VTY_PUSH_CONTEXT_NULL(OSPF_NODE
);
226 ret
= CMD_NOT_MY_INSTANCE
;
228 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
229 ospf
->oi_running
= 1;
230 if (IS_DEBUG_OSPF_EVENT
)
232 "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
233 instance
, ospf
->name
? ospf
->name
: "NIL",
234 ospf
->vrf_id
, ospf
->oi_running
);
235 VTY_PUSH_CONTEXT(OSPF_NODE
, ospf
);
237 /* Activate 'ip ospf area x' configured interfaces for given
238 * vrf. Activate area on vrf x aware interfaces.
239 * vrf_enable callback calls router_id_update which
240 * internally will call ospf_if_update to trigger
243 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
245 FOR_ALL_INTERFACES (vrf
, ifp
) {
246 struct ospf_if_params
*params
;
248 params
= IF_DEF_PARAMS(ifp
);
249 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
250 for (rn
= route_top(ospf
->networks
); rn
;
251 rn
= route_next(rn
)) {
252 if (rn
->info
!= NULL
) {
254 "Interface %s has area config but please remove all network commands first.\n",
259 if (!ospf_interface_area_is_already_set(ospf
,
261 ospf_interface_area_set(ospf
, ifp
);
262 ospf
->if_ospf_cli_count
++;
267 ospf_router_id_update(ospf
);
273 DEFUN (no_router_ospf
,
275 "no router ospf [{(1-65535)|vrf NAME}]",
277 "Enable a routing process\n"
278 "Start OSPF configuration\n"
283 unsigned short instance
= 0;
285 ospf
= ospf_cmd_lookup_ospf(vty
, argv
, argc
, 0, &instance
);
288 return CMD_NOT_MY_INSTANCE
;
298 DEFPY (ospf_router_id
,
300 "ospf router-id A.B.C.D",
301 "OSPF specific commands\n"
302 "router-id for the OSPF process\n"
303 "OSPF router-id in IP address format\n")
305 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
307 struct listnode
*node
;
308 struct ospf_area
*area
;
310 ospf
->router_id_static
= router_id
;
312 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
313 if (area
->full_nbrs
) {
315 "For this router-id change to take effect,"
316 " save config and restart ospfd\n");
320 ospf_router_id_update(ospf
);
325 DEFUN_HIDDEN (ospf_router_id_old
,
326 ospf_router_id_old_cmd
,
328 "router-id for the OSPF process\n"
329 "OSPF router-id in IP address format\n")
331 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
333 struct listnode
*node
;
334 struct ospf_area
*area
;
335 struct in_addr router_id
;
338 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &router_id
);
340 vty_out(vty
, "Please specify Router ID by A.B.C.D\n");
341 return CMD_WARNING_CONFIG_FAILED
;
344 ospf
->router_id_static
= router_id
;
346 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
347 if (area
->full_nbrs
) {
349 "For this router-id change to take effect,"
350 " save config and restart ospfd\n");
354 ospf_router_id_update(ospf
);
359 DEFPY (no_ospf_router_id
,
360 no_ospf_router_id_cmd
,
361 "no ospf router-id [A.B.C.D]",
363 "OSPF specific commands\n"
364 "router-id for the OSPF process\n"
365 "OSPF router-id in IP address format\n")
367 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
368 struct listnode
*node
;
369 struct ospf_area
*area
;
372 if (!IPV4_ADDR_SAME(&ospf
->router_id_static
, &router_id
)) {
373 vty_out(vty
, "%% OSPF router-id doesn't match\n");
374 return CMD_WARNING_CONFIG_FAILED
;
378 ospf
->router_id_static
.s_addr
= 0;
380 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
381 if (area
->full_nbrs
) {
383 "For this router-id change to take effect,"
384 " save config and restart ospfd\n");
388 ospf_router_id_update(ospf
);
394 static void ospf_passive_interface_default(struct ospf
*ospf
, uint8_t newval
)
396 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
398 struct interface
*ifp
;
399 struct ospf_interface
*oi
;
401 ospf
->passive_interface_default
= newval
;
403 FOR_ALL_INTERFACES (vrf
, ifp
) {
404 if (ifp
&& OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
406 UNSET_IF_PARAM(IF_DEF_PARAMS(ifp
), passive_interface
);
408 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, ln
, oi
)) {
409 if (OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
410 UNSET_IF_PARAM(oi
->params
, passive_interface
);
411 /* update multicast memberships */
412 ospf_if_set_multicast(oi
);
416 static void ospf_passive_interface_update_addr(struct ospf
*ospf
,
417 struct interface
*ifp
,
418 struct ospf_if_params
*params
,
424 params
->passive_interface
= value
;
425 if (params
!= IF_DEF_PARAMS(ifp
)) {
426 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
428 dflt
= IF_DEF_PARAMS(ifp
)->passive_interface
;
430 dflt
= ospf
->passive_interface_default
;
433 SET_IF_PARAM(params
, passive_interface
);
435 UNSET_IF_PARAM(params
, passive_interface
);
437 ospf_free_if_params(ifp
, addr
);
438 ospf_if_update_params(ifp
, addr
);
442 static void ospf_passive_interface_update(struct ospf
*ospf
,
443 struct interface
*ifp
,
444 struct ospf_if_params
*params
,
447 params
->passive_interface
= value
;
448 if (params
== IF_DEF_PARAMS(ifp
)) {
449 if (value
!= ospf
->passive_interface_default
)
450 SET_IF_PARAM(params
, passive_interface
);
452 UNSET_IF_PARAM(params
, passive_interface
);
456 DEFUN (ospf_passive_interface
,
457 ospf_passive_interface_addr_cmd
,
458 "passive-interface <IFNAME [A.B.C.D]|default>",
459 "Suppress routing updates on an interface\n"
462 "Suppress routing updates on interfaces by default\n")
464 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
466 struct interface
*ifp
= NULL
;
467 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
469 struct ospf_if_params
*params
;
470 struct route_node
*rn
;
472 if (strmatch(argv
[1]->text
, "default")) {
473 ospf_passive_interface_default(ospf
, OSPF_IF_PASSIVE
);
476 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
477 ifp
= if_get_by_name(argv
[1]->arg
, ospf
->vrf_id
);
480 vty_out(vty
, "interface %s not found.\n", (char *)argv
[1]->arg
);
481 return CMD_WARNING_CONFIG_FAILED
;
484 params
= IF_DEF_PARAMS(ifp
);
487 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
490 "Please specify interface address by A.B.C.D\n");
491 return CMD_WARNING_CONFIG_FAILED
;
494 params
= ospf_get_if_params(ifp
, addr
);
495 ospf_if_update_params(ifp
, addr
);
496 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
497 OSPF_IF_PASSIVE
, addr
);
500 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_PASSIVE
);
502 /* XXX We should call ospf_if_set_multicast on exactly those
503 * interfaces for which the passive property changed. It is too much
504 * work to determine this set, so we do this for every interface.
505 * This is safe and reasonable because ospf_if_set_multicast uses a
506 * record of joined groups to avoid systems calls if the desired
507 * memberships match the current memership.
510 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
511 struct ospf_interface
*oi
= rn
->info
;
513 if (oi
&& (OSPF_IF_PARAM(oi
, passive_interface
)
515 ospf_if_set_multicast(oi
);
518 * XXX It is not clear what state transitions the interface needs to
519 * undergo when going from active to passive. Fixing this will
520 * require precise identification of interfaces having such a
527 DEFUN (no_ospf_passive_interface
,
528 no_ospf_passive_interface_addr_cmd
,
529 "no passive-interface <IFNAME [A.B.C.D]|default>",
531 "Allow routing updates on an interface\n"
534 "Allow routing updates on interfaces by default\n")
536 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
538 struct interface
*ifp
= NULL
;
539 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
540 struct ospf_if_params
*params
;
542 struct route_node
*rn
;
544 if (strmatch(argv
[2]->text
, "default")) {
545 ospf_passive_interface_default(ospf
, OSPF_IF_ACTIVE
);
549 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
550 ifp
= if_get_by_name(argv
[2]->arg
, ospf
->vrf_id
);
553 vty_out(vty
, "interface %s not found.\n", (char *)argv
[2]->arg
);
554 return CMD_WARNING_CONFIG_FAILED
;
557 params
= IF_DEF_PARAMS(ifp
);
560 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
563 "Please specify interface address by A.B.C.D\n");
564 return CMD_WARNING_CONFIG_FAILED
;
567 params
= ospf_lookup_if_params(ifp
, addr
);
570 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
571 OSPF_IF_ACTIVE
, addr
);
573 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_ACTIVE
);
575 /* XXX We should call ospf_if_set_multicast on exactly those
576 * interfaces for which the passive property changed. It is too much
577 * work to determine this set, so we do this for every interface.
578 * This is safe and reasonable because ospf_if_set_multicast uses a
579 * record of joined groups to avoid systems calls if the desired
580 * memberships match the current memership.
582 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
583 struct ospf_interface
*oi
= rn
->info
;
586 && (OSPF_IF_PARAM(oi
, passive_interface
) == OSPF_IF_ACTIVE
))
587 ospf_if_set_multicast(oi
);
594 DEFUN (ospf_network_area
,
595 ospf_network_area_cmd
,
596 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
597 "Enable routing on an IP network\n"
598 "OSPF network prefix\n"
599 "Set the OSPF area ID\n"
600 "OSPF area ID in IP address format\n"
601 "OSPF area ID as a decimal value\n")
603 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
604 int idx_ipv4_prefixlen
= 1;
605 int idx_ipv4_number
= 3;
606 struct prefix_ipv4 p
;
607 struct in_addr area_id
;
610 if (ospf
->instance
) {
612 "The network command is not supported in multi-instance ospf\n");
613 return CMD_WARNING_CONFIG_FAILED
;
616 if (ospf
->if_ospf_cli_count
> 0) {
618 "Please remove all ip ospf area x.x.x.x commands first.\n");
619 if (IS_DEBUG_OSPF_EVENT
)
621 "%s ospf vrf %s num of %u ip osp area x config",
623 ospf
->name
? ospf
->name
: "NIL",
624 ospf
->if_ospf_cli_count
);
625 return CMD_WARNING_CONFIG_FAILED
;
628 /* Get network prefix and Area ID. */
629 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
630 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
632 ret
= ospf_network_set(ospf
, &p
, area_id
, format
);
634 vty_out(vty
, "There is already same network statement.\n");
635 return CMD_WARNING_CONFIG_FAILED
;
641 DEFUN (no_ospf_network_area
,
642 no_ospf_network_area_cmd
,
643 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
645 "Enable routing on an IP network\n"
646 "OSPF network prefix\n"
647 "Set the OSPF area ID\n"
648 "OSPF area ID in IP address format\n"
649 "OSPF area ID as a decimal value\n")
651 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
652 int idx_ipv4_prefixlen
= 2;
653 int idx_ipv4_number
= 4;
654 struct prefix_ipv4 p
;
655 struct in_addr area_id
;
658 if (ospf
->instance
) {
660 "The network command is not supported in multi-instance ospf\n");
661 return CMD_WARNING_CONFIG_FAILED
;
664 /* Get network prefix and Area ID. */
665 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
666 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
668 ret
= ospf_network_unset(ospf
, &p
, area_id
);
671 "Can't find specified network area configuration.\n");
672 return CMD_WARNING_CONFIG_FAILED
;
678 DEFUN (ospf_area_range
,
680 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
681 "OSPF area parameters\n"
682 "OSPF area ID in IP address format\n"
683 "OSPF area ID as a decimal value\n"
684 "Summarize routes matching address/mask (border routers only)\n"
685 "Area range prefix\n"
686 "Advertise this range (default)\n"
687 "User specified metric for this range\n"
688 "Advertised metric for this range\n")
690 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
691 int idx_ipv4_number
= 1;
692 int idx_ipv4_prefixlen
= 3;
694 struct prefix_ipv4 p
;
695 struct in_addr area_id
;
699 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
700 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
702 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
704 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
705 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
711 DEFUN (ospf_area_range_cost
,
712 ospf_area_range_cost_cmd
,
713 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M cost (0-16777215)",
714 "OSPF area parameters\n"
715 "OSPF area ID in IP address format\n"
716 "OSPF area ID as a decimal value\n"
717 "Summarize routes matching address/mask (border routers only)\n"
718 "Area range prefix\n"
719 "User specified metric for this range\n"
720 "Advertised metric for this range\n")
722 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
723 int idx_ipv4_number
= 1;
724 int idx_ipv4_prefixlen
= 3;
726 struct prefix_ipv4 p
;
727 struct in_addr area_id
;
731 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
732 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
734 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
735 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
738 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
739 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
744 DEFUN (ospf_area_range_not_advertise
,
745 ospf_area_range_not_advertise_cmd
,
746 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
747 "OSPF area parameters\n"
748 "OSPF area ID in IP address format\n"
749 "OSPF area ID as a decimal value\n"
750 "Summarize routes matching address/mask (border routers only)\n"
751 "Area range prefix\n"
752 "DoNotAdvertise this range\n")
754 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
755 int idx_ipv4_number
= 1;
756 int idx_ipv4_prefixlen
= 3;
757 struct prefix_ipv4 p
;
758 struct in_addr area_id
;
761 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
762 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
764 ospf_area_range_set(ospf
, area_id
, &p
, 0);
765 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
767 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
772 DEFUN (no_ospf_area_range
,
773 no_ospf_area_range_cmd
,
774 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
776 "OSPF area parameters\n"
777 "OSPF area ID in IP address format\n"
778 "OSPF area ID as a decimal value\n"
779 "Summarize routes matching address/mask (border routers only)\n"
780 "Area range prefix\n"
781 "User specified metric for this range\n"
782 "Advertised metric for this range\n"
783 "Advertise this range (default)\n"
784 "User specified metric for this range\n"
785 "Advertised metric for this range\n"
786 "DoNotAdvertise this range\n")
788 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
789 int idx_ipv4_number
= 2;
790 int idx_ipv4_prefixlen
= 4;
791 struct prefix_ipv4 p
;
792 struct in_addr area_id
;
795 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
796 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
798 ospf_area_range_unset(ospf
, area_id
, &p
);
803 DEFUN (ospf_area_range_substitute
,
804 ospf_area_range_substitute_cmd
,
805 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
806 "OSPF area parameters\n"
807 "OSPF area ID in IP address format\n"
808 "OSPF area ID as a decimal value\n"
809 "Summarize routes matching address/mask (border routers only)\n"
810 "Area range prefix\n"
811 "Announce area range as another prefix\n"
812 "Network prefix to be announced instead of range\n")
814 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
815 int idx_ipv4_number
= 1;
816 int idx_ipv4_prefixlen
= 3;
817 int idx_ipv4_prefixlen_2
= 5;
818 struct prefix_ipv4 p
, s
;
819 struct in_addr area_id
;
822 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
823 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
824 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
826 ospf_area_range_substitute_set(ospf
, area_id
, &p
, &s
);
827 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
833 DEFUN (no_ospf_area_range_substitute
,
834 no_ospf_area_range_substitute_cmd
,
835 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
837 "OSPF area parameters\n"
838 "OSPF area ID in IP address format\n"
839 "OSPF area ID as a decimal value\n"
840 "Summarize routes matching address/mask (border routers only)\n"
841 "Area range prefix\n"
842 "Announce area range as another prefix\n"
843 "Network prefix to be announced instead of range\n")
845 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
846 int idx_ipv4_number
= 2;
847 int idx_ipv4_prefixlen
= 4;
848 int idx_ipv4_prefixlen_2
= 6;
849 struct prefix_ipv4 p
, s
;
850 struct in_addr area_id
;
853 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
854 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
855 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
857 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
863 /* Command Handler Logic in VLink stuff is delicate!!
865 ALTER AT YOUR OWN RISK!!!!
867 Various dummy values are used to represent 'NoChange' state for
868 VLink configuration NOT being changed by a VLink command, and
869 special syntax is used within the command strings so that the
870 typed in command verbs can be seen in the configuration command
871 bacckend handler. This is to drastically reduce the verbeage
872 required to coe up with a reasonably compatible Cisco VLink command
874 - Matthew Grant <grantma@anathoth.gen.nz>
875 Wed, 21 Feb 2001 15:13:52 +1300
878 /* Configuration data for virtual links
880 struct ospf_vl_config_data
{
881 struct vty
*vty
; /* vty stuff */
882 struct in_addr area_id
; /* area ID from command line */
883 int area_id_fmt
; /* command line area ID format */
884 struct in_addr vl_peer
; /* command line vl_peer */
885 int auth_type
; /* Authehntication type, if given */
886 char *auth_key
; /* simple password if present */
887 int crypto_key_id
; /* Cryptographic key ID */
888 char *md5_key
; /* MD5 authentication key */
889 int hello_interval
; /* Obvious what these are... */
890 int retransmit_interval
;
895 static void ospf_vl_config_data_init(struct ospf_vl_config_data
*vl_config
,
898 memset(vl_config
, 0, sizeof(struct ospf_vl_config_data
));
899 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
900 vl_config
->vty
= vty
;
903 static struct ospf_vl_data
*
904 ospf_find_vl_data(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
906 struct ospf_area
*area
;
907 struct ospf_vl_data
*vl_data
;
909 struct in_addr area_id
;
911 vty
= vl_config
->vty
;
912 area_id
= vl_config
->area_id
;
914 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
) {
916 "Configuring VLs over the backbone is not allowed\n");
919 area
= ospf_area_get(ospf
, area_id
);
920 ospf_area_display_format_set(ospf
, area
, vl_config
->area_id_fmt
);
922 if (area
->external_routing
!= OSPF_AREA_DEFAULT
) {
923 if (vl_config
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
924 vty_out(vty
, "Area %s is %s\n", inet_ntoa(area_id
),
925 area
->external_routing
== OSPF_AREA_NSSA
929 vty_out(vty
, "Area %ld is %s\n",
930 (unsigned long)ntohl(area_id
.s_addr
),
931 area
->external_routing
== OSPF_AREA_NSSA
937 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
->vl_peer
))
939 vl_data
= ospf_vl_data_new(area
, vl_config
->vl_peer
);
940 if (vl_data
->vl_oi
== NULL
) {
941 vl_data
->vl_oi
= ospf_vl_new(ospf
, vl_data
);
942 ospf_vl_add(ospf
, vl_data
);
943 ospf_spf_calculate_schedule(ospf
,
944 SPF_FLAG_CONFIG_CHANGE
);
951 static int ospf_vl_set_security(struct ospf_vl_data
*vl_data
,
952 struct ospf_vl_config_data
*vl_config
)
954 struct crypt_key
*ck
;
956 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
958 vty
= vl_config
->vty
;
960 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
) {
961 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), auth_type
);
962 IF_DEF_PARAMS(ifp
)->auth_type
= vl_config
->auth_type
;
965 if (vl_config
->auth_key
) {
966 memset(IF_DEF_PARAMS(ifp
)->auth_simple
, 0,
967 OSPF_AUTH_SIMPLE_SIZE
+ 1);
968 strlcpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
970 sizeof(IF_DEF_PARAMS(ifp
)->auth_simple
));
971 } else if (vl_config
->md5_key
) {
972 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
973 vl_config
->crypto_key_id
)
975 vty_out(vty
, "OSPF: Key %d already exists\n",
976 vl_config
->crypto_key_id
);
979 ck
= ospf_crypt_key_new();
980 ck
->key_id
= vl_config
->crypto_key_id
;
981 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
982 strlcpy((char *)ck
->auth_key
, vl_config
->md5_key
,
983 sizeof(ck
->auth_key
));
985 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
986 } else if (vl_config
->crypto_key_id
!= 0) {
989 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
990 vl_config
->crypto_key_id
)
992 vty_out(vty
, "OSPF: Key %d does not exist\n",
993 vl_config
->crypto_key_id
);
994 return CMD_WARNING_CONFIG_FAILED
;
997 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
998 vl_config
->crypto_key_id
);
1004 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
1005 struct ospf_vl_config_data
*vl_config
)
1007 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
1008 /* Virtual Link data initialised to defaults, so only set
1010 if (vl_config
->hello_interval
) {
1011 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
1012 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
1015 if (vl_config
->dead_interval
) {
1016 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
1017 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
1020 if (vl_config
->retransmit_interval
) {
1021 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
1022 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
1023 vl_config
->retransmit_interval
;
1026 if (vl_config
->transmit_delay
) {
1027 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
1028 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
1035 /* The business end of all of the above */
1036 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
1038 struct ospf_vl_data
*vl_data
;
1041 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
1043 return CMD_WARNING_CONFIG_FAILED
;
1045 /* Process this one first as it can have a fatal result, which can
1046 only logically occur if the virtual link exists already
1047 Thus a command error does not result in a change to the
1048 running configuration such as unexpectedly altered timer
1050 ret
= ospf_vl_set_security(vl_data
, vl_config
);
1051 if (ret
!= CMD_SUCCESS
)
1054 /* Set any time based parameters, these area already range checked */
1056 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
1057 if (ret
!= CMD_SUCCESS
)
1063 /* This stuff exists to make specifying all the alias commands A LOT simpler
1065 #define VLINK_HELPSTR_IPADDR \
1066 "OSPF area parameters\n" \
1067 "OSPF area ID in IP address format\n" \
1068 "OSPF area ID as a decimal value\n" \
1069 "Configure a virtual link\n" \
1070 "Router ID of the remote ABR\n"
1072 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1073 "Enable authentication on this virtual link\n" \
1076 #define VLINK_HELPSTR_AUTHTYPE_ALL \
1077 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1078 "Use null authentication\n" \
1079 "Use message-digest authentication\n"
1081 #define VLINK_HELPSTR_TIME_PARAM \
1082 "Time between HELLO packets\n" \
1084 "Time between retransmitting lost link state advertisements\n" \
1086 "Link state transmit delay\n" \
1088 "Interval time after which a neighbor is declared down\n" \
1091 #define VLINK_HELPSTR_AUTH_SIMPLE \
1092 "Authentication password (key)\n" \
1093 "The OSPF password (key)\n"
1095 #define VLINK_HELPSTR_AUTH_MD5 \
1096 "Message digest authentication password (key)\n" \
1098 "Use MD5 algorithm\n" \
1099 "The OSPF password (key)\n"
1101 DEFUN (ospf_area_vlink
,
1102 ospf_area_vlink_cmd
,
1103 "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>]",
1104 VLINK_HELPSTR_IPADDR
1105 "Enable authentication on this virtual link\n"
1106 "Use message-digest authentication\n"
1107 "Use null authentication\n"
1108 VLINK_HELPSTR_AUTH_MD5
1109 VLINK_HELPSTR_AUTH_SIMPLE
)
1111 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1112 int idx_ipv4_number
= 1;
1114 struct ospf_vl_config_data vl_config
;
1115 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1116 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1120 ospf_vl_config_data_init(&vl_config
, vty
);
1122 /* Read off first 2 parameters and check them */
1123 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1124 &vl_config
.area_id_fmt
);
1126 vty_out(vty
, "OSPF area ID is invalid\n");
1127 return CMD_WARNING_CONFIG_FAILED
;
1130 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1132 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1133 return CMD_WARNING_CONFIG_FAILED
;
1137 /* Thats all folks! - BUGS B. strikes again!!!*/
1139 return ospf_vl_set(ospf
, &vl_config
);
1142 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1143 /* authentication - this option can only occur
1144 at start of command line */
1145 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1148 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1149 /* authentication message-digest */
1150 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1151 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1152 /* "authentication null" */
1153 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1156 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1157 vl_config
.md5_key
= NULL
;
1158 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1159 if (vl_config
.crypto_key_id
< 0)
1160 return CMD_WARNING_CONFIG_FAILED
;
1162 strlcpy(md5_key
, argv
[idx
+ 3]->arg
, sizeof(md5_key
));
1163 vl_config
.md5_key
= md5_key
;
1166 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1167 strlcpy(auth_key
, argv
[idx
+ 1]->arg
, sizeof(auth_key
));
1168 vl_config
.auth_key
= auth_key
;
1171 /* Action configuration */
1173 return ospf_vl_set(ospf
, &vl_config
);
1176 DEFUN (no_ospf_area_vlink
,
1177 no_ospf_area_vlink_cmd
,
1178 "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>]",
1180 VLINK_HELPSTR_IPADDR
1181 "Enable authentication on this virtual link\n" \
1182 "Use message-digest authentication\n" \
1183 "Use null authentication\n" \
1184 VLINK_HELPSTR_AUTH_MD5
1185 VLINK_HELPSTR_AUTH_SIMPLE
)
1187 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1188 int idx_ipv4_number
= 2;
1190 struct ospf_area
*area
;
1191 struct ospf_vl_config_data vl_config
;
1192 struct ospf_vl_data
*vl_data
= NULL
;
1193 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1197 ospf_vl_config_data_init(&vl_config
, vty
);
1199 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1202 vty_out(vty
, "OSPF area ID is invalid\n");
1203 return CMD_WARNING_CONFIG_FAILED
;
1206 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1208 vty_out(vty
, "Area does not exist\n");
1209 return CMD_WARNING_CONFIG_FAILED
;
1212 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1214 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1215 return CMD_WARNING_CONFIG_FAILED
;
1218 vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
);
1220 vty_out(vty
, "Virtual link does not exist\n");
1221 return CMD_WARNING_CONFIG_FAILED
;
1225 /* Basic VLink no command */
1226 /* Thats all folks! - BUGS B. strikes again!!!*/
1227 ospf_vl_delete(ospf
, vl_data
);
1228 ospf_area_check_free(ospf
, vl_config
.area_id
);
1232 /* If we are down here, we are reseting parameters */
1233 /* Deal with other parameters */
1235 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1236 /* authentication - this option can only occur
1237 at start of command line */
1238 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1241 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1242 vl_config
.md5_key
= NULL
;
1243 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1244 if (vl_config
.crypto_key_id
< 0)
1245 return CMD_WARNING_CONFIG_FAILED
;
1248 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1249 /* Reset authentication-key to 0 */
1250 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1251 vl_config
.auth_key
= auth_key
;
1254 /* Action configuration */
1256 return ospf_vl_set(ospf
, &vl_config
);
1259 DEFUN (ospf_area_vlink_intervals
,
1260 ospf_area_vlink_intervals_cmd
,
1261 "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)}",
1262 VLINK_HELPSTR_IPADDR
1263 VLINK_HELPSTR_TIME_PARAM
)
1265 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1266 struct ospf_vl_config_data vl_config
;
1269 ospf_vl_config_data_init(&vl_config
, vty
);
1271 char *area_id
= argv
[1]->arg
;
1272 char *router_id
= argv
[3]->arg
;
1274 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1276 vty_out(vty
, "OSPF area ID is invalid\n");
1277 return CMD_WARNING_CONFIG_FAILED
;
1280 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1282 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1283 return CMD_WARNING_CONFIG_FAILED
;
1286 for (int idx
= 4; idx
< argc
; idx
++) {
1287 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1288 vl_config
.hello_interval
=
1289 strtol(argv
[++idx
]->arg
, NULL
, 10);
1290 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1291 vl_config
.retransmit_interval
=
1292 strtol(argv
[++idx
]->arg
, NULL
, 10);
1293 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1294 vl_config
.transmit_delay
=
1295 strtol(argv
[++idx
]->arg
, NULL
, 10);
1296 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1297 vl_config
.dead_interval
=
1298 strtol(argv
[++idx
]->arg
, NULL
, 10);
1301 /* Action configuration */
1302 return ospf_vl_set(ospf
, &vl_config
);
1305 DEFUN (no_ospf_area_vlink_intervals
,
1306 no_ospf_area_vlink_intervals_cmd
,
1307 "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)}",
1309 VLINK_HELPSTR_IPADDR
1310 VLINK_HELPSTR_TIME_PARAM
)
1312 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1313 struct ospf_vl_config_data vl_config
;
1316 ospf_vl_config_data_init(&vl_config
, vty
);
1318 char *area_id
= argv
[2]->arg
;
1319 char *router_id
= argv
[4]->arg
;
1321 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1323 vty_out(vty
, "OSPF area ID is invalid\n");
1324 return CMD_WARNING_CONFIG_FAILED
;
1327 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1329 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1330 return CMD_WARNING_CONFIG_FAILED
;
1333 for (int idx
= 5; idx
< argc
; idx
++) {
1334 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1335 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1336 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1337 vl_config
.retransmit_interval
=
1338 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1339 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1340 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1341 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1342 vl_config
.dead_interval
=
1343 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1346 /* Action configuration */
1347 return ospf_vl_set(ospf
, &vl_config
);
1350 DEFUN (ospf_area_shortcut
,
1351 ospf_area_shortcut_cmd
,
1352 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1353 "OSPF area parameters\n"
1354 "OSPF area ID in IP address format\n"
1355 "OSPF area ID as a decimal value\n"
1356 "Configure the area's shortcutting mode\n"
1357 "Set default shortcutting behavior\n"
1358 "Enable shortcutting through the area\n"
1359 "Disable shortcutting through the area\n")
1361 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1362 int idx_ipv4_number
= 1;
1363 int idx_enable_disable
= 3;
1364 struct ospf_area
*area
;
1365 struct in_addr area_id
;
1369 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1370 argv
[idx_ipv4_number
]->arg
);
1372 area
= ospf_area_get(ospf
, area_id
);
1373 ospf_area_display_format_set(ospf
, area
, format
);
1375 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1376 mode
= OSPF_SHORTCUT_DEFAULT
;
1377 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1378 mode
= OSPF_SHORTCUT_DISABLE
;
1379 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1380 mode
= OSPF_SHORTCUT_ENABLE
;
1382 return CMD_WARNING_CONFIG_FAILED
;
1384 ospf_area_shortcut_set(ospf
, area
, mode
);
1386 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1388 "Shortcut area setting will take effect "
1389 "only when the router is configured as Shortcut ABR\n");
1394 DEFUN (no_ospf_area_shortcut
,
1395 no_ospf_area_shortcut_cmd
,
1396 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1398 "OSPF area parameters\n"
1399 "OSPF area ID in IP address format\n"
1400 "OSPF area ID as a decimal value\n"
1401 "Deconfigure the area's shortcutting mode\n"
1402 "Deconfigure enabled shortcutting through the area\n"
1403 "Deconfigure disabled shortcutting through the area\n")
1405 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1406 int idx_ipv4_number
= 2;
1407 struct ospf_area
*area
;
1408 struct in_addr area_id
;
1411 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1412 argv
[idx_ipv4_number
]->arg
);
1414 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1418 ospf_area_shortcut_unset(ospf
, area
);
1424 DEFUN (ospf_area_stub
,
1426 "area <A.B.C.D|(0-4294967295)> stub",
1427 "OSPF area parameters\n"
1428 "OSPF area ID in IP address format\n"
1429 "OSPF area ID as a decimal value\n"
1430 "Configure OSPF area as stub\n")
1432 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1433 int idx_ipv4_number
= 1;
1434 struct in_addr area_id
;
1437 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1438 argv
[idx_ipv4_number
]->arg
);
1440 ret
= ospf_area_stub_set(ospf
, area_id
);
1441 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1445 "First deconfigure all virtual link through this area\n");
1446 return CMD_WARNING_CONFIG_FAILED
;
1449 ospf_area_no_summary_unset(ospf
, area_id
);
1454 DEFUN (ospf_area_stub_no_summary
,
1455 ospf_area_stub_no_summary_cmd
,
1456 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1457 "OSPF stub parameters\n"
1458 "OSPF area ID in IP address format\n"
1459 "OSPF area ID as a decimal value\n"
1460 "Configure OSPF area as stub\n"
1461 "Do not inject inter-area routes into stub\n")
1463 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1464 int idx_ipv4_number
= 1;
1465 struct in_addr area_id
;
1468 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1469 argv
[idx_ipv4_number
]->arg
);
1471 ret
= ospf_area_stub_set(ospf
, area_id
);
1472 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1476 "%% Area cannot be stub as it contains a virtual link\n");
1477 return CMD_WARNING_CONFIG_FAILED
;
1480 ospf_area_no_summary_set(ospf
, area_id
);
1485 DEFUN (no_ospf_area_stub
,
1486 no_ospf_area_stub_cmd
,
1487 "no area <A.B.C.D|(0-4294967295)> stub",
1489 "OSPF area parameters\n"
1490 "OSPF area ID in IP address format\n"
1491 "OSPF area ID as a decimal value\n"
1492 "Configure OSPF area as stub\n")
1494 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1495 int idx_ipv4_number
= 2;
1496 struct in_addr area_id
;
1499 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1500 argv
[idx_ipv4_number
]->arg
);
1502 ospf_area_stub_unset(ospf
, area_id
);
1503 ospf_area_no_summary_unset(ospf
, area_id
);
1508 DEFUN (no_ospf_area_stub_no_summary
,
1509 no_ospf_area_stub_no_summary_cmd
,
1510 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1512 "OSPF area parameters\n"
1513 "OSPF area ID in IP address format\n"
1514 "OSPF area ID as a decimal value\n"
1515 "Configure OSPF area as stub\n"
1516 "Do not inject inter-area routes into area\n")
1518 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1519 int idx_ipv4_number
= 2;
1520 struct in_addr area_id
;
1523 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1524 argv
[idx_ipv4_number
]->arg
);
1525 ospf_area_no_summary_unset(ospf
, area_id
);
1530 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1531 struct cmd_token
**argv
, int cfg_nosum
,
1534 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1535 struct in_addr area_id
;
1538 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1540 ret
= ospf_area_nssa_set(ospf
, area_id
);
1541 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1545 "%% Area cannot be nssa as it contains a virtual link\n");
1546 return CMD_WARNING_CONFIG_FAILED
;
1550 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1551 ospf_area_nssa_translator_role_set(
1552 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1553 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1554 ospf_area_nssa_translator_role_set(
1555 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1556 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1557 ospf_area_nssa_translator_role_set(
1558 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1560 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1561 OSPF_NSSA_ROLE_CANDIDATE
);
1566 ospf_area_no_summary_set(ospf
, area_id
);
1568 ospf_area_no_summary_unset(ospf
, area_id
);
1571 ospf_schedule_abr_task(ospf
);
1577 DEFUN (ospf_area_nssa_translate
,
1578 ospf_area_nssa_translate_cmd
,
1579 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1580 "OSPF area parameters\n"
1581 "OSPF area ID in IP address format\n"
1582 "OSPF area ID as a decimal value\n"
1583 "Configure OSPF area as nssa\n"
1584 "Configure NSSA-ABR for translate election (default)\n"
1585 "Configure NSSA-ABR to never translate\n"
1586 "Configure NSSA-ABR to always translate\n")
1588 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1591 DEFUN (ospf_area_nssa
,
1593 "area <A.B.C.D|(0-4294967295)> nssa",
1594 "OSPF area parameters\n"
1595 "OSPF area ID in IP address format\n"
1596 "OSPF area ID as a decimal value\n"
1597 "Configure OSPF area as nssa\n")
1599 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1602 DEFUN (ospf_area_nssa_no_summary
,
1603 ospf_area_nssa_no_summary_cmd
,
1604 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
1605 "OSPF area parameters\n"
1606 "OSPF area ID in IP address format\n"
1607 "OSPF area ID as a decimal value\n"
1608 "Configure OSPF area as nssa\n"
1609 "Do not inject inter-area routes into nssa\n")
1611 int idx_ipv4_number
= 1;
1612 struct in_addr area_id
;
1615 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1616 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1617 argv
[idx_ipv4_number
]->arg
);
1619 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1621 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1623 ospf_schedule_abr_task(ospf
);
1628 DEFUN (no_ospf_area_nssa_no_summary
,
1629 no_ospf_area_nssa_no_summary_cmd
,
1630 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1632 "OSPF area parameters\n"
1633 "OSPF area ID in IP address format\n"
1634 "OSPF area ID as a decimal value\n"
1635 "Configure OSPF area as nssa\n"
1636 "Do not inject inter-area routes into nssa\n")
1638 int idx_ipv4_number
= 2;
1639 struct in_addr area_id
;
1642 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1644 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1645 argv
[idx_ipv4_number
]->arg
);
1647 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1649 ospf_area_no_summary_unset(ospf
, area_id
);
1651 ospf_schedule_abr_task(ospf
);
1656 DEFUN (no_ospf_area_nssa
,
1657 no_ospf_area_nssa_cmd
,
1658 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1660 "OSPF area parameters\n"
1661 "OSPF area ID in IP address format\n"
1662 "OSPF area ID as a decimal value\n"
1663 "Configure OSPF area as nssa\n"
1664 "Configure NSSA-ABR for translate election (default)\n"
1665 "Configure NSSA-ABR to never translate\n"
1666 "Configure NSSA-ABR to always translate\n")
1668 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1669 int idx_ipv4_number
= 2;
1670 struct in_addr area_id
;
1673 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1674 argv
[idx_ipv4_number
]->arg
);
1676 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1678 ospf_schedule_abr_task(ospf
);
1684 DEFUN (ospf_area_default_cost
,
1685 ospf_area_default_cost_cmd
,
1686 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1687 "OSPF area parameters\n"
1688 "OSPF area ID in IP address format\n"
1689 "OSPF area ID as a decimal value\n"
1690 "Set the summary-default cost of a NSSA or stub area\n"
1691 "Stub's advertised default summary cost\n")
1693 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1694 int idx_ipv4_number
= 1;
1696 struct ospf_area
*area
;
1697 struct in_addr area_id
;
1700 struct prefix_ipv4 p
;
1702 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1703 argv
[idx_ipv4_number
]->arg
);
1704 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1706 area
= ospf_area_get(ospf
, area_id
);
1707 ospf_area_display_format_set(ospf
, area
, format
);
1709 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1710 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1711 return CMD_WARNING_CONFIG_FAILED
;
1714 area
->default_cost
= cost
;
1717 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1719 if (IS_DEBUG_OSPF_EVENT
)
1721 "ospf_abr_announce_stub_defaults(): "
1722 "announcing 0.0.0.0/0 to area %s",
1723 inet_ntoa(area
->area_id
));
1724 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1729 DEFUN (no_ospf_area_default_cost
,
1730 no_ospf_area_default_cost_cmd
,
1731 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1733 "OSPF area parameters\n"
1734 "OSPF area ID in IP address format\n"
1735 "OSPF area ID as a decimal value\n"
1736 "Set the summary-default cost of a NSSA or stub area\n"
1737 "Stub's advertised default summary cost\n")
1739 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1740 int idx_ipv4_number
= 2;
1741 struct ospf_area
*area
;
1742 struct in_addr area_id
;
1744 struct prefix_ipv4 p
;
1746 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1747 argv
[idx_ipv4_number
]->arg
);
1749 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1753 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1754 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1755 return CMD_WARNING_CONFIG_FAILED
;
1758 area
->default_cost
= 1;
1761 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1763 if (IS_DEBUG_OSPF_EVENT
)
1765 "ospf_abr_announce_stub_defaults(): "
1766 "announcing 0.0.0.0/0 to area %s",
1767 inet_ntoa(area
->area_id
));
1768 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1771 ospf_area_check_free(ospf
, area_id
);
1776 DEFUN (ospf_area_export_list
,
1777 ospf_area_export_list_cmd
,
1778 "area <A.B.C.D|(0-4294967295)> export-list NAME",
1779 "OSPF area parameters\n"
1780 "OSPF area ID in IP address format\n"
1781 "OSPF area ID as a decimal value\n"
1782 "Set the filter for networks announced to other areas\n"
1783 "Name of the access-list\n")
1785 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1786 int idx_ipv4_number
= 1;
1787 struct ospf_area
*area
;
1788 struct in_addr area_id
;
1791 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1793 area
= ospf_area_get(ospf
, area_id
);
1794 ospf_area_display_format_set(ospf
, area
, format
);
1795 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1800 DEFUN (no_ospf_area_export_list
,
1801 no_ospf_area_export_list_cmd
,
1802 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
1804 "OSPF area parameters\n"
1805 "OSPF area ID in IP address format\n"
1806 "OSPF area ID as a decimal value\n"
1807 "Unset the filter for networks announced to other areas\n"
1808 "Name of the access-list\n")
1810 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1811 int idx_ipv4_number
= 2;
1812 struct ospf_area
*area
;
1813 struct in_addr area_id
;
1816 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1818 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1822 ospf_area_export_list_unset(ospf
, area
);
1828 DEFUN (ospf_area_import_list
,
1829 ospf_area_import_list_cmd
,
1830 "area <A.B.C.D|(0-4294967295)> import-list NAME",
1831 "OSPF area parameters\n"
1832 "OSPF area ID in IP address format\n"
1833 "OSPF area ID as a decimal value\n"
1834 "Set the filter for networks from other areas announced to the specified one\n"
1835 "Name of the access-list\n")
1837 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1838 int idx_ipv4_number
= 1;
1839 struct ospf_area
*area
;
1840 struct in_addr area_id
;
1843 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1845 area
= ospf_area_get(ospf
, area_id
);
1846 ospf_area_display_format_set(ospf
, area
, format
);
1847 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1852 DEFUN (no_ospf_area_import_list
,
1853 no_ospf_area_import_list_cmd
,
1854 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
1856 "OSPF area parameters\n"
1857 "OSPF area ID in IP address format\n"
1858 "OSPF area ID as a decimal value\n"
1859 "Unset the filter for networks announced to other areas\n"
1860 "Name of the access-list\n")
1862 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1863 int idx_ipv4_number
= 2;
1864 struct ospf_area
*area
;
1865 struct in_addr area_id
;
1868 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1870 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1874 ospf_area_import_list_unset(ospf
, area
);
1879 DEFUN (ospf_area_filter_list
,
1880 ospf_area_filter_list_cmd
,
1881 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1882 "OSPF area parameters\n"
1883 "OSPF area ID in IP address format\n"
1884 "OSPF area ID as a decimal value\n"
1885 "Filter networks between OSPF areas\n"
1886 "Filter prefixes between OSPF areas\n"
1887 "Name of an IP prefix-list\n"
1888 "Filter networks sent to this area\n"
1889 "Filter networks sent from this area\n")
1891 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1892 int idx_ipv4_number
= 1;
1895 struct ospf_area
*area
;
1896 struct in_addr area_id
;
1897 struct prefix_list
*plist
;
1900 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1902 area
= ospf_area_get(ospf
, area_id
);
1903 ospf_area_display_format_set(ospf
, area
, format
);
1904 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1905 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1906 PREFIX_LIST_IN(area
) = plist
;
1907 if (PREFIX_NAME_IN(area
))
1908 free(PREFIX_NAME_IN(area
));
1910 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1911 ospf_schedule_abr_task(ospf
);
1913 PREFIX_LIST_OUT(area
) = plist
;
1914 if (PREFIX_NAME_OUT(area
))
1915 free(PREFIX_NAME_OUT(area
));
1917 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1918 ospf_schedule_abr_task(ospf
);
1924 DEFUN (no_ospf_area_filter_list
,
1925 no_ospf_area_filter_list_cmd
,
1926 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1928 "OSPF area parameters\n"
1929 "OSPF area ID in IP address format\n"
1930 "OSPF area ID as a decimal value\n"
1931 "Filter networks between OSPF areas\n"
1932 "Filter prefixes between OSPF areas\n"
1933 "Name of an IP prefix-list\n"
1934 "Filter networks sent to this area\n"
1935 "Filter networks sent from this area\n")
1937 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1938 int idx_ipv4_number
= 2;
1941 struct ospf_area
*area
;
1942 struct in_addr area_id
;
1945 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1947 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1950 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1951 if (PREFIX_NAME_IN(area
))
1952 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1956 PREFIX_LIST_IN(area
) = NULL
;
1957 if (PREFIX_NAME_IN(area
))
1958 free(PREFIX_NAME_IN(area
));
1960 PREFIX_NAME_IN(area
) = NULL
;
1962 ospf_schedule_abr_task(ospf
);
1964 if (PREFIX_NAME_OUT(area
))
1965 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1969 PREFIX_LIST_OUT(area
) = NULL
;
1970 if (PREFIX_NAME_OUT(area
))
1971 free(PREFIX_NAME_OUT(area
));
1973 PREFIX_NAME_OUT(area
) = NULL
;
1975 ospf_schedule_abr_task(ospf
);
1982 DEFUN (ospf_area_authentication_message_digest
,
1983 ospf_area_authentication_message_digest_cmd
,
1984 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1986 "OSPF area parameters\n"
1987 "OSPF area ID in IP address format\n"
1988 "OSPF area ID as a decimal value\n"
1989 "Enable authentication\n"
1990 "Use message-digest authentication\n")
1992 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1994 struct ospf_area
*area
;
1995 struct in_addr area_id
;
1998 argv_find(argv
, argc
, "area", &idx
);
1999 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
2001 area
= ospf_area_get(ospf
, area_id
);
2002 ospf_area_display_format_set(ospf
, area
, format
);
2003 area
->auth_type
= strmatch(argv
[0]->text
, "no")
2005 : OSPF_AUTH_CRYPTOGRAPHIC
;
2010 DEFUN (ospf_area_authentication
,
2011 ospf_area_authentication_cmd
,
2012 "area <A.B.C.D|(0-4294967295)> authentication",
2013 "OSPF area parameters\n"
2014 "OSPF area ID in IP address format\n"
2015 "OSPF area ID as a decimal value\n"
2016 "Enable authentication\n")
2018 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2019 int idx_ipv4_number
= 1;
2020 struct ospf_area
*area
;
2021 struct in_addr area_id
;
2024 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2026 area
= ospf_area_get(ospf
, area_id
);
2027 ospf_area_display_format_set(ospf
, area
, format
);
2028 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2033 DEFUN (no_ospf_area_authentication
,
2034 no_ospf_area_authentication_cmd
,
2035 "no area <A.B.C.D|(0-4294967295)> authentication",
2037 "OSPF area parameters\n"
2038 "OSPF area ID in IP address format\n"
2039 "OSPF area ID as a decimal value\n"
2040 "Enable authentication\n")
2042 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2043 int idx_ipv4_number
= 2;
2044 struct ospf_area
*area
;
2045 struct in_addr area_id
;
2048 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2050 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2054 area
->auth_type
= OSPF_AUTH_NULL
;
2056 ospf_area_check_free(ospf
, area_id
);
2062 DEFUN (ospf_abr_type
,
2064 "ospf abr-type <cisco|ibm|shortcut|standard>",
2065 "OSPF specific commands\n"
2066 "Set OSPF ABR type\n"
2067 "Alternative ABR, cisco implementation\n"
2068 "Alternative ABR, IBM implementation\n"
2070 "Standard behavior (RFC2328)\n")
2072 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2074 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2076 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2077 abr_type
= OSPF_ABR_CISCO
;
2078 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2079 abr_type
= OSPF_ABR_IBM
;
2080 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2081 abr_type
= OSPF_ABR_SHORTCUT
;
2082 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2083 abr_type
= OSPF_ABR_STAND
;
2085 return CMD_WARNING_CONFIG_FAILED
;
2087 /* If ABR type value is changed, schedule ABR task. */
2088 if (ospf
->abr_type
!= abr_type
) {
2089 ospf
->abr_type
= abr_type
;
2090 ospf_schedule_abr_task(ospf
);
2096 DEFUN (no_ospf_abr_type
,
2097 no_ospf_abr_type_cmd
,
2098 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2100 "OSPF specific commands\n"
2101 "Set OSPF ABR type\n"
2102 "Alternative ABR, cisco implementation\n"
2103 "Alternative ABR, IBM implementation\n"
2107 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2109 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2111 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2112 abr_type
= OSPF_ABR_CISCO
;
2113 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2114 abr_type
= OSPF_ABR_IBM
;
2115 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2116 abr_type
= OSPF_ABR_SHORTCUT
;
2117 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2118 abr_type
= OSPF_ABR_STAND
;
2120 return CMD_WARNING_CONFIG_FAILED
;
2122 /* If ABR type value is changed, schedule ABR task. */
2123 if (ospf
->abr_type
== abr_type
) {
2124 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2125 ospf_schedule_abr_task(ospf
);
2131 DEFUN (ospf_log_adjacency_changes
,
2132 ospf_log_adjacency_changes_cmd
,
2133 "log-adjacency-changes",
2134 "Log changes in adjacency state\n")
2136 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2138 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2139 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2143 DEFUN (ospf_log_adjacency_changes_detail
,
2144 ospf_log_adjacency_changes_detail_cmd
,
2145 "log-adjacency-changes detail",
2146 "Log changes in adjacency state\n"
2147 "Log all state changes\n")
2149 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2151 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2152 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2156 DEFUN (no_ospf_log_adjacency_changes
,
2157 no_ospf_log_adjacency_changes_cmd
,
2158 "no log-adjacency-changes",
2160 "Log changes in adjacency state\n")
2162 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2164 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2165 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2169 DEFUN (no_ospf_log_adjacency_changes_detail
,
2170 no_ospf_log_adjacency_changes_detail_cmd
,
2171 "no log-adjacency-changes detail",
2173 "Log changes in adjacency state\n"
2174 "Log all state changes\n")
2176 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2178 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2182 DEFUN (ospf_compatible_rfc1583
,
2183 ospf_compatible_rfc1583_cmd
,
2184 "compatible rfc1583",
2185 "OSPF compatibility list\n"
2186 "compatible with RFC 1583\n")
2188 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2190 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2191 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2192 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2197 DEFUN (no_ospf_compatible_rfc1583
,
2198 no_ospf_compatible_rfc1583_cmd
,
2199 "no compatible rfc1583",
2201 "OSPF compatibility list\n"
2202 "compatible with RFC 1583\n")
2204 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2206 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2207 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2208 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2213 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2214 "ospf rfc1583compatibility",
2215 "OSPF specific commands\n"
2216 "Enable the RFC1583Compatibility flag\n")
2218 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2219 "no ospf rfc1583compatibility", NO_STR
2220 "OSPF specific commands\n"
2221 "Disable the RFC1583Compatibility flag\n")
2223 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2224 unsigned int hold
, unsigned int max
)
2226 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2228 ospf
->spf_delay
= delay
;
2229 ospf
->spf_holdtime
= hold
;
2230 ospf
->spf_max_holdtime
= max
;
2235 DEFUN (ospf_timers_min_ls_interval
,
2236 ospf_timers_min_ls_interval_cmd
,
2237 "timers throttle lsa all (0-5000)",
2238 "Adjust routing timers\n"
2239 "Throttling adaptive timer\n"
2240 "LSA delay between transmissions\n"
2242 "Delay (msec) between sending LSAs\n")
2244 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2246 unsigned int interval
;
2249 vty_out(vty
, "Insufficient arguments\n");
2250 return CMD_WARNING_CONFIG_FAILED
;
2253 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2255 ospf
->min_ls_interval
= interval
;
2260 DEFUN (no_ospf_timers_min_ls_interval
,
2261 no_ospf_timers_min_ls_interval_cmd
,
2262 "no timers throttle lsa all [(0-5000)]",
2264 "Adjust routing timers\n"
2265 "Throttling adaptive timer\n"
2266 "LSA delay between transmissions\n"
2268 "Delay (msec) between sending LSAs\n")
2270 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2271 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2276 DEFUN (ospf_timers_throttle_spf
,
2277 ospf_timers_throttle_spf_cmd
,
2278 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2279 "Adjust routing timers\n"
2280 "Throttling adaptive timer\n"
2282 "Delay (msec) from first change received till SPF calculation\n"
2283 "Initial hold time (msec) between consecutive SPF calculations\n"
2284 "Maximum hold time (msec)\n")
2287 int idx_number_2
= 4;
2288 int idx_number_3
= 5;
2289 unsigned int delay
, hold
, max
;
2292 vty_out(vty
, "Insufficient arguments\n");
2293 return CMD_WARNING_CONFIG_FAILED
;
2296 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2297 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2298 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2300 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2303 DEFUN (no_ospf_timers_throttle_spf
,
2304 no_ospf_timers_throttle_spf_cmd
,
2305 "no 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")
2314 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2315 OSPF_SPF_HOLDTIME_DEFAULT
,
2316 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2320 DEFUN (ospf_timers_lsa_min_arrival
,
2321 ospf_timers_lsa_min_arrival_cmd
,
2322 "timers lsa min-arrival (0-600000)",
2323 "Adjust routing timers\n"
2325 "Minimum delay in receiving new version of a LSA\n"
2326 "Delay in milliseconds\n")
2328 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2329 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2333 DEFUN (no_ospf_timers_lsa_min_arrival
,
2334 no_ospf_timers_lsa_min_arrival_cmd
,
2335 "no timers lsa min-arrival [(0-600000)]",
2337 "Adjust routing timers\n"
2339 "Minimum delay in receiving new version of a LSA\n"
2340 "Delay in milliseconds\n")
2342 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2343 unsigned int minarrival
;
2346 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2348 if (ospf
->min_ls_arrival
!= minarrival
2349 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2353 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2358 DEFUN (ospf_neighbor
,
2360 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2362 "Neighbor IP address\n"
2363 "Neighbor Priority\n"
2365 "Dead Neighbor Polling interval\n"
2368 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2372 struct in_addr nbr_addr
;
2373 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2374 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2376 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2377 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2378 return CMD_WARNING_CONFIG_FAILED
;
2382 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2385 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2387 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2390 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2393 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2398 DEFUN (ospf_neighbor_poll_interval
,
2399 ospf_neighbor_poll_interval_cmd
,
2400 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2402 "Neighbor IP address\n"
2403 "Dead Neighbor Polling interval\n"
2405 "OSPF priority of non-broadcast neighbor\n"
2408 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2412 struct in_addr nbr_addr
;
2413 unsigned int priority
;
2414 unsigned int interval
;
2416 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2417 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2418 return CMD_WARNING_CONFIG_FAILED
;
2421 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2423 priority
= argc
> 4 ? strtoul(argv
[idx_pri
]->arg
, NULL
, 10)
2424 : OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2426 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2427 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2430 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2435 DEFUN (no_ospf_neighbor
,
2436 no_ospf_neighbor_cmd
,
2437 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2440 "Neighbor IP address\n"
2441 "Neighbor Priority\n"
2443 "Dead Neighbor Polling interval\n"
2446 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2448 struct in_addr nbr_addr
;
2450 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2451 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2452 return CMD_WARNING_CONFIG_FAILED
;
2455 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2460 DEFUN (no_ospf_neighbor_poll
,
2461 no_ospf_neighbor_poll_cmd
,
2462 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2465 "Neighbor IP address\n"
2466 "Dead Neighbor Polling interval\n"
2468 "Neighbor Priority\n"
2471 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2473 struct in_addr nbr_addr
;
2475 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2476 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2477 return CMD_WARNING_CONFIG_FAILED
;
2480 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2485 DEFUN (ospf_refresh_timer
,
2486 ospf_refresh_timer_cmd
,
2487 "refresh timer (10-1800)",
2488 "Adjust refresh parameters\n"
2489 "Set refresh timer\n"
2490 "Timer value in seconds\n")
2492 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2494 unsigned int interval
;
2496 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2497 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2498 * OSPF_LSA_REFRESHER_GRANULARITY
;
2500 ospf_timers_refresh_set(ospf
, interval
);
2505 DEFUN (no_ospf_refresh_timer
,
2506 no_ospf_refresh_timer_val_cmd
,
2507 "no refresh timer [(10-1800)]",
2509 "Adjust refresh parameters\n"
2510 "Unset refresh timer\n"
2511 "Timer value in seconds\n")
2513 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2515 unsigned int interval
;
2518 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2520 if (ospf
->lsa_refresh_interval
!= interval
2521 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2525 ospf_timers_refresh_unset(ospf
);
2531 DEFUN (ospf_auto_cost_reference_bandwidth
,
2532 ospf_auto_cost_reference_bandwidth_cmd
,
2533 "auto-cost reference-bandwidth (1-4294967)",
2534 "Calculate OSPF interface cost according to bandwidth\n"
2535 "Use reference bandwidth method to assign OSPF cost\n"
2536 "The reference bandwidth in terms of Mbits per second\n")
2538 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2539 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2542 struct interface
*ifp
;
2544 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2545 if (refbw
< 1 || refbw
> 4294967) {
2546 vty_out(vty
, "reference-bandwidth value is invalid\n");
2547 return CMD_WARNING_CONFIG_FAILED
;
2550 /* If reference bandwidth is changed. */
2551 if ((refbw
) == ospf
->ref_bandwidth
)
2554 ospf
->ref_bandwidth
= refbw
;
2555 FOR_ALL_INTERFACES (vrf
, ifp
)
2556 ospf_if_recalculate_output_cost(ifp
);
2561 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2562 no_ospf_auto_cost_reference_bandwidth_cmd
,
2563 "no auto-cost reference-bandwidth [(1-4294967)]",
2565 "Calculate OSPF interface cost according to bandwidth\n"
2566 "Use reference bandwidth method to assign OSPF cost\n"
2567 "The reference bandwidth in terms of Mbits per second\n")
2569 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2570 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2571 struct interface
*ifp
;
2573 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2576 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2577 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2579 " Please ensure reference bandwidth is consistent across all routers\n");
2581 FOR_ALL_INTERFACES (vrf
, ifp
)
2582 ospf_if_recalculate_output_cost(ifp
);
2587 DEFUN (ospf_write_multiplier
,
2588 ospf_write_multiplier_cmd
,
2589 "ospf write-multiplier (1-100)",
2590 "OSPF specific commands\n"
2591 "Write multiplier\n"
2592 "Maximum number of interface serviced per write\n")
2594 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2596 uint32_t write_oi_count
;
2603 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2604 if (write_oi_count
< 1 || write_oi_count
> 100) {
2605 vty_out(vty
, "write-multiplier value is invalid\n");
2606 return CMD_WARNING_CONFIG_FAILED
;
2609 ospf
->write_oi_count
= write_oi_count
;
2613 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2614 "Write multiplier\n"
2615 "Maximum number of interface serviced per write\n")
2617 DEFUN (no_ospf_write_multiplier
,
2618 no_ospf_write_multiplier_cmd
,
2619 "no ospf write-multiplier (1-100)",
2621 "OSPF specific commands\n"
2622 "Write multiplier\n"
2623 "Maximum number of interface serviced per write\n")
2625 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2627 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2631 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2632 "no write-multiplier (1-100)", NO_STR
2633 "Write multiplier\n"
2634 "Maximum number of interface serviced per write\n")
2636 static const char *const ospf_abr_type_descr_str
[] = {
2637 "Unknown", "Standard (RFC2328)", "Alternative IBM",
2638 "Alternative Cisco", "Alternative Shortcut"
2641 static const char *const ospf_shortcut_mode_descr_str
[] = {
2642 "Default", "Enabled", "Disabled"
2645 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2646 json_object
*json_areas
, bool use_json
)
2648 json_object
*json_area
= NULL
;
2651 json_area
= json_object_new_object();
2655 vty_out(vty
, " Area ID: %s", inet_ntoa(area
->area_id
));
2657 /* Show Area type/mode. */
2658 if (OSPF_IS_AREA_BACKBONE(area
)) {
2660 json_object_boolean_true_add(json_area
, "backbone");
2662 vty_out(vty
, " (Backbone)\n");
2665 if (area
->external_routing
== OSPF_AREA_STUB
) {
2666 if (area
->no_summary
)
2667 json_object_boolean_true_add(
2668 json_area
, "stubNoSummary");
2669 if (area
->shortcut_configured
)
2670 json_object_boolean_true_add(
2671 json_area
, "stubShortcut");
2672 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2673 if (area
->no_summary
)
2674 json_object_boolean_true_add(
2675 json_area
, "nssaNoSummary");
2676 if (area
->shortcut_configured
)
2677 json_object_boolean_true_add(
2678 json_area
, "nssaShortcut");
2681 json_object_string_add(
2682 json_area
, "shortcuttingMode",
2683 ospf_shortcut_mode_descr_str
2684 [area
->shortcut_configured
]);
2685 if (area
->shortcut_capability
)
2686 json_object_boolean_true_add(json_area
,
2689 if (area
->external_routing
== OSPF_AREA_STUB
)
2690 vty_out(vty
, " (Stub%s%s)",
2691 area
->no_summary
? ", no summary" : "",
2692 area
->shortcut_configured
? "; " : "");
2693 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2694 vty_out(vty
, " (NSSA%s%s)",
2695 area
->no_summary
? ", no summary" : "",
2696 area
->shortcut_configured
? "; " : "");
2699 vty_out(vty
, " Shortcutting mode: %s",
2700 ospf_shortcut_mode_descr_str
2701 [area
->shortcut_configured
]);
2702 vty_out(vty
, ", S-bit consensus: %s\n",
2703 area
->shortcut_capability
? "ok" : "no");
2707 /* Show number of interfaces */
2709 json_object_int_add(json_area
, "areaIfTotalCounter",
2710 listcount(area
->oiflist
));
2711 json_object_int_add(json_area
, "areaIfActiveCounter",
2715 " Number of interfaces in this area: Total: %d, "
2717 listcount(area
->oiflist
), area
->act_ints
);
2719 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2721 json_object_boolean_true_add(json_area
, "nssa");
2722 if (!IS_OSPF_ABR(area
->ospf
))
2723 json_object_boolean_false_add(json_area
, "abr");
2724 else if (area
->NSSATranslatorState
) {
2725 json_object_boolean_true_add(json_area
, "abr");
2726 if (area
->NSSATranslatorRole
2727 == OSPF_NSSA_ROLE_CANDIDATE
)
2728 json_object_boolean_true_add(
2730 "nssaTranslatorElected");
2731 else if (area
->NSSATranslatorRole
2732 == OSPF_NSSA_ROLE_ALWAYS
)
2733 json_object_boolean_true_add(
2735 "nssaTranslatorAlways");
2737 json_object_boolean_true_add(json_area
, "abr");
2738 if (area
->NSSATranslatorRole
2739 == OSPF_NSSA_ROLE_CANDIDATE
)
2740 json_object_boolean_false_add(
2742 "nssaTranslatorElected");
2744 json_object_boolean_true_add(
2746 "nssaTranslatorNever");
2750 " It is an NSSA configuration. \n Elected NSSA/ABR performs type-7/type-5 LSA translation. \n");
2751 if (!IS_OSPF_ABR(area
->ospf
))
2753 " It is not ABR, therefore not Translator. \n");
2754 else if (area
->NSSATranslatorState
) {
2755 vty_out(vty
, " We are an ABR and ");
2756 if (area
->NSSATranslatorRole
2757 == OSPF_NSSA_ROLE_CANDIDATE
)
2759 "the NSSA Elected Translator. \n");
2760 else if (area
->NSSATranslatorRole
2761 == OSPF_NSSA_ROLE_ALWAYS
)
2763 "always an NSSA Translator. \n");
2765 vty_out(vty
, " We are an ABR, but ");
2766 if (area
->NSSATranslatorRole
2767 == OSPF_NSSA_ROLE_CANDIDATE
)
2769 "not the NSSA Elected Translator. \n");
2772 "never an NSSA Translator. \n");
2777 /* Stub-router state for this area */
2778 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2779 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2782 json_object_boolean_true_add(
2783 json_area
, "originStubMaxDistRouterLsa");
2784 if (CHECK_FLAG(area
->stub_router_state
,
2785 OSPF_AREA_ADMIN_STUB_ROUTED
))
2786 json_object_boolean_true_add(
2787 json_area
, "indefiniteActiveAdmin");
2788 if (area
->t_stub_router
) {
2792 &area
->t_stub_router
->u
.sands
,
2795 json_object_int_add(
2797 "activeStartupRemainderMsecs",
2802 " Originating stub / maximum-distance Router-LSA\n");
2803 if (CHECK_FLAG(area
->stub_router_state
,
2804 OSPF_AREA_ADMIN_STUB_ROUTED
))
2806 " Administratively activated (indefinitely)\n");
2807 if (area
->t_stub_router
)
2809 " Active from startup, %s remaining\n",
2810 ospf_timer_dump(area
->t_stub_router
,
2817 /* Show number of fully adjacent neighbors. */
2818 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2821 /* Show authentication type. */
2822 if (area
->auth_type
== OSPF_AUTH_NULL
)
2823 json_object_string_add(json_area
, "authentication",
2824 "authenticationNone");
2825 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2826 json_object_string_add(json_area
, "authentication",
2827 "authenticationSimplePassword");
2828 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2829 json_object_string_add(json_area
, "authentication",
2830 "authenticationMessageDigest");
2832 if (!OSPF_IS_AREA_BACKBONE(area
))
2833 json_object_int_add(json_area
,
2834 "virtualAdjacenciesPassingCounter",
2837 /* Show SPF calculation times. */
2838 json_object_int_add(json_area
, "spfExecutedCounter",
2839 area
->spf_calculation
);
2840 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2841 json_object_int_add(
2842 json_area
, "lsaRouterNumber",
2843 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2844 json_object_int_add(
2845 json_area
, "lsaRouterChecksum",
2846 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2847 json_object_int_add(
2848 json_area
, "lsaNetworkNumber",
2849 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2850 json_object_int_add(
2851 json_area
, "lsaNetworkChecksum",
2852 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2853 json_object_int_add(
2854 json_area
, "lsaSummaryNumber",
2855 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2856 json_object_int_add(
2857 json_area
, "lsaSummaryChecksum",
2858 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2859 json_object_int_add(
2860 json_area
, "lsaAsbrNumber",
2861 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2862 json_object_int_add(
2863 json_area
, "lsaAsbrChecksum",
2864 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2865 json_object_int_add(
2866 json_area
, "lsaNssaNumber",
2867 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2868 json_object_int_add(
2869 json_area
, "lsaNssaChecksum",
2870 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2872 /* Show number of fully adjacent neighbors. */
2874 " Number of fully adjacent neighbors in this area:"
2878 /* Show authentication type. */
2879 vty_out(vty
, " Area has ");
2880 if (area
->auth_type
== OSPF_AUTH_NULL
)
2881 vty_out(vty
, "no authentication\n");
2882 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2883 vty_out(vty
, "simple password authentication\n");
2884 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2885 vty_out(vty
, "message digest authentication\n");
2887 if (!OSPF_IS_AREA_BACKBONE(area
))
2889 " Number of full virtual adjacencies going through"
2893 /* Show SPF calculation times. */
2894 vty_out(vty
, " SPF algorithm executed %d times\n",
2895 area
->spf_calculation
);
2897 /* Show number of LSA. */
2898 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
2900 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
2901 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
2902 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2904 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
2905 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
2906 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2908 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
2909 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
2910 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2912 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
2913 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
2914 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2915 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
2916 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
2917 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2921 json_object_int_add(
2922 json_area
, "lsaOpaqueLinkNumber",
2923 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2924 json_object_int_add(
2925 json_area
, "lsaOpaqueLinkChecksum",
2926 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2927 json_object_int_add(
2928 json_area
, "lsaOpaqueAreaNumber",
2929 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2930 json_object_int_add(
2931 json_area
, "lsaOpaqueAreaChecksum",
2932 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2935 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
2936 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
2937 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2939 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
2940 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
2941 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2945 json_object_object_add(json_areas
, inet_ntoa(area
->area_id
),
2951 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
2952 json_object
*json
, uint8_t use_vrf
)
2954 struct listnode
*node
, *nnode
;
2955 struct ospf_area
*area
;
2956 struct timeval result
;
2957 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2958 json_object
*json_vrf
= NULL
;
2959 json_object
*json_areas
= NULL
;
2963 json_vrf
= json_object_new_object();
2966 json_areas
= json_object_new_object();
2969 if (ospf
->instance
) {
2971 json_object_int_add(json
, "ospfInstance",
2974 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
2978 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
2980 /* Show Router ID. */
2982 json_object_string_add(json_vrf
, "routerId",
2983 inet_ntoa(ospf
->router_id
));
2985 vty_out(vty
, " OSPF Routing Process, Router ID: %s\n",
2986 inet_ntoa(ospf
->router_id
));
2989 /* Graceful shutdown */
2990 if (ospf
->t_deferred_shutdown
) {
2995 &ospf
->t_deferred_shutdown
->u
.sands
,
2998 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
3002 " Deferred shutdown in progress, %s remaining\n",
3003 ospf_timer_dump(ospf
->t_deferred_shutdown
,
3004 timebuf
, sizeof(timebuf
)));
3008 /* Show capability. */
3010 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
3011 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
3012 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
3013 json_object_boolean_true_add(json_vrf
,
3014 "rfc1583Compatibility");
3017 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3018 vty_out(vty
, " This implementation conforms to RFC2328\n");
3019 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3020 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3026 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3027 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3030 vty_out(vty
, " OpaqueCapability flag is %s\n",
3031 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3036 /* Show stub-router configuration */
3037 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3038 || ospf
->stub_router_shutdown_time
3039 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3041 json_object_boolean_true_add(json_vrf
,
3042 "stubAdvertisement");
3043 if (ospf
->stub_router_startup_time
3044 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3045 json_object_int_add(
3046 json_vrf
, "postStartEnabledSecs",
3047 ospf
->stub_router_startup_time
);
3048 if (ospf
->stub_router_shutdown_time
3049 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3050 json_object_int_add(
3051 json_vrf
, "preShutdownEnabledSecs",
3052 ospf
->stub_router_shutdown_time
);
3055 " Stub router advertisement is configured\n");
3056 if (ospf
->stub_router_startup_time
3057 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3059 " Enabled for %us after start-up\n",
3060 ospf
->stub_router_startup_time
);
3061 if (ospf
->stub_router_shutdown_time
3062 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3064 " Enabled for %us prior to full shutdown\n",
3065 ospf
->stub_router_shutdown_time
);
3069 /* Show SPF timers. */
3071 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3073 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3074 ospf
->spf_holdtime
);
3075 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3076 ospf
->spf_max_holdtime
);
3077 json_object_int_add(json_vrf
, "holdtimeMultplier",
3078 ospf
->spf_hold_multiplier
);
3081 " Initial SPF scheduling delay %d millisec(s)\n"
3082 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3083 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3084 " Hold time multiplier is currently %d\n",
3085 ospf
->spf_delay
, ospf
->spf_holdtime
,
3086 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3090 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3091 long time_store
= 0;
3094 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3095 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3098 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3099 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3100 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3103 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3105 vty_out(vty
, " SPF algorithm ");
3106 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3107 monotime_since(&ospf
->ts_spf
, &result
);
3108 vty_out(vty
, "last executed %s ago\n",
3109 ospf_timeval_dump(&result
, timebuf
,
3111 vty_out(vty
, " Last SPF duration %s\n",
3112 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3113 timebuf
, sizeof(timebuf
)));
3115 vty_out(vty
, "has not been run\n");
3119 if (ospf
->t_spf_calc
) {
3122 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3124 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3128 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3129 ospf
->min_ls_interval
);
3130 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3131 ospf
->min_ls_arrival
);
3132 /* Show write multiplier values */
3133 json_object_int_add(json_vrf
, "writeMultiplier",
3134 ospf
->write_oi_count
);
3135 /* Show refresh parameters. */
3136 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3137 ospf
->lsa_refresh_interval
* 1000);
3139 vty_out(vty
, " SPF timer %s%s\n",
3140 (ospf
->t_spf_calc
? "due in " : "is "),
3141 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3144 vty_out(vty
, " LSA minimum interval %d msecs\n",
3145 ospf
->min_ls_interval
);
3146 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3147 ospf
->min_ls_arrival
);
3149 /* Show write multiplier values */
3150 vty_out(vty
, " Write Multiplier set to %d \n",
3151 ospf
->write_oi_count
);
3153 /* Show refresh parameters. */
3154 vty_out(vty
, " Refresh timer %d secs\n",
3155 ospf
->lsa_refresh_interval
);
3158 /* Show ABR/ASBR flags. */
3159 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3161 json_object_string_add(
3162 json_vrf
, "abrType",
3163 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3166 " This router is an ABR, ABR type is: %s\n",
3167 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3169 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3171 json_object_string_add(
3172 json_vrf
, "asbrRouter",
3173 "injectingExternalRoutingInformation");
3176 " This router is an ASBR "
3177 "(injecting external routing information)\n");
3180 /* Show Number of AS-external-LSAs. */
3182 json_object_int_add(
3183 json_vrf
, "lsaExternalCounter",
3184 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3185 json_object_int_add(
3186 json_vrf
, "lsaExternalChecksum",
3187 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3190 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3191 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3192 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3196 json_object_int_add(
3197 json_vrf
, "lsaAsopaqueCounter",
3198 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3199 json_object_int_add(
3200 json_vrf
, "lsaAsOpaqueChecksum",
3201 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3204 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3205 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3206 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3209 /* Show number of areas attached. */
3211 json_object_int_add(json_vrf
, "attachedAreaCounter",
3212 listcount(ospf
->areas
));
3214 vty_out(vty
, " Number of areas attached to this router: %d\n",
3215 listcount(ospf
->areas
));
3217 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3218 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3220 json_object_boolean_true_add(
3221 json_vrf
, "adjacencyChangesLoggedAll");
3224 " All adjacency changes are logged\n");
3227 json_object_boolean_true_add(
3228 json_vrf
, "adjacencyChangesLogged");
3230 vty_out(vty
, " Adjacency changes are logged\n");
3233 /* Show each area status. */
3234 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3235 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3239 json_object_object_add(json_vrf
, "areas", json_areas
);
3240 if (ospf
->vrf_id
== VRF_DEFAULT
)
3241 json_object_object_add(json
, "default",
3244 json_object_object_add(json
, ospf
->name
,
3247 json_object_object_add(json
, "areas", json_areas
);
3255 DEFUN (show_ip_ospf
,
3257 "show ip ospf [vrf <NAME|all>] [json]",
3260 "OSPF information\n"
3266 bool uj
= use_json(argc
, argv
);
3267 struct listnode
*node
= NULL
;
3268 char *vrf_name
= NULL
;
3269 bool all_vrf
= false;
3270 int ret
= CMD_SUCCESS
;
3273 json_object
*json
= NULL
;
3274 uint8_t use_vrf
= 0;
3276 if (listcount(om
->ospf
) == 0)
3279 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3282 json
= json_object_new_object();
3284 /* vrf input is provided could be all or specific vrf*/
3286 bool ospf_output
= false;
3291 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3292 if (!ospf
->oi_running
)
3295 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3299 vty_out(vty
, "%s\n",
3300 json_object_to_json_string_ext(
3301 json
, JSON_C_TO_STRING_PRETTY
));
3302 json_object_free(json
);
3303 } else if (!ospf_output
)
3304 vty_out(vty
, "%% OSPF instance not found\n");
3307 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3308 if ((ospf
== NULL
) || !ospf
->oi_running
) {
3310 vty_out(vty
, "%s\n",
3311 json_object_to_json_string_ext(
3312 json
, JSON_C_TO_STRING_PRETTY
));
3313 json_object_free(json
);
3315 vty_out(vty
, "%% OSPF instance not found\n");
3320 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3321 /* Display default ospf (instance 0) info */
3322 if (ospf
== NULL
|| !ospf
->oi_running
) {
3324 vty_out(vty
, "%s\n",
3325 json_object_to_json_string_ext(
3326 json
, JSON_C_TO_STRING_PRETTY
));
3327 json_object_free(json
);
3329 vty_out(vty
, "%% OSPF instance not found\n");
3336 show_ip_ospf_common(vty
, ospf
, json
, use_vrf
);
3338 vty_out(vty
, "%s\n",
3339 json_object_to_json_string_ext(
3340 json
, JSON_C_TO_STRING_PRETTY
));
3344 json_object_free(json
);
3349 DEFUN (show_ip_ospf_instance
,
3350 show_ip_ospf_instance_cmd
,
3351 "show ip ospf (1-65535) [json]",
3354 "OSPF information\n"
3360 unsigned short instance
= 0;
3361 bool uj
= use_json(argc
, argv
);
3362 int ret
= CMD_SUCCESS
;
3363 json_object
*json
= NULL
;
3365 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3366 ospf
= ospf_lookup_instance(instance
);
3368 return CMD_NOT_MY_INSTANCE
;
3370 if (!ospf
->oi_running
)
3374 json
= json_object_new_object();
3376 ret
= show_ip_ospf_common(vty
, ospf
, json
, 0);
3379 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
3380 json
, JSON_C_TO_STRING_PRETTY
));
3381 json_object_free(json
);
3387 static void show_ip_ospf_interface_sub(struct vty
*vty
, struct ospf
*ospf
,
3388 struct interface
*ifp
,
3389 json_object
*json_interface_sub
,
3393 struct ospf_neighbor
*nbr
;
3394 struct route_node
*rn
;
3395 uint32_t bandwidth
= ifp
->bandwidth
? ifp
->bandwidth
: ifp
->speed
;
3397 /* Is interface up? */
3399 is_up
= if_is_operative(ifp
);
3401 json_object_boolean_true_add(json_interface_sub
,
3404 json_object_boolean_false_add(json_interface_sub
,
3407 json_object_int_add(json_interface_sub
, "ifIndex",
3409 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3410 json_object_int_add(json_interface_sub
, "bandwidthMbit",
3412 json_object_string_add(json_interface_sub
, "ifFlags",
3413 if_flag_dump(ifp
->flags
));
3415 vty_out(vty
, "%s is %s\n", ifp
->name
,
3416 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"));
3417 vty_out(vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3418 ifp
->ifindex
, ifp
->mtu
, bandwidth
,
3419 if_flag_dump(ifp
->flags
));
3422 /* Is interface OSPF enabled? */
3424 if (ospf_oi_count(ifp
) == 0) {
3425 json_object_boolean_false_add(json_interface_sub
,
3428 } else if (!is_up
) {
3429 json_object_boolean_false_add(json_interface_sub
,
3433 json_object_boolean_true_add(json_interface_sub
,
3436 if (ospf_oi_count(ifp
) == 0) {
3437 vty_out(vty
, " OSPF not enabled on this interface\n");
3439 } else if (!is_up
) {
3441 " OSPF is enabled, but not running on this interface\n");
3446 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
3447 struct ospf_interface
*oi
= rn
->info
;
3452 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)) {
3454 json_object_boolean_true_add(json_interface_sub
,
3457 vty_out(vty
, " This interface is UNNUMBERED,");
3459 struct in_addr dest
;
3462 /* Show OSPF interface information. */
3464 json_object_string_add(
3465 json_interface_sub
, "ipAddress",
3466 inet_ntoa(oi
->address
->u
.prefix4
));
3467 json_object_int_add(json_interface_sub
,
3468 "ipAddressPrefixlen",
3469 oi
->address
->prefixlen
);
3471 vty_out(vty
, " Internet Address %s/%d,",
3472 inet_ntoa(oi
->address
->u
.prefix4
),
3473 oi
->address
->prefixlen
);
3475 /* For Vlinks, showing the peer address is
3476 * probably more informative than the local
3477 * interface that is being used */
3478 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
) {
3480 dest
= oi
->vl_data
->peer_addr
;
3481 } else if (CONNECTED_PEER(oi
->connected
)
3482 && oi
->connected
->destination
) {
3484 dest
= oi
->connected
->destination
->u
.prefix4
;
3487 dest
.s_addr
= ipv4_broadcast_addr(
3488 oi
->connected
->address
->u
.prefix4
.s_addr
,
3489 oi
->connected
->address
->prefixlen
);
3493 json_object_string_add(
3495 "ospfIfType", dstr
);
3496 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3497 json_object_string_add(
3502 json_object_string_add(
3507 vty_out(vty
, " %s %s,", dstr
,
3511 json_object_string_add(json_interface_sub
, "area",
3512 ospf_area_desc_string(oi
->area
));
3513 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3514 json_object_boolean_true_add(
3516 "mtuMismatchDetect");
3517 json_object_string_add(json_interface_sub
, "routerId",
3518 inet_ntoa(ospf
->router_id
));
3519 json_object_string_add(json_interface_sub
,
3521 ospf_network_type_str
[oi
->type
]);
3522 json_object_int_add(json_interface_sub
, "cost",
3524 json_object_int_add(
3525 json_interface_sub
, "transmitDelaySecs",
3526 OSPF_IF_PARAM(oi
, transmit_delay
));
3527 json_object_string_add(json_interface_sub
, "state",
3528 lookup_msg(ospf_ism_state_msg
,
3530 json_object_int_add(json_interface_sub
, "priority",
3533 vty_out(vty
, " Area %s\n",
3534 ospf_area_desc_string(oi
->area
));
3536 vty_out(vty
, " MTU mismatch detection: %s\n",
3537 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled"
3541 " Router ID %s, Network Type %s, Cost: %d\n",
3542 inet_ntoa(ospf
->router_id
),
3543 ospf_network_type_str
[oi
->type
],
3547 " Transmit Delay is %d sec, State %s, Priority %d\n",
3548 OSPF_IF_PARAM(oi
, transmit_delay
),
3549 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
3553 /* Show DR information. */
3554 if (DR(oi
).s_addr
== INADDR_ANY
) {
3557 " No backup designated router on this network\n");
3559 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &BDR(oi
));
3563 " No backup designated router on this network\n");
3566 json_object_string_add(
3567 json_interface_sub
, "bdrId",
3568 inet_ntoa(nbr
->router_id
));
3569 json_object_string_add(
3572 inet_ntoa(nbr
->address
.u
3576 " Backup Designated Router (ID) %s,",
3577 inet_ntoa(nbr
->router_id
));
3578 vty_out(vty
, " Interface Address %s\n",
3579 inet_ntoa(nbr
->address
.u
3585 /* Next network-LSA sequence number we'll use, if we're elected
3588 && ntohl(oi
->params
->network_lsa_seqnum
)
3589 != OSPF_INITIAL_SEQUENCE_NUMBER
) {
3591 json_object_int_add(
3593 "networkLsaSequence",
3594 ntohl(oi
->params
->network_lsa_seqnum
));
3597 " Saved Network-LSA sequence number 0x%x\n",
3598 ntohl(oi
->params
->network_lsa_seqnum
));
3602 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3603 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3604 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3605 json_object_boolean_true_add(
3607 "mcastMemberOspfAllRouters");
3608 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3609 json_object_boolean_true_add(
3611 "mcastMemberOspfDesignatedRouters");
3614 vty_out(vty
, " Multicast group memberships:");
3615 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3616 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3617 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3618 vty_out(vty
, " OSPFAllRouters");
3619 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3620 vty_out(vty
, " OSPFDesignatedRouters");
3622 vty_out(vty
, " <None>");
3627 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3628 json_object_int_add(
3629 json_interface_sub
, "timerMsecs",
3630 OSPF_IF_PARAM(oi
, v_hello
) * 1000);
3632 json_object_int_add(
3633 json_interface_sub
, "timerMsecs",
3634 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3635 json_object_int_add(json_interface_sub
,
3637 OSPF_IF_PARAM(oi
, v_wait
));
3638 json_object_int_add(json_interface_sub
,
3640 OSPF_IF_PARAM(oi
, v_wait
));
3641 json_object_int_add(
3642 json_interface_sub
, "timerRetransmitSecs",
3643 OSPF_IF_PARAM(oi
, retransmit_interval
));
3645 vty_out(vty
, " Timer intervals configured,");
3646 vty_out(vty
, " Hello ");
3647 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3648 vty_out(vty
, "%ds,",
3649 OSPF_IF_PARAM(oi
, v_hello
));
3651 vty_out(vty
, "%dms,",
3652 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3653 vty_out(vty
, " Dead %ds, Wait %ds, Retransmit %d\n",
3654 OSPF_IF_PARAM(oi
, v_wait
),
3655 OSPF_IF_PARAM(oi
, v_wait
),
3656 OSPF_IF_PARAM(oi
, retransmit_interval
));
3659 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_ACTIVE
) {
3660 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3662 long time_store
= 0;
3666 &oi
->t_hello
->u
.sands
,
3669 json_object_int_add(json_interface_sub
,
3670 "timerHelloInMsecs",
3673 vty_out(vty
, " Hello due in %s\n",
3674 ospf_timer_dump(oi
->t_hello
, timebuf
,
3676 } else /* passive-interface is set */
3679 json_object_boolean_true_add(
3681 "timerPassiveIface");
3684 " No Hellos (Passive interface)\n");
3688 json_object_int_add(json_interface_sub
, "nbrCount",
3689 ospf_nbr_count(oi
, 0));
3690 json_object_int_add(json_interface_sub
,
3692 ospf_nbr_count(oi
, NSM_Full
));
3695 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3696 ospf_nbr_count(oi
, 0),
3697 ospf_nbr_count(oi
, NSM_Full
));
3698 ospf_bfd_interface_show(vty
, ifp
, json_interface_sub
, use_json
);
3702 static int show_ip_ospf_interface_common(struct vty
*vty
, struct ospf
*ospf
,
3703 char *intf_name
, uint8_t use_vrf
,
3704 json_object
*json
, bool use_json
)
3706 struct interface
*ifp
;
3707 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3708 json_object
*json_vrf
= NULL
;
3709 json_object
*json_interface_sub
= NULL
, *json_interface
= NULL
;
3713 json_vrf
= json_object_new_object();
3716 json_interface
= json_object_new_object();
3719 if (ospf
->instance
) {
3721 json_object_int_add(json
, "ospfInstance",
3724 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3727 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3729 if (intf_name
== NULL
) {
3730 /* Show All Interfaces.*/
3731 FOR_ALL_INTERFACES (vrf
, ifp
) {
3732 if (ospf_oi_count(ifp
)) {
3734 json_interface_sub
=
3735 json_object_new_object();
3737 show_ip_ospf_interface_sub(vty
, ospf
, ifp
,
3742 json_object_object_add(
3743 json_interface
, ifp
->name
,
3744 json_interface_sub
);
3749 json_object_object_add(json_vrf
, "interfaces",
3752 /* Interface name is specified. */
3753 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3756 json_object_boolean_true_add(json_vrf
,
3759 vty_out(vty
, "No such interface name\n");
3762 json_interface_sub
= json_object_new_object();
3763 json_interface
= json_object_new_object();
3766 show_ip_ospf_interface_sub(
3767 vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3770 json_object_object_add(json_interface
,
3772 json_interface_sub
);
3773 json_object_object_add(json_vrf
, "interfaces",
3781 if (ospf
->vrf_id
== VRF_DEFAULT
)
3782 json_object_object_add(json
, "default",
3785 json_object_object_add(json
, ospf
->name
,
3794 static void show_ip_ospf_interface_traffic_sub(struct vty
*vty
,
3795 struct ospf_interface
*oi
,
3796 json_object
*json_interface_sub
,
3800 json_object_int_add(json_interface_sub
, "ifIndex",
3802 json_object_int_add(json_interface_sub
, "helloIn",
3804 json_object_int_add(json_interface_sub
, "helloOut",
3806 json_object_int_add(json_interface_sub
, "dbDescIn",
3808 json_object_int_add(json_interface_sub
, "dbDescOut",
3810 json_object_int_add(json_interface_sub
, "lsReqIn",
3812 json_object_int_add(json_interface_sub
, "lsReqOut",
3814 json_object_int_add(json_interface_sub
, "lsUpdIn",
3816 json_object_int_add(json_interface_sub
, "lsUpdOut",
3818 json_object_int_add(json_interface_sub
, "lsAckIn",
3820 json_object_int_add(json_interface_sub
, "lsAckOut",
3824 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
3825 oi
->ifp
->name
, oi
->hello_in
, oi
->hello_out
,
3826 oi
->db_desc_in
, oi
->db_desc_out
, oi
->ls_req_in
,
3827 oi
->ls_req_out
, oi
->ls_upd_in
, oi
->ls_upd_out
,
3828 oi
->ls_ack_in
, oi
->ls_ack_out
);
3832 /* OSPFv2 Packet Counters */
3833 static int show_ip_ospf_interface_traffic_common(
3834 struct vty
*vty
, struct ospf
*ospf
, char *intf_name
, json_object
*json
,
3835 int display_once
, uint8_t use_vrf
, bool use_json
)
3837 struct vrf
*vrf
= NULL
;
3838 struct interface
*ifp
= NULL
;
3839 json_object
*json_vrf
= NULL
;
3840 json_object
*json_interface_sub
= NULL
;
3842 if (!use_json
&& !display_once
) {
3844 vty_out(vty
, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface",
3845 " HELLO", " DB-Desc", " LS-Req", " LS-Update",
3847 vty_out(vty
, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
3848 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
3851 "--------------------------------------------------------------------------------------------\n");
3852 } else if (use_json
) {
3854 json_vrf
= json_object_new_object();
3859 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3861 if (intf_name
== NULL
) {
3862 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3863 FOR_ALL_INTERFACES (vrf
, ifp
) {
3864 struct route_node
*rn
;
3865 struct ospf_interface
*oi
;
3867 if (ospf_oi_count(ifp
) == 0)
3870 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3871 rn
= route_next(rn
)) {
3878 json_interface_sub
=
3879 json_object_new_object();
3882 show_ip_ospf_interface_traffic_sub(
3883 vty
, oi
, json_interface_sub
, use_json
);
3885 json_object_object_add(
3886 json_vrf
, ifp
->name
,
3887 json_interface_sub
);
3892 /* Interface name is specified. */
3893 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3895 struct route_node
*rn
;
3896 struct ospf_interface
*oi
;
3898 if (ospf_oi_count(ifp
) == 0) {
3900 " OSPF not enabled on this interface %s\n",
3905 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3906 rn
= route_next(rn
)) {
3910 json_interface_sub
=
3911 json_object_new_object();
3914 show_ip_ospf_interface_traffic_sub(
3915 vty
, oi
, json_interface_sub
, use_json
);
3917 json_object_object_add(
3918 json_vrf
, ifp
->name
,
3919 json_interface_sub
);
3927 if (ospf
->vrf_id
== VRF_DEFAULT
)
3928 json_object_object_add(json
, "default",
3931 json_object_object_add(json
, ospf
->name
,
3940 DEFUN (show_ip_ospf_interface
,
3941 show_ip_ospf_interface_cmd
,
3942 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
3945 "OSPF information\n"
3948 "Interface information\n"
3953 bool uj
= use_json(argc
, argv
);
3954 struct listnode
*node
= NULL
;
3955 char *vrf_name
= NULL
, *intf_name
= NULL
;
3956 bool all_vrf
= false;
3957 int ret
= CMD_SUCCESS
;
3959 int idx_vrf
= 0, idx_intf
= 0;
3960 uint8_t use_vrf
= 0;
3961 json_object
*json
= NULL
;
3963 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3965 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
3966 intf_name
= argv
[idx_intf
]->arg
;
3969 json
= json_object_new_object();
3971 /* vrf input is provided could be all or specific vrf*/
3975 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3976 if (!ospf
->oi_running
)
3978 ret
= show_ip_ospf_interface_common(
3979 vty
, ospf
, intf_name
, use_vrf
, json
,
3984 vty_out(vty
, "%s\n",
3985 json_object_to_json_string_ext(
3986 json
, JSON_C_TO_STRING_PRETTY
));
3987 json_object_free(json
);
3989 vty_out(vty
, "%% OSPF instance not found\n");
3993 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3994 if (ospf
== NULL
|| !ospf
->oi_running
) {
3996 vty_out(vty
, "%s\n",
3997 json_object_to_json_string_ext(
3998 json
, JSON_C_TO_STRING_PRETTY
));
3999 json_object_free(json
);
4001 vty_out(vty
, "%% OSPF instance not found\n");
4005 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4009 /* Display default ospf (instance 0) info */
4010 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4011 if (ospf
== NULL
|| !ospf
->oi_running
) {
4013 vty_out(vty
, "%s\n",
4014 json_object_to_json_string_ext(
4015 json
, JSON_C_TO_STRING_PRETTY
));
4016 json_object_free(json
);
4018 vty_out(vty
, "%% OSPF instance not found\n");
4022 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4027 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4028 json
, JSON_C_TO_STRING_PRETTY
));
4029 json_object_free(json
);
4035 DEFUN (show_ip_ospf_instance_interface
,
4036 show_ip_ospf_instance_interface_cmd
,
4037 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4040 "OSPF information\n"
4042 "Interface information\n"
4049 unsigned short instance
= 0;
4050 bool uj
= use_json(argc
, argv
);
4051 char *intf_name
= NULL
;
4052 int ret
= CMD_SUCCESS
;
4053 json_object
*json
= NULL
;
4055 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4056 ospf
= ospf_lookup_instance(instance
);
4058 return CMD_NOT_MY_INSTANCE
;
4060 if (!ospf
->oi_running
)
4064 json
= json_object_new_object();
4066 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4067 intf_name
= argv
[idx_intf
]->arg
;
4069 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4072 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4073 json
, JSON_C_TO_STRING_PRETTY
));
4074 json_object_free(json
);
4080 DEFUN (show_ip_ospf_interface_traffic
,
4081 show_ip_ospf_interface_traffic_cmd
,
4082 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4085 "OSPF information\n"
4088 "Interface information\n"
4089 "Protocol Packet counters\n"
4093 struct ospf
*ospf
= NULL
;
4094 struct listnode
*node
= NULL
;
4095 char *vrf_name
= NULL
, *intf_name
= NULL
;
4096 bool all_vrf
= false;
4098 int idx_vrf
= 0, idx_intf
= 0;
4099 bool uj
= use_json(argc
, argv
);
4100 json_object
*json
= NULL
;
4101 int ret
= CMD_SUCCESS
;
4102 int display_once
= 0;
4103 uint8_t use_vrf
= 0;
4105 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4107 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4108 intf_name
= argv
[idx_intf
]->arg
;
4111 json
= json_object_new_object();
4116 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4117 if (!ospf
->oi_running
)
4120 ret
= show_ip_ospf_interface_traffic_common(
4121 vty
, ospf
, intf_name
, json
,
4122 display_once
, use_vrf
, uj
);
4127 vty_out(vty
, "%s\n",
4128 json_object_to_json_string_ext(
4129 json
, JSON_C_TO_STRING_PRETTY
));
4130 json_object_free(json
);
4135 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4136 if (ospf
== NULL
|| !ospf
->oi_running
) {
4138 json_object_free(json
);
4142 ret
= show_ip_ospf_interface_traffic_common(
4143 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4145 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4146 if (ospf
== NULL
|| !ospf
->oi_running
) {
4148 json_object_free(json
);
4152 ret
= show_ip_ospf_interface_traffic_common(
4153 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4157 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4158 json
, JSON_C_TO_STRING_PRETTY
));
4159 json_object_free(json
);
4166 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4168 vty_out(vty
, "\n%-15s %3s %-15s %9s %-15s %-32s %5s %5s %5s\n",
4169 "Neighbor ID", "Pri", "State", "Dead Time", "Address",
4170 "Interface", "RXmtL", "RqstL", "DBsmL");
4173 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4174 struct ospf_interface
*oi
,
4175 json_object
*json
, bool use_json
)
4177 struct route_node
*rn
;
4178 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
4180 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4181 json_object
*json_neighbor
= NULL
, *json_neigh_array
= NULL
;
4183 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4184 if ((nbr
= rn
->info
)) {
4185 /* Do not show myself. */
4186 if (nbr
== oi
->nbr_self
)
4188 /* Down state is not shown. */
4189 if (nbr
->state
== NSM_Down
)
4192 char neigh_str
[INET_ADDRSTRLEN
];
4195 && !IPV4_ADDR_SAME(&prev_nbr
->src
,
4197 /* Start new neigh list */
4198 json_neigh_array
= NULL
;
4201 if (nbr
->state
== NSM_Attempt
4202 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4203 strlcpy(neigh_str
, "neighbor",
4207 inet_ntoa(nbr
->router_id
),
4210 json_object_object_get_ex(json
, neigh_str
,
4213 if (!json_neigh_array
) {
4215 json_object_new_array();
4216 json_object_object_add(
4221 json_neighbor
= json_object_new_object();
4223 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4229 &nbr
->t_inactivity
->u
.sands
,
4233 json_object_int_add(json_neighbor
, "priority",
4235 json_object_string_add(json_neighbor
, "state",
4237 json_object_int_add(json_neighbor
,
4240 json_object_string_add(json_neighbor
, "address",
4241 inet_ntoa(nbr
->src
));
4242 json_object_string_add(json_neighbor
,
4245 json_object_int_add(
4246 json_neighbor
, "retransmitCounter",
4247 ospf_ls_retransmit_count(nbr
));
4248 json_object_int_add(json_neighbor
,
4250 ospf_ls_request_count(nbr
));
4251 json_object_int_add(json_neighbor
,
4253 ospf_db_summary_count(nbr
));
4255 json_object_array_add(json_neigh_array
,
4258 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4260 if (nbr
->state
== NSM_Attempt
4261 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4262 vty_out(vty
, "%-15s %3d %-15s ", "-",
4263 nbr
->priority
, msgbuf
);
4265 vty_out(vty
, "%-15s %3d %-15s ",
4266 inet_ntoa(nbr
->router_id
),
4267 nbr
->priority
, msgbuf
);
4269 vty_out(vty
, "%9s ",
4270 ospf_timer_dump(nbr
->t_inactivity
,
4273 vty_out(vty
, "%-15s ", inet_ntoa(nbr
->src
));
4274 vty_out(vty
, "%-32s %5ld %5ld %5d\n",
4276 ospf_ls_retransmit_count(nbr
),
4277 ospf_ls_request_count(nbr
),
4278 ospf_db_summary_count(nbr
));
4285 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4286 json_object
*json
, bool use_json
,
4289 struct ospf_interface
*oi
;
4290 struct listnode
*node
;
4291 json_object
*json_vrf
= NULL
;
4292 json_object
*json_nbr_sub
= NULL
;
4296 json_vrf
= json_object_new_object();
4299 json_nbr_sub
= json_object_new_object();
4302 if (ospf
->instance
) {
4304 json_object_int_add(json
, "ospfInstance",
4307 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4310 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4312 show_ip_ospf_neighbour_header(vty
);
4314 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4315 if (ospf_interface_neighbor_count(oi
) == 0)
4317 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4321 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4323 if (ospf
->vrf_id
== VRF_DEFAULT
)
4324 json_object_object_add(json
, "default",
4327 json_object_object_add(json
, ospf
->name
,
4336 DEFUN (show_ip_ospf_neighbor
,
4337 show_ip_ospf_neighbor_cmd
,
4338 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4341 "OSPF information\n"
4348 bool uj
= use_json(argc
, argv
);
4349 struct listnode
*node
= NULL
;
4350 char *vrf_name
= NULL
;
4351 bool all_vrf
= false;
4352 int ret
= CMD_SUCCESS
;
4355 uint8_t use_vrf
= 0;
4356 json_object
*json
= NULL
;
4358 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4361 json
= json_object_new_object();
4363 /* vrf input is provided could be all or specific vrf*/
4367 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4368 if (!ospf
->oi_running
)
4370 ret
= show_ip_ospf_neighbor_common(
4371 vty
, ospf
, json
, uj
, use_vrf
);
4375 vty_out(vty
, "%s\n",
4376 json_object_to_json_string_ext(
4377 json
, JSON_C_TO_STRING_PRETTY
));
4378 json_object_free(json
);
4380 vty_out(vty
, "OSPF instance not found\n");
4385 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4386 if (ospf
== NULL
|| !ospf
->oi_running
) {
4388 vty_out(vty
, "%s\n",
4389 json_object_to_json_string_ext(
4390 json
, JSON_C_TO_STRING_PRETTY
));
4391 json_object_free(json
);
4393 vty_out(vty
, "%% OSPF instance not found\n");
4398 /* Display default ospf (instance 0) info */
4399 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4400 if (ospf
== NULL
|| !ospf
->oi_running
) {
4402 vty_out(vty
, "%s\n",
4403 json_object_to_json_string_ext(
4404 json
, JSON_C_TO_STRING_PRETTY
));
4405 json_object_free(json
);
4407 vty_out(vty
, "%% OSPF instance not found\n");
4414 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4418 vty_out(vty
, "%s\n",
4419 json_object_to_json_string_ext(
4420 json
, JSON_C_TO_STRING_PRETTY
));
4425 json_object_free(json
);
4431 DEFUN (show_ip_ospf_instance_neighbor
,
4432 show_ip_ospf_instance_neighbor_cmd
,
4433 "show ip ospf (1-65535) neighbor [json]",
4436 "OSPF information\n"
4443 unsigned short instance
= 0;
4444 bool uj
= use_json(argc
, argv
);
4445 json_object
*json
= NULL
;
4446 int ret
= CMD_SUCCESS
;
4448 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4449 ospf
= ospf_lookup_instance(instance
);
4451 return CMD_NOT_MY_INSTANCE
;
4453 if (!ospf
->oi_running
)
4457 json
= json_object_new_object();
4459 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4462 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4463 json
, JSON_C_TO_STRING_PRETTY
));
4464 json_object_free(json
);
4470 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4471 json_object
*json
, bool use_json
,
4474 struct listnode
*node
;
4475 struct ospf_interface
*oi
;
4476 json_object
*json_vrf
= NULL
;
4477 json_object
*json_neighbor_sub
= NULL
;
4481 json_vrf
= json_object_new_object();
4484 json_neighbor_sub
= json_object_new_object();
4487 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4489 show_ip_ospf_neighbour_header(vty
);
4491 if (ospf
->instance
) {
4493 json_object_int_add(json_vrf
, "ospfInstance",
4496 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4499 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4500 struct listnode
*nbr_node
;
4501 struct ospf_nbr_nbma
*nbr_nbma
;
4503 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4505 /* print Down neighbor status */
4506 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4507 if (nbr_nbma
->nbr
== NULL
4508 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4510 json_object_int_add(json_neighbor_sub
,
4512 nbr_nbma
->priority
);
4513 json_object_boolean_true_add(
4516 json_object_string_add(
4520 json_object_int_add(
4522 "nbrNbmaRetransmitCounter", 0);
4523 json_object_int_add(
4525 "nbrNbmaRequestCounter", 0);
4526 json_object_int_add(
4528 "nbrNbmaDbSummaryCounter", 0);
4529 json_object_object_add(
4531 inet_ntoa(nbr_nbma
->addr
),
4534 vty_out(vty
, "%-15s %3d %-15s %9s ",
4535 "-", nbr_nbma
->priority
, "Down",
4538 "%-32s %-20s %5d %5d %5d\n",
4539 inet_ntoa(nbr_nbma
->addr
),
4540 IF_NAME(oi
), 0, 0, 0);
4548 if (ospf
->vrf_id
== VRF_DEFAULT
)
4549 json_object_object_add(json
, "default",
4552 json_object_object_add(json
, ospf
->name
,
4561 DEFUN (show_ip_ospf_neighbor_all
,
4562 show_ip_ospf_neighbor_all_cmd
,
4563 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4566 "OSPF information\n"
4570 "include down status neighbor\n"
4574 bool uj
= use_json(argc
, argv
);
4575 struct listnode
*node
= NULL
;
4576 char *vrf_name
= NULL
;
4577 bool all_vrf
= false;
4578 int ret
= CMD_SUCCESS
;
4581 uint8_t use_vrf
= 0;
4582 json_object
*json
= NULL
;
4584 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4587 json
= json_object_new_object();
4589 /* vrf input is provided could be all or specific vrf*/
4593 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4594 if (!ospf
->oi_running
)
4596 ret
= show_ip_ospf_neighbor_all_common(
4597 vty
, ospf
, json
, uj
, use_vrf
);
4601 vty_out(vty
, "%s\n",
4602 json_object_to_json_string_ext(
4603 json
, JSON_C_TO_STRING_PRETTY
));
4604 json_object_free(json
);
4610 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4611 if (ospf
== NULL
|| !ospf
->oi_running
) {
4613 json_object_free(json
);
4617 /* Display default ospf (instance 0) info */
4618 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4619 if (ospf
== NULL
|| !ospf
->oi_running
) {
4621 json_object_free(json
);
4627 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4630 vty_out(vty
, "%s\n",
4631 json_object_to_json_string_ext(
4632 json
, JSON_C_TO_STRING_PRETTY
));
4637 json_object_free(json
);
4642 DEFUN (show_ip_ospf_instance_neighbor_all
,
4643 show_ip_ospf_instance_neighbor_all_cmd
,
4644 "show ip ospf (1-65535) neighbor all [json]",
4647 "OSPF information\n"
4650 "include down status neighbor\n"
4655 unsigned short instance
= 0;
4656 bool uj
= use_json(argc
, argv
);
4657 json_object
*json
= NULL
;
4658 int ret
= CMD_SUCCESS
;
4660 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4661 ospf
= ospf_lookup_instance(instance
);
4663 return CMD_NOT_MY_INSTANCE
;
4665 if (!ospf
->oi_running
)
4668 json
= json_object_new_object();
4670 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4673 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4674 json
, JSON_C_TO_STRING_PRETTY
));
4675 json_object_free(json
);
4681 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4683 struct cmd_token
**argv
,
4684 bool use_json
, uint8_t use_vrf
)
4686 struct interface
*ifp
;
4687 struct route_node
*rn
;
4688 json_object
*json
= NULL
;
4691 json
= json_object_new_object();
4693 if (ospf
->instance
) {
4695 json_object_int_add(json
, "ospfInstance",
4698 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4701 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4703 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4706 json_object_boolean_true_add(json
, "noSuchIface");
4708 vty_out(vty
, "No such interface.\n");
4712 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4713 struct ospf_interface
*oi
= rn
->info
;
4718 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4722 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4723 json
, JSON_C_TO_STRING_PRETTY
));
4724 json_object_free(json
);
4731 DEFUN (show_ip_ospf_neighbor_int
,
4732 show_ip_ospf_neighbor_int_cmd
,
4733 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4736 "OSPF information\n"
4745 bool uj
= use_json(argc
, argv
);
4746 int ret
= CMD_SUCCESS
;
4747 struct interface
*ifp
= NULL
;
4748 char *vrf_name
= NULL
;
4749 vrf_id_t vrf_id
= VRF_DEFAULT
;
4750 struct vrf
*vrf
= NULL
;
4752 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4753 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4754 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4757 vrf
= vrf_lookup_by_name(vrf_name
);
4759 vrf_id
= vrf
->vrf_id
;
4761 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4763 if (!ospf
|| !ospf
->oi_running
)
4767 show_ip_ospf_neighbour_header(vty
);
4769 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4771 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4775 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4780 DEFUN (show_ip_ospf_instance_neighbor_int
,
4781 show_ip_ospf_instance_neighbor_int_cmd
,
4782 "show ip ospf (1-65535) neighbor IFNAME [json]",
4785 "OSPF information\n"
4794 unsigned short instance
= 0;
4795 bool uj
= use_json(argc
, argv
);
4798 show_ip_ospf_neighbour_header(vty
);
4800 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4801 ospf
= ospf_lookup_instance(instance
);
4803 return CMD_NOT_MY_INSTANCE
;
4805 if (!ospf
->oi_running
)
4809 show_ip_ospf_neighbour_header(vty
);
4811 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
4815 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
4816 struct ospf_interface
*oi
,
4817 struct ospf_nbr_nbma
*nbr_nbma
,
4818 bool use_json
, json_object
*json
)
4820 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4821 json_object
*json_sub
= NULL
;
4824 json_sub
= json_object_new_object();
4825 else /* Show neighbor ID. */
4826 vty_out(vty
, " Neighbor %s,", "-");
4828 /* Show interface address. */
4830 json_object_string_add(json_sub
, "ifaceAddress",
4831 inet_ntoa(nbr_nbma
->addr
));
4833 vty_out(vty
, " interface address %s\n",
4834 inet_ntoa(nbr_nbma
->addr
));
4838 json_object_string_add(json_sub
, "areaId",
4839 ospf_area_desc_string(oi
->area
));
4840 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
4842 vty_out(vty
, " In the area %s via interface %s\n",
4843 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
4845 /* Show neighbor priority and state. */
4847 json_object_int_add(json_sub
, "nbrPriority",
4848 nbr_nbma
->priority
);
4849 json_object_string_add(json_sub
, "nbrState", "down");
4851 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4852 nbr_nbma
->priority
, "Down");
4854 /* Show state changes. */
4856 json_object_int_add(json_sub
, "stateChangeCounter",
4857 nbr_nbma
->state_change
);
4859 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
4861 /* Show PollInterval */
4863 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
4865 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
4867 /* Show poll-interval timer. */
4868 if (nbr_nbma
->t_poll
) {
4871 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
4873 json_object_int_add(json_sub
,
4874 "pollIntervalTimerDueMsec",
4877 vty_out(vty
, " Poll timer due in %s\n",
4878 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
4882 /* Show poll-interval timer thread. */
4884 if (nbr_nbma
->t_poll
!= NULL
)
4885 json_object_string_add(json_sub
,
4886 "pollIntervalTimerThread", "on");
4888 vty_out(vty
, " Thread Poll Timer %s\n",
4889 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
4892 json_object_object_add(json
, "noNbrId", json_sub
);
4895 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
4896 struct ospf_interface
*oi
,
4897 struct ospf_neighbor
*nbr
,
4898 struct ospf_neighbor
*prev_nbr
,
4899 json_object
*json
, bool use_json
)
4901 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4902 json_object
*json_neigh
= NULL
, *json_neigh_array
= NULL
;
4903 char neigh_str
[INET_ADDRSTRLEN
] = {0};
4907 !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
4908 json_neigh_array
= NULL
;
4911 if (nbr
->state
== NSM_Attempt
4912 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4913 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
4915 strlcpy(neigh_str
, inet_ntoa(nbr
->router_id
),
4918 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
4920 if (!json_neigh_array
) {
4921 json_neigh_array
= json_object_new_array();
4922 json_object_object_add(json
, neigh_str
,
4926 json_neigh
= json_object_new_object();
4929 /* Show neighbor ID. */
4930 if (nbr
->state
== NSM_Attempt
4931 && nbr
->router_id
.s_addr
== INADDR_ANY
)
4932 vty_out(vty
, " Neighbor %s,", "-");
4934 vty_out(vty
, " Neighbor %s,",
4935 inet_ntoa(nbr
->router_id
));
4938 /* Show interface address. */
4940 json_object_string_add(json_neigh
, "ifaceAddress",
4941 inet_ntoa(nbr
->address
.u
.prefix4
));
4943 vty_out(vty
, " interface address %s\n",
4944 inet_ntoa(nbr
->address
.u
.prefix4
));
4948 json_object_string_add(json_neigh
, "areaId",
4949 ospf_area_desc_string(oi
->area
));
4950 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
4952 vty_out(vty
, " In the area %s via interface %s\n",
4953 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
4955 /* Show neighbor priority and state. */
4957 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
4958 json_object_string_add(
4959 json_neigh
, "nbrState",
4960 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4962 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4964 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4966 /* Show state changes. */
4968 json_object_int_add(json_neigh
, "stateChangeCounter",
4971 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
4973 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
4978 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4980 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
4984 " Most recent state change statistics:\n");
4985 vty_out(vty
, " Progressive change %s ago\n",
4986 ospf_timeval_dump(&res
, timebuf
,
4991 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
4996 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4998 json_object_int_add(json_neigh
,
4999 "lastRegressiveChangeMsec",
5001 if (nbr
->last_regress_str
)
5002 json_object_string_add(
5004 "lastRegressiveChangeReason",
5005 nbr
->last_regress_str
);
5008 " Regressive change %s ago, due to %s\n",
5009 ospf_timeval_dump(&res
, timebuf
,
5011 (nbr
->last_regress_str
? nbr
->last_regress_str
5016 /* Show Designated Rotuer ID. */
5018 json_object_string_add(json_neigh
, "routerDesignatedId",
5019 inet_ntoa(nbr
->d_router
));
5021 vty_out(vty
, " DR is %s,", inet_ntoa(nbr
->d_router
));
5023 /* Show Backup Designated Rotuer ID. */
5025 json_object_string_add(json_neigh
, "routerDesignatedBackupId",
5026 inet_ntoa(nbr
->bd_router
));
5028 vty_out(vty
, " BDR is %s\n", inet_ntoa(nbr
->bd_router
));
5032 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5033 json_object_string_add(json_neigh
, "optionsList",
5034 ospf_options_dump(nbr
->options
));
5036 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5037 ospf_options_dump(nbr
->options
));
5039 /* Show Router Dead interval timer. */
5041 if (nbr
->t_inactivity
) {
5043 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5046 json_object_int_add(json_neigh
,
5047 "routerDeadIntervalTimerDueMsec",
5050 json_object_int_add(
5052 "routerDeadIntervalTimerDueMsec", -1);
5054 vty_out(vty
, " Dead timer due in %s\n",
5055 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5058 /* Show Database Summary list. */
5060 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5061 ospf_db_summary_count(nbr
));
5063 vty_out(vty
, " Database Summary List %d\n",
5064 ospf_db_summary_count(nbr
));
5066 /* Show Link State Request list. */
5068 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5069 ospf_ls_request_count(nbr
));
5071 vty_out(vty
, " Link State Request List %ld\n",
5072 ospf_ls_request_count(nbr
));
5074 /* Show Link State Retransmission list. */
5076 json_object_int_add(json_neigh
,
5077 "linkStateRetransmissionListCounter",
5078 ospf_ls_retransmit_count(nbr
));
5080 vty_out(vty
, " Link State Retransmission List %ld\n",
5081 ospf_ls_retransmit_count(nbr
));
5083 /* Show inactivity timer thread. */
5085 if (nbr
->t_inactivity
!= NULL
)
5086 json_object_string_add(json_neigh
,
5087 "threadInactivityTimer", "on");
5089 vty_out(vty
, " Thread Inactivity Timer %s\n",
5090 nbr
->t_inactivity
!= NULL
? "on" : "off");
5092 /* Show Database Description retransmission thread. */
5094 if (nbr
->t_db_desc
!= NULL
)
5095 json_object_string_add(
5097 "threadDatabaseDescriptionRetransmission",
5101 " Thread Database Description Retransmision %s\n",
5102 nbr
->t_db_desc
!= NULL
? "on" : "off");
5104 /* Show Link State Request Retransmission thread. */
5106 if (nbr
->t_ls_req
!= NULL
)
5107 json_object_string_add(
5109 "threadLinkStateRequestRetransmission", "on");
5112 " Thread Link State Request Retransmission %s\n",
5113 nbr
->t_ls_req
!= NULL
? "on" : "off");
5115 /* Show Link State Update Retransmission thread. */
5117 if (nbr
->t_ls_upd
!= NULL
)
5118 json_object_string_add(
5120 "threadLinkStateUpdateRetransmission",
5124 " Thread Link State Update Retransmission %s\n\n",
5125 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5127 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json_neigh
, use_json
, 0);
5130 json_object_array_add(json_neigh_array
, json_neigh
);
5134 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5135 struct in_addr
*router_id
,
5136 bool use_json
, uint8_t use_vrf
)
5138 struct listnode
*node
;
5139 struct ospf_neighbor
*nbr
;
5140 struct ospf_interface
*oi
;
5141 json_object
*json
= NULL
;
5144 json
= json_object_new_object();
5146 if (ospf
->instance
) {
5148 json_object_int_add(json
, "ospfInstance",
5151 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5154 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5156 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5157 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
))) {
5158 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5164 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5165 json
, JSON_C_TO_STRING_PRETTY
));
5166 json_object_free(json
);
5173 DEFPY (show_ip_ospf_neighbor_id
,
5174 show_ip_ospf_neighbor_id_cmd
,
5175 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
5178 "OSPF information\n"
5184 struct listnode
*node
;
5185 int ret
= CMD_SUCCESS
;
5187 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5188 if (!ospf
->oi_running
)
5190 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5197 DEFPY (show_ip_ospf_instance_neighbor_id
,
5198 show_ip_ospf_instance_neighbor_id_cmd
,
5199 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
5202 "OSPF information\n"
5210 ospf
= ospf_lookup_instance(instance
);
5212 return CMD_NOT_MY_INSTANCE
;
5214 if (!ospf
->oi_running
)
5217 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
,
5221 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5223 json_object
*json
, bool use_json
,
5226 struct ospf_interface
*oi
;
5227 struct listnode
*node
;
5228 json_object
*json_vrf
= NULL
;
5229 json_object
*json_nbr_sub
= NULL
;
5233 json_vrf
= json_object_new_object();
5237 json_nbr_sub
= json_object_new_object();
5240 if (ospf
->instance
) {
5242 json_object_int_add(json
, "ospfInstance",
5245 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5248 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5250 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5251 struct route_node
*rn
;
5252 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5254 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5255 if ((nbr
= rn
->info
)) {
5256 if (nbr
!= oi
->nbr_self
) {
5257 if (nbr
->state
!= NSM_Down
) {
5258 show_ip_ospf_neighbor_detail_sub(
5259 vty
, oi
, nbr
, prev_nbr
,
5260 json_nbr_sub
, use_json
);
5269 json_object_object_add(json_vrf
, "neighbors",
5272 if (ospf
->vrf_id
== VRF_DEFAULT
)
5273 json_object_object_add(json
, "default",
5276 json_object_object_add(json
, ospf
->name
,
5285 DEFUN (show_ip_ospf_neighbor_detail
,
5286 show_ip_ospf_neighbor_detail_cmd
,
5287 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5290 "OSPF information\n"
5294 "detail of all neighbors\n"
5298 bool uj
= use_json(argc
, argv
);
5299 struct listnode
*node
= NULL
;
5300 char *vrf_name
= NULL
;
5301 bool all_vrf
= false;
5302 int ret
= CMD_SUCCESS
;
5305 uint8_t use_vrf
= 0;
5306 json_object
*json
= NULL
;
5308 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5311 json
= json_object_new_object();
5313 /* vrf input is provided could be all or specific vrf*/
5317 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5318 if (!ospf
->oi_running
)
5320 ret
= show_ip_ospf_neighbor_detail_common(
5321 vty
, ospf
, json
, uj
, use_vrf
);
5324 vty_out(vty
, "%s\n",
5325 json_object_to_json_string_ext(
5326 json
, JSON_C_TO_STRING_PRETTY
));
5327 json_object_free(json
);
5332 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5333 if (ospf
== NULL
|| !ospf
->oi_running
) {
5335 json_object_free(json
);
5339 /* Display default ospf (instance 0) info */
5340 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5341 if (ospf
== NULL
|| !ospf
->oi_running
) {
5343 json_object_free(json
);
5349 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5352 vty_out(vty
, "%s\n",
5353 json_object_to_json_string_ext(
5354 json
, JSON_C_TO_STRING_PRETTY
));
5359 json_object_free(json
);
5364 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5365 show_ip_ospf_instance_neighbor_detail_cmd
,
5366 "show ip ospf (1-65535) neighbor detail [json]",
5369 "OSPF information\n"
5372 "detail of all neighbors\n"
5377 unsigned short instance
= 0;
5378 bool uj
= use_json(argc
, argv
);
5379 json_object
*json
= NULL
;
5380 int ret
= CMD_SUCCESS
;
5382 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5383 ospf
= ospf_lookup_instance(instance
);
5385 return CMD_NOT_MY_INSTANCE
;
5387 if (!ospf
->oi_running
)
5391 json
= json_object_new_object();
5393 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5396 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5397 json
, JSON_C_TO_STRING_PRETTY
));
5398 json_object_free(json
);
5404 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5410 struct listnode
*node
;
5411 struct ospf_interface
*oi
;
5412 json_object
*json_vrf
= NULL
;
5416 json_vrf
= json_object_new_object();
5421 if (ospf
->instance
) {
5423 json_object_int_add(json
, "ospfInstance",
5426 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5429 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5431 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5432 struct route_node
*rn
;
5433 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5434 struct ospf_nbr_nbma
*nbr_nbma
;
5436 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5437 if ((nbr
= rn
->info
)) {
5438 if (nbr
!= oi
->nbr_self
)
5439 if (nbr
->state
!= NSM_Down
)
5440 show_ip_ospf_neighbor_detail_sub(
5443 json_vrf
, use_json
);
5448 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5449 struct listnode
*nd
;
5451 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5452 if (nbr_nbma
->nbr
== NULL
5453 || nbr_nbma
->nbr
->state
== NSM_Down
)
5454 show_ip_ospf_nbr_nbma_detail_sub(
5455 vty
, oi
, nbr_nbma
, use_json
,
5463 if (ospf
->vrf_id
== VRF_DEFAULT
)
5464 json_object_object_add(json
, "default",
5467 json_object_object_add(json
, ospf
->name
,
5477 DEFUN (show_ip_ospf_neighbor_detail_all
,
5478 show_ip_ospf_neighbor_detail_all_cmd
,
5479 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5482 "OSPF information\n"
5486 "detail of all neighbors\n"
5487 "include down status neighbor\n"
5491 bool uj
= use_json(argc
, argv
);
5492 struct listnode
*node
= NULL
;
5493 char *vrf_name
= NULL
;
5494 bool all_vrf
= false;
5495 int ret
= CMD_SUCCESS
;
5498 uint8_t use_vrf
= 0;
5499 json_object
*json
= NULL
;
5501 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5504 json
= json_object_new_object();
5506 /* vrf input is provided could be all or specific vrf*/
5510 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5511 if (!ospf
->oi_running
)
5513 ret
= show_ip_ospf_neighbor_detail_all_common(
5514 vty
, ospf
, json
, uj
, use_vrf
);
5518 vty_out(vty
, "%s\n",
5519 json_object_to_json_string_ext(
5520 json
, JSON_C_TO_STRING_PRETTY
));
5521 json_object_free(json
);
5526 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5527 if (ospf
== NULL
|| !ospf
->oi_running
) {
5529 json_object_free(json
);
5533 /* Display default ospf (instance 0) info */
5534 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5535 if (ospf
== NULL
|| !ospf
->oi_running
) {
5537 json_object_free(json
);
5543 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5546 vty_out(vty
, "%s\n",
5547 json_object_to_json_string_ext(
5548 json
, JSON_C_TO_STRING_PRETTY
));
5553 json_object_free(json
);
5558 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5559 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5560 "show ip ospf (1-65535) neighbor detail all [json]",
5563 "OSPF information\n"
5566 "detail of all neighbors\n"
5567 "include down status neighbor\n"
5572 unsigned short instance
= 0;
5573 bool uj
= use_json(argc
, argv
);
5574 json_object
*json
= NULL
;
5575 int ret
= CMD_SUCCESS
;
5577 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5578 ospf
= ospf_lookup_instance(instance
);
5580 return CMD_NOT_MY_INSTANCE
;
5582 if (!ospf
->oi_running
)
5586 json
= json_object_new_object();
5588 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5591 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5592 json
, JSON_C_TO_STRING_PRETTY
));
5593 json_object_free(json
);
5599 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5602 struct cmd_token
**argv
,
5605 struct ospf_interface
*oi
;
5606 struct interface
*ifp
;
5607 struct route_node
*rn
, *nrn
;
5608 struct ospf_neighbor
*nbr
;
5609 json_object
*json
= NULL
;
5612 json
= json_object_new_object();
5614 if (ospf
->instance
) {
5616 json_object_int_add(json
, "ospfInstance",
5619 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5622 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5625 vty_out(vty
, "No such interface.\n");
5627 vty_out(vty
, "{}\n");
5628 json_object_free(json
);
5633 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5634 if ((oi
= rn
->info
)) {
5635 for (nrn
= route_top(oi
->nbrs
); nrn
;
5636 nrn
= route_next(nrn
)) {
5637 if ((nbr
= nrn
->info
)) {
5638 if (nbr
!= oi
->nbr_self
) {
5639 if (nbr
->state
!= NSM_Down
)
5640 show_ip_ospf_neighbor_detail_sub(
5651 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5652 json
, JSON_C_TO_STRING_PRETTY
));
5653 json_object_free(json
);
5660 DEFUN (show_ip_ospf_neighbor_int_detail
,
5661 show_ip_ospf_neighbor_int_detail_cmd
,
5662 "show ip ospf neighbor IFNAME detail [json]",
5665 "OSPF information\n"
5668 "detail of all neighbors\n"
5672 bool uj
= use_json(argc
, argv
);
5673 struct listnode
*node
= NULL
;
5674 int ret
= CMD_SUCCESS
;
5675 bool ospf_output
= false;
5677 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5678 if (!ospf
->oi_running
)
5681 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5686 vty_out(vty
, "%% OSPF instance not found\n");
5691 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5692 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5693 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5696 "OSPF information\n"
5700 "detail of all neighbors\n"
5706 unsigned short instance
= 0;
5707 bool uj
= use_json(argc
, argv
);
5709 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5710 ospf
= ospf_lookup_instance(instance
);
5712 return CMD_NOT_MY_INSTANCE
;
5714 if (!ospf
->oi_running
)
5717 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5721 /* Show functions */
5722 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
5724 struct router_lsa
*rl
;
5725 struct summary_lsa
*sl
;
5726 struct as_external_lsa
*asel
;
5727 struct prefix_ipv4 p
;
5730 /* If self option is set, check LSA self flag. */
5731 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5732 /* LSA common part show. */
5733 vty_out(vty
, "%-15s ", inet_ntoa(lsa
->data
->id
));
5734 vty_out(vty
, "%-15s %4d 0x%08lx 0x%04x",
5735 inet_ntoa(lsa
->data
->adv_router
), LS_AGE(lsa
),
5736 (unsigned long)ntohl(lsa
->data
->ls_seqnum
),
5737 ntohs(lsa
->data
->checksum
));
5738 /* LSA specific part show. */
5739 switch (lsa
->data
->type
) {
5740 case OSPF_ROUTER_LSA
:
5741 rl
= (struct router_lsa
*)lsa
->data
;
5742 vty_out(vty
, " %-d", ntohs(rl
->links
));
5744 case OSPF_SUMMARY_LSA
:
5745 sl
= (struct summary_lsa
*)lsa
->data
;
5748 p
.prefix
= sl
->header
.id
;
5749 p
.prefixlen
= ip_masklen(sl
->mask
);
5750 apply_mask_ipv4(&p
);
5752 vty_out(vty
, " %s/%d", inet_ntoa(p
.prefix
),
5755 case OSPF_AS_EXTERNAL_LSA
:
5756 case OSPF_AS_NSSA_LSA
:
5757 asel
= (struct as_external_lsa
*)lsa
->data
;
5760 p
.prefix
= asel
->header
.id
;
5761 p
.prefixlen
= ip_masklen(asel
->mask
);
5762 apply_mask_ipv4(&p
);
5764 vty_out(vty
, " %s %s/%d [0x%lx]",
5765 IS_EXTERNAL_METRIC(asel
->e
[0].tos
)
5768 inet_ntoa(p
.prefix
), p
.prefixlen
,
5769 (unsigned long)ntohl(
5770 asel
->e
[0].route_tag
));
5772 case OSPF_NETWORK_LSA
:
5773 case OSPF_ASBR_SUMMARY_LSA
:
5774 case OSPF_OPAQUE_LINK_LSA
:
5775 case OSPF_OPAQUE_AREA_LSA
:
5776 case OSPF_OPAQUE_AS_LSA
:
5786 static const char *const show_database_desc
[] = {
5788 "Router Link States",
5790 "Summary Link States",
5791 "ASBR-Summary Link States",
5792 "AS External Link States",
5793 "Group Membership LSA",
5794 "NSSA-external Link States",
5796 "Link-Local Opaque-LSA",
5797 "Area-Local Opaque-LSA",
5798 "AS-external Opaque-LSA",
5801 static const char *const show_database_header
[] = {
5803 "Link ID ADV Router Age Seq# CkSum Link count",
5804 "Link ID ADV Router Age Seq# CkSum",
5805 "Link ID ADV Router Age Seq# CkSum Route",
5806 "Link ID ADV Router Age Seq# CkSum",
5807 "Link ID ADV Router Age Seq# CkSum Route",
5808 " --- header for Group Member ----",
5809 "Link ID ADV Router Age Seq# CkSum Route",
5811 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5812 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5813 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5816 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
)
5818 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
5820 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
5821 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
5822 ospf_options_dump(lsa
->data
->options
));
5823 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
5824 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)"
5827 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
5828 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
5831 vty_out(vty
, " :%s%s%s%s",
5832 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR" : "",
5833 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR" : "",
5834 IS_ROUTER_LSA_VIRTUAL(rlsa
) ? " VL-endpoint"
5836 IS_ROUTER_LSA_SHORTCUT(rlsa
) ? " Shortcut"
5841 vty_out(vty
, " LS Type: %s\n",
5842 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
5843 vty_out(vty
, " Link State ID: %s %s\n", inet_ntoa(lsa
->data
->id
),
5844 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
, NULL
));
5845 vty_out(vty
, " Advertising Router: %s\n",
5846 inet_ntoa(lsa
->data
->adv_router
));
5847 vty_out(vty
, " LS Seq Number: %08lx\n",
5848 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
5849 vty_out(vty
, " Checksum: 0x%04x\n", ntohs(lsa
->data
->checksum
));
5850 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
5853 static const char *const link_type_desc
[] = {
5855 "another Router (point-to-point)",
5856 "a Transit Network",
5861 static const char *const link_id_desc
[] = {
5862 "(null)", "Neighboring Router ID", "Designated Router address",
5863 "Net", "Neighboring Router ID",
5866 static const char *const link_data_desc
[] = {
5867 "(null)", "Router Interface address", "Router Interface address",
5868 "Network Mask", "Router Interface address",
5871 /* Show router-LSA each Link information. */
5872 static void show_ip_ospf_database_router_links(struct vty
*vty
,
5873 struct router_lsa
*rl
)
5878 len
= ntohs(rl
->header
.length
) - 4;
5879 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
5880 type
= rl
->link
[i
].type
;
5882 vty_out(vty
, " Link connected to: %s\n",
5883 link_type_desc
[type
]);
5884 vty_out(vty
, " (Link ID) %s: %s\n", link_id_desc
[type
],
5885 inet_ntoa(rl
->link
[i
].link_id
));
5886 vty_out(vty
, " (Link Data) %s: %s\n", link_data_desc
[type
],
5887 inet_ntoa(rl
->link
[i
].link_data
));
5888 vty_out(vty
, " Number of TOS metrics: 0\n");
5889 vty_out(vty
, " TOS 0 Metric: %d\n",
5890 ntohs(rl
->link
[i
].metric
));
5895 /* Show router-LSA detail information. */
5896 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5899 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
5901 show_ip_ospf_database_header(vty
, lsa
);
5903 vty_out(vty
, " Number of Links: %d\n\n", ntohs(rl
->links
));
5905 show_ip_ospf_database_router_links(vty
, rl
);
5912 /* Show network-LSA detail information. */
5913 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5918 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
5920 show_ip_ospf_database_header(vty
, lsa
);
5922 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(nl
->mask
));
5924 length
= ntohs(lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
5926 for (i
= 0; length
> 0; i
++, length
-= 4)
5927 vty_out(vty
, " Attached Router: %s\n",
5928 inet_ntoa(nl
->routers
[i
]));
5936 /* Show summary-LSA detail information. */
5937 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5940 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5942 show_ip_ospf_database_header(vty
, lsa
);
5944 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5945 vty_out(vty
, " TOS: 0 Metric: %d\n",
5946 GET_METRIC(sl
->metric
));
5953 /* Show summary-ASBR-LSA detail information. */
5954 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5957 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5959 show_ip_ospf_database_header(vty
, lsa
);
5961 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5962 vty_out(vty
, " TOS: 0 Metric: %d\n",
5963 GET_METRIC(sl
->metric
));
5970 /* Show AS-external-LSA detail information. */
5971 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5974 struct as_external_lsa
*al
=
5975 (struct as_external_lsa
*)lsa
->data
;
5977 show_ip_ospf_database_header(vty
, lsa
);
5979 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5980 vty_out(vty
, " Metric Type: %s\n",
5981 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5982 ? "2 (Larger than any link state path)"
5984 vty_out(vty
, " TOS: 0\n");
5985 vty_out(vty
, " Metric: %d\n",
5986 GET_METRIC(al
->e
[0].metric
));
5987 vty_out(vty
, " Forward Address: %s\n",
5988 inet_ntoa(al
->e
[0].fwd_addr
));
5991 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5992 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5999 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
6001 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
6003 /* show_ip_ospf_database_header (vty, lsa); */
6005 zlog_debug( " Network Mask: /%d%s",
6006 ip_masklen (al
->mask
), "\n");
6007 zlog_debug( " Metric Type: %s%s",
6008 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
6009 "2 (Larger than any link state path)" : "1", "\n");
6010 zlog_debug( " TOS: 0%s", "\n");
6011 zlog_debug( " Metric: %d%s",
6012 GET_METRIC (al
->e
[0].metric
), "\n");
6013 zlog_debug( " Forward Address: %s%s",
6014 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
6016 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
6017 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
6022 /* Show AS-NSSA-LSA detail information. */
6023 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6026 struct as_external_lsa
*al
=
6027 (struct as_external_lsa
*)lsa
->data
;
6029 show_ip_ospf_database_header(vty
, lsa
);
6031 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
6032 vty_out(vty
, " Metric Type: %s\n",
6033 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6034 ? "2 (Larger than any link state path)"
6036 vty_out(vty
, " TOS: 0\n");
6037 vty_out(vty
, " Metric: %d\n",
6038 GET_METRIC(al
->e
[0].metric
));
6039 vty_out(vty
, " NSSA: Forward Address: %s\n",
6040 inet_ntoa(al
->e
[0].fwd_addr
));
6043 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6044 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6050 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
)
6055 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6058 show_ip_ospf_database_header(vty
, lsa
);
6059 show_opaque_info_detail(vty
, lsa
);
6066 int (*const show_function
[])(struct vty
*, struct ospf_lsa
*) = {
6068 show_router_lsa_detail
,
6069 show_network_lsa_detail
,
6070 show_summary_lsa_detail
,
6071 show_summary_asbr_lsa_detail
,
6072 show_as_external_lsa_detail
,
6074 show_as_nssa_lsa_detail
, /* almost same as external */
6076 show_opaque_lsa_detail
,
6077 show_opaque_lsa_detail
,
6078 show_opaque_lsa_detail
,
6081 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6082 struct in_addr
*id
, struct in_addr
*adv_router
)
6084 memset(lp
, 0, sizeof(struct prefix_ls
));
6088 else if (adv_router
== NULL
) {
6094 lp
->adv_router
= *adv_router
;
6098 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6099 struct in_addr
*id
, struct in_addr
*adv_router
)
6101 struct prefix_ls lp
;
6102 struct route_node
*rn
, *start
;
6103 struct ospf_lsa
*lsa
;
6105 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6106 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6108 route_lock_node(start
);
6109 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6110 if ((lsa
= rn
->info
)) {
6111 if (show_function
[lsa
->data
->type
] != NULL
)
6112 show_function
[lsa
->data
->type
](vty
,
6115 route_unlock_node(start
);
6119 /* Show detail LSA information
6120 -- if id is NULL then show all LSAs. */
6121 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6122 struct in_addr
*id
, struct in_addr
*adv_router
)
6124 struct listnode
*node
;
6125 struct ospf_area
*area
;
6128 case OSPF_AS_EXTERNAL_LSA
:
6129 case OSPF_OPAQUE_AS_LSA
:
6130 vty_out(vty
, " %s \n\n",
6131 show_database_desc
[type
]);
6132 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
);
6135 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6136 vty_out(vty
, "\n %s (Area %s)\n\n",
6137 show_database_desc
[type
],
6138 ospf_area_desc_string(area
));
6139 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6146 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6147 struct route_table
*rt
,
6148 struct in_addr
*adv_router
)
6150 struct route_node
*rn
;
6151 struct ospf_lsa
*lsa
;
6153 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6154 if ((lsa
= rn
->info
))
6155 if (IPV4_ADDR_SAME(adv_router
,
6156 &lsa
->data
->adv_router
)) {
6157 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6159 if (show_function
[lsa
->data
->type
] != NULL
)
6160 show_function
[lsa
->data
->type
](vty
,
6165 /* Show detail LSA information. */
6166 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6167 int type
, struct in_addr
*adv_router
)
6169 struct listnode
*node
;
6170 struct ospf_area
*area
;
6173 case OSPF_AS_EXTERNAL_LSA
:
6174 case OSPF_OPAQUE_AS_LSA
:
6175 vty_out(vty
, " %s \n\n",
6176 show_database_desc
[type
]);
6177 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6181 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6182 vty_out(vty
, "\n %s (Area %s)\n\n",
6183 show_database_desc
[type
],
6184 ospf_area_desc_string(area
));
6185 show_lsa_detail_adv_router_proc(
6186 vty
, AREA_LSDB(area
, type
), adv_router
);
6192 static void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
,
6195 struct ospf_lsa
*lsa
;
6196 struct route_node
*rn
;
6197 struct ospf_area
*area
;
6198 struct listnode
*node
;
6201 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6202 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6204 case OSPF_AS_EXTERNAL_LSA
:
6205 case OSPF_OPAQUE_AS_LSA
:
6210 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6212 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6213 vty_out(vty
, " %s (Area %s)\n\n",
6214 show_database_desc
[type
],
6215 ospf_area_desc_string(area
));
6216 vty_out(vty
, "%s\n",
6217 show_database_header
[type
]);
6219 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
)
6220 show_lsa_summary(vty
, lsa
, self
);
6227 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6229 case OSPF_AS_EXTERNAL_LSA
:
6230 case OSPF_OPAQUE_AS_LSA
:
6235 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6236 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6237 vty_out(vty
, " %s\n\n",
6238 show_database_desc
[type
]);
6239 vty_out(vty
, "%s\n", show_database_header
[type
]);
6241 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
)
6242 show_lsa_summary(vty
, lsa
, self
);
6251 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
)
6253 struct route_node
*rn
;
6255 vty_out(vty
, "\n MaxAge Link States:\n\n");
6257 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6258 struct ospf_lsa
*lsa
;
6260 if ((lsa
= rn
->info
) != NULL
) {
6261 vty_out(vty
, "Link type: %d\n", lsa
->data
->type
);
6262 vty_out(vty
, "Link State ID: %s\n",
6263 inet_ntoa(lsa
->data
->id
));
6264 vty_out(vty
, "Advertising Router: %s\n",
6265 inet_ntoa(lsa
->data
->adv_router
));
6266 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6272 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6273 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6275 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6276 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6277 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6278 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6280 #define OSPF_LSA_TYPES_DESC \
6281 "ASBR summary link states\n" \
6282 "External link states\n" \
6283 "Network link states\n" \
6284 "Router link states\n" \
6285 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6286 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6287 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6289 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6290 int arg_base
, int argc
,
6291 struct cmd_token
**argv
,
6296 struct in_addr id
, adv_router
;
6299 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6301 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6303 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6304 inet_ntoa(ospf
->router_id
));
6307 if (argc
== arg_base
+ 4) {
6308 show_ip_ospf_database_summary(vty
, ospf
, 0);
6312 /* Set database type to show. */
6313 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6314 type
= OSPF_ROUTER_LSA
;
6315 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6316 type
= OSPF_NETWORK_LSA
;
6317 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6318 type
= OSPF_AS_NSSA_LSA
;
6319 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
6320 type
= OSPF_SUMMARY_LSA
;
6321 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6322 type
= OSPF_ASBR_SUMMARY_LSA
;
6323 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6324 type
= OSPF_AS_EXTERNAL_LSA
;
6325 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
6326 show_ip_ospf_database_summary(vty
, ospf
, 1);
6328 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
6329 show_ip_ospf_database_maxage(vty
, ospf
);
6331 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6332 type
= OSPF_OPAQUE_LINK_LSA
;
6333 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6334 type
= OSPF_OPAQUE_AREA_LSA
;
6335 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6336 type
= OSPF_OPAQUE_AS_LSA
;
6340 /* `show ip ospf database LSA'. */
6341 if (argc
== arg_base
+ 5)
6342 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
);
6343 else if (argc
>= arg_base
+ 6) {
6344 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
6348 /* `show ip ospf database LSA ID'. */
6349 if (argc
== arg_base
+ 6)
6350 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
);
6351 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6352 else if (argc
== arg_base
+ 7) {
6353 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
6354 adv_router
= ospf
->router_id
;
6356 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
6361 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
);
6368 DEFUN (show_ip_ospf_database_max
,
6369 show_ip_ospf_database_max_cmd
,
6370 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
6373 "OSPF information\n"
6376 "Database summary\n"
6377 "LSAs in MaxAge list\n"
6378 "Self-originated link states\n")
6380 struct ospf
*ospf
= NULL
;
6381 struct listnode
*node
= NULL
;
6382 char *vrf_name
= NULL
;
6383 bool all_vrf
= false;
6384 int ret
= CMD_SUCCESS
;
6387 uint8_t use_vrf
= 0;
6389 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6392 bool ospf_output
= false;
6397 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6398 if (!ospf
->oi_running
)
6401 ret
= show_ip_ospf_database_common(
6402 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6407 vty_out(vty
, "%% OSPF instance not found\n");
6409 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6410 if (ospf
== NULL
|| !ospf
->oi_running
) {
6411 vty_out(vty
, "%% OSPF instance not found\n");
6414 ret
= (show_ip_ospf_database_common(
6415 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6419 /* Display default ospf (instance 0) info */
6420 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6421 if (ospf
== NULL
|| !ospf
->oi_running
) {
6422 vty_out(vty
, "%% OSPF instance not found\n");
6426 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6433 DEFUN (show_ip_ospf_instance_database
,
6434 show_ip_ospf_instance_database_cmd
,
6435 "show ip ospf [{(1-65535)|vrf NAME}] database [<asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> [A.B.C.D [<self-originate|adv-router A.B.C.D>]]]",
6438 "OSPF information\n"
6441 "Database summary\n"
6443 "Link State ID (as an IP address)\n"
6444 "Self-originated link states\n"
6445 "Advertising Router link states\n"
6446 "Advertising Router (as an IP address)\n")
6449 unsigned short instance
= 0;
6450 struct listnode
*node
= NULL
;
6451 char *vrf_name
= NULL
;
6452 bool all_vrf
= false;
6453 int ret
= CMD_SUCCESS
;
6456 uint8_t use_vrf
= 0;
6458 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6459 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6460 ospf
= ospf_lookup_instance(instance
);
6462 return CMD_NOT_MY_INSTANCE
;
6463 if (!ospf
->oi_running
)
6466 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0,
6467 argc
, argv
, use_vrf
));
6468 } else if (argv_find(argv
, argc
, "vrf", &idx
)) {
6469 vrf_name
= argv
[++idx
]->arg
;
6470 all_vrf
= strmatch(vrf_name
, "all");
6476 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6477 if (!ospf
->oi_running
)
6479 ret
= (show_ip_ospf_database_common(
6480 vty
, ospf
, idx
? 2 : 0, argc
, argv
,
6484 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6485 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6486 vty_out(vty
, "%% OSPF instance not found\n");
6490 ret
= (show_ip_ospf_database_common(
6491 vty
, ospf
, idx
? 2 : 0, argc
, argv
, use_vrf
));
6494 /* Display default ospf (instance 0) info */
6495 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6496 if (ospf
== NULL
|| !ospf
->oi_running
) {
6497 vty_out(vty
, "%% OSPF instance not found\n");
6501 ret
= (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6508 DEFUN (show_ip_ospf_instance_database_max
,
6509 show_ip_ospf_instance_database_max_cmd
,
6510 "show ip ospf (1-65535) database <max-age|self-originate>",
6513 "OSPF information\n"
6515 "Database summary\n"
6516 "LSAs in MaxAge list\n"
6517 "Self-originated link states\n")
6521 unsigned short instance
= 0;
6523 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6525 ospf
= ospf_lookup_instance(instance
);
6527 return CMD_NOT_MY_INSTANCE
;
6529 if (!ospf
->oi_running
) {
6530 vty_out(vty
, "%% OSPF instance not found\n");
6534 return show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0);
6538 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
6540 int arg_base
, int argc
,
6541 struct cmd_token
**argv
,
6546 struct in_addr adv_router
;
6549 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6551 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6553 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6554 inet_ntoa(ospf
->router_id
));
6556 /* Set database type to show. */
6557 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6558 type
= OSPF_ROUTER_LSA
;
6559 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6560 type
= OSPF_NETWORK_LSA
;
6561 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6562 type
= OSPF_AS_NSSA_LSA
;
6563 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
6564 type
= OSPF_SUMMARY_LSA
;
6565 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6566 type
= OSPF_ASBR_SUMMARY_LSA
;
6567 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6568 type
= OSPF_AS_EXTERNAL_LSA
;
6569 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6570 type
= OSPF_OPAQUE_LINK_LSA
;
6571 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6572 type
= OSPF_OPAQUE_AREA_LSA
;
6573 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6574 type
= OSPF_OPAQUE_AS_LSA
;
6578 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6579 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
6580 adv_router
= ospf
->router_id
;
6582 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
6587 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
);
6592 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
6593 show_ip_ospf_instance_database_type_adv_router_cmd
,
6594 "show ip ospf [{(1-65535)|vrf NAME}] database <asbr-summary|external|network|router|summary|nssa-external|opaque-link|opaque-area|opaque-as> <adv-router A.B.C.D|self-originate>",
6597 "OSPF information\n"
6600 "Database summary\n"
6602 "Advertising Router link states\n"
6603 "Advertising Router (as an IP address)\n"
6604 "Self-originated link states\n")
6606 struct ospf
*ospf
= NULL
;
6607 unsigned short instance
= 0;
6608 struct listnode
*node
= NULL
;
6609 char *vrf_name
= NULL
;
6610 bool all_vrf
= false;
6611 int ret
= CMD_SUCCESS
;
6613 int idx
= 0, idx_vrf
= 0;
6614 uint8_t use_vrf
= 0;
6616 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6617 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6618 ospf
= ospf_lookup_instance(instance
);
6620 return CMD_NOT_MY_INSTANCE
;
6621 if (!ospf
->oi_running
) {
6622 vty_out(vty
, "%% OSPF instance not found\n");
6626 return (show_ip_ospf_database_type_adv_router_common(
6627 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
));
6630 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6633 bool ospf_output
= false;
6638 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6639 if (!ospf
->oi_running
)
6642 ret
= show_ip_ospf_database_type_adv_router_common(
6643 vty
, ospf
, idx
? 1 : 0, argc
, argv
,
6647 vty_out(vty
, "%% OSPF instance not found\n");
6649 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6650 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6651 vty_out(vty
, "%% OSPF instance not found\n");
6655 ret
= show_ip_ospf_database_type_adv_router_common(
6656 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6659 /* Display default ospf (instance 0) info */
6660 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6661 if (ospf
== NULL
|| !ospf
->oi_running
) {
6662 vty_out(vty
, "%% OSPF instance not found\n");
6666 ret
= show_ip_ospf_database_type_adv_router_common(
6667 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6670 /*return (show_ip_ospf_database_type_adv_router_common(
6671 vty, ospf, idx ? 1 : 0, argc, argv));*/
6674 DEFUN (ip_ospf_authentication_args
,
6675 ip_ospf_authentication_args_addr_cmd
,
6676 "ip ospf authentication <null|message-digest> [A.B.C.D]",
6678 "OSPF interface commands\n"
6679 "Enable authentication on this interface\n"
6680 "Use null authentication\n"
6681 "Use message-digest authentication\n"
6682 "Address of interface\n")
6684 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6685 int idx_encryption
= 3;
6687 struct in_addr addr
;
6689 struct ospf_if_params
*params
;
6691 params
= IF_DEF_PARAMS(ifp
);
6694 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6697 "Please specify interface address by A.B.C.D\n");
6698 return CMD_WARNING_CONFIG_FAILED
;
6701 params
= ospf_get_if_params(ifp
, addr
);
6702 ospf_if_update_params(ifp
, addr
);
6705 /* Handle null authentication */
6706 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6707 SET_IF_PARAM(params
, auth_type
);
6708 params
->auth_type
= OSPF_AUTH_NULL
;
6712 /* Handle message-digest authentication */
6713 if (argv
[idx_encryption
]->arg
[0] == 'm') {
6714 SET_IF_PARAM(params
, auth_type
);
6715 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6719 vty_out(vty
, "You shouldn't get here!\n");
6720 return CMD_WARNING_CONFIG_FAILED
;
6723 DEFUN (ip_ospf_authentication
,
6724 ip_ospf_authentication_addr_cmd
,
6725 "ip ospf authentication [A.B.C.D]",
6727 "OSPF interface commands\n"
6728 "Enable authentication on this interface\n"
6729 "Address of interface\n")
6731 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6733 struct in_addr addr
;
6735 struct ospf_if_params
*params
;
6737 params
= IF_DEF_PARAMS(ifp
);
6740 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6743 "Please specify interface address by A.B.C.D\n");
6744 return CMD_WARNING_CONFIG_FAILED
;
6747 params
= ospf_get_if_params(ifp
, addr
);
6748 ospf_if_update_params(ifp
, addr
);
6751 SET_IF_PARAM(params
, auth_type
);
6752 params
->auth_type
= OSPF_AUTH_SIMPLE
;
6757 DEFUN (no_ip_ospf_authentication_args
,
6758 no_ip_ospf_authentication_args_addr_cmd
,
6759 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
6762 "OSPF interface commands\n"
6763 "Enable authentication on this interface\n"
6764 "Use null authentication\n"
6765 "Use message-digest authentication\n"
6766 "Address of interface\n")
6768 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6769 int idx_encryption
= 4;
6771 struct in_addr addr
;
6773 struct ospf_if_params
*params
;
6774 struct route_node
*rn
;
6777 params
= IF_DEF_PARAMS(ifp
);
6780 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6783 "Please specify interface address by A.B.C.D\n");
6784 return CMD_WARNING_CONFIG_FAILED
;
6787 params
= ospf_lookup_if_params(ifp
, addr
);
6788 if (params
== NULL
) {
6789 vty_out(vty
, "Ip Address specified is unknown\n");
6790 return CMD_WARNING_CONFIG_FAILED
;
6792 params
->auth_type
= OSPF_AUTH_NOTSET
;
6793 UNSET_IF_PARAM(params
, auth_type
);
6794 if (params
!= IF_DEF_PARAMS(ifp
)) {
6795 ospf_free_if_params(ifp
, addr
);
6796 ospf_if_update_params(ifp
, addr
);
6799 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6800 auth_type
= OSPF_AUTH_NULL
;
6801 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
6802 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6804 vty_out(vty
, "Unexpected input encountered\n");
6805 return CMD_WARNING_CONFIG_FAILED
;
6808 * Here we have a case where the user has entered
6809 * 'no ip ospf authentication (null | message_digest )'
6810 * we need to find if we have any ip addresses underneath it
6812 * correspond to the associated type.
6814 if (params
->auth_type
== auth_type
) {
6815 params
->auth_type
= OSPF_AUTH_NOTSET
;
6816 UNSET_IF_PARAM(params
, auth_type
);
6819 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6820 rn
= route_next(rn
)) {
6821 if ((params
= rn
->info
)) {
6822 if (params
->auth_type
== auth_type
) {
6823 params
->auth_type
= OSPF_AUTH_NOTSET
;
6824 UNSET_IF_PARAM(params
, auth_type
);
6825 if (params
!= IF_DEF_PARAMS(ifp
)) {
6826 ospf_free_if_params(
6827 ifp
, rn
->p
.u
.prefix4
);
6828 ospf_if_update_params(
6829 ifp
, rn
->p
.u
.prefix4
);
6839 DEFUN (no_ip_ospf_authentication
,
6840 no_ip_ospf_authentication_addr_cmd
,
6841 "no ip ospf authentication [A.B.C.D]",
6844 "OSPF interface commands\n"
6845 "Enable authentication on this interface\n"
6846 "Address of interface\n")
6848 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6850 struct in_addr addr
;
6852 struct ospf_if_params
*params
;
6853 struct route_node
*rn
;
6855 params
= IF_DEF_PARAMS(ifp
);
6858 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6861 "Please specify interface address by A.B.C.D\n");
6862 return CMD_WARNING_CONFIG_FAILED
;
6865 params
= ospf_lookup_if_params(ifp
, addr
);
6866 if (params
== NULL
) {
6867 vty_out(vty
, "Ip Address specified is unknown\n");
6868 return CMD_WARNING_CONFIG_FAILED
;
6871 params
->auth_type
= OSPF_AUTH_NOTSET
;
6872 UNSET_IF_PARAM(params
, auth_type
);
6873 if (params
!= IF_DEF_PARAMS(ifp
)) {
6874 ospf_free_if_params(ifp
, addr
);
6875 ospf_if_update_params(ifp
, addr
);
6879 * When a user enters 'no ip ospf authentication'
6880 * We should remove all authentication types from
6883 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6884 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
6885 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
6886 params
->auth_type
= OSPF_AUTH_NOTSET
;
6887 UNSET_IF_PARAM(params
, auth_type
);
6890 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6891 rn
= route_next(rn
)) {
6892 if ((params
= rn
->info
)) {
6894 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6895 || (params
->auth_type
6896 == OSPF_AUTH_CRYPTOGRAPHIC
)
6897 || (params
->auth_type
6898 == OSPF_AUTH_SIMPLE
)) {
6899 params
->auth_type
= OSPF_AUTH_NOTSET
;
6900 UNSET_IF_PARAM(params
, auth_type
);
6901 if (params
!= IF_DEF_PARAMS(ifp
)) {
6902 ospf_free_if_params(
6903 ifp
, rn
->p
.u
.prefix4
);
6904 ospf_if_update_params(
6905 ifp
, rn
->p
.u
.prefix4
);
6916 DEFUN (ip_ospf_authentication_key
,
6917 ip_ospf_authentication_key_addr_cmd
,
6918 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
6920 "OSPF interface commands\n"
6921 "Authentication password (key)\n"
6922 "The OSPF password (key)\n"
6923 "Address of interface\n")
6925 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6927 struct in_addr addr
;
6928 struct ospf_if_params
*params
;
6930 params
= IF_DEF_PARAMS(ifp
);
6932 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6933 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6935 "Please specify interface address by A.B.C.D\n");
6936 return CMD_WARNING_CONFIG_FAILED
;
6939 params
= ospf_get_if_params(ifp
, addr
);
6940 ospf_if_update_params(ifp
, addr
);
6943 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
6944 sizeof(params
->auth_simple
));
6945 SET_IF_PARAM(params
, auth_simple
);
6950 DEFUN_HIDDEN (ospf_authentication_key
,
6951 ospf_authentication_key_cmd
,
6952 "ospf authentication-key AUTH_KEY [A.B.C.D]",
6953 "OSPF interface commands\n"
6954 VLINK_HELPSTR_AUTH_SIMPLE
6955 "Address of interface\n")
6957 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6960 DEFUN (no_ip_ospf_authentication_key
,
6961 no_ip_ospf_authentication_key_authkey_addr_cmd
,
6962 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6965 "OSPF interface commands\n"
6966 VLINK_HELPSTR_AUTH_SIMPLE
6967 "Address of interface\n")
6969 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6971 struct in_addr addr
;
6972 struct ospf_if_params
*params
;
6973 params
= IF_DEF_PARAMS(ifp
);
6975 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6976 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6978 "Please specify interface address by A.B.C.D\n");
6979 return CMD_WARNING_CONFIG_FAILED
;
6982 params
= ospf_lookup_if_params(ifp
, addr
);
6987 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
6988 UNSET_IF_PARAM(params
, auth_simple
);
6990 if (params
!= IF_DEF_PARAMS(ifp
)) {
6991 ospf_free_if_params(ifp
, addr
);
6992 ospf_if_update_params(ifp
, addr
);
6998 DEFUN_HIDDEN (no_ospf_authentication_key
,
6999 no_ospf_authentication_key_authkey_addr_cmd
,
7000 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7002 "OSPF interface commands\n"
7003 VLINK_HELPSTR_AUTH_SIMPLE
7004 "Address of interface\n")
7006 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7009 DEFUN (ip_ospf_message_digest_key
,
7010 ip_ospf_message_digest_key_cmd
,
7011 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7013 "OSPF interface commands\n"
7014 "Message digest authentication password (key)\n"
7016 "Use MD5 algorithm\n"
7017 "The OSPF password (key)\n"
7018 "Address of interface\n")
7020 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7021 struct crypt_key
*ck
;
7023 struct in_addr addr
;
7024 struct ospf_if_params
*params
;
7026 params
= IF_DEF_PARAMS(ifp
);
7029 argv_find(argv
, argc
, "(1-255)", &idx
);
7030 char *keyid
= argv
[idx
]->arg
;
7031 argv_find(argv
, argc
, "KEY", &idx
);
7032 char *cryptkey
= argv
[idx
]->arg
;
7034 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7035 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7037 "Please specify interface address by A.B.C.D\n");
7038 return CMD_WARNING_CONFIG_FAILED
;
7041 params
= ospf_get_if_params(ifp
, addr
);
7042 ospf_if_update_params(ifp
, addr
);
7045 key_id
= strtol(keyid
, NULL
, 10);
7046 if (ospf_crypt_key_lookup(params
->auth_crypt
, key_id
) != NULL
) {
7047 vty_out(vty
, "OSPF: Key %d already exists\n", key_id
);
7051 ck
= ospf_crypt_key_new();
7052 ck
->key_id
= (uint8_t)key_id
;
7053 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7055 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7056 SET_IF_PARAM(params
, auth_crypt
);
7061 DEFUN_HIDDEN (ospf_message_digest_key
,
7062 ospf_message_digest_key_cmd
,
7063 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7064 "OSPF interface commands\n"
7065 "Message digest authentication password (key)\n"
7067 "Use MD5 algorithm\n"
7068 "The OSPF password (key)\n"
7069 "Address of interface\n")
7071 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7074 DEFUN (no_ip_ospf_message_digest_key
,
7075 no_ip_ospf_message_digest_key_cmd
,
7076 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7079 "OSPF interface commands\n"
7080 "Message digest authentication password (key)\n"
7082 "Use MD5 algorithm\n"
7083 "The OSPF password (key)\n"
7084 "Address of interface\n")
7086 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7088 struct crypt_key
*ck
;
7090 struct in_addr addr
;
7091 struct ospf_if_params
*params
;
7092 params
= IF_DEF_PARAMS(ifp
);
7094 argv_find(argv
, argc
, "(1-255)", &idx
);
7095 char *keyid
= argv
[idx
]->arg
;
7097 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7098 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7100 "Please specify interface address by A.B.C.D\n");
7101 return CMD_WARNING_CONFIG_FAILED
;
7104 params
= ospf_lookup_if_params(ifp
, addr
);
7109 key_id
= strtol(keyid
, NULL
, 10);
7110 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7112 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7113 return CMD_WARNING_CONFIG_FAILED
;
7116 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7118 if (params
!= IF_DEF_PARAMS(ifp
)) {
7119 ospf_free_if_params(ifp
, addr
);
7120 ospf_if_update_params(ifp
, addr
);
7126 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7127 no_ospf_message_digest_key_cmd
,
7128 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7130 "OSPF interface commands\n"
7131 "Message digest authentication password (key)\n"
7133 "Use MD5 algorithm\n"
7134 "The OSPF password (key)\n"
7135 "Address of interface\n")
7137 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7140 DEFUN (ip_ospf_cost
,
7142 "ip ospf cost (1-65535) [A.B.C.D]",
7144 "OSPF interface commands\n"
7147 "Address of interface\n")
7149 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7151 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7152 struct in_addr addr
;
7153 struct ospf_if_params
*params
;
7154 params
= IF_DEF_PARAMS(ifp
);
7157 char *coststr
= NULL
, *ifaddr
= NULL
;
7159 argv_find(argv
, argc
, "(1-65535)", &idx
);
7160 coststr
= argv
[idx
]->arg
;
7161 cost
= strtol(coststr
, NULL
, 10);
7163 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7165 if (!inet_aton(ifaddr
, &addr
)) {
7167 "Please specify interface address by A.B.C.D\n");
7168 return CMD_WARNING_CONFIG_FAILED
;
7171 params
= ospf_get_if_params(ifp
, addr
);
7172 ospf_if_update_params(ifp
, addr
);
7175 SET_IF_PARAM(params
, output_cost_cmd
);
7176 params
->output_cost_cmd
= cost
;
7178 ospf_if_recalculate_output_cost(ifp
);
7183 DEFUN_HIDDEN (ospf_cost
,
7185 "ospf cost (1-65535) [A.B.C.D]",
7186 "OSPF interface commands\n"
7189 "Address of interface\n")
7191 return ip_ospf_cost(self
, vty
, argc
, argv
);
7194 DEFUN (no_ip_ospf_cost
,
7195 no_ip_ospf_cost_cmd
,
7196 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7199 "OSPF interface commands\n"
7202 "Address of interface\n")
7204 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7206 struct in_addr addr
;
7207 struct ospf_if_params
*params
;
7209 params
= IF_DEF_PARAMS(ifp
);
7212 char *ifaddr
= NULL
;
7213 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7215 /* According to the semantics we are mimicking "no ip ospf cost N" is
7216 * always treated as "no ip ospf cost" regardless of the actual value
7217 * of N already configured for the interface. Thus ignore cost. */
7220 if (!inet_aton(ifaddr
, &addr
)) {
7222 "Please specify interface address by A.B.C.D\n");
7223 return CMD_WARNING_CONFIG_FAILED
;
7226 params
= ospf_lookup_if_params(ifp
, addr
);
7231 UNSET_IF_PARAM(params
, output_cost_cmd
);
7233 if (params
!= IF_DEF_PARAMS(ifp
)) {
7234 ospf_free_if_params(ifp
, addr
);
7235 ospf_if_update_params(ifp
, addr
);
7238 ospf_if_recalculate_output_cost(ifp
);
7243 DEFUN_HIDDEN (no_ospf_cost
,
7245 "no ospf cost [(1-65535)] [A.B.C.D]",
7247 "OSPF interface commands\n"
7250 "Address of interface\n")
7252 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
7255 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
7257 struct route_node
*rn
;
7258 struct ospf_neighbor
*nbr
;
7260 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
7261 if ((nbr
= rn
->info
)) {
7262 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
7263 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7264 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7265 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7269 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
7270 const char *nbr_str
,
7271 const char *fast_hello_str
)
7273 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7276 struct in_addr addr
;
7278 struct ospf_if_params
*params
;
7279 struct ospf_interface
*oi
;
7280 struct route_node
*rn
;
7282 params
= IF_DEF_PARAMS(ifp
);
7285 ret
= inet_aton(nbr_str
, &addr
);
7288 "Please specify interface address by A.B.C.D\n");
7289 return CMD_WARNING_CONFIG_FAILED
;
7292 params
= ospf_get_if_params(ifp
, addr
);
7293 ospf_if_update_params(ifp
, addr
);
7297 seconds
= strtoul(interval_str
, NULL
, 10);
7299 /* reset fast_hello too, just to be sure */
7300 UNSET_IF_PARAM(params
, fast_hello
);
7301 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7302 } else if (fast_hello_str
) {
7303 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
7304 /* 1s dead-interval with sub-second hellos desired */
7305 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
7306 SET_IF_PARAM(params
, fast_hello
);
7307 params
->fast_hello
= hellomult
;
7310 "Please specify dead-interval or hello-multiplier\n");
7311 return CMD_WARNING_CONFIG_FAILED
;
7314 SET_IF_PARAM(params
, v_wait
);
7315 params
->v_wait
= seconds
;
7317 /* Update timer values in neighbor structure. */
7319 struct ospf
*ospf
= NULL
;
7321 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7323 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7325 ospf_nbr_timer_update(oi
);
7328 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7329 if ((oi
= rn
->info
))
7330 ospf_nbr_timer_update(oi
);
7336 DEFUN (ip_ospf_dead_interval
,
7337 ip_ospf_dead_interval_cmd
,
7338 "ip ospf dead-interval (1-65535) [A.B.C.D]",
7340 "OSPF interface commands\n"
7341 "Interval time after which a neighbor is declared down\n"
7343 "Address of interface\n")
7346 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
7350 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7351 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
7355 DEFUN_HIDDEN (ospf_dead_interval
,
7356 ospf_dead_interval_cmd
,
7357 "ospf dead-interval (1-65535) [A.B.C.D]",
7358 "OSPF interface commands\n"
7359 "Interval time after which a neighbor is declared down\n"
7361 "Address of interface\n")
7363 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7366 DEFUN (ip_ospf_dead_interval_minimal
,
7367 ip_ospf_dead_interval_minimal_addr_cmd
,
7368 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
7370 "OSPF interface commands\n"
7371 "Interval time after which a neighbor is declared down\n"
7372 "Minimal 1s dead-interval with fast sub-second hellos\n"
7373 "Hello multiplier factor\n"
7374 "Number of Hellos to send each second\n"
7375 "Address of interface\n")
7380 return ospf_vty_dead_interval_set(
7381 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
7383 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
7384 argv
[idx_number
]->arg
);
7387 DEFUN (no_ip_ospf_dead_interval
,
7388 no_ip_ospf_dead_interval_cmd
,
7389 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7392 "OSPF interface commands\n"
7393 "Interval time after which a neighbor is declared down\n"
7395 "Minimal 1s dead-interval with fast sub-second hellos\n"
7396 "Hello multiplier factor\n"
7397 "Number of Hellos to send each second\n"
7398 "Address of interface\n")
7400 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7401 int idx_ipv4
= argc
- 1;
7402 struct in_addr addr
= {.s_addr
= 0L};
7404 struct ospf_if_params
*params
;
7405 struct ospf_interface
*oi
;
7406 struct route_node
*rn
;
7408 params
= IF_DEF_PARAMS(ifp
);
7410 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
7411 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7414 "Please specify interface address by A.B.C.D\n");
7415 return CMD_WARNING_CONFIG_FAILED
;
7418 params
= ospf_lookup_if_params(ifp
, addr
);
7423 UNSET_IF_PARAM(params
, v_wait
);
7424 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
7426 UNSET_IF_PARAM(params
, fast_hello
);
7427 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7429 if (params
!= IF_DEF_PARAMS(ifp
)) {
7430 ospf_free_if_params(ifp
, addr
);
7431 ospf_if_update_params(ifp
, addr
);
7434 /* Update timer values in neighbor structure. */
7436 struct ospf
*ospf
= NULL
;
7438 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7440 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7442 ospf_nbr_timer_update(oi
);
7445 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7446 if ((oi
= rn
->info
))
7447 ospf_nbr_timer_update(oi
);
7453 DEFUN_HIDDEN (no_ospf_dead_interval
,
7454 no_ospf_dead_interval_cmd
,
7455 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7457 "OSPF interface commands\n"
7458 "Interval time after which a neighbor is declared down\n"
7460 "Minimal 1s dead-interval with fast sub-second hellos\n"
7461 "Hello multiplier factor\n"
7462 "Number of Hellos to send each second\n"
7463 "Address of interface\n")
7465 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7468 DEFUN (ip_ospf_hello_interval
,
7469 ip_ospf_hello_interval_cmd
,
7470 "ip ospf hello-interval (1-65535) [A.B.C.D]",
7472 "OSPF interface commands\n"
7473 "Time between HELLO packets\n"
7475 "Address of interface\n")
7477 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7479 struct in_addr addr
;
7480 struct ospf_if_params
*params
;
7481 params
= IF_DEF_PARAMS(ifp
);
7482 uint32_t seconds
= 0;
7484 argv_find(argv
, argc
, "(1-65535)", &idx
);
7485 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7487 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7488 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7490 "Please specify interface address by A.B.C.D\n");
7491 return CMD_WARNING_CONFIG_FAILED
;
7494 params
= ospf_get_if_params(ifp
, addr
);
7495 ospf_if_update_params(ifp
, addr
);
7498 SET_IF_PARAM(params
, v_hello
);
7499 params
->v_hello
= seconds
;
7504 DEFUN_HIDDEN (ospf_hello_interval
,
7505 ospf_hello_interval_cmd
,
7506 "ospf hello-interval (1-65535) [A.B.C.D]",
7507 "OSPF interface commands\n"
7508 "Time between HELLO packets\n"
7510 "Address of interface\n")
7512 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7515 DEFUN (no_ip_ospf_hello_interval
,
7516 no_ip_ospf_hello_interval_cmd
,
7517 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
7520 "OSPF interface commands\n"
7521 "Time between HELLO packets\n" // ignored
7523 "Address of interface\n")
7525 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7527 struct in_addr addr
;
7528 struct ospf_if_params
*params
;
7530 params
= IF_DEF_PARAMS(ifp
);
7532 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7533 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7535 "Please specify interface address by A.B.C.D\n");
7536 return CMD_WARNING_CONFIG_FAILED
;
7539 params
= ospf_lookup_if_params(ifp
, addr
);
7544 UNSET_IF_PARAM(params
, v_hello
);
7545 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
7547 if (params
!= IF_DEF_PARAMS(ifp
)) {
7548 ospf_free_if_params(ifp
, addr
);
7549 ospf_if_update_params(ifp
, addr
);
7555 DEFUN_HIDDEN (no_ospf_hello_interval
,
7556 no_ospf_hello_interval_cmd
,
7557 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7559 "OSPF interface commands\n"
7560 "Time between HELLO packets\n" // ignored
7562 "Address of interface\n")
7564 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7567 DEFUN (ip_ospf_network
,
7568 ip_ospf_network_cmd
,
7569 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7571 "OSPF interface commands\n"
7573 "Specify OSPF broadcast multi-access network\n"
7574 "Specify OSPF NBMA network\n"
7575 "Specify OSPF point-to-multipoint network\n"
7576 "Specify OSPF point-to-point network\n")
7578 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7580 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7581 struct route_node
*rn
;
7583 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
7585 "This is a loopback interface. Can't set network type.\n");
7586 return CMD_WARNING_CONFIG_FAILED
;
7589 if (argv_find(argv
, argc
, "broadcast", &idx
))
7590 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
7591 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
7592 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
7593 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
7594 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
7595 else if (argv_find(argv
, argc
, "point-to-point", &idx
))
7596 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
7598 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7601 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
7603 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7604 struct ospf_interface
*oi
= rn
->info
;
7609 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7611 if (oi
->state
> ISM_Down
) {
7612 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7613 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7620 DEFUN_HIDDEN (ospf_network
,
7622 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7623 "OSPF interface commands\n"
7625 "Specify OSPF broadcast multi-access network\n"
7626 "Specify OSPF NBMA network\n"
7627 "Specify OSPF point-to-multipoint network\n"
7628 "Specify OSPF point-to-point network\n")
7630 return ip_ospf_network(self
, vty
, argc
, argv
);
7633 DEFUN (no_ip_ospf_network
,
7634 no_ip_ospf_network_cmd
,
7635 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7638 "OSPF interface commands\n"
7640 "Specify OSPF broadcast multi-access network\n"
7641 "Specify OSPF NBMA network\n"
7642 "Specify OSPF point-to-multipoint network\n"
7643 "Specify OSPF point-to-point network\n")
7645 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7646 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7647 struct route_node
*rn
;
7649 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
7651 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7654 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7655 struct ospf_interface
*oi
= rn
->info
;
7660 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7662 if (oi
->state
> ISM_Down
) {
7663 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7664 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7671 DEFUN_HIDDEN (no_ospf_network
,
7672 no_ospf_network_cmd
,
7673 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7675 "OSPF interface commands\n"
7677 "Specify OSPF broadcast multi-access network\n"
7678 "Specify OSPF NBMA network\n"
7679 "Specify OSPF point-to-multipoint network\n"
7680 "Specify OSPF point-to-point network\n")
7682 return no_ip_ospf_network(self
, vty
, argc
, argv
);
7685 DEFUN (ip_ospf_priority
,
7686 ip_ospf_priority_cmd
,
7687 "ip ospf priority (0-255) [A.B.C.D]",
7689 "OSPF interface commands\n"
7692 "Address of interface\n")
7694 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7697 struct route_node
*rn
;
7698 struct in_addr addr
;
7699 struct ospf_if_params
*params
;
7700 params
= IF_DEF_PARAMS(ifp
);
7702 argv_find(argv
, argc
, "(0-255)", &idx
);
7703 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
7705 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7706 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7708 "Please specify interface address by A.B.C.D\n");
7709 return CMD_WARNING_CONFIG_FAILED
;
7712 params
= ospf_get_if_params(ifp
, addr
);
7713 ospf_if_update_params(ifp
, addr
);
7716 SET_IF_PARAM(params
, priority
);
7717 params
->priority
= priority
;
7719 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7720 struct ospf_interface
*oi
= rn
->info
;
7725 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7726 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7727 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7734 DEFUN_HIDDEN (ospf_priority
,
7736 "ospf priority (0-255) [A.B.C.D]",
7737 "OSPF interface commands\n"
7740 "Address of interface\n")
7742 return ip_ospf_priority(self
, vty
, argc
, argv
);
7745 DEFUN (no_ip_ospf_priority
,
7746 no_ip_ospf_priority_cmd
,
7747 "no ip ospf priority [(0-255) [A.B.C.D]]",
7750 "OSPF interface commands\n"
7751 "Router priority\n" // ignored
7753 "Address of interface\n")
7755 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7757 struct route_node
*rn
;
7758 struct in_addr addr
;
7759 struct ospf_if_params
*params
;
7761 params
= IF_DEF_PARAMS(ifp
);
7763 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7764 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7766 "Please specify interface address by A.B.C.D\n");
7767 return CMD_WARNING_CONFIG_FAILED
;
7770 params
= ospf_lookup_if_params(ifp
, addr
);
7775 UNSET_IF_PARAM(params
, priority
);
7776 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
7778 if (params
!= IF_DEF_PARAMS(ifp
)) {
7779 ospf_free_if_params(ifp
, addr
);
7780 ospf_if_update_params(ifp
, addr
);
7783 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7784 struct ospf_interface
*oi
= rn
->info
;
7789 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7790 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7791 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7798 DEFUN_HIDDEN (no_ospf_priority
,
7799 no_ospf_priority_cmd
,
7800 "no ospf priority [(0-255) [A.B.C.D]]",
7802 "OSPF interface commands\n"
7805 "Address of interface\n")
7807 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
7810 DEFUN (ip_ospf_retransmit_interval
,
7811 ip_ospf_retransmit_interval_addr_cmd
,
7812 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
7814 "OSPF interface commands\n"
7815 "Time between retransmitting lost link state advertisements\n"
7817 "Address of interface\n")
7819 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7822 struct in_addr addr
;
7823 struct ospf_if_params
*params
;
7824 params
= IF_DEF_PARAMS(ifp
);
7826 argv_find(argv
, argc
, "(3-65535)", &idx
);
7827 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7829 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7830 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7832 "Please specify interface address by A.B.C.D\n");
7833 return CMD_WARNING_CONFIG_FAILED
;
7836 params
= ospf_get_if_params(ifp
, addr
);
7837 ospf_if_update_params(ifp
, addr
);
7840 SET_IF_PARAM(params
, retransmit_interval
);
7841 params
->retransmit_interval
= seconds
;
7846 DEFUN_HIDDEN (ospf_retransmit_interval
,
7847 ospf_retransmit_interval_cmd
,
7848 "ospf retransmit-interval (3-65535) [A.B.C.D]",
7849 "OSPF interface commands\n"
7850 "Time between retransmitting lost link state advertisements\n"
7852 "Address of interface\n")
7854 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7857 DEFUN (no_ip_ospf_retransmit_interval
,
7858 no_ip_ospf_retransmit_interval_addr_cmd
,
7859 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7862 "OSPF interface commands\n"
7863 "Time between retransmitting lost link state advertisements\n"
7865 "Address of interface\n")
7867 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7869 struct in_addr addr
;
7870 struct ospf_if_params
*params
;
7872 params
= IF_DEF_PARAMS(ifp
);
7874 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7875 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7877 "Please specify interface address by A.B.C.D\n");
7878 return CMD_WARNING_CONFIG_FAILED
;
7881 params
= ospf_lookup_if_params(ifp
, addr
);
7886 UNSET_IF_PARAM(params
, retransmit_interval
);
7887 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
7889 if (params
!= IF_DEF_PARAMS(ifp
)) {
7890 ospf_free_if_params(ifp
, addr
);
7891 ospf_if_update_params(ifp
, addr
);
7897 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
7898 no_ospf_retransmit_interval_cmd
,
7899 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7901 "OSPF interface commands\n"
7902 "Time between retransmitting lost link state advertisements\n"
7904 "Address of interface\n")
7906 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7909 DEFUN (ip_ospf_transmit_delay
,
7910 ip_ospf_transmit_delay_addr_cmd
,
7911 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
7913 "OSPF interface commands\n"
7914 "Link state transmit delay\n"
7916 "Address of interface\n")
7918 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7921 struct in_addr addr
;
7922 struct ospf_if_params
*params
;
7924 params
= IF_DEF_PARAMS(ifp
);
7925 argv_find(argv
, argc
, "(1-65535)", &idx
);
7926 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7928 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7929 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7931 "Please specify interface address by A.B.C.D\n");
7932 return CMD_WARNING_CONFIG_FAILED
;
7935 params
= ospf_get_if_params(ifp
, addr
);
7936 ospf_if_update_params(ifp
, addr
);
7939 SET_IF_PARAM(params
, transmit_delay
);
7940 params
->transmit_delay
= seconds
;
7945 DEFUN_HIDDEN (ospf_transmit_delay
,
7946 ospf_transmit_delay_cmd
,
7947 "ospf transmit-delay (1-65535) [A.B.C.D]",
7948 "OSPF interface commands\n"
7949 "Link state transmit delay\n"
7951 "Address of interface\n")
7953 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7956 DEFUN (no_ip_ospf_transmit_delay
,
7957 no_ip_ospf_transmit_delay_addr_cmd
,
7958 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
7961 "OSPF interface commands\n"
7962 "Link state transmit delay\n"
7964 "Address of interface\n")
7966 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7968 struct in_addr addr
;
7969 struct ospf_if_params
*params
;
7971 params
= IF_DEF_PARAMS(ifp
);
7973 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7974 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7976 "Please specify interface address by A.B.C.D\n");
7977 return CMD_WARNING_CONFIG_FAILED
;
7980 params
= ospf_lookup_if_params(ifp
, addr
);
7985 UNSET_IF_PARAM(params
, transmit_delay
);
7986 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
7988 if (params
!= IF_DEF_PARAMS(ifp
)) {
7989 ospf_free_if_params(ifp
, addr
);
7990 ospf_if_update_params(ifp
, addr
);
7997 DEFUN_HIDDEN (no_ospf_transmit_delay
,
7998 no_ospf_transmit_delay_cmd
,
7999 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
8001 "OSPF interface commands\n"
8002 "Link state transmit delay\n"
8004 "Address of interface\n")
8006 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8009 DEFUN (ip_ospf_area
,
8011 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8013 "OSPF interface commands\n"
8015 "Enable OSPF on this interface\n"
8016 "OSPF area ID in IP address format\n"
8017 "OSPF area ID as a decimal value\n"
8018 "Address of interface\n")
8020 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8023 struct in_addr area_id
;
8024 struct in_addr addr
;
8025 struct ospf_if_params
*params
= NULL
;
8026 struct route_node
*rn
;
8027 struct ospf
*ospf
= NULL
;
8028 unsigned short instance
= 0;
8031 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8032 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8034 argv_find(argv
, argc
, "area", &idx
);
8035 areaid
= argv
[idx
+ 1]->arg
;
8037 if (ifp
->vrf_id
&& !instance
)
8038 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8040 ospf
= ospf_lookup_instance(instance
);
8042 if (instance
&& ospf
== NULL
) {
8043 params
= IF_DEF_PARAMS(ifp
);
8044 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8045 UNSET_IF_PARAM(params
, if_area
);
8046 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
8047 ospf_interface_area_unset(ospf
, ifp
);
8048 ospf
->if_ospf_cli_count
--;
8050 return CMD_NOT_MY_INSTANCE
;
8053 ret
= str2area_id(areaid
, &area_id
, &format
);
8055 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8056 return CMD_WARNING_CONFIG_FAILED
;
8058 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8059 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8060 return CMD_WARNING_CONFIG_FAILED
;
8063 params
= IF_DEF_PARAMS(ifp
);
8064 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8065 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8067 "Must remove previous area config before changing ospf area \n");
8068 return CMD_WARNING_CONFIG_FAILED
;
8071 // Check if we have an address arg and proccess it
8072 if (argc
== idx
+ 3) {
8073 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8075 "Please specify Intf Address by A.B.C.D\n");
8076 return CMD_WARNING_CONFIG_FAILED
;
8078 // update/create address-level params
8079 params
= ospf_get_if_params((ifp
), (addr
));
8080 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8082 "Must remove previous area/address config before changing ospf area");
8083 return CMD_WARNING_CONFIG_FAILED
;
8085 ospf_if_update_params((ifp
), (addr
));
8089 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8090 if (rn
->info
!= NULL
) {
8092 "Please remove all network commands first.\n");
8093 return CMD_WARNING_CONFIG_FAILED
;
8098 /* enable ospf on this interface with area_id */
8100 SET_IF_PARAM(params
, if_area
);
8101 params
->if_area
= area_id
;
8102 params
->if_area_id_fmt
= format
;
8106 ospf_interface_area_set(ospf
, ifp
);
8107 ospf
->if_ospf_cli_count
++;
8113 DEFUN (no_ip_ospf_area
,
8114 no_ip_ospf_area_cmd
,
8115 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8118 "OSPF interface commands\n"
8120 "Disable OSPF on this interface\n"
8121 "OSPF area ID in IP address format\n"
8122 "OSPF area ID as a decimal value\n"
8123 "Address of interface\n")
8125 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8128 struct ospf_if_params
*params
;
8129 unsigned short instance
= 0;
8130 struct in_addr addr
;
8132 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8133 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8135 if (ifp
->vrf_id
&& !instance
)
8136 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8138 ospf
= ospf_lookup_instance(instance
);
8141 return CMD_NOT_MY_INSTANCE
;
8143 argv_find(argv
, argc
, "area", &idx
);
8145 // Check if we have an address arg and proccess it
8146 if (argc
== idx
+ 3) {
8147 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8149 "Please specify Intf Address by A.B.C.D\n");
8150 return CMD_WARNING_CONFIG_FAILED
;
8152 params
= ospf_lookup_if_params(ifp
, addr
);
8153 if ((params
) == NULL
)
8156 params
= IF_DEF_PARAMS(ifp
);
8158 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8160 "Can't find specified interface area configuration.\n");
8161 return CMD_WARNING_CONFIG_FAILED
;
8164 UNSET_IF_PARAM(params
, if_area
);
8165 if (params
!= IF_DEF_PARAMS((ifp
))) {
8166 ospf_free_if_params((ifp
), (addr
));
8167 ospf_if_update_params((ifp
), (addr
));
8170 ospf_interface_area_unset(ospf
, ifp
);
8171 ospf
->if_ospf_cli_count
--;
8175 DEFUN (ospf_redistribute_source
,
8176 ospf_redistribute_source_cmd
,
8177 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8179 FRR_REDIST_HELP_STR_OSPFD
8180 "Metric for redistributed routes\n"
8181 "OSPF default metric\n"
8182 "OSPF exterior metric type for redistributed routes\n"
8183 "Set OSPF External Type 1/2 metrics\n"
8184 "Route map reference\n"
8185 "Pointer to route-map entries\n")
8187 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8188 int idx_protocol
= 1;
8192 struct ospf_redist
*red
;
8195 /* Get distribute source. */
8196 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8198 return CMD_WARNING_CONFIG_FAILED
;
8200 red
= ospf_redist_add(ospf
, source
, 0);
8202 /* Get metric value. */
8203 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8204 if (!str2metric(argv
[idx
]->arg
, &metric
))
8205 return CMD_WARNING_CONFIG_FAILED
;
8208 /* Get metric type. */
8209 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8210 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8211 return CMD_WARNING_CONFIG_FAILED
;
8215 if (argv_find(argv
, argc
, "WORD", &idx
)) {
8216 ospf_routemap_set(red
, argv
[idx
]->arg
);
8218 ospf_routemap_unset(red
);
8220 return ospf_redistribute_set(ospf
, source
, 0, type
, metric
);
8223 DEFUN (no_ospf_redistribute_source
,
8224 no_ospf_redistribute_source_cmd
,
8225 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8228 FRR_REDIST_HELP_STR_OSPFD
8229 "Metric for redistributed routes\n"
8230 "OSPF default metric\n"
8231 "OSPF exterior metric type for redistributed routes\n"
8232 "Set OSPF External Type 1/2 metrics\n"
8233 "Route map reference\n"
8234 "Pointer to route-map entries\n")
8236 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8237 int idx_protocol
= 2;
8239 struct ospf_redist
*red
;
8241 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8243 return CMD_WARNING_CONFIG_FAILED
;
8245 red
= ospf_redist_lookup(ospf
, source
, 0);
8249 ospf_routemap_unset(red
);
8250 ospf_redist_del(ospf
, source
, 0);
8252 return ospf_redistribute_unset(ospf
, source
, 0);
8255 DEFUN (ospf_redistribute_instance_source
,
8256 ospf_redistribute_instance_source_cmd
,
8257 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8259 "Open Shortest Path First\n"
8260 "Non-main Kernel Routing Table\n"
8261 "Instance ID/Table ID\n"
8262 "Metric for redistributed routes\n"
8263 "OSPF default metric\n"
8264 "OSPF exterior metric type for redistributed routes\n"
8265 "Set OSPF External Type 1/2 metrics\n"
8266 "Route map reference\n"
8267 "Pointer to route-map entries\n")
8269 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8270 int idx_ospf_table
= 1;
8276 unsigned short instance
;
8277 struct ospf_redist
*red
;
8279 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
8282 vty_out(vty
, "Unknown instance redistribution\n");
8283 return CMD_WARNING_CONFIG_FAILED
;
8286 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8288 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8290 "Instance redistribution in non-instanced OSPF not allowed\n");
8291 return CMD_WARNING_CONFIG_FAILED
;
8294 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8295 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8296 return CMD_WARNING_CONFIG_FAILED
;
8299 /* Get metric value. */
8300 if (argv_find(argv
, argc
, "metric", &idx
))
8301 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
8302 return CMD_WARNING_CONFIG_FAILED
;
8305 /* Get metric type. */
8306 if (argv_find(argv
, argc
, "metric-type", &idx
))
8307 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
8308 return CMD_WARNING_CONFIG_FAILED
;
8310 red
= ospf_redist_add(ospf
, source
, instance
);
8313 if (argv_find(argv
, argc
, "route-map", &idx
))
8314 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
8316 ospf_routemap_unset(red
);
8318 return ospf_redistribute_set(ospf
, source
, instance
, type
, metric
);
8321 DEFUN (no_ospf_redistribute_instance_source
,
8322 no_ospf_redistribute_instance_source_cmd
,
8323 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8326 "Open Shortest Path First\n"
8327 "Non-main Kernel Routing Table\n"
8328 "Instance ID/Table Id\n"
8329 "Metric for redistributed routes\n"
8330 "OSPF default metric\n"
8331 "OSPF exterior metric type for redistributed routes\n"
8332 "Set OSPF External Type 1/2 metrics\n"
8333 "Route map reference\n"
8334 "Pointer to route-map entries\n")
8336 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8337 int idx_ospf_table
= 2;
8339 unsigned int instance
;
8340 struct ospf_redist
*red
;
8343 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
8344 source
= ZEBRA_ROUTE_OSPF
;
8346 source
= ZEBRA_ROUTE_TABLE
;
8348 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8350 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8352 "Instance redistribution in non-instanced OSPF not allowed\n");
8353 return CMD_WARNING_CONFIG_FAILED
;
8356 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8357 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8358 return CMD_WARNING_CONFIG_FAILED
;
8361 red
= ospf_redist_lookup(ospf
, source
, instance
);
8365 ospf_routemap_unset(red
);
8366 ospf_redist_del(ospf
, source
, instance
);
8368 return ospf_redistribute_unset(ospf
, source
, instance
);
8371 DEFUN (ospf_distribute_list_out
,
8372 ospf_distribute_list_out_cmd
,
8373 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8374 "Filter networks in routing updates\n"
8375 "Access-list name\n"
8377 FRR_REDIST_HELP_STR_OSPFD
)
8379 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8383 char *proto
= argv
[argc
- 1]->text
;
8385 /* Get distribute source. */
8386 source
= proto_redistnum(AFI_IP
, proto
);
8388 return CMD_WARNING_CONFIG_FAILED
;
8390 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
8393 DEFUN (no_ospf_distribute_list_out
,
8394 no_ospf_distribute_list_out_cmd
,
8395 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8397 "Filter networks in routing updates\n"
8398 "Access-list name\n"
8400 FRR_REDIST_HELP_STR_OSPFD
)
8402 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8406 char *proto
= argv
[argc
- 1]->text
;
8407 source
= proto_redistnum(AFI_IP
, proto
);
8409 return CMD_WARNING_CONFIG_FAILED
;
8411 return ospf_distribute_list_out_unset(ospf
, source
,
8412 argv
[idx_word
]->arg
);
8415 /* Default information originate. */
8416 DEFUN (ospf_default_information_originate
,
8417 ospf_default_information_originate_cmd
,
8418 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8419 "Control distribution of default information\n"
8420 "Distribute a default route\n"
8421 "Always advertise default route\n"
8422 "OSPF default metric\n"
8424 "OSPF metric type for default routes\n"
8425 "Set OSPF External Type 1/2 metrics\n"
8426 "Route map reference\n"
8427 "Pointer to route-map entries\n")
8429 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8430 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
8433 struct ospf_redist
*red
;
8435 int cur_originate
= ospf
->default_originate
;
8439 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
8441 /* Check whether "always" was specified */
8442 if (argv_find(argv
, argc
, "always", &idx
))
8443 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
8445 /* Get metric value */
8446 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8447 if (!str2metric(argv
[idx
]->arg
, &metric
))
8448 return CMD_WARNING_CONFIG_FAILED
;
8451 /* Get metric type. */
8452 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8453 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8454 return CMD_WARNING_CONFIG_FAILED
;
8458 if (argv_find(argv
, argc
, "WORD", &idx
))
8459 rtmap
= argv
[idx
]->arg
;
8461 /* To check ,if user is providing same route map */
8462 if ((rtmap
== ROUTEMAP_NAME(red
)) ||
8463 (rtmap
&& ROUTEMAP_NAME(red
)
8464 && (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
8467 /* Don't allow if the same lsa is aleardy originated. */
8469 && (red
->dmetric
.type
== type
)
8470 && (red
->dmetric
.value
== metric
)
8471 && (cur_originate
== default_originate
))
8474 /* Updating Metric details */
8475 red
->dmetric
.type
= type
;
8476 red
->dmetric
.value
= metric
;
8478 /* updating route map details */
8480 ospf_routemap_set(red
, rtmap
);
8482 ospf_routemap_unset(red
);
8484 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
8488 DEFUN (no_ospf_default_information_originate
,
8489 no_ospf_default_information_originate_cmd
,
8490 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8492 "Control distribution of default information\n"
8493 "Distribute a default route\n"
8494 "Always advertise default route\n"
8495 "OSPF default metric\n"
8497 "OSPF metric type for default routes\n"
8498 "Set OSPF External Type 1/2 metrics\n"
8499 "Route map reference\n"
8500 "Pointer to route-map entries\n")
8502 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8503 struct ospf_redist
*red
;
8505 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8509 ospf_routemap_unset(red
);
8510 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
8512 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
8516 DEFUN (ospf_default_metric
,
8517 ospf_default_metric_cmd
,
8518 "default-metric (0-16777214)",
8519 "Set metric of redistributed routes\n"
8522 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8526 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
8527 return CMD_WARNING_CONFIG_FAILED
;
8529 ospf
->default_metric
= metric
;
8534 DEFUN (no_ospf_default_metric
,
8535 no_ospf_default_metric_cmd
,
8536 "no default-metric [(0-16777214)]",
8538 "Set metric of redistributed routes\n"
8541 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8543 ospf
->default_metric
= -1;
8549 DEFUN (ospf_distance
,
8552 "Administrative distance\n"
8553 "OSPF Administrative distance\n")
8555 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8558 ospf
->distance_all
= atoi(argv
[idx_number
]->arg
);
8563 DEFUN (no_ospf_distance
,
8564 no_ospf_distance_cmd
,
8565 "no distance (1-255)",
8567 "Administrative distance\n"
8568 "OSPF Administrative distance\n")
8570 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8572 ospf
->distance_all
= 0;
8577 DEFUN (no_ospf_distance_ospf
,
8578 no_ospf_distance_ospf_cmd
,
8579 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
8581 "Administrative distance\n"
8582 "OSPF administrative distance\n"
8583 "Intra-area routes\n"
8584 "Distance for intra-area routes\n"
8585 "Inter-area routes\n"
8586 "Distance for inter-area routes\n"
8588 "Distance for external routes\n")
8590 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8593 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
8594 idx
= ospf
->distance_intra
= 0;
8595 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
8596 idx
= ospf
->distance_inter
= 0;
8597 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
8598 ospf
->distance_external
= 0;
8603 DEFUN (ospf_distance_ospf
,
8604 ospf_distance_ospf_cmd
,
8605 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
8606 "Administrative distance\n"
8607 "OSPF administrative distance\n"
8608 "Intra-area routes\n"
8609 "Distance for intra-area routes\n"
8610 "Inter-area routes\n"
8611 "Distance for inter-area routes\n"
8613 "Distance for external routes\n")
8615 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8618 ospf
->distance_intra
= 0;
8619 ospf
->distance_inter
= 0;
8620 ospf
->distance_external
= 0;
8622 if (argv_find(argv
, argc
, "intra-area", &idx
))
8623 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
8625 if (argv_find(argv
, argc
, "inter-area", &idx
))
8626 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
8628 if (argv_find(argv
, argc
, "external", &idx
))
8629 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
8635 DEFUN (ospf_distance_source
,
8636 ospf_distance_source_cmd
,
8637 "distance (1-255) A.B.C.D/M",
8638 "Administrative distance\n"
8640 "IP source prefix\n")
8642 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8644 int idx_ipv4_prefixlen
= 2;
8646 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8651 DEFUN (no_ospf_distance_source
,
8652 no_ospf_distance_source_cmd
,
8653 "no distance (1-255) A.B.C.D/M",
8655 "Administrative distance\n"
8657 "IP source prefix\n")
8659 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8661 int idx_ipv4_prefixlen
= 3;
8663 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8668 DEFUN (ospf_distance_source_access_list
,
8669 ospf_distance_source_access_list_cmd
,
8670 "distance (1-255) A.B.C.D/M WORD",
8671 "Administrative distance\n"
8673 "IP source prefix\n"
8674 "Access list name\n")
8676 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8678 int idx_ipv4_prefixlen
= 2;
8681 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8686 DEFUN (no_ospf_distance_source_access_list
,
8687 no_ospf_distance_source_access_list_cmd
,
8688 "no distance (1-255) A.B.C.D/M WORD",
8690 "Administrative distance\n"
8692 "IP source prefix\n"
8693 "Access list name\n")
8695 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8697 int idx_ipv4_prefixlen
= 3;
8700 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8706 DEFUN (ip_ospf_mtu_ignore
,
8707 ip_ospf_mtu_ignore_addr_cmd
,
8708 "ip ospf mtu-ignore [A.B.C.D]",
8710 "OSPF interface commands\n"
8711 "Disable MTU mismatch detection on this interface\n"
8712 "Address of interface\n")
8714 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8716 struct in_addr addr
;
8719 struct ospf_if_params
*params
;
8720 params
= IF_DEF_PARAMS(ifp
);
8723 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8726 "Please specify interface address by A.B.C.D\n");
8727 return CMD_WARNING_CONFIG_FAILED
;
8729 params
= ospf_get_if_params(ifp
, addr
);
8730 ospf_if_update_params(ifp
, addr
);
8732 params
->mtu_ignore
= 1;
8733 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8734 SET_IF_PARAM(params
, mtu_ignore
);
8736 UNSET_IF_PARAM(params
, mtu_ignore
);
8737 if (params
!= IF_DEF_PARAMS(ifp
)) {
8738 ospf_free_if_params(ifp
, addr
);
8739 ospf_if_update_params(ifp
, addr
);
8745 DEFUN (no_ip_ospf_mtu_ignore
,
8746 no_ip_ospf_mtu_ignore_addr_cmd
,
8747 "no ip ospf mtu-ignore [A.B.C.D]",
8750 "OSPF interface commands\n"
8751 "Disable MTU mismatch detection on this interface\n"
8752 "Address of interface\n")
8754 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8756 struct in_addr addr
;
8759 struct ospf_if_params
*params
;
8760 params
= IF_DEF_PARAMS(ifp
);
8763 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8766 "Please specify interface address by A.B.C.D\n");
8767 return CMD_WARNING_CONFIG_FAILED
;
8769 params
= ospf_get_if_params(ifp
, addr
);
8770 ospf_if_update_params(ifp
, addr
);
8772 params
->mtu_ignore
= 0;
8773 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8774 SET_IF_PARAM(params
, mtu_ignore
);
8776 UNSET_IF_PARAM(params
, mtu_ignore
);
8777 if (params
!= IF_DEF_PARAMS(ifp
)) {
8778 ospf_free_if_params(ifp
, addr
);
8779 ospf_if_update_params(ifp
, addr
);
8786 DEFUN (ospf_max_metric_router_lsa_admin
,
8787 ospf_max_metric_router_lsa_admin_cmd
,
8788 "max-metric router-lsa administrative",
8789 "OSPF maximum / infinite-distance metric\n"
8790 "Advertise own Router-LSA with infinite distance (stub router)\n"
8791 "Administratively applied, for an indefinite period\n")
8793 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8794 struct listnode
*ln
;
8795 struct ospf_area
*area
;
8797 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8798 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
8800 if (!CHECK_FLAG(area
->stub_router_state
,
8801 OSPF_AREA_IS_STUB_ROUTED
))
8802 ospf_router_lsa_update_area(area
);
8805 /* Allows for areas configured later to get the property */
8806 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
8811 DEFUN (no_ospf_max_metric_router_lsa_admin
,
8812 no_ospf_max_metric_router_lsa_admin_cmd
,
8813 "no max-metric router-lsa administrative",
8815 "OSPF maximum / infinite-distance metric\n"
8816 "Advertise own Router-LSA with infinite distance (stub router)\n"
8817 "Administratively applied, for an indefinite period\n")
8819 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8820 struct listnode
*ln
;
8821 struct ospf_area
*area
;
8823 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8824 UNSET_FLAG(area
->stub_router_state
,
8825 OSPF_AREA_ADMIN_STUB_ROUTED
);
8827 /* Don't trample on the start-up stub timer */
8828 if (CHECK_FLAG(area
->stub_router_state
,
8829 OSPF_AREA_IS_STUB_ROUTED
)
8830 && !area
->t_stub_router
) {
8831 UNSET_FLAG(area
->stub_router_state
,
8832 OSPF_AREA_IS_STUB_ROUTED
);
8833 ospf_router_lsa_update_area(area
);
8836 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
8840 DEFUN (ospf_max_metric_router_lsa_startup
,
8841 ospf_max_metric_router_lsa_startup_cmd
,
8842 "max-metric router-lsa on-startup (5-86400)",
8843 "OSPF maximum / infinite-distance metric\n"
8844 "Advertise own Router-LSA with infinite distance (stub router)\n"
8845 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8846 "Time (seconds) to advertise self as stub-router\n")
8848 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8850 unsigned int seconds
;
8853 vty_out(vty
, "%% Must supply stub-router period");
8854 return CMD_WARNING_CONFIG_FAILED
;
8857 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8859 ospf
->stub_router_startup_time
= seconds
;
8864 DEFUN (no_ospf_max_metric_router_lsa_startup
,
8865 no_ospf_max_metric_router_lsa_startup_cmd
,
8866 "no max-metric router-lsa on-startup [(5-86400)]",
8868 "OSPF maximum / infinite-distance metric\n"
8869 "Advertise own Router-LSA with infinite distance (stub router)\n"
8870 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8871 "Time (seconds) to advertise self as stub-router\n")
8873 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8874 struct listnode
*ln
;
8875 struct ospf_area
*area
;
8877 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8879 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8880 SET_FLAG(area
->stub_router_state
,
8881 OSPF_AREA_WAS_START_STUB_ROUTED
);
8882 OSPF_TIMER_OFF(area
->t_stub_router
);
8884 /* Don't trample on admin stub routed */
8885 if (!CHECK_FLAG(area
->stub_router_state
,
8886 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8887 UNSET_FLAG(area
->stub_router_state
,
8888 OSPF_AREA_IS_STUB_ROUTED
);
8889 ospf_router_lsa_update_area(area
);
8896 DEFUN (ospf_max_metric_router_lsa_shutdown
,
8897 ospf_max_metric_router_lsa_shutdown_cmd
,
8898 "max-metric router-lsa on-shutdown (5-100)",
8899 "OSPF maximum / infinite-distance metric\n"
8900 "Advertise own Router-LSA with infinite distance (stub router)\n"
8901 "Advertise stub-router prior to full shutdown of OSPF\n"
8902 "Time (seconds) to wait till full shutdown\n")
8904 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8906 unsigned int seconds
;
8909 vty_out(vty
, "%% Must supply stub-router shutdown period");
8910 return CMD_WARNING_CONFIG_FAILED
;
8913 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8915 ospf
->stub_router_shutdown_time
= seconds
;
8920 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
8921 no_ospf_max_metric_router_lsa_shutdown_cmd
,
8922 "no max-metric router-lsa on-shutdown [(5-100)]",
8924 "OSPF maximum / infinite-distance metric\n"
8925 "Advertise own Router-LSA with infinite distance (stub router)\n"
8926 "Advertise stub-router prior to full shutdown of OSPF\n"
8927 "Time (seconds) to wait till full shutdown\n")
8929 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8931 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8936 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
8938 struct listnode
*ln
;
8939 struct ospf_area
*area
;
8941 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8942 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
8943 ospf
->stub_router_startup_time
);
8944 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8945 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
8946 ospf
->stub_router_shutdown_time
);
8947 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8948 if (CHECK_FLAG(area
->stub_router_state
,
8949 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8950 vty_out(vty
, " max-metric router-lsa administrative\n");
8957 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
8958 struct route_table
*rt
,
8961 struct route_node
*rn
;
8962 struct ospf_route
* or ;
8963 struct listnode
*pnode
, *pnnode
;
8964 struct ospf_path
*path
;
8965 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
8966 *json_nexthop
= NULL
;
8970 "============ OSPF network routing table ============\n");
8972 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
8973 if ((or = rn
->info
) == NULL
)
8975 char buf1
[PREFIX2STR_BUFFER
];
8977 memset(buf1
, 0, sizeof(buf1
));
8978 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
8980 json_route
= json_object_new_object();
8982 json_object_object_add(json
, buf1
, json_route
);
8983 json_object_to_json_string_ext(
8984 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
8987 switch (or->path_type
) {
8988 case OSPF_PATH_INTER_AREA
:
8989 if (or->type
== OSPF_DESTINATION_NETWORK
) {
8991 json_object_string_add(json_route
,
8994 json_object_int_add(json_route
, "cost",
8996 json_object_string_add(
8998 inet_ntoa(or->u
.std
.area_id
));
9001 "N IA %-18s [%d] area: %s\n",
9003 inet_ntoa(or->u
.std
.area_id
));
9005 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
9007 json_object_string_add(json_route
,
9012 "D IA %-18s Discard entry\n",
9017 case OSPF_PATH_INTRA_AREA
:
9019 json_object_string_add(json_route
, "routeType",
9021 json_object_int_add(json_route
, "cost",
9023 json_object_string_add(
9025 inet_ntoa(or->u
.std
.area_id
));
9027 vty_out(vty
, "N %-18s [%d] area: %s\n",
9029 inet_ntoa(or->u
.std
.area_id
));
9036 if (or->type
== OSPF_DESTINATION_NETWORK
) {
9038 json_nexthop_array
= json_object_new_array();
9039 json_object_object_add(json_route
, "nexthops",
9040 json_nexthop_array
);
9043 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
9046 json_nexthop
= json_object_new_object();
9047 json_object_array_add(
9051 if (if_lookup_by_index(path
->ifindex
,
9054 if (path
->nexthop
.s_addr
== 0) {
9056 json_object_string_add(
9059 json_object_string_add(
9061 "directly attached to",
9067 "%24s directly attached to %s\n",
9075 json_object_string_add(
9080 json_object_string_add(
9088 "%24s via %s, %s\n",
9101 json_object_free(json_route
);
9107 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
9108 struct route_table
*rtrs
,
9111 struct route_node
*rn
;
9112 struct ospf_route
* or ;
9113 struct listnode
*pnode
;
9114 struct listnode
*node
;
9115 struct ospf_path
*path
;
9116 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9117 *json_nexthop
= NULL
;
9121 "============ OSPF router routing table =============\n");
9123 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
9124 if (rn
->info
== NULL
)
9128 json_route
= json_object_new_object();
9130 json_object_object_add(json
, inet_ntoa(rn
->p
.u
.prefix4
),
9132 json_object_string_add(json_route
, "routeType", "R ");
9134 vty_out(vty
, "R %-15s ",
9135 inet_ntoa(rn
->p
.u
.prefix4
));
9138 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
9141 vty_out(vty
, "%24s", "");
9146 json_object_int_add(json_route
, "cost",
9148 json_object_string_add(
9150 inet_ntoa(or->u
.std
.area_id
));
9151 if (or->path_type
== OSPF_PATH_INTER_AREA
)
9152 json_object_boolean_true_add(json_route
,
9154 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
9155 json_object_string_add(json_route
,
9158 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
9159 json_object_string_add(json_route
,
9163 vty_out(vty
, "%s [%d] area: %s",
9164 (or->path_type
== OSPF_PATH_INTER_AREA
9167 or->cost
, inet_ntoa(or->u
.std
.area_id
));
9169 vty_out(vty
, "%s%s\n",
9170 (or->u
.std
.flags
& ROUTER_LSA_BORDER
9173 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
9179 json_nexthop_array
= json_object_new_array();
9180 json_object_object_add(json_route
, "nexthops",
9181 json_nexthop_array
);
9184 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
9186 json_nexthop
= json_object_new_object();
9187 json_object_array_add(
9191 if (if_lookup_by_index(path
->ifindex
,
9193 if (path
->nexthop
.s_addr
== 0) {
9195 json_object_string_add(
9198 json_object_string_add(
9200 "directly attached to",
9206 "%24s directly attached to %s\n",
9214 json_object_string_add(
9219 json_object_string_add(
9227 "%24s via %s, %s\n",
9240 json_object_free(json_route
);
9246 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
9247 struct route_table
*rt
,
9250 struct route_node
*rn
;
9251 struct ospf_route
*er
;
9252 struct listnode
*pnode
, *pnnode
;
9253 struct ospf_path
*path
;
9254 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9255 *json_nexthop
= NULL
;
9259 "============ OSPF external routing table ===========\n");
9261 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
9262 if ((er
= rn
->info
) == NULL
)
9267 snprintf(buf1
, 19, "%s/%d", inet_ntoa(rn
->p
.u
.prefix4
),
9269 json_route
= json_object_new_object();
9271 json_object_object_add(json
, buf1
, json_route
);
9272 json_object_to_json_string_ext(
9273 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
9276 switch (er
->path_type
) {
9277 case OSPF_PATH_TYPE1_EXTERNAL
:
9279 json_object_string_add(json_route
, "routeType",
9281 json_object_int_add(json_route
, "cost",
9285 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
9287 buf1
, er
->cost
, er
->u
.ext
.tag
);
9290 case OSPF_PATH_TYPE2_EXTERNAL
:
9292 json_object_string_add(json_route
, "routeType",
9294 json_object_int_add(json_route
, "cost",
9298 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
9300 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
9307 json_nexthop_array
= json_object_new_array();
9308 json_object_object_add(json_route
, "nexthops",
9309 json_nexthop_array
);
9312 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
9314 json_nexthop
= json_object_new_object();
9315 json_object_array_add(json_nexthop_array
,
9319 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
9320 if (path
->nexthop
.s_addr
== 0) {
9322 json_object_string_add(
9325 json_object_string_add(
9327 "directly attached to",
9333 "%24s directly attached to %s\n",
9341 json_object_string_add(
9345 json_object_string_add(
9346 json_nexthop
, "via",
9352 "%24s via %s, %s\n",
9364 json_object_free(json_route
);
9370 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
9375 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9377 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
9379 if (ospf
->new_table
== NULL
) {
9380 vty_out(vty
, "No OSPF routing information exist\n");
9384 /* Show Network routes.
9385 show_ip_ospf_route_network (vty, ospf->new_table); */
9387 /* Show Router routes. */
9388 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
9395 DEFUN (show_ip_ospf_border_routers
,
9396 show_ip_ospf_border_routers_cmd
,
9397 "show ip ospf [vrf <NAME|all>] border-routers",
9400 "OSPF information\n"
9403 "Show all the ABR's and ASBR's\n")
9405 struct ospf
*ospf
= NULL
;
9406 struct listnode
*node
= NULL
;
9407 char *vrf_name
= NULL
;
9408 bool all_vrf
= false;
9409 int ret
= CMD_SUCCESS
;
9412 uint8_t use_vrf
= 0;
9414 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9417 bool ospf_output
= false;
9422 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9423 if (!ospf
->oi_running
)
9427 ret
= show_ip_ospf_border_routers_common(
9428 vty
, ospf
, use_vrf
);
9432 vty_out(vty
, "%% OSPF instance not found\n");
9434 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9435 if (ospf
== NULL
|| !ospf
->oi_running
) {
9436 vty_out(vty
, "%% OSPF instance not found\n");
9440 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
9444 /* Display default ospf (instance 0) info */
9445 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9446 if (ospf
== NULL
|| !ospf
->oi_running
) {
9447 vty_out(vty
, "%% OSPF instance not found\n");
9451 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
9457 DEFUN (show_ip_ospf_instance_border_routers
,
9458 show_ip_ospf_instance_border_routers_cmd
,
9459 "show ip ospf (1-65535) border-routers",
9462 "OSPF information\n"
9464 "Show all the ABR's and ASBR's\n")
9468 unsigned short instance
= 0;
9470 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9471 ospf
= ospf_lookup_instance(instance
);
9473 return CMD_NOT_MY_INSTANCE
;
9475 if (!ospf
->oi_running
)
9478 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
9481 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
9482 json_object
*json
, uint8_t use_vrf
)
9484 json_object
*json_vrf
= NULL
;
9487 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9492 json_vrf
= json_object_new_object();
9497 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
9499 if (ospf
->new_table
== NULL
) {
9500 vty_out(vty
, "No OSPF routing information exist\n");
9504 /* Show Network routes. */
9505 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
9507 /* Show Router routes. */
9508 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
9510 /* Show AS External routes. */
9511 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
9516 // json_object_object_add(json_vrf, "areas",
9518 if (ospf
->vrf_id
== VRF_DEFAULT
)
9519 json_object_object_add(json
, "default",
9522 json_object_object_add(json
, ospf
->name
,
9532 DEFUN (show_ip_ospf_route
,
9533 show_ip_ospf_route_cmd
,
9534 "show ip ospf [vrf <NAME|all>] route [json]",
9537 "OSPF information\n"
9540 "OSPF routing table\n"
9543 struct ospf
*ospf
= NULL
;
9544 struct listnode
*node
= NULL
;
9545 char *vrf_name
= NULL
;
9546 bool all_vrf
= false;
9547 int ret
= CMD_SUCCESS
;
9550 uint8_t use_vrf
= 0;
9551 bool uj
= use_json(argc
, argv
);
9552 json_object
*json
= NULL
;
9555 json
= json_object_new_object();
9557 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9559 /* vrf input is provided could be all or specific vrf*/
9561 bool ospf_output
= false;
9566 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9567 if (!ospf
->oi_running
)
9570 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
9575 /* Keep Non-pretty format */
9576 vty_out(vty
, "%s\n",
9577 json_object_to_json_string(json
));
9578 json_object_free(json
);
9579 } else if (!ospf_output
)
9580 vty_out(vty
, "%% OSPF instance not found\n");
9584 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9585 if (ospf
== NULL
|| !ospf
->oi_running
) {
9587 vty_out(vty
, "%s\n",
9588 json_object_to_json_string_ext(
9589 json
, JSON_C_TO_STRING_PRETTY
));
9590 json_object_free(json
);
9592 vty_out(vty
, "%% OSPF instance not found\n");
9597 /* Display default ospf (instance 0) info */
9598 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9599 if (ospf
== NULL
|| !ospf
->oi_running
) {
9601 vty_out(vty
, "%s\n",
9602 json_object_to_json_string_ext(
9603 json
, JSON_C_TO_STRING_PRETTY
));
9604 json_object_free(json
);
9606 vty_out(vty
, "%% OSPF instance not found\n");
9613 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
9614 /* Keep Non-pretty format */
9616 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
9620 json_object_free(json
);
9625 DEFUN (show_ip_ospf_instance_route
,
9626 show_ip_ospf_instance_route_cmd
,
9627 "show ip ospf (1-65535) route",
9630 "OSPF information\n"
9632 "OSPF routing table\n")
9636 unsigned short instance
= 0;
9638 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9639 ospf
= ospf_lookup_instance(instance
);
9641 return CMD_NOT_MY_INSTANCE
;
9643 if (!ospf
->oi_running
)
9646 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
9650 DEFUN (show_ip_ospf_vrfs
,
9651 show_ip_ospf_vrfs_cmd
,
9652 "show ip ospf vrfs [json]",
9655 "OSPF information\n"
9659 bool uj
= use_json(argc
, argv
);
9660 json_object
*json
= NULL
;
9661 json_object
*json_vrfs
= NULL
;
9662 struct ospf
*ospf
= NULL
;
9663 struct listnode
*node
= NULL
;
9665 static const char header
[] = "Name Id RouterId ";
9668 json
= json_object_new_object();
9669 json_vrfs
= json_object_new_object();
9672 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9673 json_object
*json_vrf
= NULL
;
9674 const char *name
= NULL
;
9675 int64_t vrf_id_ui
= 0;
9679 if (!uj
&& count
== 1)
9680 vty_out(vty
, "%s\n", header
);
9682 json_vrf
= json_object_new_object();
9684 if (ospf
->vrf_id
== VRF_DEFAULT
)
9685 name
= VRF_DEFAULT_NAME
;
9689 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
9691 : (int64_t)ospf
->vrf_id
;
9694 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
9695 json_object_string_add(json_vrf
, "routerId",
9696 inet_ntoa(ospf
->router_id
));
9698 json_object_object_add(json_vrfs
, name
, json_vrf
);
9701 vty_out(vty
, "%-25s %-5d %-16s \n", name
,
9702 ospf
->vrf_id
, inet_ntoa(ospf
->router_id
));
9707 json_object_object_add(json
, "vrfs", json_vrfs
);
9708 json_object_int_add(json
, "totalVrfs", count
);
9710 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
9711 json
, JSON_C_TO_STRING_PRETTY
));
9712 json_object_free(json
);
9715 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
9722 static const char *const ospf_abr_type_str
[] = {
9723 "unknown", "standard", "ibm", "cisco", "shortcut"
9726 static const char *const ospf_shortcut_mode_str
[] = {
9727 "default", "enable", "disable"
9730 static const char *const ospf_int_type_str
[] = {
9731 "unknown", /* should never be used. */
9735 "point-to-multipoint",
9736 "virtual-link", /* should never be used. */
9740 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
9742 struct listnode
*node
;
9743 struct interface
*ifp
;
9744 struct crypt_key
*ck
;
9745 struct route_node
*rn
= NULL
;
9746 struct ospf_if_params
*params
;
9748 struct ospf
*ospf
= vrf
->info
;
9750 FOR_ALL_INTERFACES (vrf
, ifp
) {
9752 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
9755 vty_frame(vty
, "!\n");
9756 if (ifp
->vrf_id
== VRF_DEFAULT
)
9757 vty_frame(vty
, "interface %s\n", ifp
->name
);
9759 vty_frame(vty
, "interface %s vrf %s\n", ifp
->name
,
9762 vty_out(vty
, " description %s\n", ifp
->desc
);
9766 params
= IF_DEF_PARAMS(ifp
);
9769 /* Interface Network print. */
9770 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
9771 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
9772 if (params
->type
!= ospf_default_iftype(ifp
)) {
9773 vty_out(vty
, " ip ospf network %s",
9776 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9784 /* OSPF interface authentication print */
9785 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
9786 && params
->auth_type
!= OSPF_AUTH_NOTSET
) {
9787 const char *auth_str
;
9789 /* Translation tables are not that much help
9790 * here due to syntax
9791 * of the simple option */
9792 switch (params
->auth_type
) {
9794 case OSPF_AUTH_NULL
:
9798 case OSPF_AUTH_SIMPLE
:
9802 case OSPF_AUTH_CRYPTOGRAPHIC
:
9803 auth_str
= " message-digest";
9811 vty_out(vty
, " ip ospf authentication%s",
9813 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9815 inet_ntoa(rn
->p
.u
.prefix4
));
9819 /* Simple Authentication Password print. */
9820 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
9821 && params
->auth_simple
[0] != '\0') {
9822 vty_out(vty
, " ip ospf authentication-key %s",
9823 params
->auth_simple
);
9824 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9826 inet_ntoa(rn
->p
.u
.prefix4
));
9830 /* Cryptographic Authentication Key print. */
9831 if (params
&& params
->auth_crypt
) {
9832 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
9835 " ip ospf message-digest-key %d md5 %s",
9836 ck
->key_id
, ck
->auth_key
);
9837 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9845 /* Interface Output Cost print. */
9846 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
9847 vty_out(vty
, " ip ospf cost %u",
9848 params
->output_cost_cmd
);
9849 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9851 inet_ntoa(rn
->p
.u
.prefix4
));
9855 /* Hello Interval print. */
9856 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
9857 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
9858 vty_out(vty
, " ip ospf hello-interval %u",
9860 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9862 inet_ntoa(rn
->p
.u
.prefix4
));
9867 /* Router Dead Interval print. */
9868 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
9870 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
) {
9871 vty_out(vty
, " ip ospf dead-interval ");
9874 if (OSPF_IF_PARAM_CONFIGURED(params
,
9877 "minimal hello-multiplier %d",
9878 params
->fast_hello
);
9880 vty_out(vty
, "%u", params
->v_wait
);
9882 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9884 inet_ntoa(rn
->p
.u
.prefix4
));
9888 /* Router Priority print. */
9889 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
9891 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
9892 vty_out(vty
, " ip ospf priority %u",
9894 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9896 inet_ntoa(rn
->p
.u
.prefix4
));
9900 /* Retransmit Interval print. */
9901 if (OSPF_IF_PARAM_CONFIGURED(params
,
9902 retransmit_interval
)
9903 && params
->retransmit_interval
9904 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
9905 vty_out(vty
, " ip ospf retransmit-interval %u",
9906 params
->retransmit_interval
);
9907 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9909 inet_ntoa(rn
->p
.u
.prefix4
));
9913 /* Transmit Delay print. */
9914 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
9915 && params
->transmit_delay
9916 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
9917 vty_out(vty
, " ip ospf transmit-delay %u",
9918 params
->transmit_delay
);
9919 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9921 inet_ntoa(rn
->p
.u
.prefix4
));
9926 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9927 if (ospf
&& ospf
->instance
)
9928 vty_out(vty
, " ip ospf %d",
9931 vty_out(vty
, " ip ospf");
9933 char buf
[INET_ADDRSTRLEN
];
9935 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
9936 params
->if_area_id_fmt
);
9937 vty_out(vty
, " area %s", buf
);
9938 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9940 inet_ntoa(rn
->p
.u
.prefix4
));
9945 if (params
&& params
->bfd_info
)
9946 ospf_bfd_write_config(vty
, params
);
9948 /* MTU ignore print. */
9949 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
9950 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
9951 if (params
->mtu_ignore
== 0)
9952 vty_out(vty
, " no ip ospf mtu-ignore");
9954 vty_out(vty
, " ip ospf mtu-ignore");
9955 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9957 inet_ntoa(rn
->p
.u
.prefix4
));
9964 rn
= route_top(IF_OIFS_PARAMS(ifp
));
9966 rn
= route_next(rn
);
9976 ospf_opaque_config_write_if(vty
, ifp
);
9978 vty_endframe(vty
, NULL
);
9984 /* Configuration write function for ospfd. */
9985 static int config_write_interface(struct vty
*vty
)
9988 struct vrf
*vrf
= NULL
;
9990 /* Display all VRF aware OSPF interface configuration */
9991 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
9992 write
+= config_write_interface_one(vty
, vrf
);
9998 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
10000 struct route_node
*rn
;
10001 uint8_t buf
[INET_ADDRSTRLEN
];
10003 /* `network area' print. */
10004 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
10006 struct ospf_network
*n
= rn
->info
;
10008 /* Create Area ID string by specified Area ID format. */
10009 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
10010 inet_ntop(AF_INET
, &n
->area_id
, (char *)buf
,
10013 sprintf((char *)buf
, "%lu",
10014 (unsigned long int)ntohl(
10015 n
->area_id
.s_addr
));
10017 /* Network print. */
10018 vty_out(vty
, " network %s/%d area %s\n",
10019 inet_ntoa(rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
10026 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
10028 struct listnode
*node
;
10029 struct ospf_area
*area
;
10030 uint8_t buf
[INET_ADDRSTRLEN
];
10032 /* Area configuration print. */
10033 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
10034 struct route_node
*rn1
;
10036 area_id2str((char *)buf
, sizeof(buf
), &area
->area_id
,
10037 area
->area_id_fmt
);
10039 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
10040 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
10041 vty_out(vty
, " area %s authentication\n", buf
);
10044 " area %s authentication message-digest\n",
10048 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
10049 vty_out(vty
, " area %s shortcut %s\n", buf
,
10050 ospf_shortcut_mode_str
10051 [area
->shortcut_configured
]);
10053 if ((area
->external_routing
== OSPF_AREA_STUB
)
10054 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
10055 if (area
->external_routing
== OSPF_AREA_STUB
) {
10056 vty_out(vty
, " area %s stub", buf
);
10057 if (area
->no_summary
)
10058 vty_out(vty
, " no-summary\n");
10059 vty_out(vty
, "\n");
10060 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
10061 switch (area
->NSSATranslatorRole
) {
10062 case OSPF_NSSA_ROLE_NEVER
:
10064 " area %s nssa translate-never\n",
10067 case OSPF_NSSA_ROLE_ALWAYS
:
10069 " area %s nssa translate-always\n",
10072 case OSPF_NSSA_ROLE_CANDIDATE
:
10073 vty_out(vty
, " area %s nssa \n", buf
);
10076 if (area
->no_summary
)
10078 " area %s nssa no-summary\n",
10082 if (area
->default_cost
!= 1)
10083 vty_out(vty
, " area %s default-cost %d\n", buf
,
10084 area
->default_cost
);
10087 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
10089 struct ospf_area_range
*range
= rn1
->info
;
10091 vty_out(vty
, " area %s range %s/%d", buf
,
10092 inet_ntoa(rn1
->p
.u
.prefix4
),
10095 if (range
->cost_config
10096 != OSPF_AREA_RANGE_COST_UNSPEC
)
10097 vty_out(vty
, " cost %d",
10098 range
->cost_config
);
10100 if (!CHECK_FLAG(range
->flags
,
10101 OSPF_AREA_RANGE_ADVERTISE
))
10102 vty_out(vty
, " not-advertise");
10104 if (CHECK_FLAG(range
->flags
,
10105 OSPF_AREA_RANGE_SUBSTITUTE
))
10106 vty_out(vty
, " substitute %s/%d",
10107 inet_ntoa(range
->subst_addr
),
10108 range
->subst_masklen
);
10110 vty_out(vty
, "\n");
10113 if (EXPORT_NAME(area
))
10114 vty_out(vty
, " area %s export-list %s\n", buf
,
10115 EXPORT_NAME(area
));
10117 if (IMPORT_NAME(area
))
10118 vty_out(vty
, " area %s import-list %s\n", buf
,
10119 IMPORT_NAME(area
));
10121 if (PREFIX_NAME_IN(area
))
10122 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
10123 PREFIX_NAME_IN(area
));
10125 if (PREFIX_NAME_OUT(area
))
10126 vty_out(vty
, " area %s filter-list prefix %s out\n",
10127 buf
, PREFIX_NAME_OUT(area
));
10133 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
10135 struct ospf_nbr_nbma
*nbr_nbma
;
10136 struct route_node
*rn
;
10138 /* Static Neighbor configuration print. */
10139 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
10140 if ((nbr_nbma
= rn
->info
)) {
10141 vty_out(vty
, " neighbor %s", inet_ntoa(nbr_nbma
->addr
));
10143 if (nbr_nbma
->priority
10144 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
10145 vty_out(vty
, " priority %d",
10146 nbr_nbma
->priority
);
10148 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
10149 vty_out(vty
, " poll-interval %d",
10152 vty_out(vty
, "\n");
10158 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
10160 struct listnode
*node
;
10161 struct ospf_vl_data
*vl_data
;
10162 char buf
[INET_ADDRSTRLEN
];
10164 /* Virtual-Link print */
10165 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
10166 struct listnode
*n2
;
10167 struct crypt_key
*ck
;
10168 struct ospf_interface
*oi
;
10170 if (vl_data
!= NULL
) {
10171 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
10172 vl_data
->vl_area_id_fmt
);
10173 oi
= vl_data
->vl_oi
;
10176 if (OSPF_IF_PARAM(oi
, v_hello
)
10177 != OSPF_HELLO_INTERVAL_DEFAULT
10178 || OSPF_IF_PARAM(oi
, v_wait
)
10179 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10180 || OSPF_IF_PARAM(oi
, retransmit_interval
)
10181 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10182 || OSPF_IF_PARAM(oi
, transmit_delay
)
10183 != OSPF_TRANSMIT_DELAY_DEFAULT
)
10185 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10186 buf
, inet_ntoa(vl_data
->vl_peer
),
10187 OSPF_IF_PARAM(oi
, v_hello
),
10188 OSPF_IF_PARAM(oi
, retransmit_interval
),
10189 OSPF_IF_PARAM(oi
, transmit_delay
),
10190 OSPF_IF_PARAM(oi
, v_wait
));
10192 vty_out(vty
, " area %s virtual-link %s\n", buf
,
10193 inet_ntoa(vl_data
->vl_peer
));
10195 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
10198 " area %s virtual-link %s authentication-key %s\n",
10199 buf
, inet_ntoa(vl_data
->vl_peer
),
10200 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10203 for (ALL_LIST_ELEMENTS_RO(
10204 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10208 " area %s virtual-link %s"
10209 " message-digest-key %d md5 %s\n",
10210 buf
, inet_ntoa(vl_data
->vl_peer
),
10211 ck
->key_id
, ck
->auth_key
);
10219 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
10223 /* redistribute print. */
10224 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
10225 struct list
*red_list
;
10226 struct listnode
*node
;
10227 struct ospf_redist
*red
;
10229 red_list
= ospf
->redist
[type
];
10233 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
10234 vty_out(vty
, " redistribute %s",
10235 zebra_route_string(type
));
10237 vty_out(vty
, " %d", red
->instance
);
10239 if (red
->dmetric
.value
>= 0)
10240 vty_out(vty
, " metric %d", red
->dmetric
.value
);
10242 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10243 vty_out(vty
, " metric-type 1");
10245 if (ROUTEMAP_NAME(red
))
10246 vty_out(vty
, " route-map %s",
10247 ROUTEMAP_NAME(red
));
10249 vty_out(vty
, "\n");
10256 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
10258 if (ospf
->default_metric
!= -1)
10259 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
10263 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
10266 struct ospf_redist
*red
;
10269 /* distribute-list print. */
10270 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
10271 if (DISTRIBUTE_NAME(ospf
, type
))
10272 vty_out(vty
, " distribute-list %s out %s\n",
10273 DISTRIBUTE_NAME(ospf
, type
),
10274 zebra_route_string(type
));
10276 /* default-information print. */
10277 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
10278 vty_out(vty
, " default-information originate");
10279 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
10280 vty_out(vty
, " always");
10282 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
10284 if (red
->dmetric
.value
>= 0)
10285 vty_out(vty
, " metric %d",
10286 red
->dmetric
.value
);
10288 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10289 vty_out(vty
, " metric-type 1");
10291 if (ROUTEMAP_NAME(red
))
10292 vty_out(vty
, " route-map %s",
10293 ROUTEMAP_NAME(red
));
10296 vty_out(vty
, "\n");
10303 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
10305 struct route_node
*rn
;
10306 struct ospf_distance
*odistance
;
10308 if (ospf
->distance_all
)
10309 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
10311 if (ospf
->distance_intra
|| ospf
->distance_inter
10312 || ospf
->distance_external
) {
10313 vty_out(vty
, " distance ospf");
10315 if (ospf
->distance_intra
)
10316 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
10317 if (ospf
->distance_inter
)
10318 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
10319 if (ospf
->distance_external
)
10320 vty_out(vty
, " external %d", ospf
->distance_external
);
10322 vty_out(vty
, "\n");
10325 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
10326 if ((odistance
= rn
->info
) != NULL
) {
10327 vty_out(vty
, " distance %d %s/%d %s\n",
10328 odistance
->distance
, inet_ntoa(rn
->p
.u
.prefix4
),
10330 odistance
->access_list
? odistance
->access_list
10336 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
10338 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10339 struct interface
*ifp
;
10340 struct ospf_interface
*oi
;
10341 struct listnode
*node
= NULL
;
10344 /* `router ospf' print. */
10345 if (ospf
->instance
&& ospf
->name
) {
10346 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
10348 } else if (ospf
->instance
) {
10349 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
10350 } else if (ospf
->name
) {
10351 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
10353 vty_out(vty
, "router ospf\n");
10355 if (!ospf
->networks
) {
10360 /* Router ID print. */
10361 if (ospf
->router_id_static
.s_addr
!= 0)
10362 vty_out(vty
, " ospf router-id %s\n",
10363 inet_ntoa(ospf
->router_id_static
));
10365 /* ABR type print. */
10366 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
10367 vty_out(vty
, " ospf abr-type %s\n",
10368 ospf_abr_type_str
[ospf
->abr_type
]);
10370 /* log-adjacency-changes flag print. */
10371 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
10372 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
10373 vty_out(vty
, " log-adjacency-changes detail\n");
10374 else if (!SAVE_OSPF_LOG_ADJACENCY_CHANGES
)
10375 vty_out(vty
, " log-adjacency-changes\n");
10376 } else if (SAVE_OSPF_LOG_ADJACENCY_CHANGES
) {
10377 vty_out(vty
, " no log-adjacency-changes\n");
10380 /* RFC1583 compatibility flag print -- Compatible with CISCO
10382 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
10383 vty_out(vty
, " compatible rfc1583\n");
10385 /* auto-cost reference-bandwidth configuration. */
10386 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
10388 "! Important: ensure reference bandwidth "
10389 "is consistent across all routers\n");
10390 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
10391 ospf
->ref_bandwidth
);
10394 /* SPF timers print. */
10395 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
10396 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
10397 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
10398 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
10399 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
10401 /* LSA timers print. */
10402 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
10403 vty_out(vty
, " timers throttle lsa all %d\n",
10404 ospf
->min_ls_interval
);
10405 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
10406 vty_out(vty
, " timers lsa min-arrival %d\n",
10407 ospf
->min_ls_arrival
);
10409 /* Write multiplier print. */
10410 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
10411 vty_out(vty
, " ospf write-multiplier %d\n",
10412 ospf
->write_oi_count
);
10414 /* Max-metric router-lsa print */
10415 config_write_stub_router(vty
, ospf
);
10417 /* SPF refresh parameters print. */
10418 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
10419 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
10421 /* Redistribute information print. */
10422 config_write_ospf_redistribute(vty
, ospf
);
10424 /* passive-interface print. */
10425 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
10426 vty_out(vty
, " passive-interface default\n");
10428 FOR_ALL_INTERFACES (vrf
, ifp
)
10429 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
10431 && IF_DEF_PARAMS(ifp
)->passive_interface
10432 != ospf
->passive_interface_default
) {
10433 vty_out(vty
, " %spassive-interface %s\n",
10434 IF_DEF_PARAMS(ifp
)->passive_interface
? ""
10438 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10439 if (!OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
10441 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi
->ifp
),
10442 passive_interface
)) {
10443 if (oi
->params
->passive_interface
10444 == IF_DEF_PARAMS(oi
->ifp
)->passive_interface
)
10446 } else if (oi
->params
->passive_interface
10447 == ospf
->passive_interface_default
)
10450 vty_out(vty
, " %spassive-interface %s %s\n",
10451 oi
->params
->passive_interface
? "" : "no ",
10452 oi
->ifp
->name
, inet_ntoa(oi
->address
->u
.prefix4
));
10455 /* Network area print. */
10456 config_write_network_area(vty
, ospf
);
10458 /* Area config print. */
10459 config_write_ospf_area(vty
, ospf
);
10461 /* static neighbor print. */
10462 config_write_ospf_nbr_nbma(vty
, ospf
);
10464 /* Virtual-Link print. */
10465 config_write_virtual_link(vty
, ospf
);
10467 /* Default metric configuration. */
10468 config_write_ospf_default_metric(vty
, ospf
);
10470 /* Distribute-list and default-information print. */
10471 config_write_ospf_distribute(vty
, ospf
);
10473 /* Distance configuration. */
10474 config_write_ospf_distance(vty
, ospf
);
10476 ospf_opaque_config_write_router(vty
, ospf
);
10482 /* OSPF configuration write function. */
10483 static int ospf_config_write(struct vty
*vty
)
10486 struct listnode
*ospf_node
= NULL
;
10489 if (listcount(om
->ospf
) == 0)
10492 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
10493 /* VRF Default check if it is running.
10494 * Upon daemon start, there could be default instance
10495 * in absence of 'router ospf'/oi_running is disabled. */
10496 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
10497 write
+= ospf_config_write_one(vty
, ospf
);
10498 /* For Non-Default VRF simply display the configuration,
10499 * even if it is not oi_running. */
10500 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
10501 write
+= ospf_config_write_one(vty
, ospf
);
10506 void ospf_vty_show_init(void)
10508 /* "show ip ospf" commands. */
10509 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
10511 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
10513 /* "show ip ospf database" commands. */
10514 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
10516 install_element(VIEW_NODE
,
10517 &show_ip_ospf_instance_database_type_adv_router_cmd
);
10518 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
10519 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
10521 /* "show ip ospf interface" commands. */
10522 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
10524 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
10525 /* "show ip ospf interface traffic */
10526 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
10528 /* "show ip ospf neighbor" commands. */
10529 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
10530 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
10531 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
10532 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
10533 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
10534 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
10535 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
10537 install_element(VIEW_NODE
,
10538 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
10539 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
10540 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
10541 install_element(VIEW_NODE
,
10542 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
10543 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
10544 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
10545 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
10547 /* "show ip ospf route" commands. */
10548 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
10549 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
10551 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
10552 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
10554 /* "show ip ospf vrfs" commands. */
10555 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
10559 /* ospfd's interface node. */
10560 static struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
10562 /* Initialization of OSPF interface. */
10563 static void ospf_vty_if_init(void)
10565 /* Install interface node. */
10566 install_node(&interface_node
, config_write_interface
);
10569 /* "ip ospf authentication" commands. */
10570 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
10571 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
10572 install_element(INTERFACE_NODE
,
10573 &no_ip_ospf_authentication_args_addr_cmd
);
10574 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
10575 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
10576 install_element(INTERFACE_NODE
,
10577 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
10578 install_element(INTERFACE_NODE
,
10579 &no_ospf_authentication_key_authkey_addr_cmd
);
10581 /* "ip ospf message-digest-key" commands. */
10582 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
10583 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
10585 /* "ip ospf cost" commands. */
10586 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
10587 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
10589 /* "ip ospf mtu-ignore" commands. */
10590 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
10591 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
10593 /* "ip ospf dead-interval" commands. */
10594 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
10595 install_element(INTERFACE_NODE
,
10596 &ip_ospf_dead_interval_minimal_addr_cmd
);
10597 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
10599 /* "ip ospf hello-interval" commands. */
10600 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
10601 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
10603 /* "ip ospf network" commands. */
10604 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
10605 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
10607 /* "ip ospf priority" commands. */
10608 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
10609 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
10611 /* "ip ospf retransmit-interval" commands. */
10612 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
10613 install_element(INTERFACE_NODE
,
10614 &no_ip_ospf_retransmit_interval_addr_cmd
);
10616 /* "ip ospf transmit-delay" commands. */
10617 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
10618 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
10620 /* "ip ospf area" commands. */
10621 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
10622 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
10624 /* These commands are compatibitliy for previous version. */
10625 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
10626 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
10627 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
10628 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
10629 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
10630 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
10631 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
10632 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
10633 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
10634 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
10635 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
10636 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
10637 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
10638 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
10639 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
10640 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
10641 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
10644 static void ospf_vty_zebra_init(void)
10646 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
10647 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
10648 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
10649 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
10651 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
10652 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
10654 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
10655 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
10657 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
10658 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
10660 install_element(OSPF_NODE
, &ospf_distance_cmd
);
10661 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
10662 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
10663 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
10665 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
10666 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
10667 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
10668 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
10672 static struct cmd_node ospf_node
= {OSPF_NODE
, "%s(config-router)# ", 1};
10674 static void ospf_interface_clear(struct interface
*ifp
)
10676 if (!if_is_operative(ifp
))
10679 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
10680 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
10682 ospf_if_reset(ifp
);
10685 DEFUN (clear_ip_ospf_interface
,
10686 clear_ip_ospf_interface_cmd
,
10687 "clear ip ospf [vrf NAME] interface [IFNAME]",
10690 "OSPF information\n"
10692 "Interface information\n"
10693 "Interface name\n")
10695 int idx_ifname
= 0;
10697 struct interface
*ifp
;
10698 struct listnode
*node
;
10699 struct ospf
*ospf
= NULL
;
10700 char *vrf_name
= NULL
;
10701 vrf_id_t vrf_id
= VRF_DEFAULT
;
10702 struct vrf
*vrf
= NULL
;
10704 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
10705 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
10706 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
10709 vrf
= vrf_lookup_by_name(vrf_name
);
10711 vrf_id
= vrf
->vrf_id
;
10713 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
10714 /* Clear all the ospfv2 interfaces. */
10715 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10716 if (vrf_id
!= ospf
->vrf_id
)
10719 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10720 FOR_ALL_INTERFACES (vrf
, ifp
)
10721 ospf_interface_clear(ifp
);
10724 /* Interface name is specified. */
10725 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
10727 vty_out(vty
, "No such interface name\n");
10729 ospf_interface_clear(ifp
);
10732 return CMD_SUCCESS
;
10735 void ospf_vty_clear_init(void)
10737 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
10741 /* Install OSPF related vty commands. */
10742 void ospf_vty_init(void)
10744 /* Install ospf top node. */
10745 install_node(&ospf_node
, ospf_config_write
);
10747 /* "router ospf" commands. */
10748 install_element(CONFIG_NODE
, &router_ospf_cmd
);
10749 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
10752 install_default(OSPF_NODE
);
10754 /* "ospf router-id" commands. */
10755 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
10756 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
10757 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
10759 /* "passive-interface" commands. */
10760 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
10761 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
10763 /* "ospf abr-type" commands. */
10764 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
10765 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
10767 /* "ospf log-adjacency-changes" commands. */
10768 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
10769 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
10770 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
10771 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
10773 /* "ospf rfc1583-compatible" commands. */
10774 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
10775 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
10776 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
10777 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
10779 /* "network area" commands. */
10780 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
10781 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
10783 /* "area authentication" commands. */
10784 install_element(OSPF_NODE
,
10785 &ospf_area_authentication_message_digest_cmd
);
10786 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
10787 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
10789 /* "area range" commands. */
10790 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
10791 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
10792 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
10793 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
10794 install_element(OSPF_NODE
, &ospf_area_range_substitute_cmd
);
10795 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
10797 /* "area virtual-link" commands. */
10798 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
10799 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
10800 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
10801 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
10804 /* "area stub" commands. */
10805 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
10806 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
10807 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
10808 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
10810 /* "area nssa" commands. */
10811 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
10812 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
10813 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
10814 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
10815 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
10817 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
10818 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
10820 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
10821 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
10823 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
10824 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
10826 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
10827 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
10829 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
10830 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
10832 /* SPF timer commands */
10833 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
10834 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
10836 /* LSA timers commands */
10837 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
10838 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
10839 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
10840 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
10842 /* refresh timer commands */
10843 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
10844 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
10846 /* max-metric commands */
10847 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
10848 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
10849 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
10850 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
10851 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
10852 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
10854 /* reference bandwidth commands */
10855 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
10856 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
10858 /* "neighbor" commands. */
10859 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
10860 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
10861 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
10862 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
10864 /* write multiplier commands */
10865 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
10866 install_element(OSPF_NODE
, &write_multiplier_cmd
);
10867 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
10868 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
10870 /* Init interface related vty commands. */
10871 ospf_vty_if_init();
10873 /* Init zebra related vty commands. */
10874 ospf_vty_zebra_init();