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
== 0) {
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
== 0)
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
== 0)
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
&& nbr
->router_id
.s_addr
== 0)
4912 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
4914 strlcpy(neigh_str
, inet_ntoa(nbr
->router_id
),
4917 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
4919 if (!json_neigh_array
) {
4920 json_neigh_array
= json_object_new_array();
4921 json_object_object_add(json
, neigh_str
,
4925 json_neigh
= json_object_new_object();
4928 /* Show neighbor ID. */
4929 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4930 vty_out(vty
, " Neighbor %s,", "-");
4932 vty_out(vty
, " Neighbor %s,",
4933 inet_ntoa(nbr
->router_id
));
4936 /* Show interface address. */
4938 json_object_string_add(json_neigh
, "ifaceAddress",
4939 inet_ntoa(nbr
->address
.u
.prefix4
));
4941 vty_out(vty
, " interface address %s\n",
4942 inet_ntoa(nbr
->address
.u
.prefix4
));
4946 json_object_string_add(json_neigh
, "areaId",
4947 ospf_area_desc_string(oi
->area
));
4948 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
4950 vty_out(vty
, " In the area %s via interface %s\n",
4951 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
4953 /* Show neighbor priority and state. */
4955 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
4956 json_object_string_add(
4957 json_neigh
, "nbrState",
4958 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4960 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4962 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4964 /* Show state changes. */
4966 json_object_int_add(json_neigh
, "stateChangeCounter",
4969 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
4971 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
4976 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4978 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
4982 " Most recent state change statistics:\n");
4983 vty_out(vty
, " Progressive change %s ago\n",
4984 ospf_timeval_dump(&res
, timebuf
,
4989 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
4994 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4996 json_object_int_add(json_neigh
,
4997 "lastRegressiveChangeMsec",
4999 if (nbr
->last_regress_str
)
5000 json_object_string_add(
5002 "lastRegressiveChangeReason",
5003 nbr
->last_regress_str
);
5006 " Regressive change %s ago, due to %s\n",
5007 ospf_timeval_dump(&res
, timebuf
,
5009 (nbr
->last_regress_str
? nbr
->last_regress_str
5014 /* Show Designated Rotuer ID. */
5016 json_object_string_add(json_neigh
, "routerDesignatedId",
5017 inet_ntoa(nbr
->d_router
));
5019 vty_out(vty
, " DR is %s,", inet_ntoa(nbr
->d_router
));
5021 /* Show Backup Designated Rotuer ID. */
5023 json_object_string_add(json_neigh
, "routerDesignatedBackupId",
5024 inet_ntoa(nbr
->bd_router
));
5026 vty_out(vty
, " BDR is %s\n", inet_ntoa(nbr
->bd_router
));
5030 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5031 json_object_string_add(json_neigh
, "optionsList",
5032 ospf_options_dump(nbr
->options
));
5034 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5035 ospf_options_dump(nbr
->options
));
5037 /* Show Router Dead interval timer. */
5039 if (nbr
->t_inactivity
) {
5041 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5044 json_object_int_add(json_neigh
,
5045 "routerDeadIntervalTimerDueMsec",
5048 json_object_int_add(
5050 "routerDeadIntervalTimerDueMsec", -1);
5052 vty_out(vty
, " Dead timer due in %s\n",
5053 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5056 /* Show Database Summary list. */
5058 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5059 ospf_db_summary_count(nbr
));
5061 vty_out(vty
, " Database Summary List %d\n",
5062 ospf_db_summary_count(nbr
));
5064 /* Show Link State Request list. */
5066 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5067 ospf_ls_request_count(nbr
));
5069 vty_out(vty
, " Link State Request List %ld\n",
5070 ospf_ls_request_count(nbr
));
5072 /* Show Link State Retransmission list. */
5074 json_object_int_add(json_neigh
,
5075 "linkStateRetransmissionListCounter",
5076 ospf_ls_retransmit_count(nbr
));
5078 vty_out(vty
, " Link State Retransmission List %ld\n",
5079 ospf_ls_retransmit_count(nbr
));
5081 /* Show inactivity timer thread. */
5083 if (nbr
->t_inactivity
!= NULL
)
5084 json_object_string_add(json_neigh
,
5085 "threadInactivityTimer", "on");
5087 vty_out(vty
, " Thread Inactivity Timer %s\n",
5088 nbr
->t_inactivity
!= NULL
? "on" : "off");
5090 /* Show Database Description retransmission thread. */
5092 if (nbr
->t_db_desc
!= NULL
)
5093 json_object_string_add(
5095 "threadDatabaseDescriptionRetransmission",
5099 " Thread Database Description Retransmision %s\n",
5100 nbr
->t_db_desc
!= NULL
? "on" : "off");
5102 /* Show Link State Request Retransmission thread. */
5104 if (nbr
->t_ls_req
!= NULL
)
5105 json_object_string_add(
5107 "threadLinkStateRequestRetransmission", "on");
5110 " Thread Link State Request Retransmission %s\n",
5111 nbr
->t_ls_req
!= NULL
? "on" : "off");
5113 /* Show Link State Update Retransmission thread. */
5115 if (nbr
->t_ls_upd
!= NULL
)
5116 json_object_string_add(
5118 "threadLinkStateUpdateRetransmission",
5122 " Thread Link State Update Retransmission %s\n\n",
5123 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5125 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json_neigh
, use_json
, 0);
5128 json_object_array_add(json_neigh_array
, json_neigh
);
5132 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5133 struct in_addr
*router_id
,
5134 bool use_json
, uint8_t use_vrf
)
5136 struct listnode
*node
;
5137 struct ospf_neighbor
*nbr
;
5138 struct ospf_interface
*oi
;
5139 json_object
*json
= NULL
;
5142 json
= json_object_new_object();
5144 if (ospf
->instance
) {
5146 json_object_int_add(json
, "ospfInstance",
5149 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5152 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5154 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5155 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
))) {
5156 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5162 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5163 json
, JSON_C_TO_STRING_PRETTY
));
5164 json_object_free(json
);
5171 DEFPY (show_ip_ospf_neighbor_id
,
5172 show_ip_ospf_neighbor_id_cmd
,
5173 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
5176 "OSPF information\n"
5182 struct listnode
*node
;
5183 int ret
= CMD_SUCCESS
;
5185 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5186 if (!ospf
->oi_running
)
5188 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5195 DEFPY (show_ip_ospf_instance_neighbor_id
,
5196 show_ip_ospf_instance_neighbor_id_cmd
,
5197 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
5200 "OSPF information\n"
5208 ospf
= ospf_lookup_instance(instance
);
5210 return CMD_NOT_MY_INSTANCE
;
5212 if (!ospf
->oi_running
)
5215 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
,
5219 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5221 json_object
*json
, bool use_json
,
5224 struct ospf_interface
*oi
;
5225 struct listnode
*node
;
5226 json_object
*json_vrf
= NULL
;
5227 json_object
*json_nbr_sub
= NULL
;
5231 json_vrf
= json_object_new_object();
5235 json_nbr_sub
= json_object_new_object();
5238 if (ospf
->instance
) {
5240 json_object_int_add(json
, "ospfInstance",
5243 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5246 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5248 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5249 struct route_node
*rn
;
5250 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5252 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5253 if ((nbr
= rn
->info
)) {
5254 if (nbr
!= oi
->nbr_self
) {
5255 if (nbr
->state
!= NSM_Down
) {
5256 show_ip_ospf_neighbor_detail_sub(
5257 vty
, oi
, nbr
, prev_nbr
,
5258 json_nbr_sub
, use_json
);
5267 json_object_object_add(json_vrf
, "neighbors",
5270 if (ospf
->vrf_id
== VRF_DEFAULT
)
5271 json_object_object_add(json
, "default",
5274 json_object_object_add(json
, ospf
->name
,
5283 DEFUN (show_ip_ospf_neighbor_detail
,
5284 show_ip_ospf_neighbor_detail_cmd
,
5285 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5288 "OSPF information\n"
5292 "detail of all neighbors\n"
5296 bool uj
= use_json(argc
, argv
);
5297 struct listnode
*node
= NULL
;
5298 char *vrf_name
= NULL
;
5299 bool all_vrf
= false;
5300 int ret
= CMD_SUCCESS
;
5303 uint8_t use_vrf
= 0;
5304 json_object
*json
= NULL
;
5306 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5309 json
= json_object_new_object();
5311 /* vrf input is provided could be all or specific vrf*/
5315 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5316 if (!ospf
->oi_running
)
5318 ret
= show_ip_ospf_neighbor_detail_common(
5319 vty
, ospf
, json
, uj
, use_vrf
);
5322 vty_out(vty
, "%s\n",
5323 json_object_to_json_string_ext(
5324 json
, JSON_C_TO_STRING_PRETTY
));
5325 json_object_free(json
);
5330 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5331 if (ospf
== NULL
|| !ospf
->oi_running
) {
5333 json_object_free(json
);
5337 /* Display default ospf (instance 0) info */
5338 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5339 if (ospf
== NULL
|| !ospf
->oi_running
) {
5341 json_object_free(json
);
5347 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5350 vty_out(vty
, "%s\n",
5351 json_object_to_json_string_ext(
5352 json
, JSON_C_TO_STRING_PRETTY
));
5357 json_object_free(json
);
5362 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5363 show_ip_ospf_instance_neighbor_detail_cmd
,
5364 "show ip ospf (1-65535) neighbor detail [json]",
5367 "OSPF information\n"
5370 "detail of all neighbors\n"
5375 unsigned short instance
= 0;
5376 bool uj
= use_json(argc
, argv
);
5377 json_object
*json
= NULL
;
5378 int ret
= CMD_SUCCESS
;
5380 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5381 ospf
= ospf_lookup_instance(instance
);
5383 return CMD_NOT_MY_INSTANCE
;
5385 if (!ospf
->oi_running
)
5389 json
= json_object_new_object();
5391 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5394 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5395 json
, JSON_C_TO_STRING_PRETTY
));
5396 json_object_free(json
);
5402 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5408 struct listnode
*node
;
5409 struct ospf_interface
*oi
;
5410 json_object
*json_vrf
= NULL
;
5414 json_vrf
= json_object_new_object();
5419 if (ospf
->instance
) {
5421 json_object_int_add(json
, "ospfInstance",
5424 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5427 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5429 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5430 struct route_node
*rn
;
5431 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5432 struct ospf_nbr_nbma
*nbr_nbma
;
5434 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5435 if ((nbr
= rn
->info
)) {
5436 if (nbr
!= oi
->nbr_self
)
5437 if (nbr
->state
!= NSM_Down
)
5438 show_ip_ospf_neighbor_detail_sub(
5441 json_vrf
, use_json
);
5446 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5447 struct listnode
*nd
;
5449 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5450 if (nbr_nbma
->nbr
== NULL
5451 || nbr_nbma
->nbr
->state
== NSM_Down
)
5452 show_ip_ospf_nbr_nbma_detail_sub(
5453 vty
, oi
, nbr_nbma
, use_json
,
5461 if (ospf
->vrf_id
== VRF_DEFAULT
)
5462 json_object_object_add(json
, "default",
5465 json_object_object_add(json
, ospf
->name
,
5475 DEFUN (show_ip_ospf_neighbor_detail_all
,
5476 show_ip_ospf_neighbor_detail_all_cmd
,
5477 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5480 "OSPF information\n"
5484 "detail of all neighbors\n"
5485 "include down status neighbor\n"
5489 bool uj
= use_json(argc
, argv
);
5490 struct listnode
*node
= NULL
;
5491 char *vrf_name
= NULL
;
5492 bool all_vrf
= false;
5493 int ret
= CMD_SUCCESS
;
5496 uint8_t use_vrf
= 0;
5497 json_object
*json
= NULL
;
5499 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5502 json
= json_object_new_object();
5504 /* vrf input is provided could be all or specific vrf*/
5508 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5509 if (!ospf
->oi_running
)
5511 ret
= show_ip_ospf_neighbor_detail_all_common(
5512 vty
, ospf
, json
, uj
, use_vrf
);
5516 vty_out(vty
, "%s\n",
5517 json_object_to_json_string_ext(
5518 json
, JSON_C_TO_STRING_PRETTY
));
5519 json_object_free(json
);
5524 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5525 if (ospf
== NULL
|| !ospf
->oi_running
) {
5527 json_object_free(json
);
5531 /* Display default ospf (instance 0) info */
5532 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5533 if (ospf
== NULL
|| !ospf
->oi_running
) {
5535 json_object_free(json
);
5541 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5544 vty_out(vty
, "%s\n",
5545 json_object_to_json_string_ext(
5546 json
, JSON_C_TO_STRING_PRETTY
));
5551 json_object_free(json
);
5556 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5557 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5558 "show ip ospf (1-65535) neighbor detail all [json]",
5561 "OSPF information\n"
5564 "detail of all neighbors\n"
5565 "include down status neighbor\n"
5570 unsigned short instance
= 0;
5571 bool uj
= use_json(argc
, argv
);
5572 json_object
*json
= NULL
;
5573 int ret
= CMD_SUCCESS
;
5575 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5576 ospf
= ospf_lookup_instance(instance
);
5578 return CMD_NOT_MY_INSTANCE
;
5580 if (!ospf
->oi_running
)
5584 json
= json_object_new_object();
5586 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5589 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5590 json
, JSON_C_TO_STRING_PRETTY
));
5591 json_object_free(json
);
5597 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5600 struct cmd_token
**argv
,
5603 struct ospf_interface
*oi
;
5604 struct interface
*ifp
;
5605 struct route_node
*rn
, *nrn
;
5606 struct ospf_neighbor
*nbr
;
5607 json_object
*json
= NULL
;
5610 json
= json_object_new_object();
5612 if (ospf
->instance
) {
5614 json_object_int_add(json
, "ospfInstance",
5617 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5620 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5623 vty_out(vty
, "No such interface.\n");
5625 vty_out(vty
, "{}\n");
5626 json_object_free(json
);
5631 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5632 if ((oi
= rn
->info
)) {
5633 for (nrn
= route_top(oi
->nbrs
); nrn
;
5634 nrn
= route_next(nrn
)) {
5635 if ((nbr
= nrn
->info
)) {
5636 if (nbr
!= oi
->nbr_self
) {
5637 if (nbr
->state
!= NSM_Down
)
5638 show_ip_ospf_neighbor_detail_sub(
5649 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5650 json
, JSON_C_TO_STRING_PRETTY
));
5651 json_object_free(json
);
5658 DEFUN (show_ip_ospf_neighbor_int_detail
,
5659 show_ip_ospf_neighbor_int_detail_cmd
,
5660 "show ip ospf neighbor IFNAME detail [json]",
5663 "OSPF information\n"
5666 "detail of all neighbors\n"
5670 bool uj
= use_json(argc
, argv
);
5671 struct listnode
*node
= NULL
;
5672 int ret
= CMD_SUCCESS
;
5673 bool ospf_output
= false;
5675 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5676 if (!ospf
->oi_running
)
5679 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5684 vty_out(vty
, "%% OSPF instance not found\n");
5689 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5690 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5691 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5694 "OSPF information\n"
5698 "detail of all neighbors\n"
5704 unsigned short instance
= 0;
5705 bool uj
= use_json(argc
, argv
);
5707 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5708 ospf
= ospf_lookup_instance(instance
);
5710 return CMD_NOT_MY_INSTANCE
;
5712 if (!ospf
->oi_running
)
5715 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5719 /* Show functions */
5720 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
5722 struct router_lsa
*rl
;
5723 struct summary_lsa
*sl
;
5724 struct as_external_lsa
*asel
;
5725 struct prefix_ipv4 p
;
5728 /* If self option is set, check LSA self flag. */
5729 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5730 /* LSA common part show. */
5731 vty_out(vty
, "%-15s ", inet_ntoa(lsa
->data
->id
));
5732 vty_out(vty
, "%-15s %4d 0x%08lx 0x%04x",
5733 inet_ntoa(lsa
->data
->adv_router
), LS_AGE(lsa
),
5734 (unsigned long)ntohl(lsa
->data
->ls_seqnum
),
5735 ntohs(lsa
->data
->checksum
));
5736 /* LSA specific part show. */
5737 switch (lsa
->data
->type
) {
5738 case OSPF_ROUTER_LSA
:
5739 rl
= (struct router_lsa
*)lsa
->data
;
5740 vty_out(vty
, " %-d", ntohs(rl
->links
));
5742 case OSPF_SUMMARY_LSA
:
5743 sl
= (struct summary_lsa
*)lsa
->data
;
5746 p
.prefix
= sl
->header
.id
;
5747 p
.prefixlen
= ip_masklen(sl
->mask
);
5748 apply_mask_ipv4(&p
);
5750 vty_out(vty
, " %s/%d", inet_ntoa(p
.prefix
),
5753 case OSPF_AS_EXTERNAL_LSA
:
5754 case OSPF_AS_NSSA_LSA
:
5755 asel
= (struct as_external_lsa
*)lsa
->data
;
5758 p
.prefix
= asel
->header
.id
;
5759 p
.prefixlen
= ip_masklen(asel
->mask
);
5760 apply_mask_ipv4(&p
);
5762 vty_out(vty
, " %s %s/%d [0x%lx]",
5763 IS_EXTERNAL_METRIC(asel
->e
[0].tos
)
5766 inet_ntoa(p
.prefix
), p
.prefixlen
,
5767 (unsigned long)ntohl(
5768 asel
->e
[0].route_tag
));
5770 case OSPF_NETWORK_LSA
:
5771 case OSPF_ASBR_SUMMARY_LSA
:
5772 case OSPF_OPAQUE_LINK_LSA
:
5773 case OSPF_OPAQUE_AREA_LSA
:
5774 case OSPF_OPAQUE_AS_LSA
:
5784 static const char *const show_database_desc
[] = {
5786 "Router Link States",
5788 "Summary Link States",
5789 "ASBR-Summary Link States",
5790 "AS External Link States",
5791 "Group Membership LSA",
5792 "NSSA-external Link States",
5794 "Link-Local Opaque-LSA",
5795 "Area-Local Opaque-LSA",
5796 "AS-external Opaque-LSA",
5799 static const char *const show_database_header
[] = {
5801 "Link ID ADV Router Age Seq# CkSum Link count",
5802 "Link ID ADV Router Age Seq# CkSum",
5803 "Link ID ADV Router Age Seq# CkSum Route",
5804 "Link ID ADV Router Age Seq# CkSum",
5805 "Link ID ADV Router Age Seq# CkSum Route",
5806 " --- header for Group Member ----",
5807 "Link ID ADV Router Age Seq# CkSum Route",
5809 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5810 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5811 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5814 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
)
5816 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
5818 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
5819 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
5820 ospf_options_dump(lsa
->data
->options
));
5821 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
5822 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)"
5825 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
5826 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
5829 vty_out(vty
, " :%s%s%s%s",
5830 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR" : "",
5831 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR" : "",
5832 IS_ROUTER_LSA_VIRTUAL(rlsa
) ? " VL-endpoint"
5834 IS_ROUTER_LSA_SHORTCUT(rlsa
) ? " Shortcut"
5839 vty_out(vty
, " LS Type: %s\n",
5840 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
5841 vty_out(vty
, " Link State ID: %s %s\n", inet_ntoa(lsa
->data
->id
),
5842 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
, NULL
));
5843 vty_out(vty
, " Advertising Router: %s\n",
5844 inet_ntoa(lsa
->data
->adv_router
));
5845 vty_out(vty
, " LS Seq Number: %08lx\n",
5846 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
5847 vty_out(vty
, " Checksum: 0x%04x\n", ntohs(lsa
->data
->checksum
));
5848 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
5851 static const char *const link_type_desc
[] = {
5853 "another Router (point-to-point)",
5854 "a Transit Network",
5859 static const char *const link_id_desc
[] = {
5860 "(null)", "Neighboring Router ID", "Designated Router address",
5861 "Net", "Neighboring Router ID",
5864 static const char *const link_data_desc
[] = {
5865 "(null)", "Router Interface address", "Router Interface address",
5866 "Network Mask", "Router Interface address",
5869 /* Show router-LSA each Link information. */
5870 static void show_ip_ospf_database_router_links(struct vty
*vty
,
5871 struct router_lsa
*rl
)
5876 len
= ntohs(rl
->header
.length
) - 4;
5877 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
5878 type
= rl
->link
[i
].type
;
5880 vty_out(vty
, " Link connected to: %s\n",
5881 link_type_desc
[type
]);
5882 vty_out(vty
, " (Link ID) %s: %s\n", link_id_desc
[type
],
5883 inet_ntoa(rl
->link
[i
].link_id
));
5884 vty_out(vty
, " (Link Data) %s: %s\n", link_data_desc
[type
],
5885 inet_ntoa(rl
->link
[i
].link_data
));
5886 vty_out(vty
, " Number of TOS metrics: 0\n");
5887 vty_out(vty
, " TOS 0 Metric: %d\n",
5888 ntohs(rl
->link
[i
].metric
));
5893 /* Show router-LSA detail information. */
5894 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5897 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
5899 show_ip_ospf_database_header(vty
, lsa
);
5901 vty_out(vty
, " Number of Links: %d\n\n", ntohs(rl
->links
));
5903 show_ip_ospf_database_router_links(vty
, rl
);
5910 /* Show network-LSA detail information. */
5911 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5916 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
5918 show_ip_ospf_database_header(vty
, lsa
);
5920 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(nl
->mask
));
5922 length
= ntohs(lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
5924 for (i
= 0; length
> 0; i
++, length
-= 4)
5925 vty_out(vty
, " Attached Router: %s\n",
5926 inet_ntoa(nl
->routers
[i
]));
5934 /* Show summary-LSA detail information. */
5935 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5938 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5940 show_ip_ospf_database_header(vty
, lsa
);
5942 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5943 vty_out(vty
, " TOS: 0 Metric: %d\n",
5944 GET_METRIC(sl
->metric
));
5951 /* Show summary-ASBR-LSA detail information. */
5952 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5955 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5957 show_ip_ospf_database_header(vty
, lsa
);
5959 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5960 vty_out(vty
, " TOS: 0 Metric: %d\n",
5961 GET_METRIC(sl
->metric
));
5968 /* Show AS-external-LSA detail information. */
5969 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5972 struct as_external_lsa
*al
=
5973 (struct as_external_lsa
*)lsa
->data
;
5975 show_ip_ospf_database_header(vty
, lsa
);
5977 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5978 vty_out(vty
, " Metric Type: %s\n",
5979 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5980 ? "2 (Larger than any link state path)"
5982 vty_out(vty
, " TOS: 0\n");
5983 vty_out(vty
, " Metric: %d\n",
5984 GET_METRIC(al
->e
[0].metric
));
5985 vty_out(vty
, " Forward Address: %s\n",
5986 inet_ntoa(al
->e
[0].fwd_addr
));
5989 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5990 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5997 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
5999 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
6001 /* show_ip_ospf_database_header (vty, lsa); */
6003 zlog_debug( " Network Mask: /%d%s",
6004 ip_masklen (al
->mask
), "\n");
6005 zlog_debug( " Metric Type: %s%s",
6006 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
6007 "2 (Larger than any link state path)" : "1", "\n");
6008 zlog_debug( " TOS: 0%s", "\n");
6009 zlog_debug( " Metric: %d%s",
6010 GET_METRIC (al
->e
[0].metric
), "\n");
6011 zlog_debug( " Forward Address: %s%s",
6012 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
6014 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
6015 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
6020 /* Show AS-NSSA-LSA detail information. */
6021 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6024 struct as_external_lsa
*al
=
6025 (struct as_external_lsa
*)lsa
->data
;
6027 show_ip_ospf_database_header(vty
, lsa
);
6029 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
6030 vty_out(vty
, " Metric Type: %s\n",
6031 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6032 ? "2 (Larger than any link state path)"
6034 vty_out(vty
, " TOS: 0\n");
6035 vty_out(vty
, " Metric: %d\n",
6036 GET_METRIC(al
->e
[0].metric
));
6037 vty_out(vty
, " NSSA: Forward Address: %s\n",
6038 inet_ntoa(al
->e
[0].fwd_addr
));
6041 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6042 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6048 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
)
6053 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6056 show_ip_ospf_database_header(vty
, lsa
);
6057 show_opaque_info_detail(vty
, lsa
);
6064 int (*const show_function
[])(struct vty
*, struct ospf_lsa
*) = {
6066 show_router_lsa_detail
,
6067 show_network_lsa_detail
,
6068 show_summary_lsa_detail
,
6069 show_summary_asbr_lsa_detail
,
6070 show_as_external_lsa_detail
,
6072 show_as_nssa_lsa_detail
, /* almost same as external */
6074 show_opaque_lsa_detail
,
6075 show_opaque_lsa_detail
,
6076 show_opaque_lsa_detail
,
6079 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6080 struct in_addr
*id
, struct in_addr
*adv_router
)
6082 memset(lp
, 0, sizeof(struct prefix_ls
));
6086 else if (adv_router
== NULL
) {
6092 lp
->adv_router
= *adv_router
;
6096 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6097 struct in_addr
*id
, struct in_addr
*adv_router
)
6099 struct prefix_ls lp
;
6100 struct route_node
*rn
, *start
;
6101 struct ospf_lsa
*lsa
;
6103 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6104 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6106 route_lock_node(start
);
6107 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6108 if ((lsa
= rn
->info
)) {
6109 if (show_function
[lsa
->data
->type
] != NULL
)
6110 show_function
[lsa
->data
->type
](vty
,
6113 route_unlock_node(start
);
6117 /* Show detail LSA information
6118 -- if id is NULL then show all LSAs. */
6119 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6120 struct in_addr
*id
, struct in_addr
*adv_router
)
6122 struct listnode
*node
;
6123 struct ospf_area
*area
;
6126 case OSPF_AS_EXTERNAL_LSA
:
6127 case OSPF_OPAQUE_AS_LSA
:
6128 vty_out(vty
, " %s \n\n",
6129 show_database_desc
[type
]);
6130 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
);
6133 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6134 vty_out(vty
, "\n %s (Area %s)\n\n",
6135 show_database_desc
[type
],
6136 ospf_area_desc_string(area
));
6137 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6144 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6145 struct route_table
*rt
,
6146 struct in_addr
*adv_router
)
6148 struct route_node
*rn
;
6149 struct ospf_lsa
*lsa
;
6151 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6152 if ((lsa
= rn
->info
))
6153 if (IPV4_ADDR_SAME(adv_router
,
6154 &lsa
->data
->adv_router
)) {
6155 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6157 if (show_function
[lsa
->data
->type
] != NULL
)
6158 show_function
[lsa
->data
->type
](vty
,
6163 /* Show detail LSA information. */
6164 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6165 int type
, struct in_addr
*adv_router
)
6167 struct listnode
*node
;
6168 struct ospf_area
*area
;
6171 case OSPF_AS_EXTERNAL_LSA
:
6172 case OSPF_OPAQUE_AS_LSA
:
6173 vty_out(vty
, " %s \n\n",
6174 show_database_desc
[type
]);
6175 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6179 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6180 vty_out(vty
, "\n %s (Area %s)\n\n",
6181 show_database_desc
[type
],
6182 ospf_area_desc_string(area
));
6183 show_lsa_detail_adv_router_proc(
6184 vty
, AREA_LSDB(area
, type
), adv_router
);
6190 static void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
,
6193 struct ospf_lsa
*lsa
;
6194 struct route_node
*rn
;
6195 struct ospf_area
*area
;
6196 struct listnode
*node
;
6199 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6200 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6202 case OSPF_AS_EXTERNAL_LSA
:
6203 case OSPF_OPAQUE_AS_LSA
:
6208 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6210 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6211 vty_out(vty
, " %s (Area %s)\n\n",
6212 show_database_desc
[type
],
6213 ospf_area_desc_string(area
));
6214 vty_out(vty
, "%s\n",
6215 show_database_header
[type
]);
6217 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
)
6218 show_lsa_summary(vty
, lsa
, self
);
6225 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6227 case OSPF_AS_EXTERNAL_LSA
:
6228 case OSPF_OPAQUE_AS_LSA
:
6233 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6234 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6235 vty_out(vty
, " %s\n\n",
6236 show_database_desc
[type
]);
6237 vty_out(vty
, "%s\n", show_database_header
[type
]);
6239 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
)
6240 show_lsa_summary(vty
, lsa
, self
);
6249 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
)
6251 struct route_node
*rn
;
6253 vty_out(vty
, "\n MaxAge Link States:\n\n");
6255 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6256 struct ospf_lsa
*lsa
;
6258 if ((lsa
= rn
->info
) != NULL
) {
6259 vty_out(vty
, "Link type: %d\n", lsa
->data
->type
);
6260 vty_out(vty
, "Link State ID: %s\n",
6261 inet_ntoa(lsa
->data
->id
));
6262 vty_out(vty
, "Advertising Router: %s\n",
6263 inet_ntoa(lsa
->data
->adv_router
));
6264 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6270 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6271 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6273 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6274 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6275 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6276 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6278 #define OSPF_LSA_TYPES_DESC \
6279 "ASBR summary link states\n" \
6280 "External link states\n" \
6281 "Network link states\n" \
6282 "Router link states\n" \
6283 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6284 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6285 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6287 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6288 int arg_base
, int argc
,
6289 struct cmd_token
**argv
,
6294 struct in_addr id
, adv_router
;
6297 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6299 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6301 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6302 inet_ntoa(ospf
->router_id
));
6305 if (argc
== arg_base
+ 4) {
6306 show_ip_ospf_database_summary(vty
, ospf
, 0);
6310 /* Set database type to show. */
6311 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6312 type
= OSPF_ROUTER_LSA
;
6313 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6314 type
= OSPF_NETWORK_LSA
;
6315 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6316 type
= OSPF_AS_NSSA_LSA
;
6317 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
6318 type
= OSPF_SUMMARY_LSA
;
6319 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6320 type
= OSPF_ASBR_SUMMARY_LSA
;
6321 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6322 type
= OSPF_AS_EXTERNAL_LSA
;
6323 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
6324 show_ip_ospf_database_summary(vty
, ospf
, 1);
6326 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
6327 show_ip_ospf_database_maxage(vty
, ospf
);
6329 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6330 type
= OSPF_OPAQUE_LINK_LSA
;
6331 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6332 type
= OSPF_OPAQUE_AREA_LSA
;
6333 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6334 type
= OSPF_OPAQUE_AS_LSA
;
6338 /* `show ip ospf database LSA'. */
6339 if (argc
== arg_base
+ 5)
6340 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
);
6341 else if (argc
>= arg_base
+ 6) {
6342 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
6346 /* `show ip ospf database LSA ID'. */
6347 if (argc
== arg_base
+ 6)
6348 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
);
6349 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6350 else if (argc
== arg_base
+ 7) {
6351 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
6352 adv_router
= ospf
->router_id
;
6354 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
6359 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
);
6366 DEFUN (show_ip_ospf_database_max
,
6367 show_ip_ospf_database_max_cmd
,
6368 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
6371 "OSPF information\n"
6374 "Database summary\n"
6375 "LSAs in MaxAge list\n"
6376 "Self-originated link states\n")
6378 struct ospf
*ospf
= NULL
;
6379 struct listnode
*node
= NULL
;
6380 char *vrf_name
= NULL
;
6381 bool all_vrf
= false;
6382 int ret
= CMD_SUCCESS
;
6385 uint8_t use_vrf
= 0;
6387 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6390 bool ospf_output
= false;
6395 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6396 if (!ospf
->oi_running
)
6399 ret
= show_ip_ospf_database_common(
6400 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6405 vty_out(vty
, "%% OSPF instance not found\n");
6407 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6408 if (ospf
== NULL
|| !ospf
->oi_running
) {
6409 vty_out(vty
, "%% OSPF instance not found\n");
6412 ret
= (show_ip_ospf_database_common(
6413 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6417 /* Display default ospf (instance 0) info */
6418 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6419 if (ospf
== NULL
|| !ospf
->oi_running
) {
6420 vty_out(vty
, "%% OSPF instance not found\n");
6424 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6431 DEFUN (show_ip_ospf_instance_database
,
6432 show_ip_ospf_instance_database_cmd
,
6433 "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>]]]",
6436 "OSPF information\n"
6439 "Database summary\n"
6441 "Link State ID (as an IP address)\n"
6442 "Self-originated link states\n"
6443 "Advertising Router link states\n"
6444 "Advertising Router (as an IP address)\n")
6447 unsigned short instance
= 0;
6448 struct listnode
*node
= NULL
;
6449 char *vrf_name
= NULL
;
6450 bool all_vrf
= false;
6451 int ret
= CMD_SUCCESS
;
6454 uint8_t use_vrf
= 0;
6456 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6457 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6458 ospf
= ospf_lookup_instance(instance
);
6460 return CMD_NOT_MY_INSTANCE
;
6461 if (!ospf
->oi_running
)
6464 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0,
6465 argc
, argv
, use_vrf
));
6466 } else if (argv_find(argv
, argc
, "vrf", &idx
)) {
6467 vrf_name
= argv
[++idx
]->arg
;
6468 all_vrf
= strmatch(vrf_name
, "all");
6474 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6475 if (!ospf
->oi_running
)
6477 ret
= (show_ip_ospf_database_common(
6478 vty
, ospf
, idx
? 2 : 0, argc
, argv
,
6482 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6483 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6484 vty_out(vty
, "%% OSPF instance not found\n");
6488 ret
= (show_ip_ospf_database_common(
6489 vty
, ospf
, idx
? 2 : 0, argc
, argv
, use_vrf
));
6492 /* Display default ospf (instance 0) info */
6493 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6494 if (ospf
== NULL
|| !ospf
->oi_running
) {
6495 vty_out(vty
, "%% OSPF instance not found\n");
6499 ret
= (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6506 DEFUN (show_ip_ospf_instance_database_max
,
6507 show_ip_ospf_instance_database_max_cmd
,
6508 "show ip ospf (1-65535) database <max-age|self-originate>",
6511 "OSPF information\n"
6513 "Database summary\n"
6514 "LSAs in MaxAge list\n"
6515 "Self-originated link states\n")
6519 unsigned short instance
= 0;
6521 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6523 ospf
= ospf_lookup_instance(instance
);
6525 return CMD_NOT_MY_INSTANCE
;
6527 if (!ospf
->oi_running
) {
6528 vty_out(vty
, "%% OSPF instance not found\n");
6532 return show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0);
6536 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
6538 int arg_base
, int argc
,
6539 struct cmd_token
**argv
,
6544 struct in_addr adv_router
;
6547 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6549 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6551 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6552 inet_ntoa(ospf
->router_id
));
6554 /* Set database type to show. */
6555 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6556 type
= OSPF_ROUTER_LSA
;
6557 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6558 type
= OSPF_NETWORK_LSA
;
6559 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6560 type
= OSPF_AS_NSSA_LSA
;
6561 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
6562 type
= OSPF_SUMMARY_LSA
;
6563 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6564 type
= OSPF_ASBR_SUMMARY_LSA
;
6565 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6566 type
= OSPF_AS_EXTERNAL_LSA
;
6567 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6568 type
= OSPF_OPAQUE_LINK_LSA
;
6569 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6570 type
= OSPF_OPAQUE_AREA_LSA
;
6571 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6572 type
= OSPF_OPAQUE_AS_LSA
;
6576 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6577 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
6578 adv_router
= ospf
->router_id
;
6580 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
6585 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
);
6590 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
6591 show_ip_ospf_instance_database_type_adv_router_cmd
,
6592 "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>",
6595 "OSPF information\n"
6598 "Database summary\n"
6600 "Advertising Router link states\n"
6601 "Advertising Router (as an IP address)\n"
6602 "Self-originated link states\n")
6604 struct ospf
*ospf
= NULL
;
6605 unsigned short instance
= 0;
6606 struct listnode
*node
= NULL
;
6607 char *vrf_name
= NULL
;
6608 bool all_vrf
= false;
6609 int ret
= CMD_SUCCESS
;
6611 int idx
= 0, idx_vrf
= 0;
6612 uint8_t use_vrf
= 0;
6614 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6615 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6616 ospf
= ospf_lookup_instance(instance
);
6618 return CMD_NOT_MY_INSTANCE
;
6619 if (!ospf
->oi_running
) {
6620 vty_out(vty
, "%% OSPF instance not found\n");
6624 return (show_ip_ospf_database_type_adv_router_common(
6625 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
));
6628 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6631 bool ospf_output
= false;
6636 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6637 if (!ospf
->oi_running
)
6640 ret
= show_ip_ospf_database_type_adv_router_common(
6641 vty
, ospf
, idx
? 1 : 0, argc
, argv
,
6645 vty_out(vty
, "%% OSPF instance not found\n");
6647 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6648 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6649 vty_out(vty
, "%% OSPF instance not found\n");
6653 ret
= show_ip_ospf_database_type_adv_router_common(
6654 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6657 /* Display default ospf (instance 0) info */
6658 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6659 if (ospf
== NULL
|| !ospf
->oi_running
) {
6660 vty_out(vty
, "%% OSPF instance not found\n");
6664 ret
= show_ip_ospf_database_type_adv_router_common(
6665 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6668 /*return (show_ip_ospf_database_type_adv_router_common(
6669 vty, ospf, idx ? 1 : 0, argc, argv));*/
6672 DEFUN (ip_ospf_authentication_args
,
6673 ip_ospf_authentication_args_addr_cmd
,
6674 "ip ospf authentication <null|message-digest> [A.B.C.D]",
6676 "OSPF interface commands\n"
6677 "Enable authentication on this interface\n"
6678 "Use null authentication\n"
6679 "Use message-digest authentication\n"
6680 "Address of interface\n")
6682 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6683 int idx_encryption
= 3;
6685 struct in_addr addr
;
6687 struct ospf_if_params
*params
;
6689 params
= IF_DEF_PARAMS(ifp
);
6692 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6695 "Please specify interface address by A.B.C.D\n");
6696 return CMD_WARNING_CONFIG_FAILED
;
6699 params
= ospf_get_if_params(ifp
, addr
);
6700 ospf_if_update_params(ifp
, addr
);
6703 /* Handle null authentication */
6704 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6705 SET_IF_PARAM(params
, auth_type
);
6706 params
->auth_type
= OSPF_AUTH_NULL
;
6710 /* Handle message-digest authentication */
6711 if (argv
[idx_encryption
]->arg
[0] == 'm') {
6712 SET_IF_PARAM(params
, auth_type
);
6713 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6717 vty_out(vty
, "You shouldn't get here!\n");
6718 return CMD_WARNING_CONFIG_FAILED
;
6721 DEFUN (ip_ospf_authentication
,
6722 ip_ospf_authentication_addr_cmd
,
6723 "ip ospf authentication [A.B.C.D]",
6725 "OSPF interface commands\n"
6726 "Enable authentication on this interface\n"
6727 "Address of interface\n")
6729 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6731 struct in_addr addr
;
6733 struct ospf_if_params
*params
;
6735 params
= IF_DEF_PARAMS(ifp
);
6738 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6741 "Please specify interface address by A.B.C.D\n");
6742 return CMD_WARNING_CONFIG_FAILED
;
6745 params
= ospf_get_if_params(ifp
, addr
);
6746 ospf_if_update_params(ifp
, addr
);
6749 SET_IF_PARAM(params
, auth_type
);
6750 params
->auth_type
= OSPF_AUTH_SIMPLE
;
6755 DEFUN (no_ip_ospf_authentication_args
,
6756 no_ip_ospf_authentication_args_addr_cmd
,
6757 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
6760 "OSPF interface commands\n"
6761 "Enable authentication on this interface\n"
6762 "Use null authentication\n"
6763 "Use message-digest authentication\n"
6764 "Address of interface\n")
6766 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6767 int idx_encryption
= 4;
6769 struct in_addr addr
;
6771 struct ospf_if_params
*params
;
6772 struct route_node
*rn
;
6775 params
= IF_DEF_PARAMS(ifp
);
6778 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6781 "Please specify interface address by A.B.C.D\n");
6782 return CMD_WARNING_CONFIG_FAILED
;
6785 params
= ospf_lookup_if_params(ifp
, addr
);
6786 if (params
== NULL
) {
6787 vty_out(vty
, "Ip Address specified is unknown\n");
6788 return CMD_WARNING_CONFIG_FAILED
;
6790 params
->auth_type
= OSPF_AUTH_NOTSET
;
6791 UNSET_IF_PARAM(params
, auth_type
);
6792 if (params
!= IF_DEF_PARAMS(ifp
)) {
6793 ospf_free_if_params(ifp
, addr
);
6794 ospf_if_update_params(ifp
, addr
);
6797 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6798 auth_type
= OSPF_AUTH_NULL
;
6799 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
6800 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6802 vty_out(vty
, "Unexpected input encountered\n");
6803 return CMD_WARNING_CONFIG_FAILED
;
6806 * Here we have a case where the user has entered
6807 * 'no ip ospf authentication (null | message_digest )'
6808 * we need to find if we have any ip addresses underneath it
6810 * correspond to the associated type.
6812 if (params
->auth_type
== auth_type
) {
6813 params
->auth_type
= OSPF_AUTH_NOTSET
;
6814 UNSET_IF_PARAM(params
, auth_type
);
6817 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6818 rn
= route_next(rn
)) {
6819 if ((params
= rn
->info
)) {
6820 if (params
->auth_type
== auth_type
) {
6821 params
->auth_type
= OSPF_AUTH_NOTSET
;
6822 UNSET_IF_PARAM(params
, auth_type
);
6823 if (params
!= IF_DEF_PARAMS(ifp
)) {
6824 ospf_free_if_params(
6825 ifp
, rn
->p
.u
.prefix4
);
6826 ospf_if_update_params(
6827 ifp
, rn
->p
.u
.prefix4
);
6837 DEFUN (no_ip_ospf_authentication
,
6838 no_ip_ospf_authentication_addr_cmd
,
6839 "no ip ospf authentication [A.B.C.D]",
6842 "OSPF interface commands\n"
6843 "Enable authentication on this interface\n"
6844 "Address of interface\n")
6846 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6848 struct in_addr addr
;
6850 struct ospf_if_params
*params
;
6851 struct route_node
*rn
;
6853 params
= IF_DEF_PARAMS(ifp
);
6856 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6859 "Please specify interface address by A.B.C.D\n");
6860 return CMD_WARNING_CONFIG_FAILED
;
6863 params
= ospf_lookup_if_params(ifp
, addr
);
6864 if (params
== NULL
) {
6865 vty_out(vty
, "Ip Address specified is unknown\n");
6866 return CMD_WARNING_CONFIG_FAILED
;
6869 params
->auth_type
= OSPF_AUTH_NOTSET
;
6870 UNSET_IF_PARAM(params
, auth_type
);
6871 if (params
!= IF_DEF_PARAMS(ifp
)) {
6872 ospf_free_if_params(ifp
, addr
);
6873 ospf_if_update_params(ifp
, addr
);
6877 * When a user enters 'no ip ospf authentication'
6878 * We should remove all authentication types from
6881 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6882 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
6883 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
6884 params
->auth_type
= OSPF_AUTH_NOTSET
;
6885 UNSET_IF_PARAM(params
, auth_type
);
6888 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6889 rn
= route_next(rn
)) {
6890 if ((params
= rn
->info
)) {
6892 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6893 || (params
->auth_type
6894 == OSPF_AUTH_CRYPTOGRAPHIC
)
6895 || (params
->auth_type
6896 == OSPF_AUTH_SIMPLE
)) {
6897 params
->auth_type
= OSPF_AUTH_NOTSET
;
6898 UNSET_IF_PARAM(params
, auth_type
);
6899 if (params
!= IF_DEF_PARAMS(ifp
)) {
6900 ospf_free_if_params(
6901 ifp
, rn
->p
.u
.prefix4
);
6902 ospf_if_update_params(
6903 ifp
, rn
->p
.u
.prefix4
);
6914 DEFUN (ip_ospf_authentication_key
,
6915 ip_ospf_authentication_key_addr_cmd
,
6916 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
6918 "OSPF interface commands\n"
6919 "Authentication password (key)\n"
6920 "The OSPF password (key)\n"
6921 "Address of interface\n")
6923 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6925 struct in_addr addr
;
6926 struct ospf_if_params
*params
;
6928 params
= IF_DEF_PARAMS(ifp
);
6930 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6931 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6933 "Please specify interface address by A.B.C.D\n");
6934 return CMD_WARNING_CONFIG_FAILED
;
6937 params
= ospf_get_if_params(ifp
, addr
);
6938 ospf_if_update_params(ifp
, addr
);
6941 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
6942 sizeof(params
->auth_simple
));
6943 SET_IF_PARAM(params
, auth_simple
);
6948 DEFUN_HIDDEN (ospf_authentication_key
,
6949 ospf_authentication_key_cmd
,
6950 "ospf authentication-key AUTH_KEY [A.B.C.D]",
6951 "OSPF interface commands\n"
6952 VLINK_HELPSTR_AUTH_SIMPLE
6953 "Address of interface\n")
6955 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6958 DEFUN (no_ip_ospf_authentication_key
,
6959 no_ip_ospf_authentication_key_authkey_addr_cmd
,
6960 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6963 "OSPF interface commands\n"
6964 VLINK_HELPSTR_AUTH_SIMPLE
6965 "Address of interface\n")
6967 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6969 struct in_addr addr
;
6970 struct ospf_if_params
*params
;
6971 params
= IF_DEF_PARAMS(ifp
);
6973 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6974 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6976 "Please specify interface address by A.B.C.D\n");
6977 return CMD_WARNING_CONFIG_FAILED
;
6980 params
= ospf_lookup_if_params(ifp
, addr
);
6985 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
6986 UNSET_IF_PARAM(params
, auth_simple
);
6988 if (params
!= IF_DEF_PARAMS(ifp
)) {
6989 ospf_free_if_params(ifp
, addr
);
6990 ospf_if_update_params(ifp
, addr
);
6996 DEFUN_HIDDEN (no_ospf_authentication_key
,
6997 no_ospf_authentication_key_authkey_addr_cmd
,
6998 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
7000 "OSPF interface commands\n"
7001 VLINK_HELPSTR_AUTH_SIMPLE
7002 "Address of interface\n")
7004 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
7007 DEFUN (ip_ospf_message_digest_key
,
7008 ip_ospf_message_digest_key_cmd
,
7009 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7011 "OSPF interface commands\n"
7012 "Message digest authentication password (key)\n"
7014 "Use MD5 algorithm\n"
7015 "The OSPF password (key)\n"
7016 "Address of interface\n")
7018 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7019 struct crypt_key
*ck
;
7021 struct in_addr addr
;
7022 struct ospf_if_params
*params
;
7024 params
= IF_DEF_PARAMS(ifp
);
7027 argv_find(argv
, argc
, "(1-255)", &idx
);
7028 char *keyid
= argv
[idx
]->arg
;
7029 argv_find(argv
, argc
, "KEY", &idx
);
7030 char *cryptkey
= argv
[idx
]->arg
;
7032 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7033 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7035 "Please specify interface address by A.B.C.D\n");
7036 return CMD_WARNING_CONFIG_FAILED
;
7039 params
= ospf_get_if_params(ifp
, addr
);
7040 ospf_if_update_params(ifp
, addr
);
7043 key_id
= strtol(keyid
, NULL
, 10);
7044 if (ospf_crypt_key_lookup(params
->auth_crypt
, key_id
) != NULL
) {
7045 vty_out(vty
, "OSPF: Key %d already exists\n", key_id
);
7049 ck
= ospf_crypt_key_new();
7050 ck
->key_id
= (uint8_t)key_id
;
7051 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7053 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7054 SET_IF_PARAM(params
, auth_crypt
);
7059 DEFUN_HIDDEN (ospf_message_digest_key
,
7060 ospf_message_digest_key_cmd
,
7061 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7062 "OSPF interface commands\n"
7063 "Message digest authentication password (key)\n"
7065 "Use MD5 algorithm\n"
7066 "The OSPF password (key)\n"
7067 "Address of interface\n")
7069 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7072 DEFUN (no_ip_ospf_message_digest_key
,
7073 no_ip_ospf_message_digest_key_cmd
,
7074 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7077 "OSPF interface commands\n"
7078 "Message digest authentication password (key)\n"
7080 "Use MD5 algorithm\n"
7081 "The OSPF password (key)\n"
7082 "Address of interface\n")
7084 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7086 struct crypt_key
*ck
;
7088 struct in_addr addr
;
7089 struct ospf_if_params
*params
;
7090 params
= IF_DEF_PARAMS(ifp
);
7092 argv_find(argv
, argc
, "(1-255)", &idx
);
7093 char *keyid
= argv
[idx
]->arg
;
7095 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7096 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7098 "Please specify interface address by A.B.C.D\n");
7099 return CMD_WARNING_CONFIG_FAILED
;
7102 params
= ospf_lookup_if_params(ifp
, addr
);
7107 key_id
= strtol(keyid
, NULL
, 10);
7108 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7110 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7111 return CMD_WARNING_CONFIG_FAILED
;
7114 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7116 if (params
!= IF_DEF_PARAMS(ifp
)) {
7117 ospf_free_if_params(ifp
, addr
);
7118 ospf_if_update_params(ifp
, addr
);
7124 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7125 no_ospf_message_digest_key_cmd
,
7126 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7128 "OSPF interface commands\n"
7129 "Message digest authentication password (key)\n"
7131 "Use MD5 algorithm\n"
7132 "The OSPF password (key)\n"
7133 "Address of interface\n")
7135 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7138 DEFUN (ip_ospf_cost
,
7140 "ip ospf cost (1-65535) [A.B.C.D]",
7142 "OSPF interface commands\n"
7145 "Address of interface\n")
7147 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7149 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7150 struct in_addr addr
;
7151 struct ospf_if_params
*params
;
7152 params
= IF_DEF_PARAMS(ifp
);
7155 char *coststr
= NULL
, *ifaddr
= NULL
;
7157 argv_find(argv
, argc
, "(1-65535)", &idx
);
7158 coststr
= argv
[idx
]->arg
;
7159 cost
= strtol(coststr
, NULL
, 10);
7161 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7163 if (!inet_aton(ifaddr
, &addr
)) {
7165 "Please specify interface address by A.B.C.D\n");
7166 return CMD_WARNING_CONFIG_FAILED
;
7169 params
= ospf_get_if_params(ifp
, addr
);
7170 ospf_if_update_params(ifp
, addr
);
7173 SET_IF_PARAM(params
, output_cost_cmd
);
7174 params
->output_cost_cmd
= cost
;
7176 ospf_if_recalculate_output_cost(ifp
);
7181 DEFUN_HIDDEN (ospf_cost
,
7183 "ospf cost (1-65535) [A.B.C.D]",
7184 "OSPF interface commands\n"
7187 "Address of interface\n")
7189 return ip_ospf_cost(self
, vty
, argc
, argv
);
7192 DEFUN (no_ip_ospf_cost
,
7193 no_ip_ospf_cost_cmd
,
7194 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7197 "OSPF interface commands\n"
7200 "Address of interface\n")
7202 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7204 struct in_addr addr
;
7205 struct ospf_if_params
*params
;
7207 params
= IF_DEF_PARAMS(ifp
);
7210 char *ifaddr
= NULL
;
7211 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7213 /* According to the semantics we are mimicking "no ip ospf cost N" is
7214 * always treated as "no ip ospf cost" regardless of the actual value
7215 * of N already configured for the interface. Thus ignore cost. */
7218 if (!inet_aton(ifaddr
, &addr
)) {
7220 "Please specify interface address by A.B.C.D\n");
7221 return CMD_WARNING_CONFIG_FAILED
;
7224 params
= ospf_lookup_if_params(ifp
, addr
);
7229 UNSET_IF_PARAM(params
, output_cost_cmd
);
7231 if (params
!= IF_DEF_PARAMS(ifp
)) {
7232 ospf_free_if_params(ifp
, addr
);
7233 ospf_if_update_params(ifp
, addr
);
7236 ospf_if_recalculate_output_cost(ifp
);
7241 DEFUN_HIDDEN (no_ospf_cost
,
7243 "no ospf cost [(1-65535)] [A.B.C.D]",
7245 "OSPF interface commands\n"
7248 "Address of interface\n")
7250 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
7253 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
7255 struct route_node
*rn
;
7256 struct ospf_neighbor
*nbr
;
7258 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
7259 if ((nbr
= rn
->info
)) {
7260 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
7261 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7262 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7263 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7267 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
7268 const char *nbr_str
,
7269 const char *fast_hello_str
)
7271 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7274 struct in_addr addr
;
7276 struct ospf_if_params
*params
;
7277 struct ospf_interface
*oi
;
7278 struct route_node
*rn
;
7280 params
= IF_DEF_PARAMS(ifp
);
7283 ret
= inet_aton(nbr_str
, &addr
);
7286 "Please specify interface address by A.B.C.D\n");
7287 return CMD_WARNING_CONFIG_FAILED
;
7290 params
= ospf_get_if_params(ifp
, addr
);
7291 ospf_if_update_params(ifp
, addr
);
7295 seconds
= strtoul(interval_str
, NULL
, 10);
7297 /* reset fast_hello too, just to be sure */
7298 UNSET_IF_PARAM(params
, fast_hello
);
7299 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7300 } else if (fast_hello_str
) {
7301 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
7302 /* 1s dead-interval with sub-second hellos desired */
7303 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
7304 SET_IF_PARAM(params
, fast_hello
);
7305 params
->fast_hello
= hellomult
;
7308 "Please specify dead-interval or hello-multiplier\n");
7309 return CMD_WARNING_CONFIG_FAILED
;
7312 SET_IF_PARAM(params
, v_wait
);
7313 params
->v_wait
= seconds
;
7315 /* Update timer values in neighbor structure. */
7317 struct ospf
*ospf
= NULL
;
7319 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7321 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7323 ospf_nbr_timer_update(oi
);
7326 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7327 if ((oi
= rn
->info
))
7328 ospf_nbr_timer_update(oi
);
7334 DEFUN (ip_ospf_dead_interval
,
7335 ip_ospf_dead_interval_cmd
,
7336 "ip ospf dead-interval (1-65535) [A.B.C.D]",
7338 "OSPF interface commands\n"
7339 "Interval time after which a neighbor is declared down\n"
7341 "Address of interface\n")
7344 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
7348 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7349 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
7353 DEFUN_HIDDEN (ospf_dead_interval
,
7354 ospf_dead_interval_cmd
,
7355 "ospf dead-interval (1-65535) [A.B.C.D]",
7356 "OSPF interface commands\n"
7357 "Interval time after which a neighbor is declared down\n"
7359 "Address of interface\n")
7361 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7364 DEFUN (ip_ospf_dead_interval_minimal
,
7365 ip_ospf_dead_interval_minimal_addr_cmd
,
7366 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
7368 "OSPF interface commands\n"
7369 "Interval time after which a neighbor is declared down\n"
7370 "Minimal 1s dead-interval with fast sub-second hellos\n"
7371 "Hello multiplier factor\n"
7372 "Number of Hellos to send each second\n"
7373 "Address of interface\n")
7378 return ospf_vty_dead_interval_set(
7379 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
7381 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
7382 argv
[idx_number
]->arg
);
7385 DEFUN (no_ip_ospf_dead_interval
,
7386 no_ip_ospf_dead_interval_cmd
,
7387 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7390 "OSPF interface commands\n"
7391 "Interval time after which a neighbor is declared down\n"
7393 "Minimal 1s dead-interval with fast sub-second hellos\n"
7394 "Hello multiplier factor\n"
7395 "Number of Hellos to send each second\n"
7396 "Address of interface\n")
7398 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7399 int idx_ipv4
= argc
- 1;
7400 struct in_addr addr
= {.s_addr
= 0L};
7402 struct ospf_if_params
*params
;
7403 struct ospf_interface
*oi
;
7404 struct route_node
*rn
;
7406 params
= IF_DEF_PARAMS(ifp
);
7408 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
7409 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7412 "Please specify interface address by A.B.C.D\n");
7413 return CMD_WARNING_CONFIG_FAILED
;
7416 params
= ospf_lookup_if_params(ifp
, addr
);
7421 UNSET_IF_PARAM(params
, v_wait
);
7422 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
7424 UNSET_IF_PARAM(params
, fast_hello
);
7425 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7427 if (params
!= IF_DEF_PARAMS(ifp
)) {
7428 ospf_free_if_params(ifp
, addr
);
7429 ospf_if_update_params(ifp
, addr
);
7432 /* Update timer values in neighbor structure. */
7434 struct ospf
*ospf
= NULL
;
7436 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7438 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7440 ospf_nbr_timer_update(oi
);
7443 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7444 if ((oi
= rn
->info
))
7445 ospf_nbr_timer_update(oi
);
7451 DEFUN_HIDDEN (no_ospf_dead_interval
,
7452 no_ospf_dead_interval_cmd
,
7453 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7455 "OSPF interface commands\n"
7456 "Interval time after which a neighbor is declared down\n"
7458 "Minimal 1s dead-interval with fast sub-second hellos\n"
7459 "Hello multiplier factor\n"
7460 "Number of Hellos to send each second\n"
7461 "Address of interface\n")
7463 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7466 DEFUN (ip_ospf_hello_interval
,
7467 ip_ospf_hello_interval_cmd
,
7468 "ip ospf hello-interval (1-65535) [A.B.C.D]",
7470 "OSPF interface commands\n"
7471 "Time between HELLO packets\n"
7473 "Address of interface\n")
7475 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7477 struct in_addr addr
;
7478 struct ospf_if_params
*params
;
7479 params
= IF_DEF_PARAMS(ifp
);
7480 uint32_t seconds
= 0;
7482 argv_find(argv
, argc
, "(1-65535)", &idx
);
7483 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7485 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7486 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7488 "Please specify interface address by A.B.C.D\n");
7489 return CMD_WARNING_CONFIG_FAILED
;
7492 params
= ospf_get_if_params(ifp
, addr
);
7493 ospf_if_update_params(ifp
, addr
);
7496 SET_IF_PARAM(params
, v_hello
);
7497 params
->v_hello
= seconds
;
7502 DEFUN_HIDDEN (ospf_hello_interval
,
7503 ospf_hello_interval_cmd
,
7504 "ospf hello-interval (1-65535) [A.B.C.D]",
7505 "OSPF interface commands\n"
7506 "Time between HELLO packets\n"
7508 "Address of interface\n")
7510 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7513 DEFUN (no_ip_ospf_hello_interval
,
7514 no_ip_ospf_hello_interval_cmd
,
7515 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
7518 "OSPF interface commands\n"
7519 "Time between HELLO packets\n" // ignored
7521 "Address of interface\n")
7523 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7525 struct in_addr addr
;
7526 struct ospf_if_params
*params
;
7528 params
= IF_DEF_PARAMS(ifp
);
7530 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7531 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7533 "Please specify interface address by A.B.C.D\n");
7534 return CMD_WARNING_CONFIG_FAILED
;
7537 params
= ospf_lookup_if_params(ifp
, addr
);
7542 UNSET_IF_PARAM(params
, v_hello
);
7543 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
7545 if (params
!= IF_DEF_PARAMS(ifp
)) {
7546 ospf_free_if_params(ifp
, addr
);
7547 ospf_if_update_params(ifp
, addr
);
7553 DEFUN_HIDDEN (no_ospf_hello_interval
,
7554 no_ospf_hello_interval_cmd
,
7555 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7557 "OSPF interface commands\n"
7558 "Time between HELLO packets\n" // ignored
7560 "Address of interface\n")
7562 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7565 DEFUN (ip_ospf_network
,
7566 ip_ospf_network_cmd
,
7567 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7569 "OSPF interface commands\n"
7571 "Specify OSPF broadcast multi-access network\n"
7572 "Specify OSPF NBMA network\n"
7573 "Specify OSPF point-to-multipoint network\n"
7574 "Specify OSPF point-to-point network\n")
7576 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7578 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7579 struct route_node
*rn
;
7581 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
7583 "This is a loopback interface. Can't set network type.\n");
7584 return CMD_WARNING_CONFIG_FAILED
;
7587 if (argv_find(argv
, argc
, "broadcast", &idx
))
7588 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
7589 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
7590 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
7591 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
7592 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
7593 else if (argv_find(argv
, argc
, "point-to-point", &idx
))
7594 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
7596 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7599 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
7601 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7602 struct ospf_interface
*oi
= rn
->info
;
7607 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7609 if (oi
->state
> ISM_Down
) {
7610 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7611 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7618 DEFUN_HIDDEN (ospf_network
,
7620 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7621 "OSPF interface commands\n"
7623 "Specify OSPF broadcast multi-access network\n"
7624 "Specify OSPF NBMA network\n"
7625 "Specify OSPF point-to-multipoint network\n"
7626 "Specify OSPF point-to-point network\n")
7628 return ip_ospf_network(self
, vty
, argc
, argv
);
7631 DEFUN (no_ip_ospf_network
,
7632 no_ip_ospf_network_cmd
,
7633 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7636 "OSPF interface commands\n"
7638 "Specify OSPF broadcast multi-access network\n"
7639 "Specify OSPF NBMA network\n"
7640 "Specify OSPF point-to-multipoint network\n"
7641 "Specify OSPF point-to-point network\n")
7643 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7644 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7645 struct route_node
*rn
;
7647 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
7649 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7652 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7653 struct ospf_interface
*oi
= rn
->info
;
7658 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7660 if (oi
->state
> ISM_Down
) {
7661 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7662 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7669 DEFUN_HIDDEN (no_ospf_network
,
7670 no_ospf_network_cmd
,
7671 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7673 "OSPF interface commands\n"
7675 "Specify OSPF broadcast multi-access network\n"
7676 "Specify OSPF NBMA network\n"
7677 "Specify OSPF point-to-multipoint network\n"
7678 "Specify OSPF point-to-point network\n")
7680 return no_ip_ospf_network(self
, vty
, argc
, argv
);
7683 DEFUN (ip_ospf_priority
,
7684 ip_ospf_priority_cmd
,
7685 "ip ospf priority (0-255) [A.B.C.D]",
7687 "OSPF interface commands\n"
7690 "Address of interface\n")
7692 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7695 struct route_node
*rn
;
7696 struct in_addr addr
;
7697 struct ospf_if_params
*params
;
7698 params
= IF_DEF_PARAMS(ifp
);
7700 argv_find(argv
, argc
, "(0-255)", &idx
);
7701 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
7703 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7704 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7706 "Please specify interface address by A.B.C.D\n");
7707 return CMD_WARNING_CONFIG_FAILED
;
7710 params
= ospf_get_if_params(ifp
, addr
);
7711 ospf_if_update_params(ifp
, addr
);
7714 SET_IF_PARAM(params
, priority
);
7715 params
->priority
= priority
;
7717 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7718 struct ospf_interface
*oi
= rn
->info
;
7723 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7724 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7725 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7732 DEFUN_HIDDEN (ospf_priority
,
7734 "ospf priority (0-255) [A.B.C.D]",
7735 "OSPF interface commands\n"
7738 "Address of interface\n")
7740 return ip_ospf_priority(self
, vty
, argc
, argv
);
7743 DEFUN (no_ip_ospf_priority
,
7744 no_ip_ospf_priority_cmd
,
7745 "no ip ospf priority [(0-255) [A.B.C.D]]",
7748 "OSPF interface commands\n"
7749 "Router priority\n" // ignored
7751 "Address of interface\n")
7753 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7755 struct route_node
*rn
;
7756 struct in_addr addr
;
7757 struct ospf_if_params
*params
;
7759 params
= IF_DEF_PARAMS(ifp
);
7761 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7762 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7764 "Please specify interface address by A.B.C.D\n");
7765 return CMD_WARNING_CONFIG_FAILED
;
7768 params
= ospf_lookup_if_params(ifp
, addr
);
7773 UNSET_IF_PARAM(params
, priority
);
7774 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
7776 if (params
!= IF_DEF_PARAMS(ifp
)) {
7777 ospf_free_if_params(ifp
, addr
);
7778 ospf_if_update_params(ifp
, addr
);
7781 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7782 struct ospf_interface
*oi
= rn
->info
;
7787 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7788 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7789 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7796 DEFUN_HIDDEN (no_ospf_priority
,
7797 no_ospf_priority_cmd
,
7798 "no ospf priority [(0-255) [A.B.C.D]]",
7800 "OSPF interface commands\n"
7803 "Address of interface\n")
7805 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
7808 DEFUN (ip_ospf_retransmit_interval
,
7809 ip_ospf_retransmit_interval_addr_cmd
,
7810 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
7812 "OSPF interface commands\n"
7813 "Time between retransmitting lost link state advertisements\n"
7815 "Address of interface\n")
7817 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7820 struct in_addr addr
;
7821 struct ospf_if_params
*params
;
7822 params
= IF_DEF_PARAMS(ifp
);
7824 argv_find(argv
, argc
, "(3-65535)", &idx
);
7825 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7827 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7828 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7830 "Please specify interface address by A.B.C.D\n");
7831 return CMD_WARNING_CONFIG_FAILED
;
7834 params
= ospf_get_if_params(ifp
, addr
);
7835 ospf_if_update_params(ifp
, addr
);
7838 SET_IF_PARAM(params
, retransmit_interval
);
7839 params
->retransmit_interval
= seconds
;
7844 DEFUN_HIDDEN (ospf_retransmit_interval
,
7845 ospf_retransmit_interval_cmd
,
7846 "ospf retransmit-interval (3-65535) [A.B.C.D]",
7847 "OSPF interface commands\n"
7848 "Time between retransmitting lost link state advertisements\n"
7850 "Address of interface\n")
7852 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7855 DEFUN (no_ip_ospf_retransmit_interval
,
7856 no_ip_ospf_retransmit_interval_addr_cmd
,
7857 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7860 "OSPF interface commands\n"
7861 "Time between retransmitting lost link state advertisements\n"
7863 "Address of interface\n")
7865 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7867 struct in_addr addr
;
7868 struct ospf_if_params
*params
;
7870 params
= IF_DEF_PARAMS(ifp
);
7872 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7873 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7875 "Please specify interface address by A.B.C.D\n");
7876 return CMD_WARNING_CONFIG_FAILED
;
7879 params
= ospf_lookup_if_params(ifp
, addr
);
7884 UNSET_IF_PARAM(params
, retransmit_interval
);
7885 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
7887 if (params
!= IF_DEF_PARAMS(ifp
)) {
7888 ospf_free_if_params(ifp
, addr
);
7889 ospf_if_update_params(ifp
, addr
);
7895 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
7896 no_ospf_retransmit_interval_cmd
,
7897 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7899 "OSPF interface commands\n"
7900 "Time between retransmitting lost link state advertisements\n"
7902 "Address of interface\n")
7904 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7907 DEFUN (ip_ospf_transmit_delay
,
7908 ip_ospf_transmit_delay_addr_cmd
,
7909 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
7911 "OSPF interface commands\n"
7912 "Link state transmit delay\n"
7914 "Address of interface\n")
7916 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7919 struct in_addr addr
;
7920 struct ospf_if_params
*params
;
7922 params
= IF_DEF_PARAMS(ifp
);
7923 argv_find(argv
, argc
, "(1-65535)", &idx
);
7924 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7926 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7927 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7929 "Please specify interface address by A.B.C.D\n");
7930 return CMD_WARNING_CONFIG_FAILED
;
7933 params
= ospf_get_if_params(ifp
, addr
);
7934 ospf_if_update_params(ifp
, addr
);
7937 SET_IF_PARAM(params
, transmit_delay
);
7938 params
->transmit_delay
= seconds
;
7943 DEFUN_HIDDEN (ospf_transmit_delay
,
7944 ospf_transmit_delay_cmd
,
7945 "ospf transmit-delay (1-65535) [A.B.C.D]",
7946 "OSPF interface commands\n"
7947 "Link state transmit delay\n"
7949 "Address of interface\n")
7951 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7954 DEFUN (no_ip_ospf_transmit_delay
,
7955 no_ip_ospf_transmit_delay_addr_cmd
,
7956 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
7959 "OSPF interface commands\n"
7960 "Link state transmit delay\n"
7962 "Address of interface\n")
7964 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7966 struct in_addr addr
;
7967 struct ospf_if_params
*params
;
7969 params
= IF_DEF_PARAMS(ifp
);
7971 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7972 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7974 "Please specify interface address by A.B.C.D\n");
7975 return CMD_WARNING_CONFIG_FAILED
;
7978 params
= ospf_lookup_if_params(ifp
, addr
);
7983 UNSET_IF_PARAM(params
, transmit_delay
);
7984 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
7986 if (params
!= IF_DEF_PARAMS(ifp
)) {
7987 ospf_free_if_params(ifp
, addr
);
7988 ospf_if_update_params(ifp
, addr
);
7995 DEFUN_HIDDEN (no_ospf_transmit_delay
,
7996 no_ospf_transmit_delay_cmd
,
7997 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
7999 "OSPF interface commands\n"
8000 "Link state transmit delay\n"
8002 "Address of interface\n")
8004 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
8007 DEFUN (ip_ospf_area
,
8009 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8011 "OSPF interface commands\n"
8013 "Enable OSPF on this interface\n"
8014 "OSPF area ID in IP address format\n"
8015 "OSPF area ID as a decimal value\n"
8016 "Address of interface\n")
8018 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8021 struct in_addr area_id
;
8022 struct in_addr addr
;
8023 struct ospf_if_params
*params
= NULL
;
8024 struct route_node
*rn
;
8025 struct ospf
*ospf
= NULL
;
8026 unsigned short instance
= 0;
8029 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8030 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8032 argv_find(argv
, argc
, "area", &idx
);
8033 areaid
= argv
[idx
+ 1]->arg
;
8035 if (ifp
->vrf_id
&& !instance
)
8036 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8038 ospf
= ospf_lookup_instance(instance
);
8040 if (instance
&& ospf
== NULL
) {
8041 params
= IF_DEF_PARAMS(ifp
);
8042 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8043 UNSET_IF_PARAM(params
, if_area
);
8044 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
8045 ospf_interface_area_unset(ospf
, ifp
);
8046 ospf
->if_ospf_cli_count
--;
8048 return CMD_NOT_MY_INSTANCE
;
8051 ret
= str2area_id(areaid
, &area_id
, &format
);
8053 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8054 return CMD_WARNING_CONFIG_FAILED
;
8056 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8057 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8058 return CMD_WARNING_CONFIG_FAILED
;
8061 params
= IF_DEF_PARAMS(ifp
);
8062 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8063 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8065 "Must remove previous area config before changing ospf area \n");
8066 return CMD_WARNING_CONFIG_FAILED
;
8069 // Check if we have an address arg and proccess it
8070 if (argc
== idx
+ 3) {
8071 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8073 "Please specify Intf Address by A.B.C.D\n");
8074 return CMD_WARNING_CONFIG_FAILED
;
8076 // update/create address-level params
8077 params
= ospf_get_if_params((ifp
), (addr
));
8078 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8080 "Must remove previous area/address config before changing ospf area");
8081 return CMD_WARNING_CONFIG_FAILED
;
8083 ospf_if_update_params((ifp
), (addr
));
8087 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8088 if (rn
->info
!= NULL
) {
8090 "Please remove all network commands first.\n");
8091 return CMD_WARNING_CONFIG_FAILED
;
8096 /* enable ospf on this interface with area_id */
8098 SET_IF_PARAM(params
, if_area
);
8099 params
->if_area
= area_id
;
8100 params
->if_area_id_fmt
= format
;
8104 ospf_interface_area_set(ospf
, ifp
);
8105 ospf
->if_ospf_cli_count
++;
8111 DEFUN (no_ip_ospf_area
,
8112 no_ip_ospf_area_cmd
,
8113 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8116 "OSPF interface commands\n"
8118 "Disable OSPF on this interface\n"
8119 "OSPF area ID in IP address format\n"
8120 "OSPF area ID as a decimal value\n"
8121 "Address of interface\n")
8123 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8126 struct ospf_if_params
*params
;
8127 unsigned short instance
= 0;
8128 struct in_addr addr
;
8130 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8131 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8133 if (ifp
->vrf_id
&& !instance
)
8134 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8136 ospf
= ospf_lookup_instance(instance
);
8139 return CMD_NOT_MY_INSTANCE
;
8141 argv_find(argv
, argc
, "area", &idx
);
8143 // Check if we have an address arg and proccess it
8144 if (argc
== idx
+ 3) {
8145 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8147 "Please specify Intf Address by A.B.C.D\n");
8148 return CMD_WARNING_CONFIG_FAILED
;
8150 params
= ospf_lookup_if_params(ifp
, addr
);
8151 if ((params
) == NULL
)
8154 params
= IF_DEF_PARAMS(ifp
);
8156 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8158 "Can't find specified interface area configuration.\n");
8159 return CMD_WARNING_CONFIG_FAILED
;
8162 UNSET_IF_PARAM(params
, if_area
);
8163 if (params
!= IF_DEF_PARAMS((ifp
))) {
8164 ospf_free_if_params((ifp
), (addr
));
8165 ospf_if_update_params((ifp
), (addr
));
8168 ospf_interface_area_unset(ospf
, ifp
);
8169 ospf
->if_ospf_cli_count
--;
8173 DEFUN (ospf_redistribute_source
,
8174 ospf_redistribute_source_cmd
,
8175 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8177 FRR_REDIST_HELP_STR_OSPFD
8178 "Metric for redistributed routes\n"
8179 "OSPF default metric\n"
8180 "OSPF exterior metric type for redistributed routes\n"
8181 "Set OSPF External Type 1/2 metrics\n"
8182 "Route map reference\n"
8183 "Pointer to route-map entries\n")
8185 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8186 int idx_protocol
= 1;
8190 struct ospf_redist
*red
;
8193 /* Get distribute source. */
8194 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8196 return CMD_WARNING_CONFIG_FAILED
;
8198 red
= ospf_redist_add(ospf
, source
, 0);
8200 /* Get metric value. */
8201 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8202 if (!str2metric(argv
[idx
]->arg
, &metric
))
8203 return CMD_WARNING_CONFIG_FAILED
;
8206 /* Get metric type. */
8207 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8208 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8209 return CMD_WARNING_CONFIG_FAILED
;
8213 if (argv_find(argv
, argc
, "WORD", &idx
)) {
8214 ospf_routemap_set(red
, argv
[idx
]->arg
);
8216 ospf_routemap_unset(red
);
8218 return ospf_redistribute_set(ospf
, source
, 0, type
, metric
);
8221 DEFUN (no_ospf_redistribute_source
,
8222 no_ospf_redistribute_source_cmd
,
8223 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8226 FRR_REDIST_HELP_STR_OSPFD
8227 "Metric for redistributed routes\n"
8228 "OSPF default metric\n"
8229 "OSPF exterior metric type for redistributed routes\n"
8230 "Set OSPF External Type 1/2 metrics\n"
8231 "Route map reference\n"
8232 "Pointer to route-map entries\n")
8234 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8235 int idx_protocol
= 2;
8237 struct ospf_redist
*red
;
8239 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8241 return CMD_WARNING_CONFIG_FAILED
;
8243 red
= ospf_redist_lookup(ospf
, source
, 0);
8247 ospf_routemap_unset(red
);
8248 ospf_redist_del(ospf
, source
, 0);
8250 return ospf_redistribute_unset(ospf
, source
, 0);
8253 DEFUN (ospf_redistribute_instance_source
,
8254 ospf_redistribute_instance_source_cmd
,
8255 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8257 "Open Shortest Path First\n"
8258 "Non-main Kernel Routing Table\n"
8259 "Instance ID/Table ID\n"
8260 "Metric for redistributed routes\n"
8261 "OSPF default metric\n"
8262 "OSPF exterior metric type for redistributed routes\n"
8263 "Set OSPF External Type 1/2 metrics\n"
8264 "Route map reference\n"
8265 "Pointer to route-map entries\n")
8267 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8268 int idx_ospf_table
= 1;
8274 unsigned short instance
;
8275 struct ospf_redist
*red
;
8277 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
8280 vty_out(vty
, "Unknown instance redistribution\n");
8281 return CMD_WARNING_CONFIG_FAILED
;
8284 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8286 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8288 "Instance redistribution in non-instanced OSPF not allowed\n");
8289 return CMD_WARNING_CONFIG_FAILED
;
8292 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8293 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8294 return CMD_WARNING_CONFIG_FAILED
;
8297 /* Get metric value. */
8298 if (argv_find(argv
, argc
, "metric", &idx
))
8299 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
8300 return CMD_WARNING_CONFIG_FAILED
;
8303 /* Get metric type. */
8304 if (argv_find(argv
, argc
, "metric-type", &idx
))
8305 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
8306 return CMD_WARNING_CONFIG_FAILED
;
8308 red
= ospf_redist_add(ospf
, source
, instance
);
8311 if (argv_find(argv
, argc
, "route-map", &idx
))
8312 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
8314 ospf_routemap_unset(red
);
8316 return ospf_redistribute_set(ospf
, source
, instance
, type
, metric
);
8319 DEFUN (no_ospf_redistribute_instance_source
,
8320 no_ospf_redistribute_instance_source_cmd
,
8321 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8324 "Open Shortest Path First\n"
8325 "Non-main Kernel Routing Table\n"
8326 "Instance ID/Table Id\n"
8327 "Metric for redistributed routes\n"
8328 "OSPF default metric\n"
8329 "OSPF exterior metric type for redistributed routes\n"
8330 "Set OSPF External Type 1/2 metrics\n"
8331 "Route map reference\n"
8332 "Pointer to route-map entries\n")
8334 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8335 int idx_ospf_table
= 2;
8337 unsigned int instance
;
8338 struct ospf_redist
*red
;
8341 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
8342 source
= ZEBRA_ROUTE_OSPF
;
8344 source
= ZEBRA_ROUTE_TABLE
;
8346 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8348 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8350 "Instance redistribution in non-instanced OSPF not allowed\n");
8351 return CMD_WARNING_CONFIG_FAILED
;
8354 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8355 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8356 return CMD_WARNING_CONFIG_FAILED
;
8359 red
= ospf_redist_lookup(ospf
, source
, instance
);
8363 ospf_routemap_unset(red
);
8364 ospf_redist_del(ospf
, source
, instance
);
8366 return ospf_redistribute_unset(ospf
, source
, instance
);
8369 DEFUN (ospf_distribute_list_out
,
8370 ospf_distribute_list_out_cmd
,
8371 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8372 "Filter networks in routing updates\n"
8373 "Access-list name\n"
8375 FRR_REDIST_HELP_STR_OSPFD
)
8377 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8381 char *proto
= argv
[argc
- 1]->text
;
8383 /* Get distribute source. */
8384 source
= proto_redistnum(AFI_IP
, proto
);
8386 return CMD_WARNING_CONFIG_FAILED
;
8388 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
8391 DEFUN (no_ospf_distribute_list_out
,
8392 no_ospf_distribute_list_out_cmd
,
8393 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8395 "Filter networks in routing updates\n"
8396 "Access-list name\n"
8398 FRR_REDIST_HELP_STR_OSPFD
)
8400 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8404 char *proto
= argv
[argc
- 1]->text
;
8405 source
= proto_redistnum(AFI_IP
, proto
);
8407 return CMD_WARNING_CONFIG_FAILED
;
8409 return ospf_distribute_list_out_unset(ospf
, source
,
8410 argv
[idx_word
]->arg
);
8413 /* Default information originate. */
8414 DEFUN (ospf_default_information_originate
,
8415 ospf_default_information_originate_cmd
,
8416 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8417 "Control distribution of default information\n"
8418 "Distribute a default route\n"
8419 "Always advertise default route\n"
8420 "OSPF default metric\n"
8422 "OSPF metric type for default routes\n"
8423 "Set OSPF External Type 1/2 metrics\n"
8424 "Route map reference\n"
8425 "Pointer to route-map entries\n")
8427 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8428 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
8431 struct ospf_redist
*red
;
8433 int cur_originate
= ospf
->default_originate
;
8437 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
8439 /* Check whether "always" was specified */
8440 if (argv_find(argv
, argc
, "always", &idx
))
8441 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
8443 /* Get metric value */
8444 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8445 if (!str2metric(argv
[idx
]->arg
, &metric
))
8446 return CMD_WARNING_CONFIG_FAILED
;
8449 /* Get metric type. */
8450 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8451 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8452 return CMD_WARNING_CONFIG_FAILED
;
8456 if (argv_find(argv
, argc
, "WORD", &idx
))
8457 rtmap
= argv
[idx
]->arg
;
8459 /* To check ,if user is providing same route map */
8460 if ((rtmap
== ROUTEMAP_NAME(red
)) ||
8461 (rtmap
&& ROUTEMAP_NAME(red
)
8462 && (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
8465 /* Don't allow if the same lsa is aleardy originated. */
8467 && (red
->dmetric
.type
== type
)
8468 && (red
->dmetric
.value
== metric
)
8469 && (cur_originate
== default_originate
))
8472 /* Updating Metric details */
8473 red
->dmetric
.type
= type
;
8474 red
->dmetric
.value
= metric
;
8476 /* updating route map details */
8478 ospf_routemap_set(red
, rtmap
);
8480 ospf_routemap_unset(red
);
8482 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
8486 DEFUN (no_ospf_default_information_originate
,
8487 no_ospf_default_information_originate_cmd
,
8488 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8490 "Control distribution of default information\n"
8491 "Distribute a default route\n"
8492 "Always advertise default route\n"
8493 "OSPF default metric\n"
8495 "OSPF metric type for default routes\n"
8496 "Set OSPF External Type 1/2 metrics\n"
8497 "Route map reference\n"
8498 "Pointer to route-map entries\n")
8500 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8501 struct ospf_redist
*red
;
8503 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8507 ospf_routemap_unset(red
);
8508 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
8510 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
8514 DEFUN (ospf_default_metric
,
8515 ospf_default_metric_cmd
,
8516 "default-metric (0-16777214)",
8517 "Set metric of redistributed routes\n"
8520 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8524 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
8525 return CMD_WARNING_CONFIG_FAILED
;
8527 ospf
->default_metric
= metric
;
8532 DEFUN (no_ospf_default_metric
,
8533 no_ospf_default_metric_cmd
,
8534 "no default-metric [(0-16777214)]",
8536 "Set metric of redistributed routes\n"
8539 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8541 ospf
->default_metric
= -1;
8547 DEFUN (ospf_distance
,
8550 "Administrative distance\n"
8551 "OSPF Administrative distance\n")
8553 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8556 ospf
->distance_all
= atoi(argv
[idx_number
]->arg
);
8561 DEFUN (no_ospf_distance
,
8562 no_ospf_distance_cmd
,
8563 "no distance (1-255)",
8565 "Administrative distance\n"
8566 "OSPF Administrative distance\n")
8568 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8570 ospf
->distance_all
= 0;
8575 DEFUN (no_ospf_distance_ospf
,
8576 no_ospf_distance_ospf_cmd
,
8577 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
8579 "Administrative distance\n"
8580 "OSPF administrative distance\n"
8581 "Intra-area routes\n"
8582 "Distance for intra-area routes\n"
8583 "Inter-area routes\n"
8584 "Distance for inter-area routes\n"
8586 "Distance for external routes\n")
8588 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8591 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
8592 idx
= ospf
->distance_intra
= 0;
8593 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
8594 idx
= ospf
->distance_inter
= 0;
8595 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
8596 ospf
->distance_external
= 0;
8601 DEFUN (ospf_distance_ospf
,
8602 ospf_distance_ospf_cmd
,
8603 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
8604 "Administrative distance\n"
8605 "OSPF administrative distance\n"
8606 "Intra-area routes\n"
8607 "Distance for intra-area routes\n"
8608 "Inter-area routes\n"
8609 "Distance for inter-area routes\n"
8611 "Distance for external routes\n")
8613 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8616 ospf
->distance_intra
= 0;
8617 ospf
->distance_inter
= 0;
8618 ospf
->distance_external
= 0;
8620 if (argv_find(argv
, argc
, "intra-area", &idx
))
8621 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
8623 if (argv_find(argv
, argc
, "inter-area", &idx
))
8624 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
8626 if (argv_find(argv
, argc
, "external", &idx
))
8627 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
8633 DEFUN (ospf_distance_source
,
8634 ospf_distance_source_cmd
,
8635 "distance (1-255) A.B.C.D/M",
8636 "Administrative distance\n"
8638 "IP source prefix\n")
8640 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8642 int idx_ipv4_prefixlen
= 2;
8644 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8649 DEFUN (no_ospf_distance_source
,
8650 no_ospf_distance_source_cmd
,
8651 "no distance (1-255) A.B.C.D/M",
8653 "Administrative distance\n"
8655 "IP source prefix\n")
8657 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8659 int idx_ipv4_prefixlen
= 3;
8661 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8666 DEFUN (ospf_distance_source_access_list
,
8667 ospf_distance_source_access_list_cmd
,
8668 "distance (1-255) A.B.C.D/M WORD",
8669 "Administrative distance\n"
8671 "IP source prefix\n"
8672 "Access list name\n")
8674 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8676 int idx_ipv4_prefixlen
= 2;
8679 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8684 DEFUN (no_ospf_distance_source_access_list
,
8685 no_ospf_distance_source_access_list_cmd
,
8686 "no distance (1-255) A.B.C.D/M WORD",
8688 "Administrative distance\n"
8690 "IP source prefix\n"
8691 "Access list name\n")
8693 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8695 int idx_ipv4_prefixlen
= 3;
8698 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8704 DEFUN (ip_ospf_mtu_ignore
,
8705 ip_ospf_mtu_ignore_addr_cmd
,
8706 "ip ospf mtu-ignore [A.B.C.D]",
8708 "OSPF interface commands\n"
8709 "Disable MTU mismatch detection on this interface\n"
8710 "Address of interface\n")
8712 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8714 struct in_addr addr
;
8717 struct ospf_if_params
*params
;
8718 params
= IF_DEF_PARAMS(ifp
);
8721 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8724 "Please specify interface address by A.B.C.D\n");
8725 return CMD_WARNING_CONFIG_FAILED
;
8727 params
= ospf_get_if_params(ifp
, addr
);
8728 ospf_if_update_params(ifp
, addr
);
8730 params
->mtu_ignore
= 1;
8731 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8732 SET_IF_PARAM(params
, mtu_ignore
);
8734 UNSET_IF_PARAM(params
, mtu_ignore
);
8735 if (params
!= IF_DEF_PARAMS(ifp
)) {
8736 ospf_free_if_params(ifp
, addr
);
8737 ospf_if_update_params(ifp
, addr
);
8743 DEFUN (no_ip_ospf_mtu_ignore
,
8744 no_ip_ospf_mtu_ignore_addr_cmd
,
8745 "no ip ospf mtu-ignore [A.B.C.D]",
8748 "OSPF interface commands\n"
8749 "Disable MTU mismatch detection on this interface\n"
8750 "Address of interface\n")
8752 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8754 struct in_addr addr
;
8757 struct ospf_if_params
*params
;
8758 params
= IF_DEF_PARAMS(ifp
);
8761 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8764 "Please specify interface address by A.B.C.D\n");
8765 return CMD_WARNING_CONFIG_FAILED
;
8767 params
= ospf_get_if_params(ifp
, addr
);
8768 ospf_if_update_params(ifp
, addr
);
8770 params
->mtu_ignore
= 0;
8771 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8772 SET_IF_PARAM(params
, mtu_ignore
);
8774 UNSET_IF_PARAM(params
, mtu_ignore
);
8775 if (params
!= IF_DEF_PARAMS(ifp
)) {
8776 ospf_free_if_params(ifp
, addr
);
8777 ospf_if_update_params(ifp
, addr
);
8784 DEFUN (ospf_max_metric_router_lsa_admin
,
8785 ospf_max_metric_router_lsa_admin_cmd
,
8786 "max-metric router-lsa administrative",
8787 "OSPF maximum / infinite-distance metric\n"
8788 "Advertise own Router-LSA with infinite distance (stub router)\n"
8789 "Administratively applied, for an indefinite period\n")
8791 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8792 struct listnode
*ln
;
8793 struct ospf_area
*area
;
8795 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8796 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
8798 if (!CHECK_FLAG(area
->stub_router_state
,
8799 OSPF_AREA_IS_STUB_ROUTED
))
8800 ospf_router_lsa_update_area(area
);
8803 /* Allows for areas configured later to get the property */
8804 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
8809 DEFUN (no_ospf_max_metric_router_lsa_admin
,
8810 no_ospf_max_metric_router_lsa_admin_cmd
,
8811 "no max-metric router-lsa administrative",
8813 "OSPF maximum / infinite-distance metric\n"
8814 "Advertise own Router-LSA with infinite distance (stub router)\n"
8815 "Administratively applied, for an indefinite period\n")
8817 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8818 struct listnode
*ln
;
8819 struct ospf_area
*area
;
8821 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8822 UNSET_FLAG(area
->stub_router_state
,
8823 OSPF_AREA_ADMIN_STUB_ROUTED
);
8825 /* Don't trample on the start-up stub timer */
8826 if (CHECK_FLAG(area
->stub_router_state
,
8827 OSPF_AREA_IS_STUB_ROUTED
)
8828 && !area
->t_stub_router
) {
8829 UNSET_FLAG(area
->stub_router_state
,
8830 OSPF_AREA_IS_STUB_ROUTED
);
8831 ospf_router_lsa_update_area(area
);
8834 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
8838 DEFUN (ospf_max_metric_router_lsa_startup
,
8839 ospf_max_metric_router_lsa_startup_cmd
,
8840 "max-metric router-lsa on-startup (5-86400)",
8841 "OSPF maximum / infinite-distance metric\n"
8842 "Advertise own Router-LSA with infinite distance (stub router)\n"
8843 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8844 "Time (seconds) to advertise self as stub-router\n")
8846 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8848 unsigned int seconds
;
8851 vty_out(vty
, "%% Must supply stub-router period");
8852 return CMD_WARNING_CONFIG_FAILED
;
8855 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8857 ospf
->stub_router_startup_time
= seconds
;
8862 DEFUN (no_ospf_max_metric_router_lsa_startup
,
8863 no_ospf_max_metric_router_lsa_startup_cmd
,
8864 "no max-metric router-lsa on-startup [(5-86400)]",
8866 "OSPF maximum / infinite-distance metric\n"
8867 "Advertise own Router-LSA with infinite distance (stub router)\n"
8868 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8869 "Time (seconds) to advertise self as stub-router\n")
8871 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8872 struct listnode
*ln
;
8873 struct ospf_area
*area
;
8875 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8877 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8878 SET_FLAG(area
->stub_router_state
,
8879 OSPF_AREA_WAS_START_STUB_ROUTED
);
8880 OSPF_TIMER_OFF(area
->t_stub_router
);
8882 /* Don't trample on admin stub routed */
8883 if (!CHECK_FLAG(area
->stub_router_state
,
8884 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8885 UNSET_FLAG(area
->stub_router_state
,
8886 OSPF_AREA_IS_STUB_ROUTED
);
8887 ospf_router_lsa_update_area(area
);
8894 DEFUN (ospf_max_metric_router_lsa_shutdown
,
8895 ospf_max_metric_router_lsa_shutdown_cmd
,
8896 "max-metric router-lsa on-shutdown (5-100)",
8897 "OSPF maximum / infinite-distance metric\n"
8898 "Advertise own Router-LSA with infinite distance (stub router)\n"
8899 "Advertise stub-router prior to full shutdown of OSPF\n"
8900 "Time (seconds) to wait till full shutdown\n")
8902 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8904 unsigned int seconds
;
8907 vty_out(vty
, "%% Must supply stub-router shutdown period");
8908 return CMD_WARNING_CONFIG_FAILED
;
8911 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8913 ospf
->stub_router_shutdown_time
= seconds
;
8918 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
8919 no_ospf_max_metric_router_lsa_shutdown_cmd
,
8920 "no max-metric router-lsa on-shutdown [(5-100)]",
8922 "OSPF maximum / infinite-distance metric\n"
8923 "Advertise own Router-LSA with infinite distance (stub router)\n"
8924 "Advertise stub-router prior to full shutdown of OSPF\n"
8925 "Time (seconds) to wait till full shutdown\n")
8927 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8929 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8934 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
8936 struct listnode
*ln
;
8937 struct ospf_area
*area
;
8939 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8940 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
8941 ospf
->stub_router_startup_time
);
8942 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8943 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
8944 ospf
->stub_router_shutdown_time
);
8945 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8946 if (CHECK_FLAG(area
->stub_router_state
,
8947 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8948 vty_out(vty
, " max-metric router-lsa administrative\n");
8955 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
8956 struct route_table
*rt
,
8959 struct route_node
*rn
;
8960 struct ospf_route
* or ;
8961 struct listnode
*pnode
, *pnnode
;
8962 struct ospf_path
*path
;
8963 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
8964 *json_nexthop
= NULL
;
8968 "============ OSPF network routing table ============\n");
8970 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
8971 if ((or = rn
->info
) == NULL
)
8973 char buf1
[PREFIX2STR_BUFFER
];
8975 memset(buf1
, 0, sizeof(buf1
));
8976 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
8978 json_route
= json_object_new_object();
8980 json_object_object_add(json
, buf1
, json_route
);
8981 json_object_to_json_string_ext(
8982 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
8985 switch (or->path_type
) {
8986 case OSPF_PATH_INTER_AREA
:
8987 if (or->type
== OSPF_DESTINATION_NETWORK
) {
8989 json_object_string_add(json_route
,
8992 json_object_int_add(json_route
, "cost",
8994 json_object_string_add(
8996 inet_ntoa(or->u
.std
.area_id
));
8999 "N IA %-18s [%d] area: %s\n",
9001 inet_ntoa(or->u
.std
.area_id
));
9003 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
9005 json_object_string_add(json_route
,
9010 "D IA %-18s Discard entry\n",
9015 case OSPF_PATH_INTRA_AREA
:
9017 json_object_string_add(json_route
, "routeType",
9019 json_object_int_add(json_route
, "cost",
9021 json_object_string_add(
9023 inet_ntoa(or->u
.std
.area_id
));
9025 vty_out(vty
, "N %-18s [%d] area: %s\n",
9027 inet_ntoa(or->u
.std
.area_id
));
9034 if (or->type
== OSPF_DESTINATION_NETWORK
) {
9036 json_nexthop_array
= json_object_new_array();
9037 json_object_object_add(json_route
, "nexthops",
9038 json_nexthop_array
);
9041 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
9044 json_nexthop
= json_object_new_object();
9045 json_object_array_add(
9049 if (if_lookup_by_index(path
->ifindex
,
9052 if (path
->nexthop
.s_addr
== 0) {
9054 json_object_string_add(
9057 json_object_string_add(
9059 "directly attached to",
9065 "%24s directly attached to %s\n",
9073 json_object_string_add(
9078 json_object_string_add(
9086 "%24s via %s, %s\n",
9099 json_object_free(json_route
);
9105 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
9106 struct route_table
*rtrs
,
9109 struct route_node
*rn
;
9110 struct ospf_route
* or ;
9111 struct listnode
*pnode
;
9112 struct listnode
*node
;
9113 struct ospf_path
*path
;
9114 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9115 *json_nexthop
= NULL
;
9119 "============ OSPF router routing table =============\n");
9121 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
9122 if (rn
->info
== NULL
)
9126 json_route
= json_object_new_object();
9128 json_object_object_add(json
, inet_ntoa(rn
->p
.u
.prefix4
),
9130 json_object_string_add(json_route
, "routeType", "R ");
9132 vty_out(vty
, "R %-15s ",
9133 inet_ntoa(rn
->p
.u
.prefix4
));
9136 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
9139 vty_out(vty
, "%24s", "");
9144 json_object_int_add(json_route
, "cost",
9146 json_object_string_add(
9148 inet_ntoa(or->u
.std
.area_id
));
9149 if (or->path_type
== OSPF_PATH_INTER_AREA
)
9150 json_object_boolean_true_add(json_route
,
9152 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
9153 json_object_string_add(json_route
,
9156 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
9157 json_object_string_add(json_route
,
9161 vty_out(vty
, "%s [%d] area: %s",
9162 (or->path_type
== OSPF_PATH_INTER_AREA
9165 or->cost
, inet_ntoa(or->u
.std
.area_id
));
9167 vty_out(vty
, "%s%s\n",
9168 (or->u
.std
.flags
& ROUTER_LSA_BORDER
9171 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
9177 json_nexthop_array
= json_object_new_array();
9178 json_object_object_add(json_route
, "nexthops",
9179 json_nexthop_array
);
9182 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
9184 json_nexthop
= json_object_new_object();
9185 json_object_array_add(
9189 if (if_lookup_by_index(path
->ifindex
,
9191 if (path
->nexthop
.s_addr
== 0) {
9193 json_object_string_add(
9196 json_object_string_add(
9198 "directly attached to",
9204 "%24s directly attached to %s\n",
9212 json_object_string_add(
9217 json_object_string_add(
9225 "%24s via %s, %s\n",
9238 json_object_free(json_route
);
9244 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
9245 struct route_table
*rt
,
9248 struct route_node
*rn
;
9249 struct ospf_route
*er
;
9250 struct listnode
*pnode
, *pnnode
;
9251 struct ospf_path
*path
;
9252 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9253 *json_nexthop
= NULL
;
9257 "============ OSPF external routing table ===========\n");
9259 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
9260 if ((er
= rn
->info
) == NULL
)
9265 snprintf(buf1
, 19, "%s/%d", inet_ntoa(rn
->p
.u
.prefix4
),
9267 json_route
= json_object_new_object();
9269 json_object_object_add(json
, buf1
, json_route
);
9270 json_object_to_json_string_ext(
9271 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
9274 switch (er
->path_type
) {
9275 case OSPF_PATH_TYPE1_EXTERNAL
:
9277 json_object_string_add(json_route
, "routeType",
9279 json_object_int_add(json_route
, "cost",
9283 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
9285 buf1
, er
->cost
, er
->u
.ext
.tag
);
9288 case OSPF_PATH_TYPE2_EXTERNAL
:
9290 json_object_string_add(json_route
, "routeType",
9292 json_object_int_add(json_route
, "cost",
9296 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
9298 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
9305 json_nexthop_array
= json_object_new_array();
9306 json_object_object_add(json_route
, "nexthops",
9307 json_nexthop_array
);
9310 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
9312 json_nexthop
= json_object_new_object();
9313 json_object_array_add(json_nexthop_array
,
9317 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
9318 if (path
->nexthop
.s_addr
== 0) {
9320 json_object_string_add(
9323 json_object_string_add(
9325 "directly attached to",
9331 "%24s directly attached to %s\n",
9339 json_object_string_add(
9343 json_object_string_add(
9344 json_nexthop
, "via",
9350 "%24s via %s, %s\n",
9362 json_object_free(json_route
);
9368 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
9373 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9375 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
9377 if (ospf
->new_table
== NULL
) {
9378 vty_out(vty
, "No OSPF routing information exist\n");
9382 /* Show Network routes.
9383 show_ip_ospf_route_network (vty, ospf->new_table); */
9385 /* Show Router routes. */
9386 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
9393 DEFUN (show_ip_ospf_border_routers
,
9394 show_ip_ospf_border_routers_cmd
,
9395 "show ip ospf [vrf <NAME|all>] border-routers",
9398 "OSPF information\n"
9401 "Show all the ABR's and ASBR's\n")
9403 struct ospf
*ospf
= NULL
;
9404 struct listnode
*node
= NULL
;
9405 char *vrf_name
= NULL
;
9406 bool all_vrf
= false;
9407 int ret
= CMD_SUCCESS
;
9410 uint8_t use_vrf
= 0;
9412 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9415 bool ospf_output
= false;
9420 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9421 if (!ospf
->oi_running
)
9425 ret
= show_ip_ospf_border_routers_common(
9426 vty
, ospf
, use_vrf
);
9430 vty_out(vty
, "%% OSPF instance not found\n");
9432 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9433 if (ospf
== NULL
|| !ospf
->oi_running
) {
9434 vty_out(vty
, "%% OSPF instance not found\n");
9438 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
9442 /* Display default ospf (instance 0) info */
9443 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9444 if (ospf
== NULL
|| !ospf
->oi_running
) {
9445 vty_out(vty
, "%% OSPF instance not found\n");
9449 ret
= show_ip_ospf_border_routers_common(vty
, ospf
, use_vrf
);
9455 DEFUN (show_ip_ospf_instance_border_routers
,
9456 show_ip_ospf_instance_border_routers_cmd
,
9457 "show ip ospf (1-65535) border-routers",
9460 "OSPF information\n"
9462 "Show all the ABR's and ASBR's\n")
9466 unsigned short instance
= 0;
9468 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9469 ospf
= ospf_lookup_instance(instance
);
9471 return CMD_NOT_MY_INSTANCE
;
9473 if (!ospf
->oi_running
)
9476 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
9479 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
9480 json_object
*json
, uint8_t use_vrf
)
9482 json_object
*json_vrf
= NULL
;
9485 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9490 json_vrf
= json_object_new_object();
9495 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
9497 if (ospf
->new_table
== NULL
) {
9498 vty_out(vty
, "No OSPF routing information exist\n");
9502 /* Show Network routes. */
9503 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
9505 /* Show Router routes. */
9506 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
9508 /* Show AS External routes. */
9509 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
9514 // json_object_object_add(json_vrf, "areas",
9516 if (ospf
->vrf_id
== VRF_DEFAULT
)
9517 json_object_object_add(json
, "default",
9520 json_object_object_add(json
, ospf
->name
,
9530 DEFUN (show_ip_ospf_route
,
9531 show_ip_ospf_route_cmd
,
9532 "show ip ospf [vrf <NAME|all>] route [json]",
9535 "OSPF information\n"
9538 "OSPF routing table\n"
9541 struct ospf
*ospf
= NULL
;
9542 struct listnode
*node
= NULL
;
9543 char *vrf_name
= NULL
;
9544 bool all_vrf
= false;
9545 int ret
= CMD_SUCCESS
;
9548 uint8_t use_vrf
= 0;
9549 bool uj
= use_json(argc
, argv
);
9550 json_object
*json
= NULL
;
9553 json
= json_object_new_object();
9555 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9557 /* vrf input is provided could be all or specific vrf*/
9559 bool ospf_output
= false;
9564 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9565 if (!ospf
->oi_running
)
9568 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
9573 /* Keep Non-pretty format */
9574 vty_out(vty
, "%s\n",
9575 json_object_to_json_string(json
));
9576 json_object_free(json
);
9577 } else if (!ospf_output
)
9578 vty_out(vty
, "%% OSPF instance not found\n");
9582 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9583 if (ospf
== NULL
|| !ospf
->oi_running
) {
9585 vty_out(vty
, "%s\n",
9586 json_object_to_json_string_ext(
9587 json
, JSON_C_TO_STRING_PRETTY
));
9588 json_object_free(json
);
9590 vty_out(vty
, "%% OSPF instance not found\n");
9595 /* Display default ospf (instance 0) info */
9596 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9597 if (ospf
== NULL
|| !ospf
->oi_running
) {
9599 vty_out(vty
, "%s\n",
9600 json_object_to_json_string_ext(
9601 json
, JSON_C_TO_STRING_PRETTY
));
9602 json_object_free(json
);
9604 vty_out(vty
, "%% OSPF instance not found\n");
9611 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
9612 /* Keep Non-pretty format */
9614 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
9618 json_object_free(json
);
9623 DEFUN (show_ip_ospf_instance_route
,
9624 show_ip_ospf_instance_route_cmd
,
9625 "show ip ospf (1-65535) route",
9628 "OSPF information\n"
9630 "OSPF routing table\n")
9634 unsigned short instance
= 0;
9636 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9637 ospf
= ospf_lookup_instance(instance
);
9639 return CMD_NOT_MY_INSTANCE
;
9641 if (!ospf
->oi_running
)
9644 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
9648 DEFUN (show_ip_ospf_vrfs
,
9649 show_ip_ospf_vrfs_cmd
,
9650 "show ip ospf vrfs [json]",
9653 "OSPF information\n"
9657 bool uj
= use_json(argc
, argv
);
9658 json_object
*json
= NULL
;
9659 json_object
*json_vrfs
= NULL
;
9660 struct ospf
*ospf
= NULL
;
9661 struct listnode
*node
= NULL
;
9663 static const char header
[] = "Name Id RouterId ";
9666 json
= json_object_new_object();
9667 json_vrfs
= json_object_new_object();
9670 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9671 json_object
*json_vrf
= NULL
;
9672 const char *name
= NULL
;
9673 int64_t vrf_id_ui
= 0;
9677 if (!uj
&& count
== 1)
9678 vty_out(vty
, "%s\n", header
);
9680 json_vrf
= json_object_new_object();
9682 if (ospf
->vrf_id
== VRF_DEFAULT
)
9683 name
= VRF_DEFAULT_NAME
;
9687 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
9689 : (int64_t)ospf
->vrf_id
;
9692 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
9693 json_object_string_add(json_vrf
, "routerId",
9694 inet_ntoa(ospf
->router_id
));
9696 json_object_object_add(json_vrfs
, name
, json_vrf
);
9699 vty_out(vty
, "%-25s %-5d %-16s \n", name
,
9700 ospf
->vrf_id
, inet_ntoa(ospf
->router_id
));
9705 json_object_object_add(json
, "vrfs", json_vrfs
);
9706 json_object_int_add(json
, "totalVrfs", count
);
9708 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
9709 json
, JSON_C_TO_STRING_PRETTY
));
9710 json_object_free(json
);
9713 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
9720 static const char *const ospf_abr_type_str
[] = {
9721 "unknown", "standard", "ibm", "cisco", "shortcut"
9724 static const char *const ospf_shortcut_mode_str
[] = {
9725 "default", "enable", "disable"
9728 static const char *const ospf_int_type_str
[] = {
9729 "unknown", /* should never be used. */
9733 "point-to-multipoint",
9734 "virtual-link", /* should never be used. */
9738 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
9740 struct listnode
*node
;
9741 struct interface
*ifp
;
9742 struct crypt_key
*ck
;
9743 struct route_node
*rn
= NULL
;
9744 struct ospf_if_params
*params
;
9746 struct ospf
*ospf
= vrf
->info
;
9748 FOR_ALL_INTERFACES (vrf
, ifp
) {
9750 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
9753 vty_frame(vty
, "!\n");
9754 if (ifp
->vrf_id
== VRF_DEFAULT
)
9755 vty_frame(vty
, "interface %s\n", ifp
->name
);
9757 vty_frame(vty
, "interface %s vrf %s\n", ifp
->name
,
9760 vty_out(vty
, " description %s\n", ifp
->desc
);
9764 params
= IF_DEF_PARAMS(ifp
);
9767 /* Interface Network print. */
9768 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
9769 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
9770 if (params
->type
!= ospf_default_iftype(ifp
)) {
9771 vty_out(vty
, " ip ospf network %s",
9774 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9782 /* OSPF interface authentication print */
9783 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
9784 && params
->auth_type
!= OSPF_AUTH_NOTSET
) {
9785 const char *auth_str
;
9787 /* Translation tables are not that much help
9788 * here due to syntax
9789 * of the simple option */
9790 switch (params
->auth_type
) {
9792 case OSPF_AUTH_NULL
:
9796 case OSPF_AUTH_SIMPLE
:
9800 case OSPF_AUTH_CRYPTOGRAPHIC
:
9801 auth_str
= " message-digest";
9809 vty_out(vty
, " ip ospf authentication%s",
9811 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9813 inet_ntoa(rn
->p
.u
.prefix4
));
9817 /* Simple Authentication Password print. */
9818 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
9819 && params
->auth_simple
[0] != '\0') {
9820 vty_out(vty
, " ip ospf authentication-key %s",
9821 params
->auth_simple
);
9822 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9824 inet_ntoa(rn
->p
.u
.prefix4
));
9828 /* Cryptographic Authentication Key print. */
9829 if (params
&& params
->auth_crypt
) {
9830 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
9833 " ip ospf message-digest-key %d md5 %s",
9834 ck
->key_id
, ck
->auth_key
);
9835 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9843 /* Interface Output Cost print. */
9844 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
9845 vty_out(vty
, " ip ospf cost %u",
9846 params
->output_cost_cmd
);
9847 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9849 inet_ntoa(rn
->p
.u
.prefix4
));
9853 /* Hello Interval print. */
9854 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
9855 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
9856 vty_out(vty
, " ip ospf hello-interval %u",
9858 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9860 inet_ntoa(rn
->p
.u
.prefix4
));
9865 /* Router Dead Interval print. */
9866 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
9868 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
) {
9869 vty_out(vty
, " ip ospf dead-interval ");
9872 if (OSPF_IF_PARAM_CONFIGURED(params
,
9875 "minimal hello-multiplier %d",
9876 params
->fast_hello
);
9878 vty_out(vty
, "%u", params
->v_wait
);
9880 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9882 inet_ntoa(rn
->p
.u
.prefix4
));
9886 /* Router Priority print. */
9887 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
9889 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
9890 vty_out(vty
, " ip ospf priority %u",
9892 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9894 inet_ntoa(rn
->p
.u
.prefix4
));
9898 /* Retransmit Interval print. */
9899 if (OSPF_IF_PARAM_CONFIGURED(params
,
9900 retransmit_interval
)
9901 && params
->retransmit_interval
9902 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
9903 vty_out(vty
, " ip ospf retransmit-interval %u",
9904 params
->retransmit_interval
);
9905 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9907 inet_ntoa(rn
->p
.u
.prefix4
));
9911 /* Transmit Delay print. */
9912 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
9913 && params
->transmit_delay
9914 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
9915 vty_out(vty
, " ip ospf transmit-delay %u",
9916 params
->transmit_delay
);
9917 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9919 inet_ntoa(rn
->p
.u
.prefix4
));
9924 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9925 if (ospf
&& ospf
->instance
)
9926 vty_out(vty
, " ip ospf %d",
9929 vty_out(vty
, " ip ospf");
9931 char buf
[INET_ADDRSTRLEN
];
9933 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
9934 params
->if_area_id_fmt
);
9935 vty_out(vty
, " area %s", buf
);
9936 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9938 inet_ntoa(rn
->p
.u
.prefix4
));
9943 if (params
&& params
->bfd_info
)
9944 ospf_bfd_write_config(vty
, params
);
9946 /* MTU ignore print. */
9947 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
9948 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
9949 if (params
->mtu_ignore
== 0)
9950 vty_out(vty
, " no ip ospf mtu-ignore");
9952 vty_out(vty
, " ip ospf mtu-ignore");
9953 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9955 inet_ntoa(rn
->p
.u
.prefix4
));
9962 rn
= route_top(IF_OIFS_PARAMS(ifp
));
9964 rn
= route_next(rn
);
9974 ospf_opaque_config_write_if(vty
, ifp
);
9976 vty_endframe(vty
, NULL
);
9982 /* Configuration write function for ospfd. */
9983 static int config_write_interface(struct vty
*vty
)
9986 struct vrf
*vrf
= NULL
;
9988 /* Display all VRF aware OSPF interface configuration */
9989 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
9990 write
+= config_write_interface_one(vty
, vrf
);
9996 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
9998 struct route_node
*rn
;
9999 uint8_t buf
[INET_ADDRSTRLEN
];
10001 /* `network area' print. */
10002 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
10004 struct ospf_network
*n
= rn
->info
;
10006 /* Create Area ID string by specified Area ID format. */
10007 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
10008 inet_ntop(AF_INET
, &n
->area_id
, (char *)buf
,
10011 sprintf((char *)buf
, "%lu",
10012 (unsigned long int)ntohl(
10013 n
->area_id
.s_addr
));
10015 /* Network print. */
10016 vty_out(vty
, " network %s/%d area %s\n",
10017 inet_ntoa(rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
10024 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
10026 struct listnode
*node
;
10027 struct ospf_area
*area
;
10028 uint8_t buf
[INET_ADDRSTRLEN
];
10030 /* Area configuration print. */
10031 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
10032 struct route_node
*rn1
;
10034 area_id2str((char *)buf
, sizeof(buf
), &area
->area_id
,
10035 area
->area_id_fmt
);
10037 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
10038 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
10039 vty_out(vty
, " area %s authentication\n", buf
);
10042 " area %s authentication message-digest\n",
10046 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
10047 vty_out(vty
, " area %s shortcut %s\n", buf
,
10048 ospf_shortcut_mode_str
10049 [area
->shortcut_configured
]);
10051 if ((area
->external_routing
== OSPF_AREA_STUB
)
10052 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
10053 if (area
->external_routing
== OSPF_AREA_STUB
) {
10054 vty_out(vty
, " area %s stub", buf
);
10055 if (area
->no_summary
)
10056 vty_out(vty
, " no-summary\n");
10057 vty_out(vty
, "\n");
10058 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
10059 switch (area
->NSSATranslatorRole
) {
10060 case OSPF_NSSA_ROLE_NEVER
:
10062 " area %s nssa translate-never\n",
10065 case OSPF_NSSA_ROLE_ALWAYS
:
10067 " area %s nssa translate-always\n",
10070 case OSPF_NSSA_ROLE_CANDIDATE
:
10071 vty_out(vty
, " area %s nssa \n", buf
);
10074 if (area
->no_summary
)
10076 " area %s nssa no-summary\n",
10080 if (area
->default_cost
!= 1)
10081 vty_out(vty
, " area %s default-cost %d\n", buf
,
10082 area
->default_cost
);
10085 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
10087 struct ospf_area_range
*range
= rn1
->info
;
10089 vty_out(vty
, " area %s range %s/%d", buf
,
10090 inet_ntoa(rn1
->p
.u
.prefix4
),
10093 if (range
->cost_config
10094 != OSPF_AREA_RANGE_COST_UNSPEC
)
10095 vty_out(vty
, " cost %d",
10096 range
->cost_config
);
10098 if (!CHECK_FLAG(range
->flags
,
10099 OSPF_AREA_RANGE_ADVERTISE
))
10100 vty_out(vty
, " not-advertise");
10102 if (CHECK_FLAG(range
->flags
,
10103 OSPF_AREA_RANGE_SUBSTITUTE
))
10104 vty_out(vty
, " substitute %s/%d",
10105 inet_ntoa(range
->subst_addr
),
10106 range
->subst_masklen
);
10108 vty_out(vty
, "\n");
10111 if (EXPORT_NAME(area
))
10112 vty_out(vty
, " area %s export-list %s\n", buf
,
10113 EXPORT_NAME(area
));
10115 if (IMPORT_NAME(area
))
10116 vty_out(vty
, " area %s import-list %s\n", buf
,
10117 IMPORT_NAME(area
));
10119 if (PREFIX_NAME_IN(area
))
10120 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
10121 PREFIX_NAME_IN(area
));
10123 if (PREFIX_NAME_OUT(area
))
10124 vty_out(vty
, " area %s filter-list prefix %s out\n",
10125 buf
, PREFIX_NAME_OUT(area
));
10131 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
10133 struct ospf_nbr_nbma
*nbr_nbma
;
10134 struct route_node
*rn
;
10136 /* Static Neighbor configuration print. */
10137 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
10138 if ((nbr_nbma
= rn
->info
)) {
10139 vty_out(vty
, " neighbor %s", inet_ntoa(nbr_nbma
->addr
));
10141 if (nbr_nbma
->priority
10142 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
10143 vty_out(vty
, " priority %d",
10144 nbr_nbma
->priority
);
10146 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
10147 vty_out(vty
, " poll-interval %d",
10150 vty_out(vty
, "\n");
10156 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
10158 struct listnode
*node
;
10159 struct ospf_vl_data
*vl_data
;
10160 char buf
[INET_ADDRSTRLEN
];
10162 /* Virtual-Link print */
10163 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
10164 struct listnode
*n2
;
10165 struct crypt_key
*ck
;
10166 struct ospf_interface
*oi
;
10168 if (vl_data
!= NULL
) {
10169 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
10170 vl_data
->vl_area_id_fmt
);
10171 oi
= vl_data
->vl_oi
;
10174 if (OSPF_IF_PARAM(oi
, v_hello
)
10175 != OSPF_HELLO_INTERVAL_DEFAULT
10176 || OSPF_IF_PARAM(oi
, v_wait
)
10177 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10178 || OSPF_IF_PARAM(oi
, retransmit_interval
)
10179 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10180 || OSPF_IF_PARAM(oi
, transmit_delay
)
10181 != OSPF_TRANSMIT_DELAY_DEFAULT
)
10183 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10184 buf
, inet_ntoa(vl_data
->vl_peer
),
10185 OSPF_IF_PARAM(oi
, v_hello
),
10186 OSPF_IF_PARAM(oi
, retransmit_interval
),
10187 OSPF_IF_PARAM(oi
, transmit_delay
),
10188 OSPF_IF_PARAM(oi
, v_wait
));
10190 vty_out(vty
, " area %s virtual-link %s\n", buf
,
10191 inet_ntoa(vl_data
->vl_peer
));
10193 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
10196 " area %s virtual-link %s authentication-key %s\n",
10197 buf
, inet_ntoa(vl_data
->vl_peer
),
10198 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10201 for (ALL_LIST_ELEMENTS_RO(
10202 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10206 " area %s virtual-link %s"
10207 " message-digest-key %d md5 %s\n",
10208 buf
, inet_ntoa(vl_data
->vl_peer
),
10209 ck
->key_id
, ck
->auth_key
);
10217 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
10221 /* redistribute print. */
10222 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
10223 struct list
*red_list
;
10224 struct listnode
*node
;
10225 struct ospf_redist
*red
;
10227 red_list
= ospf
->redist
[type
];
10231 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
10232 vty_out(vty
, " redistribute %s",
10233 zebra_route_string(type
));
10235 vty_out(vty
, " %d", red
->instance
);
10237 if (red
->dmetric
.value
>= 0)
10238 vty_out(vty
, " metric %d", red
->dmetric
.value
);
10240 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10241 vty_out(vty
, " metric-type 1");
10243 if (ROUTEMAP_NAME(red
))
10244 vty_out(vty
, " route-map %s",
10245 ROUTEMAP_NAME(red
));
10247 vty_out(vty
, "\n");
10254 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
10256 if (ospf
->default_metric
!= -1)
10257 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
10261 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
10264 struct ospf_redist
*red
;
10267 /* distribute-list print. */
10268 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
10269 if (DISTRIBUTE_NAME(ospf
, type
))
10270 vty_out(vty
, " distribute-list %s out %s\n",
10271 DISTRIBUTE_NAME(ospf
, type
),
10272 zebra_route_string(type
));
10274 /* default-information print. */
10275 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
10276 vty_out(vty
, " default-information originate");
10277 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
10278 vty_out(vty
, " always");
10280 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
10282 if (red
->dmetric
.value
>= 0)
10283 vty_out(vty
, " metric %d",
10284 red
->dmetric
.value
);
10286 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10287 vty_out(vty
, " metric-type 1");
10289 if (ROUTEMAP_NAME(red
))
10290 vty_out(vty
, " route-map %s",
10291 ROUTEMAP_NAME(red
));
10294 vty_out(vty
, "\n");
10301 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
10303 struct route_node
*rn
;
10304 struct ospf_distance
*odistance
;
10306 if (ospf
->distance_all
)
10307 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
10309 if (ospf
->distance_intra
|| ospf
->distance_inter
10310 || ospf
->distance_external
) {
10311 vty_out(vty
, " distance ospf");
10313 if (ospf
->distance_intra
)
10314 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
10315 if (ospf
->distance_inter
)
10316 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
10317 if (ospf
->distance_external
)
10318 vty_out(vty
, " external %d", ospf
->distance_external
);
10320 vty_out(vty
, "\n");
10323 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
10324 if ((odistance
= rn
->info
) != NULL
) {
10325 vty_out(vty
, " distance %d %s/%d %s\n",
10326 odistance
->distance
, inet_ntoa(rn
->p
.u
.prefix4
),
10328 odistance
->access_list
? odistance
->access_list
10334 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
10336 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10337 struct interface
*ifp
;
10338 struct ospf_interface
*oi
;
10339 struct listnode
*node
= NULL
;
10342 /* `router ospf' print. */
10343 if (ospf
->instance
&& ospf
->name
) {
10344 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
10346 } else if (ospf
->instance
) {
10347 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
10348 } else if (ospf
->name
) {
10349 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
10351 vty_out(vty
, "router ospf\n");
10353 if (!ospf
->networks
) {
10358 /* Router ID print. */
10359 if (ospf
->router_id_static
.s_addr
!= 0)
10360 vty_out(vty
, " ospf router-id %s\n",
10361 inet_ntoa(ospf
->router_id_static
));
10363 /* ABR type print. */
10364 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
10365 vty_out(vty
, " ospf abr-type %s\n",
10366 ospf_abr_type_str
[ospf
->abr_type
]);
10368 /* log-adjacency-changes flag print. */
10369 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
10370 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
10371 vty_out(vty
, " log-adjacency-changes detail\n");
10372 else if (!SAVE_OSPF_LOG_ADJACENCY_CHANGES
)
10373 vty_out(vty
, " log-adjacency-changes\n");
10374 } else if (SAVE_OSPF_LOG_ADJACENCY_CHANGES
) {
10375 vty_out(vty
, " no log-adjacency-changes\n");
10378 /* RFC1583 compatibility flag print -- Compatible with CISCO
10380 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
10381 vty_out(vty
, " compatible rfc1583\n");
10383 /* auto-cost reference-bandwidth configuration. */
10384 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
10386 "! Important: ensure reference bandwidth "
10387 "is consistent across all routers\n");
10388 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
10389 ospf
->ref_bandwidth
);
10392 /* SPF timers print. */
10393 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
10394 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
10395 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
10396 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
10397 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
10399 /* LSA timers print. */
10400 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
10401 vty_out(vty
, " timers throttle lsa all %d\n",
10402 ospf
->min_ls_interval
);
10403 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
10404 vty_out(vty
, " timers lsa min-arrival %d\n",
10405 ospf
->min_ls_arrival
);
10407 /* Write multiplier print. */
10408 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
10409 vty_out(vty
, " ospf write-multiplier %d\n",
10410 ospf
->write_oi_count
);
10412 /* Max-metric router-lsa print */
10413 config_write_stub_router(vty
, ospf
);
10415 /* SPF refresh parameters print. */
10416 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
10417 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
10419 /* Redistribute information print. */
10420 config_write_ospf_redistribute(vty
, ospf
);
10422 /* passive-interface print. */
10423 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
10424 vty_out(vty
, " passive-interface default\n");
10426 FOR_ALL_INTERFACES (vrf
, ifp
)
10427 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
10429 && IF_DEF_PARAMS(ifp
)->passive_interface
10430 != ospf
->passive_interface_default
) {
10431 vty_out(vty
, " %spassive-interface %s\n",
10432 IF_DEF_PARAMS(ifp
)->passive_interface
? ""
10436 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10437 if (!OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
10439 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi
->ifp
),
10440 passive_interface
)) {
10441 if (oi
->params
->passive_interface
10442 == IF_DEF_PARAMS(oi
->ifp
)->passive_interface
)
10444 } else if (oi
->params
->passive_interface
10445 == ospf
->passive_interface_default
)
10448 vty_out(vty
, " %spassive-interface %s %s\n",
10449 oi
->params
->passive_interface
? "" : "no ",
10450 oi
->ifp
->name
, inet_ntoa(oi
->address
->u
.prefix4
));
10453 /* Network area print. */
10454 config_write_network_area(vty
, ospf
);
10456 /* Area config print. */
10457 config_write_ospf_area(vty
, ospf
);
10459 /* static neighbor print. */
10460 config_write_ospf_nbr_nbma(vty
, ospf
);
10462 /* Virtual-Link print. */
10463 config_write_virtual_link(vty
, ospf
);
10465 /* Default metric configuration. */
10466 config_write_ospf_default_metric(vty
, ospf
);
10468 /* Distribute-list and default-information print. */
10469 config_write_ospf_distribute(vty
, ospf
);
10471 /* Distance configuration. */
10472 config_write_ospf_distance(vty
, ospf
);
10474 ospf_opaque_config_write_router(vty
, ospf
);
10480 /* OSPF configuration write function. */
10481 static int ospf_config_write(struct vty
*vty
)
10484 struct listnode
*ospf_node
= NULL
;
10487 if (listcount(om
->ospf
) == 0)
10490 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
10491 /* VRF Default check if it is running.
10492 * Upon daemon start, there could be default instance
10493 * in absence of 'router ospf'/oi_running is disabled. */
10494 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
10495 write
+= ospf_config_write_one(vty
, ospf
);
10496 /* For Non-Default VRF simply display the configuration,
10497 * even if it is not oi_running. */
10498 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
10499 write
+= ospf_config_write_one(vty
, ospf
);
10504 void ospf_vty_show_init(void)
10506 /* "show ip ospf" commands. */
10507 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
10509 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
10511 /* "show ip ospf database" commands. */
10512 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
10514 install_element(VIEW_NODE
,
10515 &show_ip_ospf_instance_database_type_adv_router_cmd
);
10516 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
10517 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
10519 /* "show ip ospf interface" commands. */
10520 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
10522 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
10523 /* "show ip ospf interface traffic */
10524 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
10526 /* "show ip ospf neighbor" commands. */
10527 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
10528 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
10529 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
10530 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
10531 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
10532 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
10533 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
10535 install_element(VIEW_NODE
,
10536 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
10537 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
10538 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
10539 install_element(VIEW_NODE
,
10540 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
10541 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
10542 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
10543 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
10545 /* "show ip ospf route" commands. */
10546 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
10547 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
10549 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
10550 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
10552 /* "show ip ospf vrfs" commands. */
10553 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
10557 /* ospfd's interface node. */
10558 static struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
10560 /* Initialization of OSPF interface. */
10561 static void ospf_vty_if_init(void)
10563 /* Install interface node. */
10564 install_node(&interface_node
, config_write_interface
);
10567 /* "ip ospf authentication" commands. */
10568 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
10569 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
10570 install_element(INTERFACE_NODE
,
10571 &no_ip_ospf_authentication_args_addr_cmd
);
10572 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
10573 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
10574 install_element(INTERFACE_NODE
,
10575 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
10576 install_element(INTERFACE_NODE
,
10577 &no_ospf_authentication_key_authkey_addr_cmd
);
10579 /* "ip ospf message-digest-key" commands. */
10580 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
10581 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
10583 /* "ip ospf cost" commands. */
10584 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
10585 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
10587 /* "ip ospf mtu-ignore" commands. */
10588 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
10589 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
10591 /* "ip ospf dead-interval" commands. */
10592 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
10593 install_element(INTERFACE_NODE
,
10594 &ip_ospf_dead_interval_minimal_addr_cmd
);
10595 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
10597 /* "ip ospf hello-interval" commands. */
10598 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
10599 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
10601 /* "ip ospf network" commands. */
10602 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
10603 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
10605 /* "ip ospf priority" commands. */
10606 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
10607 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
10609 /* "ip ospf retransmit-interval" commands. */
10610 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
10611 install_element(INTERFACE_NODE
,
10612 &no_ip_ospf_retransmit_interval_addr_cmd
);
10614 /* "ip ospf transmit-delay" commands. */
10615 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
10616 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
10618 /* "ip ospf area" commands. */
10619 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
10620 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
10622 /* These commands are compatibitliy for previous version. */
10623 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
10624 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
10625 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
10626 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
10627 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
10628 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
10629 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
10630 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
10631 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
10632 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
10633 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
10634 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
10635 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
10636 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
10637 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
10638 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
10639 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
10642 static void ospf_vty_zebra_init(void)
10644 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
10645 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
10646 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
10647 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
10649 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
10650 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
10652 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
10653 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
10655 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
10656 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
10658 install_element(OSPF_NODE
, &ospf_distance_cmd
);
10659 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
10660 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
10661 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
10663 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
10664 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
10665 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
10666 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
10670 static struct cmd_node ospf_node
= {OSPF_NODE
, "%s(config-router)# ", 1};
10672 static void ospf_interface_clear(struct interface
*ifp
)
10674 if (!if_is_operative(ifp
))
10677 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
10678 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
10680 ospf_if_reset(ifp
);
10683 DEFUN (clear_ip_ospf_interface
,
10684 clear_ip_ospf_interface_cmd
,
10685 "clear ip ospf [vrf NAME] interface [IFNAME]",
10688 "OSPF information\n"
10690 "Interface information\n"
10691 "Interface name\n")
10693 int idx_ifname
= 0;
10695 struct interface
*ifp
;
10696 struct listnode
*node
;
10697 struct ospf
*ospf
= NULL
;
10698 char *vrf_name
= NULL
;
10699 vrf_id_t vrf_id
= VRF_DEFAULT
;
10700 struct vrf
*vrf
= NULL
;
10702 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
10703 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
10704 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
10707 vrf
= vrf_lookup_by_name(vrf_name
);
10709 vrf_id
= vrf
->vrf_id
;
10711 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
10712 /* Clear all the ospfv2 interfaces. */
10713 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10714 if (vrf_id
!= ospf
->vrf_id
)
10717 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10718 FOR_ALL_INTERFACES (vrf
, ifp
)
10719 ospf_interface_clear(ifp
);
10722 /* Interface name is specified. */
10723 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
10725 vty_out(vty
, "No such interface name\n");
10727 ospf_interface_clear(ifp
);
10730 return CMD_SUCCESS
;
10733 void ospf_vty_clear_init(void)
10735 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
10739 /* Install OSPF related vty commands. */
10740 void ospf_vty_init(void)
10742 /* Install ospf top node. */
10743 install_node(&ospf_node
, ospf_config_write
);
10745 /* "router ospf" commands. */
10746 install_element(CONFIG_NODE
, &router_ospf_cmd
);
10747 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
10750 install_default(OSPF_NODE
);
10752 /* "ospf router-id" commands. */
10753 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
10754 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
10755 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
10757 /* "passive-interface" commands. */
10758 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
10759 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
10761 /* "ospf abr-type" commands. */
10762 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
10763 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
10765 /* "ospf log-adjacency-changes" commands. */
10766 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
10767 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
10768 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
10769 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
10771 /* "ospf rfc1583-compatible" commands. */
10772 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
10773 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
10774 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
10775 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
10777 /* "network area" commands. */
10778 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
10779 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
10781 /* "area authentication" commands. */
10782 install_element(OSPF_NODE
,
10783 &ospf_area_authentication_message_digest_cmd
);
10784 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
10785 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
10787 /* "area range" commands. */
10788 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
10789 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
10790 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
10791 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
10792 install_element(OSPF_NODE
, &ospf_area_range_substitute_cmd
);
10793 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
10795 /* "area virtual-link" commands. */
10796 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
10797 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
10798 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
10799 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
10802 /* "area stub" commands. */
10803 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
10804 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
10805 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
10806 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
10808 /* "area nssa" commands. */
10809 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
10810 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
10811 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
10812 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
10813 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
10815 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
10816 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
10818 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
10819 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
10821 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
10822 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
10824 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
10825 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
10827 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
10828 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
10830 /* SPF timer commands */
10831 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
10832 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
10834 /* LSA timers commands */
10835 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
10836 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
10837 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
10838 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
10840 /* refresh timer commands */
10841 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
10842 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
10844 /* max-metric commands */
10845 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
10846 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
10847 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
10848 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
10849 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
10850 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
10852 /* reference bandwidth commands */
10853 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
10854 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
10856 /* "neighbor" commands. */
10857 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
10858 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
10859 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
10860 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
10862 /* write multiplier commands */
10863 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
10864 install_element(OSPF_NODE
, &write_multiplier_cmd
);
10865 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
10866 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
10868 /* Init interface related vty commands. */
10869 ospf_vty_if_init();
10871 /* Init zebra related vty commands. */
10872 ospf_vty_zebra_init();