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 static const char *const ospf_network_type_str
[] = {
57 "Null", "POINTOPOINT", "BROADCAST", "NBMA", "POINTOMULTIPOINT",
58 "VIRTUALLINK", "LOOPBACK"};
60 /* Utility functions. */
61 int str2area_id(const char *str
, struct in_addr
*area_id
, int *area_id_fmt
)
65 area_id
->s_addr
= htonl(strtoul(str
, &ep
, 10));
66 if (*ep
&& !inet_aton(str
, area_id
))
70 *ep
? OSPF_AREA_ID_FMT_DOTTEDQUAD
: OSPF_AREA_ID_FMT_DECIMAL
;
75 static void area_id2str(char *buf
, int length
, struct in_addr
*area_id
,
78 if (area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
79 inet_ntop(AF_INET
, area_id
, buf
, length
);
81 sprintf(buf
, "%lu", (unsigned long)ntohl(area_id
->s_addr
));
84 static int str2metric(const char *str
, int *metric
)
90 *metric
= strtol(str
, NULL
, 10);
91 if (*metric
< 0 && *metric
> 16777214) {
92 /* vty_out (vty, "OSPF metric value is invalid\n"); */
99 static int str2metric_type(const char *str
, int *metric_type
)
105 if (strncmp(str
, "1", 1) == 0)
106 *metric_type
= EXTERNAL_METRIC_TYPE_1
;
107 else if (strncmp(str
, "2", 1) == 0)
108 *metric_type
= EXTERNAL_METRIC_TYPE_2
;
115 int ospf_oi_count(struct interface
*ifp
)
117 struct route_node
*rn
;
120 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
127 #define OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf) \
128 if (argv_find(argv, argc, "vrf", &idx_vrf)) { \
129 vrf_name = argv[idx_vrf + 1]->arg; \
130 all_vrf = strmatch(vrf_name, "all"); \
133 static struct ospf
*ospf_cmd_lookup_ospf(struct vty
*vty
,
134 struct cmd_token
*argv
[],
135 const int argc
, uint32_t enable
,
136 unsigned short *instance
)
138 struct ospf
*ospf
= NULL
;
139 int idx_vrf
= 0, idx_inst
= 0;
140 const char *vrf_name
= NULL
;
143 if (argv_find(argv
, argc
, "(1-65535)", &idx_inst
))
144 *instance
= strtoul(argv
[idx_inst
]->arg
, NULL
, 10);
146 if (argv_find(argv
, argc
, "vrf", &idx_vrf
)) {
147 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
148 if (vrf_name
== NULL
|| strmatch(vrf_name
, VRF_DEFAULT_NAME
))
151 /* Allocate VRF aware instance */
152 ospf
= ospf_get(*instance
, vrf_name
);
154 ospf
= ospf_lookup_by_inst_name(*instance
, vrf_name
);
158 ospf
= ospf_get(*instance
, NULL
);
160 ospf
= ospf_lookup_instance(*instance
);
167 static void ospf_show_vrf_name(struct ospf
*ospf
, struct vty
*vty
,
168 json_object
*json
, uint8_t use_vrf
)
172 if (ospf
->vrf_id
== VRF_DEFAULT
)
173 json_object_string_add(json
, "vrfName",
176 json_object_string_add(json
, "vrfName",
178 json_object_int_add(json
, "vrfId", ospf
->vrf_id
);
180 if (ospf
->vrf_id
== VRF_DEFAULT
)
181 vty_out(vty
, "VRF Name: %s\n", "default");
183 vty_out(vty
, "VRF Name: %s\n", ospf
->name
);
188 #ifndef VTYSH_EXTRACT_PL
189 #include "ospfd/ospf_vty_clippy.c"
192 DEFUN_NOSH (router_ospf
,
194 "router ospf [{(1-65535)|vrf NAME}]",
195 "Enable a routing process\n"
196 "Start OSPF configuration\n"
200 struct ospf
*ospf
= NULL
;
201 int ret
= CMD_SUCCESS
;
202 unsigned short instance
= 0;
203 struct vrf
*vrf
= NULL
;
204 struct route_node
*rn
;
205 struct interface
*ifp
;
207 ospf
= ospf_cmd_lookup_ospf(vty
, argv
, argc
, 1, &instance
);
209 return CMD_WARNING_CONFIG_FAILED
;
211 /* The following logic to set the vty qobj index is in place to be able
212 to ignore the commands which dont belong to this instance. */
213 if (ospf
->instance
!= instance
) {
214 VTY_PUSH_CONTEXT_NULL(OSPF_NODE
);
215 ret
= CMD_NOT_MY_INSTANCE
;
217 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
218 ospf
->oi_running
= 1;
219 if (IS_DEBUG_OSPF_EVENT
)
221 "Config command 'router ospf %d' received, vrf %s id %u oi_running %u",
222 instance
, ospf
->name
? ospf
->name
: "NIL",
223 ospf
->vrf_id
, ospf
->oi_running
);
224 VTY_PUSH_CONTEXT(OSPF_NODE
, ospf
);
226 /* Activate 'ip ospf area x' configured interfaces for given
227 * vrf. Activate area on vrf x aware interfaces.
228 * vrf_enable callback calls router_id_update which
229 * internally will call ospf_if_update to trigger
232 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
234 FOR_ALL_INTERFACES (vrf
, ifp
) {
235 struct ospf_if_params
*params
;
237 params
= IF_DEF_PARAMS(ifp
);
238 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
239 for (rn
= route_top(ospf
->networks
); rn
;
240 rn
= route_next(rn
)) {
241 if (rn
->info
!= NULL
) {
243 "Interface %s has area config but please remove all network commands first.\n",
248 if (!ospf_interface_area_is_already_set(ospf
,
250 ospf_interface_area_set(ospf
, ifp
);
251 ospf
->if_ospf_cli_count
++;
256 ospf_router_id_update(ospf
);
262 DEFUN (no_router_ospf
,
264 "no router ospf [{(1-65535)|vrf NAME}]",
266 "Enable a routing process\n"
267 "Start OSPF configuration\n"
272 unsigned short instance
= 0;
274 ospf
= ospf_cmd_lookup_ospf(vty
, argv
, argc
, 0, &instance
);
277 return CMD_NOT_MY_INSTANCE
;
287 DEFPY (ospf_router_id
,
289 "ospf router-id A.B.C.D",
290 "OSPF specific commands\n"
291 "router-id for the OSPF process\n"
292 "OSPF router-id in IP address format\n")
294 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
296 struct listnode
*node
;
297 struct ospf_area
*area
;
299 ospf
->router_id_static
= router_id
;
301 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
302 if (area
->full_nbrs
) {
304 "For this router-id change to take effect,"
305 " save config and restart ospfd\n");
309 ospf_router_id_update(ospf
);
314 DEFUN_HIDDEN (ospf_router_id_old
,
315 ospf_router_id_old_cmd
,
317 "router-id for the OSPF process\n"
318 "OSPF router-id in IP address format\n")
320 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
322 struct listnode
*node
;
323 struct ospf_area
*area
;
324 struct in_addr router_id
;
327 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &router_id
);
329 vty_out(vty
, "Please specify Router ID by A.B.C.D\n");
330 return CMD_WARNING_CONFIG_FAILED
;
333 ospf
->router_id_static
= router_id
;
335 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
336 if (area
->full_nbrs
) {
338 "For this router-id change to take effect,"
339 " save config and restart ospfd\n");
343 ospf_router_id_update(ospf
);
348 DEFPY (no_ospf_router_id
,
349 no_ospf_router_id_cmd
,
350 "no ospf router-id [A.B.C.D]",
352 "OSPF specific commands\n"
353 "router-id for the OSPF process\n"
354 "OSPF router-id in IP address format\n")
356 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
357 struct listnode
*node
;
358 struct ospf_area
*area
;
361 if (!IPV4_ADDR_SAME(&ospf
->router_id_static
, &router_id
)) {
362 vty_out(vty
, "%% OSPF router-id doesn't match\n");
363 return CMD_WARNING_CONFIG_FAILED
;
367 ospf
->router_id_static
.s_addr
= 0;
369 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
370 if (area
->full_nbrs
) {
372 "For this router-id change to take effect,"
373 " save config and restart ospfd\n");
377 ospf_router_id_update(ospf
);
383 static void ospf_passive_interface_default(struct ospf
*ospf
, uint8_t newval
)
385 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
387 struct interface
*ifp
;
388 struct ospf_interface
*oi
;
390 ospf
->passive_interface_default
= newval
;
392 FOR_ALL_INTERFACES (vrf
, ifp
) {
393 if (ifp
&& OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
395 UNSET_IF_PARAM(IF_DEF_PARAMS(ifp
), passive_interface
);
397 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, ln
, oi
)) {
398 if (OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
399 UNSET_IF_PARAM(oi
->params
, passive_interface
);
400 /* update multicast memberships */
401 ospf_if_set_multicast(oi
);
405 static void ospf_passive_interface_update_addr(struct ospf
*ospf
,
406 struct interface
*ifp
,
407 struct ospf_if_params
*params
,
413 params
->passive_interface
= value
;
414 if (params
!= IF_DEF_PARAMS(ifp
)) {
415 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
417 dflt
= IF_DEF_PARAMS(ifp
)->passive_interface
;
419 dflt
= ospf
->passive_interface_default
;
422 SET_IF_PARAM(params
, passive_interface
);
424 UNSET_IF_PARAM(params
, passive_interface
);
426 ospf_free_if_params(ifp
, addr
);
427 ospf_if_update_params(ifp
, addr
);
431 static void ospf_passive_interface_update(struct ospf
*ospf
,
432 struct interface
*ifp
,
433 struct ospf_if_params
*params
,
436 params
->passive_interface
= value
;
437 if (params
== IF_DEF_PARAMS(ifp
)) {
438 if (value
!= ospf
->passive_interface_default
)
439 SET_IF_PARAM(params
, passive_interface
);
441 UNSET_IF_PARAM(params
, passive_interface
);
445 DEFUN (ospf_passive_interface
,
446 ospf_passive_interface_addr_cmd
,
447 "passive-interface <IFNAME [A.B.C.D]|default>",
448 "Suppress routing updates on an interface\n"
451 "Suppress routing updates on interfaces by default\n")
453 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
455 struct interface
*ifp
= NULL
;
456 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
458 struct ospf_if_params
*params
;
459 struct route_node
*rn
;
461 if (strmatch(argv
[1]->text
, "default")) {
462 ospf_passive_interface_default(ospf
, OSPF_IF_PASSIVE
);
465 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
466 ifp
= if_get_by_name(argv
[1]->arg
, ospf
->vrf_id
);
469 vty_out(vty
, "interface %s not found.\n", (char *)argv
[1]->arg
);
470 return CMD_WARNING_CONFIG_FAILED
;
473 params
= IF_DEF_PARAMS(ifp
);
476 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
479 "Please specify interface address by A.B.C.D\n");
480 return CMD_WARNING_CONFIG_FAILED
;
483 params
= ospf_get_if_params(ifp
, addr
);
484 ospf_if_update_params(ifp
, addr
);
485 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
486 OSPF_IF_PASSIVE
, addr
);
489 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_PASSIVE
);
491 /* XXX We should call ospf_if_set_multicast on exactly those
492 * interfaces for which the passive property changed. It is too much
493 * work to determine this set, so we do this for every interface.
494 * This is safe and reasonable because ospf_if_set_multicast uses a
495 * record of joined groups to avoid systems calls if the desired
496 * memberships match the current memership.
499 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
500 struct ospf_interface
*oi
= rn
->info
;
502 if (oi
&& (OSPF_IF_PARAM(oi
, passive_interface
)
504 ospf_if_set_multicast(oi
);
507 * XXX It is not clear what state transitions the interface needs to
508 * undergo when going from active to passive. Fixing this will
509 * require precise identification of interfaces having such a
516 DEFUN (no_ospf_passive_interface
,
517 no_ospf_passive_interface_addr_cmd
,
518 "no passive-interface <IFNAME [A.B.C.D]|default>",
520 "Allow routing updates on an interface\n"
523 "Allow routing updates on interfaces by default\n")
525 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
527 struct interface
*ifp
= NULL
;
528 struct in_addr addr
= {.s_addr
= INADDR_ANY
};
529 struct ospf_if_params
*params
;
531 struct route_node
*rn
;
533 if (strmatch(argv
[2]->text
, "default")) {
534 ospf_passive_interface_default(ospf
, OSPF_IF_ACTIVE
);
538 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
539 ifp
= if_get_by_name(argv
[2]->arg
, ospf
->vrf_id
);
542 vty_out(vty
, "interface %s not found.\n", (char *)argv
[2]->arg
);
543 return CMD_WARNING_CONFIG_FAILED
;
546 params
= IF_DEF_PARAMS(ifp
);
549 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
552 "Please specify interface address by A.B.C.D\n");
553 return CMD_WARNING_CONFIG_FAILED
;
556 params
= ospf_lookup_if_params(ifp
, addr
);
559 ospf_passive_interface_update_addr(ospf
, ifp
, params
,
560 OSPF_IF_ACTIVE
, addr
);
562 ospf_passive_interface_update(ospf
, ifp
, params
, OSPF_IF_ACTIVE
);
564 /* XXX We should call ospf_if_set_multicast on exactly those
565 * interfaces for which the passive property changed. It is too much
566 * work to determine this set, so we do this for every interface.
567 * This is safe and reasonable because ospf_if_set_multicast uses a
568 * record of joined groups to avoid systems calls if the desired
569 * memberships match the current memership.
571 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
572 struct ospf_interface
*oi
= rn
->info
;
575 && (OSPF_IF_PARAM(oi
, passive_interface
) == OSPF_IF_ACTIVE
))
576 ospf_if_set_multicast(oi
);
583 DEFUN (ospf_network_area
,
584 ospf_network_area_cmd
,
585 "network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
586 "Enable routing on an IP network\n"
587 "OSPF network prefix\n"
588 "Set the OSPF area ID\n"
589 "OSPF area ID in IP address format\n"
590 "OSPF area ID as a decimal value\n")
592 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
593 int idx_ipv4_prefixlen
= 1;
594 int idx_ipv4_number
= 3;
595 struct prefix_ipv4 p
;
596 struct in_addr area_id
;
599 if (ospf
->instance
) {
601 "The network command is not supported in multi-instance ospf\n");
602 return CMD_WARNING_CONFIG_FAILED
;
605 if (ospf
->if_ospf_cli_count
> 0) {
607 "Please remove all ip ospf area x.x.x.x commands first.\n");
608 if (IS_DEBUG_OSPF_EVENT
)
610 "%s ospf vrf %s num of %u ip osp area x config",
612 ospf
->name
? ospf
->name
: "NIL",
613 ospf
->if_ospf_cli_count
);
614 return CMD_WARNING_CONFIG_FAILED
;
617 /* Get network prefix and Area ID. */
618 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
619 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
621 ret
= ospf_network_set(ospf
, &p
, area_id
, format
);
623 vty_out(vty
, "There is already same network statement.\n");
624 return CMD_WARNING_CONFIG_FAILED
;
630 DEFUN (no_ospf_network_area
,
631 no_ospf_network_area_cmd
,
632 "no network A.B.C.D/M area <A.B.C.D|(0-4294967295)>",
634 "Enable routing on an IP network\n"
635 "OSPF network prefix\n"
636 "Set the OSPF area ID\n"
637 "OSPF area ID in IP address format\n"
638 "OSPF area ID as a decimal value\n")
640 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
641 int idx_ipv4_prefixlen
= 2;
642 int idx_ipv4_number
= 4;
643 struct prefix_ipv4 p
;
644 struct in_addr area_id
;
647 if (ospf
->instance
) {
649 "The network command is not supported in multi-instance ospf\n");
650 return CMD_WARNING_CONFIG_FAILED
;
653 /* Get network prefix and Area ID. */
654 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
655 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
657 ret
= ospf_network_unset(ospf
, &p
, area_id
);
660 "Can't find specified network area configuration.\n");
661 return CMD_WARNING_CONFIG_FAILED
;
667 DEFUN (ospf_area_range
,
669 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [advertise [cost (0-16777215)]]",
670 "OSPF area parameters\n"
671 "OSPF area ID in IP address format\n"
672 "OSPF area ID as a decimal value\n"
673 "Summarize routes matching address/mask (border routers only)\n"
674 "Area range prefix\n"
675 "Advertise this range (default)\n"
676 "User specified metric for this range\n"
677 "Advertised metric for this range\n")
679 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
680 int idx_ipv4_number
= 1;
681 int idx_ipv4_prefixlen
= 3;
683 struct prefix_ipv4 p
;
684 struct in_addr area_id
;
688 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
689 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
691 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
693 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
694 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
700 DEFUN (ospf_area_range_cost
,
701 ospf_area_range_cost_cmd
,
702 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M cost (0-16777215)",
703 "OSPF area parameters\n"
704 "OSPF area ID in IP address format\n"
705 "OSPF area ID as a decimal value\n"
706 "Summarize routes matching address/mask (border routers only)\n"
707 "Area range prefix\n"
708 "User specified metric for this range\n"
709 "Advertised metric for this range\n")
711 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
712 int idx_ipv4_number
= 1;
713 int idx_ipv4_prefixlen
= 3;
715 struct prefix_ipv4 p
;
716 struct in_addr area_id
;
720 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
721 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
723 ospf_area_range_set(ospf
, area_id
, &p
, OSPF_AREA_RANGE_ADVERTISE
);
724 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
727 cost
= strtoul(argv
[idx_cost
]->arg
, NULL
, 10);
728 ospf_area_range_cost_set(ospf
, area_id
, &p
, cost
);
733 DEFUN (ospf_area_range_not_advertise
,
734 ospf_area_range_not_advertise_cmd
,
735 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M not-advertise",
736 "OSPF area parameters\n"
737 "OSPF area ID in IP address format\n"
738 "OSPF area ID as a decimal value\n"
739 "Summarize routes matching address/mask (border routers only)\n"
740 "Area range prefix\n"
741 "DoNotAdvertise this range\n")
743 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
744 int idx_ipv4_number
= 1;
745 int idx_ipv4_prefixlen
= 3;
746 struct prefix_ipv4 p
;
747 struct in_addr area_id
;
750 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
751 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
753 ospf_area_range_set(ospf
, area_id
, &p
, 0);
754 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
756 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
761 DEFUN (no_ospf_area_range
,
762 no_ospf_area_range_cmd
,
763 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M [<cost (0-16777215)|advertise [cost (0-16777215)]|not-advertise>]",
765 "OSPF area parameters\n"
766 "OSPF area ID in IP address format\n"
767 "OSPF area ID as a decimal value\n"
768 "Summarize routes matching address/mask (border routers only)\n"
769 "Area range prefix\n"
770 "User specified metric for this range\n"
771 "Advertised metric for this range\n"
772 "Advertise this range (default)\n"
773 "User specified metric for this range\n"
774 "Advertised metric for this range\n"
775 "DoNotAdvertise this range\n")
777 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
778 int idx_ipv4_number
= 2;
779 int idx_ipv4_prefixlen
= 4;
780 struct prefix_ipv4 p
;
781 struct in_addr area_id
;
784 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
785 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
787 ospf_area_range_unset(ospf
, area_id
, &p
);
792 DEFUN (ospf_area_range_substitute
,
793 ospf_area_range_substitute_cmd
,
794 "area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
795 "OSPF area parameters\n"
796 "OSPF area ID in IP address format\n"
797 "OSPF area ID as a decimal value\n"
798 "Summarize routes matching address/mask (border routers only)\n"
799 "Area range prefix\n"
800 "Announce area range as another prefix\n"
801 "Network prefix to be announced instead of range\n")
803 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
804 int idx_ipv4_number
= 1;
805 int idx_ipv4_prefixlen
= 3;
806 int idx_ipv4_prefixlen_2
= 5;
807 struct prefix_ipv4 p
, s
;
808 struct in_addr area_id
;
811 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
812 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
813 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
815 ospf_area_range_substitute_set(ospf
, area_id
, &p
, &s
);
816 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
822 DEFUN (no_ospf_area_range_substitute
,
823 no_ospf_area_range_substitute_cmd
,
824 "no area <A.B.C.D|(0-4294967295)> range A.B.C.D/M substitute A.B.C.D/M",
826 "OSPF area parameters\n"
827 "OSPF area ID in IP address format\n"
828 "OSPF area ID as a decimal value\n"
829 "Summarize routes matching address/mask (border routers only)\n"
830 "Area range prefix\n"
831 "Announce area range as another prefix\n"
832 "Network prefix to be announced instead of range\n")
834 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
835 int idx_ipv4_number
= 2;
836 int idx_ipv4_prefixlen
= 4;
837 int idx_ipv4_prefixlen_2
= 6;
838 struct prefix_ipv4 p
, s
;
839 struct in_addr area_id
;
842 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
843 str2prefix_ipv4(argv
[idx_ipv4_prefixlen
]->arg
, &p
);
844 str2prefix_ipv4(argv
[idx_ipv4_prefixlen_2
]->arg
, &s
);
846 ospf_area_range_substitute_unset(ospf
, area_id
, &p
);
852 /* Command Handler Logic in VLink stuff is delicate!!
854 ALTER AT YOUR OWN RISK!!!!
856 Various dummy values are used to represent 'NoChange' state for
857 VLink configuration NOT being changed by a VLink command, and
858 special syntax is used within the command strings so that the
859 typed in command verbs can be seen in the configuration command
860 bacckend handler. This is to drastically reduce the verbeage
861 required to coe up with a reasonably compatible Cisco VLink command
863 - Matthew Grant <grantma@anathoth.gen.nz>
864 Wed, 21 Feb 2001 15:13:52 +1300
867 /* Configuration data for virtual links
869 struct ospf_vl_config_data
{
870 struct vty
*vty
; /* vty stuff */
871 struct in_addr area_id
; /* area ID from command line */
872 int area_id_fmt
; /* command line area ID format */
873 struct in_addr vl_peer
; /* command line vl_peer */
874 int auth_type
; /* Authehntication type, if given */
875 char *auth_key
; /* simple password if present */
876 int crypto_key_id
; /* Cryptographic key ID */
877 char *md5_key
; /* MD5 authentication key */
878 int hello_interval
; /* Obvious what these are... */
879 int retransmit_interval
;
884 static void ospf_vl_config_data_init(struct ospf_vl_config_data
*vl_config
,
887 memset(vl_config
, 0, sizeof(struct ospf_vl_config_data
));
888 vl_config
->auth_type
= OSPF_AUTH_CMD_NOTSEEN
;
889 vl_config
->vty
= vty
;
892 static struct ospf_vl_data
*
893 ospf_find_vl_data(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
895 struct ospf_area
*area
;
896 struct ospf_vl_data
*vl_data
;
898 struct in_addr area_id
;
900 vty
= vl_config
->vty
;
901 area_id
= vl_config
->area_id
;
903 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
) {
905 "Configuring VLs over the backbone is not allowed\n");
908 area
= ospf_area_get(ospf
, area_id
);
909 ospf_area_display_format_set(ospf
, area
, vl_config
->area_id_fmt
);
911 if (area
->external_routing
!= OSPF_AREA_DEFAULT
) {
912 if (vl_config
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
913 vty_out(vty
, "Area %s is %s\n", inet_ntoa(area_id
),
914 area
->external_routing
== OSPF_AREA_NSSA
918 vty_out(vty
, "Area %ld is %s\n",
919 (unsigned long)ntohl(area_id
.s_addr
),
920 area
->external_routing
== OSPF_AREA_NSSA
926 if ((vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
->vl_peer
))
928 vl_data
= ospf_vl_data_new(area
, vl_config
->vl_peer
);
929 if (vl_data
->vl_oi
== NULL
) {
930 vl_data
->vl_oi
= ospf_vl_new(ospf
, vl_data
);
931 ospf_vl_add(ospf
, vl_data
);
932 ospf_spf_calculate_schedule(ospf
,
933 SPF_FLAG_CONFIG_CHANGE
);
940 static int ospf_vl_set_security(struct ospf_vl_data
*vl_data
,
941 struct ospf_vl_config_data
*vl_config
)
943 struct crypt_key
*ck
;
945 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
947 vty
= vl_config
->vty
;
949 if (vl_config
->auth_type
!= OSPF_AUTH_CMD_NOTSEEN
) {
950 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), auth_type
);
951 IF_DEF_PARAMS(ifp
)->auth_type
= vl_config
->auth_type
;
954 if (vl_config
->auth_key
) {
955 memset(IF_DEF_PARAMS(ifp
)->auth_simple
, 0,
956 OSPF_AUTH_SIMPLE_SIZE
+ 1);
957 strlcpy((char *)IF_DEF_PARAMS(ifp
)->auth_simple
,
959 sizeof(IF_DEF_PARAMS(ifp
)->auth_simple
));
960 } else if (vl_config
->md5_key
) {
961 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
962 vl_config
->crypto_key_id
)
964 vty_out(vty
, "OSPF: Key %d already exists\n",
965 vl_config
->crypto_key_id
);
968 ck
= ospf_crypt_key_new();
969 ck
->key_id
= vl_config
->crypto_key_id
;
970 memset(ck
->auth_key
, 0, OSPF_AUTH_MD5_SIZE
+ 1);
971 strlcpy((char *)ck
->auth_key
, vl_config
->md5_key
,
972 sizeof(ck
->auth_key
));
974 ospf_crypt_key_add(IF_DEF_PARAMS(ifp
)->auth_crypt
, ck
);
975 } else if (vl_config
->crypto_key_id
!= 0) {
978 if (ospf_crypt_key_lookup(IF_DEF_PARAMS(ifp
)->auth_crypt
,
979 vl_config
->crypto_key_id
)
981 vty_out(vty
, "OSPF: Key %d does not exist\n",
982 vl_config
->crypto_key_id
);
983 return CMD_WARNING_CONFIG_FAILED
;
986 ospf_crypt_key_delete(IF_DEF_PARAMS(ifp
)->auth_crypt
,
987 vl_config
->crypto_key_id
);
993 static int ospf_vl_set_timers(struct ospf_vl_data
*vl_data
,
994 struct ospf_vl_config_data
*vl_config
)
996 struct interface
*ifp
= vl_data
->vl_oi
->ifp
;
997 /* Virtual Link data initialised to defaults, so only set
999 if (vl_config
->hello_interval
) {
1000 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_hello
);
1001 IF_DEF_PARAMS(ifp
)->v_hello
= vl_config
->hello_interval
;
1004 if (vl_config
->dead_interval
) {
1005 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), v_wait
);
1006 IF_DEF_PARAMS(ifp
)->v_wait
= vl_config
->dead_interval
;
1009 if (vl_config
->retransmit_interval
) {
1010 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), retransmit_interval
);
1011 IF_DEF_PARAMS(ifp
)->retransmit_interval
=
1012 vl_config
->retransmit_interval
;
1015 if (vl_config
->transmit_delay
) {
1016 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), transmit_delay
);
1017 IF_DEF_PARAMS(ifp
)->transmit_delay
= vl_config
->transmit_delay
;
1024 /* The business end of all of the above */
1025 static int ospf_vl_set(struct ospf
*ospf
, struct ospf_vl_config_data
*vl_config
)
1027 struct ospf_vl_data
*vl_data
;
1030 vl_data
= ospf_find_vl_data(ospf
, vl_config
);
1032 return CMD_WARNING_CONFIG_FAILED
;
1034 /* Process this one first as it can have a fatal result, which can
1035 only logically occur if the virtual link exists already
1036 Thus a command error does not result in a change to the
1037 running configuration such as unexpectedly altered timer
1039 ret
= ospf_vl_set_security(vl_data
, vl_config
);
1040 if (ret
!= CMD_SUCCESS
)
1043 /* Set any time based parameters, these area already range checked */
1045 ret
= ospf_vl_set_timers(vl_data
, vl_config
);
1046 if (ret
!= CMD_SUCCESS
)
1052 /* This stuff exists to make specifying all the alias commands A LOT simpler
1054 #define VLINK_HELPSTR_IPADDR \
1055 "OSPF area parameters\n" \
1056 "OSPF area ID in IP address format\n" \
1057 "OSPF area ID as a decimal value\n" \
1058 "Configure a virtual link\n" \
1059 "Router ID of the remote ABR\n"
1061 #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1062 "Enable authentication on this virtual link\n" \
1065 #define VLINK_HELPSTR_AUTHTYPE_ALL \
1066 VLINK_HELPSTR_AUTHTYPE_SIMPLE \
1067 "Use null authentication\n" \
1068 "Use message-digest authentication\n"
1070 #define VLINK_HELPSTR_TIME_PARAM \
1071 "Time between HELLO packets\n" \
1073 "Time between retransmitting lost link state advertisements\n" \
1075 "Link state transmit delay\n" \
1077 "Interval time after which a neighbor is declared down\n" \
1080 #define VLINK_HELPSTR_AUTH_SIMPLE \
1081 "Authentication password (key)\n" \
1082 "The OSPF password (key)\n"
1084 #define VLINK_HELPSTR_AUTH_MD5 \
1085 "Message digest authentication password (key)\n" \
1087 "Use MD5 algorithm\n" \
1088 "The OSPF password (key)\n"
1090 DEFUN (ospf_area_vlink
,
1091 ospf_area_vlink_cmd
,
1092 "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>]",
1093 VLINK_HELPSTR_IPADDR
1094 "Enable authentication on this virtual link\n"
1095 "Use message-digest authentication\n"
1096 "Use null authentication\n"
1097 VLINK_HELPSTR_AUTH_MD5
1098 VLINK_HELPSTR_AUTH_SIMPLE
)
1100 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1101 int idx_ipv4_number
= 1;
1103 struct ospf_vl_config_data vl_config
;
1104 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1105 char md5_key
[OSPF_AUTH_MD5_SIZE
+ 1];
1109 ospf_vl_config_data_init(&vl_config
, vty
);
1111 /* Read off first 2 parameters and check them */
1112 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1113 &vl_config
.area_id_fmt
);
1115 vty_out(vty
, "OSPF area ID is invalid\n");
1116 return CMD_WARNING_CONFIG_FAILED
;
1119 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1121 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1122 return CMD_WARNING_CONFIG_FAILED
;
1126 /* Thats all folks! - BUGS B. strikes again!!!*/
1128 return ospf_vl_set(ospf
, &vl_config
);
1131 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1132 /* authentication - this option can only occur
1133 at start of command line */
1134 vl_config
.auth_type
= OSPF_AUTH_SIMPLE
;
1137 if (argv_find(argv
, argc
, "message-digest", &idx
)) {
1138 /* authentication message-digest */
1139 vl_config
.auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
1140 } else if (argv_find(argv
, argc
, "null", &idx
)) {
1141 /* "authentication null" */
1142 vl_config
.auth_type
= OSPF_AUTH_NULL
;
1145 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1146 vl_config
.md5_key
= NULL
;
1147 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1148 if (vl_config
.crypto_key_id
< 0)
1149 return CMD_WARNING_CONFIG_FAILED
;
1151 strlcpy(md5_key
, argv
[idx
+ 3]->arg
, sizeof(md5_key
));
1152 vl_config
.md5_key
= md5_key
;
1155 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1156 strlcpy(auth_key
, argv
[idx
+ 1]->arg
, sizeof(auth_key
));
1157 vl_config
.auth_key
= auth_key
;
1160 /* Action configuration */
1162 return ospf_vl_set(ospf
, &vl_config
);
1165 DEFUN (no_ospf_area_vlink
,
1166 no_ospf_area_vlink_cmd
,
1167 "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>]",
1169 VLINK_HELPSTR_IPADDR
1170 "Enable authentication on this virtual link\n" \
1171 "Use message-digest authentication\n" \
1172 "Use null authentication\n" \
1173 VLINK_HELPSTR_AUTH_MD5
1174 VLINK_HELPSTR_AUTH_SIMPLE
)
1176 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1177 int idx_ipv4_number
= 2;
1179 struct ospf_area
*area
;
1180 struct ospf_vl_config_data vl_config
;
1181 struct ospf_vl_data
*vl_data
= NULL
;
1182 char auth_key
[OSPF_AUTH_SIMPLE_SIZE
+ 1];
1186 ospf_vl_config_data_init(&vl_config
, vty
);
1188 ret
= str2area_id(argv
[idx_ipv4_number
]->arg
, &vl_config
.area_id
,
1191 vty_out(vty
, "OSPF area ID is invalid\n");
1192 return CMD_WARNING_CONFIG_FAILED
;
1195 area
= ospf_area_lookup_by_area_id(ospf
, vl_config
.area_id
);
1197 vty_out(vty
, "Area does not exist\n");
1198 return CMD_WARNING_CONFIG_FAILED
;
1201 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &vl_config
.vl_peer
);
1203 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1204 return CMD_WARNING_CONFIG_FAILED
;
1207 vl_data
= ospf_vl_lookup(ospf
, area
, vl_config
.vl_peer
);
1209 vty_out(vty
, "Virtual link does not exist\n");
1210 return CMD_WARNING_CONFIG_FAILED
;
1214 /* Basic VLink no command */
1215 /* Thats all folks! - BUGS B. strikes again!!!*/
1216 ospf_vl_delete(ospf
, vl_data
);
1217 ospf_area_check_free(ospf
, vl_config
.area_id
);
1221 /* If we are down here, we are reseting parameters */
1222 /* Deal with other parameters */
1224 if (argv_find(argv
, argc
, "authentication", &idx
)) {
1225 /* authentication - this option can only occur
1226 at start of command line */
1227 vl_config
.auth_type
= OSPF_AUTH_NOTSET
;
1230 if (argv_find(argv
, argc
, "message-digest-key", &idx
)) {
1231 vl_config
.md5_key
= NULL
;
1232 vl_config
.crypto_key_id
= strtol(argv
[idx
+ 1]->arg
, NULL
, 10);
1233 if (vl_config
.crypto_key_id
< 0)
1234 return CMD_WARNING_CONFIG_FAILED
;
1237 if (argv_find(argv
, argc
, "authentication-key", &idx
)) {
1238 /* Reset authentication-key to 0 */
1239 memset(auth_key
, 0, OSPF_AUTH_SIMPLE_SIZE
+ 1);
1240 vl_config
.auth_key
= auth_key
;
1243 /* Action configuration */
1245 return ospf_vl_set(ospf
, &vl_config
);
1248 DEFUN (ospf_area_vlink_intervals
,
1249 ospf_area_vlink_intervals_cmd
,
1250 "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)}",
1251 VLINK_HELPSTR_IPADDR
1252 VLINK_HELPSTR_TIME_PARAM
)
1254 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1255 struct ospf_vl_config_data vl_config
;
1258 ospf_vl_config_data_init(&vl_config
, vty
);
1260 char *area_id
= argv
[1]->arg
;
1261 char *router_id
= argv
[3]->arg
;
1263 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1265 vty_out(vty
, "OSPF area ID is invalid\n");
1266 return CMD_WARNING_CONFIG_FAILED
;
1269 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1271 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1272 return CMD_WARNING_CONFIG_FAILED
;
1275 for (int idx
= 4; idx
< argc
; idx
++) {
1276 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1277 vl_config
.hello_interval
=
1278 strtol(argv
[++idx
]->arg
, NULL
, 10);
1279 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1280 vl_config
.retransmit_interval
=
1281 strtol(argv
[++idx
]->arg
, NULL
, 10);
1282 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1283 vl_config
.transmit_delay
=
1284 strtol(argv
[++idx
]->arg
, NULL
, 10);
1285 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1286 vl_config
.dead_interval
=
1287 strtol(argv
[++idx
]->arg
, NULL
, 10);
1290 /* Action configuration */
1291 return ospf_vl_set(ospf
, &vl_config
);
1294 DEFUN (no_ospf_area_vlink_intervals
,
1295 no_ospf_area_vlink_intervals_cmd
,
1296 "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)}",
1298 VLINK_HELPSTR_IPADDR
1299 VLINK_HELPSTR_TIME_PARAM
)
1301 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1302 struct ospf_vl_config_data vl_config
;
1305 ospf_vl_config_data_init(&vl_config
, vty
);
1307 char *area_id
= argv
[2]->arg
;
1308 char *router_id
= argv
[4]->arg
;
1310 ret
= str2area_id(area_id
, &vl_config
.area_id
, &vl_config
.area_id_fmt
);
1312 vty_out(vty
, "OSPF area ID is invalid\n");
1313 return CMD_WARNING_CONFIG_FAILED
;
1316 ret
= inet_aton(router_id
, &vl_config
.vl_peer
);
1318 vty_out(vty
, "Please specify valid Router ID as a.b.c.d\n");
1319 return CMD_WARNING_CONFIG_FAILED
;
1322 for (int idx
= 5; idx
< argc
; idx
++) {
1323 if (strmatch(argv
[idx
]->text
, "hello-interval"))
1324 vl_config
.hello_interval
= OSPF_HELLO_INTERVAL_DEFAULT
;
1325 else if (strmatch(argv
[idx
]->text
, "retransmit-interval"))
1326 vl_config
.retransmit_interval
=
1327 OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
1328 else if (strmatch(argv
[idx
]->text
, "transmit-delay"))
1329 vl_config
.transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
1330 else if (strmatch(argv
[idx
]->text
, "dead-interval"))
1331 vl_config
.dead_interval
=
1332 OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
1335 /* Action configuration */
1336 return ospf_vl_set(ospf
, &vl_config
);
1339 DEFUN (ospf_area_shortcut
,
1340 ospf_area_shortcut_cmd
,
1341 "area <A.B.C.D|(0-4294967295)> shortcut <default|enable|disable>",
1342 "OSPF area parameters\n"
1343 "OSPF area ID in IP address format\n"
1344 "OSPF area ID as a decimal value\n"
1345 "Configure the area's shortcutting mode\n"
1346 "Set default shortcutting behavior\n"
1347 "Enable shortcutting through the area\n"
1348 "Disable shortcutting through the area\n")
1350 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1351 int idx_ipv4_number
= 1;
1352 int idx_enable_disable
= 3;
1353 struct ospf_area
*area
;
1354 struct in_addr area_id
;
1358 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1359 argv
[idx_ipv4_number
]->arg
);
1361 area
= ospf_area_get(ospf
, area_id
);
1362 ospf_area_display_format_set(ospf
, area
, format
);
1364 if (strncmp(argv
[idx_enable_disable
]->arg
, "de", 2) == 0)
1365 mode
= OSPF_SHORTCUT_DEFAULT
;
1366 else if (strncmp(argv
[idx_enable_disable
]->arg
, "di", 2) == 0)
1367 mode
= OSPF_SHORTCUT_DISABLE
;
1368 else if (strncmp(argv
[idx_enable_disable
]->arg
, "e", 1) == 0)
1369 mode
= OSPF_SHORTCUT_ENABLE
;
1371 return CMD_WARNING_CONFIG_FAILED
;
1373 ospf_area_shortcut_set(ospf
, area
, mode
);
1375 if (ospf
->abr_type
!= OSPF_ABR_SHORTCUT
)
1377 "Shortcut area setting will take effect "
1378 "only when the router is configured as Shortcut ABR\n");
1383 DEFUN (no_ospf_area_shortcut
,
1384 no_ospf_area_shortcut_cmd
,
1385 "no area <A.B.C.D|(0-4294967295)> shortcut <enable|disable>",
1387 "OSPF area parameters\n"
1388 "OSPF area ID in IP address format\n"
1389 "OSPF area ID as a decimal value\n"
1390 "Deconfigure the area's shortcutting mode\n"
1391 "Deconfigure enabled shortcutting through the area\n"
1392 "Deconfigure disabled shortcutting through the area\n")
1394 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1395 int idx_ipv4_number
= 2;
1396 struct ospf_area
*area
;
1397 struct in_addr area_id
;
1400 VTY_GET_OSPF_AREA_ID_NO_BB("shortcut", area_id
, format
,
1401 argv
[idx_ipv4_number
]->arg
);
1403 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1407 ospf_area_shortcut_unset(ospf
, area
);
1413 DEFUN (ospf_area_stub
,
1415 "area <A.B.C.D|(0-4294967295)> stub",
1416 "OSPF area parameters\n"
1417 "OSPF area ID in IP address format\n"
1418 "OSPF area ID as a decimal value\n"
1419 "Configure OSPF area as stub\n")
1421 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1422 int idx_ipv4_number
= 1;
1423 struct in_addr area_id
;
1426 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1427 argv
[idx_ipv4_number
]->arg
);
1429 ret
= ospf_area_stub_set(ospf
, area_id
);
1430 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1434 "First deconfigure all virtual link through this area\n");
1435 return CMD_WARNING_CONFIG_FAILED
;
1438 ospf_area_no_summary_unset(ospf
, area_id
);
1443 DEFUN (ospf_area_stub_no_summary
,
1444 ospf_area_stub_no_summary_cmd
,
1445 "area <A.B.C.D|(0-4294967295)> stub no-summary",
1446 "OSPF stub parameters\n"
1447 "OSPF area ID in IP address format\n"
1448 "OSPF area ID as a decimal value\n"
1449 "Configure OSPF area as stub\n"
1450 "Do not inject inter-area routes into stub\n")
1452 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1453 int idx_ipv4_number
= 1;
1454 struct in_addr area_id
;
1457 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1458 argv
[idx_ipv4_number
]->arg
);
1460 ret
= ospf_area_stub_set(ospf
, area_id
);
1461 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1465 "%% Area cannot be stub as it contains a virtual link\n");
1466 return CMD_WARNING_CONFIG_FAILED
;
1469 ospf_area_no_summary_set(ospf
, area_id
);
1474 DEFUN (no_ospf_area_stub
,
1475 no_ospf_area_stub_cmd
,
1476 "no area <A.B.C.D|(0-4294967295)> stub",
1478 "OSPF area parameters\n"
1479 "OSPF area ID in IP address format\n"
1480 "OSPF area ID as a decimal value\n"
1481 "Configure OSPF area as stub\n")
1483 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1484 int idx_ipv4_number
= 2;
1485 struct in_addr area_id
;
1488 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1489 argv
[idx_ipv4_number
]->arg
);
1491 ospf_area_stub_unset(ospf
, area_id
);
1492 ospf_area_no_summary_unset(ospf
, area_id
);
1497 DEFUN (no_ospf_area_stub_no_summary
,
1498 no_ospf_area_stub_no_summary_cmd
,
1499 "no area <A.B.C.D|(0-4294967295)> stub no-summary",
1501 "OSPF area parameters\n"
1502 "OSPF area ID in IP address format\n"
1503 "OSPF area ID as a decimal value\n"
1504 "Configure OSPF area as stub\n"
1505 "Do not inject inter-area routes into area\n")
1507 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1508 int idx_ipv4_number
= 2;
1509 struct in_addr area_id
;
1512 VTY_GET_OSPF_AREA_ID_NO_BB("stub", area_id
, format
,
1513 argv
[idx_ipv4_number
]->arg
);
1514 ospf_area_no_summary_unset(ospf
, area_id
);
1519 static int ospf_area_nssa_cmd_handler(struct vty
*vty
, int argc
,
1520 struct cmd_token
**argv
, int cfg_nosum
,
1523 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1524 struct in_addr area_id
;
1527 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
, argv
[1]->arg
);
1529 ret
= ospf_area_nssa_set(ospf
, area_id
);
1530 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1534 "%% Area cannot be nssa as it contains a virtual link\n");
1535 return CMD_WARNING_CONFIG_FAILED
;
1539 if (strncmp(argv
[3]->text
, "translate-c", 11) == 0)
1540 ospf_area_nssa_translator_role_set(
1541 ospf
, area_id
, OSPF_NSSA_ROLE_CANDIDATE
);
1542 else if (strncmp(argv
[3]->text
, "translate-n", 11) == 0)
1543 ospf_area_nssa_translator_role_set(
1544 ospf
, area_id
, OSPF_NSSA_ROLE_NEVER
);
1545 else if (strncmp(argv
[3]->text
, "translate-a", 11) == 0)
1546 ospf_area_nssa_translator_role_set(
1547 ospf
, area_id
, OSPF_NSSA_ROLE_ALWAYS
);
1549 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1550 OSPF_NSSA_ROLE_CANDIDATE
);
1555 ospf_area_no_summary_set(ospf
, area_id
);
1557 ospf_area_no_summary_unset(ospf
, area_id
);
1560 ospf_schedule_abr_task(ospf
);
1566 DEFUN (ospf_area_nssa_translate
,
1567 ospf_area_nssa_translate_cmd
,
1568 "area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
1569 "OSPF area parameters\n"
1570 "OSPF area ID in IP address format\n"
1571 "OSPF area ID as a decimal value\n"
1572 "Configure OSPF area as nssa\n"
1573 "Configure NSSA-ABR for translate election (default)\n"
1574 "Configure NSSA-ABR to never translate\n"
1575 "Configure NSSA-ABR to always translate\n")
1577 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1580 DEFUN (ospf_area_nssa
,
1582 "area <A.B.C.D|(0-4294967295)> nssa",
1583 "OSPF area parameters\n"
1584 "OSPF area ID in IP address format\n"
1585 "OSPF area ID as a decimal value\n"
1586 "Configure OSPF area as nssa\n")
1588 return ospf_area_nssa_cmd_handler(vty
, argc
, argv
, 0, 0);
1591 DEFUN (ospf_area_nssa_no_summary
,
1592 ospf_area_nssa_no_summary_cmd
,
1593 "area <A.B.C.D|(0-4294967295)> nssa no-summary",
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"
1598 "Do not inject inter-area routes into nssa\n")
1600 int idx_ipv4_number
= 1;
1601 struct in_addr area_id
;
1604 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1605 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1606 argv
[idx_ipv4_number
]->arg
);
1608 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1610 ospf_area_nssa_no_summary_set(ospf
, area_id
);
1612 ospf_schedule_abr_task(ospf
);
1617 DEFUN (no_ospf_area_nssa_no_summary
,
1618 no_ospf_area_nssa_no_summary_cmd
,
1619 "no area <A.B.C.D|(0-4294967295)> nssa no-summary",
1621 "OSPF area parameters\n"
1622 "OSPF area ID in IP address format\n"
1623 "OSPF area ID as a decimal value\n"
1624 "Configure OSPF area as nssa\n"
1625 "Do not inject inter-area routes into nssa\n")
1627 int idx_ipv4_number
= 2;
1628 struct in_addr area_id
;
1631 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1633 VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id
, format
,
1634 argv
[idx_ipv4_number
]->arg
);
1636 ospf_area_display_format_set(ospf
, ospf_area_get(ospf
, area_id
),
1638 ospf_area_no_summary_unset(ospf
, area_id
);
1640 ospf_schedule_abr_task(ospf
);
1645 DEFUN (no_ospf_area_nssa
,
1646 no_ospf_area_nssa_cmd
,
1647 "no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
1649 "OSPF area parameters\n"
1650 "OSPF area ID in IP address format\n"
1651 "OSPF area ID as a decimal value\n"
1652 "Configure OSPF area as nssa\n"
1653 "Configure NSSA-ABR for translate election (default)\n"
1654 "Configure NSSA-ABR to never translate\n"
1655 "Configure NSSA-ABR to always translate\n")
1657 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1658 int idx_ipv4_number
= 2;
1659 struct in_addr area_id
;
1662 VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id
, format
,
1663 argv
[idx_ipv4_number
]->arg
);
1665 ospf_area_nssa_unset(ospf
, area_id
, argc
);
1667 ospf_schedule_abr_task(ospf
);
1673 DEFUN (ospf_area_default_cost
,
1674 ospf_area_default_cost_cmd
,
1675 "area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1676 "OSPF area parameters\n"
1677 "OSPF area ID in IP address format\n"
1678 "OSPF area ID as a decimal value\n"
1679 "Set the summary-default cost of a NSSA or stub area\n"
1680 "Stub's advertised default summary cost\n")
1682 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1683 int idx_ipv4_number
= 1;
1685 struct ospf_area
*area
;
1686 struct in_addr area_id
;
1689 struct prefix_ipv4 p
;
1691 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1692 argv
[idx_ipv4_number
]->arg
);
1693 cost
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1695 area
= ospf_area_get(ospf
, area_id
);
1696 ospf_area_display_format_set(ospf
, area
, format
);
1698 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1699 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1700 return CMD_WARNING_CONFIG_FAILED
;
1703 area
->default_cost
= cost
;
1706 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1708 if (IS_DEBUG_OSPF_EVENT
)
1710 "ospf_abr_announce_stub_defaults(): "
1711 "announcing 0.0.0.0/0 to area %s",
1712 inet_ntoa(area
->area_id
));
1713 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1718 DEFUN (no_ospf_area_default_cost
,
1719 no_ospf_area_default_cost_cmd
,
1720 "no area <A.B.C.D|(0-4294967295)> default-cost (0-16777215)",
1722 "OSPF area parameters\n"
1723 "OSPF area ID in IP address format\n"
1724 "OSPF area ID as a decimal value\n"
1725 "Set the summary-default cost of a NSSA or stub area\n"
1726 "Stub's advertised default summary cost\n")
1728 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1729 int idx_ipv4_number
= 2;
1730 struct ospf_area
*area
;
1731 struct in_addr area_id
;
1733 struct prefix_ipv4 p
;
1735 VTY_GET_OSPF_AREA_ID_NO_BB("default-cost", area_id
, format
,
1736 argv
[idx_ipv4_number
]->arg
);
1738 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1742 if (area
->external_routing
== OSPF_AREA_DEFAULT
) {
1743 vty_out(vty
, "The area is neither stub, nor NSSA\n");
1744 return CMD_WARNING_CONFIG_FAILED
;
1747 area
->default_cost
= 1;
1750 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1752 if (IS_DEBUG_OSPF_EVENT
)
1754 "ospf_abr_announce_stub_defaults(): "
1755 "announcing 0.0.0.0/0 to area %s",
1756 inet_ntoa(area
->area_id
));
1757 ospf_abr_announce_network_to_area(&p
, area
->default_cost
, area
);
1760 ospf_area_check_free(ospf
, area_id
);
1765 DEFUN (ospf_area_export_list
,
1766 ospf_area_export_list_cmd
,
1767 "area <A.B.C.D|(0-4294967295)> export-list NAME",
1768 "OSPF area parameters\n"
1769 "OSPF area ID in IP address format\n"
1770 "OSPF area ID as a decimal value\n"
1771 "Set the filter for networks announced to other areas\n"
1772 "Name of the access-list\n")
1774 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1775 int idx_ipv4_number
= 1;
1776 struct ospf_area
*area
;
1777 struct in_addr area_id
;
1780 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1782 area
= ospf_area_get(ospf
, area_id
);
1783 ospf_area_display_format_set(ospf
, area
, format
);
1784 ospf_area_export_list_set(ospf
, area
, argv
[3]->arg
);
1789 DEFUN (no_ospf_area_export_list
,
1790 no_ospf_area_export_list_cmd
,
1791 "no area <A.B.C.D|(0-4294967295)> export-list NAME",
1793 "OSPF area parameters\n"
1794 "OSPF area ID in IP address format\n"
1795 "OSPF area ID as a decimal value\n"
1796 "Unset the filter for networks announced to other areas\n"
1797 "Name of the access-list\n")
1799 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1800 int idx_ipv4_number
= 2;
1801 struct ospf_area
*area
;
1802 struct in_addr area_id
;
1805 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1807 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1811 ospf_area_export_list_unset(ospf
, area
);
1817 DEFUN (ospf_area_import_list
,
1818 ospf_area_import_list_cmd
,
1819 "area <A.B.C.D|(0-4294967295)> import-list NAME",
1820 "OSPF area parameters\n"
1821 "OSPF area ID in IP address format\n"
1822 "OSPF area ID as a decimal value\n"
1823 "Set the filter for networks from other areas announced to the specified one\n"
1824 "Name of the access-list\n")
1826 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1827 int idx_ipv4_number
= 1;
1828 struct ospf_area
*area
;
1829 struct in_addr area_id
;
1832 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1834 area
= ospf_area_get(ospf
, area_id
);
1835 ospf_area_display_format_set(ospf
, area
, format
);
1836 ospf_area_import_list_set(ospf
, area
, argv
[3]->arg
);
1841 DEFUN (no_ospf_area_import_list
,
1842 no_ospf_area_import_list_cmd
,
1843 "no area <A.B.C.D|(0-4294967295)> import-list NAME",
1845 "OSPF area parameters\n"
1846 "OSPF area ID in IP address format\n"
1847 "OSPF area ID as a decimal value\n"
1848 "Unset the filter for networks announced to other areas\n"
1849 "Name of the access-list\n")
1851 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1852 int idx_ipv4_number
= 2;
1853 struct ospf_area
*area
;
1854 struct in_addr area_id
;
1857 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1859 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1863 ospf_area_import_list_unset(ospf
, area
);
1868 DEFUN (ospf_area_filter_list
,
1869 ospf_area_filter_list_cmd
,
1870 "area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1871 "OSPF area parameters\n"
1872 "OSPF area ID in IP address format\n"
1873 "OSPF area ID as a decimal value\n"
1874 "Filter networks between OSPF areas\n"
1875 "Filter prefixes between OSPF areas\n"
1876 "Name of an IP prefix-list\n"
1877 "Filter networks sent to this area\n"
1878 "Filter networks sent from this area\n")
1880 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1881 int idx_ipv4_number
= 1;
1884 struct ospf_area
*area
;
1885 struct in_addr area_id
;
1886 struct prefix_list
*plist
;
1889 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1891 area
= ospf_area_get(ospf
, area_id
);
1892 ospf_area_display_format_set(ospf
, area
, format
);
1893 plist
= prefix_list_lookup(AFI_IP
, argv
[idx_word
]->arg
);
1894 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1895 PREFIX_LIST_IN(area
) = plist
;
1896 if (PREFIX_NAME_IN(area
))
1897 free(PREFIX_NAME_IN(area
));
1899 PREFIX_NAME_IN(area
) = strdup(argv
[idx_word
]->arg
);
1900 ospf_schedule_abr_task(ospf
);
1902 PREFIX_LIST_OUT(area
) = plist
;
1903 if (PREFIX_NAME_OUT(area
))
1904 free(PREFIX_NAME_OUT(area
));
1906 PREFIX_NAME_OUT(area
) = strdup(argv
[idx_word
]->arg
);
1907 ospf_schedule_abr_task(ospf
);
1913 DEFUN (no_ospf_area_filter_list
,
1914 no_ospf_area_filter_list_cmd
,
1915 "no area <A.B.C.D|(0-4294967295)> filter-list prefix WORD <in|out>",
1917 "OSPF area parameters\n"
1918 "OSPF area ID in IP address format\n"
1919 "OSPF area ID as a decimal value\n"
1920 "Filter networks between OSPF areas\n"
1921 "Filter prefixes between OSPF areas\n"
1922 "Name of an IP prefix-list\n"
1923 "Filter networks sent to this area\n"
1924 "Filter networks sent from this area\n")
1926 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1927 int idx_ipv4_number
= 2;
1930 struct ospf_area
*area
;
1931 struct in_addr area_id
;
1934 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
1936 if ((area
= ospf_area_lookup_by_area_id(ospf
, area_id
)) == NULL
)
1939 if (strncmp(argv
[idx_in_out
]->arg
, "in", 2) == 0) {
1940 if (PREFIX_NAME_IN(area
))
1941 if (strcmp(PREFIX_NAME_IN(area
), argv
[idx_word
]->arg
)
1945 PREFIX_LIST_IN(area
) = NULL
;
1946 if (PREFIX_NAME_IN(area
))
1947 free(PREFIX_NAME_IN(area
));
1949 PREFIX_NAME_IN(area
) = NULL
;
1951 ospf_schedule_abr_task(ospf
);
1953 if (PREFIX_NAME_OUT(area
))
1954 if (strcmp(PREFIX_NAME_OUT(area
), argv
[idx_word
]->arg
)
1958 PREFIX_LIST_OUT(area
) = NULL
;
1959 if (PREFIX_NAME_OUT(area
))
1960 free(PREFIX_NAME_OUT(area
));
1962 PREFIX_NAME_OUT(area
) = NULL
;
1964 ospf_schedule_abr_task(ospf
);
1971 DEFUN (ospf_area_authentication_message_digest
,
1972 ospf_area_authentication_message_digest_cmd
,
1973 "[no] area <A.B.C.D|(0-4294967295)> authentication message-digest",
1975 "OSPF area parameters\n"
1976 "OSPF area ID in IP address format\n"
1977 "OSPF area ID as a decimal value\n"
1978 "Enable authentication\n"
1979 "Use message-digest authentication\n")
1981 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
1983 struct ospf_area
*area
;
1984 struct in_addr area_id
;
1987 argv_find(argv
, argc
, "area", &idx
);
1988 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx
+ 1]->arg
);
1990 area
= ospf_area_get(ospf
, area_id
);
1991 ospf_area_display_format_set(ospf
, area
, format
);
1992 area
->auth_type
= strmatch(argv
[0]->text
, "no")
1994 : OSPF_AUTH_CRYPTOGRAPHIC
;
1999 DEFUN (ospf_area_authentication
,
2000 ospf_area_authentication_cmd
,
2001 "area <A.B.C.D|(0-4294967295)> authentication",
2002 "OSPF area parameters\n"
2003 "OSPF area ID in IP address format\n"
2004 "OSPF area ID as a decimal value\n"
2005 "Enable authentication\n")
2007 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2008 int idx_ipv4_number
= 1;
2009 struct ospf_area
*area
;
2010 struct in_addr area_id
;
2013 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2015 area
= ospf_area_get(ospf
, area_id
);
2016 ospf_area_display_format_set(ospf
, area
, format
);
2017 area
->auth_type
= OSPF_AUTH_SIMPLE
;
2022 DEFUN (no_ospf_area_authentication
,
2023 no_ospf_area_authentication_cmd
,
2024 "no area <A.B.C.D|(0-4294967295)> authentication",
2026 "OSPF area parameters\n"
2027 "OSPF area ID in IP address format\n"
2028 "OSPF area ID as a decimal value\n"
2029 "Enable authentication\n")
2031 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2032 int idx_ipv4_number
= 2;
2033 struct ospf_area
*area
;
2034 struct in_addr area_id
;
2037 VTY_GET_OSPF_AREA_ID(area_id
, format
, argv
[idx_ipv4_number
]->arg
);
2039 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
2043 area
->auth_type
= OSPF_AUTH_NULL
;
2045 ospf_area_check_free(ospf
, area_id
);
2051 DEFUN (ospf_abr_type
,
2053 "ospf abr-type <cisco|ibm|shortcut|standard>",
2054 "OSPF specific commands\n"
2055 "Set OSPF ABR type\n"
2056 "Alternative ABR, cisco implementation\n"
2057 "Alternative ABR, IBM implementation\n"
2059 "Standard behavior (RFC2328)\n")
2061 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2063 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2065 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2066 abr_type
= OSPF_ABR_CISCO
;
2067 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2068 abr_type
= OSPF_ABR_IBM
;
2069 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2070 abr_type
= OSPF_ABR_SHORTCUT
;
2071 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2072 abr_type
= OSPF_ABR_STAND
;
2074 return CMD_WARNING_CONFIG_FAILED
;
2076 /* If ABR type value is changed, schedule ABR task. */
2077 if (ospf
->abr_type
!= abr_type
) {
2078 ospf
->abr_type
= abr_type
;
2079 ospf_schedule_abr_task(ospf
);
2085 DEFUN (no_ospf_abr_type
,
2086 no_ospf_abr_type_cmd
,
2087 "no ospf abr-type <cisco|ibm|shortcut|standard>",
2089 "OSPF specific commands\n"
2090 "Set OSPF ABR type\n"
2091 "Alternative ABR, cisco implementation\n"
2092 "Alternative ABR, IBM implementation\n"
2096 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2098 uint8_t abr_type
= OSPF_ABR_UNKNOWN
;
2100 if (strncmp(argv
[idx_vendor
]->arg
, "c", 1) == 0)
2101 abr_type
= OSPF_ABR_CISCO
;
2102 else if (strncmp(argv
[idx_vendor
]->arg
, "i", 1) == 0)
2103 abr_type
= OSPF_ABR_IBM
;
2104 else if (strncmp(argv
[idx_vendor
]->arg
, "sh", 2) == 0)
2105 abr_type
= OSPF_ABR_SHORTCUT
;
2106 else if (strncmp(argv
[idx_vendor
]->arg
, "st", 2) == 0)
2107 abr_type
= OSPF_ABR_STAND
;
2109 return CMD_WARNING_CONFIG_FAILED
;
2111 /* If ABR type value is changed, schedule ABR task. */
2112 if (ospf
->abr_type
== abr_type
) {
2113 ospf
->abr_type
= OSPF_ABR_DEFAULT
;
2114 ospf_schedule_abr_task(ospf
);
2120 DEFUN (ospf_log_adjacency_changes
,
2121 ospf_log_adjacency_changes_cmd
,
2122 "log-adjacency-changes",
2123 "Log changes in adjacency state\n")
2125 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2127 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2128 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2132 DEFUN (ospf_log_adjacency_changes_detail
,
2133 ospf_log_adjacency_changes_detail_cmd
,
2134 "log-adjacency-changes detail",
2135 "Log changes in adjacency state\n"
2136 "Log all state changes\n")
2138 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2140 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2141 SET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2145 DEFUN (no_ospf_log_adjacency_changes
,
2146 no_ospf_log_adjacency_changes_cmd
,
2147 "no log-adjacency-changes",
2149 "Log changes in adjacency state\n")
2151 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2153 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2154 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
);
2158 DEFUN (no_ospf_log_adjacency_changes_detail
,
2159 no_ospf_log_adjacency_changes_detail_cmd
,
2160 "no log-adjacency-changes detail",
2162 "Log changes in adjacency state\n"
2163 "Log all state changes\n")
2165 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2167 UNSET_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
);
2171 DEFUN (ospf_compatible_rfc1583
,
2172 ospf_compatible_rfc1583_cmd
,
2173 "compatible rfc1583",
2174 "OSPF compatibility list\n"
2175 "compatible with RFC 1583\n")
2177 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2179 if (!CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2180 SET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2181 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2186 DEFUN (no_ospf_compatible_rfc1583
,
2187 no_ospf_compatible_rfc1583_cmd
,
2188 "no compatible rfc1583",
2190 "OSPF compatibility list\n"
2191 "compatible with RFC 1583\n")
2193 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2195 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
2196 UNSET_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
);
2197 ospf_spf_calculate_schedule(ospf
, SPF_FLAG_CONFIG_CHANGE
);
2202 ALIAS(ospf_compatible_rfc1583
, ospf_rfc1583_flag_cmd
,
2203 "ospf rfc1583compatibility",
2204 "OSPF specific commands\n"
2205 "Enable the RFC1583Compatibility flag\n")
2207 ALIAS(no_ospf_compatible_rfc1583
, no_ospf_rfc1583_flag_cmd
,
2208 "no ospf rfc1583compatibility", NO_STR
2209 "OSPF specific commands\n"
2210 "Disable the RFC1583Compatibility flag\n")
2212 static int ospf_timers_spf_set(struct vty
*vty
, unsigned int delay
,
2213 unsigned int hold
, unsigned int max
)
2215 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2217 ospf
->spf_delay
= delay
;
2218 ospf
->spf_holdtime
= hold
;
2219 ospf
->spf_max_holdtime
= max
;
2224 DEFUN (ospf_timers_min_ls_interval
,
2225 ospf_timers_min_ls_interval_cmd
,
2226 "timers throttle lsa all (0-5000)",
2227 "Adjust routing timers\n"
2228 "Throttling adaptive timer\n"
2229 "LSA delay between transmissions\n"
2231 "Delay (msec) between sending LSAs\n")
2233 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2235 unsigned int interval
;
2238 vty_out(vty
, "Insufficient arguments\n");
2239 return CMD_WARNING_CONFIG_FAILED
;
2242 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2244 ospf
->min_ls_interval
= interval
;
2249 DEFUN (no_ospf_timers_min_ls_interval
,
2250 no_ospf_timers_min_ls_interval_cmd
,
2251 "no timers throttle lsa all [(0-5000)]",
2253 "Adjust routing timers\n"
2254 "Throttling adaptive timer\n"
2255 "LSA delay between transmissions\n"
2257 "Delay (msec) between sending LSAs\n")
2259 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2260 ospf
->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
2265 DEFUN (ospf_timers_throttle_spf
,
2266 ospf_timers_throttle_spf_cmd
,
2267 "timers throttle spf (0-600000) (0-600000) (0-600000)",
2268 "Adjust routing timers\n"
2269 "Throttling adaptive timer\n"
2271 "Delay (msec) from first change received till SPF calculation\n"
2272 "Initial hold time (msec) between consecutive SPF calculations\n"
2273 "Maximum hold time (msec)\n")
2276 int idx_number_2
= 4;
2277 int idx_number_3
= 5;
2278 unsigned int delay
, hold
, max
;
2281 vty_out(vty
, "Insufficient arguments\n");
2282 return CMD_WARNING_CONFIG_FAILED
;
2285 delay
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2286 hold
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2287 max
= strtoul(argv
[idx_number_3
]->arg
, NULL
, 10);
2289 return ospf_timers_spf_set(vty
, delay
, hold
, max
);
2292 DEFUN (no_ospf_timers_throttle_spf
,
2293 no_ospf_timers_throttle_spf_cmd
,
2294 "no timers throttle spf [(0-600000)(0-600000)(0-600000)]",
2296 "Adjust routing timers\n"
2297 "Throttling adaptive timer\n"
2299 "Delay (msec) from first change received till SPF calculation\n"
2300 "Initial hold time (msec) between consecutive SPF calculations\n"
2301 "Maximum hold time (msec)\n")
2303 return ospf_timers_spf_set(vty
, OSPF_SPF_DELAY_DEFAULT
,
2304 OSPF_SPF_HOLDTIME_DEFAULT
,
2305 OSPF_SPF_MAX_HOLDTIME_DEFAULT
);
2309 DEFUN (ospf_timers_lsa_min_arrival
,
2310 ospf_timers_lsa_min_arrival_cmd
,
2311 "timers lsa min-arrival (0-600000)",
2312 "Adjust routing timers\n"
2314 "Minimum delay in receiving new version of a LSA\n"
2315 "Delay in milliseconds\n")
2317 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2318 ospf
->min_ls_arrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2322 DEFUN (no_ospf_timers_lsa_min_arrival
,
2323 no_ospf_timers_lsa_min_arrival_cmd
,
2324 "no timers lsa min-arrival [(0-600000)]",
2326 "Adjust routing timers\n"
2328 "Minimum delay in receiving new version of a LSA\n"
2329 "Delay in milliseconds\n")
2331 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2332 unsigned int minarrival
;
2335 minarrival
= strtoul(argv
[argc
- 1]->arg
, NULL
, 10);
2337 if (ospf
->min_ls_arrival
!= minarrival
2338 || minarrival
== OSPF_MIN_LS_ARRIVAL
)
2342 ospf
->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
2347 DEFUN (ospf_neighbor
,
2349 "neighbor A.B.C.D [priority (0-255) [poll-interval (1-65535)]]",
2351 "Neighbor IP address\n"
2352 "Neighbor Priority\n"
2354 "Dead Neighbor Polling interval\n"
2357 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2361 struct in_addr nbr_addr
;
2362 unsigned int priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2363 unsigned int interval
= OSPF_POLL_INTERVAL_DEFAULT
;
2365 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2366 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2367 return CMD_WARNING_CONFIG_FAILED
;
2371 priority
= strtoul(argv
[idx_pri
]->arg
, NULL
, 10);
2374 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2376 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2379 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2382 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2387 DEFUN (ospf_neighbor_poll_interval
,
2388 ospf_neighbor_poll_interval_cmd
,
2389 "neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2391 "Neighbor IP address\n"
2392 "Dead Neighbor Polling interval\n"
2394 "OSPF priority of non-broadcast neighbor\n"
2397 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2401 struct in_addr nbr_addr
;
2402 unsigned int priority
;
2403 unsigned int interval
;
2405 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2406 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2407 return CMD_WARNING_CONFIG_FAILED
;
2410 interval
= strtoul(argv
[idx_poll
]->arg
, NULL
, 10);
2412 priority
= argc
> 4 ? strtoul(argv
[idx_pri
]->arg
, NULL
, 10)
2413 : OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2415 ospf_nbr_nbma_set(ospf
, nbr_addr
);
2416 ospf_nbr_nbma_poll_interval_set(ospf
, nbr_addr
, interval
);
2419 ospf_nbr_nbma_priority_set(ospf
, nbr_addr
, priority
);
2424 DEFUN (no_ospf_neighbor
,
2425 no_ospf_neighbor_cmd
,
2426 "no neighbor A.B.C.D [priority (0-255) [poll-interval (1-65525)]]",
2429 "Neighbor IP address\n"
2430 "Neighbor Priority\n"
2432 "Dead Neighbor Polling interval\n"
2435 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2437 struct in_addr nbr_addr
;
2439 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2440 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2441 return CMD_WARNING_CONFIG_FAILED
;
2444 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2449 DEFUN (no_ospf_neighbor_poll
,
2450 no_ospf_neighbor_poll_cmd
,
2451 "no neighbor A.B.C.D poll-interval (1-65535) [priority (0-255)]",
2454 "Neighbor IP address\n"
2455 "Dead Neighbor Polling interval\n"
2457 "Neighbor Priority\n"
2460 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2462 struct in_addr nbr_addr
;
2464 if (!inet_aton(argv
[idx_ipv4
]->arg
, &nbr_addr
)) {
2465 vty_out(vty
, "Please specify Neighbor ID by A.B.C.D\n");
2466 return CMD_WARNING_CONFIG_FAILED
;
2469 (void)ospf_nbr_nbma_unset(ospf
, nbr_addr
);
2474 DEFUN (ospf_refresh_timer
,
2475 ospf_refresh_timer_cmd
,
2476 "refresh timer (10-1800)",
2477 "Adjust refresh parameters\n"
2478 "Set refresh timer\n"
2479 "Timer value in seconds\n")
2481 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2483 unsigned int interval
;
2485 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2486 interval
= (interval
/ OSPF_LSA_REFRESHER_GRANULARITY
)
2487 * OSPF_LSA_REFRESHER_GRANULARITY
;
2489 ospf_timers_refresh_set(ospf
, interval
);
2494 DEFUN (no_ospf_refresh_timer
,
2495 no_ospf_refresh_timer_val_cmd
,
2496 "no refresh timer [(10-1800)]",
2498 "Adjust refresh parameters\n"
2499 "Unset refresh timer\n"
2500 "Timer value in seconds\n")
2502 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2504 unsigned int interval
;
2507 interval
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2509 if (ospf
->lsa_refresh_interval
!= interval
2510 || interval
== OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
2514 ospf_timers_refresh_unset(ospf
);
2520 DEFUN (ospf_auto_cost_reference_bandwidth
,
2521 ospf_auto_cost_reference_bandwidth_cmd
,
2522 "auto-cost reference-bandwidth (1-4294967)",
2523 "Calculate OSPF interface cost according to bandwidth\n"
2524 "Use reference bandwidth method to assign OSPF cost\n"
2525 "The reference bandwidth in terms of Mbits per second\n")
2527 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2528 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2531 struct interface
*ifp
;
2533 refbw
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2534 if (refbw
< 1 || refbw
> 4294967) {
2535 vty_out(vty
, "reference-bandwidth value is invalid\n");
2536 return CMD_WARNING_CONFIG_FAILED
;
2539 /* If reference bandwidth is changed. */
2540 if ((refbw
) == ospf
->ref_bandwidth
)
2543 ospf
->ref_bandwidth
= refbw
;
2544 FOR_ALL_INTERFACES (vrf
, ifp
)
2545 ospf_if_recalculate_output_cost(ifp
);
2550 DEFUN (no_ospf_auto_cost_reference_bandwidth
,
2551 no_ospf_auto_cost_reference_bandwidth_cmd
,
2552 "no auto-cost reference-bandwidth [(1-4294967)]",
2554 "Calculate OSPF interface cost according to bandwidth\n"
2555 "Use reference bandwidth method to assign OSPF cost\n"
2556 "The reference bandwidth in terms of Mbits per second\n")
2558 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2559 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
2560 struct interface
*ifp
;
2562 if (ospf
->ref_bandwidth
== OSPF_DEFAULT_REF_BANDWIDTH
)
2565 ospf
->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
2566 vty_out(vty
, "%% OSPF: Reference bandwidth is changed.\n");
2568 " Please ensure reference bandwidth is consistent across all routers\n");
2570 FOR_ALL_INTERFACES (vrf
, ifp
)
2571 ospf_if_recalculate_output_cost(ifp
);
2576 DEFUN (ospf_write_multiplier
,
2577 ospf_write_multiplier_cmd
,
2578 "ospf write-multiplier (1-100)",
2579 "OSPF specific commands\n"
2580 "Write multiplier\n"
2581 "Maximum number of interface serviced per write\n")
2583 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2585 uint32_t write_oi_count
;
2592 write_oi_count
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
2593 if (write_oi_count
< 1 || write_oi_count
> 100) {
2594 vty_out(vty
, "write-multiplier value is invalid\n");
2595 return CMD_WARNING_CONFIG_FAILED
;
2598 ospf
->write_oi_count
= write_oi_count
;
2602 ALIAS(ospf_write_multiplier
, write_multiplier_cmd
, "write-multiplier (1-100)",
2603 "Write multiplier\n"
2604 "Maximum number of interface serviced per write\n")
2606 DEFUN (no_ospf_write_multiplier
,
2607 no_ospf_write_multiplier_cmd
,
2608 "no ospf write-multiplier (1-100)",
2610 "OSPF specific commands\n"
2611 "Write multiplier\n"
2612 "Maximum number of interface serviced per write\n")
2614 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
2616 ospf
->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
2620 ALIAS(no_ospf_write_multiplier
, no_write_multiplier_cmd
,
2621 "no write-multiplier (1-100)", NO_STR
2622 "Write multiplier\n"
2623 "Maximum number of interface serviced per write\n")
2625 static const char *const ospf_abr_type_descr_str
[] = {
2626 "Unknown", "Standard (RFC2328)", "Alternative IBM",
2627 "Alternative Cisco", "Alternative Shortcut"
2630 static const char *const ospf_shortcut_mode_descr_str
[] = {
2631 "Default", "Enabled", "Disabled"
2634 static void show_ip_ospf_area(struct vty
*vty
, struct ospf_area
*area
,
2635 json_object
*json_areas
, bool use_json
)
2637 json_object
*json_area
= NULL
;
2640 json_area
= json_object_new_object();
2644 vty_out(vty
, " Area ID: %s", inet_ntoa(area
->area_id
));
2646 /* Show Area type/mode. */
2647 if (OSPF_IS_AREA_BACKBONE(area
)) {
2649 json_object_boolean_true_add(json_area
, "backbone");
2651 vty_out(vty
, " (Backbone)\n");
2654 if (area
->external_routing
== OSPF_AREA_STUB
) {
2655 if (area
->no_summary
)
2656 json_object_boolean_true_add(
2657 json_area
, "stubNoSummary");
2658 if (area
->shortcut_configured
)
2659 json_object_boolean_true_add(
2660 json_area
, "stubShortcut");
2661 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
2662 if (area
->no_summary
)
2663 json_object_boolean_true_add(
2664 json_area
, "nssaNoSummary");
2665 if (area
->shortcut_configured
)
2666 json_object_boolean_true_add(
2667 json_area
, "nssaShortcut");
2670 json_object_string_add(
2671 json_area
, "shortcuttingMode",
2672 ospf_shortcut_mode_descr_str
2673 [area
->shortcut_configured
]);
2674 if (area
->shortcut_capability
)
2675 json_object_boolean_true_add(json_area
,
2678 if (area
->external_routing
== OSPF_AREA_STUB
)
2679 vty_out(vty
, " (Stub%s%s)",
2680 area
->no_summary
? ", no summary" : "",
2681 area
->shortcut_configured
? "; " : "");
2682 else if (area
->external_routing
== OSPF_AREA_NSSA
)
2683 vty_out(vty
, " (NSSA%s%s)",
2684 area
->no_summary
? ", no summary" : "",
2685 area
->shortcut_configured
? "; " : "");
2688 vty_out(vty
, " Shortcutting mode: %s",
2689 ospf_shortcut_mode_descr_str
2690 [area
->shortcut_configured
]);
2691 vty_out(vty
, ", S-bit consensus: %s\n",
2692 area
->shortcut_capability
? "ok" : "no");
2696 /* Show number of interfaces */
2698 json_object_int_add(json_area
, "areaIfTotalCounter",
2699 listcount(area
->oiflist
));
2700 json_object_int_add(json_area
, "areaIfActiveCounter",
2704 " Number of interfaces in this area: Total: %d, "
2706 listcount(area
->oiflist
), area
->act_ints
);
2708 if (area
->external_routing
== OSPF_AREA_NSSA
) {
2710 json_object_boolean_true_add(json_area
, "nssa");
2711 if (!IS_OSPF_ABR(area
->ospf
))
2712 json_object_boolean_false_add(json_area
, "abr");
2713 else if (area
->NSSATranslatorState
) {
2714 json_object_boolean_true_add(json_area
, "abr");
2715 if (area
->NSSATranslatorRole
2716 == OSPF_NSSA_ROLE_CANDIDATE
)
2717 json_object_boolean_true_add(
2719 "nssaTranslatorElected");
2720 else if (area
->NSSATranslatorRole
2721 == OSPF_NSSA_ROLE_ALWAYS
)
2722 json_object_boolean_true_add(
2724 "nssaTranslatorAlways");
2726 json_object_boolean_true_add(json_area
, "abr");
2727 if (area
->NSSATranslatorRole
2728 == OSPF_NSSA_ROLE_CANDIDATE
)
2729 json_object_boolean_false_add(
2731 "nssaTranslatorElected");
2733 json_object_boolean_true_add(
2735 "nssaTranslatorNever");
2739 " It is an NSSA configuration. \n Elected NSSA/ABR performs type-7/type-5 LSA translation. \n");
2740 if (!IS_OSPF_ABR(area
->ospf
))
2742 " It is not ABR, therefore not Translator. \n");
2743 else if (area
->NSSATranslatorState
) {
2744 vty_out(vty
, " We are an ABR and ");
2745 if (area
->NSSATranslatorRole
2746 == OSPF_NSSA_ROLE_CANDIDATE
)
2748 "the NSSA Elected Translator. \n");
2749 else if (area
->NSSATranslatorRole
2750 == OSPF_NSSA_ROLE_ALWAYS
)
2752 "always an NSSA Translator. \n");
2754 vty_out(vty
, " We are an ABR, but ");
2755 if (area
->NSSATranslatorRole
2756 == OSPF_NSSA_ROLE_CANDIDATE
)
2758 "not the NSSA Elected Translator. \n");
2761 "never an NSSA Translator. \n");
2766 /* Stub-router state for this area */
2767 if (CHECK_FLAG(area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
)) {
2768 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2771 json_object_boolean_true_add(
2772 json_area
, "originStubMaxDistRouterLsa");
2773 if (CHECK_FLAG(area
->stub_router_state
,
2774 OSPF_AREA_ADMIN_STUB_ROUTED
))
2775 json_object_boolean_true_add(
2776 json_area
, "indefiniteActiveAdmin");
2777 if (area
->t_stub_router
) {
2781 &area
->t_stub_router
->u
.sands
,
2784 json_object_int_add(
2786 "activeStartupRemainderMsecs",
2791 " Originating stub / maximum-distance Router-LSA\n");
2792 if (CHECK_FLAG(area
->stub_router_state
,
2793 OSPF_AREA_ADMIN_STUB_ROUTED
))
2795 " Administratively activated (indefinitely)\n");
2796 if (area
->t_stub_router
)
2798 " Active from startup, %s remaining\n",
2799 ospf_timer_dump(area
->t_stub_router
,
2806 /* Show number of fully adjacent neighbors. */
2807 json_object_int_add(json_area
, "nbrFullAdjacentCounter",
2810 /* Show authentication type. */
2811 if (area
->auth_type
== OSPF_AUTH_NULL
)
2812 json_object_string_add(json_area
, "authentication",
2813 "authenticationNone");
2814 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2815 json_object_string_add(json_area
, "authentication",
2816 "authenticationSimplePassword");
2817 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2818 json_object_string_add(json_area
, "authentication",
2819 "authenticationMessageDigest");
2821 if (!OSPF_IS_AREA_BACKBONE(area
))
2822 json_object_int_add(json_area
,
2823 "virtualAdjacenciesPassingCounter",
2826 /* Show SPF calculation times. */
2827 json_object_int_add(json_area
, "spfExecutedCounter",
2828 area
->spf_calculation
);
2829 json_object_int_add(json_area
, "lsaNumber", area
->lsdb
->total
);
2830 json_object_int_add(
2831 json_area
, "lsaRouterNumber",
2832 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
));
2833 json_object_int_add(
2834 json_area
, "lsaRouterChecksum",
2835 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2836 json_object_int_add(
2837 json_area
, "lsaNetworkNumber",
2838 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
));
2839 json_object_int_add(
2840 json_area
, "lsaNetworkChecksum",
2841 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2842 json_object_int_add(
2843 json_area
, "lsaSummaryNumber",
2844 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
));
2845 json_object_int_add(
2846 json_area
, "lsaSummaryChecksum",
2847 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2848 json_object_int_add(
2849 json_area
, "lsaAsbrNumber",
2850 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2851 json_object_int_add(
2852 json_area
, "lsaAsbrChecksum",
2853 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2854 json_object_int_add(
2855 json_area
, "lsaNssaNumber",
2856 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2857 json_object_int_add(
2858 json_area
, "lsaNssaChecksum",
2859 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2861 /* Show number of fully adjacent neighbors. */
2863 " Number of fully adjacent neighbors in this area:"
2867 /* Show authentication type. */
2868 vty_out(vty
, " Area has ");
2869 if (area
->auth_type
== OSPF_AUTH_NULL
)
2870 vty_out(vty
, "no authentication\n");
2871 else if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
2872 vty_out(vty
, "simple password authentication\n");
2873 else if (area
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
2874 vty_out(vty
, "message digest authentication\n");
2876 if (!OSPF_IS_AREA_BACKBONE(area
))
2878 " Number of full virtual adjacencies going through"
2882 /* Show SPF calculation times. */
2883 vty_out(vty
, " SPF algorithm executed %d times\n",
2884 area
->spf_calculation
);
2886 /* Show number of LSA. */
2887 vty_out(vty
, " Number of LSA %ld\n", area
->lsdb
->total
);
2889 " Number of router LSA %ld. Checksum Sum 0x%08x\n",
2890 ospf_lsdb_count(area
->lsdb
, OSPF_ROUTER_LSA
),
2891 ospf_lsdb_checksum(area
->lsdb
, OSPF_ROUTER_LSA
));
2893 " Number of network LSA %ld. Checksum Sum 0x%08x\n",
2894 ospf_lsdb_count(area
->lsdb
, OSPF_NETWORK_LSA
),
2895 ospf_lsdb_checksum(area
->lsdb
, OSPF_NETWORK_LSA
));
2897 " Number of summary LSA %ld. Checksum Sum 0x%08x\n",
2898 ospf_lsdb_count(area
->lsdb
, OSPF_SUMMARY_LSA
),
2899 ospf_lsdb_checksum(area
->lsdb
, OSPF_SUMMARY_LSA
));
2901 " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x\n",
2902 ospf_lsdb_count(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
),
2903 ospf_lsdb_checksum(area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
));
2904 vty_out(vty
, " Number of NSSA LSA %ld. Checksum Sum 0x%08x\n",
2905 ospf_lsdb_count(area
->lsdb
, OSPF_AS_NSSA_LSA
),
2906 ospf_lsdb_checksum(area
->lsdb
, OSPF_AS_NSSA_LSA
));
2910 json_object_int_add(
2911 json_area
, "lsaOpaqueLinkNumber",
2912 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2913 json_object_int_add(
2914 json_area
, "lsaOpaqueLinkChecksum",
2915 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2916 json_object_int_add(
2917 json_area
, "lsaOpaqueAreaNumber",
2918 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2919 json_object_int_add(
2920 json_area
, "lsaOpaqueAreaChecksum",
2921 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2924 " Number of opaque link LSA %ld. Checksum Sum 0x%08x\n",
2925 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
),
2926 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_LINK_LSA
));
2928 " Number of opaque area LSA %ld. Checksum Sum 0x%08x\n",
2929 ospf_lsdb_count(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
),
2930 ospf_lsdb_checksum(area
->lsdb
, OSPF_OPAQUE_AREA_LSA
));
2934 json_object_object_add(json_areas
, inet_ntoa(area
->area_id
),
2940 static int show_ip_ospf_common(struct vty
*vty
, struct ospf
*ospf
,
2941 json_object
*json
, uint8_t use_vrf
)
2943 struct listnode
*node
, *nnode
;
2944 struct ospf_area
*area
;
2945 struct timeval result
;
2946 char timebuf
[OSPF_TIME_DUMP_SIZE
];
2947 json_object
*json_vrf
= NULL
;
2948 json_object
*json_areas
= NULL
;
2952 json_vrf
= json_object_new_object();
2955 json_areas
= json_object_new_object();
2958 if (ospf
->instance
) {
2960 json_object_int_add(json
, "ospfInstance",
2963 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
2967 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
2969 /* Show Router ID. */
2971 json_object_string_add(json_vrf
, "routerId",
2972 inet_ntoa(ospf
->router_id
));
2974 vty_out(vty
, " OSPF Routing Process, Router ID: %s\n",
2975 inet_ntoa(ospf
->router_id
));
2978 /* Graceful shutdown */
2979 if (ospf
->t_deferred_shutdown
) {
2984 &ospf
->t_deferred_shutdown
->u
.sands
,
2987 json_object_int_add(json_vrf
, "deferredShutdownMsecs",
2991 " Deferred shutdown in progress, %s remaining\n",
2992 ospf_timer_dump(ospf
->t_deferred_shutdown
,
2993 timebuf
, sizeof(timebuf
)));
2997 /* Show capability. */
2999 json_object_boolean_true_add(json_vrf
, "tosRoutesOnly");
3000 json_object_boolean_true_add(json_vrf
, "rfc2328Conform");
3001 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)) {
3002 json_object_boolean_true_add(json_vrf
,
3003 "rfc1583Compatibility");
3006 vty_out(vty
, " Supports only single TOS (TOS0) routes\n");
3007 vty_out(vty
, " This implementation conforms to RFC2328\n");
3008 vty_out(vty
, " RFC1583Compatibility flag is %s\n",
3009 CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
)
3015 if (CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
3016 json_object_boolean_true_add(json_vrf
, "opaqueCapable");
3019 vty_out(vty
, " OpaqueCapability flag is %s\n",
3020 CHECK_FLAG(ospf
->config
, OSPF_OPAQUE_CAPABLE
)
3025 /* Show stub-router configuration */
3026 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
3027 || ospf
->stub_router_shutdown_time
3028 != OSPF_STUB_ROUTER_UNCONFIGURED
) {
3030 json_object_boolean_true_add(json_vrf
,
3031 "stubAdvertisement");
3032 if (ospf
->stub_router_startup_time
3033 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3034 json_object_int_add(
3035 json_vrf
, "postStartEnabledSecs",
3036 ospf
->stub_router_startup_time
);
3037 if (ospf
->stub_router_shutdown_time
3038 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3039 json_object_int_add(
3040 json_vrf
, "preShutdownEnabledSecs",
3041 ospf
->stub_router_shutdown_time
);
3044 " Stub router advertisement is configured\n");
3045 if (ospf
->stub_router_startup_time
3046 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3048 " Enabled for %us after start-up\n",
3049 ospf
->stub_router_startup_time
);
3050 if (ospf
->stub_router_shutdown_time
3051 != OSPF_STUB_ROUTER_UNCONFIGURED
)
3053 " Enabled for %us prior to full shutdown\n",
3054 ospf
->stub_router_shutdown_time
);
3058 /* Show SPF timers. */
3060 json_object_int_add(json_vrf
, "spfScheduleDelayMsecs",
3062 json_object_int_add(json_vrf
, "holdtimeMinMsecs",
3063 ospf
->spf_holdtime
);
3064 json_object_int_add(json_vrf
, "holdtimeMaxMsecs",
3065 ospf
->spf_max_holdtime
);
3066 json_object_int_add(json_vrf
, "holdtimeMultplier",
3067 ospf
->spf_hold_multiplier
);
3070 " Initial SPF scheduling delay %d millisec(s)\n"
3071 " Minimum hold time between consecutive SPFs %d millisec(s)\n"
3072 " Maximum hold time between consecutive SPFs %d millisec(s)\n"
3073 " Hold time multiplier is currently %d\n",
3074 ospf
->spf_delay
, ospf
->spf_holdtime
,
3075 ospf
->spf_max_holdtime
, ospf
->spf_hold_multiplier
);
3079 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3080 long time_store
= 0;
3083 monotime_since(&ospf
->ts_spf
, NULL
) / 1000LL;
3084 json_object_int_add(json_vrf
, "spfLastExecutedMsecs",
3087 time_store
= (1000 * ospf
->ts_spf_duration
.tv_sec
)
3088 + (ospf
->ts_spf_duration
.tv_usec
/ 1000);
3089 json_object_int_add(json_vrf
, "spfLastDurationMsecs",
3092 json_object_boolean_true_add(json_vrf
, "spfHasNotRun");
3094 vty_out(vty
, " SPF algorithm ");
3095 if (ospf
->ts_spf
.tv_sec
|| ospf
->ts_spf
.tv_usec
) {
3096 monotime_since(&ospf
->ts_spf
, &result
);
3097 vty_out(vty
, "last executed %s ago\n",
3098 ospf_timeval_dump(&result
, timebuf
,
3100 vty_out(vty
, " Last SPF duration %s\n",
3101 ospf_timeval_dump(&ospf
->ts_spf_duration
,
3102 timebuf
, sizeof(timebuf
)));
3104 vty_out(vty
, "has not been run\n");
3108 if (ospf
->t_spf_calc
) {
3111 monotime_until(&ospf
->t_spf_calc
->u
.sands
, NULL
)
3113 json_object_int_add(json_vrf
, "spfTimerDueInMsecs",
3117 json_object_int_add(json_vrf
, "lsaMinIntervalMsecs",
3118 ospf
->min_ls_interval
);
3119 json_object_int_add(json_vrf
, "lsaMinArrivalMsecs",
3120 ospf
->min_ls_arrival
);
3121 /* Show write multiplier values */
3122 json_object_int_add(json_vrf
, "writeMultiplier",
3123 ospf
->write_oi_count
);
3124 /* Show refresh parameters. */
3125 json_object_int_add(json_vrf
, "refreshTimerMsecs",
3126 ospf
->lsa_refresh_interval
* 1000);
3128 vty_out(vty
, " SPF timer %s%s\n",
3129 (ospf
->t_spf_calc
? "due in " : "is "),
3130 ospf_timer_dump(ospf
->t_spf_calc
, timebuf
,
3133 vty_out(vty
, " LSA minimum interval %d msecs\n",
3134 ospf
->min_ls_interval
);
3135 vty_out(vty
, " LSA minimum arrival %d msecs\n",
3136 ospf
->min_ls_arrival
);
3138 /* Show write multiplier values */
3139 vty_out(vty
, " Write Multiplier set to %d \n",
3140 ospf
->write_oi_count
);
3142 /* Show refresh parameters. */
3143 vty_out(vty
, " Refresh timer %d secs\n",
3144 ospf
->lsa_refresh_interval
);
3147 /* Show ABR/ASBR flags. */
3148 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ABR
)) {
3150 json_object_string_add(
3151 json_vrf
, "abrType",
3152 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3155 " This router is an ABR, ABR type is: %s\n",
3156 ospf_abr_type_descr_str
[ospf
->abr_type
]);
3158 if (CHECK_FLAG(ospf
->flags
, OSPF_FLAG_ASBR
)) {
3160 json_object_string_add(
3161 json_vrf
, "asbrRouter",
3162 "injectingExternalRoutingInformation");
3165 " This router is an ASBR "
3166 "(injecting external routing information)\n");
3169 /* Show Number of AS-external-LSAs. */
3171 json_object_int_add(
3172 json_vrf
, "lsaExternalCounter",
3173 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3174 json_object_int_add(
3175 json_vrf
, "lsaExternalChecksum",
3176 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3179 " Number of external LSA %ld. Checksum Sum 0x%08x\n",
3180 ospf_lsdb_count(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
),
3181 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_AS_EXTERNAL_LSA
));
3185 json_object_int_add(
3186 json_vrf
, "lsaAsopaqueCounter",
3187 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3188 json_object_int_add(
3189 json_vrf
, "lsaAsOpaqueChecksum",
3190 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3193 " Number of opaque AS LSA %ld. Checksum Sum 0x%08x\n",
3194 ospf_lsdb_count(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
),
3195 ospf_lsdb_checksum(ospf
->lsdb
, OSPF_OPAQUE_AS_LSA
));
3198 /* Show number of areas attached. */
3200 json_object_int_add(json_vrf
, "attachedAreaCounter",
3201 listcount(ospf
->areas
));
3203 vty_out(vty
, " Number of areas attached to this router: %d\n",
3204 listcount(ospf
->areas
));
3206 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
3207 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
)) {
3209 json_object_boolean_true_add(
3210 json_vrf
, "adjacencyChangesLoggedAll");
3213 " All adjacency changes are logged\n");
3216 json_object_boolean_true_add(
3217 json_vrf
, "adjacencyChangesLogged");
3219 vty_out(vty
, " Adjacency changes are logged\n");
3222 /* Show each area status. */
3223 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
3224 show_ip_ospf_area(vty
, area
, json_areas
, json
? 1 : 0);
3228 json_object_object_add(json_vrf
, "areas", json_areas
);
3229 if (ospf
->vrf_id
== VRF_DEFAULT
)
3230 json_object_object_add(json
, "default",
3233 json_object_object_add(json
, ospf
->name
,
3236 json_object_object_add(json
, "areas", json_areas
);
3244 DEFUN (show_ip_ospf
,
3246 "show ip ospf [vrf <NAME|all>] [json]",
3249 "OSPF information\n"
3255 bool uj
= use_json(argc
, argv
);
3256 struct listnode
*node
= NULL
;
3257 char *vrf_name
= NULL
;
3258 bool all_vrf
= false;
3259 int ret
= CMD_SUCCESS
;
3262 json_object
*json
= NULL
;
3263 uint8_t use_vrf
= 0;
3265 if (listcount(om
->ospf
) == 0)
3268 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3271 json
= json_object_new_object();
3273 /* vrf input is provided could be all or specific vrf*/
3275 bool ospf_output
= false;
3280 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3281 if (!ospf
->oi_running
)
3284 ret
= show_ip_ospf_common(vty
, ospf
, json
,
3288 vty_out(vty
, "%s\n",
3289 json_object_to_json_string_ext(
3290 json
, JSON_C_TO_STRING_PRETTY
));
3291 json_object_free(json
);
3292 } else if (!ospf_output
)
3293 vty_out(vty
, "%% OSPF instance not found\n");
3296 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3297 if ((ospf
== NULL
) || !ospf
->oi_running
) {
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
);
3304 vty_out(vty
, "%% OSPF instance not found\n");
3309 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
3310 /* Display default ospf (instance 0) info */
3311 if (ospf
== NULL
|| !ospf
->oi_running
) {
3313 vty_out(vty
, "%s\n",
3314 json_object_to_json_string_ext(
3315 json
, JSON_C_TO_STRING_PRETTY
));
3316 json_object_free(json
);
3318 vty_out(vty
, "%% OSPF instance not found\n");
3325 show_ip_ospf_common(vty
, ospf
, json
, use_vrf
);
3327 vty_out(vty
, "%s\n",
3328 json_object_to_json_string_ext(
3329 json
, JSON_C_TO_STRING_PRETTY
));
3333 json_object_free(json
);
3338 DEFUN (show_ip_ospf_instance
,
3339 show_ip_ospf_instance_cmd
,
3340 "show ip ospf (1-65535) [json]",
3343 "OSPF information\n"
3349 unsigned short instance
= 0;
3350 bool uj
= use_json(argc
, argv
);
3351 int ret
= CMD_SUCCESS
;
3352 json_object
*json
= NULL
;
3354 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3355 ospf
= ospf_lookup_instance(instance
);
3357 return CMD_NOT_MY_INSTANCE
;
3359 if (!ospf
->oi_running
)
3363 json
= json_object_new_object();
3365 ret
= show_ip_ospf_common(vty
, ospf
, json
, 0);
3368 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
3369 json
, JSON_C_TO_STRING_PRETTY
));
3370 json_object_free(json
);
3376 static void show_ip_ospf_interface_sub(struct vty
*vty
, struct ospf
*ospf
,
3377 struct interface
*ifp
,
3378 json_object
*json_interface_sub
,
3382 struct ospf_neighbor
*nbr
;
3383 struct route_node
*rn
;
3384 uint32_t bandwidth
= ifp
->bandwidth
? ifp
->bandwidth
: ifp
->speed
;
3386 /* Is interface up? */
3388 is_up
= if_is_operative(ifp
);
3390 json_object_boolean_true_add(json_interface_sub
,
3393 json_object_boolean_false_add(json_interface_sub
,
3396 json_object_int_add(json_interface_sub
, "ifIndex",
3398 json_object_int_add(json_interface_sub
, "mtuBytes", ifp
->mtu
);
3399 json_object_int_add(json_interface_sub
, "bandwidthMbit",
3401 json_object_string_add(json_interface_sub
, "ifFlags",
3402 if_flag_dump(ifp
->flags
));
3404 vty_out(vty
, "%s is %s\n", ifp
->name
,
3405 ((is_up
= if_is_operative(ifp
)) ? "up" : "down"));
3406 vty_out(vty
, " ifindex %u, MTU %u bytes, BW %u Mbit %s\n",
3407 ifp
->ifindex
, ifp
->mtu
, bandwidth
,
3408 if_flag_dump(ifp
->flags
));
3411 /* Is interface OSPF enabled? */
3413 if (ospf_oi_count(ifp
) == 0) {
3414 json_object_boolean_false_add(json_interface_sub
,
3417 } else if (!is_up
) {
3418 json_object_boolean_false_add(json_interface_sub
,
3422 json_object_boolean_true_add(json_interface_sub
,
3425 if (ospf_oi_count(ifp
) == 0) {
3426 vty_out(vty
, " OSPF not enabled on this interface\n");
3428 } else if (!is_up
) {
3430 " OSPF is enabled, but not running on this interface\n");
3435 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
3436 struct ospf_interface
*oi
= rn
->info
;
3441 if (CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)) {
3443 json_object_boolean_true_add(json_interface_sub
,
3446 vty_out(vty
, " This interface is UNNUMBERED,");
3448 struct in_addr dest
;
3451 /* Show OSPF interface information. */
3453 json_object_string_add(
3454 json_interface_sub
, "ipAddress",
3455 inet_ntoa(oi
->address
->u
.prefix4
));
3456 json_object_int_add(json_interface_sub
,
3457 "ipAddressPrefixlen",
3458 oi
->address
->prefixlen
);
3460 vty_out(vty
, " Internet Address %s/%d,",
3461 inet_ntoa(oi
->address
->u
.prefix4
),
3462 oi
->address
->prefixlen
);
3464 /* For Vlinks, showing the peer address is
3465 * probably more informative than the local
3466 * interface that is being used */
3467 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
) {
3469 dest
= oi
->vl_data
->peer_addr
;
3470 } else if (CONNECTED_PEER(oi
->connected
)
3471 && oi
->connected
->destination
) {
3473 dest
= oi
->connected
->destination
->u
.prefix4
;
3476 dest
.s_addr
= ipv4_broadcast_addr(
3477 oi
->connected
->address
->u
.prefix4
.s_addr
,
3478 oi
->connected
->address
->prefixlen
);
3482 json_object_string_add(
3484 "ospfIfType", dstr
);
3485 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3486 json_object_string_add(
3491 json_object_string_add(
3496 vty_out(vty
, " %s %s,", dstr
,
3500 json_object_string_add(json_interface_sub
, "area",
3501 ospf_area_desc_string(oi
->area
));
3502 if (OSPF_IF_PARAM(oi
, mtu_ignore
))
3503 json_object_boolean_true_add(
3505 "mtuMismatchDetect");
3506 json_object_string_add(json_interface_sub
, "routerId",
3507 inet_ntoa(ospf
->router_id
));
3508 json_object_string_add(json_interface_sub
,
3510 ospf_network_type_str
[oi
->type
]);
3511 json_object_int_add(json_interface_sub
, "cost",
3513 json_object_int_add(
3514 json_interface_sub
, "transmitDelaySecs",
3515 OSPF_IF_PARAM(oi
, transmit_delay
));
3516 json_object_string_add(json_interface_sub
, "state",
3517 lookup_msg(ospf_ism_state_msg
,
3519 json_object_int_add(json_interface_sub
, "priority",
3522 vty_out(vty
, " Area %s\n",
3523 ospf_area_desc_string(oi
->area
));
3525 vty_out(vty
, " MTU mismatch detection: %s\n",
3526 OSPF_IF_PARAM(oi
, mtu_ignore
) ? "disabled"
3530 " Router ID %s, Network Type %s, Cost: %d\n",
3531 inet_ntoa(ospf
->router_id
),
3532 ospf_network_type_str
[oi
->type
],
3536 " Transmit Delay is %d sec, State %s, Priority %d\n",
3537 OSPF_IF_PARAM(oi
, transmit_delay
),
3538 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
3542 /* Show DR information. */
3543 if (DR(oi
).s_addr
== 0) {
3546 " No backup designated router on this network\n");
3548 nbr
= ospf_nbr_lookup_by_addr(oi
->nbrs
, &BDR(oi
));
3552 " No backup designated router on this network\n");
3555 json_object_string_add(
3556 json_interface_sub
, "bdrId",
3557 inet_ntoa(nbr
->router_id
));
3558 json_object_string_add(
3561 inet_ntoa(nbr
->address
.u
3565 " Backup Designated Router (ID) %s,",
3566 inet_ntoa(nbr
->router_id
));
3567 vty_out(vty
, " Interface Address %s\n",
3568 inet_ntoa(nbr
->address
.u
3574 /* Next network-LSA sequence number we'll use, if we're elected
3577 && ntohl(oi
->params
->network_lsa_seqnum
)
3578 != OSPF_INITIAL_SEQUENCE_NUMBER
) {
3580 json_object_int_add(
3582 "networkLsaSequence",
3583 ntohl(oi
->params
->network_lsa_seqnum
));
3586 " Saved Network-LSA sequence number 0x%x\n",
3587 ntohl(oi
->params
->network_lsa_seqnum
));
3591 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3592 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3593 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3594 json_object_boolean_true_add(
3596 "mcastMemberOspfAllRouters");
3597 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3598 json_object_boolean_true_add(
3600 "mcastMemberOspfDesignatedRouters");
3603 vty_out(vty
, " Multicast group memberships:");
3604 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
)
3605 || OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
)) {
3606 if (OI_MEMBER_CHECK(oi
, MEMBER_ALLROUTERS
))
3607 vty_out(vty
, " OSPFAllRouters");
3608 if (OI_MEMBER_CHECK(oi
, MEMBER_DROUTERS
))
3609 vty_out(vty
, " OSPFDesignatedRouters");
3611 vty_out(vty
, " <None>");
3616 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3617 json_object_int_add(
3618 json_interface_sub
, "timerMsecs",
3619 OSPF_IF_PARAM(oi
, v_hello
) * 1000);
3621 json_object_int_add(
3622 json_interface_sub
, "timerMsecs",
3623 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3624 json_object_int_add(json_interface_sub
,
3626 OSPF_IF_PARAM(oi
, v_wait
));
3627 json_object_int_add(json_interface_sub
,
3629 OSPF_IF_PARAM(oi
, v_wait
));
3630 json_object_int_add(
3631 json_interface_sub
, "timerRetransmitSecs",
3632 OSPF_IF_PARAM(oi
, retransmit_interval
));
3634 vty_out(vty
, " Timer intervals configured,");
3635 vty_out(vty
, " Hello ");
3636 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3637 vty_out(vty
, "%ds,",
3638 OSPF_IF_PARAM(oi
, v_hello
));
3640 vty_out(vty
, "%dms,",
3641 1000 / OSPF_IF_PARAM(oi
, fast_hello
));
3642 vty_out(vty
, " Dead %ds, Wait %ds, Retransmit %d\n",
3643 OSPF_IF_PARAM(oi
, v_wait
),
3644 OSPF_IF_PARAM(oi
, v_wait
),
3645 OSPF_IF_PARAM(oi
, retransmit_interval
));
3648 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_ACTIVE
) {
3649 char timebuf
[OSPF_TIME_DUMP_SIZE
];
3651 long time_store
= 0;
3655 &oi
->t_hello
->u
.sands
,
3658 json_object_int_add(json_interface_sub
,
3659 "timerHelloInMsecs",
3662 vty_out(vty
, " Hello due in %s\n",
3663 ospf_timer_dump(oi
->t_hello
, timebuf
,
3665 } else /* passive-interface is set */
3668 json_object_boolean_true_add(
3670 "timerPassiveIface");
3673 " No Hellos (Passive interface)\n");
3677 json_object_int_add(json_interface_sub
, "nbrCount",
3678 ospf_nbr_count(oi
, 0));
3679 json_object_int_add(json_interface_sub
,
3681 ospf_nbr_count(oi
, NSM_Full
));
3684 " Neighbor Count is %d, Adjacent neighbor count is %d\n",
3685 ospf_nbr_count(oi
, 0),
3686 ospf_nbr_count(oi
, NSM_Full
));
3687 ospf_bfd_interface_show(vty
, ifp
, json_interface_sub
, use_json
);
3691 static int show_ip_ospf_interface_common(struct vty
*vty
, struct ospf
*ospf
,
3692 char *intf_name
, uint8_t use_vrf
,
3693 json_object
*json
, bool use_json
)
3695 struct interface
*ifp
;
3696 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3697 json_object
*json_vrf
= NULL
;
3698 json_object
*json_interface_sub
= NULL
, *json_interface
= NULL
;
3702 json_vrf
= json_object_new_object();
3705 json_interface
= json_object_new_object();
3708 if (ospf
->instance
) {
3710 json_object_int_add(json
, "ospfInstance",
3713 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
3716 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3718 if (intf_name
== NULL
) {
3719 /* Show All Interfaces.*/
3720 FOR_ALL_INTERFACES (vrf
, ifp
) {
3721 if (ospf_oi_count(ifp
)) {
3723 json_interface_sub
=
3724 json_object_new_object();
3726 show_ip_ospf_interface_sub(vty
, ospf
, ifp
,
3731 json_object_object_add(
3732 json_interface
, ifp
->name
,
3733 json_interface_sub
);
3738 json_object_object_add(json_vrf
, "interfaces",
3741 /* Interface name is specified. */
3742 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3745 json_object_boolean_true_add(json_vrf
,
3748 vty_out(vty
, "No such interface name\n");
3751 json_interface_sub
= json_object_new_object();
3752 json_interface
= json_object_new_object();
3755 show_ip_ospf_interface_sub(
3756 vty
, ospf
, ifp
, json_interface_sub
, use_json
);
3759 json_object_object_add(json_interface
,
3761 json_interface_sub
);
3762 json_object_object_add(json_vrf
, "interfaces",
3770 if (ospf
->vrf_id
== VRF_DEFAULT
)
3771 json_object_object_add(json
, "default",
3774 json_object_object_add(json
, ospf
->name
,
3783 static void show_ip_ospf_interface_traffic_sub(struct vty
*vty
,
3784 struct ospf_interface
*oi
,
3785 json_object
*json_interface_sub
,
3789 json_object_int_add(json_interface_sub
, "ifIndex",
3791 json_object_int_add(json_interface_sub
, "helloIn",
3793 json_object_int_add(json_interface_sub
, "helloOut",
3795 json_object_int_add(json_interface_sub
, "dbDescIn",
3797 json_object_int_add(json_interface_sub
, "dbDescOut",
3799 json_object_int_add(json_interface_sub
, "lsReqIn",
3801 json_object_int_add(json_interface_sub
, "lsReqOut",
3803 json_object_int_add(json_interface_sub
, "lsUpdIn",
3805 json_object_int_add(json_interface_sub
, "lsUpdOut",
3807 json_object_int_add(json_interface_sub
, "lsAckIn",
3809 json_object_int_add(json_interface_sub
, "lsAckOut",
3813 "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
3814 oi
->ifp
->name
, oi
->hello_in
, oi
->hello_out
,
3815 oi
->db_desc_in
, oi
->db_desc_out
, oi
->ls_req_in
,
3816 oi
->ls_req_out
, oi
->ls_upd_in
, oi
->ls_upd_out
,
3817 oi
->ls_ack_in
, oi
->ls_ack_out
);
3821 /* OSPFv2 Packet Counters */
3822 static int show_ip_ospf_interface_traffic_common(
3823 struct vty
*vty
, struct ospf
*ospf
, char *intf_name
, json_object
*json
,
3824 int display_once
, uint8_t use_vrf
, bool use_json
)
3826 struct vrf
*vrf
= NULL
;
3827 struct interface
*ifp
= NULL
;
3828 json_object
*json_vrf
= NULL
;
3829 json_object
*json_interface_sub
= NULL
;
3831 if (!use_json
&& !display_once
) {
3833 vty_out(vty
, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface",
3834 " HELLO", " DB-Desc", " LS-Req", " LS-Update",
3836 vty_out(vty
, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
3837 " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx",
3840 "--------------------------------------------------------------------------------------------\n");
3841 } else if (use_json
) {
3843 json_vrf
= json_object_new_object();
3848 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
3850 if (intf_name
== NULL
) {
3851 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
3852 FOR_ALL_INTERFACES (vrf
, ifp
) {
3853 struct route_node
*rn
;
3854 struct ospf_interface
*oi
;
3856 if (ospf_oi_count(ifp
) == 0)
3859 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3860 rn
= route_next(rn
)) {
3867 json_interface_sub
=
3868 json_object_new_object();
3871 show_ip_ospf_interface_traffic_sub(
3872 vty
, oi
, json_interface_sub
, use_json
);
3874 json_object_object_add(
3875 json_vrf
, ifp
->name
,
3876 json_interface_sub
);
3881 /* Interface name is specified. */
3882 ifp
= if_lookup_by_name(intf_name
, ospf
->vrf_id
);
3884 struct route_node
*rn
;
3885 struct ospf_interface
*oi
;
3887 if (ospf_oi_count(ifp
) == 0) {
3889 " OSPF not enabled on this interface %s\n",
3894 for (rn
= route_top(IF_OIFS(ifp
)); rn
;
3895 rn
= route_next(rn
)) {
3899 json_interface_sub
=
3900 json_object_new_object();
3903 show_ip_ospf_interface_traffic_sub(
3904 vty
, oi
, json_interface_sub
, use_json
);
3906 json_object_object_add(
3907 json_vrf
, ifp
->name
,
3908 json_interface_sub
);
3916 if (ospf
->vrf_id
== VRF_DEFAULT
)
3917 json_object_object_add(json
, "default",
3920 json_object_object_add(json
, ospf
->name
,
3929 DEFUN (show_ip_ospf_interface
,
3930 show_ip_ospf_interface_cmd
,
3931 "show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
3934 "OSPF information\n"
3937 "Interface information\n"
3942 bool uj
= use_json(argc
, argv
);
3943 struct listnode
*node
= NULL
;
3944 char *vrf_name
= NULL
, *intf_name
= NULL
;
3945 bool all_vrf
= false;
3946 int ret
= CMD_SUCCESS
;
3948 int idx_vrf
= 0, idx_intf
= 0;
3949 uint8_t use_vrf
= 0;
3950 json_object
*json
= NULL
;
3952 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
3954 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
3955 intf_name
= argv
[idx_intf
]->arg
;
3958 json
= json_object_new_object();
3960 /* vrf input is provided could be all or specific vrf*/
3964 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
3965 if (!ospf
->oi_running
)
3967 ret
= show_ip_ospf_interface_common(
3968 vty
, ospf
, intf_name
, use_vrf
, json
,
3973 vty_out(vty
, "%s\n",
3974 json_object_to_json_string_ext(
3975 json
, JSON_C_TO_STRING_PRETTY
));
3976 json_object_free(json
);
3978 vty_out(vty
, "%% OSPF instance not found\n");
3982 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
3983 if (ospf
== NULL
|| !ospf
->oi_running
) {
3985 vty_out(vty
, "%s\n",
3986 json_object_to_json_string_ext(
3987 json
, JSON_C_TO_STRING_PRETTY
));
3988 json_object_free(json
);
3990 vty_out(vty
, "%% OSPF instance not found\n");
3994 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
3998 /* Display default ospf (instance 0) info */
3999 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4000 if (ospf
== NULL
|| !ospf
->oi_running
) {
4002 vty_out(vty
, "%s\n",
4003 json_object_to_json_string_ext(
4004 json
, JSON_C_TO_STRING_PRETTY
));
4005 json_object_free(json
);
4007 vty_out(vty
, "%% OSPF instance not found\n");
4011 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
,
4016 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4017 json
, JSON_C_TO_STRING_PRETTY
));
4018 json_object_free(json
);
4024 DEFUN (show_ip_ospf_instance_interface
,
4025 show_ip_ospf_instance_interface_cmd
,
4026 "show ip ospf (1-65535) interface [INTERFACE] [json]",
4029 "OSPF information\n"
4031 "Interface information\n"
4038 unsigned short instance
= 0;
4039 bool uj
= use_json(argc
, argv
);
4040 char *intf_name
= NULL
;
4041 int ret
= CMD_SUCCESS
;
4042 json_object
*json
= NULL
;
4044 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4045 ospf
= ospf_lookup_instance(instance
);
4047 return CMD_NOT_MY_INSTANCE
;
4049 if (!ospf
->oi_running
)
4053 json
= json_object_new_object();
4055 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4056 intf_name
= argv
[idx_intf
]->arg
;
4058 ret
= show_ip_ospf_interface_common(vty
, ospf
, intf_name
, 0, json
, uj
);
4061 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4062 json
, JSON_C_TO_STRING_PRETTY
));
4063 json_object_free(json
);
4069 DEFUN (show_ip_ospf_interface_traffic
,
4070 show_ip_ospf_interface_traffic_cmd
,
4071 "show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
4074 "OSPF information\n"
4077 "Interface information\n"
4078 "Protocol Packet counters\n"
4082 struct ospf
*ospf
= NULL
;
4083 struct listnode
*node
= NULL
;
4084 char *vrf_name
= NULL
, *intf_name
= NULL
;
4085 bool all_vrf
= false;
4087 int idx_vrf
= 0, idx_intf
= 0;
4088 bool uj
= use_json(argc
, argv
);
4089 json_object
*json
= NULL
;
4090 int ret
= CMD_SUCCESS
;
4091 int display_once
= 0;
4092 uint8_t use_vrf
= 0;
4094 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4096 if (argv_find(argv
, argc
, "INTERFACE", &idx_intf
))
4097 intf_name
= argv
[idx_intf
]->arg
;
4100 json
= json_object_new_object();
4105 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4106 if (!ospf
->oi_running
)
4109 ret
= show_ip_ospf_interface_traffic_common(
4110 vty
, ospf
, intf_name
, json
,
4111 display_once
, use_vrf
, uj
);
4116 vty_out(vty
, "%s\n",
4117 json_object_to_json_string_ext(
4118 json
, JSON_C_TO_STRING_PRETTY
));
4119 json_object_free(json
);
4124 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4125 if (ospf
== NULL
|| !ospf
->oi_running
) {
4127 json_object_free(json
);
4131 ret
= show_ip_ospf_interface_traffic_common(
4132 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4134 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4135 if (ospf
== NULL
|| !ospf
->oi_running
) {
4137 json_object_free(json
);
4141 ret
= show_ip_ospf_interface_traffic_common(
4142 vty
, ospf
, intf_name
, json
, display_once
, use_vrf
, uj
);
4146 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4147 json
, JSON_C_TO_STRING_PRETTY
));
4148 json_object_free(json
);
4155 static void show_ip_ospf_neighbour_header(struct vty
*vty
)
4157 vty_out(vty
, "\n%-15s %3s %-15s %9s %-15s %-32s %5s %5s %5s\n",
4158 "Neighbor ID", "Pri", "State", "Dead Time", "Address",
4159 "Interface", "RXmtL", "RqstL", "DBsmL");
4162 static void show_ip_ospf_neighbor_sub(struct vty
*vty
,
4163 struct ospf_interface
*oi
,
4164 json_object
*json
, bool use_json
)
4166 struct route_node
*rn
;
4167 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
4169 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4170 json_object
*json_neighbor
= NULL
, *json_neigh_array
= NULL
;
4172 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
4173 if ((nbr
= rn
->info
)) {
4174 /* Do not show myself. */
4175 if (nbr
== oi
->nbr_self
)
4177 /* Down state is not shown. */
4178 if (nbr
->state
== NSM_Down
)
4181 char neigh_str
[INET_ADDRSTRLEN
];
4184 && !IPV4_ADDR_SAME(&prev_nbr
->src
,
4186 /* Start new neigh list */
4187 json_neigh_array
= NULL
;
4190 if (nbr
->state
== NSM_Attempt
4191 && nbr
->router_id
.s_addr
== 0)
4192 strlcpy(neigh_str
, "neighbor",
4196 inet_ntoa(nbr
->router_id
),
4199 json_object_object_get_ex(json
, neigh_str
,
4202 if (!json_neigh_array
) {
4204 json_object_new_array();
4205 json_object_object_add(
4210 json_neighbor
= json_object_new_object();
4212 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4218 &nbr
->t_inactivity
->u
.sands
,
4222 json_object_int_add(json_neighbor
, "priority",
4224 json_object_string_add(json_neighbor
, "state",
4226 json_object_int_add(json_neighbor
,
4229 json_object_string_add(json_neighbor
, "address",
4230 inet_ntoa(nbr
->src
));
4231 json_object_string_add(json_neighbor
,
4234 json_object_int_add(
4235 json_neighbor
, "retransmitCounter",
4236 ospf_ls_retransmit_count(nbr
));
4237 json_object_int_add(json_neighbor
,
4239 ospf_ls_request_count(nbr
));
4240 json_object_int_add(json_neighbor
,
4242 ospf_db_summary_count(nbr
));
4244 json_object_array_add(json_neigh_array
,
4247 ospf_nbr_state_message(nbr
, msgbuf
, 16);
4249 if (nbr
->state
== NSM_Attempt
4250 && nbr
->router_id
.s_addr
== 0)
4251 vty_out(vty
, "%-15s %3d %-15s ", "-",
4252 nbr
->priority
, msgbuf
);
4254 vty_out(vty
, "%-15s %3d %-15s ",
4255 inet_ntoa(nbr
->router_id
),
4256 nbr
->priority
, msgbuf
);
4258 vty_out(vty
, "%9s ",
4259 ospf_timer_dump(nbr
->t_inactivity
,
4262 vty_out(vty
, "%-15s ", inet_ntoa(nbr
->src
));
4263 vty_out(vty
, "%-32s %5ld %5ld %5d\n",
4265 ospf_ls_retransmit_count(nbr
),
4266 ospf_ls_request_count(nbr
),
4267 ospf_db_summary_count(nbr
));
4274 static int show_ip_ospf_neighbor_common(struct vty
*vty
, struct ospf
*ospf
,
4275 json_object
*json
, bool use_json
,
4278 struct ospf_interface
*oi
;
4279 struct listnode
*node
;
4280 json_object
*json_vrf
= NULL
;
4281 json_object
*json_nbr_sub
= NULL
;
4285 json_vrf
= json_object_new_object();
4288 json_nbr_sub
= json_object_new_object();
4291 if (ospf
->instance
) {
4293 json_object_int_add(json
, "ospfInstance",
4296 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4299 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4301 show_ip_ospf_neighbour_header(vty
);
4303 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4304 if (ospf_interface_neighbor_count(oi
) == 0)
4306 show_ip_ospf_neighbor_sub(vty
, oi
, json_nbr_sub
, use_json
);
4310 json_object_object_add(json_vrf
, "neighbors", json_nbr_sub
);
4312 if (ospf
->vrf_id
== VRF_DEFAULT
)
4313 json_object_object_add(json
, "default",
4316 json_object_object_add(json
, ospf
->name
,
4325 DEFUN (show_ip_ospf_neighbor
,
4326 show_ip_ospf_neighbor_cmd
,
4327 "show ip ospf [vrf <NAME|all>] neighbor [json]",
4330 "OSPF information\n"
4337 bool uj
= use_json(argc
, argv
);
4338 struct listnode
*node
= NULL
;
4339 char *vrf_name
= NULL
;
4340 bool all_vrf
= false;
4341 int ret
= CMD_SUCCESS
;
4344 uint8_t use_vrf
= 0;
4345 json_object
*json
= NULL
;
4347 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4350 json
= json_object_new_object();
4352 /* vrf input is provided could be all or specific vrf*/
4356 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4357 if (!ospf
->oi_running
)
4359 ret
= show_ip_ospf_neighbor_common(
4360 vty
, ospf
, json
, uj
, use_vrf
);
4364 vty_out(vty
, "%s\n",
4365 json_object_to_json_string_ext(
4366 json
, JSON_C_TO_STRING_PRETTY
));
4367 json_object_free(json
);
4369 vty_out(vty
, "OSPF instance not found\n");
4374 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4375 if (ospf
== NULL
|| !ospf
->oi_running
) {
4377 vty_out(vty
, "%s\n",
4378 json_object_to_json_string_ext(
4379 json
, JSON_C_TO_STRING_PRETTY
));
4380 json_object_free(json
);
4382 vty_out(vty
, "%% OSPF instance not found\n");
4387 /* Display default ospf (instance 0) info */
4388 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4389 if (ospf
== NULL
|| !ospf
->oi_running
) {
4391 vty_out(vty
, "%s\n",
4392 json_object_to_json_string_ext(
4393 json
, JSON_C_TO_STRING_PRETTY
));
4394 json_object_free(json
);
4396 vty_out(vty
, "%% OSPF instance not found\n");
4403 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
,
4407 vty_out(vty
, "%s\n",
4408 json_object_to_json_string_ext(
4409 json
, JSON_C_TO_STRING_PRETTY
));
4414 json_object_free(json
);
4420 DEFUN (show_ip_ospf_instance_neighbor
,
4421 show_ip_ospf_instance_neighbor_cmd
,
4422 "show ip ospf (1-65535) neighbor [json]",
4425 "OSPF information\n"
4432 unsigned short instance
= 0;
4433 bool uj
= use_json(argc
, argv
);
4434 json_object
*json
= NULL
;
4435 int ret
= CMD_SUCCESS
;
4437 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4438 ospf
= ospf_lookup_instance(instance
);
4440 return CMD_NOT_MY_INSTANCE
;
4442 if (!ospf
->oi_running
)
4446 json
= json_object_new_object();
4448 ret
= show_ip_ospf_neighbor_common(vty
, ospf
, json
, uj
, 0);
4451 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4452 json
, JSON_C_TO_STRING_PRETTY
));
4453 json_object_free(json
);
4459 static int show_ip_ospf_neighbor_all_common(struct vty
*vty
, struct ospf
*ospf
,
4460 json_object
*json
, bool use_json
,
4463 struct listnode
*node
;
4464 struct ospf_interface
*oi
;
4465 json_object
*json_vrf
= NULL
;
4466 json_object
*json_neighbor_sub
= NULL
;
4470 json_vrf
= json_object_new_object();
4473 json_neighbor_sub
= json_object_new_object();
4476 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
4478 show_ip_ospf_neighbour_header(vty
);
4480 if (ospf
->instance
) {
4482 json_object_int_add(json_vrf
, "ospfInstance",
4485 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4488 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
4489 struct listnode
*nbr_node
;
4490 struct ospf_nbr_nbma
*nbr_nbma
;
4492 show_ip_ospf_neighbor_sub(vty
, oi
, json_vrf
, use_json
);
4494 /* print Down neighbor status */
4495 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nbr_node
, nbr_nbma
)) {
4496 if (nbr_nbma
->nbr
== NULL
4497 || nbr_nbma
->nbr
->state
== NSM_Down
) {
4499 json_object_int_add(json_neighbor_sub
,
4501 nbr_nbma
->priority
);
4502 json_object_boolean_true_add(
4505 json_object_string_add(
4509 json_object_int_add(
4511 "nbrNbmaRetransmitCounter", 0);
4512 json_object_int_add(
4514 "nbrNbmaRequestCounter", 0);
4515 json_object_int_add(
4517 "nbrNbmaDbSummaryCounter", 0);
4518 json_object_object_add(
4520 inet_ntoa(nbr_nbma
->addr
),
4523 vty_out(vty
, "%-15s %3d %-15s %9s ",
4524 "-", nbr_nbma
->priority
, "Down",
4527 "%-32s %-20s %5d %5d %5d\n",
4528 inet_ntoa(nbr_nbma
->addr
),
4529 IF_NAME(oi
), 0, 0, 0);
4537 if (ospf
->vrf_id
== VRF_DEFAULT
)
4538 json_object_object_add(json
, "default",
4541 json_object_object_add(json
, ospf
->name
,
4550 DEFUN (show_ip_ospf_neighbor_all
,
4551 show_ip_ospf_neighbor_all_cmd
,
4552 "show ip ospf [vrf <NAME|all>] neighbor all [json]",
4555 "OSPF information\n"
4559 "include down status neighbor\n"
4563 bool uj
= use_json(argc
, argv
);
4564 struct listnode
*node
= NULL
;
4565 char *vrf_name
= NULL
;
4566 bool all_vrf
= false;
4567 int ret
= CMD_SUCCESS
;
4570 uint8_t use_vrf
= 0;
4571 json_object
*json
= NULL
;
4573 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
4576 json
= json_object_new_object();
4578 /* vrf input is provided could be all or specific vrf*/
4582 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
4583 if (!ospf
->oi_running
)
4585 ret
= show_ip_ospf_neighbor_all_common(
4586 vty
, ospf
, json
, uj
, use_vrf
);
4590 vty_out(vty
, "%s\n",
4591 json_object_to_json_string_ext(
4592 json
, JSON_C_TO_STRING_PRETTY
));
4593 json_object_free(json
);
4599 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
4600 if (ospf
== NULL
|| !ospf
->oi_running
) {
4602 json_object_free(json
);
4606 /* Display default ospf (instance 0) info */
4607 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
4608 if (ospf
== NULL
|| !ospf
->oi_running
) {
4610 json_object_free(json
);
4616 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
,
4619 vty_out(vty
, "%s\n",
4620 json_object_to_json_string_ext(
4621 json
, JSON_C_TO_STRING_PRETTY
));
4626 json_object_free(json
);
4631 DEFUN (show_ip_ospf_instance_neighbor_all
,
4632 show_ip_ospf_instance_neighbor_all_cmd
,
4633 "show ip ospf (1-65535) neighbor all [json]",
4636 "OSPF information\n"
4639 "include down status neighbor\n"
4644 unsigned short instance
= 0;
4645 bool uj
= use_json(argc
, argv
);
4646 json_object
*json
= NULL
;
4647 int ret
= CMD_SUCCESS
;
4649 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4650 ospf
= ospf_lookup_instance(instance
);
4652 return CMD_NOT_MY_INSTANCE
;
4654 if (!ospf
->oi_running
)
4657 json
= json_object_new_object();
4659 ret
= show_ip_ospf_neighbor_all_common(vty
, ospf
, json
, uj
, 0);
4662 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4663 json
, JSON_C_TO_STRING_PRETTY
));
4664 json_object_free(json
);
4670 static int show_ip_ospf_neighbor_int_common(struct vty
*vty
, struct ospf
*ospf
,
4672 struct cmd_token
**argv
,
4673 bool use_json
, uint8_t use_vrf
)
4675 struct interface
*ifp
;
4676 struct route_node
*rn
;
4677 json_object
*json
= NULL
;
4680 json
= json_object_new_object();
4682 if (ospf
->instance
) {
4684 json_object_int_add(json
, "ospfInstance",
4687 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
4690 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
4692 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
4695 json_object_boolean_true_add(json
, "noSuchIface");
4697 vty_out(vty
, "No such interface.\n");
4701 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
4702 struct ospf_interface
*oi
= rn
->info
;
4707 show_ip_ospf_neighbor_sub(vty
, oi
, json
, use_json
);
4711 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
4712 json
, JSON_C_TO_STRING_PRETTY
));
4713 json_object_free(json
);
4720 DEFUN (show_ip_ospf_neighbor_int
,
4721 show_ip_ospf_neighbor_int_cmd
,
4722 "show ip ospf [vrf <NAME>] neighbor IFNAME [json]",
4725 "OSPF information\n"
4734 bool uj
= use_json(argc
, argv
);
4735 int ret
= CMD_SUCCESS
;
4736 struct interface
*ifp
= NULL
;
4737 char *vrf_name
= NULL
;
4738 vrf_id_t vrf_id
= VRF_DEFAULT
;
4739 struct vrf
*vrf
= NULL
;
4741 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
4742 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
4743 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
4746 vrf
= vrf_lookup_by_name(vrf_name
);
4748 vrf_id
= vrf
->vrf_id
;
4750 ospf
= ospf_lookup_by_vrf_id(vrf_id
);
4752 if (!ospf
|| !ospf
->oi_running
)
4756 show_ip_ospf_neighbour_header(vty
);
4758 argv_find(argv
, argc
, "IFNAME", &idx_ifname
);
4760 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
4764 ret
= show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
,
4769 DEFUN (show_ip_ospf_instance_neighbor_int
,
4770 show_ip_ospf_instance_neighbor_int_cmd
,
4771 "show ip ospf (1-65535) neighbor IFNAME [json]",
4774 "OSPF information\n"
4783 unsigned short instance
= 0;
4784 bool uj
= use_json(argc
, argv
);
4787 show_ip_ospf_neighbour_header(vty
);
4789 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4790 ospf
= ospf_lookup_instance(instance
);
4792 return CMD_NOT_MY_INSTANCE
;
4794 if (!ospf
->oi_running
)
4798 show_ip_ospf_neighbour_header(vty
);
4800 return show_ip_ospf_neighbor_int_common(vty
, ospf
, idx_ifname
, argv
, uj
,
4804 static void show_ip_ospf_nbr_nbma_detail_sub(struct vty
*vty
,
4805 struct ospf_interface
*oi
,
4806 struct ospf_nbr_nbma
*nbr_nbma
,
4807 bool use_json
, json_object
*json
)
4809 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4810 json_object
*json_sub
= NULL
;
4813 json_sub
= json_object_new_object();
4814 else /* Show neighbor ID. */
4815 vty_out(vty
, " Neighbor %s,", "-");
4817 /* Show interface address. */
4819 json_object_string_add(json_sub
, "ifaceAddress",
4820 inet_ntoa(nbr_nbma
->addr
));
4822 vty_out(vty
, " interface address %s\n",
4823 inet_ntoa(nbr_nbma
->addr
));
4827 json_object_string_add(json_sub
, "areaId",
4828 ospf_area_desc_string(oi
->area
));
4829 json_object_string_add(json_sub
, "iface", IF_NAME(oi
));
4831 vty_out(vty
, " In the area %s via interface %s\n",
4832 ospf_area_desc_string(oi
->area
), IF_NAME(oi
));
4834 /* Show neighbor priority and state. */
4836 json_object_int_add(json_sub
, "nbrPriority",
4837 nbr_nbma
->priority
);
4838 json_object_string_add(json_sub
, "nbrState", "down");
4840 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4841 nbr_nbma
->priority
, "Down");
4843 /* Show state changes. */
4845 json_object_int_add(json_sub
, "stateChangeCounter",
4846 nbr_nbma
->state_change
);
4848 vty_out(vty
, " %d state changes\n", nbr_nbma
->state_change
);
4850 /* Show PollInterval */
4852 json_object_int_add(json_sub
, "pollInterval", nbr_nbma
->v_poll
);
4854 vty_out(vty
, " Poll interval %d\n", nbr_nbma
->v_poll
);
4856 /* Show poll-interval timer. */
4857 if (nbr_nbma
->t_poll
) {
4860 time_store
= monotime_until(&nbr_nbma
->t_poll
->u
.sands
,
4862 json_object_int_add(json_sub
,
4863 "pollIntervalTimerDueMsec",
4866 vty_out(vty
, " Poll timer due in %s\n",
4867 ospf_timer_dump(nbr_nbma
->t_poll
, timebuf
,
4871 /* Show poll-interval timer thread. */
4873 if (nbr_nbma
->t_poll
!= NULL
)
4874 json_object_string_add(json_sub
,
4875 "pollIntervalTimerThread", "on");
4877 vty_out(vty
, " Thread Poll Timer %s\n",
4878 nbr_nbma
->t_poll
!= NULL
? "on" : "off");
4881 json_object_object_add(json
, "noNbrId", json_sub
);
4884 static void show_ip_ospf_neighbor_detail_sub(struct vty
*vty
,
4885 struct ospf_interface
*oi
,
4886 struct ospf_neighbor
*nbr
,
4887 struct ospf_neighbor
*prev_nbr
,
4888 json_object
*json
, bool use_json
)
4890 char timebuf
[OSPF_TIME_DUMP_SIZE
];
4891 json_object
*json_neigh
= NULL
, *json_neigh_array
= NULL
;
4892 char neigh_str
[INET_ADDRSTRLEN
] = {0};
4896 !IPV4_ADDR_SAME(&prev_nbr
->src
, &nbr
->src
)) {
4897 json_neigh_array
= NULL
;
4900 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4901 strlcpy(neigh_str
, "noNbrId", sizeof(neigh_str
));
4903 strlcpy(neigh_str
, inet_ntoa(nbr
->router_id
),
4906 json_object_object_get_ex(json
, neigh_str
, &json_neigh_array
);
4908 if (!json_neigh_array
) {
4909 json_neigh_array
= json_object_new_array();
4910 json_object_object_add(json
, neigh_str
,
4914 json_neigh
= json_object_new_object();
4917 /* Show neighbor ID. */
4918 if (nbr
->state
== NSM_Attempt
&& nbr
->router_id
.s_addr
== 0)
4919 vty_out(vty
, " Neighbor %s,", "-");
4921 vty_out(vty
, " Neighbor %s,",
4922 inet_ntoa(nbr
->router_id
));
4925 /* Show interface address. */
4927 json_object_string_add(json_neigh
, "ifaceAddress",
4928 inet_ntoa(nbr
->address
.u
.prefix4
));
4930 vty_out(vty
, " interface address %s\n",
4931 inet_ntoa(nbr
->address
.u
.prefix4
));
4935 json_object_string_add(json_neigh
, "areaId",
4936 ospf_area_desc_string(oi
->area
));
4937 json_object_string_add(json_neigh
, "ifaceName", oi
->ifp
->name
);
4939 vty_out(vty
, " In the area %s via interface %s\n",
4940 ospf_area_desc_string(oi
->area
), oi
->ifp
->name
);
4942 /* Show neighbor priority and state. */
4944 json_object_int_add(json_neigh
, "nbrPriority", nbr
->priority
);
4945 json_object_string_add(
4946 json_neigh
, "nbrState",
4947 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4949 vty_out(vty
, " Neighbor priority is %d, State is %s,",
4951 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
4953 /* Show state changes. */
4955 json_object_int_add(json_neigh
, "stateChangeCounter",
4958 vty_out(vty
, " %d state changes\n", nbr
->state_change
);
4960 if (nbr
->ts_last_progress
.tv_sec
|| nbr
->ts_last_progress
.tv_usec
) {
4965 monotime_since(&nbr
->ts_last_progress
, &res
) / 1000LL;
4967 json_object_int_add(json_neigh
, "lastPrgrsvChangeMsec",
4971 " Most recent state change statistics:\n");
4972 vty_out(vty
, " Progressive change %s ago\n",
4973 ospf_timeval_dump(&res
, timebuf
,
4978 if (nbr
->ts_last_regress
.tv_sec
|| nbr
->ts_last_regress
.tv_usec
) {
4983 monotime_since(&nbr
->ts_last_regress
, &res
) / 1000LL;
4985 json_object_int_add(json_neigh
,
4986 "lastRegressiveChangeMsec",
4988 if (nbr
->last_regress_str
)
4989 json_object_string_add(
4991 "lastRegressiveChangeReason",
4992 nbr
->last_regress_str
);
4995 " Regressive change %s ago, due to %s\n",
4996 ospf_timeval_dump(&res
, timebuf
,
4998 (nbr
->last_regress_str
? nbr
->last_regress_str
5003 /* Show Designated Rotuer ID. */
5005 json_object_string_add(json_neigh
, "routerDesignatedId",
5006 inet_ntoa(nbr
->d_router
));
5008 vty_out(vty
, " DR is %s,", inet_ntoa(nbr
->d_router
));
5010 /* Show Backup Designated Rotuer ID. */
5012 json_object_string_add(json_neigh
, "routerDesignatedBackupId",
5013 inet_ntoa(nbr
->bd_router
));
5015 vty_out(vty
, " BDR is %s\n", inet_ntoa(nbr
->bd_router
));
5019 json_object_int_add(json_neigh
, "optionsCounter", nbr
->options
);
5020 json_object_string_add(json_neigh
, "optionsList",
5021 ospf_options_dump(nbr
->options
));
5023 vty_out(vty
, " Options %d %s\n", nbr
->options
,
5024 ospf_options_dump(nbr
->options
));
5026 /* Show Router Dead interval timer. */
5028 if (nbr
->t_inactivity
) {
5030 time_store
= monotime_until(&nbr
->t_inactivity
->u
.sands
,
5033 json_object_int_add(json_neigh
,
5034 "routerDeadIntervalTimerDueMsec",
5037 json_object_int_add(
5039 "routerDeadIntervalTimerDueMsec", -1);
5041 vty_out(vty
, " Dead timer due in %s\n",
5042 ospf_timer_dump(nbr
->t_inactivity
, timebuf
,
5045 /* Show Database Summary list. */
5047 json_object_int_add(json_neigh
, "databaseSummaryListCounter",
5048 ospf_db_summary_count(nbr
));
5050 vty_out(vty
, " Database Summary List %d\n",
5051 ospf_db_summary_count(nbr
));
5053 /* Show Link State Request list. */
5055 json_object_int_add(json_neigh
, "linkStateRequestListCounter",
5056 ospf_ls_request_count(nbr
));
5058 vty_out(vty
, " Link State Request List %ld\n",
5059 ospf_ls_request_count(nbr
));
5061 /* Show Link State Retransmission list. */
5063 json_object_int_add(json_neigh
,
5064 "linkStateRetransmissionListCounter",
5065 ospf_ls_retransmit_count(nbr
));
5067 vty_out(vty
, " Link State Retransmission List %ld\n",
5068 ospf_ls_retransmit_count(nbr
));
5070 /* Show inactivity timer thread. */
5072 if (nbr
->t_inactivity
!= NULL
)
5073 json_object_string_add(json_neigh
,
5074 "threadInactivityTimer", "on");
5076 vty_out(vty
, " Thread Inactivity Timer %s\n",
5077 nbr
->t_inactivity
!= NULL
? "on" : "off");
5079 /* Show Database Description retransmission thread. */
5081 if (nbr
->t_db_desc
!= NULL
)
5082 json_object_string_add(
5084 "threadDatabaseDescriptionRetransmission",
5088 " Thread Database Description Retransmision %s\n",
5089 nbr
->t_db_desc
!= NULL
? "on" : "off");
5091 /* Show Link State Request Retransmission thread. */
5093 if (nbr
->t_ls_req
!= NULL
)
5094 json_object_string_add(
5096 "threadLinkStateRequestRetransmission", "on");
5099 " Thread Link State Request Retransmission %s\n",
5100 nbr
->t_ls_req
!= NULL
? "on" : "off");
5102 /* Show Link State Update Retransmission thread. */
5104 if (nbr
->t_ls_upd
!= NULL
)
5105 json_object_string_add(
5107 "threadLinkStateUpdateRetransmission",
5111 " Thread Link State Update Retransmission %s\n\n",
5112 nbr
->t_ls_upd
!= NULL
? "on" : "off");
5114 ospf_bfd_show_info(vty
, nbr
->bfd_info
, json_neigh
, use_json
, 0);
5117 json_object_array_add(json_neigh_array
, json_neigh
);
5121 static int show_ip_ospf_neighbor_id_common(struct vty
*vty
, struct ospf
*ospf
,
5122 struct in_addr
*router_id
,
5123 bool use_json
, uint8_t use_vrf
)
5125 struct listnode
*node
;
5126 struct ospf_neighbor
*nbr
;
5127 struct ospf_interface
*oi
;
5128 json_object
*json
= NULL
;
5131 json
= json_object_new_object();
5133 if (ospf
->instance
) {
5135 json_object_int_add(json
, "ospfInstance",
5138 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5141 ospf_show_vrf_name(ospf
, vty
, json
, use_vrf
);
5143 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5144 if ((nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, router_id
))) {
5145 show_ip_ospf_neighbor_detail_sub(vty
, oi
, nbr
, NULL
,
5151 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5152 json
, JSON_C_TO_STRING_PRETTY
));
5153 json_object_free(json
);
5160 DEFPY (show_ip_ospf_neighbor_id
,
5161 show_ip_ospf_neighbor_id_cmd
,
5162 "show ip ospf neighbor A.B.C.D$router_id [json$json]",
5165 "OSPF information\n"
5171 struct listnode
*node
;
5172 int ret
= CMD_SUCCESS
;
5174 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5175 if (!ospf
->oi_running
)
5177 ret
= show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
,
5184 DEFPY (show_ip_ospf_instance_neighbor_id
,
5185 show_ip_ospf_instance_neighbor_id_cmd
,
5186 "show ip ospf (1-65535)$instance neighbor A.B.C.D$router_id [json$json]",
5189 "OSPF information\n"
5197 ospf
= ospf_lookup_instance(instance
);
5199 return CMD_NOT_MY_INSTANCE
;
5201 if (!ospf
->oi_running
)
5204 return show_ip_ospf_neighbor_id_common(vty
, ospf
, &router_id
, !!json
,
5208 static int show_ip_ospf_neighbor_detail_common(struct vty
*vty
,
5210 json_object
*json
, bool use_json
,
5213 struct ospf_interface
*oi
;
5214 struct listnode
*node
;
5215 json_object
*json_vrf
= NULL
;
5216 json_object
*json_nbr_sub
= NULL
;
5220 json_vrf
= json_object_new_object();
5224 json_nbr_sub
= json_object_new_object();
5227 if (ospf
->instance
) {
5229 json_object_int_add(json
, "ospfInstance",
5232 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5235 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5237 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5238 struct route_node
*rn
;
5239 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5241 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5242 if ((nbr
= rn
->info
)) {
5243 if (nbr
!= oi
->nbr_self
) {
5244 if (nbr
->state
!= NSM_Down
) {
5245 show_ip_ospf_neighbor_detail_sub(
5246 vty
, oi
, nbr
, prev_nbr
,
5247 json_nbr_sub
, use_json
);
5256 json_object_object_add(json_vrf
, "neighbors",
5259 if (ospf
->vrf_id
== VRF_DEFAULT
)
5260 json_object_object_add(json
, "default",
5263 json_object_object_add(json
, ospf
->name
,
5272 DEFUN (show_ip_ospf_neighbor_detail
,
5273 show_ip_ospf_neighbor_detail_cmd
,
5274 "show ip ospf [vrf <NAME|all>] neighbor detail [json]",
5277 "OSPF information\n"
5281 "detail of all neighbors\n"
5285 bool uj
= use_json(argc
, argv
);
5286 struct listnode
*node
= NULL
;
5287 char *vrf_name
= NULL
;
5288 bool all_vrf
= false;
5289 int ret
= CMD_SUCCESS
;
5292 uint8_t use_vrf
= 0;
5293 json_object
*json
= NULL
;
5295 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5298 json
= json_object_new_object();
5300 /* vrf input is provided could be all or specific vrf*/
5304 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5305 if (!ospf
->oi_running
)
5307 ret
= show_ip_ospf_neighbor_detail_common(
5308 vty
, ospf
, json
, uj
, use_vrf
);
5311 vty_out(vty
, "%s\n",
5312 json_object_to_json_string_ext(
5313 json
, JSON_C_TO_STRING_PRETTY
));
5314 json_object_free(json
);
5319 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5320 if (ospf
== NULL
|| !ospf
->oi_running
) {
5322 json_object_free(json
);
5326 /* Display default ospf (instance 0) info */
5327 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5328 if (ospf
== NULL
|| !ospf
->oi_running
) {
5330 json_object_free(json
);
5336 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
,
5339 vty_out(vty
, "%s\n",
5340 json_object_to_json_string_ext(
5341 json
, JSON_C_TO_STRING_PRETTY
));
5346 json_object_free(json
);
5351 DEFUN (show_ip_ospf_instance_neighbor_detail
,
5352 show_ip_ospf_instance_neighbor_detail_cmd
,
5353 "show ip ospf (1-65535) neighbor detail [json]",
5356 "OSPF information\n"
5359 "detail of all neighbors\n"
5364 unsigned short instance
= 0;
5365 bool uj
= use_json(argc
, argv
);
5366 json_object
*json
= NULL
;
5367 int ret
= CMD_SUCCESS
;
5369 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5370 ospf
= ospf_lookup_instance(instance
);
5372 return CMD_NOT_MY_INSTANCE
;
5374 if (!ospf
->oi_running
)
5378 json
= json_object_new_object();
5380 ret
= show_ip_ospf_neighbor_detail_common(vty
, ospf
, json
, uj
, 0);
5383 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5384 json
, JSON_C_TO_STRING_PRETTY
));
5385 json_object_free(json
);
5391 static int show_ip_ospf_neighbor_detail_all_common(struct vty
*vty
,
5397 struct listnode
*node
;
5398 struct ospf_interface
*oi
;
5399 json_object
*json_vrf
= NULL
;
5403 json_vrf
= json_object_new_object();
5408 if (ospf
->instance
) {
5410 json_object_int_add(json
, "ospfInstance",
5413 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5416 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
5418 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
5419 struct route_node
*rn
;
5420 struct ospf_neighbor
*nbr
, *prev_nbr
= NULL
;
5421 struct ospf_nbr_nbma
*nbr_nbma
;
5423 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
5424 if ((nbr
= rn
->info
)) {
5425 if (nbr
!= oi
->nbr_self
)
5426 if (nbr
->state
!= NSM_Down
)
5427 show_ip_ospf_neighbor_detail_sub(
5430 json_vrf
, use_json
);
5435 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
5436 struct listnode
*nd
;
5438 for (ALL_LIST_ELEMENTS_RO(oi
->nbr_nbma
, nd
, nbr_nbma
)) {
5439 if (nbr_nbma
->nbr
== NULL
5440 || nbr_nbma
->nbr
->state
== NSM_Down
)
5441 show_ip_ospf_nbr_nbma_detail_sub(
5442 vty
, oi
, nbr_nbma
, use_json
,
5450 if (ospf
->vrf_id
== VRF_DEFAULT
)
5451 json_object_object_add(json
, "default",
5454 json_object_object_add(json
, ospf
->name
,
5464 DEFUN (show_ip_ospf_neighbor_detail_all
,
5465 show_ip_ospf_neighbor_detail_all_cmd
,
5466 "show ip ospf [vrf <NAME|all>] neighbor detail all [json]",
5469 "OSPF information\n"
5473 "detail of all neighbors\n"
5474 "include down status neighbor\n"
5478 bool uj
= use_json(argc
, argv
);
5479 struct listnode
*node
= NULL
;
5480 char *vrf_name
= NULL
;
5481 bool all_vrf
= false;
5482 int ret
= CMD_SUCCESS
;
5485 uint8_t use_vrf
= 0;
5486 json_object
*json
= NULL
;
5488 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
5491 json
= json_object_new_object();
5493 /* vrf input is provided could be all or specific vrf*/
5497 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5498 if (!ospf
->oi_running
)
5500 ret
= show_ip_ospf_neighbor_detail_all_common(
5501 vty
, ospf
, json
, uj
, use_vrf
);
5505 vty_out(vty
, "%s\n",
5506 json_object_to_json_string_ext(
5507 json
, JSON_C_TO_STRING_PRETTY
));
5508 json_object_free(json
);
5513 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
5514 if (ospf
== NULL
|| !ospf
->oi_running
) {
5516 json_object_free(json
);
5520 /* Display default ospf (instance 0) info */
5521 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
5522 if (ospf
== NULL
|| !ospf
->oi_running
) {
5524 json_object_free(json
);
5530 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
,
5533 vty_out(vty
, "%s\n",
5534 json_object_to_json_string_ext(
5535 json
, JSON_C_TO_STRING_PRETTY
));
5540 json_object_free(json
);
5545 DEFUN (show_ip_ospf_instance_neighbor_detail_all
,
5546 show_ip_ospf_instance_neighbor_detail_all_cmd
,
5547 "show ip ospf (1-65535) neighbor detail all [json]",
5550 "OSPF information\n"
5553 "detail of all neighbors\n"
5554 "include down status neighbor\n"
5559 unsigned short instance
= 0;
5560 bool uj
= use_json(argc
, argv
);
5561 json_object
*json
= NULL
;
5562 int ret
= CMD_SUCCESS
;
5564 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5565 ospf
= ospf_lookup_instance(instance
);
5567 return CMD_NOT_MY_INSTANCE
;
5569 if (!ospf
->oi_running
)
5573 json
= json_object_new_object();
5575 ret
= show_ip_ospf_neighbor_detail_all_common(vty
, ospf
, json
, uj
, 0);
5578 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5579 json
, JSON_C_TO_STRING_PRETTY
));
5580 json_object_free(json
);
5586 static int show_ip_ospf_neighbor_int_detail_common(struct vty
*vty
,
5589 struct cmd_token
**argv
,
5592 struct ospf_interface
*oi
;
5593 struct interface
*ifp
;
5594 struct route_node
*rn
, *nrn
;
5595 struct ospf_neighbor
*nbr
;
5596 json_object
*json
= NULL
;
5599 json
= json_object_new_object();
5601 if (ospf
->instance
) {
5603 json_object_int_add(json
, "ospfInstance",
5606 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
5609 ifp
= if_lookup_by_name(argv
[arg_base
]->arg
, ospf
->vrf_id
);
5612 vty_out(vty
, "No such interface.\n");
5614 vty_out(vty
, "{}\n");
5615 json_object_free(json
);
5620 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
5621 if ((oi
= rn
->info
)) {
5622 for (nrn
= route_top(oi
->nbrs
); nrn
;
5623 nrn
= route_next(nrn
)) {
5624 if ((nbr
= nrn
->info
)) {
5625 if (nbr
!= oi
->nbr_self
) {
5626 if (nbr
->state
!= NSM_Down
)
5627 show_ip_ospf_neighbor_detail_sub(
5638 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
5639 json
, JSON_C_TO_STRING_PRETTY
));
5640 json_object_free(json
);
5647 DEFUN (show_ip_ospf_neighbor_int_detail
,
5648 show_ip_ospf_neighbor_int_detail_cmd
,
5649 "show ip ospf neighbor IFNAME detail [json]",
5652 "OSPF information\n"
5655 "detail of all neighbors\n"
5659 bool uj
= use_json(argc
, argv
);
5660 struct listnode
*node
= NULL
;
5661 int ret
= CMD_SUCCESS
;
5662 bool ospf_output
= false;
5664 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
5665 if (!ospf
->oi_running
)
5668 ret
= show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, 4,
5673 vty_out(vty
, "%% OSPF instance not found\n");
5678 DEFUN (show_ip_ospf_instance_neighbor_int_detail
,
5679 show_ip_ospf_instance_neighbor_int_detail_cmd
,
5680 "show ip ospf (1-65535) neighbor IFNAME detail [json]",
5683 "OSPF information\n"
5687 "detail of all neighbors\n"
5693 unsigned short instance
= 0;
5694 bool uj
= use_json(argc
, argv
);
5696 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5697 ospf
= ospf_lookup_instance(instance
);
5699 return CMD_NOT_MY_INSTANCE
;
5701 if (!ospf
->oi_running
)
5704 return show_ip_ospf_neighbor_int_detail_common(vty
, ospf
, idx_ifname
,
5708 /* Show functions */
5709 static int show_lsa_summary(struct vty
*vty
, struct ospf_lsa
*lsa
, int self
)
5711 struct router_lsa
*rl
;
5712 struct summary_lsa
*sl
;
5713 struct as_external_lsa
*asel
;
5714 struct prefix_ipv4 p
;
5717 /* If self option is set, check LSA self flag. */
5718 if (self
== 0 || IS_LSA_SELF(lsa
)) {
5719 /* LSA common part show. */
5720 vty_out(vty
, "%-15s ", inet_ntoa(lsa
->data
->id
));
5721 vty_out(vty
, "%-15s %4d 0x%08lx 0x%04x",
5722 inet_ntoa(lsa
->data
->adv_router
), LS_AGE(lsa
),
5723 (unsigned long)ntohl(lsa
->data
->ls_seqnum
),
5724 ntohs(lsa
->data
->checksum
));
5725 /* LSA specific part show. */
5726 switch (lsa
->data
->type
) {
5727 case OSPF_ROUTER_LSA
:
5728 rl
= (struct router_lsa
*)lsa
->data
;
5729 vty_out(vty
, " %-d", ntohs(rl
->links
));
5731 case OSPF_SUMMARY_LSA
:
5732 sl
= (struct summary_lsa
*)lsa
->data
;
5735 p
.prefix
= sl
->header
.id
;
5736 p
.prefixlen
= ip_masklen(sl
->mask
);
5737 apply_mask_ipv4(&p
);
5739 vty_out(vty
, " %s/%d", inet_ntoa(p
.prefix
),
5742 case OSPF_AS_EXTERNAL_LSA
:
5743 case OSPF_AS_NSSA_LSA
:
5744 asel
= (struct as_external_lsa
*)lsa
->data
;
5747 p
.prefix
= asel
->header
.id
;
5748 p
.prefixlen
= ip_masklen(asel
->mask
);
5749 apply_mask_ipv4(&p
);
5751 vty_out(vty
, " %s %s/%d [0x%lx]",
5752 IS_EXTERNAL_METRIC(asel
->e
[0].tos
)
5755 inet_ntoa(p
.prefix
), p
.prefixlen
,
5756 (unsigned long)ntohl(
5757 asel
->e
[0].route_tag
));
5759 case OSPF_NETWORK_LSA
:
5760 case OSPF_ASBR_SUMMARY_LSA
:
5761 case OSPF_OPAQUE_LINK_LSA
:
5762 case OSPF_OPAQUE_AREA_LSA
:
5763 case OSPF_OPAQUE_AS_LSA
:
5773 static const char *const show_database_desc
[] = {
5775 "Router Link States",
5777 "Summary Link States",
5778 "ASBR-Summary Link States",
5779 "AS External Link States",
5780 "Group Membership LSA",
5781 "NSSA-external Link States",
5783 "Link-Local Opaque-LSA",
5784 "Area-Local Opaque-LSA",
5785 "AS-external Opaque-LSA",
5788 static const char *const show_database_header
[] = {
5790 "Link ID ADV Router Age Seq# CkSum Link count",
5791 "Link ID ADV Router Age Seq# CkSum",
5792 "Link ID ADV Router Age Seq# CkSum Route",
5793 "Link ID ADV Router Age Seq# CkSum",
5794 "Link ID ADV Router Age Seq# CkSum Route",
5795 " --- header for Group Member ----",
5796 "Link ID ADV Router Age Seq# CkSum Route",
5798 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5799 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5800 "Opaque-Type/Id ADV Router Age Seq# CkSum",
5803 static void show_ip_ospf_database_header(struct vty
*vty
, struct ospf_lsa
*lsa
)
5805 struct router_lsa
*rlsa
= (struct router_lsa
*)lsa
->data
;
5807 vty_out(vty
, " LS age: %d\n", LS_AGE(lsa
));
5808 vty_out(vty
, " Options: 0x%-2x : %s\n", lsa
->data
->options
,
5809 ospf_options_dump(lsa
->data
->options
));
5810 vty_out(vty
, " LS Flags: 0x%-2x %s\n", lsa
->flags
,
5811 ((lsa
->flags
& OSPF_LSA_LOCAL_XLT
) ? "(Translated from Type-7)"
5814 if (lsa
->data
->type
== OSPF_ROUTER_LSA
) {
5815 vty_out(vty
, " Flags: 0x%x", rlsa
->flags
);
5818 vty_out(vty
, " :%s%s%s%s",
5819 IS_ROUTER_LSA_BORDER(rlsa
) ? " ABR" : "",
5820 IS_ROUTER_LSA_EXTERNAL(rlsa
) ? " ASBR" : "",
5821 IS_ROUTER_LSA_VIRTUAL(rlsa
) ? " VL-endpoint"
5823 IS_ROUTER_LSA_SHORTCUT(rlsa
) ? " Shortcut"
5828 vty_out(vty
, " LS Type: %s\n",
5829 lookup_msg(ospf_lsa_type_msg
, lsa
->data
->type
, NULL
));
5830 vty_out(vty
, " Link State ID: %s %s\n", inet_ntoa(lsa
->data
->id
),
5831 lookup_msg(ospf_link_state_id_type_msg
, lsa
->data
->type
, NULL
));
5832 vty_out(vty
, " Advertising Router: %s\n",
5833 inet_ntoa(lsa
->data
->adv_router
));
5834 vty_out(vty
, " LS Seq Number: %08lx\n",
5835 (unsigned long)ntohl(lsa
->data
->ls_seqnum
));
5836 vty_out(vty
, " Checksum: 0x%04x\n", ntohs(lsa
->data
->checksum
));
5837 vty_out(vty
, " Length: %d\n\n", ntohs(lsa
->data
->length
));
5840 static const char *const link_type_desc
[] = {
5842 "another Router (point-to-point)",
5843 "a Transit Network",
5848 static const char *const link_id_desc
[] = {
5849 "(null)", "Neighboring Router ID", "Designated Router address",
5850 "Net", "Neighboring Router ID",
5853 static const char *const link_data_desc
[] = {
5854 "(null)", "Router Interface address", "Router Interface address",
5855 "Network Mask", "Router Interface address",
5858 /* Show router-LSA each Link information. */
5859 static void show_ip_ospf_database_router_links(struct vty
*vty
,
5860 struct router_lsa
*rl
)
5865 len
= ntohs(rl
->header
.length
) - 4;
5866 for (i
= 0; i
< ntohs(rl
->links
) && len
> 0; len
-= 12, i
++) {
5867 type
= rl
->link
[i
].type
;
5869 vty_out(vty
, " Link connected to: %s\n",
5870 link_type_desc
[type
]);
5871 vty_out(vty
, " (Link ID) %s: %s\n", link_id_desc
[type
],
5872 inet_ntoa(rl
->link
[i
].link_id
));
5873 vty_out(vty
, " (Link Data) %s: %s\n", link_data_desc
[type
],
5874 inet_ntoa(rl
->link
[i
].link_data
));
5875 vty_out(vty
, " Number of TOS metrics: 0\n");
5876 vty_out(vty
, " TOS 0 Metric: %d\n",
5877 ntohs(rl
->link
[i
].metric
));
5882 /* Show router-LSA detail information. */
5883 static int show_router_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5886 struct router_lsa
*rl
= (struct router_lsa
*)lsa
->data
;
5888 show_ip_ospf_database_header(vty
, lsa
);
5890 vty_out(vty
, " Number of Links: %d\n\n", ntohs(rl
->links
));
5892 show_ip_ospf_database_router_links(vty
, rl
);
5899 /* Show network-LSA detail information. */
5900 static int show_network_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5905 struct network_lsa
*nl
= (struct network_lsa
*)lsa
->data
;
5907 show_ip_ospf_database_header(vty
, lsa
);
5909 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(nl
->mask
));
5911 length
= ntohs(lsa
->data
->length
) - OSPF_LSA_HEADER_SIZE
- 4;
5913 for (i
= 0; length
> 0; i
++, length
-= 4)
5914 vty_out(vty
, " Attached Router: %s\n",
5915 inet_ntoa(nl
->routers
[i
]));
5923 /* Show summary-LSA detail information. */
5924 static int show_summary_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5927 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5929 show_ip_ospf_database_header(vty
, lsa
);
5931 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5932 vty_out(vty
, " TOS: 0 Metric: %d\n",
5933 GET_METRIC(sl
->metric
));
5940 /* Show summary-ASBR-LSA detail information. */
5941 static int show_summary_asbr_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5944 struct summary_lsa
*sl
= (struct summary_lsa
*)lsa
->data
;
5946 show_ip_ospf_database_header(vty
, lsa
);
5948 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(sl
->mask
));
5949 vty_out(vty
, " TOS: 0 Metric: %d\n",
5950 GET_METRIC(sl
->metric
));
5957 /* Show AS-external-LSA detail information. */
5958 static int show_as_external_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
5961 struct as_external_lsa
*al
=
5962 (struct as_external_lsa
*)lsa
->data
;
5964 show_ip_ospf_database_header(vty
, lsa
);
5966 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
5967 vty_out(vty
, " Metric Type: %s\n",
5968 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
5969 ? "2 (Larger than any link state path)"
5971 vty_out(vty
, " TOS: 0\n");
5972 vty_out(vty
, " Metric: %d\n",
5973 GET_METRIC(al
->e
[0].metric
));
5974 vty_out(vty
, " Forward Address: %s\n",
5975 inet_ntoa(al
->e
[0].fwd_addr
));
5978 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
5979 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
5986 show_as_external_lsa_stdvty (struct ospf_lsa
*lsa
)
5988 struct as_external_lsa
*al
= (struct as_external_lsa
*) lsa
->data
;
5990 /* show_ip_ospf_database_header (vty, lsa); */
5992 zlog_debug( " Network Mask: /%d%s",
5993 ip_masklen (al
->mask
), "\n");
5994 zlog_debug( " Metric Type: %s%s",
5995 IS_EXTERNAL_METRIC (al
->e
[0].tos
) ?
5996 "2 (Larger than any link state path)" : "1", "\n");
5997 zlog_debug( " TOS: 0%s", "\n");
5998 zlog_debug( " Metric: %d%s",
5999 GET_METRIC (al
->e
[0].metric
), "\n");
6000 zlog_debug( " Forward Address: %s%s",
6001 inet_ntoa (al
->e
[0].fwd_addr
), "\n");
6003 zlog_debug( " External Route Tag: %"ROUTE_TAG_PRI
"%s%s",
6004 (route_tag_t
)ntohl (al
->e
[0].route_tag
), "\n", "\n");
6009 /* Show AS-NSSA-LSA detail information. */
6010 static int show_as_nssa_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6013 struct as_external_lsa
*al
=
6014 (struct as_external_lsa
*)lsa
->data
;
6016 show_ip_ospf_database_header(vty
, lsa
);
6018 vty_out(vty
, " Network Mask: /%d\n", ip_masklen(al
->mask
));
6019 vty_out(vty
, " Metric Type: %s\n",
6020 IS_EXTERNAL_METRIC(al
->e
[0].tos
)
6021 ? "2 (Larger than any link state path)"
6023 vty_out(vty
, " TOS: 0\n");
6024 vty_out(vty
, " Metric: %d\n",
6025 GET_METRIC(al
->e
[0].metric
));
6026 vty_out(vty
, " NSSA: Forward Address: %s\n",
6027 inet_ntoa(al
->e
[0].fwd_addr
));
6030 " External Route Tag: %" ROUTE_TAG_PRI
"\n\n",
6031 (route_tag_t
)ntohl(al
->e
[0].route_tag
));
6037 static int show_func_dummy(struct vty
*vty
, struct ospf_lsa
*lsa
)
6042 static int show_opaque_lsa_detail(struct vty
*vty
, struct ospf_lsa
*lsa
)
6045 show_ip_ospf_database_header(vty
, lsa
);
6046 show_opaque_info_detail(vty
, lsa
);
6053 int (*const show_function
[])(struct vty
*, struct ospf_lsa
*) = {
6055 show_router_lsa_detail
,
6056 show_network_lsa_detail
,
6057 show_summary_lsa_detail
,
6058 show_summary_asbr_lsa_detail
,
6059 show_as_external_lsa_detail
,
6061 show_as_nssa_lsa_detail
, /* almost same as external */
6063 show_opaque_lsa_detail
,
6064 show_opaque_lsa_detail
,
6065 show_opaque_lsa_detail
,
6068 static void show_lsa_prefix_set(struct vty
*vty
, struct prefix_ls
*lp
,
6069 struct in_addr
*id
, struct in_addr
*adv_router
)
6071 memset(lp
, 0, sizeof(struct prefix_ls
));
6075 else if (adv_router
== NULL
) {
6081 lp
->adv_router
= *adv_router
;
6085 static void show_lsa_detail_proc(struct vty
*vty
, struct route_table
*rt
,
6086 struct in_addr
*id
, struct in_addr
*adv_router
)
6088 struct prefix_ls lp
;
6089 struct route_node
*rn
, *start
;
6090 struct ospf_lsa
*lsa
;
6092 show_lsa_prefix_set(vty
, &lp
, id
, adv_router
);
6093 start
= route_node_get(rt
, (struct prefix
*)&lp
);
6095 route_lock_node(start
);
6096 for (rn
= start
; rn
; rn
= route_next_until(rn
, start
))
6097 if ((lsa
= rn
->info
)) {
6098 if (show_function
[lsa
->data
->type
] != NULL
)
6099 show_function
[lsa
->data
->type
](vty
,
6102 route_unlock_node(start
);
6106 /* Show detail LSA information
6107 -- if id is NULL then show all LSAs. */
6108 static void show_lsa_detail(struct vty
*vty
, struct ospf
*ospf
, int type
,
6109 struct in_addr
*id
, struct in_addr
*adv_router
)
6111 struct listnode
*node
;
6112 struct ospf_area
*area
;
6115 case OSPF_AS_EXTERNAL_LSA
:
6116 case OSPF_OPAQUE_AS_LSA
:
6117 vty_out(vty
, " %s \n\n",
6118 show_database_desc
[type
]);
6119 show_lsa_detail_proc(vty
, AS_LSDB(ospf
, type
), id
, adv_router
);
6122 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6123 vty_out(vty
, "\n %s (Area %s)\n\n",
6124 show_database_desc
[type
],
6125 ospf_area_desc_string(area
));
6126 show_lsa_detail_proc(vty
, AREA_LSDB(area
, type
), id
,
6133 static void show_lsa_detail_adv_router_proc(struct vty
*vty
,
6134 struct route_table
*rt
,
6135 struct in_addr
*adv_router
)
6137 struct route_node
*rn
;
6138 struct ospf_lsa
*lsa
;
6140 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
))
6141 if ((lsa
= rn
->info
))
6142 if (IPV4_ADDR_SAME(adv_router
,
6143 &lsa
->data
->adv_router
)) {
6144 if (CHECK_FLAG(lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
6146 if (show_function
[lsa
->data
->type
] != NULL
)
6147 show_function
[lsa
->data
->type
](vty
,
6152 /* Show detail LSA information. */
6153 static void show_lsa_detail_adv_router(struct vty
*vty
, struct ospf
*ospf
,
6154 int type
, struct in_addr
*adv_router
)
6156 struct listnode
*node
;
6157 struct ospf_area
*area
;
6160 case OSPF_AS_EXTERNAL_LSA
:
6161 case OSPF_OPAQUE_AS_LSA
:
6162 vty_out(vty
, " %s \n\n",
6163 show_database_desc
[type
]);
6164 show_lsa_detail_adv_router_proc(vty
, AS_LSDB(ospf
, type
),
6168 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6169 vty_out(vty
, "\n %s (Area %s)\n\n",
6170 show_database_desc
[type
],
6171 ospf_area_desc_string(area
));
6172 show_lsa_detail_adv_router_proc(
6173 vty
, AREA_LSDB(area
, type
), adv_router
);
6179 static void show_ip_ospf_database_summary(struct vty
*vty
, struct ospf
*ospf
,
6182 struct ospf_lsa
*lsa
;
6183 struct route_node
*rn
;
6184 struct ospf_area
*area
;
6185 struct listnode
*node
;
6188 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
6189 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6191 case OSPF_AS_EXTERNAL_LSA
:
6192 case OSPF_OPAQUE_AS_LSA
:
6197 if (ospf_lsdb_count_self(area
->lsdb
, type
) > 0
6199 && ospf_lsdb_count(area
->lsdb
, type
) > 0)) {
6200 vty_out(vty
, " %s (Area %s)\n\n",
6201 show_database_desc
[type
],
6202 ospf_area_desc_string(area
));
6203 vty_out(vty
, "%s\n",
6204 show_database_header
[type
]);
6206 LSDB_LOOP (AREA_LSDB(area
, type
), rn
, lsa
)
6207 show_lsa_summary(vty
, lsa
, self
);
6214 for (type
= OSPF_MIN_LSA
; type
< OSPF_MAX_LSA
; type
++) {
6216 case OSPF_AS_EXTERNAL_LSA
:
6217 case OSPF_OPAQUE_AS_LSA
:
6222 if (ospf_lsdb_count_self(ospf
->lsdb
, type
)
6223 || (!self
&& ospf_lsdb_count(ospf
->lsdb
, type
))) {
6224 vty_out(vty
, " %s\n\n",
6225 show_database_desc
[type
]);
6226 vty_out(vty
, "%s\n", show_database_header
[type
]);
6228 LSDB_LOOP (AS_LSDB(ospf
, type
), rn
, lsa
)
6229 show_lsa_summary(vty
, lsa
, self
);
6238 static void show_ip_ospf_database_maxage(struct vty
*vty
, struct ospf
*ospf
)
6240 struct route_node
*rn
;
6242 vty_out(vty
, "\n MaxAge Link States:\n\n");
6244 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
6245 struct ospf_lsa
*lsa
;
6247 if ((lsa
= rn
->info
) != NULL
) {
6248 vty_out(vty
, "Link type: %d\n", lsa
->data
->type
);
6249 vty_out(vty
, "Link State ID: %s\n",
6250 inet_ntoa(lsa
->data
->id
));
6251 vty_out(vty
, "Advertising Router: %s\n",
6252 inet_ntoa(lsa
->data
->adv_router
));
6253 vty_out(vty
, "LSA lock count: %d\n", lsa
->lock
);
6259 #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
6260 #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
6262 #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
6263 #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
6264 #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
6265 #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
6267 #define OSPF_LSA_TYPES_DESC \
6268 "ASBR summary link states\n" \
6269 "External link states\n" \
6270 "Network link states\n" \
6271 "Router link states\n" \
6272 "Network summary link states\n" OSPF_LSA_TYPE_NSSA_DESC \
6273 OSPF_LSA_TYPE_OPAQUE_LINK_DESC OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
6274 OSPF_LSA_TYPE_OPAQUE_AS_DESC
6276 static int show_ip_ospf_database_common(struct vty
*vty
, struct ospf
*ospf
,
6277 int arg_base
, int argc
,
6278 struct cmd_token
**argv
,
6283 struct in_addr id
, adv_router
;
6286 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6288 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6290 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6291 inet_ntoa(ospf
->router_id
));
6294 if (argc
== arg_base
+ 4) {
6295 show_ip_ospf_database_summary(vty
, ospf
, 0);
6299 /* Set database type to show. */
6300 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6301 type
= OSPF_ROUTER_LSA
;
6302 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6303 type
= OSPF_NETWORK_LSA
;
6304 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6305 type
= OSPF_AS_NSSA_LSA
;
6306 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "su", 2) == 0)
6307 type
= OSPF_SUMMARY_LSA
;
6308 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6309 type
= OSPF_ASBR_SUMMARY_LSA
;
6310 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6311 type
= OSPF_AS_EXTERNAL_LSA
;
6312 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "se", 2) == 0) {
6313 show_ip_ospf_database_summary(vty
, ospf
, 1);
6315 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "m", 1) == 0) {
6316 show_ip_ospf_database_maxage(vty
, ospf
);
6318 } else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6319 type
= OSPF_OPAQUE_LINK_LSA
;
6320 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6321 type
= OSPF_OPAQUE_AREA_LSA
;
6322 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6323 type
= OSPF_OPAQUE_AS_LSA
;
6327 /* `show ip ospf database LSA'. */
6328 if (argc
== arg_base
+ 5)
6329 show_lsa_detail(vty
, ospf
, type
, NULL
, NULL
);
6330 else if (argc
>= arg_base
+ 6) {
6331 ret
= inet_aton(argv
[arg_base
+ 5]->arg
, &id
);
6335 /* `show ip ospf database LSA ID'. */
6336 if (argc
== arg_base
+ 6)
6337 show_lsa_detail(vty
, ospf
, type
, &id
, NULL
);
6338 /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
6339 else if (argc
== arg_base
+ 7) {
6340 if (strncmp(argv
[arg_base
+ 6]->text
, "s", 1) == 0)
6341 adv_router
= ospf
->router_id
;
6343 ret
= inet_aton(argv
[arg_base
+ 7]->arg
,
6348 show_lsa_detail(vty
, ospf
, type
, &id
, &adv_router
);
6355 DEFUN (show_ip_ospf_database_max
,
6356 show_ip_ospf_database_max_cmd
,
6357 "show ip ospf [vrf <NAME|all>] database <max-age|self-originate>",
6360 "OSPF information\n"
6363 "Database summary\n"
6364 "LSAs in MaxAge list\n"
6365 "Self-originated link states\n")
6367 struct ospf
*ospf
= NULL
;
6368 struct listnode
*node
= NULL
;
6369 char *vrf_name
= NULL
;
6370 bool all_vrf
= false;
6371 int ret
= CMD_SUCCESS
;
6374 uint8_t use_vrf
= 0;
6376 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6379 bool ospf_output
= false;
6384 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6385 if (!ospf
->oi_running
)
6388 ret
= show_ip_ospf_database_common(
6389 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6394 vty_out(vty
, "%% OSPF instance not found\n");
6396 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6397 if (ospf
== NULL
|| !ospf
->oi_running
) {
6398 vty_out(vty
, "%% OSPF instance not found\n");
6401 ret
= (show_ip_ospf_database_common(
6402 vty
, ospf
, idx_vrf
? 2 : 0, argc
, argv
,
6406 /* Display default ospf (instance 0) info */
6407 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6408 if (ospf
== NULL
|| !ospf
->oi_running
) {
6409 vty_out(vty
, "%% OSPF instance not found\n");
6413 ret
= show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6420 DEFUN (show_ip_ospf_instance_database
,
6421 show_ip_ospf_instance_database_cmd
,
6422 "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>]]]",
6425 "OSPF information\n"
6428 "Database summary\n"
6430 "Link State ID (as an IP address)\n"
6431 "Self-originated link states\n"
6432 "Advertising Router link states\n"
6433 "Advertising Router (as an IP address)\n")
6436 unsigned short instance
= 0;
6437 struct listnode
*node
= NULL
;
6438 char *vrf_name
= NULL
;
6439 bool all_vrf
= false;
6440 int ret
= CMD_SUCCESS
;
6443 uint8_t use_vrf
= 0;
6445 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6446 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6447 ospf
= ospf_lookup_instance(instance
);
6449 return CMD_NOT_MY_INSTANCE
;
6450 if (!ospf
->oi_running
)
6453 return (show_ip_ospf_database_common(vty
, ospf
, idx
? 1 : 0,
6454 argc
, argv
, use_vrf
));
6455 } else if (argv_find(argv
, argc
, "vrf", &idx
)) {
6456 vrf_name
= argv
[++idx
]->arg
;
6457 all_vrf
= strmatch(vrf_name
, "all");
6463 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6464 if (!ospf
->oi_running
)
6466 ret
= (show_ip_ospf_database_common(
6467 vty
, ospf
, idx
? 2 : 0, argc
, argv
,
6471 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6472 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6473 vty_out(vty
, "%% OSPF instance not found\n");
6477 ret
= (show_ip_ospf_database_common(
6478 vty
, ospf
, idx
? 2 : 0, argc
, argv
, use_vrf
));
6481 /* Display default ospf (instance 0) info */
6482 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
6483 if (ospf
== NULL
|| !ospf
->oi_running
) {
6484 vty_out(vty
, "%% OSPF instance not found\n");
6488 ret
= (show_ip_ospf_database_common(vty
, ospf
, 0, argc
, argv
,
6495 DEFUN (show_ip_ospf_instance_database_max
,
6496 show_ip_ospf_instance_database_max_cmd
,
6497 "show ip ospf (1-65535) database <max-age|self-originate>",
6500 "OSPF information\n"
6502 "Database summary\n"
6503 "LSAs in MaxAge list\n"
6504 "Self-originated link states\n")
6508 unsigned short instance
= 0;
6510 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6512 ospf
= ospf_lookup_instance(instance
);
6514 return CMD_NOT_MY_INSTANCE
;
6516 if (!ospf
->oi_running
) {
6517 vty_out(vty
, "%% OSPF instance not found\n");
6521 return show_ip_ospf_database_common(vty
, ospf
, 1, argc
, argv
, 0);
6525 static int show_ip_ospf_database_type_adv_router_common(struct vty
*vty
,
6527 int arg_base
, int argc
,
6528 struct cmd_token
**argv
,
6533 struct in_addr adv_router
;
6536 vty_out(vty
, "\nOSPF Instance: %d\n", ospf
->instance
);
6538 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
6540 vty_out(vty
, "\n OSPF Router with ID (%s)\n\n",
6541 inet_ntoa(ospf
->router_id
));
6543 /* Set database type to show. */
6544 if (strncmp(argv
[arg_base
+ idx_type
]->text
, "r", 1) == 0)
6545 type
= OSPF_ROUTER_LSA
;
6546 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ne", 2) == 0)
6547 type
= OSPF_NETWORK_LSA
;
6548 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "ns", 2) == 0)
6549 type
= OSPF_AS_NSSA_LSA
;
6550 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "s", 1) == 0)
6551 type
= OSPF_SUMMARY_LSA
;
6552 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "a", 1) == 0)
6553 type
= OSPF_ASBR_SUMMARY_LSA
;
6554 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "e", 1) == 0)
6555 type
= OSPF_AS_EXTERNAL_LSA
;
6556 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-l", 8) == 0)
6557 type
= OSPF_OPAQUE_LINK_LSA
;
6558 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-ar", 9) == 0)
6559 type
= OSPF_OPAQUE_AREA_LSA
;
6560 else if (strncmp(argv
[arg_base
+ idx_type
]->text
, "opaque-as", 9) == 0)
6561 type
= OSPF_OPAQUE_AS_LSA
;
6565 /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
6566 if (strncmp(argv
[arg_base
+ 5]->text
, "s", 1) == 0)
6567 adv_router
= ospf
->router_id
;
6569 ret
= inet_aton(argv
[arg_base
+ 6]->arg
, &adv_router
);
6574 show_lsa_detail_adv_router(vty
, ospf
, type
, &adv_router
);
6579 DEFUN (show_ip_ospf_instance_database_type_adv_router
,
6580 show_ip_ospf_instance_database_type_adv_router_cmd
,
6581 "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>",
6584 "OSPF information\n"
6587 "Database summary\n"
6589 "Advertising Router link states\n"
6590 "Advertising Router (as an IP address)\n"
6591 "Self-originated link states\n")
6593 struct ospf
*ospf
= NULL
;
6594 unsigned short instance
= 0;
6595 struct listnode
*node
= NULL
;
6596 char *vrf_name
= NULL
;
6597 bool all_vrf
= false;
6598 int ret
= CMD_SUCCESS
;
6600 int idx
= 0, idx_vrf
= 0;
6601 uint8_t use_vrf
= 0;
6603 if (argv_find(argv
, argc
, "(1-65535)", &idx
)) {
6604 instance
= strtoul(argv
[idx
]->arg
, NULL
, 10);
6605 ospf
= ospf_lookup_instance(instance
);
6607 return CMD_NOT_MY_INSTANCE
;
6608 if (!ospf
->oi_running
) {
6609 vty_out(vty
, "%% OSPF instance not found\n");
6613 return (show_ip_ospf_database_type_adv_router_common(
6614 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
));
6617 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
6620 bool ospf_output
= false;
6625 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
6626 if (!ospf
->oi_running
)
6629 ret
= show_ip_ospf_database_type_adv_router_common(
6630 vty
, ospf
, idx
? 1 : 0, argc
, argv
,
6634 vty_out(vty
, "%% OSPF instance not found\n");
6636 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
6637 if ((ospf
== NULL
) || !ospf
->oi_running
) {
6638 vty_out(vty
, "%% OSPF instance not found\n");
6642 ret
= show_ip_ospf_database_type_adv_router_common(
6643 vty
, ospf
, idx
? 1 : 0, argc
, argv
, use_vrf
);
6646 /* Display default ospf (instance 0) info */
6647 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
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 /*return (show_ip_ospf_database_type_adv_router_common(
6658 vty, ospf, idx ? 1 : 0, argc, argv));*/
6661 DEFUN (ip_ospf_authentication_args
,
6662 ip_ospf_authentication_args_addr_cmd
,
6663 "ip ospf authentication <null|message-digest> [A.B.C.D]",
6665 "OSPF interface commands\n"
6666 "Enable authentication on this interface\n"
6667 "Use null authentication\n"
6668 "Use message-digest authentication\n"
6669 "Address of interface\n")
6671 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6672 int idx_encryption
= 3;
6674 struct in_addr addr
;
6676 struct ospf_if_params
*params
;
6678 params
= IF_DEF_PARAMS(ifp
);
6681 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6684 "Please specify interface address by A.B.C.D\n");
6685 return CMD_WARNING_CONFIG_FAILED
;
6688 params
= ospf_get_if_params(ifp
, addr
);
6689 ospf_if_update_params(ifp
, addr
);
6692 /* Handle null authentication */
6693 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6694 SET_IF_PARAM(params
, auth_type
);
6695 params
->auth_type
= OSPF_AUTH_NULL
;
6699 /* Handle message-digest authentication */
6700 if (argv
[idx_encryption
]->arg
[0] == 'm') {
6701 SET_IF_PARAM(params
, auth_type
);
6702 params
->auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6706 vty_out(vty
, "You shouldn't get here!\n");
6707 return CMD_WARNING_CONFIG_FAILED
;
6710 DEFUN (ip_ospf_authentication
,
6711 ip_ospf_authentication_addr_cmd
,
6712 "ip ospf authentication [A.B.C.D]",
6714 "OSPF interface commands\n"
6715 "Enable authentication on this interface\n"
6716 "Address of interface\n")
6718 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6720 struct in_addr addr
;
6722 struct ospf_if_params
*params
;
6724 params
= IF_DEF_PARAMS(ifp
);
6727 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6730 "Please specify interface address by A.B.C.D\n");
6731 return CMD_WARNING_CONFIG_FAILED
;
6734 params
= ospf_get_if_params(ifp
, addr
);
6735 ospf_if_update_params(ifp
, addr
);
6738 SET_IF_PARAM(params
, auth_type
);
6739 params
->auth_type
= OSPF_AUTH_SIMPLE
;
6744 DEFUN (no_ip_ospf_authentication_args
,
6745 no_ip_ospf_authentication_args_addr_cmd
,
6746 "no ip ospf authentication <null|message-digest> [A.B.C.D]",
6749 "OSPF interface commands\n"
6750 "Enable authentication on this interface\n"
6751 "Use null authentication\n"
6752 "Use message-digest authentication\n"
6753 "Address of interface\n")
6755 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6756 int idx_encryption
= 4;
6758 struct in_addr addr
;
6760 struct ospf_if_params
*params
;
6761 struct route_node
*rn
;
6764 params
= IF_DEF_PARAMS(ifp
);
6767 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6770 "Please specify interface address by A.B.C.D\n");
6771 return CMD_WARNING_CONFIG_FAILED
;
6774 params
= ospf_lookup_if_params(ifp
, addr
);
6775 if (params
== NULL
) {
6776 vty_out(vty
, "Ip Address specified is unknown\n");
6777 return CMD_WARNING_CONFIG_FAILED
;
6779 params
->auth_type
= OSPF_AUTH_NOTSET
;
6780 UNSET_IF_PARAM(params
, auth_type
);
6781 if (params
!= IF_DEF_PARAMS(ifp
)) {
6782 ospf_free_if_params(ifp
, addr
);
6783 ospf_if_update_params(ifp
, addr
);
6786 if (argv
[idx_encryption
]->arg
[0] == 'n') {
6787 auth_type
= OSPF_AUTH_NULL
;
6788 } else if (argv
[idx_encryption
]->arg
[0] == 'm') {
6789 auth_type
= OSPF_AUTH_CRYPTOGRAPHIC
;
6791 vty_out(vty
, "Unexpected input encountered\n");
6792 return CMD_WARNING_CONFIG_FAILED
;
6795 * Here we have a case where the user has entered
6796 * 'no ip ospf authentication (null | message_digest )'
6797 * we need to find if we have any ip addresses underneath it
6799 * correspond to the associated type.
6801 if (params
->auth_type
== auth_type
) {
6802 params
->auth_type
= OSPF_AUTH_NOTSET
;
6803 UNSET_IF_PARAM(params
, auth_type
);
6806 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6807 rn
= route_next(rn
)) {
6808 if ((params
= rn
->info
)) {
6809 if (params
->auth_type
== auth_type
) {
6810 params
->auth_type
= OSPF_AUTH_NOTSET
;
6811 UNSET_IF_PARAM(params
, auth_type
);
6812 if (params
!= IF_DEF_PARAMS(ifp
)) {
6813 ospf_free_if_params(
6814 ifp
, rn
->p
.u
.prefix4
);
6815 ospf_if_update_params(
6816 ifp
, rn
->p
.u
.prefix4
);
6826 DEFUN (no_ip_ospf_authentication
,
6827 no_ip_ospf_authentication_addr_cmd
,
6828 "no ip ospf authentication [A.B.C.D]",
6831 "OSPF interface commands\n"
6832 "Enable authentication on this interface\n"
6833 "Address of interface\n")
6835 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6837 struct in_addr addr
;
6839 struct ospf_if_params
*params
;
6840 struct route_node
*rn
;
6842 params
= IF_DEF_PARAMS(ifp
);
6845 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
6848 "Please specify interface address by A.B.C.D\n");
6849 return CMD_WARNING_CONFIG_FAILED
;
6852 params
= ospf_lookup_if_params(ifp
, addr
);
6853 if (params
== NULL
) {
6854 vty_out(vty
, "Ip Address specified is unknown\n");
6855 return CMD_WARNING_CONFIG_FAILED
;
6858 params
->auth_type
= OSPF_AUTH_NOTSET
;
6859 UNSET_IF_PARAM(params
, auth_type
);
6860 if (params
!= IF_DEF_PARAMS(ifp
)) {
6861 ospf_free_if_params(ifp
, addr
);
6862 ospf_if_update_params(ifp
, addr
);
6866 * When a user enters 'no ip ospf authentication'
6867 * We should remove all authentication types from
6870 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6871 || (params
->auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
)
6872 || (params
->auth_type
== OSPF_AUTH_SIMPLE
)) {
6873 params
->auth_type
= OSPF_AUTH_NOTSET
;
6874 UNSET_IF_PARAM(params
, auth_type
);
6877 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
;
6878 rn
= route_next(rn
)) {
6879 if ((params
= rn
->info
)) {
6881 if ((params
->auth_type
== OSPF_AUTH_NULL
)
6882 || (params
->auth_type
6883 == OSPF_AUTH_CRYPTOGRAPHIC
)
6884 || (params
->auth_type
6885 == OSPF_AUTH_SIMPLE
)) {
6886 params
->auth_type
= OSPF_AUTH_NOTSET
;
6887 UNSET_IF_PARAM(params
, auth_type
);
6888 if (params
!= IF_DEF_PARAMS(ifp
)) {
6889 ospf_free_if_params(
6890 ifp
, rn
->p
.u
.prefix4
);
6891 ospf_if_update_params(
6892 ifp
, rn
->p
.u
.prefix4
);
6903 DEFUN (ip_ospf_authentication_key
,
6904 ip_ospf_authentication_key_addr_cmd
,
6905 "ip ospf authentication-key AUTH_KEY [A.B.C.D]",
6907 "OSPF interface commands\n"
6908 "Authentication password (key)\n"
6909 "The OSPF password (key)\n"
6910 "Address of interface\n")
6912 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6914 struct in_addr addr
;
6915 struct ospf_if_params
*params
;
6917 params
= IF_DEF_PARAMS(ifp
);
6919 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6920 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6922 "Please specify interface address by A.B.C.D\n");
6923 return CMD_WARNING_CONFIG_FAILED
;
6926 params
= ospf_get_if_params(ifp
, addr
);
6927 ospf_if_update_params(ifp
, addr
);
6930 strlcpy((char *)params
->auth_simple
, argv
[3]->arg
,
6931 sizeof(params
->auth_simple
));
6932 SET_IF_PARAM(params
, auth_simple
);
6937 DEFUN_HIDDEN (ospf_authentication_key
,
6938 ospf_authentication_key_cmd
,
6939 "ospf authentication-key AUTH_KEY [A.B.C.D]",
6940 "OSPF interface commands\n"
6941 VLINK_HELPSTR_AUTH_SIMPLE
6942 "Address of interface\n")
6944 return ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6947 DEFUN (no_ip_ospf_authentication_key
,
6948 no_ip_ospf_authentication_key_authkey_addr_cmd
,
6949 "no ip ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6952 "OSPF interface commands\n"
6953 VLINK_HELPSTR_AUTH_SIMPLE
6954 "Address of interface\n")
6956 VTY_DECLVAR_CONTEXT(interface
, ifp
);
6958 struct in_addr addr
;
6959 struct ospf_if_params
*params
;
6960 params
= IF_DEF_PARAMS(ifp
);
6962 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
6963 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
6965 "Please specify interface address by A.B.C.D\n");
6966 return CMD_WARNING_CONFIG_FAILED
;
6969 params
= ospf_lookup_if_params(ifp
, addr
);
6974 memset(params
->auth_simple
, 0, OSPF_AUTH_SIMPLE_SIZE
);
6975 UNSET_IF_PARAM(params
, auth_simple
);
6977 if (params
!= IF_DEF_PARAMS(ifp
)) {
6978 ospf_free_if_params(ifp
, addr
);
6979 ospf_if_update_params(ifp
, addr
);
6985 DEFUN_HIDDEN (no_ospf_authentication_key
,
6986 no_ospf_authentication_key_authkey_addr_cmd
,
6987 "no ospf authentication-key [AUTH_KEY [A.B.C.D]]",
6989 "OSPF interface commands\n"
6990 VLINK_HELPSTR_AUTH_SIMPLE
6991 "Address of interface\n")
6993 return no_ip_ospf_authentication_key(self
, vty
, argc
, argv
);
6996 DEFUN (ip_ospf_message_digest_key
,
6997 ip_ospf_message_digest_key_cmd
,
6998 "ip ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7000 "OSPF interface commands\n"
7001 "Message digest authentication password (key)\n"
7003 "Use MD5 algorithm\n"
7004 "The OSPF password (key)\n"
7005 "Address of interface\n")
7007 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7008 struct crypt_key
*ck
;
7010 struct in_addr addr
;
7011 struct ospf_if_params
*params
;
7013 params
= IF_DEF_PARAMS(ifp
);
7016 argv_find(argv
, argc
, "(1-255)", &idx
);
7017 char *keyid
= argv
[idx
]->arg
;
7018 argv_find(argv
, argc
, "KEY", &idx
);
7019 char *cryptkey
= argv
[idx
]->arg
;
7021 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7022 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7024 "Please specify interface address by A.B.C.D\n");
7025 return CMD_WARNING_CONFIG_FAILED
;
7028 params
= ospf_get_if_params(ifp
, addr
);
7029 ospf_if_update_params(ifp
, addr
);
7032 key_id
= strtol(keyid
, NULL
, 10);
7033 if (ospf_crypt_key_lookup(params
->auth_crypt
, key_id
) != NULL
) {
7034 vty_out(vty
, "OSPF: Key %d already exists\n", key_id
);
7038 ck
= ospf_crypt_key_new();
7039 ck
->key_id
= (uint8_t)key_id
;
7040 strlcpy((char *)ck
->auth_key
, cryptkey
, sizeof(ck
->auth_key
));
7042 ospf_crypt_key_add(params
->auth_crypt
, ck
);
7043 SET_IF_PARAM(params
, auth_crypt
);
7048 DEFUN_HIDDEN (ospf_message_digest_key
,
7049 ospf_message_digest_key_cmd
,
7050 "ospf message-digest-key (1-255) md5 KEY [A.B.C.D]",
7051 "OSPF interface commands\n"
7052 "Message digest authentication password (key)\n"
7054 "Use MD5 algorithm\n"
7055 "The OSPF password (key)\n"
7056 "Address of interface\n")
7058 return ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7061 DEFUN (no_ip_ospf_message_digest_key
,
7062 no_ip_ospf_message_digest_key_cmd
,
7063 "no ip ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7066 "OSPF interface commands\n"
7067 "Message digest authentication password (key)\n"
7069 "Use MD5 algorithm\n"
7070 "The OSPF password (key)\n"
7071 "Address of interface\n")
7073 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7075 struct crypt_key
*ck
;
7077 struct in_addr addr
;
7078 struct ospf_if_params
*params
;
7079 params
= IF_DEF_PARAMS(ifp
);
7081 argv_find(argv
, argc
, "(1-255)", &idx
);
7082 char *keyid
= argv
[idx
]->arg
;
7084 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7085 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7087 "Please specify interface address by A.B.C.D\n");
7088 return CMD_WARNING_CONFIG_FAILED
;
7091 params
= ospf_lookup_if_params(ifp
, addr
);
7096 key_id
= strtol(keyid
, NULL
, 10);
7097 ck
= ospf_crypt_key_lookup(params
->auth_crypt
, key_id
);
7099 vty_out(vty
, "OSPF: Key %d does not exist\n", key_id
);
7100 return CMD_WARNING_CONFIG_FAILED
;
7103 ospf_crypt_key_delete(params
->auth_crypt
, key_id
);
7105 if (params
!= IF_DEF_PARAMS(ifp
)) {
7106 ospf_free_if_params(ifp
, addr
);
7107 ospf_if_update_params(ifp
, addr
);
7113 DEFUN_HIDDEN (no_ospf_message_digest_key
,
7114 no_ospf_message_digest_key_cmd
,
7115 "no ospf message-digest-key (1-255) [md5 KEY] [A.B.C.D]",
7117 "OSPF interface commands\n"
7118 "Message digest authentication password (key)\n"
7120 "Use MD5 algorithm\n"
7121 "The OSPF password (key)\n"
7122 "Address of interface\n")
7124 return no_ip_ospf_message_digest_key(self
, vty
, argc
, argv
);
7127 DEFUN (ip_ospf_cost
,
7129 "ip ospf cost (1-65535) [A.B.C.D]",
7131 "OSPF interface commands\n"
7134 "Address of interface\n")
7136 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7138 uint32_t cost
= OSPF_OUTPUT_COST_DEFAULT
;
7139 struct in_addr addr
;
7140 struct ospf_if_params
*params
;
7141 params
= IF_DEF_PARAMS(ifp
);
7144 char *coststr
= NULL
, *ifaddr
= NULL
;
7146 argv_find(argv
, argc
, "(1-65535)", &idx
);
7147 coststr
= argv
[idx
]->arg
;
7148 cost
= strtol(coststr
, NULL
, 10);
7150 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7152 if (!inet_aton(ifaddr
, &addr
)) {
7154 "Please specify interface address by A.B.C.D\n");
7155 return CMD_WARNING_CONFIG_FAILED
;
7158 params
= ospf_get_if_params(ifp
, addr
);
7159 ospf_if_update_params(ifp
, addr
);
7162 SET_IF_PARAM(params
, output_cost_cmd
);
7163 params
->output_cost_cmd
= cost
;
7165 ospf_if_recalculate_output_cost(ifp
);
7170 DEFUN_HIDDEN (ospf_cost
,
7172 "ospf cost (1-65535) [A.B.C.D]",
7173 "OSPF interface commands\n"
7176 "Address of interface\n")
7178 return ip_ospf_cost(self
, vty
, argc
, argv
);
7181 DEFUN (no_ip_ospf_cost
,
7182 no_ip_ospf_cost_cmd
,
7183 "no ip ospf cost [(1-65535)] [A.B.C.D]",
7186 "OSPF interface commands\n"
7189 "Address of interface\n")
7191 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7193 struct in_addr addr
;
7194 struct ospf_if_params
*params
;
7196 params
= IF_DEF_PARAMS(ifp
);
7199 char *ifaddr
= NULL
;
7200 ifaddr
= argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7202 /* According to the semantics we are mimicking "no ip ospf cost N" is
7203 * always treated as "no ip ospf cost" regardless of the actual value
7204 * of N already configured for the interface. Thus ignore cost. */
7207 if (!inet_aton(ifaddr
, &addr
)) {
7209 "Please specify interface address by A.B.C.D\n");
7210 return CMD_WARNING_CONFIG_FAILED
;
7213 params
= ospf_lookup_if_params(ifp
, addr
);
7218 UNSET_IF_PARAM(params
, output_cost_cmd
);
7220 if (params
!= IF_DEF_PARAMS(ifp
)) {
7221 ospf_free_if_params(ifp
, addr
);
7222 ospf_if_update_params(ifp
, addr
);
7225 ospf_if_recalculate_output_cost(ifp
);
7230 DEFUN_HIDDEN (no_ospf_cost
,
7232 "no ospf cost [(1-65535)] [A.B.C.D]",
7234 "OSPF interface commands\n"
7237 "Address of interface\n")
7239 return no_ip_ospf_cost(self
, vty
, argc
, argv
);
7242 static void ospf_nbr_timer_update(struct ospf_interface
*oi
)
7244 struct route_node
*rn
;
7245 struct ospf_neighbor
*nbr
;
7247 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
7248 if ((nbr
= rn
->info
)) {
7249 nbr
->v_inactivity
= OSPF_IF_PARAM(oi
, v_wait
);
7250 nbr
->v_db_desc
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7251 nbr
->v_ls_req
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7252 nbr
->v_ls_upd
= OSPF_IF_PARAM(oi
, retransmit_interval
);
7256 static int ospf_vty_dead_interval_set(struct vty
*vty
, const char *interval_str
,
7257 const char *nbr_str
,
7258 const char *fast_hello_str
)
7260 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7263 struct in_addr addr
;
7265 struct ospf_if_params
*params
;
7266 struct ospf_interface
*oi
;
7267 struct route_node
*rn
;
7269 params
= IF_DEF_PARAMS(ifp
);
7272 ret
= inet_aton(nbr_str
, &addr
);
7275 "Please specify interface address by A.B.C.D\n");
7276 return CMD_WARNING_CONFIG_FAILED
;
7279 params
= ospf_get_if_params(ifp
, addr
);
7280 ospf_if_update_params(ifp
, addr
);
7284 seconds
= strtoul(interval_str
, NULL
, 10);
7286 /* reset fast_hello too, just to be sure */
7287 UNSET_IF_PARAM(params
, fast_hello
);
7288 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7289 } else if (fast_hello_str
) {
7290 hellomult
= strtoul(fast_hello_str
, NULL
, 10);
7291 /* 1s dead-interval with sub-second hellos desired */
7292 seconds
= OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
;
7293 SET_IF_PARAM(params
, fast_hello
);
7294 params
->fast_hello
= hellomult
;
7297 "Please specify dead-interval or hello-multiplier\n");
7298 return CMD_WARNING_CONFIG_FAILED
;
7301 SET_IF_PARAM(params
, v_wait
);
7302 params
->v_wait
= seconds
;
7304 /* Update timer values in neighbor structure. */
7306 struct ospf
*ospf
= NULL
;
7308 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7310 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7312 ospf_nbr_timer_update(oi
);
7315 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7316 if ((oi
= rn
->info
))
7317 ospf_nbr_timer_update(oi
);
7323 DEFUN (ip_ospf_dead_interval
,
7324 ip_ospf_dead_interval_cmd
,
7325 "ip ospf dead-interval (1-65535) [A.B.C.D]",
7327 "OSPF interface commands\n"
7328 "Interval time after which a neighbor is declared down\n"
7330 "Address of interface\n")
7333 char *interval
= argv_find(argv
, argc
, "(1-65535)", &idx
)
7337 argv_find(argv
, argc
, "A.B.C.D", &idx
) ? argv
[idx
]->arg
: NULL
;
7338 return ospf_vty_dead_interval_set(vty
, interval
, ifaddr
, NULL
);
7342 DEFUN_HIDDEN (ospf_dead_interval
,
7343 ospf_dead_interval_cmd
,
7344 "ospf dead-interval (1-65535) [A.B.C.D]",
7345 "OSPF interface commands\n"
7346 "Interval time after which a neighbor is declared down\n"
7348 "Address of interface\n")
7350 return ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7353 DEFUN (ip_ospf_dead_interval_minimal
,
7354 ip_ospf_dead_interval_minimal_addr_cmd
,
7355 "ip ospf dead-interval minimal hello-multiplier (1-10) [A.B.C.D]",
7357 "OSPF interface commands\n"
7358 "Interval time after which a neighbor is declared down\n"
7359 "Minimal 1s dead-interval with fast sub-second hellos\n"
7360 "Hello multiplier factor\n"
7361 "Number of Hellos to send each second\n"
7362 "Address of interface\n")
7367 return ospf_vty_dead_interval_set(
7368 vty
, NULL
, argv
[idx_ipv4
]->arg
, argv
[idx_number
]->arg
);
7370 return ospf_vty_dead_interval_set(vty
, NULL
, NULL
,
7371 argv
[idx_number
]->arg
);
7374 DEFUN (no_ip_ospf_dead_interval
,
7375 no_ip_ospf_dead_interval_cmd
,
7376 "no ip ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7379 "OSPF interface commands\n"
7380 "Interval time after which a neighbor is declared down\n"
7382 "Minimal 1s dead-interval with fast sub-second hellos\n"
7383 "Hello multiplier factor\n"
7384 "Number of Hellos to send each second\n"
7385 "Address of interface\n")
7387 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7388 int idx_ipv4
= argc
- 1;
7389 struct in_addr addr
= {.s_addr
= 0L};
7391 struct ospf_if_params
*params
;
7392 struct ospf_interface
*oi
;
7393 struct route_node
*rn
;
7395 params
= IF_DEF_PARAMS(ifp
);
7397 if (argv
[idx_ipv4
]->type
== IPV4_TKN
) {
7398 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
7401 "Please specify interface address by A.B.C.D\n");
7402 return CMD_WARNING_CONFIG_FAILED
;
7405 params
= ospf_lookup_if_params(ifp
, addr
);
7410 UNSET_IF_PARAM(params
, v_wait
);
7411 params
->v_wait
= OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
;
7413 UNSET_IF_PARAM(params
, fast_hello
);
7414 params
->fast_hello
= OSPF_FAST_HELLO_DEFAULT
;
7416 if (params
!= IF_DEF_PARAMS(ifp
)) {
7417 ospf_free_if_params(ifp
, addr
);
7418 ospf_if_update_params(ifp
, addr
);
7421 /* Update timer values in neighbor structure. */
7423 struct ospf
*ospf
= NULL
;
7425 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
7427 oi
= ospf_if_lookup_by_local_addr(ospf
, ifp
, addr
);
7429 ospf_nbr_timer_update(oi
);
7432 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
))
7433 if ((oi
= rn
->info
))
7434 ospf_nbr_timer_update(oi
);
7440 DEFUN_HIDDEN (no_ospf_dead_interval
,
7441 no_ospf_dead_interval_cmd
,
7442 "no ospf dead-interval [<(1-65535)|minimal hello-multiplier (1-10)> [A.B.C.D]]",
7444 "OSPF interface commands\n"
7445 "Interval time after which a neighbor is declared down\n"
7447 "Minimal 1s dead-interval with fast sub-second hellos\n"
7448 "Hello multiplier factor\n"
7449 "Number of Hellos to send each second\n"
7450 "Address of interface\n")
7452 return no_ip_ospf_dead_interval(self
, vty
, argc
, argv
);
7455 DEFUN (ip_ospf_hello_interval
,
7456 ip_ospf_hello_interval_cmd
,
7457 "ip ospf hello-interval (1-65535) [A.B.C.D]",
7459 "OSPF interface commands\n"
7460 "Time between HELLO packets\n"
7462 "Address of interface\n")
7464 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7466 struct in_addr addr
;
7467 struct ospf_if_params
*params
;
7468 params
= IF_DEF_PARAMS(ifp
);
7469 uint32_t seconds
= 0;
7471 argv_find(argv
, argc
, "(1-65535)", &idx
);
7472 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7474 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7475 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7477 "Please specify interface address by A.B.C.D\n");
7478 return CMD_WARNING_CONFIG_FAILED
;
7481 params
= ospf_get_if_params(ifp
, addr
);
7482 ospf_if_update_params(ifp
, addr
);
7485 SET_IF_PARAM(params
, v_hello
);
7486 params
->v_hello
= seconds
;
7491 DEFUN_HIDDEN (ospf_hello_interval
,
7492 ospf_hello_interval_cmd
,
7493 "ospf hello-interval (1-65535) [A.B.C.D]",
7494 "OSPF interface commands\n"
7495 "Time between HELLO packets\n"
7497 "Address of interface\n")
7499 return ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7502 DEFUN (no_ip_ospf_hello_interval
,
7503 no_ip_ospf_hello_interval_cmd
,
7504 "no ip ospf hello-interval [(1-65535) [A.B.C.D]]",
7507 "OSPF interface commands\n"
7508 "Time between HELLO packets\n" // ignored
7510 "Address of interface\n")
7512 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7514 struct in_addr addr
;
7515 struct ospf_if_params
*params
;
7517 params
= IF_DEF_PARAMS(ifp
);
7519 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7520 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7522 "Please specify interface address by A.B.C.D\n");
7523 return CMD_WARNING_CONFIG_FAILED
;
7526 params
= ospf_lookup_if_params(ifp
, addr
);
7531 UNSET_IF_PARAM(params
, v_hello
);
7532 params
->v_hello
= OSPF_HELLO_INTERVAL_DEFAULT
;
7534 if (params
!= IF_DEF_PARAMS(ifp
)) {
7535 ospf_free_if_params(ifp
, addr
);
7536 ospf_if_update_params(ifp
, addr
);
7542 DEFUN_HIDDEN (no_ospf_hello_interval
,
7543 no_ospf_hello_interval_cmd
,
7544 "no ospf hello-interval [(1-65535) [A.B.C.D]]",
7546 "OSPF interface commands\n"
7547 "Time between HELLO packets\n" // ignored
7549 "Address of interface\n")
7551 return no_ip_ospf_hello_interval(self
, vty
, argc
, argv
);
7554 DEFUN (ip_ospf_network
,
7555 ip_ospf_network_cmd
,
7556 "ip ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7558 "OSPF interface commands\n"
7560 "Specify OSPF broadcast multi-access network\n"
7561 "Specify OSPF NBMA network\n"
7562 "Specify OSPF point-to-multipoint network\n"
7563 "Specify OSPF point-to-point network\n")
7565 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7567 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7568 struct route_node
*rn
;
7570 if (old_type
== OSPF_IFTYPE_LOOPBACK
) {
7572 "This is a loopback interface. Can't set network type.\n");
7573 return CMD_WARNING_CONFIG_FAILED
;
7576 if (argv_find(argv
, argc
, "broadcast", &idx
))
7577 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_BROADCAST
;
7578 else if (argv_find(argv
, argc
, "non-broadcast", &idx
))
7579 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_NBMA
;
7580 else if (argv_find(argv
, argc
, "point-to-multipoint", &idx
))
7581 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOMULTIPOINT
;
7582 else if (argv_find(argv
, argc
, "point-to-point", &idx
))
7583 IF_DEF_PARAMS(ifp
)->type
= OSPF_IFTYPE_POINTOPOINT
;
7585 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7588 SET_IF_PARAM(IF_DEF_PARAMS(ifp
), type
);
7590 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7591 struct ospf_interface
*oi
= rn
->info
;
7596 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7598 if (oi
->state
> ISM_Down
) {
7599 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7600 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7607 DEFUN_HIDDEN (ospf_network
,
7609 "ospf network <broadcast|non-broadcast|point-to-multipoint|point-to-point>",
7610 "OSPF interface commands\n"
7612 "Specify OSPF broadcast multi-access network\n"
7613 "Specify OSPF NBMA network\n"
7614 "Specify OSPF point-to-multipoint network\n"
7615 "Specify OSPF point-to-point network\n")
7617 return ip_ospf_network(self
, vty
, argc
, argv
);
7620 DEFUN (no_ip_ospf_network
,
7621 no_ip_ospf_network_cmd
,
7622 "no ip ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7625 "OSPF interface commands\n"
7627 "Specify OSPF broadcast multi-access network\n"
7628 "Specify OSPF NBMA network\n"
7629 "Specify OSPF point-to-multipoint network\n"
7630 "Specify OSPF point-to-point network\n")
7632 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7633 int old_type
= IF_DEF_PARAMS(ifp
)->type
;
7634 struct route_node
*rn
;
7636 IF_DEF_PARAMS(ifp
)->type
= ospf_default_iftype(ifp
);
7638 if (IF_DEF_PARAMS(ifp
)->type
== old_type
)
7641 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7642 struct ospf_interface
*oi
= rn
->info
;
7647 oi
->type
= IF_DEF_PARAMS(ifp
)->type
;
7649 if (oi
->state
> ISM_Down
) {
7650 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceDown
);
7651 OSPF_ISM_EVENT_EXECUTE(oi
, ISM_InterfaceUp
);
7658 DEFUN_HIDDEN (no_ospf_network
,
7659 no_ospf_network_cmd
,
7660 "no ospf network [<broadcast|non-broadcast|point-to-multipoint|point-to-point>]",
7662 "OSPF interface commands\n"
7664 "Specify OSPF broadcast multi-access network\n"
7665 "Specify OSPF NBMA network\n"
7666 "Specify OSPF point-to-multipoint network\n"
7667 "Specify OSPF point-to-point network\n")
7669 return no_ip_ospf_network(self
, vty
, argc
, argv
);
7672 DEFUN (ip_ospf_priority
,
7673 ip_ospf_priority_cmd
,
7674 "ip ospf priority (0-255) [A.B.C.D]",
7676 "OSPF interface commands\n"
7679 "Address of interface\n")
7681 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7684 struct route_node
*rn
;
7685 struct in_addr addr
;
7686 struct ospf_if_params
*params
;
7687 params
= IF_DEF_PARAMS(ifp
);
7689 argv_find(argv
, argc
, "(0-255)", &idx
);
7690 priority
= strtol(argv
[idx
]->arg
, NULL
, 10);
7692 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7693 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7695 "Please specify interface address by A.B.C.D\n");
7696 return CMD_WARNING_CONFIG_FAILED
;
7699 params
= ospf_get_if_params(ifp
, addr
);
7700 ospf_if_update_params(ifp
, addr
);
7703 SET_IF_PARAM(params
, priority
);
7704 params
->priority
= priority
;
7706 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7707 struct ospf_interface
*oi
= rn
->info
;
7712 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7713 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7714 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7721 DEFUN_HIDDEN (ospf_priority
,
7723 "ospf priority (0-255) [A.B.C.D]",
7724 "OSPF interface commands\n"
7727 "Address of interface\n")
7729 return ip_ospf_priority(self
, vty
, argc
, argv
);
7732 DEFUN (no_ip_ospf_priority
,
7733 no_ip_ospf_priority_cmd
,
7734 "no ip ospf priority [(0-255) [A.B.C.D]]",
7737 "OSPF interface commands\n"
7738 "Router priority\n" // ignored
7740 "Address of interface\n")
7742 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7744 struct route_node
*rn
;
7745 struct in_addr addr
;
7746 struct ospf_if_params
*params
;
7748 params
= IF_DEF_PARAMS(ifp
);
7750 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7751 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7753 "Please specify interface address by A.B.C.D\n");
7754 return CMD_WARNING_CONFIG_FAILED
;
7757 params
= ospf_lookup_if_params(ifp
, addr
);
7762 UNSET_IF_PARAM(params
, priority
);
7763 params
->priority
= OSPF_ROUTER_PRIORITY_DEFAULT
;
7765 if (params
!= IF_DEF_PARAMS(ifp
)) {
7766 ospf_free_if_params(ifp
, addr
);
7767 ospf_if_update_params(ifp
, addr
);
7770 for (rn
= route_top(IF_OIFS(ifp
)); rn
; rn
= route_next(rn
)) {
7771 struct ospf_interface
*oi
= rn
->info
;
7776 if (PRIORITY(oi
) != OSPF_IF_PARAM(oi
, priority
)) {
7777 PRIORITY(oi
) = OSPF_IF_PARAM(oi
, priority
);
7778 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
7785 DEFUN_HIDDEN (no_ospf_priority
,
7786 no_ospf_priority_cmd
,
7787 "no ospf priority [(0-255) [A.B.C.D]]",
7789 "OSPF interface commands\n"
7792 "Address of interface\n")
7794 return no_ip_ospf_priority(self
, vty
, argc
, argv
);
7797 DEFUN (ip_ospf_retransmit_interval
,
7798 ip_ospf_retransmit_interval_addr_cmd
,
7799 "ip ospf retransmit-interval (3-65535) [A.B.C.D]",
7801 "OSPF interface commands\n"
7802 "Time between retransmitting lost link state advertisements\n"
7804 "Address of interface\n")
7806 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7809 struct in_addr addr
;
7810 struct ospf_if_params
*params
;
7811 params
= IF_DEF_PARAMS(ifp
);
7813 argv_find(argv
, argc
, "(3-65535)", &idx
);
7814 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7816 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7817 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7819 "Please specify interface address by A.B.C.D\n");
7820 return CMD_WARNING_CONFIG_FAILED
;
7823 params
= ospf_get_if_params(ifp
, addr
);
7824 ospf_if_update_params(ifp
, addr
);
7827 SET_IF_PARAM(params
, retransmit_interval
);
7828 params
->retransmit_interval
= seconds
;
7833 DEFUN_HIDDEN (ospf_retransmit_interval
,
7834 ospf_retransmit_interval_cmd
,
7835 "ospf retransmit-interval (3-65535) [A.B.C.D]",
7836 "OSPF interface commands\n"
7837 "Time between retransmitting lost link state advertisements\n"
7839 "Address of interface\n")
7841 return ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7844 DEFUN (no_ip_ospf_retransmit_interval
,
7845 no_ip_ospf_retransmit_interval_addr_cmd
,
7846 "no ip ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7849 "OSPF interface commands\n"
7850 "Time between retransmitting lost link state advertisements\n"
7852 "Address of interface\n")
7854 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7856 struct in_addr addr
;
7857 struct ospf_if_params
*params
;
7859 params
= IF_DEF_PARAMS(ifp
);
7861 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7862 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7864 "Please specify interface address by A.B.C.D\n");
7865 return CMD_WARNING_CONFIG_FAILED
;
7868 params
= ospf_lookup_if_params(ifp
, addr
);
7873 UNSET_IF_PARAM(params
, retransmit_interval
);
7874 params
->retransmit_interval
= OSPF_RETRANSMIT_INTERVAL_DEFAULT
;
7876 if (params
!= IF_DEF_PARAMS(ifp
)) {
7877 ospf_free_if_params(ifp
, addr
);
7878 ospf_if_update_params(ifp
, addr
);
7884 DEFUN_HIDDEN (no_ospf_retransmit_interval
,
7885 no_ospf_retransmit_interval_cmd
,
7886 "no ospf retransmit-interval [(3-65535)] [A.B.C.D]",
7888 "OSPF interface commands\n"
7889 "Time between retransmitting lost link state advertisements\n"
7891 "Address of interface\n")
7893 return no_ip_ospf_retransmit_interval(self
, vty
, argc
, argv
);
7896 DEFUN (ip_ospf_transmit_delay
,
7897 ip_ospf_transmit_delay_addr_cmd
,
7898 "ip ospf transmit-delay (1-65535) [A.B.C.D]",
7900 "OSPF interface commands\n"
7901 "Link state transmit delay\n"
7903 "Address of interface\n")
7905 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7908 struct in_addr addr
;
7909 struct ospf_if_params
*params
;
7911 params
= IF_DEF_PARAMS(ifp
);
7912 argv_find(argv
, argc
, "(1-65535)", &idx
);
7913 seconds
= strtol(argv
[idx
]->arg
, NULL
, 10);
7915 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7916 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7918 "Please specify interface address by A.B.C.D\n");
7919 return CMD_WARNING_CONFIG_FAILED
;
7922 params
= ospf_get_if_params(ifp
, addr
);
7923 ospf_if_update_params(ifp
, addr
);
7926 SET_IF_PARAM(params
, transmit_delay
);
7927 params
->transmit_delay
= seconds
;
7932 DEFUN_HIDDEN (ospf_transmit_delay
,
7933 ospf_transmit_delay_cmd
,
7934 "ospf transmit-delay (1-65535) [A.B.C.D]",
7935 "OSPF interface commands\n"
7936 "Link state transmit delay\n"
7938 "Address of interface\n")
7940 return ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7943 DEFUN (no_ip_ospf_transmit_delay
,
7944 no_ip_ospf_transmit_delay_addr_cmd
,
7945 "no ip ospf transmit-delay [(1-65535)] [A.B.C.D]",
7948 "OSPF interface commands\n"
7949 "Link state transmit delay\n"
7951 "Address of interface\n")
7953 VTY_DECLVAR_CONTEXT(interface
, ifp
);
7955 struct in_addr addr
;
7956 struct ospf_if_params
*params
;
7958 params
= IF_DEF_PARAMS(ifp
);
7960 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7961 if (!inet_aton(argv
[idx
]->arg
, &addr
)) {
7963 "Please specify interface address by A.B.C.D\n");
7964 return CMD_WARNING_CONFIG_FAILED
;
7967 params
= ospf_lookup_if_params(ifp
, addr
);
7972 UNSET_IF_PARAM(params
, transmit_delay
);
7973 params
->transmit_delay
= OSPF_TRANSMIT_DELAY_DEFAULT
;
7975 if (params
!= IF_DEF_PARAMS(ifp
)) {
7976 ospf_free_if_params(ifp
, addr
);
7977 ospf_if_update_params(ifp
, addr
);
7984 DEFUN_HIDDEN (no_ospf_transmit_delay
,
7985 no_ospf_transmit_delay_cmd
,
7986 "no ospf transmit-delay [(1-65535) [A.B.C.D]]",
7988 "OSPF interface commands\n"
7989 "Link state transmit delay\n"
7991 "Address of interface\n")
7993 return no_ip_ospf_transmit_delay(self
, vty
, argc
, argv
);
7996 DEFUN (ip_ospf_area
,
7998 "ip ospf [(1-65535)] area <A.B.C.D|(0-4294967295)> [A.B.C.D]",
8000 "OSPF interface commands\n"
8002 "Enable OSPF on this interface\n"
8003 "OSPF area ID in IP address format\n"
8004 "OSPF area ID as a decimal value\n"
8005 "Address of interface\n")
8007 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8010 struct in_addr area_id
;
8011 struct in_addr addr
;
8012 struct ospf_if_params
*params
= NULL
;
8013 struct route_node
*rn
;
8014 struct ospf
*ospf
= NULL
;
8015 unsigned short instance
= 0;
8018 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8019 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8021 argv_find(argv
, argc
, "area", &idx
);
8022 areaid
= argv
[idx
+ 1]->arg
;
8024 if (ifp
->vrf_id
&& !instance
)
8025 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8027 ospf
= ospf_lookup_instance(instance
);
8029 if (instance
&& ospf
== NULL
) {
8030 params
= IF_DEF_PARAMS(ifp
);
8031 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8032 UNSET_IF_PARAM(params
, if_area
);
8033 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
8034 ospf_interface_area_unset(ospf
, ifp
);
8035 ospf
->if_ospf_cli_count
--;
8037 return CMD_NOT_MY_INSTANCE
;
8040 ret
= str2area_id(areaid
, &area_id
, &format
);
8042 vty_out(vty
, "Please specify area by A.B.C.D|<0-4294967295>\n");
8043 return CMD_WARNING_CONFIG_FAILED
;
8045 if (memcmp(ifp
->name
, "VLINK", 5) == 0) {
8046 vty_out(vty
, "Cannot enable OSPF on a virtual link.\n");
8047 return CMD_WARNING_CONFIG_FAILED
;
8050 params
= IF_DEF_PARAMS(ifp
);
8051 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)
8052 && !IPV4_ADDR_SAME(¶ms
->if_area
, &area_id
)) {
8054 "Must remove previous area config before changing ospf area \n");
8055 return CMD_WARNING_CONFIG_FAILED
;
8058 // Check if we have an address arg and proccess it
8059 if (argc
== idx
+ 3) {
8060 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8062 "Please specify Intf Address by A.B.C.D\n");
8063 return CMD_WARNING_CONFIG_FAILED
;
8065 // update/create address-level params
8066 params
= ospf_get_if_params((ifp
), (addr
));
8067 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8069 "Must remove previous area/address config before changing ospf area");
8070 return CMD_WARNING_CONFIG_FAILED
;
8072 ospf_if_update_params((ifp
), (addr
));
8076 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
8077 if (rn
->info
!= NULL
) {
8079 "Please remove all network commands first.\n");
8080 return CMD_WARNING_CONFIG_FAILED
;
8085 /* enable ospf on this interface with area_id */
8087 SET_IF_PARAM(params
, if_area
);
8088 params
->if_area
= area_id
;
8089 params
->if_area_id_fmt
= format
;
8093 ospf_interface_area_set(ospf
, ifp
);
8094 ospf
->if_ospf_cli_count
++;
8100 DEFUN (no_ip_ospf_area
,
8101 no_ip_ospf_area_cmd
,
8102 "no ip ospf [(1-65535)] area [<A.B.C.D|(0-4294967295)> [A.B.C.D]]",
8105 "OSPF interface commands\n"
8107 "Disable OSPF on this interface\n"
8108 "OSPF area ID in IP address format\n"
8109 "OSPF area ID as a decimal value\n"
8110 "Address of interface\n")
8112 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8115 struct ospf_if_params
*params
;
8116 unsigned short instance
= 0;
8117 struct in_addr addr
;
8119 if (argv_find(argv
, argc
, "(1-65535)", &idx
))
8120 instance
= strtol(argv
[idx
]->arg
, NULL
, 10);
8122 if (ifp
->vrf_id
&& !instance
)
8123 ospf
= ospf_lookup_by_vrf_id(ifp
->vrf_id
);
8125 ospf
= ospf_lookup_instance(instance
);
8128 return CMD_NOT_MY_INSTANCE
;
8130 argv_find(argv
, argc
, "area", &idx
);
8132 // Check if we have an address arg and proccess it
8133 if (argc
== idx
+ 3) {
8134 if (!inet_aton(argv
[idx
+ 2]->arg
, &addr
)) {
8136 "Please specify Intf Address by A.B.C.D\n");
8137 return CMD_WARNING_CONFIG_FAILED
;
8139 params
= ospf_lookup_if_params(ifp
, addr
);
8140 if ((params
) == NULL
)
8143 params
= IF_DEF_PARAMS(ifp
);
8145 if (!OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
8147 "Can't find specified interface area configuration.\n");
8148 return CMD_WARNING_CONFIG_FAILED
;
8151 UNSET_IF_PARAM(params
, if_area
);
8152 if (params
!= IF_DEF_PARAMS((ifp
))) {
8153 ospf_free_if_params((ifp
), (addr
));
8154 ospf_if_update_params((ifp
), (addr
));
8157 ospf_interface_area_unset(ospf
, ifp
);
8158 ospf
->if_ospf_cli_count
--;
8162 DEFUN (ospf_redistribute_source
,
8163 ospf_redistribute_source_cmd
,
8164 "redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8166 FRR_REDIST_HELP_STR_OSPFD
8167 "Metric for redistributed routes\n"
8168 "OSPF default metric\n"
8169 "OSPF exterior metric type for redistributed routes\n"
8170 "Set OSPF External Type 1/2 metrics\n"
8171 "Route map reference\n"
8172 "Pointer to route-map entries\n")
8174 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8175 int idx_protocol
= 1;
8179 struct ospf_redist
*red
;
8182 /* Get distribute source. */
8183 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8185 return CMD_WARNING_CONFIG_FAILED
;
8187 red
= ospf_redist_add(ospf
, source
, 0);
8189 /* Get metric value. */
8190 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8191 if (!str2metric(argv
[idx
]->arg
, &metric
))
8192 return CMD_WARNING_CONFIG_FAILED
;
8195 /* Get metric type. */
8196 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8197 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8198 return CMD_WARNING_CONFIG_FAILED
;
8202 if (argv_find(argv
, argc
, "WORD", &idx
)) {
8203 ospf_routemap_set(red
, argv
[idx
]->arg
);
8205 ospf_routemap_unset(red
);
8207 return ospf_redistribute_set(ospf
, source
, 0, type
, metric
);
8210 DEFUN (no_ospf_redistribute_source
,
8211 no_ospf_redistribute_source_cmd
,
8212 "no redistribute " FRR_REDIST_STR_OSPFD
" [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8215 FRR_REDIST_HELP_STR_OSPFD
8216 "Metric for redistributed routes\n"
8217 "OSPF default metric\n"
8218 "OSPF exterior metric type for redistributed routes\n"
8219 "Set OSPF External Type 1/2 metrics\n"
8220 "Route map reference\n"
8221 "Pointer to route-map entries\n")
8223 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8224 int idx_protocol
= 2;
8226 struct ospf_redist
*red
;
8228 source
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
8230 return CMD_WARNING_CONFIG_FAILED
;
8232 red
= ospf_redist_lookup(ospf
, source
, 0);
8236 ospf_routemap_unset(red
);
8237 ospf_redist_del(ospf
, source
, 0);
8239 return ospf_redistribute_unset(ospf
, source
, 0);
8242 DEFUN (ospf_redistribute_instance_source
,
8243 ospf_redistribute_instance_source_cmd
,
8244 "redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8246 "Open Shortest Path First\n"
8247 "Non-main Kernel Routing Table\n"
8248 "Instance ID/Table ID\n"
8249 "Metric for redistributed routes\n"
8250 "OSPF default metric\n"
8251 "OSPF exterior metric type for redistributed routes\n"
8252 "Set OSPF External Type 1/2 metrics\n"
8253 "Route map reference\n"
8254 "Pointer to route-map entries\n")
8256 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8257 int idx_ospf_table
= 1;
8263 unsigned short instance
;
8264 struct ospf_redist
*red
;
8266 source
= proto_redistnum(AFI_IP
, argv
[idx_ospf_table
]->text
);
8269 vty_out(vty
, "Unknown instance redistribution\n");
8270 return CMD_WARNING_CONFIG_FAILED
;
8273 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8275 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8277 "Instance redistribution in non-instanced OSPF not allowed\n");
8278 return CMD_WARNING_CONFIG_FAILED
;
8281 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8282 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8283 return CMD_WARNING_CONFIG_FAILED
;
8286 /* Get metric value. */
8287 if (argv_find(argv
, argc
, "metric", &idx
))
8288 if (!str2metric(argv
[idx
+ 1]->arg
, &metric
))
8289 return CMD_WARNING_CONFIG_FAILED
;
8292 /* Get metric type. */
8293 if (argv_find(argv
, argc
, "metric-type", &idx
))
8294 if (!str2metric_type(argv
[idx
+ 1]->arg
, &type
))
8295 return CMD_WARNING_CONFIG_FAILED
;
8297 red
= ospf_redist_add(ospf
, source
, instance
);
8300 if (argv_find(argv
, argc
, "route-map", &idx
))
8301 ospf_routemap_set(red
, argv
[idx
+ 1]->arg
);
8303 ospf_routemap_unset(red
);
8305 return ospf_redistribute_set(ospf
, source
, instance
, type
, metric
);
8308 DEFUN (no_ospf_redistribute_instance_source
,
8309 no_ospf_redistribute_instance_source_cmd
,
8310 "no redistribute <ospf|table> (1-65535) [{metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8313 "Open Shortest Path First\n"
8314 "Non-main Kernel Routing Table\n"
8315 "Instance ID/Table Id\n"
8316 "Metric for redistributed routes\n"
8317 "OSPF default metric\n"
8318 "OSPF exterior metric type for redistributed routes\n"
8319 "Set OSPF External Type 1/2 metrics\n"
8320 "Route map reference\n"
8321 "Pointer to route-map entries\n")
8323 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8324 int idx_ospf_table
= 2;
8326 unsigned int instance
;
8327 struct ospf_redist
*red
;
8330 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
8331 source
= ZEBRA_ROUTE_OSPF
;
8333 source
= ZEBRA_ROUTE_TABLE
;
8335 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8337 if ((source
== ZEBRA_ROUTE_OSPF
) && !ospf
->instance
) {
8339 "Instance redistribution in non-instanced OSPF not allowed\n");
8340 return CMD_WARNING_CONFIG_FAILED
;
8343 if ((source
== ZEBRA_ROUTE_OSPF
) && (ospf
->instance
== instance
)) {
8344 vty_out(vty
, "Same instance OSPF redistribution not allowed\n");
8345 return CMD_WARNING_CONFIG_FAILED
;
8348 red
= ospf_redist_lookup(ospf
, source
, instance
);
8352 ospf_routemap_unset(red
);
8353 ospf_redist_del(ospf
, source
, instance
);
8355 return ospf_redistribute_unset(ospf
, source
, instance
);
8358 DEFUN (ospf_distribute_list_out
,
8359 ospf_distribute_list_out_cmd
,
8360 "distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8361 "Filter networks in routing updates\n"
8362 "Access-list name\n"
8364 FRR_REDIST_HELP_STR_OSPFD
)
8366 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8370 char *proto
= argv
[argc
- 1]->text
;
8372 /* Get distribute source. */
8373 source
= proto_redistnum(AFI_IP
, proto
);
8375 return CMD_WARNING_CONFIG_FAILED
;
8377 return ospf_distribute_list_out_set(ospf
, source
, argv
[idx_word
]->arg
);
8380 DEFUN (no_ospf_distribute_list_out
,
8381 no_ospf_distribute_list_out_cmd
,
8382 "no distribute-list WORD out " FRR_REDIST_STR_OSPFD
,
8384 "Filter networks in routing updates\n"
8385 "Access-list name\n"
8387 FRR_REDIST_HELP_STR_OSPFD
)
8389 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8393 char *proto
= argv
[argc
- 1]->text
;
8394 source
= proto_redistnum(AFI_IP
, proto
);
8396 return CMD_WARNING_CONFIG_FAILED
;
8398 return ospf_distribute_list_out_unset(ospf
, source
,
8399 argv
[idx_word
]->arg
);
8402 /* Default information originate. */
8403 DEFUN (ospf_default_information_originate
,
8404 ospf_default_information_originate_cmd
,
8405 "default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8406 "Control distribution of default information\n"
8407 "Distribute a default route\n"
8408 "Always advertise default route\n"
8409 "OSPF default metric\n"
8411 "OSPF metric type for default routes\n"
8412 "Set OSPF External Type 1/2 metrics\n"
8413 "Route map reference\n"
8414 "Pointer to route-map entries\n")
8416 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8417 int default_originate
= DEFAULT_ORIGINATE_ZEBRA
;
8420 struct ospf_redist
*red
;
8422 int cur_originate
= ospf
->default_originate
;
8426 red
= ospf_redist_add(ospf
, DEFAULT_ROUTE
, 0);
8428 /* Check whether "always" was specified */
8429 if (argv_find(argv
, argc
, "always", &idx
))
8430 default_originate
= DEFAULT_ORIGINATE_ALWAYS
;
8432 /* Get metric value */
8433 if (argv_find(argv
, argc
, "(0-16777214)", &idx
)) {
8434 if (!str2metric(argv
[idx
]->arg
, &metric
))
8435 return CMD_WARNING_CONFIG_FAILED
;
8438 /* Get metric type. */
8439 if (argv_find(argv
, argc
, "(1-2)", &idx
)) {
8440 if (!str2metric_type(argv
[idx
]->arg
, &type
))
8441 return CMD_WARNING_CONFIG_FAILED
;
8445 if (argv_find(argv
, argc
, "WORD", &idx
))
8446 rtmap
= argv
[idx
]->arg
;
8448 /* To check ,if user is providing same route map */
8449 if ((rtmap
== ROUTEMAP_NAME(red
)) ||
8450 (rtmap
&& ROUTEMAP_NAME(red
)
8451 && (strcmp(rtmap
, ROUTEMAP_NAME(red
)) == 0)))
8454 /* Don't allow if the same lsa is aleardy originated. */
8456 && (red
->dmetric
.type
== type
)
8457 && (red
->dmetric
.value
== metric
)
8458 && (cur_originate
== default_originate
))
8461 /* Updating Metric details */
8462 red
->dmetric
.type
= type
;
8463 red
->dmetric
.value
= metric
;
8465 /* updating route map details */
8467 ospf_routemap_set(red
, rtmap
);
8469 ospf_routemap_unset(red
);
8471 return ospf_redistribute_default_set(ospf
, default_originate
, type
,
8475 DEFUN (no_ospf_default_information_originate
,
8476 no_ospf_default_information_originate_cmd
,
8477 "no default-information originate [{always|metric (0-16777214)|metric-type (1-2)|route-map WORD}]",
8479 "Control distribution of default information\n"
8480 "Distribute a default route\n"
8481 "Always advertise default route\n"
8482 "OSPF default metric\n"
8484 "OSPF metric type for default routes\n"
8485 "Set OSPF External Type 1/2 metrics\n"
8486 "Route map reference\n"
8487 "Pointer to route-map entries\n")
8489 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8490 struct ospf_redist
*red
;
8492 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
8496 ospf_routemap_unset(red
);
8497 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
8499 return ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
,
8503 DEFUN (ospf_default_metric
,
8504 ospf_default_metric_cmd
,
8505 "default-metric (0-16777214)",
8506 "Set metric of redistributed routes\n"
8509 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8513 if (!str2metric(argv
[idx_number
]->arg
, &metric
))
8514 return CMD_WARNING_CONFIG_FAILED
;
8516 ospf
->default_metric
= metric
;
8521 DEFUN (no_ospf_default_metric
,
8522 no_ospf_default_metric_cmd
,
8523 "no default-metric [(0-16777214)]",
8525 "Set metric of redistributed routes\n"
8528 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8530 ospf
->default_metric
= -1;
8536 DEFUN (ospf_distance
,
8539 "Administrative distance\n"
8540 "OSPF Administrative distance\n")
8542 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8545 ospf
->distance_all
= atoi(argv
[idx_number
]->arg
);
8550 DEFUN (no_ospf_distance
,
8551 no_ospf_distance_cmd
,
8552 "no distance (1-255)",
8554 "Administrative distance\n"
8555 "OSPF Administrative distance\n")
8557 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8559 ospf
->distance_all
= 0;
8564 DEFUN (no_ospf_distance_ospf
,
8565 no_ospf_distance_ospf_cmd
,
8566 "no distance ospf [{intra-area [(1-255)]|inter-area [(1-255)]|external [(1-255)]}]",
8568 "Administrative distance\n"
8569 "OSPF administrative distance\n"
8570 "Intra-area routes\n"
8571 "Distance for intra-area routes\n"
8572 "Inter-area routes\n"
8573 "Distance for inter-area routes\n"
8575 "Distance for external routes\n")
8577 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8580 if (argv_find(argv
, argc
, "intra-area", &idx
) || argc
== 3)
8581 idx
= ospf
->distance_intra
= 0;
8582 if (argv_find(argv
, argc
, "inter-area", &idx
) || argc
== 3)
8583 idx
= ospf
->distance_inter
= 0;
8584 if (argv_find(argv
, argc
, "external", &idx
) || argc
== 3)
8585 ospf
->distance_external
= 0;
8590 DEFUN (ospf_distance_ospf
,
8591 ospf_distance_ospf_cmd
,
8592 "distance ospf {intra-area (1-255)|inter-area (1-255)|external (1-255)}",
8593 "Administrative distance\n"
8594 "OSPF administrative distance\n"
8595 "Intra-area routes\n"
8596 "Distance for intra-area routes\n"
8597 "Inter-area routes\n"
8598 "Distance for inter-area routes\n"
8600 "Distance for external routes\n")
8602 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8605 ospf
->distance_intra
= 0;
8606 ospf
->distance_inter
= 0;
8607 ospf
->distance_external
= 0;
8609 if (argv_find(argv
, argc
, "intra-area", &idx
))
8610 ospf
->distance_intra
= atoi(argv
[idx
+ 1]->arg
);
8612 if (argv_find(argv
, argc
, "inter-area", &idx
))
8613 ospf
->distance_inter
= atoi(argv
[idx
+ 1]->arg
);
8615 if (argv_find(argv
, argc
, "external", &idx
))
8616 ospf
->distance_external
= atoi(argv
[idx
+ 1]->arg
);
8622 DEFUN (ospf_distance_source
,
8623 ospf_distance_source_cmd
,
8624 "distance (1-255) A.B.C.D/M",
8625 "Administrative distance\n"
8627 "IP source prefix\n")
8629 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8631 int idx_ipv4_prefixlen
= 2;
8633 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8638 DEFUN (no_ospf_distance_source
,
8639 no_ospf_distance_source_cmd
,
8640 "no distance (1-255) A.B.C.D/M",
8642 "Administrative distance\n"
8644 "IP source prefix\n")
8646 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8648 int idx_ipv4_prefixlen
= 3;
8650 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
);
8655 DEFUN (ospf_distance_source_access_list
,
8656 ospf_distance_source_access_list_cmd
,
8657 "distance (1-255) A.B.C.D/M WORD",
8658 "Administrative distance\n"
8660 "IP source prefix\n"
8661 "Access list name\n")
8663 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8665 int idx_ipv4_prefixlen
= 2;
8668 ospf_distance_set (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8673 DEFUN (no_ospf_distance_source_access_list
,
8674 no_ospf_distance_source_access_list_cmd
,
8675 "no distance (1-255) A.B.C.D/M WORD",
8677 "Administrative distance\n"
8679 "IP source prefix\n"
8680 "Access list name\n")
8682 VTY_DECLVAR_CONTEXT(ospf
, ospf
);
8684 int idx_ipv4_prefixlen
= 3;
8687 ospf_distance_unset (vty
, ospf
, argv
[idx_number
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_word
]->arg
);
8693 DEFUN (ip_ospf_mtu_ignore
,
8694 ip_ospf_mtu_ignore_addr_cmd
,
8695 "ip ospf mtu-ignore [A.B.C.D]",
8697 "OSPF interface commands\n"
8698 "Disable MTU mismatch detection on this interface\n"
8699 "Address of interface\n")
8701 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8703 struct in_addr addr
;
8706 struct ospf_if_params
*params
;
8707 params
= IF_DEF_PARAMS(ifp
);
8710 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8713 "Please specify interface address by A.B.C.D\n");
8714 return CMD_WARNING_CONFIG_FAILED
;
8716 params
= ospf_get_if_params(ifp
, addr
);
8717 ospf_if_update_params(ifp
, addr
);
8719 params
->mtu_ignore
= 1;
8720 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8721 SET_IF_PARAM(params
, mtu_ignore
);
8723 UNSET_IF_PARAM(params
, mtu_ignore
);
8724 if (params
!= IF_DEF_PARAMS(ifp
)) {
8725 ospf_free_if_params(ifp
, addr
);
8726 ospf_if_update_params(ifp
, addr
);
8732 DEFUN (no_ip_ospf_mtu_ignore
,
8733 no_ip_ospf_mtu_ignore_addr_cmd
,
8734 "no ip ospf mtu-ignore [A.B.C.D]",
8737 "OSPF interface commands\n"
8738 "Disable MTU mismatch detection on this interface\n"
8739 "Address of interface\n")
8741 VTY_DECLVAR_CONTEXT(interface
, ifp
);
8743 struct in_addr addr
;
8746 struct ospf_if_params
*params
;
8747 params
= IF_DEF_PARAMS(ifp
);
8750 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &addr
);
8753 "Please specify interface address by A.B.C.D\n");
8754 return CMD_WARNING_CONFIG_FAILED
;
8756 params
= ospf_get_if_params(ifp
, addr
);
8757 ospf_if_update_params(ifp
, addr
);
8759 params
->mtu_ignore
= 0;
8760 if (params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
)
8761 SET_IF_PARAM(params
, mtu_ignore
);
8763 UNSET_IF_PARAM(params
, mtu_ignore
);
8764 if (params
!= IF_DEF_PARAMS(ifp
)) {
8765 ospf_free_if_params(ifp
, addr
);
8766 ospf_if_update_params(ifp
, addr
);
8773 DEFUN (ospf_max_metric_router_lsa_admin
,
8774 ospf_max_metric_router_lsa_admin_cmd
,
8775 "max-metric router-lsa administrative",
8776 "OSPF maximum / infinite-distance metric\n"
8777 "Advertise own Router-LSA with infinite distance (stub router)\n"
8778 "Administratively applied, for an indefinite period\n")
8780 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8781 struct listnode
*ln
;
8782 struct ospf_area
*area
;
8784 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8785 SET_FLAG(area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
8787 if (!CHECK_FLAG(area
->stub_router_state
,
8788 OSPF_AREA_IS_STUB_ROUTED
))
8789 ospf_router_lsa_update_area(area
);
8792 /* Allows for areas configured later to get the property */
8793 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
;
8798 DEFUN (no_ospf_max_metric_router_lsa_admin
,
8799 no_ospf_max_metric_router_lsa_admin_cmd
,
8800 "no max-metric router-lsa administrative",
8802 "OSPF maximum / infinite-distance metric\n"
8803 "Advertise own Router-LSA with infinite distance (stub router)\n"
8804 "Administratively applied, for an indefinite period\n")
8806 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8807 struct listnode
*ln
;
8808 struct ospf_area
*area
;
8810 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8811 UNSET_FLAG(area
->stub_router_state
,
8812 OSPF_AREA_ADMIN_STUB_ROUTED
);
8814 /* Don't trample on the start-up stub timer */
8815 if (CHECK_FLAG(area
->stub_router_state
,
8816 OSPF_AREA_IS_STUB_ROUTED
)
8817 && !area
->t_stub_router
) {
8818 UNSET_FLAG(area
->stub_router_state
,
8819 OSPF_AREA_IS_STUB_ROUTED
);
8820 ospf_router_lsa_update_area(area
);
8823 ospf
->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
8827 DEFUN (ospf_max_metric_router_lsa_startup
,
8828 ospf_max_metric_router_lsa_startup_cmd
,
8829 "max-metric router-lsa on-startup (5-86400)",
8830 "OSPF maximum / infinite-distance metric\n"
8831 "Advertise own Router-LSA with infinite distance (stub router)\n"
8832 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8833 "Time (seconds) to advertise self as stub-router\n")
8835 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8837 unsigned int seconds
;
8840 vty_out(vty
, "%% Must supply stub-router period");
8841 return CMD_WARNING_CONFIG_FAILED
;
8844 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8846 ospf
->stub_router_startup_time
= seconds
;
8851 DEFUN (no_ospf_max_metric_router_lsa_startup
,
8852 no_ospf_max_metric_router_lsa_startup_cmd
,
8853 "no max-metric router-lsa on-startup [(5-86400)]",
8855 "OSPF maximum / infinite-distance metric\n"
8856 "Advertise own Router-LSA with infinite distance (stub router)\n"
8857 "Automatically advertise stub Router-LSA on startup of OSPF\n"
8858 "Time (seconds) to advertise self as stub-router\n")
8860 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8861 struct listnode
*ln
;
8862 struct ospf_area
*area
;
8864 ospf
->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8866 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8867 SET_FLAG(area
->stub_router_state
,
8868 OSPF_AREA_WAS_START_STUB_ROUTED
);
8869 OSPF_TIMER_OFF(area
->t_stub_router
);
8871 /* Don't trample on admin stub routed */
8872 if (!CHECK_FLAG(area
->stub_router_state
,
8873 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8874 UNSET_FLAG(area
->stub_router_state
,
8875 OSPF_AREA_IS_STUB_ROUTED
);
8876 ospf_router_lsa_update_area(area
);
8883 DEFUN (ospf_max_metric_router_lsa_shutdown
,
8884 ospf_max_metric_router_lsa_shutdown_cmd
,
8885 "max-metric router-lsa on-shutdown (5-100)",
8886 "OSPF maximum / infinite-distance metric\n"
8887 "Advertise own Router-LSA with infinite distance (stub router)\n"
8888 "Advertise stub-router prior to full shutdown of OSPF\n"
8889 "Time (seconds) to wait till full shutdown\n")
8891 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8893 unsigned int seconds
;
8896 vty_out(vty
, "%% Must supply stub-router shutdown period");
8897 return CMD_WARNING_CONFIG_FAILED
;
8900 seconds
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8902 ospf
->stub_router_shutdown_time
= seconds
;
8907 DEFUN (no_ospf_max_metric_router_lsa_shutdown
,
8908 no_ospf_max_metric_router_lsa_shutdown_cmd
,
8909 "no max-metric router-lsa on-shutdown [(5-100)]",
8911 "OSPF maximum / infinite-distance metric\n"
8912 "Advertise own Router-LSA with infinite distance (stub router)\n"
8913 "Advertise stub-router prior to full shutdown of OSPF\n"
8914 "Time (seconds) to wait till full shutdown\n")
8916 VTY_DECLVAR_INSTANCE_CONTEXT(ospf
, ospf
);
8918 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
8923 static void config_write_stub_router(struct vty
*vty
, struct ospf
*ospf
)
8925 struct listnode
*ln
;
8926 struct ospf_area
*area
;
8928 if (ospf
->stub_router_startup_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8929 vty_out(vty
, " max-metric router-lsa on-startup %u\n",
8930 ospf
->stub_router_startup_time
);
8931 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
8932 vty_out(vty
, " max-metric router-lsa on-shutdown %u\n",
8933 ospf
->stub_router_shutdown_time
);
8934 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
8935 if (CHECK_FLAG(area
->stub_router_state
,
8936 OSPF_AREA_ADMIN_STUB_ROUTED
)) {
8937 vty_out(vty
, " max-metric router-lsa administrative\n");
8944 static void show_ip_ospf_route_network(struct vty
*vty
, struct ospf
*ospf
,
8945 struct route_table
*rt
,
8948 struct route_node
*rn
;
8949 struct ospf_route
* or ;
8950 struct listnode
*pnode
, *pnnode
;
8951 struct ospf_path
*path
;
8952 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
8953 *json_nexthop
= NULL
;
8957 "============ OSPF network routing table ============\n");
8959 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
8960 if ((or = rn
->info
) == NULL
)
8962 char buf1
[PREFIX2STR_BUFFER
];
8964 memset(buf1
, 0, sizeof(buf1
));
8965 prefix2str(&rn
->p
, buf1
, sizeof(buf1
));
8967 json_route
= json_object_new_object();
8969 json_object_object_add(json
, buf1
, json_route
);
8970 json_object_to_json_string_ext(
8971 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
8974 switch (or->path_type
) {
8975 case OSPF_PATH_INTER_AREA
:
8976 if (or->type
== OSPF_DESTINATION_NETWORK
) {
8978 json_object_string_add(json_route
,
8981 json_object_int_add(json_route
, "cost",
8983 json_object_string_add(
8985 inet_ntoa(or->u
.std
.area_id
));
8988 "N IA %-18s [%d] area: %s\n",
8990 inet_ntoa(or->u
.std
.area_id
));
8992 } else if (or->type
== OSPF_DESTINATION_DISCARD
) {
8994 json_object_string_add(json_route
,
8999 "D IA %-18s Discard entry\n",
9004 case OSPF_PATH_INTRA_AREA
:
9006 json_object_string_add(json_route
, "routeType",
9008 json_object_int_add(json_route
, "cost",
9010 json_object_string_add(
9012 inet_ntoa(or->u
.std
.area_id
));
9014 vty_out(vty
, "N %-18s [%d] area: %s\n",
9016 inet_ntoa(or->u
.std
.area_id
));
9023 if (or->type
== OSPF_DESTINATION_NETWORK
) {
9025 json_nexthop_array
= json_object_new_array();
9026 json_object_object_add(json_route
, "nexthops",
9027 json_nexthop_array
);
9030 for (ALL_LIST_ELEMENTS(or->paths
, pnode
, pnnode
,
9033 json_nexthop
= json_object_new_object();
9034 json_object_array_add(
9038 if (if_lookup_by_index(path
->ifindex
,
9041 if (path
->nexthop
.s_addr
== 0) {
9043 json_object_string_add(
9046 json_object_string_add(
9048 "directly attached to",
9054 "%24s directly attached to %s\n",
9062 json_object_string_add(
9067 json_object_string_add(
9075 "%24s via %s, %s\n",
9088 json_object_free(json_route
);
9094 static void show_ip_ospf_route_router(struct vty
*vty
, struct ospf
*ospf
,
9095 struct route_table
*rtrs
,
9098 struct route_node
*rn
;
9099 struct ospf_route
* or ;
9100 struct listnode
*pnode
;
9101 struct listnode
*node
;
9102 struct ospf_path
*path
;
9103 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9104 *json_nexthop
= NULL
;
9108 "============ OSPF router routing table =============\n");
9110 for (rn
= route_top(rtrs
); rn
; rn
= route_next(rn
)) {
9111 if (rn
->info
== NULL
)
9115 json_route
= json_object_new_object();
9117 json_object_object_add(json
, inet_ntoa(rn
->p
.u
.prefix4
),
9119 json_object_string_add(json_route
, "routeType", "R ");
9121 vty_out(vty
, "R %-15s ",
9122 inet_ntoa(rn
->p
.u
.prefix4
));
9125 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
, or)) {
9128 vty_out(vty
, "%24s", "");
9133 json_object_int_add(json_route
, "cost",
9135 json_object_string_add(
9137 inet_ntoa(or->u
.std
.area_id
));
9138 if (or->path_type
== OSPF_PATH_INTER_AREA
)
9139 json_object_boolean_true_add(json_route
,
9141 if (or->u
.std
.flags
& ROUTER_LSA_BORDER
)
9142 json_object_string_add(json_route
,
9145 else if (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
)
9146 json_object_string_add(json_route
,
9150 vty_out(vty
, "%s [%d] area: %s",
9151 (or->path_type
== OSPF_PATH_INTER_AREA
9154 or->cost
, inet_ntoa(or->u
.std
.area_id
));
9156 vty_out(vty
, "%s%s\n",
9157 (or->u
.std
.flags
& ROUTER_LSA_BORDER
9160 (or->u
.std
.flags
& ROUTER_LSA_EXTERNAL
9166 json_nexthop_array
= json_object_new_array();
9167 json_object_object_add(json_route
, "nexthops",
9168 json_nexthop_array
);
9171 for (ALL_LIST_ELEMENTS_RO(or->paths
, pnode
, path
)) {
9173 json_nexthop
= json_object_new_object();
9174 json_object_array_add(
9178 if (if_lookup_by_index(path
->ifindex
,
9180 if (path
->nexthop
.s_addr
== 0) {
9182 json_object_string_add(
9185 json_object_string_add(
9187 "directly attached to",
9193 "%24s directly attached to %s\n",
9201 json_object_string_add(
9206 json_object_string_add(
9214 "%24s via %s, %s\n",
9227 json_object_free(json_route
);
9233 static void show_ip_ospf_route_external(struct vty
*vty
, struct ospf
*ospf
,
9234 struct route_table
*rt
,
9237 struct route_node
*rn
;
9238 struct ospf_route
*er
;
9239 struct listnode
*pnode
, *pnnode
;
9240 struct ospf_path
*path
;
9241 json_object
*json_route
= NULL
, *json_nexthop_array
= NULL
,
9242 *json_nexthop
= NULL
;
9246 "============ OSPF external routing table ===========\n");
9248 for (rn
= route_top(rt
); rn
; rn
= route_next(rn
)) {
9249 if ((er
= rn
->info
) == NULL
)
9254 snprintf(buf1
, 19, "%s/%d", inet_ntoa(rn
->p
.u
.prefix4
),
9256 json_route
= json_object_new_object();
9258 json_object_object_add(json
, buf1
, json_route
);
9259 json_object_to_json_string_ext(
9260 json
, JSON_C_TO_STRING_NOSLASHESCAPE
);
9263 switch (er
->path_type
) {
9264 case OSPF_PATH_TYPE1_EXTERNAL
:
9266 json_object_string_add(json_route
, "routeType",
9268 json_object_int_add(json_route
, "cost",
9272 "N E1 %-18s [%d] tag: %" ROUTE_TAG_PRI
9274 buf1
, er
->cost
, er
->u
.ext
.tag
);
9277 case OSPF_PATH_TYPE2_EXTERNAL
:
9279 json_object_string_add(json_route
, "routeType",
9281 json_object_int_add(json_route
, "cost",
9285 "N E2 %-18s [%d/%d] tag: %" ROUTE_TAG_PRI
9287 buf1
, er
->cost
, er
->u
.ext
.type2_cost
,
9294 json_nexthop_array
= json_object_new_array();
9295 json_object_object_add(json_route
, "nexthops",
9296 json_nexthop_array
);
9299 for (ALL_LIST_ELEMENTS(er
->paths
, pnode
, pnnode
, path
)) {
9301 json_nexthop
= json_object_new_object();
9302 json_object_array_add(json_nexthop_array
,
9306 if (if_lookup_by_index(path
->ifindex
, ospf
->vrf_id
)) {
9307 if (path
->nexthop
.s_addr
== 0) {
9309 json_object_string_add(
9312 json_object_string_add(
9314 "directly attached to",
9320 "%24s directly attached to %s\n",
9328 json_object_string_add(
9332 json_object_string_add(
9333 json_nexthop
, "via",
9339 "%24s via %s, %s\n",
9351 json_object_free(json_route
);
9357 static int show_ip_ospf_border_routers_common(struct vty
*vty
,
9362 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9364 ospf_show_vrf_name(ospf
, vty
, NULL
, use_vrf
);
9366 if (ospf
->new_table
== NULL
) {
9367 vty_out(vty
, "No OSPF routing information exist\n");
9371 /* Show Network routes.
9372 show_ip_ospf_route_network (vty, ospf->new_table); */
9374 /* Show Router routes. */
9375 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, NULL
);
9382 DEFUN (show_ip_ospf_border_routers
,
9383 show_ip_ospf_border_routers_cmd
,
9384 "show ip ospf [vrf <NAME|all>] border-routers",
9387 "OSPF information\n"
9390 "Show all the ABR's and ASBR's\n")
9392 struct ospf
*ospf
= NULL
;
9393 struct listnode
*node
= NULL
;
9394 char *vrf_name
= NULL
;
9395 bool all_vrf
= false;
9396 int ret
= CMD_SUCCESS
;
9399 uint8_t use_vrf
= 0;
9401 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9404 bool ospf_output
= false;
9409 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9410 if (!ospf
->oi_running
)
9414 ret
= show_ip_ospf_border_routers_common(
9415 vty
, ospf
, use_vrf
);
9419 vty_out(vty
, "%% OSPF instance not found\n");
9421 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9422 if (ospf
== NULL
|| !ospf
->oi_running
) {
9423 vty_out(vty
, "%% OSPF instance not found\n");
9427 ret
= show_ip_ospf_border_routers_common(vty
, ospf
,
9431 /* Display default ospf (instance 0) info */
9432 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
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
, use_vrf
);
9444 DEFUN (show_ip_ospf_instance_border_routers
,
9445 show_ip_ospf_instance_border_routers_cmd
,
9446 "show ip ospf (1-65535) border-routers",
9449 "OSPF information\n"
9451 "Show all the ABR's and ASBR's\n")
9455 unsigned short instance
= 0;
9457 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9458 ospf
= ospf_lookup_instance(instance
);
9460 return CMD_NOT_MY_INSTANCE
;
9462 if (!ospf
->oi_running
)
9465 return show_ip_ospf_border_routers_common(vty
, ospf
, 0);
9468 static int show_ip_ospf_route_common(struct vty
*vty
, struct ospf
*ospf
,
9469 json_object
*json
, uint8_t use_vrf
)
9471 json_object
*json_vrf
= NULL
;
9474 vty_out(vty
, "\nOSPF Instance: %d\n\n", ospf
->instance
);
9479 json_vrf
= json_object_new_object();
9484 ospf_show_vrf_name(ospf
, vty
, json_vrf
, use_vrf
);
9486 if (ospf
->new_table
== NULL
) {
9487 vty_out(vty
, "No OSPF routing information exist\n");
9491 /* Show Network routes. */
9492 show_ip_ospf_route_network(vty
, ospf
, ospf
->new_table
, json_vrf
);
9494 /* Show Router routes. */
9495 show_ip_ospf_route_router(vty
, ospf
, ospf
->new_rtrs
, json_vrf
);
9497 /* Show AS External routes. */
9498 show_ip_ospf_route_external(vty
, ospf
, ospf
->old_external_route
,
9503 // json_object_object_add(json_vrf, "areas",
9505 if (ospf
->vrf_id
== VRF_DEFAULT
)
9506 json_object_object_add(json
, "default",
9509 json_object_object_add(json
, ospf
->name
,
9519 DEFUN (show_ip_ospf_route
,
9520 show_ip_ospf_route_cmd
,
9521 "show ip ospf [vrf <NAME|all>] route [json]",
9524 "OSPF information\n"
9527 "OSPF routing table\n"
9530 struct ospf
*ospf
= NULL
;
9531 struct listnode
*node
= NULL
;
9532 char *vrf_name
= NULL
;
9533 bool all_vrf
= false;
9534 int ret
= CMD_SUCCESS
;
9537 uint8_t use_vrf
= 0;
9538 bool uj
= use_json(argc
, argv
);
9539 json_object
*json
= NULL
;
9542 json
= json_object_new_object();
9544 OSPF_FIND_VRF_ARGS(argv
, argc
, idx_vrf
, vrf_name
, all_vrf
);
9546 /* vrf input is provided could be all or specific vrf*/
9548 bool ospf_output
= false;
9553 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9554 if (!ospf
->oi_running
)
9557 ret
= show_ip_ospf_route_common(vty
, ospf
, json
,
9562 /* Keep Non-pretty format */
9563 vty_out(vty
, "%s\n",
9564 json_object_to_json_string(json
));
9565 json_object_free(json
);
9566 } else if (!ospf_output
)
9567 vty_out(vty
, "%% OSPF instance not found\n");
9571 ospf
= ospf_lookup_by_inst_name(inst
, vrf_name
);
9572 if (ospf
== NULL
|| !ospf
->oi_running
) {
9574 vty_out(vty
, "%s\n",
9575 json_object_to_json_string_ext(
9576 json
, JSON_C_TO_STRING_PRETTY
));
9577 json_object_free(json
);
9579 vty_out(vty
, "%% OSPF instance not found\n");
9584 /* Display default ospf (instance 0) info */
9585 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
9586 if (ospf
== NULL
|| !ospf
->oi_running
) {
9588 vty_out(vty
, "%s\n",
9589 json_object_to_json_string_ext(
9590 json
, JSON_C_TO_STRING_PRETTY
));
9591 json_object_free(json
);
9593 vty_out(vty
, "%% OSPF instance not found\n");
9600 ret
= show_ip_ospf_route_common(vty
, ospf
, json
, use_vrf
);
9601 /* Keep Non-pretty format */
9603 vty_out(vty
, "%s\n", json_object_to_json_string(json
));
9607 json_object_free(json
);
9612 DEFUN (show_ip_ospf_instance_route
,
9613 show_ip_ospf_instance_route_cmd
,
9614 "show ip ospf (1-65535) route",
9617 "OSPF information\n"
9619 "OSPF routing table\n")
9623 unsigned short instance
= 0;
9625 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
9626 ospf
= ospf_lookup_instance(instance
);
9628 return CMD_NOT_MY_INSTANCE
;
9630 if (!ospf
->oi_running
)
9633 return show_ip_ospf_route_common(vty
, ospf
, NULL
, 0);
9637 DEFUN (show_ip_ospf_vrfs
,
9638 show_ip_ospf_vrfs_cmd
,
9639 "show ip ospf vrfs [json]",
9642 "OSPF information\n"
9646 bool uj
= use_json(argc
, argv
);
9647 json_object
*json
= NULL
;
9648 json_object
*json_vrfs
= NULL
;
9649 struct ospf
*ospf
= NULL
;
9650 struct listnode
*node
= NULL
;
9652 static const char header
[] = "Name Id RouterId ";
9655 json
= json_object_new_object();
9656 json_vrfs
= json_object_new_object();
9659 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
9660 json_object
*json_vrf
= NULL
;
9661 const char *name
= NULL
;
9662 int64_t vrf_id_ui
= 0;
9666 if (!uj
&& count
== 1)
9667 vty_out(vty
, "%s\n", header
);
9669 json_vrf
= json_object_new_object();
9671 if (ospf
->vrf_id
== 0)
9672 name
= VRF_DEFAULT_NAME
;
9676 vrf_id_ui
= (ospf
->vrf_id
== VRF_UNKNOWN
)
9678 : (int64_t)ospf
->vrf_id
;
9681 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
9682 json_object_string_add(json_vrf
, "routerId",
9683 inet_ntoa(ospf
->router_id
));
9685 json_object_object_add(json_vrfs
, name
, json_vrf
);
9688 vty_out(vty
, "%-25s %-5d %-16s \n", name
,
9689 ospf
->vrf_id
, inet_ntoa(ospf
->router_id
));
9694 json_object_object_add(json
, "vrfs", json_vrfs
);
9695 json_object_int_add(json
, "totalVrfs", count
);
9697 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
9698 json
, JSON_C_TO_STRING_PRETTY
));
9699 json_object_free(json
);
9702 vty_out(vty
, "\nTotal number of OSPF VRFs: %d\n",
9709 static const char *const ospf_abr_type_str
[] = {
9710 "unknown", "standard", "ibm", "cisco", "shortcut"
9713 static const char *const ospf_shortcut_mode_str
[] = {
9714 "default", "enable", "disable"
9717 static const char *const ospf_int_type_str
[] = {
9718 "unknown", /* should never be used. */
9722 "point-to-multipoint",
9723 "virtual-link", /* should never be used. */
9727 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
9729 struct listnode
*node
;
9730 struct interface
*ifp
;
9731 struct crypt_key
*ck
;
9732 struct route_node
*rn
= NULL
;
9733 struct ospf_if_params
*params
;
9735 struct ospf
*ospf
= vrf
->info
;
9737 FOR_ALL_INTERFACES (vrf
, ifp
) {
9739 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
9742 vty_frame(vty
, "!\n");
9743 if (ifp
->vrf_id
== VRF_DEFAULT
)
9744 vty_frame(vty
, "interface %s\n", ifp
->name
);
9746 vty_frame(vty
, "interface %s vrf %s\n", ifp
->name
,
9749 vty_out(vty
, " description %s\n", ifp
->desc
);
9753 params
= IF_DEF_PARAMS(ifp
);
9756 /* Interface Network print. */
9757 if (OSPF_IF_PARAM_CONFIGURED(params
, type
)
9758 && params
->type
!= OSPF_IFTYPE_LOOPBACK
) {
9759 if (params
->type
!= ospf_default_iftype(ifp
)) {
9760 vty_out(vty
, " ip ospf network %s",
9763 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9771 /* OSPF interface authentication print */
9772 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_type
)
9773 && params
->auth_type
!= OSPF_AUTH_NOTSET
) {
9774 const char *auth_str
;
9776 /* Translation tables are not that much help
9777 * here due to syntax
9778 * of the simple option */
9779 switch (params
->auth_type
) {
9781 case OSPF_AUTH_NULL
:
9785 case OSPF_AUTH_SIMPLE
:
9789 case OSPF_AUTH_CRYPTOGRAPHIC
:
9790 auth_str
= " message-digest";
9798 vty_out(vty
, " ip ospf authentication%s",
9800 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9802 inet_ntoa(rn
->p
.u
.prefix4
));
9806 /* Simple Authentication Password print. */
9807 if (OSPF_IF_PARAM_CONFIGURED(params
, auth_simple
)
9808 && params
->auth_simple
[0] != '\0') {
9809 vty_out(vty
, " ip ospf authentication-key %s",
9810 params
->auth_simple
);
9811 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9813 inet_ntoa(rn
->p
.u
.prefix4
));
9817 /* Cryptographic Authentication Key print. */
9818 if (params
&& params
->auth_crypt
) {
9819 for (ALL_LIST_ELEMENTS_RO(params
->auth_crypt
,
9822 " ip ospf message-digest-key %d md5 %s",
9823 ck
->key_id
, ck
->auth_key
);
9824 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9832 /* Interface Output Cost print. */
9833 if (OSPF_IF_PARAM_CONFIGURED(params
, output_cost_cmd
)) {
9834 vty_out(vty
, " ip ospf cost %u",
9835 params
->output_cost_cmd
);
9836 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9838 inet_ntoa(rn
->p
.u
.prefix4
));
9842 /* Hello Interval print. */
9843 if (OSPF_IF_PARAM_CONFIGURED(params
, v_hello
)
9844 && params
->v_hello
!= OSPF_HELLO_INTERVAL_DEFAULT
) {
9845 vty_out(vty
, " ip ospf hello-interval %u",
9847 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9849 inet_ntoa(rn
->p
.u
.prefix4
));
9854 /* Router Dead Interval print. */
9855 if (OSPF_IF_PARAM_CONFIGURED(params
, v_wait
)
9857 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
) {
9858 vty_out(vty
, " ip ospf dead-interval ");
9861 if (OSPF_IF_PARAM_CONFIGURED(params
,
9864 "minimal hello-multiplier %d",
9865 params
->fast_hello
);
9867 vty_out(vty
, "%u", params
->v_wait
);
9869 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9871 inet_ntoa(rn
->p
.u
.prefix4
));
9875 /* Router Priority print. */
9876 if (OSPF_IF_PARAM_CONFIGURED(params
, priority
)
9878 != OSPF_ROUTER_PRIORITY_DEFAULT
) {
9879 vty_out(vty
, " ip ospf priority %u",
9881 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9883 inet_ntoa(rn
->p
.u
.prefix4
));
9887 /* Retransmit Interval print. */
9888 if (OSPF_IF_PARAM_CONFIGURED(params
,
9889 retransmit_interval
)
9890 && params
->retransmit_interval
9891 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
) {
9892 vty_out(vty
, " ip ospf retransmit-interval %u",
9893 params
->retransmit_interval
);
9894 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9896 inet_ntoa(rn
->p
.u
.prefix4
));
9900 /* Transmit Delay print. */
9901 if (OSPF_IF_PARAM_CONFIGURED(params
, transmit_delay
)
9902 && params
->transmit_delay
9903 != OSPF_TRANSMIT_DELAY_DEFAULT
) {
9904 vty_out(vty
, " ip ospf transmit-delay %u",
9905 params
->transmit_delay
);
9906 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9908 inet_ntoa(rn
->p
.u
.prefix4
));
9913 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
)) {
9914 if (ospf
&& ospf
->instance
)
9915 vty_out(vty
, " ip ospf %d",
9918 vty_out(vty
, " ip ospf");
9920 char buf
[INET_ADDRSTRLEN
];
9922 area_id2str(buf
, sizeof(buf
), ¶ms
->if_area
,
9923 params
->if_area_id_fmt
);
9924 vty_out(vty
, " area %s", buf
);
9925 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9927 inet_ntoa(rn
->p
.u
.prefix4
));
9932 if (params
&& params
->bfd_info
)
9933 ospf_bfd_write_config(vty
, params
);
9935 /* MTU ignore print. */
9936 if (OSPF_IF_PARAM_CONFIGURED(params
, mtu_ignore
)
9937 && params
->mtu_ignore
!= OSPF_MTU_IGNORE_DEFAULT
) {
9938 if (params
->mtu_ignore
== 0)
9939 vty_out(vty
, " no ip ospf mtu-ignore");
9941 vty_out(vty
, " ip ospf mtu-ignore");
9942 if (params
!= IF_DEF_PARAMS(ifp
) && rn
)
9944 inet_ntoa(rn
->p
.u
.prefix4
));
9951 rn
= route_top(IF_OIFS_PARAMS(ifp
));
9953 rn
= route_next(rn
);
9963 ospf_opaque_config_write_if(vty
, ifp
);
9965 vty_endframe(vty
, NULL
);
9971 /* Configuration write function for ospfd. */
9972 static int config_write_interface(struct vty
*vty
)
9975 struct vrf
*vrf
= NULL
;
9977 /* Display all VRF aware OSPF interface configuration */
9978 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
9979 write
+= config_write_interface_one(vty
, vrf
);
9985 static int config_write_network_area(struct vty
*vty
, struct ospf
*ospf
)
9987 struct route_node
*rn
;
9988 uint8_t buf
[INET_ADDRSTRLEN
];
9990 /* `network area' print. */
9991 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
9993 struct ospf_network
*n
= rn
->info
;
9995 /* Create Area ID string by specified Area ID format. */
9996 if (n
->area_id_fmt
== OSPF_AREA_ID_FMT_DOTTEDQUAD
)
9997 inet_ntop(AF_INET
, &n
->area_id
, (char *)buf
,
10000 sprintf((char *)buf
, "%lu",
10001 (unsigned long int)ntohl(
10002 n
->area_id
.s_addr
));
10004 /* Network print. */
10005 vty_out(vty
, " network %s/%d area %s\n",
10006 inet_ntoa(rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
10013 static int config_write_ospf_area(struct vty
*vty
, struct ospf
*ospf
)
10015 struct listnode
*node
;
10016 struct ospf_area
*area
;
10017 uint8_t buf
[INET_ADDRSTRLEN
];
10019 /* Area configuration print. */
10020 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
)) {
10021 struct route_node
*rn1
;
10023 area_id2str((char *)buf
, sizeof(buf
), &area
->area_id
,
10024 area
->area_id_fmt
);
10026 if (area
->auth_type
!= OSPF_AUTH_NULL
) {
10027 if (area
->auth_type
== OSPF_AUTH_SIMPLE
)
10028 vty_out(vty
, " area %s authentication\n", buf
);
10031 " area %s authentication message-digest\n",
10035 if (area
->shortcut_configured
!= OSPF_SHORTCUT_DEFAULT
)
10036 vty_out(vty
, " area %s shortcut %s\n", buf
,
10037 ospf_shortcut_mode_str
10038 [area
->shortcut_configured
]);
10040 if ((area
->external_routing
== OSPF_AREA_STUB
)
10041 || (area
->external_routing
== OSPF_AREA_NSSA
)) {
10042 if (area
->external_routing
== OSPF_AREA_STUB
) {
10043 vty_out(vty
, " area %s stub", buf
);
10044 if (area
->no_summary
)
10045 vty_out(vty
, " no-summary\n");
10046 vty_out(vty
, "\n");
10047 } else if (area
->external_routing
== OSPF_AREA_NSSA
) {
10048 switch (area
->NSSATranslatorRole
) {
10049 case OSPF_NSSA_ROLE_NEVER
:
10051 " area %s nssa translate-never\n",
10054 case OSPF_NSSA_ROLE_ALWAYS
:
10056 " area %s nssa translate-always\n",
10059 case OSPF_NSSA_ROLE_CANDIDATE
:
10060 vty_out(vty
, " area %s nssa \n", buf
);
10063 if (area
->no_summary
)
10065 " area %s nssa no-summary\n",
10069 if (area
->default_cost
!= 1)
10070 vty_out(vty
, " area %s default-cost %d\n", buf
,
10071 area
->default_cost
);
10074 for (rn1
= route_top(area
->ranges
); rn1
; rn1
= route_next(rn1
))
10076 struct ospf_area_range
*range
= rn1
->info
;
10078 vty_out(vty
, " area %s range %s/%d", buf
,
10079 inet_ntoa(rn1
->p
.u
.prefix4
),
10082 if (range
->cost_config
10083 != OSPF_AREA_RANGE_COST_UNSPEC
)
10084 vty_out(vty
, " cost %d",
10085 range
->cost_config
);
10087 if (!CHECK_FLAG(range
->flags
,
10088 OSPF_AREA_RANGE_ADVERTISE
))
10089 vty_out(vty
, " not-advertise");
10091 if (CHECK_FLAG(range
->flags
,
10092 OSPF_AREA_RANGE_SUBSTITUTE
))
10093 vty_out(vty
, " substitute %s/%d",
10094 inet_ntoa(range
->subst_addr
),
10095 range
->subst_masklen
);
10097 vty_out(vty
, "\n");
10100 if (EXPORT_NAME(area
))
10101 vty_out(vty
, " area %s export-list %s\n", buf
,
10102 EXPORT_NAME(area
));
10104 if (IMPORT_NAME(area
))
10105 vty_out(vty
, " area %s import-list %s\n", buf
,
10106 IMPORT_NAME(area
));
10108 if (PREFIX_NAME_IN(area
))
10109 vty_out(vty
, " area %s filter-list prefix %s in\n", buf
,
10110 PREFIX_NAME_IN(area
));
10112 if (PREFIX_NAME_OUT(area
))
10113 vty_out(vty
, " area %s filter-list prefix %s out\n",
10114 buf
, PREFIX_NAME_OUT(area
));
10120 static int config_write_ospf_nbr_nbma(struct vty
*vty
, struct ospf
*ospf
)
10122 struct ospf_nbr_nbma
*nbr_nbma
;
10123 struct route_node
*rn
;
10125 /* Static Neighbor configuration print. */
10126 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
10127 if ((nbr_nbma
= rn
->info
)) {
10128 vty_out(vty
, " neighbor %s", inet_ntoa(nbr_nbma
->addr
));
10130 if (nbr_nbma
->priority
10131 != OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
10132 vty_out(vty
, " priority %d",
10133 nbr_nbma
->priority
);
10135 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
10136 vty_out(vty
, " poll-interval %d",
10139 vty_out(vty
, "\n");
10145 static int config_write_virtual_link(struct vty
*vty
, struct ospf
*ospf
)
10147 struct listnode
*node
;
10148 struct ospf_vl_data
*vl_data
;
10149 char buf
[INET_ADDRSTRLEN
];
10151 /* Virtual-Link print */
10152 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
10153 struct listnode
*n2
;
10154 struct crypt_key
*ck
;
10155 struct ospf_interface
*oi
;
10157 if (vl_data
!= NULL
) {
10158 area_id2str(buf
, sizeof(buf
), &vl_data
->vl_area_id
,
10159 vl_data
->vl_area_id_fmt
);
10160 oi
= vl_data
->vl_oi
;
10163 if (OSPF_IF_PARAM(oi
, v_hello
)
10164 != OSPF_HELLO_INTERVAL_DEFAULT
10165 || OSPF_IF_PARAM(oi
, v_wait
)
10166 != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT
10167 || OSPF_IF_PARAM(oi
, retransmit_interval
)
10168 != OSPF_RETRANSMIT_INTERVAL_DEFAULT
10169 || OSPF_IF_PARAM(oi
, transmit_delay
)
10170 != OSPF_TRANSMIT_DELAY_DEFAULT
)
10172 " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d\n",
10173 buf
, inet_ntoa(vl_data
->vl_peer
),
10174 OSPF_IF_PARAM(oi
, v_hello
),
10175 OSPF_IF_PARAM(oi
, retransmit_interval
),
10176 OSPF_IF_PARAM(oi
, transmit_delay
),
10177 OSPF_IF_PARAM(oi
, v_wait
));
10179 vty_out(vty
, " area %s virtual-link %s\n", buf
,
10180 inet_ntoa(vl_data
->vl_peer
));
10182 if (IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)->auth_simple
[0]
10185 " area %s virtual-link %s authentication-key %s\n",
10186 buf
, inet_ntoa(vl_data
->vl_peer
),
10187 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10190 for (ALL_LIST_ELEMENTS_RO(
10191 IF_DEF_PARAMS(vl_data
->vl_oi
->ifp
)
10195 " area %s virtual-link %s"
10196 " message-digest-key %d md5 %s\n",
10197 buf
, inet_ntoa(vl_data
->vl_peer
),
10198 ck
->key_id
, ck
->auth_key
);
10206 static int config_write_ospf_redistribute(struct vty
*vty
, struct ospf
*ospf
)
10210 /* redistribute print. */
10211 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
10212 struct list
*red_list
;
10213 struct listnode
*node
;
10214 struct ospf_redist
*red
;
10216 red_list
= ospf
->redist
[type
];
10220 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
10221 vty_out(vty
, " redistribute %s",
10222 zebra_route_string(type
));
10224 vty_out(vty
, " %d", red
->instance
);
10226 if (red
->dmetric
.value
>= 0)
10227 vty_out(vty
, " metric %d", red
->dmetric
.value
);
10229 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10230 vty_out(vty
, " metric-type 1");
10232 if (ROUTEMAP_NAME(red
))
10233 vty_out(vty
, " route-map %s",
10234 ROUTEMAP_NAME(red
));
10236 vty_out(vty
, "\n");
10243 static int config_write_ospf_default_metric(struct vty
*vty
, struct ospf
*ospf
)
10245 if (ospf
->default_metric
!= -1)
10246 vty_out(vty
, " default-metric %d\n", ospf
->default_metric
);
10250 static int config_write_ospf_distribute(struct vty
*vty
, struct ospf
*ospf
)
10253 struct ospf_redist
*red
;
10256 /* distribute-list print. */
10257 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
10258 if (DISTRIBUTE_NAME(ospf
, type
))
10259 vty_out(vty
, " distribute-list %s out %s\n",
10260 DISTRIBUTE_NAME(ospf
, type
),
10261 zebra_route_string(type
));
10263 /* default-information print. */
10264 if (ospf
->default_originate
!= DEFAULT_ORIGINATE_NONE
) {
10265 vty_out(vty
, " default-information originate");
10266 if (ospf
->default_originate
== DEFAULT_ORIGINATE_ALWAYS
)
10267 vty_out(vty
, " always");
10269 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
10271 if (red
->dmetric
.value
>= 0)
10272 vty_out(vty
, " metric %d",
10273 red
->dmetric
.value
);
10275 if (red
->dmetric
.type
== EXTERNAL_METRIC_TYPE_1
)
10276 vty_out(vty
, " metric-type 1");
10278 if (ROUTEMAP_NAME(red
))
10279 vty_out(vty
, " route-map %s",
10280 ROUTEMAP_NAME(red
));
10283 vty_out(vty
, "\n");
10290 static int config_write_ospf_distance(struct vty
*vty
, struct ospf
*ospf
)
10292 struct route_node
*rn
;
10293 struct ospf_distance
*odistance
;
10295 if (ospf
->distance_all
)
10296 vty_out(vty
, " distance %d\n", ospf
->distance_all
);
10298 if (ospf
->distance_intra
|| ospf
->distance_inter
10299 || ospf
->distance_external
) {
10300 vty_out(vty
, " distance ospf");
10302 if (ospf
->distance_intra
)
10303 vty_out(vty
, " intra-area %d", ospf
->distance_intra
);
10304 if (ospf
->distance_inter
)
10305 vty_out(vty
, " inter-area %d", ospf
->distance_inter
);
10306 if (ospf
->distance_external
)
10307 vty_out(vty
, " external %d", ospf
->distance_external
);
10309 vty_out(vty
, "\n");
10312 for (rn
= route_top(ospf
->distance_table
); rn
; rn
= route_next(rn
))
10313 if ((odistance
= rn
->info
) != NULL
) {
10314 vty_out(vty
, " distance %d %s/%d %s\n",
10315 odistance
->distance
, inet_ntoa(rn
->p
.u
.prefix4
),
10317 odistance
->access_list
? odistance
->access_list
10323 static int ospf_config_write_one(struct vty
*vty
, struct ospf
*ospf
)
10325 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10326 struct interface
*ifp
;
10327 struct ospf_interface
*oi
;
10328 struct listnode
*node
= NULL
;
10331 /* `router ospf' print. */
10332 if (ospf
->instance
&& ospf
->name
) {
10333 vty_out(vty
, "router ospf %d vrf %s\n", ospf
->instance
,
10335 } else if (ospf
->instance
) {
10336 vty_out(vty
, "router ospf %d\n", ospf
->instance
);
10337 } else if (ospf
->name
) {
10338 vty_out(vty
, "router ospf vrf %s\n", ospf
->name
);
10340 vty_out(vty
, "router ospf\n");
10342 if (!ospf
->networks
) {
10347 /* Router ID print. */
10348 if (ospf
->router_id_static
.s_addr
!= 0)
10349 vty_out(vty
, " ospf router-id %s\n",
10350 inet_ntoa(ospf
->router_id_static
));
10352 /* ABR type print. */
10353 if (ospf
->abr_type
!= OSPF_ABR_DEFAULT
)
10354 vty_out(vty
, " ospf abr-type %s\n",
10355 ospf_abr_type_str
[ospf
->abr_type
]);
10357 /* log-adjacency-changes flag print. */
10358 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_CHANGES
)) {
10359 if (CHECK_FLAG(ospf
->config
, OSPF_LOG_ADJACENCY_DETAIL
))
10360 vty_out(vty
, " log-adjacency-changes detail\n");
10361 else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES
)
10362 vty_out(vty
, " log-adjacency-changes\n");
10363 } else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES
) {
10364 vty_out(vty
, " no log-adjacency-changes\n");
10367 /* RFC1583 compatibility flag print -- Compatible with CISCO
10369 if (CHECK_FLAG(ospf
->config
, OSPF_RFC1583_COMPATIBLE
))
10370 vty_out(vty
, " compatible rfc1583\n");
10372 /* auto-cost reference-bandwidth configuration. */
10373 if (ospf
->ref_bandwidth
!= OSPF_DEFAULT_REF_BANDWIDTH
) {
10375 "! Important: ensure reference bandwidth "
10376 "is consistent across all routers\n");
10377 vty_out(vty
, " auto-cost reference-bandwidth %d\n",
10378 ospf
->ref_bandwidth
);
10381 /* SPF timers print. */
10382 if (ospf
->spf_delay
!= OSPF_SPF_DELAY_DEFAULT
10383 || ospf
->spf_holdtime
!= OSPF_SPF_HOLDTIME_DEFAULT
10384 || ospf
->spf_max_holdtime
!= OSPF_SPF_MAX_HOLDTIME_DEFAULT
)
10385 vty_out(vty
, " timers throttle spf %d %d %d\n", ospf
->spf_delay
,
10386 ospf
->spf_holdtime
, ospf
->spf_max_holdtime
);
10388 /* LSA timers print. */
10389 if (ospf
->min_ls_interval
!= OSPF_MIN_LS_INTERVAL
)
10390 vty_out(vty
, " timers throttle lsa all %d\n",
10391 ospf
->min_ls_interval
);
10392 if (ospf
->min_ls_arrival
!= OSPF_MIN_LS_ARRIVAL
)
10393 vty_out(vty
, " timers lsa min-arrival %d\n",
10394 ospf
->min_ls_arrival
);
10396 /* Write multiplier print. */
10397 if (ospf
->write_oi_count
!= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
)
10398 vty_out(vty
, " ospf write-multiplier %d\n",
10399 ospf
->write_oi_count
);
10401 /* Max-metric router-lsa print */
10402 config_write_stub_router(vty
, ospf
);
10404 /* SPF refresh parameters print. */
10405 if (ospf
->lsa_refresh_interval
!= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
10406 vty_out(vty
, " refresh timer %d\n", ospf
->lsa_refresh_interval
);
10408 /* Redistribute information print. */
10409 config_write_ospf_redistribute(vty
, ospf
);
10411 /* passive-interface print. */
10412 if (ospf
->passive_interface_default
== OSPF_IF_PASSIVE
)
10413 vty_out(vty
, " passive-interface default\n");
10415 FOR_ALL_INTERFACES (vrf
, ifp
)
10416 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp
),
10418 && IF_DEF_PARAMS(ifp
)->passive_interface
10419 != ospf
->passive_interface_default
) {
10420 vty_out(vty
, " %spassive-interface %s\n",
10421 IF_DEF_PARAMS(ifp
)->passive_interface
? ""
10425 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
10426 if (!OSPF_IF_PARAM_CONFIGURED(oi
->params
, passive_interface
))
10428 if (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(oi
->ifp
),
10429 passive_interface
)) {
10430 if (oi
->params
->passive_interface
10431 == IF_DEF_PARAMS(oi
->ifp
)->passive_interface
)
10433 } else if (oi
->params
->passive_interface
10434 == ospf
->passive_interface_default
)
10437 vty_out(vty
, " %spassive-interface %s %s\n",
10438 oi
->params
->passive_interface
? "" : "no ",
10439 oi
->ifp
->name
, inet_ntoa(oi
->address
->u
.prefix4
));
10442 /* Network area print. */
10443 config_write_network_area(vty
, ospf
);
10445 /* Area config print. */
10446 config_write_ospf_area(vty
, ospf
);
10448 /* static neighbor print. */
10449 config_write_ospf_nbr_nbma(vty
, ospf
);
10451 /* Virtual-Link print. */
10452 config_write_virtual_link(vty
, ospf
);
10454 /* Default metric configuration. */
10455 config_write_ospf_default_metric(vty
, ospf
);
10457 /* Distribute-list and default-information print. */
10458 config_write_ospf_distribute(vty
, ospf
);
10460 /* Distance configuration. */
10461 config_write_ospf_distance(vty
, ospf
);
10463 ospf_opaque_config_write_router(vty
, ospf
);
10469 /* OSPF configuration write function. */
10470 static int ospf_config_write(struct vty
*vty
)
10473 struct listnode
*ospf_node
= NULL
;
10476 if (listcount(om
->ospf
) == 0)
10479 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, ospf_node
, ospf
)) {
10480 /* VRF Default check if it is running.
10481 * Upon daemon start, there could be default instance
10482 * in absence of 'router ospf'/oi_running is disabled. */
10483 if (ospf
->vrf_id
== VRF_DEFAULT
&& ospf
->oi_running
)
10484 write
+= ospf_config_write_one(vty
, ospf
);
10485 /* For Non-Default VRF simply display the configuration,
10486 * even if it is not oi_running. */
10487 else if (ospf
->vrf_id
!= VRF_DEFAULT
)
10488 write
+= ospf_config_write_one(vty
, ospf
);
10493 void ospf_vty_show_init(void)
10495 /* "show ip ospf" commands. */
10496 install_element(VIEW_NODE
, &show_ip_ospf_cmd
);
10498 install_element(VIEW_NODE
, &show_ip_ospf_instance_cmd
);
10500 /* "show ip ospf database" commands. */
10501 install_element(VIEW_NODE
, &show_ip_ospf_database_max_cmd
);
10503 install_element(VIEW_NODE
,
10504 &show_ip_ospf_instance_database_type_adv_router_cmd
);
10505 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_cmd
);
10506 install_element(VIEW_NODE
, &show_ip_ospf_instance_database_max_cmd
);
10508 /* "show ip ospf interface" commands. */
10509 install_element(VIEW_NODE
, &show_ip_ospf_interface_cmd
);
10511 install_element(VIEW_NODE
, &show_ip_ospf_instance_interface_cmd
);
10512 /* "show ip ospf interface traffic */
10513 install_element(VIEW_NODE
, &show_ip_ospf_interface_traffic_cmd
);
10515 /* "show ip ospf neighbor" commands. */
10516 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_detail_cmd
);
10517 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_int_cmd
);
10518 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_id_cmd
);
10519 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_all_cmd
);
10520 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_detail_cmd
);
10521 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_cmd
);
10522 install_element(VIEW_NODE
, &show_ip_ospf_neighbor_all_cmd
);
10524 install_element(VIEW_NODE
,
10525 &show_ip_ospf_instance_neighbor_int_detail_cmd
);
10526 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_int_cmd
);
10527 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_id_cmd
);
10528 install_element(VIEW_NODE
,
10529 &show_ip_ospf_instance_neighbor_detail_all_cmd
);
10530 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_detail_cmd
);
10531 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_cmd
);
10532 install_element(VIEW_NODE
, &show_ip_ospf_instance_neighbor_all_cmd
);
10534 /* "show ip ospf route" commands. */
10535 install_element(VIEW_NODE
, &show_ip_ospf_route_cmd
);
10536 install_element(VIEW_NODE
, &show_ip_ospf_border_routers_cmd
);
10538 install_element(VIEW_NODE
, &show_ip_ospf_instance_route_cmd
);
10539 install_element(VIEW_NODE
, &show_ip_ospf_instance_border_routers_cmd
);
10541 /* "show ip ospf vrfs" commands. */
10542 install_element(VIEW_NODE
, &show_ip_ospf_vrfs_cmd
);
10546 /* ospfd's interface node. */
10547 static struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
10549 /* Initialization of OSPF interface. */
10550 static void ospf_vty_if_init(void)
10552 /* Install interface node. */
10553 install_node(&interface_node
, config_write_interface
);
10556 /* "ip ospf authentication" commands. */
10557 install_element(INTERFACE_NODE
, &ip_ospf_authentication_args_addr_cmd
);
10558 install_element(INTERFACE_NODE
, &ip_ospf_authentication_addr_cmd
);
10559 install_element(INTERFACE_NODE
,
10560 &no_ip_ospf_authentication_args_addr_cmd
);
10561 install_element(INTERFACE_NODE
, &no_ip_ospf_authentication_addr_cmd
);
10562 install_element(INTERFACE_NODE
, &ip_ospf_authentication_key_addr_cmd
);
10563 install_element(INTERFACE_NODE
,
10564 &no_ip_ospf_authentication_key_authkey_addr_cmd
);
10565 install_element(INTERFACE_NODE
,
10566 &no_ospf_authentication_key_authkey_addr_cmd
);
10568 /* "ip ospf message-digest-key" commands. */
10569 install_element(INTERFACE_NODE
, &ip_ospf_message_digest_key_cmd
);
10570 install_element(INTERFACE_NODE
, &no_ip_ospf_message_digest_key_cmd
);
10572 /* "ip ospf cost" commands. */
10573 install_element(INTERFACE_NODE
, &ip_ospf_cost_cmd
);
10574 install_element(INTERFACE_NODE
, &no_ip_ospf_cost_cmd
);
10576 /* "ip ospf mtu-ignore" commands. */
10577 install_element(INTERFACE_NODE
, &ip_ospf_mtu_ignore_addr_cmd
);
10578 install_element(INTERFACE_NODE
, &no_ip_ospf_mtu_ignore_addr_cmd
);
10580 /* "ip ospf dead-interval" commands. */
10581 install_element(INTERFACE_NODE
, &ip_ospf_dead_interval_cmd
);
10582 install_element(INTERFACE_NODE
,
10583 &ip_ospf_dead_interval_minimal_addr_cmd
);
10584 install_element(INTERFACE_NODE
, &no_ip_ospf_dead_interval_cmd
);
10586 /* "ip ospf hello-interval" commands. */
10587 install_element(INTERFACE_NODE
, &ip_ospf_hello_interval_cmd
);
10588 install_element(INTERFACE_NODE
, &no_ip_ospf_hello_interval_cmd
);
10590 /* "ip ospf network" commands. */
10591 install_element(INTERFACE_NODE
, &ip_ospf_network_cmd
);
10592 install_element(INTERFACE_NODE
, &no_ip_ospf_network_cmd
);
10594 /* "ip ospf priority" commands. */
10595 install_element(INTERFACE_NODE
, &ip_ospf_priority_cmd
);
10596 install_element(INTERFACE_NODE
, &no_ip_ospf_priority_cmd
);
10598 /* "ip ospf retransmit-interval" commands. */
10599 install_element(INTERFACE_NODE
, &ip_ospf_retransmit_interval_addr_cmd
);
10600 install_element(INTERFACE_NODE
,
10601 &no_ip_ospf_retransmit_interval_addr_cmd
);
10603 /* "ip ospf transmit-delay" commands. */
10604 install_element(INTERFACE_NODE
, &ip_ospf_transmit_delay_addr_cmd
);
10605 install_element(INTERFACE_NODE
, &no_ip_ospf_transmit_delay_addr_cmd
);
10607 /* "ip ospf area" commands. */
10608 install_element(INTERFACE_NODE
, &ip_ospf_area_cmd
);
10609 install_element(INTERFACE_NODE
, &no_ip_ospf_area_cmd
);
10611 /* These commands are compatibitliy for previous version. */
10612 install_element(INTERFACE_NODE
, &ospf_authentication_key_cmd
);
10613 install_element(INTERFACE_NODE
, &ospf_message_digest_key_cmd
);
10614 install_element(INTERFACE_NODE
, &no_ospf_message_digest_key_cmd
);
10615 install_element(INTERFACE_NODE
, &ospf_dead_interval_cmd
);
10616 install_element(INTERFACE_NODE
, &no_ospf_dead_interval_cmd
);
10617 install_element(INTERFACE_NODE
, &ospf_hello_interval_cmd
);
10618 install_element(INTERFACE_NODE
, &no_ospf_hello_interval_cmd
);
10619 install_element(INTERFACE_NODE
, &ospf_cost_cmd
);
10620 install_element(INTERFACE_NODE
, &no_ospf_cost_cmd
);
10621 install_element(INTERFACE_NODE
, &ospf_network_cmd
);
10622 install_element(INTERFACE_NODE
, &no_ospf_network_cmd
);
10623 install_element(INTERFACE_NODE
, &ospf_priority_cmd
);
10624 install_element(INTERFACE_NODE
, &no_ospf_priority_cmd
);
10625 install_element(INTERFACE_NODE
, &ospf_retransmit_interval_cmd
);
10626 install_element(INTERFACE_NODE
, &no_ospf_retransmit_interval_cmd
);
10627 install_element(INTERFACE_NODE
, &ospf_transmit_delay_cmd
);
10628 install_element(INTERFACE_NODE
, &no_ospf_transmit_delay_cmd
);
10631 static void ospf_vty_zebra_init(void)
10633 install_element(OSPF_NODE
, &ospf_redistribute_source_cmd
);
10634 install_element(OSPF_NODE
, &no_ospf_redistribute_source_cmd
);
10635 install_element(OSPF_NODE
, &ospf_redistribute_instance_source_cmd
);
10636 install_element(OSPF_NODE
, &no_ospf_redistribute_instance_source_cmd
);
10638 install_element(OSPF_NODE
, &ospf_distribute_list_out_cmd
);
10639 install_element(OSPF_NODE
, &no_ospf_distribute_list_out_cmd
);
10641 install_element(OSPF_NODE
, &ospf_default_information_originate_cmd
);
10642 install_element(OSPF_NODE
, &no_ospf_default_information_originate_cmd
);
10644 install_element(OSPF_NODE
, &ospf_default_metric_cmd
);
10645 install_element(OSPF_NODE
, &no_ospf_default_metric_cmd
);
10647 install_element(OSPF_NODE
, &ospf_distance_cmd
);
10648 install_element(OSPF_NODE
, &no_ospf_distance_cmd
);
10649 install_element(OSPF_NODE
, &no_ospf_distance_ospf_cmd
);
10650 install_element(OSPF_NODE
, &ospf_distance_ospf_cmd
);
10652 install_element (OSPF_NODE
, &ospf_distance_source_cmd
);
10653 install_element (OSPF_NODE
, &no_ospf_distance_source_cmd
);
10654 install_element (OSPF_NODE
, &ospf_distance_source_access_list_cmd
);
10655 install_element (OSPF_NODE
, &no_ospf_distance_source_access_list_cmd
);
10659 static struct cmd_node ospf_node
= {OSPF_NODE
, "%s(config-router)# ", 1};
10661 static void ospf_interface_clear(struct interface
*ifp
)
10663 if (!if_is_operative(ifp
))
10666 if (IS_DEBUG_OSPF(ism
, ISM_EVENTS
))
10667 zlog_debug("ISM[%s]: clear by reset", ifp
->name
);
10669 ospf_if_reset(ifp
);
10672 DEFUN (clear_ip_ospf_interface
,
10673 clear_ip_ospf_interface_cmd
,
10674 "clear ip ospf [vrf NAME] interface [IFNAME]",
10677 "OSPF information\n"
10679 "Interface information\n"
10680 "Interface name\n")
10682 int idx_ifname
= 0;
10684 struct interface
*ifp
;
10685 struct listnode
*node
;
10686 struct ospf
*ospf
= NULL
;
10687 char *vrf_name
= NULL
;
10688 vrf_id_t vrf_id
= VRF_DEFAULT
;
10689 struct vrf
*vrf
= NULL
;
10691 if (argv_find(argv
, argc
, "vrf", &idx_vrf
))
10692 vrf_name
= argv
[idx_vrf
+ 1]->arg
;
10693 if (vrf_name
&& strmatch(vrf_name
, VRF_DEFAULT_NAME
))
10696 vrf
= vrf_lookup_by_name(vrf_name
);
10698 vrf_id
= vrf
->vrf_id
;
10700 if (!argv_find(argv
, argc
, "IFNAME", &idx_ifname
)) {
10701 /* Clear all the ospfv2 interfaces. */
10702 for (ALL_LIST_ELEMENTS_RO(om
->ospf
, node
, ospf
)) {
10703 if (vrf_id
!= ospf
->vrf_id
)
10706 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
10707 FOR_ALL_INTERFACES (vrf
, ifp
)
10708 ospf_interface_clear(ifp
);
10711 /* Interface name is specified. */
10712 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
10714 vty_out(vty
, "No such interface name\n");
10716 ospf_interface_clear(ifp
);
10719 return CMD_SUCCESS
;
10722 void ospf_vty_clear_init(void)
10724 install_element(ENABLE_NODE
, &clear_ip_ospf_interface_cmd
);
10728 /* Install OSPF related vty commands. */
10729 void ospf_vty_init(void)
10731 /* Install ospf top node. */
10732 install_node(&ospf_node
, ospf_config_write
);
10734 /* "router ospf" commands. */
10735 install_element(CONFIG_NODE
, &router_ospf_cmd
);
10736 install_element(CONFIG_NODE
, &no_router_ospf_cmd
);
10739 install_default(OSPF_NODE
);
10741 /* "ospf router-id" commands. */
10742 install_element(OSPF_NODE
, &ospf_router_id_cmd
);
10743 install_element(OSPF_NODE
, &ospf_router_id_old_cmd
);
10744 install_element(OSPF_NODE
, &no_ospf_router_id_cmd
);
10746 /* "passive-interface" commands. */
10747 install_element(OSPF_NODE
, &ospf_passive_interface_addr_cmd
);
10748 install_element(OSPF_NODE
, &no_ospf_passive_interface_addr_cmd
);
10750 /* "ospf abr-type" commands. */
10751 install_element(OSPF_NODE
, &ospf_abr_type_cmd
);
10752 install_element(OSPF_NODE
, &no_ospf_abr_type_cmd
);
10754 /* "ospf log-adjacency-changes" commands. */
10755 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_cmd
);
10756 install_element(OSPF_NODE
, &ospf_log_adjacency_changes_detail_cmd
);
10757 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_cmd
);
10758 install_element(OSPF_NODE
, &no_ospf_log_adjacency_changes_detail_cmd
);
10760 /* "ospf rfc1583-compatible" commands. */
10761 install_element(OSPF_NODE
, &ospf_compatible_rfc1583_cmd
);
10762 install_element(OSPF_NODE
, &no_ospf_compatible_rfc1583_cmd
);
10763 install_element(OSPF_NODE
, &ospf_rfc1583_flag_cmd
);
10764 install_element(OSPF_NODE
, &no_ospf_rfc1583_flag_cmd
);
10766 /* "network area" commands. */
10767 install_element(OSPF_NODE
, &ospf_network_area_cmd
);
10768 install_element(OSPF_NODE
, &no_ospf_network_area_cmd
);
10770 /* "area authentication" commands. */
10771 install_element(OSPF_NODE
,
10772 &ospf_area_authentication_message_digest_cmd
);
10773 install_element(OSPF_NODE
, &ospf_area_authentication_cmd
);
10774 install_element(OSPF_NODE
, &no_ospf_area_authentication_cmd
);
10776 /* "area range" commands. */
10777 install_element(OSPF_NODE
, &ospf_area_range_cmd
);
10778 install_element(OSPF_NODE
, &ospf_area_range_cost_cmd
);
10779 install_element(OSPF_NODE
, &ospf_area_range_not_advertise_cmd
);
10780 install_element(OSPF_NODE
, &no_ospf_area_range_cmd
);
10781 install_element(OSPF_NODE
, &ospf_area_range_substitute_cmd
);
10782 install_element(OSPF_NODE
, &no_ospf_area_range_substitute_cmd
);
10784 /* "area virtual-link" commands. */
10785 install_element(OSPF_NODE
, &ospf_area_vlink_cmd
);
10786 install_element(OSPF_NODE
, &ospf_area_vlink_intervals_cmd
);
10787 install_element(OSPF_NODE
, &no_ospf_area_vlink_cmd
);
10788 install_element(OSPF_NODE
, &no_ospf_area_vlink_intervals_cmd
);
10791 /* "area stub" commands. */
10792 install_element(OSPF_NODE
, &ospf_area_stub_no_summary_cmd
);
10793 install_element(OSPF_NODE
, &ospf_area_stub_cmd
);
10794 install_element(OSPF_NODE
, &no_ospf_area_stub_no_summary_cmd
);
10795 install_element(OSPF_NODE
, &no_ospf_area_stub_cmd
);
10797 /* "area nssa" commands. */
10798 install_element(OSPF_NODE
, &ospf_area_nssa_cmd
);
10799 install_element(OSPF_NODE
, &ospf_area_nssa_translate_cmd
);
10800 install_element(OSPF_NODE
, &ospf_area_nssa_no_summary_cmd
);
10801 install_element(OSPF_NODE
, &no_ospf_area_nssa_no_summary_cmd
);
10802 install_element(OSPF_NODE
, &no_ospf_area_nssa_cmd
);
10804 install_element(OSPF_NODE
, &ospf_area_default_cost_cmd
);
10805 install_element(OSPF_NODE
, &no_ospf_area_default_cost_cmd
);
10807 install_element(OSPF_NODE
, &ospf_area_shortcut_cmd
);
10808 install_element(OSPF_NODE
, &no_ospf_area_shortcut_cmd
);
10810 install_element(OSPF_NODE
, &ospf_area_export_list_cmd
);
10811 install_element(OSPF_NODE
, &no_ospf_area_export_list_cmd
);
10813 install_element(OSPF_NODE
, &ospf_area_filter_list_cmd
);
10814 install_element(OSPF_NODE
, &no_ospf_area_filter_list_cmd
);
10816 install_element(OSPF_NODE
, &ospf_area_import_list_cmd
);
10817 install_element(OSPF_NODE
, &no_ospf_area_import_list_cmd
);
10819 /* SPF timer commands */
10820 install_element(OSPF_NODE
, &ospf_timers_throttle_spf_cmd
);
10821 install_element(OSPF_NODE
, &no_ospf_timers_throttle_spf_cmd
);
10823 /* LSA timers commands */
10824 install_element(OSPF_NODE
, &ospf_timers_min_ls_interval_cmd
);
10825 install_element(OSPF_NODE
, &no_ospf_timers_min_ls_interval_cmd
);
10826 install_element(OSPF_NODE
, &ospf_timers_lsa_min_arrival_cmd
);
10827 install_element(OSPF_NODE
, &no_ospf_timers_lsa_min_arrival_cmd
);
10829 /* refresh timer commands */
10830 install_element(OSPF_NODE
, &ospf_refresh_timer_cmd
);
10831 install_element(OSPF_NODE
, &no_ospf_refresh_timer_val_cmd
);
10833 /* max-metric commands */
10834 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_admin_cmd
);
10835 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_admin_cmd
);
10836 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_startup_cmd
);
10837 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_startup_cmd
);
10838 install_element(OSPF_NODE
, &ospf_max_metric_router_lsa_shutdown_cmd
);
10839 install_element(OSPF_NODE
, &no_ospf_max_metric_router_lsa_shutdown_cmd
);
10841 /* reference bandwidth commands */
10842 install_element(OSPF_NODE
, &ospf_auto_cost_reference_bandwidth_cmd
);
10843 install_element(OSPF_NODE
, &no_ospf_auto_cost_reference_bandwidth_cmd
);
10845 /* "neighbor" commands. */
10846 install_element(OSPF_NODE
, &ospf_neighbor_cmd
);
10847 install_element(OSPF_NODE
, &ospf_neighbor_poll_interval_cmd
);
10848 install_element(OSPF_NODE
, &no_ospf_neighbor_cmd
);
10849 install_element(OSPF_NODE
, &no_ospf_neighbor_poll_cmd
);
10851 /* write multiplier commands */
10852 install_element(OSPF_NODE
, &ospf_write_multiplier_cmd
);
10853 install_element(OSPF_NODE
, &write_multiplier_cmd
);
10854 install_element(OSPF_NODE
, &no_ospf_write_multiplier_cmd
);
10855 install_element(OSPF_NODE
, &no_write_multiplier_cmd
);
10857 /* Init interface related vty commands. */
10858 ospf_vty_if_init();
10860 /* Init zebra related vty commands. */
10861 ospf_vty_zebra_init();